@powersync/service-core-tests 0.0.0-dev-20241219091224
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 +15 -0
- package/LICENSE +67 -0
- package/README.md +5 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/test-utils/bucket-validation.d.ts +42 -0
- package/dist/test-utils/bucket-validation.js +115 -0
- package/dist/test-utils/bucket-validation.js.map +1 -0
- package/dist/test-utils/general-utils.d.ts +31 -0
- package/dist/test-utils/general-utils.js +81 -0
- package/dist/test-utils/general-utils.js.map +1 -0
- package/dist/test-utils/stream_utils.d.ts +6 -0
- package/dist/test-utils/stream_utils.js +37 -0
- package/dist/test-utils/stream_utils.js.map +1 -0
- package/dist/test-utils/test-utils-index.d.ts +3 -0
- package/dist/test-utils/test-utils-index.js +4 -0
- package/dist/test-utils/test-utils-index.js.map +1 -0
- package/dist/tests/register-bucket-validation-tests.d.ts +10 -0
- package/dist/tests/register-bucket-validation-tests.js +139 -0
- package/dist/tests/register-bucket-validation-tests.js.map +1 -0
- package/dist/tests/register-compacting-tests.d.ts +14 -0
- package/dist/tests/register-compacting-tests.js +343 -0
- package/dist/tests/register-compacting-tests.js.map +1 -0
- package/dist/tests/register-data-storage-tests.d.ts +14 -0
- package/dist/tests/register-data-storage-tests.js +1571 -0
- package/dist/tests/register-data-storage-tests.js.map +1 -0
- package/dist/tests/register-sync-tests.d.ts +11 -0
- package/dist/tests/register-sync-tests.js +538 -0
- package/dist/tests/register-sync-tests.js.map +1 -0
- package/dist/tests/tests-index.d.ts +4 -0
- package/dist/tests/tests-index.js +5 -0
- package/dist/tests/tests-index.js.map +1 -0
- package/package.json +28 -0
- package/src/index.ts +5 -0
- package/src/test-utils/bucket-validation.ts +120 -0
- package/src/test-utils/general-utils.ts +113 -0
- package/src/test-utils/stream_utils.ts +42 -0
- package/src/test-utils/test-utils-index.ts +4 -0
- package/src/tests/register-bucket-validation-tests.ts +148 -0
- package/src/tests/register-compacting-tests.ts +297 -0
- package/src/tests/register-data-storage-tests.ts +1552 -0
- package/src/tests/register-sync-tests.ts +521 -0
- package/src/tests/tests-index.ts +4 -0
- package/tsconfig.json +34 -0
- package/tsconfig.tsbuildinfo +1 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register-sync-tests.js","sourceRoot":"","sources":["../../src/tests/register-sync-tests.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tests-index.js","sourceRoot":"","sources":["../../src/tests/tests-index.ts"],"names":[],"mappings":"AAAA,cAAc,uCAAuC,CAAC;AACtD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,kCAAkC,CAAC;AACjD,cAAc,0BAA0B,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@powersync/service-core-tests",
|
|
3
|
+
"repository": "https://github.com/powersync-ja/powersync-service",
|
|
4
|
+
"types": "dist/index.d.ts",
|
|
5
|
+
"publishConfig": {
|
|
6
|
+
"access": "public"
|
|
7
|
+
},
|
|
8
|
+
"version": "0.0.0-dev-20241219091224",
|
|
9
|
+
"main": "dist/index.js",
|
|
10
|
+
"license": "FSL-1.1-Apache-2.0",
|
|
11
|
+
"type": "module",
|
|
12
|
+
"dependencies": {
|
|
13
|
+
"@powersync/service-core": "^0.0.0-dev-20241219091224",
|
|
14
|
+
"@powersync/service-jsonbig": "^0.17.10",
|
|
15
|
+
"@powersync/service-sync-rules": "^0.0.0-dev-20241219091224"
|
|
16
|
+
},
|
|
17
|
+
"peerDependencies": {
|
|
18
|
+
"vite-tsconfig-paths": "^4.3.2",
|
|
19
|
+
"vitest": "^2.1.1"
|
|
20
|
+
},
|
|
21
|
+
"devDependencies": {
|
|
22
|
+
"typescript": "^5.6.2"
|
|
23
|
+
},
|
|
24
|
+
"scripts": {
|
|
25
|
+
"build": "tsc -b",
|
|
26
|
+
"clean": "rm -rf ./dist && tsc -b --clean"
|
|
27
|
+
}
|
|
28
|
+
}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { utils } from '@powersync/service-core';
|
|
2
|
+
import { expect } from 'vitest';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Reduce a bucket to the final state as stored on the client.
|
|
6
|
+
*
|
|
7
|
+
* This keeps the final state for each row as a PUT operation.
|
|
8
|
+
*
|
|
9
|
+
* All other operations are replaced with a single CLEAR operation,
|
|
10
|
+
* summing their checksums, and using a 0 as an op_id.
|
|
11
|
+
*
|
|
12
|
+
* This is the function $r(B)$, as described in /docs/bucket-properties.md.
|
|
13
|
+
*/
|
|
14
|
+
export function reduceBucket(operations: utils.OplogEntry[]) {
|
|
15
|
+
let rowState = new Map<string, utils.OplogEntry>();
|
|
16
|
+
let otherChecksum = 0;
|
|
17
|
+
|
|
18
|
+
for (let op of operations) {
|
|
19
|
+
const key = rowKey(op);
|
|
20
|
+
if (op.op == 'PUT') {
|
|
21
|
+
const existing = rowState.get(key);
|
|
22
|
+
if (existing) {
|
|
23
|
+
otherChecksum = utils.addChecksums(otherChecksum, existing.checksum as number);
|
|
24
|
+
}
|
|
25
|
+
rowState.set(key, op);
|
|
26
|
+
} else if (op.op == 'REMOVE') {
|
|
27
|
+
const existing = rowState.get(key);
|
|
28
|
+
if (existing) {
|
|
29
|
+
otherChecksum = utils.addChecksums(otherChecksum, existing.checksum as number);
|
|
30
|
+
}
|
|
31
|
+
rowState.delete(key);
|
|
32
|
+
otherChecksum = utils.addChecksums(otherChecksum, op.checksum as number);
|
|
33
|
+
} else if (op.op == 'CLEAR') {
|
|
34
|
+
rowState.clear();
|
|
35
|
+
otherChecksum = op.checksum as number;
|
|
36
|
+
} else if (op.op == 'MOVE') {
|
|
37
|
+
otherChecksum = utils.addChecksums(otherChecksum, op.checksum as number);
|
|
38
|
+
} else {
|
|
39
|
+
throw new Error(`Unknown operation ${op.op}`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const puts = [...rowState.values()].sort((a, b) => {
|
|
44
|
+
return Number(BigInt(a.op_id) - BigInt(b.op_id));
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
let finalState: utils.OplogEntry[] = [
|
|
48
|
+
// Special operation to indiciate the checksum remainder
|
|
49
|
+
{ op_id: '0', op: 'CLEAR', checksum: otherChecksum },
|
|
50
|
+
...puts
|
|
51
|
+
];
|
|
52
|
+
|
|
53
|
+
return finalState;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function rowKey(entry: utils.OplogEntry) {
|
|
57
|
+
return `${entry.object_type}/${entry.object_id}/${entry.subkey}`;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
import { OplogEntry } from '@/util/protocol-types.js';
|
|
62
|
+
import { reduceBucket } from '@/util/utils.js';
|
|
63
|
+
import { expect } from 'vitest';
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Validate this property, as described in /docs/bucket-properties.md:
|
|
67
|
+
*
|
|
68
|
+
* $r(B_{[..id_n]}) = r(r(B_{[..id_i]}) \cup B_{[id_{i+1}..id_n]}) \;\forall\; i \in [1..n]$
|
|
69
|
+
*
|
|
70
|
+
* We test that a client syncing the entire bucket in one go (left side of the equation),
|
|
71
|
+
* ends up with the same result as another client syncing up to operation id_i, then sync
|
|
72
|
+
* the rest.
|
|
73
|
+
*/
|
|
74
|
+
export function validateBucket(bucket: utils.OplogEntry[]) {
|
|
75
|
+
const r1 = reduceBucket(bucket);
|
|
76
|
+
for (let i = 0; i <= bucket.length; i++) {
|
|
77
|
+
const r2 = reduceBucket(bucket.slice(0, i + 1));
|
|
78
|
+
const b3 = bucket.slice(i + 1);
|
|
79
|
+
const r3 = r2.concat(b3);
|
|
80
|
+
const r4 = reduceBucket(r3);
|
|
81
|
+
expect(r4).toEqual(r1);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// This is the same check, just implemented differently
|
|
85
|
+
validateCompactedBucket(bucket, bucket);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Validate these properties for a bucket $B$ and its compacted version $B'$,:
|
|
90
|
+
* as described in /docs/bucket-properties.md:
|
|
91
|
+
*
|
|
92
|
+
* 1. $r(B) = r(B')$
|
|
93
|
+
* 2. $r(B_{[..c]}) = r(r(B_{[..c_i]}) \cup B'_{[c_i+1..c]}) \;\forall\; c_i \in B$
|
|
94
|
+
*
|
|
95
|
+
* The first one is that the result of syncing the original bucket is the same as
|
|
96
|
+
* syncing the compacted bucket.
|
|
97
|
+
*
|
|
98
|
+
* The second property is that result of syncing the entire original bucket, is the same
|
|
99
|
+
* as syncing any partial version of that (up to op $c_i$), and then continue syncing
|
|
100
|
+
* using the compacted bucket.
|
|
101
|
+
*/
|
|
102
|
+
export function validateCompactedBucket(bucket: utils.OplogEntry[], compacted: utils.OplogEntry[]) {
|
|
103
|
+
// r(B_{[..c]})
|
|
104
|
+
const r1 = reduceBucket(bucket);
|
|
105
|
+
// r(B) = r(B')
|
|
106
|
+
expect(reduceBucket(compacted)).toEqual(r1);
|
|
107
|
+
|
|
108
|
+
for (let i = 0; i < bucket.length; i++) {
|
|
109
|
+
// r(B_{[..c_i]})
|
|
110
|
+
const r2 = reduceBucket(bucket.slice(0, i + 1));
|
|
111
|
+
const c_i = BigInt(bucket[i].op_id);
|
|
112
|
+
// B'_{[c_i+1..c]}
|
|
113
|
+
const b3 = compacted.filter((op) => BigInt(op.op_id) > c_i);
|
|
114
|
+
// r(B_{[..c_i]}) \cup B'_{[c_i+1..c]}
|
|
115
|
+
const r3 = r2.concat(b3);
|
|
116
|
+
// r(r(B_{[..c_i]}) \cup B'_{[c_i+1..c]})
|
|
117
|
+
const r4 = reduceBucket(r3);
|
|
118
|
+
expect(r4).toEqual(r1);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { storage, utils } from '@powersync/service-core';
|
|
2
|
+
import { SqlSyncRules } from '@powersync/service-sync-rules';
|
|
3
|
+
import * as bson from 'bson';
|
|
4
|
+
|
|
5
|
+
export interface StorageOptions {
|
|
6
|
+
/**
|
|
7
|
+
* By default, collections are only cleared/
|
|
8
|
+
* Setting this to true will drop the collections completely.
|
|
9
|
+
*/
|
|
10
|
+
dropAll?: boolean;
|
|
11
|
+
|
|
12
|
+
doNotClear?: boolean;
|
|
13
|
+
}
|
|
14
|
+
export type StorageFactory = (options?: StorageOptions) => Promise<storage.BucketStorageFactory>;
|
|
15
|
+
|
|
16
|
+
export const ZERO_LSN = '0/0';
|
|
17
|
+
|
|
18
|
+
export const PARSE_OPTIONS: storage.ParseSyncRulesOptions = {
|
|
19
|
+
defaultSchema: 'public'
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
export const BATCH_OPTIONS: storage.StartBatchOptions = {
|
|
23
|
+
...PARSE_OPTIONS,
|
|
24
|
+
zeroLSN: ZERO_LSN,
|
|
25
|
+
storeCurrentData: true
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
export function testRules(content: string): storage.PersistedSyncRulesContent {
|
|
29
|
+
return {
|
|
30
|
+
id: 1,
|
|
31
|
+
sync_rules_content: content,
|
|
32
|
+
slot_name: 'test',
|
|
33
|
+
parsed(options) {
|
|
34
|
+
return {
|
|
35
|
+
id: 1,
|
|
36
|
+
sync_rules: SqlSyncRules.fromYaml(content, options),
|
|
37
|
+
slot_name: 'test'
|
|
38
|
+
};
|
|
39
|
+
},
|
|
40
|
+
lock() {
|
|
41
|
+
throw new Error('Not implemented');
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export function makeTestTable(name: string, columns?: string[] | undefined) {
|
|
47
|
+
const relId = utils.hashData('table', name, (columns ?? ['id']).join(','));
|
|
48
|
+
const id = new bson.ObjectId('6544e3899293153fa7b38331');
|
|
49
|
+
return new storage.SourceTable(
|
|
50
|
+
id,
|
|
51
|
+
storage.SourceTable.DEFAULT_TAG,
|
|
52
|
+
relId,
|
|
53
|
+
'public',
|
|
54
|
+
name,
|
|
55
|
+
(columns ?? ['id']).map((column) => ({ name: column, type: 'VARCHAR', typeId: 25 })),
|
|
56
|
+
true
|
|
57
|
+
);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export function getBatchData(
|
|
61
|
+
batch: utils.SyncBucketData[] | storage.SyncBucketDataBatch[] | storage.SyncBucketDataBatch
|
|
62
|
+
) {
|
|
63
|
+
const first = getFirst(batch);
|
|
64
|
+
if (first == null) {
|
|
65
|
+
return [];
|
|
66
|
+
}
|
|
67
|
+
return first.data.map((d) => {
|
|
68
|
+
return {
|
|
69
|
+
op_id: d.op_id,
|
|
70
|
+
op: d.op,
|
|
71
|
+
object_id: d.object_id,
|
|
72
|
+
checksum: d.checksum
|
|
73
|
+
};
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export function getBatchMeta(
|
|
78
|
+
batch: utils.SyncBucketData[] | storage.SyncBucketDataBatch[] | storage.SyncBucketDataBatch
|
|
79
|
+
) {
|
|
80
|
+
const first = getFirst(batch);
|
|
81
|
+
if (first == null) {
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
return {
|
|
85
|
+
has_more: first.has_more,
|
|
86
|
+
after: first.after,
|
|
87
|
+
next_after: first.next_after
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
function getFirst(
|
|
92
|
+
batch: utils.SyncBucketData[] | storage.SyncBucketDataBatch[] | storage.SyncBucketDataBatch
|
|
93
|
+
): utils.SyncBucketData | null {
|
|
94
|
+
if (!Array.isArray(batch)) {
|
|
95
|
+
return batch.batch;
|
|
96
|
+
}
|
|
97
|
+
if (batch.length == 0) {
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
let first = batch[0];
|
|
101
|
+
if ((first as storage.SyncBucketDataBatch).batch != null) {
|
|
102
|
+
return (first as storage.SyncBucketDataBatch).batch;
|
|
103
|
+
} else {
|
|
104
|
+
return first as utils.SyncBucketData;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Replica id in the old Postgres format, for backwards-compatible tests.
|
|
110
|
+
*/
|
|
111
|
+
export function rid(id: string): bson.UUID {
|
|
112
|
+
return utils.getUuidReplicaIdentityBson({ id: id }, [{ name: 'id', type: 'VARCHAR', typeId: 25 }]);
|
|
113
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { utils } from '@powersync/service-core';
|
|
2
|
+
import { JSONBig } from '@powersync/service-jsonbig';
|
|
3
|
+
|
|
4
|
+
export function putOp(table: string, data: Record<string, any>): Partial<utils.OplogEntry> {
|
|
5
|
+
return {
|
|
6
|
+
op: 'PUT',
|
|
7
|
+
object_type: table,
|
|
8
|
+
object_id: data.id,
|
|
9
|
+
data: JSONBig.stringify(data)
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export function removeOp(table: string, id: string): Partial<utils.OplogEntry> {
|
|
14
|
+
return {
|
|
15
|
+
op: 'REMOVE',
|
|
16
|
+
object_type: table,
|
|
17
|
+
object_id: id
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export function compareIds(a: utils.OplogEntry, b: utils.OplogEntry) {
|
|
22
|
+
return a.object_id!.localeCompare(b.object_id!);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export async function oneFromAsync<T>(source: Iterable<T> | AsyncIterable<T>): Promise<T> {
|
|
26
|
+
const items: T[] = [];
|
|
27
|
+
for await (const item of source) {
|
|
28
|
+
items.push(item);
|
|
29
|
+
}
|
|
30
|
+
if (items.length != 1) {
|
|
31
|
+
throw new Error(`One item expected, got: ${items.length}`);
|
|
32
|
+
}
|
|
33
|
+
return items[0];
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export async function fromAsync<T>(source: Iterable<T> | AsyncIterable<T>): Promise<T[]> {
|
|
37
|
+
const items: T[] = [];
|
|
38
|
+
for await (const item of source) {
|
|
39
|
+
items.push(item);
|
|
40
|
+
}
|
|
41
|
+
return items;
|
|
42
|
+
}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { OplogEntry } from '@powersync/service-core';
|
|
2
|
+
import { expect, test } from 'vitest';
|
|
3
|
+
import * as test_utils from '../test-utils/test-utils-index.js';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* This tests the reduceBucket function.
|
|
7
|
+
* While this function is not used directly in the service implementation,
|
|
8
|
+
* it is an important part of validating consistency in other tests.
|
|
9
|
+
* @example
|
|
10
|
+
* ```TypeScript
|
|
11
|
+
* describe('bucket validation', registerBucketValidationTests);
|
|
12
|
+
* ```
|
|
13
|
+
*/
|
|
14
|
+
export function registerBucketValidationTests() {
|
|
15
|
+
const ops1: OplogEntry[] = [
|
|
16
|
+
{
|
|
17
|
+
op_id: '1',
|
|
18
|
+
op: 'PUT',
|
|
19
|
+
object_type: 'test',
|
|
20
|
+
object_id: 't1',
|
|
21
|
+
checksum: 2634521662,
|
|
22
|
+
subkey: '6544e3899293153fa7b38331/117ab485-4b42-58a2-ab32-0053a22c3423',
|
|
23
|
+
data: '{"id":"t1"}'
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
op_id: '2',
|
|
27
|
+
op: 'PUT',
|
|
28
|
+
object_type: 'test',
|
|
29
|
+
object_id: 't2',
|
|
30
|
+
checksum: 4243212114,
|
|
31
|
+
subkey: '6544e3899293153fa7b38331/ec27c691-b47a-5d92-927a-9944feb89eee',
|
|
32
|
+
data: '{"id":"t2"}'
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
op_id: '3',
|
|
36
|
+
op: 'REMOVE',
|
|
37
|
+
object_type: 'test',
|
|
38
|
+
object_id: 't1',
|
|
39
|
+
checksum: 4228978084,
|
|
40
|
+
subkey: '6544e3899293153fa7b38331/117ab485-4b42-58a2-ab32-0053a22c3423',
|
|
41
|
+
data: null
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
op_id: '4',
|
|
45
|
+
op: 'PUT',
|
|
46
|
+
object_type: 'test',
|
|
47
|
+
object_id: 't2',
|
|
48
|
+
checksum: 4243212114,
|
|
49
|
+
subkey: '6544e3899293153fa7b38331/ec27c691-b47a-5d92-927a-9944feb89eee',
|
|
50
|
+
data: '{"id":"t2"}'
|
|
51
|
+
}
|
|
52
|
+
];
|
|
53
|
+
|
|
54
|
+
test('reduce 1', () => {
|
|
55
|
+
expect(test_utils.reduceBucket(ops1)).toEqual([
|
|
56
|
+
{
|
|
57
|
+
checksum: -1778190028,
|
|
58
|
+
op: 'CLEAR',
|
|
59
|
+
op_id: '0'
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
checksum: 4243212114,
|
|
63
|
+
data: '{"id":"t2"}',
|
|
64
|
+
object_id: 't2',
|
|
65
|
+
object_type: 'test',
|
|
66
|
+
op: 'PUT',
|
|
67
|
+
op_id: '4',
|
|
68
|
+
subkey: '6544e3899293153fa7b38331/ec27c691-b47a-5d92-927a-9944feb89eee'
|
|
69
|
+
}
|
|
70
|
+
]);
|
|
71
|
+
|
|
72
|
+
expect(test_utils.reduceBucket(test_utils.reduceBucket(ops1))).toEqual([
|
|
73
|
+
{
|
|
74
|
+
checksum: -1778190028,
|
|
75
|
+
op: 'CLEAR',
|
|
76
|
+
op_id: '0'
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
checksum: 4243212114,
|
|
80
|
+
data: '{"id":"t2"}',
|
|
81
|
+
object_id: 't2',
|
|
82
|
+
object_type: 'test',
|
|
83
|
+
op: 'PUT',
|
|
84
|
+
op_id: '4',
|
|
85
|
+
subkey: '6544e3899293153fa7b38331/ec27c691-b47a-5d92-927a-9944feb89eee'
|
|
86
|
+
}
|
|
87
|
+
]);
|
|
88
|
+
|
|
89
|
+
test_utils.validateBucket(ops1);
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
test('reduce 2', () => {
|
|
93
|
+
const bucket: OplogEntry[] = [
|
|
94
|
+
...ops1,
|
|
95
|
+
|
|
96
|
+
{
|
|
97
|
+
checksum: 93784613,
|
|
98
|
+
op: 'CLEAR',
|
|
99
|
+
op_id: '5'
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
checksum: 5133378,
|
|
103
|
+
data: '{"id":"t3"}',
|
|
104
|
+
object_id: 't3',
|
|
105
|
+
object_type: 'test',
|
|
106
|
+
op: 'PUT',
|
|
107
|
+
op_id: '11',
|
|
108
|
+
subkey: '6544e3899293153fa7b38333/ec27c691-b47a-5d92-927a-9944feb89eee'
|
|
109
|
+
}
|
|
110
|
+
];
|
|
111
|
+
|
|
112
|
+
expect(test_utils.reduceBucket(bucket)).toEqual([
|
|
113
|
+
{
|
|
114
|
+
checksum: 93784613,
|
|
115
|
+
op: 'CLEAR',
|
|
116
|
+
op_id: '0'
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
checksum: 5133378,
|
|
120
|
+
data: '{"id":"t3"}',
|
|
121
|
+
object_id: 't3',
|
|
122
|
+
object_type: 'test',
|
|
123
|
+
op: 'PUT',
|
|
124
|
+
op_id: '11',
|
|
125
|
+
subkey: '6544e3899293153fa7b38333/ec27c691-b47a-5d92-927a-9944feb89eee'
|
|
126
|
+
}
|
|
127
|
+
]);
|
|
128
|
+
|
|
129
|
+
expect(test_utils.reduceBucket(test_utils.reduceBucket(bucket))).toEqual([
|
|
130
|
+
{
|
|
131
|
+
checksum: 93784613,
|
|
132
|
+
op: 'CLEAR',
|
|
133
|
+
op_id: '0'
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
checksum: 5133378,
|
|
137
|
+
data: '{"id":"t3"}',
|
|
138
|
+
object_id: 't3',
|
|
139
|
+
object_type: 'test',
|
|
140
|
+
op: 'PUT',
|
|
141
|
+
op_id: '11',
|
|
142
|
+
subkey: '6544e3899293153fa7b38333/ec27c691-b47a-5d92-927a-9944feb89eee'
|
|
143
|
+
}
|
|
144
|
+
]);
|
|
145
|
+
|
|
146
|
+
test_utils.validateBucket(bucket);
|
|
147
|
+
});
|
|
148
|
+
}
|