@powersync/service-core-tests 0.14.0 → 0.15.1

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 (38) hide show
  1. package/CHANGELOG.md +40 -0
  2. package/dist/test-utils/general-utils.d.ts +22 -3
  3. package/dist/test-utils/general-utils.js +56 -3
  4. package/dist/test-utils/general-utils.js.map +1 -1
  5. package/dist/test-utils/stream_utils.js +2 -2
  6. package/dist/test-utils/stream_utils.js.map +1 -1
  7. package/dist/tests/register-compacting-tests.d.ts +1 -1
  8. package/dist/tests/register-compacting-tests.js +360 -297
  9. package/dist/tests/register-compacting-tests.js.map +1 -1
  10. package/dist/tests/register-data-storage-checkpoint-tests.d.ts +1 -1
  11. package/dist/tests/register-data-storage-checkpoint-tests.js +59 -48
  12. package/dist/tests/register-data-storage-checkpoint-tests.js.map +1 -1
  13. package/dist/tests/register-data-storage-data-tests.d.ts +2 -2
  14. package/dist/tests/register-data-storage-data-tests.js +1112 -612
  15. package/dist/tests/register-data-storage-data-tests.js.map +1 -1
  16. package/dist/tests/register-data-storage-parameter-tests.d.ts +1 -1
  17. package/dist/tests/register-data-storage-parameter-tests.js +273 -254
  18. package/dist/tests/register-data-storage-parameter-tests.js.map +1 -1
  19. package/dist/tests/register-parameter-compacting-tests.d.ts +1 -1
  20. package/dist/tests/register-parameter-compacting-tests.js +83 -87
  21. package/dist/tests/register-parameter-compacting-tests.js.map +1 -1
  22. package/dist/tests/register-sync-tests.d.ts +2 -1
  23. package/dist/tests/register-sync-tests.js +479 -451
  24. package/dist/tests/register-sync-tests.js.map +1 -1
  25. package/dist/tests/util.d.ts +5 -4
  26. package/dist/tests/util.js +27 -12
  27. package/dist/tests/util.js.map +1 -1
  28. package/package.json +3 -3
  29. package/src/test-utils/general-utils.ts +81 -4
  30. package/src/test-utils/stream_utils.ts +2 -2
  31. package/src/tests/register-compacting-tests.ts +376 -322
  32. package/src/tests/register-data-storage-checkpoint-tests.ts +85 -53
  33. package/src/tests/register-data-storage-data-tests.ts +1050 -559
  34. package/src/tests/register-data-storage-parameter-tests.ts +330 -288
  35. package/src/tests/register-parameter-compacting-tests.ts +87 -90
  36. package/src/tests/register-sync-tests.ts +390 -380
  37. package/src/tests/util.ts +46 -17
  38. package/tsconfig.tsbuildinfo +1 -1
@@ -12,15 +12,24 @@ import * as test_utils from '../test-utils/test-utils-index.js';
12
12
  *
13
13
  * ```
14
14
  */
15
- export function registerDataStorageCheckpointTests(generateStorageFactory: storage.TestStorageFactory) {
15
+ export function registerDataStorageCheckpointTests(config: storage.TestStorageConfig) {
16
+ const generateStorageFactory = config.factory;
17
+ const storageVersion = config.storageVersion;
18
+
16
19
  test('managed write checkpoints - checkpoint after write', async (context) => {
17
20
  await using factory = await generateStorageFactory();
18
21
  const r = await factory.configureSyncRules(
19
- updateSyncRulesFromYaml(`
22
+ updateSyncRulesFromYaml(
23
+ `
20
24
  bucket_definitions:
21
25
  mybucket:
22
26
  data: []
23
- `)
27
+ `,
28
+ {
29
+ validate: false,
30
+ storageVersion
31
+ }
32
+ )
24
33
  );
25
34
  const bucketStorage = factory.getInstance(r.persisted_sync_rules!);
26
35
 
@@ -30,14 +39,15 @@ bucket_definitions:
30
39
  .watchCheckpointChanges({ user_id: 'user1', signal: abortController.signal })
31
40
  [Symbol.asyncIterator]();
32
41
 
42
+ await using writer = await bucketStorage.createWriter(test_utils.BATCH_OPTIONS);
43
+ await writer.markAllSnapshotDone('1/1');
44
+
33
45
  const writeCheckpoint = await bucketStorage.createManagedWriteCheckpoint({
34
46
  heads: { '1': '5/0' },
35
47
  user_id: 'user1'
36
48
  });
37
49
 
38
- await bucketStorage.startBatch(test_utils.BATCH_OPTIONS, async (batch) => {
39
- await batch.keepalive('5/0');
40
- });
50
+ await writer.keepalive('5/0');
41
51
 
42
52
  const result = await iter.next();
43
53
  expect(result).toMatchObject({
@@ -55,23 +65,30 @@ bucket_definitions:
55
65
  test('managed write checkpoints - write after checkpoint', async (context) => {
56
66
  await using factory = await generateStorageFactory();
57
67
  const r = await factory.configureSyncRules(
58
- updateSyncRulesFromYaml(`
68
+ updateSyncRulesFromYaml(
69
+ `
59
70
  bucket_definitions:
60
71
  mybucket:
61
72
  data: []
62
- `)
73
+ `,
74
+ {
75
+ validate: false,
76
+ storageVersion
77
+ }
78
+ )
63
79
  );
64
80
  const bucketStorage = factory.getInstance(r.persisted_sync_rules!);
65
81
 
82
+ await using writer = await bucketStorage.createWriter(test_utils.BATCH_OPTIONS);
83
+ await writer.markAllSnapshotDone('1/1');
84
+
66
85
  const abortController = new AbortController();
67
86
  context.onTestFinished(() => abortController.abort());
68
87
  const iter = bucketStorage
69
88
  .watchCheckpointChanges({ user_id: 'user1', signal: abortController.signal })
70
89
  [Symbol.asyncIterator]();
71
90
 
72
- await bucketStorage.startBatch(test_utils.BATCH_OPTIONS, async (batch) => {
73
- await batch.keepalive('5/0');
74
- });
91
+ await writer.keepalive('5/0');
75
92
 
76
93
  const result = await iter.next();
77
94
  expect(result).toMatchObject({
@@ -92,9 +109,7 @@ bucket_definitions:
92
109
  // We have to trigger a new keepalive after the checkpoint, at least to cover postgres storage.
93
110
  // This is what is effetively triggered with RouteAPI.createReplicationHead().
94
111
  // MongoDB storage doesn't explicitly need this anymore.
95
- await bucketStorage.startBatch(test_utils.BATCH_OPTIONS, async (batch) => {
96
- await batch.keepalive('6/0');
97
- });
112
+ await writer.keepalive('6/0');
98
113
 
99
114
  let result2 = await iter.next();
100
115
  if (result2.value?.base?.lsn == '5/0') {
@@ -116,29 +131,36 @@ bucket_definitions:
116
131
  test('custom write checkpoints - checkpoint after write', async (context) => {
117
132
  await using factory = await generateStorageFactory();
118
133
  const r = await factory.configureSyncRules(
119
- updateSyncRulesFromYaml(`
134
+ updateSyncRulesFromYaml(
135
+ `
120
136
  bucket_definitions:
121
137
  mybucket:
122
138
  data: []
123
- `)
139
+ `,
140
+ {
141
+ validate: false,
142
+ storageVersion
143
+ }
144
+ )
124
145
  );
125
146
  const bucketStorage = factory.getInstance(r.persisted_sync_rules!);
126
147
  bucketStorage.setWriteCheckpointMode(storage.WriteCheckpointMode.CUSTOM);
127
148
 
149
+ await using writer = await bucketStorage.createWriter(test_utils.BATCH_OPTIONS);
150
+ await writer.markAllSnapshotDone('1/1');
151
+
128
152
  const abortController = new AbortController();
129
153
  context.onTestFinished(() => abortController.abort());
130
154
  const iter = bucketStorage
131
155
  .watchCheckpointChanges({ user_id: 'user1', signal: abortController.signal })
132
156
  [Symbol.asyncIterator]();
133
157
 
134
- await bucketStorage.startBatch(test_utils.BATCH_OPTIONS, async (batch) => {
135
- await batch.addCustomWriteCheckpoint({
136
- checkpoint: 5n,
137
- user_id: 'user1'
138
- });
139
- await batch.flush();
140
- await batch.keepalive('5/0');
158
+ writer.addCustomWriteCheckpoint({
159
+ checkpoint: 5n,
160
+ user_id: 'user1'
141
161
  });
162
+ await writer.flush();
163
+ await writer.keepalive('5/0');
142
164
 
143
165
  const result = await iter.next();
144
166
  expect(result).toMatchObject({
@@ -155,32 +177,39 @@ bucket_definitions:
155
177
  test('custom write checkpoints - standalone checkpoint', async (context) => {
156
178
  await using factory = await generateStorageFactory();
157
179
  const r = await factory.configureSyncRules(
158
- updateSyncRulesFromYaml(`
180
+ updateSyncRulesFromYaml(
181
+ `
159
182
  bucket_definitions:
160
183
  mybucket:
161
184
  data: []
162
- `)
185
+ `,
186
+ {
187
+ validate: false,
188
+ storageVersion
189
+ }
190
+ )
163
191
  );
164
192
  const bucketStorage = factory.getInstance(r.persisted_sync_rules!);
165
193
  bucketStorage.setWriteCheckpointMode(storage.WriteCheckpointMode.CUSTOM);
166
194
 
195
+ await using writer = await bucketStorage.createWriter(test_utils.BATCH_OPTIONS);
196
+ await writer.markAllSnapshotDone('1/1');
197
+
167
198
  const abortController = new AbortController();
168
199
  context.onTestFinished(() => abortController.abort());
169
200
  const iter = bucketStorage
170
201
  .watchCheckpointChanges({ user_id: 'user1', signal: abortController.signal })
171
202
  [Symbol.asyncIterator]();
172
203
 
173
- await bucketStorage.startBatch(test_utils.BATCH_OPTIONS, async (batch) => {
174
- // Flush to clear state
175
- await batch.flush();
204
+ // Flush to clear state
205
+ await writer.flush();
176
206
 
177
- await batch.addCustomWriteCheckpoint({
178
- checkpoint: 5n,
179
- user_id: 'user1'
180
- });
181
- await batch.flush();
182
- await batch.keepalive('5/0');
207
+ writer.addCustomWriteCheckpoint({
208
+ checkpoint: 5n,
209
+ user_id: 'user1'
183
210
  });
211
+ await writer.flush();
212
+ await writer.keepalive('5/0');
184
213
 
185
214
  const result = await iter.next();
186
215
  expect(result).toMatchObject({
@@ -197,24 +226,31 @@ bucket_definitions:
197
226
  test('custom write checkpoints - write after checkpoint', async (context) => {
198
227
  await using factory = await generateStorageFactory();
199
228
  const r = await factory.configureSyncRules(
200
- updateSyncRulesFromYaml(`
229
+ updateSyncRulesFromYaml(
230
+ `
201
231
  bucket_definitions:
202
232
  mybucket:
203
233
  data: []
204
- `)
234
+ `,
235
+ {
236
+ validate: false,
237
+ storageVersion
238
+ }
239
+ )
205
240
  );
206
241
  const bucketStorage = factory.getInstance(r.persisted_sync_rules!);
207
242
  bucketStorage.setWriteCheckpointMode(storage.WriteCheckpointMode.CUSTOM);
208
243
 
244
+ await using writer = await bucketStorage.createWriter(test_utils.BATCH_OPTIONS);
245
+ await writer.markAllSnapshotDone('1/1');
246
+
209
247
  const abortController = new AbortController();
210
248
  context.onTestFinished(() => abortController.abort());
211
249
  const iter = bucketStorage
212
250
  .watchCheckpointChanges({ user_id: 'user1', signal: abortController.signal })
213
251
  [Symbol.asyncIterator]();
214
252
 
215
- await bucketStorage.startBatch(test_utils.BATCH_OPTIONS, async (batch) => {
216
- await batch.keepalive('5/0');
217
- });
253
+ await writer.keepalive('5/0');
218
254
 
219
255
  const result = await iter.next();
220
256
  expect(result).toMatchObject({
@@ -227,14 +263,12 @@ bucket_definitions:
227
263
  }
228
264
  });
229
265
 
230
- await bucketStorage.startBatch(test_utils.BATCH_OPTIONS, async (batch) => {
231
- batch.addCustomWriteCheckpoint({
232
- checkpoint: 6n,
233
- user_id: 'user1'
234
- });
235
- await batch.flush();
236
- await batch.keepalive('6/0');
266
+ writer.addCustomWriteCheckpoint({
267
+ checkpoint: 6n,
268
+ user_id: 'user1'
237
269
  });
270
+ await writer.flush();
271
+ await writer.keepalive('6/0');
238
272
 
239
273
  let result2 = await iter.next();
240
274
  expect(result2).toMatchObject({
@@ -248,14 +282,12 @@ bucket_definitions:
248
282
  }
249
283
  });
250
284
 
251
- await bucketStorage.startBatch(test_utils.BATCH_OPTIONS, async (batch) => {
252
- batch.addCustomWriteCheckpoint({
253
- checkpoint: 7n,
254
- user_id: 'user1'
255
- });
256
- await batch.flush();
257
- await batch.keepalive('7/0');
285
+ writer.addCustomWriteCheckpoint({
286
+ checkpoint: 7n,
287
+ user_id: 'user1'
258
288
  });
289
+ await writer.flush();
290
+ await writer.keepalive('7/0');
259
291
 
260
292
  let result3 = await iter.next();
261
293
  expect(result3).toMatchObject({