@powersync/service-core-tests 0.13.2 → 0.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +24 -0
- package/dist/test-utils/general-utils.d.ts +0 -1
- package/dist/test-utils/general-utils.js +0 -24
- package/dist/test-utils/general-utils.js.map +1 -1
- package/dist/tests/register-compacting-tests.js +40 -51
- package/dist/tests/register-compacting-tests.js.map +1 -1
- package/dist/tests/register-data-storage-checkpoint-tests.js +11 -26
- package/dist/tests/register-data-storage-checkpoint-tests.js.map +1 -1
- package/dist/tests/register-data-storage-data-tests.js +80 -96
- package/dist/tests/register-data-storage-data-tests.js.map +1 -1
- package/dist/tests/register-data-storage-parameter-tests.js +84 -46
- package/dist/tests/register-data-storage-parameter-tests.js.map +1 -1
- package/dist/tests/register-parameter-compacting-tests.js +5 -9
- package/dist/tests/register-parameter-compacting-tests.js.map +1 -1
- package/dist/tests/register-sync-tests.d.ts +3 -1
- package/dist/tests/register-sync-tests.js +29 -22
- package/dist/tests/register-sync-tests.js.map +1 -1
- package/dist/tests/util.d.ts +5 -1
- package/dist/tests/util.js +14 -0
- package/dist/tests/util.js.map +1 -1
- package/package.json +3 -3
- package/src/test-utils/general-utils.ts +1 -25
- package/src/tests/register-compacting-tests.ts +56 -51
- package/src/tests/register-data-storage-checkpoint-tests.ts +21 -26
- package/src/tests/register-data-storage-data-tests.ts +135 -101
- package/src/tests/register-data-storage-parameter-tests.ts +102 -47
- package/src/tests/register-parameter-compacting-tests.ts +9 -9
- package/src/tests/register-sync-tests.ts +32 -22
- package/src/tests/util.ts +21 -0
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -1,19 +1,20 @@
|
|
|
1
|
-
import { storage } from '@powersync/service-core';
|
|
1
|
+
import { storage, updateSyncRulesFromYaml } from '@powersync/service-core';
|
|
2
2
|
import { expect, test } from 'vitest';
|
|
3
3
|
import * as test_utils from '../test-utils/test-utils-index.js';
|
|
4
|
+
import { bucketRequest, bucketRequestMap, bucketRequests } from './util.js';
|
|
4
5
|
|
|
5
6
|
const TEST_TABLE = test_utils.makeTestTable('test', ['id']);
|
|
6
7
|
|
|
7
8
|
export function registerCompactTests(generateStorageFactory: storage.TestStorageFactory) {
|
|
8
9
|
test('compacting (1)', async () => {
|
|
9
10
|
await using factory = await generateStorageFactory();
|
|
10
|
-
const syncRules = await factory.updateSyncRules(
|
|
11
|
-
|
|
11
|
+
const syncRules = await factory.updateSyncRules(
|
|
12
|
+
updateSyncRulesFromYaml(`
|
|
12
13
|
bucket_definitions:
|
|
13
14
|
global:
|
|
14
15
|
data: [select * from test]
|
|
15
|
-
`
|
|
16
|
-
|
|
16
|
+
`)
|
|
17
|
+
);
|
|
17
18
|
const bucketStorage = factory.getInstance(syncRules);
|
|
18
19
|
|
|
19
20
|
const result = await bucketStorage.startBatch(test_utils.BATCH_OPTIONS, async (batch) => {
|
|
@@ -50,10 +51,10 @@ bucket_definitions:
|
|
|
50
51
|
const checkpoint = result!.flushed_op;
|
|
51
52
|
|
|
52
53
|
const batchBefore = await test_utils.oneFromAsync(
|
|
53
|
-
bucketStorage.getBucketDataBatch(checkpoint,
|
|
54
|
+
bucketStorage.getBucketDataBatch(checkpoint, bucketRequestMap(syncRules, [['global[]', 0n]]))
|
|
54
55
|
);
|
|
55
56
|
const dataBefore = batchBefore.chunkData.data;
|
|
56
|
-
const checksumBefore = await bucketStorage.getChecksums(checkpoint, ['global[]']);
|
|
57
|
+
const checksumBefore = await bucketStorage.getChecksums(checkpoint, bucketRequests(syncRules, ['global[]']));
|
|
57
58
|
|
|
58
59
|
expect(dataBefore).toMatchObject([
|
|
59
60
|
{
|
|
@@ -86,12 +87,12 @@ bucket_definitions:
|
|
|
86
87
|
});
|
|
87
88
|
|
|
88
89
|
const batchAfter = await test_utils.oneFromAsync(
|
|
89
|
-
bucketStorage.getBucketDataBatch(checkpoint,
|
|
90
|
+
bucketStorage.getBucketDataBatch(checkpoint, bucketRequestMap(syncRules, [['global[]', 0n]]))
|
|
90
91
|
);
|
|
91
92
|
const dataAfter = batchAfter.chunkData.data;
|
|
92
|
-
const checksumAfter = await bucketStorage.getChecksums(checkpoint, ['global[]']);
|
|
93
|
+
const checksumAfter = await bucketStorage.getChecksums(checkpoint, bucketRequests(syncRules, ['global[]']));
|
|
93
94
|
bucketStorage.clearChecksumCache();
|
|
94
|
-
const checksumAfter2 = await bucketStorage.getChecksums(checkpoint, ['global[]']);
|
|
95
|
+
const checksumAfter2 = await bucketStorage.getChecksums(checkpoint, bucketRequests(syncRules, ['global[]']));
|
|
95
96
|
|
|
96
97
|
expect(batchAfter.targetOp).toEqual(3n);
|
|
97
98
|
expect(dataAfter).toMatchObject([
|
|
@@ -114,21 +115,25 @@ bucket_definitions:
|
|
|
114
115
|
}
|
|
115
116
|
]);
|
|
116
117
|
|
|
117
|
-
expect(checksumAfter.get('global[]')).toEqual(
|
|
118
|
-
|
|
118
|
+
expect(checksumAfter.get(bucketRequest(syncRules, 'global[]'))).toEqual(
|
|
119
|
+
checksumBefore.get(bucketRequest(syncRules, 'global[]'))
|
|
120
|
+
);
|
|
121
|
+
expect(checksumAfter2.get(bucketRequest(syncRules, 'global[]'))).toEqual(
|
|
122
|
+
checksumBefore.get(bucketRequest(syncRules, 'global[]'))
|
|
123
|
+
);
|
|
119
124
|
|
|
120
125
|
test_utils.validateCompactedBucket(dataBefore, dataAfter);
|
|
121
126
|
});
|
|
122
127
|
|
|
123
128
|
test('compacting (2)', async () => {
|
|
124
129
|
await using factory = await generateStorageFactory();
|
|
125
|
-
const syncRules = await factory.updateSyncRules(
|
|
126
|
-
|
|
130
|
+
const syncRules = await factory.updateSyncRules(
|
|
131
|
+
updateSyncRulesFromYaml(`
|
|
127
132
|
bucket_definitions:
|
|
128
133
|
global:
|
|
129
134
|
data: [select * from test]
|
|
130
|
-
`
|
|
131
|
-
|
|
135
|
+
`)
|
|
136
|
+
);
|
|
132
137
|
const bucketStorage = factory.getInstance(syncRules);
|
|
133
138
|
|
|
134
139
|
const result = await bucketStorage.startBatch(test_utils.BATCH_OPTIONS, async (batch) => {
|
|
@@ -174,10 +179,10 @@ bucket_definitions:
|
|
|
174
179
|
const checkpoint = result!.flushed_op;
|
|
175
180
|
|
|
176
181
|
const batchBefore = await test_utils.oneFromAsync(
|
|
177
|
-
bucketStorage.getBucketDataBatch(checkpoint,
|
|
182
|
+
bucketStorage.getBucketDataBatch(checkpoint, bucketRequestMap(syncRules, [['global[]', 0n]]))
|
|
178
183
|
);
|
|
179
184
|
const dataBefore = batchBefore.chunkData.data;
|
|
180
|
-
const checksumBefore = await bucketStorage.getChecksums(checkpoint, ['global[]']);
|
|
185
|
+
const checksumBefore = await bucketStorage.getChecksums(checkpoint, bucketRequests(syncRules, ['global[]']));
|
|
181
186
|
|
|
182
187
|
expect(dataBefore).toMatchObject([
|
|
183
188
|
{
|
|
@@ -215,11 +220,11 @@ bucket_definitions:
|
|
|
215
220
|
});
|
|
216
221
|
|
|
217
222
|
const batchAfter = await test_utils.oneFromAsync(
|
|
218
|
-
bucketStorage.getBucketDataBatch(checkpoint,
|
|
223
|
+
bucketStorage.getBucketDataBatch(checkpoint, bucketRequestMap(syncRules, [['global[]', 0n]]))
|
|
219
224
|
);
|
|
220
225
|
const dataAfter = batchAfter.chunkData.data;
|
|
221
226
|
bucketStorage.clearChecksumCache();
|
|
222
|
-
const checksumAfter = await bucketStorage.getChecksums(checkpoint, ['global[]']);
|
|
227
|
+
const checksumAfter = await bucketStorage.getChecksums(checkpoint, bucketRequests(syncRules, ['global[]']));
|
|
223
228
|
|
|
224
229
|
expect(batchAfter.targetOp).toEqual(4n);
|
|
225
230
|
expect(dataAfter).toMatchObject([
|
|
@@ -235,8 +240,8 @@ bucket_definitions:
|
|
|
235
240
|
op_id: '4'
|
|
236
241
|
}
|
|
237
242
|
]);
|
|
238
|
-
expect(checksumAfter.get('global[]')).toEqual({
|
|
239
|
-
...checksumBefore.get('global[]'),
|
|
243
|
+
expect(checksumAfter.get(bucketRequest(syncRules, 'global[]'))).toEqual({
|
|
244
|
+
...checksumBefore.get(bucketRequest(syncRules, 'global[]')),
|
|
240
245
|
count: 2
|
|
241
246
|
});
|
|
242
247
|
|
|
@@ -245,13 +250,13 @@ bucket_definitions:
|
|
|
245
250
|
|
|
246
251
|
test('compacting (3)', async () => {
|
|
247
252
|
await using factory = await generateStorageFactory();
|
|
248
|
-
const syncRules = await factory.updateSyncRules(
|
|
249
|
-
|
|
253
|
+
const syncRules = await factory.updateSyncRules(
|
|
254
|
+
updateSyncRulesFromYaml(`
|
|
250
255
|
bucket_definitions:
|
|
251
256
|
global:
|
|
252
257
|
data: [select * from test]
|
|
253
|
-
`
|
|
254
|
-
|
|
258
|
+
`)
|
|
259
|
+
);
|
|
255
260
|
const bucketStorage = factory.getInstance(syncRules);
|
|
256
261
|
|
|
257
262
|
const result = await bucketStorage.startBatch(test_utils.BATCH_OPTIONS, async (batch) => {
|
|
@@ -286,7 +291,7 @@ bucket_definitions:
|
|
|
286
291
|
});
|
|
287
292
|
|
|
288
293
|
const checkpoint1 = result!.flushed_op;
|
|
289
|
-
const checksumBefore = await bucketStorage.getChecksums(checkpoint1, ['global[]']);
|
|
294
|
+
const checksumBefore = await bucketStorage.getChecksums(checkpoint1, bucketRequests(syncRules, ['global[]']));
|
|
290
295
|
|
|
291
296
|
const result2 = await bucketStorage.startBatch(test_utils.BATCH_OPTIONS, async (batch) => {
|
|
292
297
|
await batch.save({
|
|
@@ -310,11 +315,11 @@ bucket_definitions:
|
|
|
310
315
|
});
|
|
311
316
|
|
|
312
317
|
const batchAfter = await test_utils.oneFromAsync(
|
|
313
|
-
bucketStorage.getBucketDataBatch(checkpoint2,
|
|
318
|
+
bucketStorage.getBucketDataBatch(checkpoint2, bucketRequestMap(syncRules, [['global[]', 0n]]))
|
|
314
319
|
);
|
|
315
320
|
const dataAfter = batchAfter.chunkData.data;
|
|
316
321
|
await bucketStorage.clearChecksumCache();
|
|
317
|
-
const checksumAfter = await bucketStorage.getChecksums(checkpoint2, ['global[]']);
|
|
322
|
+
const checksumAfter = await bucketStorage.getChecksums(checkpoint2, bucketRequests(syncRules, ['global[]']));
|
|
318
323
|
|
|
319
324
|
expect(batchAfter.targetOp).toEqual(4n);
|
|
320
325
|
expect(dataAfter).toMatchObject([
|
|
@@ -324,8 +329,8 @@ bucket_definitions:
|
|
|
324
329
|
op_id: '4'
|
|
325
330
|
}
|
|
326
331
|
]);
|
|
327
|
-
expect(checksumAfter.get('global[]')).toEqual({
|
|
328
|
-
bucket: 'global[]',
|
|
332
|
+
expect(checksumAfter.get(bucketRequest(syncRules, 'global[]'))).toEqual({
|
|
333
|
+
bucket: bucketRequest(syncRules, 'global[]'),
|
|
329
334
|
count: 1,
|
|
330
335
|
checksum: 1874612650
|
|
331
336
|
});
|
|
@@ -333,16 +338,16 @@ bucket_definitions:
|
|
|
333
338
|
|
|
334
339
|
test('compacting (4)', async () => {
|
|
335
340
|
await using factory = await generateStorageFactory();
|
|
336
|
-
const syncRules = await factory.updateSyncRules(
|
|
337
|
-
|
|
341
|
+
const syncRules = await factory.updateSyncRules(
|
|
342
|
+
updateSyncRulesFromYaml(` bucket_definitions:
|
|
338
343
|
grouped:
|
|
339
344
|
# The parameter query here is not important
|
|
340
345
|
# We specifically don't want to create bucket_parameter records here
|
|
341
346
|
# since the op_ids for bucket_data could vary between storage implementations.
|
|
342
347
|
parameters: select 'b' as b
|
|
343
348
|
data:
|
|
344
|
-
- select * from test where b = bucket.b`
|
|
345
|
-
|
|
349
|
+
- select * from test where b = bucket.b`)
|
|
350
|
+
);
|
|
346
351
|
const bucketStorage = factory.getInstance(syncRules);
|
|
347
352
|
|
|
348
353
|
const result = await bucketStorage.startBatch(test_utils.BATCH_OPTIONS, async (batch) => {
|
|
@@ -426,7 +431,7 @@ bucket_definitions:
|
|
|
426
431
|
const batchAfter = await test_utils.fromAsync(
|
|
427
432
|
bucketStorage.getBucketDataBatch(
|
|
428
433
|
checkpoint,
|
|
429
|
-
|
|
434
|
+
bucketRequestMap(syncRules, [
|
|
430
435
|
['grouped["b1"]', 0n],
|
|
431
436
|
['grouped["b2"]', 0n]
|
|
432
437
|
])
|
|
@@ -463,13 +468,13 @@ bucket_definitions:
|
|
|
463
468
|
|
|
464
469
|
test('partial checksums after compacting', async () => {
|
|
465
470
|
await using factory = await generateStorageFactory();
|
|
466
|
-
const syncRules = await factory.updateSyncRules(
|
|
467
|
-
|
|
471
|
+
const syncRules = await factory.updateSyncRules(
|
|
472
|
+
updateSyncRulesFromYaml(`
|
|
468
473
|
bucket_definitions:
|
|
469
474
|
global:
|
|
470
475
|
data: [select * from test]
|
|
471
|
-
`
|
|
472
|
-
|
|
476
|
+
`)
|
|
477
|
+
);
|
|
473
478
|
const bucketStorage = factory.getInstance(syncRules);
|
|
474
479
|
|
|
475
480
|
const result = await bucketStorage.startBatch(test_utils.BATCH_OPTIONS, async (batch) => {
|
|
@@ -524,9 +529,9 @@ bucket_definitions:
|
|
|
524
529
|
});
|
|
525
530
|
const checkpoint2 = result2!.flushed_op;
|
|
526
531
|
await bucketStorage.clearChecksumCache();
|
|
527
|
-
const checksumAfter = await bucketStorage.getChecksums(checkpoint2, ['global[]']);
|
|
528
|
-
expect(checksumAfter.get('global[]')).toEqual({
|
|
529
|
-
bucket: 'global[]',
|
|
532
|
+
const checksumAfter = await bucketStorage.getChecksums(checkpoint2, bucketRequests(syncRules, ['global[]']));
|
|
533
|
+
expect(checksumAfter.get(bucketRequest(syncRules, 'global[]'))).toEqual({
|
|
534
|
+
bucket: bucketRequest(syncRules, 'global[]'),
|
|
530
535
|
count: 4,
|
|
531
536
|
checksum: 1874612650
|
|
532
537
|
});
|
|
@@ -534,13 +539,13 @@ bucket_definitions:
|
|
|
534
539
|
|
|
535
540
|
test('partial checksums after compacting (2)', async () => {
|
|
536
541
|
await using factory = await generateStorageFactory();
|
|
537
|
-
const syncRules = await factory.updateSyncRules(
|
|
538
|
-
|
|
542
|
+
const syncRules = await factory.updateSyncRules(
|
|
543
|
+
updateSyncRulesFromYaml(`
|
|
539
544
|
bucket_definitions:
|
|
540
545
|
global:
|
|
541
546
|
data: [select * from test]
|
|
542
|
-
`
|
|
543
|
-
|
|
547
|
+
`)
|
|
548
|
+
);
|
|
544
549
|
const bucketStorage = factory.getInstance(syncRules);
|
|
545
550
|
|
|
546
551
|
const result = await bucketStorage.startBatch(test_utils.BATCH_OPTIONS, async (batch) => {
|
|
@@ -566,7 +571,7 @@ bucket_definitions:
|
|
|
566
571
|
});
|
|
567
572
|
|
|
568
573
|
// Get checksums here just to populate the cache
|
|
569
|
-
await bucketStorage.getChecksums(result!.flushed_op, ['global[]']);
|
|
574
|
+
await bucketStorage.getChecksums(result!.flushed_op, bucketRequests(syncRules, ['global[]']));
|
|
570
575
|
const result2 = await bucketStorage.startBatch(test_utils.BATCH_OPTIONS, async (batch) => {
|
|
571
576
|
await batch.save({
|
|
572
577
|
sourceTable: TEST_TABLE,
|
|
@@ -589,9 +594,9 @@ bucket_definitions:
|
|
|
589
594
|
|
|
590
595
|
const checkpoint2 = result2!.flushed_op;
|
|
591
596
|
// Check that the checksum was correctly updated with the clear operation after having a cached checksum
|
|
592
|
-
const checksumAfter = await bucketStorage.getChecksums(checkpoint2, ['global[]']);
|
|
593
|
-
expect(checksumAfter.get('global[]')).toMatchObject({
|
|
594
|
-
bucket: 'global[]',
|
|
597
|
+
const checksumAfter = await bucketStorage.getChecksums(checkpoint2, bucketRequests(syncRules, ['global[]']));
|
|
598
|
+
expect(checksumAfter.get(bucketRequest(syncRules, 'global[]'))).toMatchObject({
|
|
599
|
+
bucket: bucketRequest(syncRules, 'global[]'),
|
|
595
600
|
count: 1,
|
|
596
601
|
checksum: -1481659821
|
|
597
602
|
});
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { storage } from '@powersync/service-core';
|
|
1
|
+
import { storage, updateSyncRulesFromYaml } from '@powersync/service-core';
|
|
2
2
|
import { expect, test } from 'vitest';
|
|
3
3
|
import * as test_utils from '../test-utils/test-utils-index.js';
|
|
4
4
|
|
|
@@ -15,14 +15,13 @@ import * as test_utils from '../test-utils/test-utils-index.js';
|
|
|
15
15
|
export function registerDataStorageCheckpointTests(generateStorageFactory: storage.TestStorageFactory) {
|
|
16
16
|
test('managed write checkpoints - checkpoint after write', async (context) => {
|
|
17
17
|
await using factory = await generateStorageFactory();
|
|
18
|
-
const r = await factory.configureSyncRules(
|
|
19
|
-
|
|
18
|
+
const r = await factory.configureSyncRules(
|
|
19
|
+
updateSyncRulesFromYaml(`
|
|
20
20
|
bucket_definitions:
|
|
21
21
|
mybucket:
|
|
22
22
|
data: []
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
});
|
|
23
|
+
`)
|
|
24
|
+
);
|
|
26
25
|
const bucketStorage = factory.getInstance(r.persisted_sync_rules!);
|
|
27
26
|
|
|
28
27
|
const abortController = new AbortController();
|
|
@@ -55,14 +54,13 @@ bucket_definitions:
|
|
|
55
54
|
|
|
56
55
|
test('managed write checkpoints - write after checkpoint', async (context) => {
|
|
57
56
|
await using factory = await generateStorageFactory();
|
|
58
|
-
const r = await factory.configureSyncRules(
|
|
59
|
-
|
|
57
|
+
const r = await factory.configureSyncRules(
|
|
58
|
+
updateSyncRulesFromYaml(`
|
|
60
59
|
bucket_definitions:
|
|
61
60
|
mybucket:
|
|
62
61
|
data: []
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
});
|
|
62
|
+
`)
|
|
63
|
+
);
|
|
66
64
|
const bucketStorage = factory.getInstance(r.persisted_sync_rules!);
|
|
67
65
|
|
|
68
66
|
const abortController = new AbortController();
|
|
@@ -117,14 +115,13 @@ bucket_definitions:
|
|
|
117
115
|
|
|
118
116
|
test('custom write checkpoints - checkpoint after write', async (context) => {
|
|
119
117
|
await using factory = await generateStorageFactory();
|
|
120
|
-
const r = await factory.configureSyncRules(
|
|
121
|
-
|
|
118
|
+
const r = await factory.configureSyncRules(
|
|
119
|
+
updateSyncRulesFromYaml(`
|
|
122
120
|
bucket_definitions:
|
|
123
121
|
mybucket:
|
|
124
122
|
data: []
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
});
|
|
123
|
+
`)
|
|
124
|
+
);
|
|
128
125
|
const bucketStorage = factory.getInstance(r.persisted_sync_rules!);
|
|
129
126
|
bucketStorage.setWriteCheckpointMode(storage.WriteCheckpointMode.CUSTOM);
|
|
130
127
|
|
|
@@ -157,14 +154,13 @@ bucket_definitions:
|
|
|
157
154
|
|
|
158
155
|
test('custom write checkpoints - standalone checkpoint', async (context) => {
|
|
159
156
|
await using factory = await generateStorageFactory();
|
|
160
|
-
const r = await factory.configureSyncRules(
|
|
161
|
-
|
|
157
|
+
const r = await factory.configureSyncRules(
|
|
158
|
+
updateSyncRulesFromYaml(`
|
|
162
159
|
bucket_definitions:
|
|
163
160
|
mybucket:
|
|
164
161
|
data: []
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
});
|
|
162
|
+
`)
|
|
163
|
+
);
|
|
168
164
|
const bucketStorage = factory.getInstance(r.persisted_sync_rules!);
|
|
169
165
|
bucketStorage.setWriteCheckpointMode(storage.WriteCheckpointMode.CUSTOM);
|
|
170
166
|
|
|
@@ -200,14 +196,13 @@ bucket_definitions:
|
|
|
200
196
|
|
|
201
197
|
test('custom write checkpoints - write after checkpoint', async (context) => {
|
|
202
198
|
await using factory = await generateStorageFactory();
|
|
203
|
-
const r = await factory.configureSyncRules(
|
|
204
|
-
|
|
199
|
+
const r = await factory.configureSyncRules(
|
|
200
|
+
updateSyncRulesFromYaml(`
|
|
205
201
|
bucket_definitions:
|
|
206
202
|
mybucket:
|
|
207
203
|
data: []
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
});
|
|
204
|
+
`)
|
|
205
|
+
);
|
|
211
206
|
const bucketStorage = factory.getInstance(r.persisted_sync_rules!);
|
|
212
207
|
bucketStorage.setWriteCheckpointMode(storage.WriteCheckpointMode.CUSTOM);
|
|
213
208
|
|