From d232063783e4f3e210fa944b8e3b18ed38d5ca61 Mon Sep 17 00:00:00 2001 From: Ralf Kistner Date: Mon, 30 Dec 2024 14:08:50 +0200 Subject: [PATCH] Add tests for various column numbers. --- dart/test/crud_test.dart | 230 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 230 insertions(+) create mode 100644 dart/test/crud_test.dart diff --git a/dart/test/crud_test.dart b/dart/test/crud_test.dart new file mode 100644 index 0000000..4ec7615 --- /dev/null +++ b/dart/test/crud_test.dart @@ -0,0 +1,230 @@ +import 'dart:convert'; + +import 'package:sqlite3/common.dart'; +import 'package:test/test.dart'; + +import 'utils/native_test_utils.dart'; + +void main() { + group('crud tests', () { + late CommonDatabase db; + + setUp(() async { + db = openTestDatabase(); + }); + + tearDown(() { + db.dispose(); + }); + + test('powersync_diff - single value', () { + var r1 = + db.select('select powersync_diff(?, ?) as diff', ['{}', '{}']).first; + expect(r1['diff'], equals('{}')); + + var r2 = db.select( + 'select powersync_diff(?, ?) as diff', ['{}', '{"test":1}']).first; + expect(r2['diff'], equals('{"test":1}')); + + var r3 = db.select('select powersync_diff(?, ?) as diff', + ['{"test":1}', '{"test":1}']).first; + expect(r3['diff'], equals('{}')); + + var r4 = db.select( + 'select powersync_diff(?, ?) as diff', ['{"test":1}', '{}']).first; + expect(r4['diff'], equals('{"test":null}')); + + var r5 = db.select('select powersync_diff(?, ?) as diff', + ['{"test":1}', '{"test":null}']).first; + expect(r5['diff'], equals('{"test":null}')); + + var r6 = db.select('select powersync_diff(?, ?) as diff', + ['{"test":1}', '{"test":2}']).first; + expect(r6['diff'], equals('{"test":2}')); + }); + + test('powersync_diff - multiple values', () { + var r1 = db.select('select powersync_diff(?, ?) as diff', + ['{"a":1,"b":"test"}', '{}']).first; + expect(r1['diff'], equals('{"a":null,"b":null}')); + + var r2 = db.select('select powersync_diff(?, ?) as diff', + ['{}', '{"a":1,"b":"test"}']).first; + expect(r2['diff'], equals('{"a":1,"b":"test"}')); + + var r3 = db.select('select powersync_diff(?, ?) as diff', + ['{"a":1,"b":"test"}', '{"a":1,"b":"test"}']).first; + expect(r3['diff'], equals('{}')); + + var r4 = db.select('select powersync_diff(?, ?) as diff', + ['{"a":1}', '{"b":"test"}']).first; + expect(r4['diff'], equals('{"a":null,"b":"test"}')); + + var r5 = db.select('select powersync_diff(?, ?) as diff', + ['{"a":1}', '{"a":1,"b":"test"}']).first; + expect(r5['diff'], equals('{"b":"test"}')); + }); + + var runCrudTest = (int numberOfColumns) { + var columns = []; + for (var i = 0; i < numberOfColumns; i++) { + columns.add({'name': 'column$i', 'type': 'TEXT'}); + } + var tableSchema = { + 'tables': [ + {'name': 'items', 'columns': columns} + ] + }; + db.select('select powersync_init()'); + + // 1. Test schema initialization + db.select( + 'select powersync_replace_schema(?)', [jsonEncode(tableSchema)]); + + var columnNames = columns.map((c) => c['name']).join(', '); + var columnValues = columns.map((c) => "'${c['name']}'").join(', '); + + // 2. Test insert + db.select( + "insert into items(id, ${columnNames}) values('test_id', ${columnValues})"); + var item = db.select('select * from items').first; + var expectedData = + Map.fromEntries(columns.map((c) => MapEntry(c['name'], c['name']))); + + expect(item, equals({'id': 'test_id', ...expectedData})); + var crud = db.select('select * from ps_crud').first; + var crudData = jsonDecode(crud['data']); + expect(crud['tx_id'], equals(1)); + expect( + crudData, + equals({ + 'op': 'PUT', + 'type': 'items', + 'id': 'test_id', + 'data': expectedData + })); + + // 3. Test update + db.select('update items set column0 = ?', ['new_value']); + var itemUpdated = db.select('select * from items').first; + expect(itemUpdated, + equals({'id': 'test_id', ...expectedData, 'column0': 'new_value'})); + + var crudUpdated = db.select('select * from ps_crud where id = 2').first; + var crudDataUpdated = jsonDecode(crudUpdated['data']); + expect(crudUpdated['tx_id'], equals(2)); + expect( + crudDataUpdated, + equals({ + 'op': 'PATCH', + 'type': 'items', + 'id': 'test_id', + 'data': {'column0': 'new_value'} + })); + + // 4. Test delete + db.select('delete from items'); + var itemDeleted = db.select('select * from items').firstOrNull; + expect(itemDeleted, equals(null)); + + var crudDeleted = db.select('select * from ps_crud where id = 3').first; + var crudDataDeleted = jsonDecode(crudDeleted['data']); + expect(crudDeleted['tx_id'], equals(3)); + expect(crudDataDeleted, + equals({'op': 'DELETE', 'type': 'items', 'id': 'test_id'})); + }; + + var runCrudTestLocalOnly = (int numberOfColumns) { + var columns = []; + for (var i = 0; i < numberOfColumns; i++) { + columns.add({'name': 'column$i', 'type': 'TEXT'}); + } + var tableSchema = { + 'tables': [ + {'name': 'items', 'columns': columns, 'local_only': true} + ] + }; + db.select('select powersync_init()'); + + // 1. Test schema initialization + db.select( + 'select powersync_replace_schema(?)', [jsonEncode(tableSchema)]); + + var columnNames = columns.map((c) => c['name']).join(', '); + var columnValues = columns.map((c) => "'${c['name']}'").join(', '); + + // 2. Test insert + db.select( + "insert into items(id, ${columnNames}) values('test_id', ${columnValues})"); + var item = db.select('select * from items').first; + var expectedData = + Map.fromEntries(columns.map((c) => MapEntry(c['name'], c['name']))); + + expect(item, equals({'id': 'test_id', ...expectedData})); + + // 3. Test update + db.select('update items set column0 = ?', ['new_value']); + var itemUpdated = db.select('select * from items').first; + expect(itemUpdated, + equals({'id': 'test_id', ...expectedData, 'column0': 'new_value'})); + + // 4. Test delete + db.select('delete from items'); + var itemDeleted = db.select('select * from items').firstOrNull; + expect(itemDeleted, equals(null)); + }; + + var runCrudTestInsertOnly = (int numberOfColumns) { + var columns = []; + for (var i = 0; i < numberOfColumns; i++) { + columns.add({'name': 'column$i', 'type': 'TEXT'}); + } + var tableSchema = { + 'tables': [ + {'name': 'items', 'columns': columns, 'insert_only': true} + ] + }; + db.select('select powersync_init()'); + + // 1. Test schema initialization + db.select( + 'select powersync_replace_schema(?)', [jsonEncode(tableSchema)]); + + var columnNames = columns.map((c) => c['name']).join(', '); + var columnValues = columns.map((c) => "'${c['name']}'").join(', '); + + // 2. Test insert + db.select( + "insert into items(id, ${columnNames}) values('test_id', ${columnValues})"); + var item = db.select('select * from items').firstOrNull; + expect(item, equals(null)); + var expectedData = + Map.fromEntries(columns.map((c) => MapEntry(c['name'], c['name']))); + + var crud = db.select('select * from ps_crud').first; + var crudData = jsonDecode(crud['data']); + expect(crud['tx_id'], equals(1)); + expect( + crudData, + equals({ + 'op': 'PUT', + 'type': 'items', + 'id': 'test_id', + 'data': expectedData + })); + }; + + for (var numberOfColumns in [1, 49, 50, 51, 63, 64, 100, 1999]) { + test('crud test with $numberOfColumns columns', () async { + runCrudTest(numberOfColumns); + }); + test('crud test with $numberOfColumns columns - local_only', () async { + runCrudTestLocalOnly(numberOfColumns); + }); + + test('crud test with $numberOfColumns columns - insert_only', () async { + runCrudTestInsertOnly(numberOfColumns); + }); + } + }); +}