Skip to content

Commit d232063

Browse files
committed
Add tests for various column numbers.
1 parent 44dac47 commit d232063

File tree

1 file changed

+230
-0
lines changed

1 file changed

+230
-0
lines changed

dart/test/crud_test.dart

+230
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,230 @@
1+
import 'dart:convert';
2+
3+
import 'package:sqlite3/common.dart';
4+
import 'package:test/test.dart';
5+
6+
import 'utils/native_test_utils.dart';
7+
8+
void main() {
9+
group('crud tests', () {
10+
late CommonDatabase db;
11+
12+
setUp(() async {
13+
db = openTestDatabase();
14+
});
15+
16+
tearDown(() {
17+
db.dispose();
18+
});
19+
20+
test('powersync_diff - single value', () {
21+
var r1 =
22+
db.select('select powersync_diff(?, ?) as diff', ['{}', '{}']).first;
23+
expect(r1['diff'], equals('{}'));
24+
25+
var r2 = db.select(
26+
'select powersync_diff(?, ?) as diff', ['{}', '{"test":1}']).first;
27+
expect(r2['diff'], equals('{"test":1}'));
28+
29+
var r3 = db.select('select powersync_diff(?, ?) as diff',
30+
['{"test":1}', '{"test":1}']).first;
31+
expect(r3['diff'], equals('{}'));
32+
33+
var r4 = db.select(
34+
'select powersync_diff(?, ?) as diff', ['{"test":1}', '{}']).first;
35+
expect(r4['diff'], equals('{"test":null}'));
36+
37+
var r5 = db.select('select powersync_diff(?, ?) as diff',
38+
['{"test":1}', '{"test":null}']).first;
39+
expect(r5['diff'], equals('{"test":null}'));
40+
41+
var r6 = db.select('select powersync_diff(?, ?) as diff',
42+
['{"test":1}', '{"test":2}']).first;
43+
expect(r6['diff'], equals('{"test":2}'));
44+
});
45+
46+
test('powersync_diff - multiple values', () {
47+
var r1 = db.select('select powersync_diff(?, ?) as diff',
48+
['{"a":1,"b":"test"}', '{}']).first;
49+
expect(r1['diff'], equals('{"a":null,"b":null}'));
50+
51+
var r2 = db.select('select powersync_diff(?, ?) as diff',
52+
['{}', '{"a":1,"b":"test"}']).first;
53+
expect(r2['diff'], equals('{"a":1,"b":"test"}'));
54+
55+
var r3 = db.select('select powersync_diff(?, ?) as diff',
56+
['{"a":1,"b":"test"}', '{"a":1,"b":"test"}']).first;
57+
expect(r3['diff'], equals('{}'));
58+
59+
var r4 = db.select('select powersync_diff(?, ?) as diff',
60+
['{"a":1}', '{"b":"test"}']).first;
61+
expect(r4['diff'], equals('{"a":null,"b":"test"}'));
62+
63+
var r5 = db.select('select powersync_diff(?, ?) as diff',
64+
['{"a":1}', '{"a":1,"b":"test"}']).first;
65+
expect(r5['diff'], equals('{"b":"test"}'));
66+
});
67+
68+
var runCrudTest = (int numberOfColumns) {
69+
var columns = [];
70+
for (var i = 0; i < numberOfColumns; i++) {
71+
columns.add({'name': 'column$i', 'type': 'TEXT'});
72+
}
73+
var tableSchema = {
74+
'tables': [
75+
{'name': 'items', 'columns': columns}
76+
]
77+
};
78+
db.select('select powersync_init()');
79+
80+
// 1. Test schema initialization
81+
db.select(
82+
'select powersync_replace_schema(?)', [jsonEncode(tableSchema)]);
83+
84+
var columnNames = columns.map((c) => c['name']).join(', ');
85+
var columnValues = columns.map((c) => "'${c['name']}'").join(', ');
86+
87+
// 2. Test insert
88+
db.select(
89+
"insert into items(id, ${columnNames}) values('test_id', ${columnValues})");
90+
var item = db.select('select * from items').first;
91+
var expectedData =
92+
Map.fromEntries(columns.map((c) => MapEntry(c['name'], c['name'])));
93+
94+
expect(item, equals({'id': 'test_id', ...expectedData}));
95+
var crud = db.select('select * from ps_crud').first;
96+
var crudData = jsonDecode(crud['data']);
97+
expect(crud['tx_id'], equals(1));
98+
expect(
99+
crudData,
100+
equals({
101+
'op': 'PUT',
102+
'type': 'items',
103+
'id': 'test_id',
104+
'data': expectedData
105+
}));
106+
107+
// 3. Test update
108+
db.select('update items set column0 = ?', ['new_value']);
109+
var itemUpdated = db.select('select * from items').first;
110+
expect(itemUpdated,
111+
equals({'id': 'test_id', ...expectedData, 'column0': 'new_value'}));
112+
113+
var crudUpdated = db.select('select * from ps_crud where id = 2').first;
114+
var crudDataUpdated = jsonDecode(crudUpdated['data']);
115+
expect(crudUpdated['tx_id'], equals(2));
116+
expect(
117+
crudDataUpdated,
118+
equals({
119+
'op': 'PATCH',
120+
'type': 'items',
121+
'id': 'test_id',
122+
'data': {'column0': 'new_value'}
123+
}));
124+
125+
// 4. Test delete
126+
db.select('delete from items');
127+
var itemDeleted = db.select('select * from items').firstOrNull;
128+
expect(itemDeleted, equals(null));
129+
130+
var crudDeleted = db.select('select * from ps_crud where id = 3').first;
131+
var crudDataDeleted = jsonDecode(crudDeleted['data']);
132+
expect(crudDeleted['tx_id'], equals(3));
133+
expect(crudDataDeleted,
134+
equals({'op': 'DELETE', 'type': 'items', 'id': 'test_id'}));
135+
};
136+
137+
var runCrudTestLocalOnly = (int numberOfColumns) {
138+
var columns = [];
139+
for (var i = 0; i < numberOfColumns; i++) {
140+
columns.add({'name': 'column$i', 'type': 'TEXT'});
141+
}
142+
var tableSchema = {
143+
'tables': [
144+
{'name': 'items', 'columns': columns, 'local_only': true}
145+
]
146+
};
147+
db.select('select powersync_init()');
148+
149+
// 1. Test schema initialization
150+
db.select(
151+
'select powersync_replace_schema(?)', [jsonEncode(tableSchema)]);
152+
153+
var columnNames = columns.map((c) => c['name']).join(', ');
154+
var columnValues = columns.map((c) => "'${c['name']}'").join(', ');
155+
156+
// 2. Test insert
157+
db.select(
158+
"insert into items(id, ${columnNames}) values('test_id', ${columnValues})");
159+
var item = db.select('select * from items').first;
160+
var expectedData =
161+
Map.fromEntries(columns.map((c) => MapEntry(c['name'], c['name'])));
162+
163+
expect(item, equals({'id': 'test_id', ...expectedData}));
164+
165+
// 3. Test update
166+
db.select('update items set column0 = ?', ['new_value']);
167+
var itemUpdated = db.select('select * from items').first;
168+
expect(itemUpdated,
169+
equals({'id': 'test_id', ...expectedData, 'column0': 'new_value'}));
170+
171+
// 4. Test delete
172+
db.select('delete from items');
173+
var itemDeleted = db.select('select * from items').firstOrNull;
174+
expect(itemDeleted, equals(null));
175+
};
176+
177+
var runCrudTestInsertOnly = (int numberOfColumns) {
178+
var columns = [];
179+
for (var i = 0; i < numberOfColumns; i++) {
180+
columns.add({'name': 'column$i', 'type': 'TEXT'});
181+
}
182+
var tableSchema = {
183+
'tables': [
184+
{'name': 'items', 'columns': columns, 'insert_only': true}
185+
]
186+
};
187+
db.select('select powersync_init()');
188+
189+
// 1. Test schema initialization
190+
db.select(
191+
'select powersync_replace_schema(?)', [jsonEncode(tableSchema)]);
192+
193+
var columnNames = columns.map((c) => c['name']).join(', ');
194+
var columnValues = columns.map((c) => "'${c['name']}'").join(', ');
195+
196+
// 2. Test insert
197+
db.select(
198+
"insert into items(id, ${columnNames}) values('test_id', ${columnValues})");
199+
var item = db.select('select * from items').firstOrNull;
200+
expect(item, equals(null));
201+
var expectedData =
202+
Map.fromEntries(columns.map((c) => MapEntry(c['name'], c['name'])));
203+
204+
var crud = db.select('select * from ps_crud').first;
205+
var crudData = jsonDecode(crud['data']);
206+
expect(crud['tx_id'], equals(1));
207+
expect(
208+
crudData,
209+
equals({
210+
'op': 'PUT',
211+
'type': 'items',
212+
'id': 'test_id',
213+
'data': expectedData
214+
}));
215+
};
216+
217+
for (var numberOfColumns in [1, 49, 50, 51, 63, 64, 100, 1999]) {
218+
test('crud test with $numberOfColumns columns', () async {
219+
runCrudTest(numberOfColumns);
220+
});
221+
test('crud test with $numberOfColumns columns - local_only', () async {
222+
runCrudTestLocalOnly(numberOfColumns);
223+
});
224+
225+
test('crud test with $numberOfColumns columns - insert_only', () async {
226+
runCrudTestInsertOnly(numberOfColumns);
227+
});
228+
}
229+
});
230+
}

0 commit comments

Comments
 (0)