@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.
Files changed (30) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/dist/test-utils/general-utils.d.ts +0 -1
  3. package/dist/test-utils/general-utils.js +0 -24
  4. package/dist/test-utils/general-utils.js.map +1 -1
  5. package/dist/tests/register-compacting-tests.js +40 -51
  6. package/dist/tests/register-compacting-tests.js.map +1 -1
  7. package/dist/tests/register-data-storage-checkpoint-tests.js +11 -26
  8. package/dist/tests/register-data-storage-checkpoint-tests.js.map +1 -1
  9. package/dist/tests/register-data-storage-data-tests.js +80 -96
  10. package/dist/tests/register-data-storage-data-tests.js.map +1 -1
  11. package/dist/tests/register-data-storage-parameter-tests.js +84 -46
  12. package/dist/tests/register-data-storage-parameter-tests.js.map +1 -1
  13. package/dist/tests/register-parameter-compacting-tests.js +5 -9
  14. package/dist/tests/register-parameter-compacting-tests.js.map +1 -1
  15. package/dist/tests/register-sync-tests.d.ts +3 -1
  16. package/dist/tests/register-sync-tests.js +29 -22
  17. package/dist/tests/register-sync-tests.js.map +1 -1
  18. package/dist/tests/util.d.ts +5 -1
  19. package/dist/tests/util.js +14 -0
  20. package/dist/tests/util.js.map +1 -1
  21. package/package.json +3 -3
  22. package/src/test-utils/general-utils.ts +1 -25
  23. package/src/tests/register-compacting-tests.ts +56 -51
  24. package/src/tests/register-data-storage-checkpoint-tests.ts +21 -26
  25. package/src/tests/register-data-storage-data-tests.ts +135 -101
  26. package/src/tests/register-data-storage-parameter-tests.ts +102 -47
  27. package/src/tests/register-parameter-compacting-tests.ts +9 -9
  28. package/src/tests/register-sync-tests.ts +32 -22
  29. package/src/tests/util.ts +21 -0
  30. 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
- content: `
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, new Map([['global[]', 0n]]))
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, new Map([['global[]', 0n]]))
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(checksumBefore.get('global[]'));
118
- expect(checksumAfter2.get('global[]')).toEqual(checksumBefore.get('global[]'));
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
- content: `
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, new Map([['global[]', 0n]]))
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, new Map([['global[]', 0n]]))
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
- content: `
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, new Map([['global[]', 0n]]))
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
- /* yaml */ content: ` bucket_definitions:
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
- new Map([
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
- content: `
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
- content: `
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
- content: `
18
+ const r = await factory.configureSyncRules(
19
+ updateSyncRulesFromYaml(`
20
20
  bucket_definitions:
21
21
  mybucket:
22
22
  data: []
23
- `,
24
- validate: false
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
- content: `
57
+ const r = await factory.configureSyncRules(
58
+ updateSyncRulesFromYaml(`
60
59
  bucket_definitions:
61
60
  mybucket:
62
61
  data: []
63
- `,
64
- validate: false
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
- content: `
118
+ const r = await factory.configureSyncRules(
119
+ updateSyncRulesFromYaml(`
122
120
  bucket_definitions:
123
121
  mybucket:
124
122
  data: []
125
- `,
126
- validate: false
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
- content: `
157
+ const r = await factory.configureSyncRules(
158
+ updateSyncRulesFromYaml(`
162
159
  bucket_definitions:
163
160
  mybucket:
164
161
  data: []
165
- `,
166
- validate: false
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
- content: `
199
+ const r = await factory.configureSyncRules(
200
+ updateSyncRulesFromYaml(`
205
201
  bucket_definitions:
206
202
  mybucket:
207
203
  data: []
208
- `,
209
- validate: false
210
- });
204
+ `)
205
+ );
211
206
  const bucketStorage = factory.getInstance(r.persisted_sync_rules!);
212
207
  bucketStorage.setWriteCheckpointMode(storage.WriteCheckpointMode.CUSTOM);
213
208