@fireproof/core-test 0.23.1 → 0.23.3

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 (91) hide show
  1. package/blockstore/interceptor-gateway.test.js.map +1 -1
  2. package/blockstore/keyed-crypto-indexeddb-file.test.js.map +1 -1
  3. package/blockstore/keyed-crypto.test.js.map +1 -1
  4. package/blockstore/loader.test.js.map +1 -1
  5. package/blockstore/standalone.test.js.map +1 -1
  6. package/blockstore/store.test.js.map +1 -1
  7. package/blockstore/transaction.test.js.map +1 -1
  8. package/fireproof/all-gateway.test.js.map +1 -1
  9. package/fireproof/attachable.test.js.map +1 -1
  10. package/fireproof/cars/bafkreidxwt2nhvbl4fnqfw3ctlt6zbrir4kqwmjo5im6rf4q5si27kgo2i.js.map +1 -1
  11. package/fireproof/charwise-boolean.test.js.map +1 -1
  12. package/fireproof/compact-strategy.test.js.map +1 -1
  13. package/fireproof/concurrent.test.js.map +1 -1
  14. package/fireproof/crdt.test.js.map +1 -1
  15. package/fireproof/database.test.js.map +1 -1
  16. package/fireproof/deleted-docs-handling.test.js.map +1 -1
  17. package/fireproof/fireproof.test.fixture.js.map +1 -1
  18. package/fireproof/fireproof.test.js.map +1 -1
  19. package/fireproof/hello.test.js.map +1 -1
  20. package/fireproof/indexer.test.js.map +1 -1
  21. package/fireproof/multiple-ledger.test.js.map +1 -1
  22. package/fireproof/query-docs.test.js.map +1 -1
  23. package/fireproof/query-limit-issue.test.js.map +1 -1
  24. package/fireproof/query-property-inconsistency.test.js.map +1 -1
  25. package/fireproof/query-result-properties.test.js.map +1 -1
  26. package/fireproof/stable-cid.test.js.map +1 -1
  27. package/fireproof/utils.test.js.map +1 -1
  28. package/gateway/file/loader-config.test.js.map +1 -1
  29. package/gateway/indexeddb/create-db-on-write.test.js.map +1 -1
  30. package/gateway/indexeddb/loader-config.test.js.map +1 -1
  31. package/global-setup.js.map +1 -1
  32. package/helpers.js.map +1 -1
  33. package/package.json +18 -18
  34. package/protocols/cloud/msger.test.js.map +1 -1
  35. package/runtime/fp-envelope-serialize.test.js.map +1 -1
  36. package/runtime/key-bag.test.js.map +1 -1
  37. package/runtime/meta-key-hack.test.js.map +1 -1
  38. package/setup.file.js.map +1 -1
  39. package/setup.indexeddb.js.map +1 -1
  40. package/setup.memory.js.map +1 -1
  41. package/vitest.config.js.map +1 -1
  42. package/vitest.file.config.js.map +1 -1
  43. package/vitest.indexeddb.config.js.map +1 -1
  44. package/vitest.memory.config.js.map +1 -1
  45. package/blockstore/fp-envelope.test.ts-off +0 -65
  46. package/blockstore/fragment-gateway.test.ts-off +0 -106
  47. package/blockstore/interceptor-gateway.test.ts +0 -259
  48. package/blockstore/keyed-crypto-indexeddb-file.test.ts +0 -134
  49. package/blockstore/keyed-crypto.test.ts +0 -381
  50. package/blockstore/loader.test.ts +0 -313
  51. package/blockstore/standalone.test.ts +0 -156
  52. package/blockstore/store.test.ts +0 -199
  53. package/blockstore/transaction.test.ts +0 -132
  54. package/fireproof/all-gateway.test.ts +0 -477
  55. package/fireproof/attachable.test.ts +0 -677
  56. package/fireproof/cars/bafkreidxwt2nhvbl4fnqfw3ctlt6zbrir4kqwmjo5im6rf4q5si27kgo2i.car +0 -0
  57. package/fireproof/cars/bafkreidxwt2nhvbl4fnqfw3ctlt6zbrir4kqwmjo5im6rf4q5si27kgo2i.ts +0 -324
  58. package/fireproof/charwise-boolean.test.ts +0 -68
  59. package/fireproof/compact-strategy.test.ts +0 -40
  60. package/fireproof/concurrent.test.ts +0 -37
  61. package/fireproof/crdt.test.ts +0 -572
  62. package/fireproof/database.test.ts +0 -772
  63. package/fireproof/deleted-docs-handling.test.ts +0 -112
  64. package/fireproof/fireproof.test.fixture.ts +0 -133
  65. package/fireproof/fireproof.test.ts +0 -767
  66. package/fireproof/hello.test.ts +0 -75
  67. package/fireproof/indexer.test.ts +0 -459
  68. package/fireproof/multiple-ledger.test.ts +0 -67
  69. package/fireproof/query-docs.test.ts +0 -117
  70. package/fireproof/query-limit-issue.test.ts +0 -147
  71. package/fireproof/query-property-inconsistency.test.ts +0 -90
  72. package/fireproof/query-result-properties.test.ts +0 -43
  73. package/fireproof/stable-cid.test.ts +0 -72
  74. package/fireproof/utils.test.ts +0 -137
  75. package/gateway/file/loader-config.test.ts +0 -309
  76. package/gateway/indexeddb/create-db-on-write.test.ts +0 -202
  77. package/gateway/indexeddb/loader-config.test.ts +0 -80
  78. package/global-setup.ts +0 -11
  79. package/helpers.ts +0 -177
  80. package/protocols/cloud/msger.test.ts +0 -559
  81. package/runtime/fp-envelope-serialize.test.ts +0 -266
  82. package/runtime/key-bag.test.ts +0 -243
  83. package/runtime/meta-key-hack.test.ts +0 -103
  84. package/setup.file.ts +0 -1
  85. package/setup.indexeddb.ts +0 -0
  86. package/setup.memory.ts +0 -2
  87. package/tsconfig.json +0 -18
  88. package/vitest.config.ts +0 -8
  89. package/vitest.file.config.ts +0 -11
  90. package/vitest.indexeddb.config.ts +0 -34
  91. package/vitest.memory.config.ts +0 -24
@@ -1,767 +0,0 @@
1
- import { storageURL } from "../helpers.js";
2
- import { docs } from "./fireproof.test.fixture.js";
3
- import { CID } from "multiformats/cid";
4
-
5
- import { Index, index, fireproof, isDatabase } from "@fireproof/core-base";
6
- import { URI } from "@adviser/cement";
7
- import { ensureSuperThis, sleep } from "@fireproof/core-runtime";
8
- import { DocResponse, DocWithId, IndexRows, Database, PARAM, MapFn, ConfigOpts } from "@fireproof/core-types-base";
9
- import { describe, afterEach, beforeEach, it, expect, beforeAll, assert } from "vitest";
10
- import { AnyLink } from "@fireproof/core-types-blockstore";
11
- import { getDefaultURI, EncryptedBlockstore } from "@fireproof/core-blockstore";
12
-
13
- export function carLogIncludesGroup(list: AnyLink[], cid: CID) {
14
- return list.some((c) => c.equals(cid));
15
- }
16
-
17
- interface FooType {
18
- readonly foo: string;
19
- }
20
-
21
- interface FireType {
22
- readonly fire: string;
23
- }
24
-
25
- describe("dreamcode", function () {
26
- interface Doc {
27
- text: string;
28
- dream: boolean;
29
- }
30
- let ok: DocResponse;
31
- let doc: DocWithId<Doc>;
32
- let result: IndexRows<Doc, string>;
33
- let db: Database;
34
- const sthis = ensureSuperThis();
35
- afterEach(async () => {
36
- await db.close();
37
- await db.destroy();
38
- });
39
- beforeEach(async () => {
40
- await sthis.start();
41
- db = fireproof("test-db");
42
- ok = await db.put({ _id: "test-1", text: "fireproof", dream: true });
43
- doc = await db.get(ok.id);
44
- result = await db.query("text", { range: ["a", "z"] });
45
- });
46
- it("should put", function () {
47
- expect(ok).toBeTruthy();
48
- expect(ok.id).toBe("test-1");
49
- });
50
- it("should get", function () {
51
- expect(doc.text).toBe("fireproof");
52
- });
53
- it("should query", function () {
54
- expect(result).toBeTruthy();
55
- expect(result.rows).toBeTruthy();
56
- expect(result.rows.length).toBe(1);
57
- expect(result.rows[0].key).toBe("fireproof");
58
- });
59
- it("should query with function", async () => {
60
- const result = await db.query<Doc, boolean>((doc) => doc.dream);
61
- expect(result).toBeTruthy();
62
- expect(result.rows).toBeTruthy();
63
- expect(result.rows.length).toBe(1);
64
- expect(result.rows[0].key).toBe(true);
65
- });
66
- });
67
-
68
- describe("public API", function () {
69
- interface Doc {
70
- foo: string;
71
- }
72
- let db: Database;
73
- let ok: DocResponse;
74
- let doc: DocWithId<Doc>;
75
- let query: IndexRows<Doc, string>;
76
- const sthis = ensureSuperThis();
77
-
78
- afterEach(async () => {
79
- await db.close();
80
- await db.destroy();
81
- });
82
-
83
- beforeEach(async () => {
84
- await sthis.start();
85
- db = fireproof("test-api");
86
- // index = index(db, 'test-index', (doc) => doc.foo)
87
- ok = await db.put({ _id: "test", foo: "bar" });
88
- doc = await db.get("test");
89
- query = await db.query<Doc, string>((doc) => doc.foo);
90
- });
91
- it("should be a ledger instance", function () {
92
- expect(db).toBeTruthy();
93
- expect(isDatabase(db)).toBeTruthy();
94
- });
95
- it("should put", function () {
96
- expect(ok).toBeTruthy();
97
- expect(ok.id).toBe("test");
98
- });
99
- it("should get", function () {
100
- expect(doc.foo).toBe("bar");
101
- });
102
- it("should query", function () {
103
- expect(query).toBeTruthy();
104
- expect(query.rows).toBeTruthy();
105
- expect(query.rows.length).toBe(1);
106
- expect(query.rows[0].key).toBe("bar");
107
- });
108
- });
109
-
110
- describe("database fullconfig", () => {
111
- const sthis = ensureSuperThis();
112
- it("have the right name", async () => {
113
- let protocol: string | undefined;
114
- const url = sthis.env.get("FP_STORAGE_URL");
115
- let path = "";
116
- if (url) {
117
- const uri = URI.from(url);
118
- protocol = uri.protocol;
119
- path = uri.pathname;
120
- }
121
- const base = getDefaultURI(sthis, protocol).build().appendRelative(path).URI();
122
- const db = fireproof("my-funky-name", {
123
- storeUrls: {
124
- base: base,
125
- // meta: `${base}/meta?taste=${taste}`,
126
- data: {
127
- meta: base.build().appendRelative("funky/meta"),
128
- car: base.build().appendRelative("funky/data"),
129
- wal: base.build().appendRelative("funky/wal"),
130
- },
131
- idx: {
132
- meta: base.build().appendRelative("funky/idx-meta"),
133
- car: base.build().appendRelative("funky/idx-data"),
134
- wal: base.build().appendRelative("funky/idx-wal"),
135
- },
136
- // wal: `${base}/wal?taste=${taste}`,
137
- },
138
- });
139
- await db.ready();
140
-
141
- const carStore = await db.ledger.crdt.blockstore.loader.attachedStores.local().active.car;
142
- expect(carStore.url().getParam(PARAM.NAME)).toBe("my-funky-name");
143
- const metaStore = await db.ledger.crdt.blockstore.loader.attachedStores.local().active.meta;
144
- expect(metaStore.url().getParam(PARAM.NAME)).toBe("my-funky-name");
145
- const walStore = await db.ledger.crdt.blockstore.loader.attachedStores.local().active.wal;
146
- expect(walStore.url().getParam(PARAM.NAME)).toBe("my-funky-name");
147
-
148
- expect(db).toBeTruthy();
149
- expect(db.name).toBe("my-funky-name");
150
- await db.put({ _id: "test", foo: "bar" });
151
- expect(db.name).toBe("my-funky-name");
152
- });
153
- });
154
-
155
- describe("basic ledger", function () {
156
- interface Doc {
157
- foo: string;
158
- }
159
- let db: Database;
160
- const sthis = ensureSuperThis();
161
- afterEach(async () => {
162
- await db.close();
163
- await db.destroy();
164
- });
165
- beforeEach(async () => {
166
- await sthis.start();
167
- db = fireproof("test-basic");
168
- });
169
- it("can put with id", async () => {
170
- const ok = await db.put({ _id: "test", foo: "bar" });
171
- expect(ok).toBeTruthy();
172
- expect(ok.id).toBe("test");
173
- });
174
- it("can put without id", async () => {
175
- const ok = await db.put({ foo: "bam" });
176
- expect(ok).toBeTruthy();
177
- const got = await db.get<Doc>(ok.id);
178
- expect(got.foo).toBe("bam");
179
- });
180
- it("can bulk an array", async () => {
181
- const ok = await db.bulk([{ foo: "cool" }, { foo: "dude" }]);
182
- expect(ok).toBeTruthy();
183
- expect(ok.ids.length).toBe(2);
184
- const got = await db.get<Doc>(ok.ids[0]);
185
- expect(got.foo).toBe("cool");
186
- const got2 = await db.get<Doc>(ok.ids[1]);
187
- expect(got2.foo).toBe("dude");
188
- });
189
- it("can define an index", async () => {
190
- const ok = await db.put({ _id: "test", foo: "bar" });
191
- expect(ok).toBeTruthy();
192
- const idx = index<{ foo: string }, string>(db, "test-index", (doc) => doc.foo);
193
- const result = await idx.query();
194
- expect(result).toBeTruthy();
195
- expect(result.rows).toBeTruthy();
196
- expect(result.rows.length).toBe(1);
197
- expect(result.rows[0].key).toBe("bar");
198
- });
199
- it("can define an index with a default function", async () => {
200
- const ok = await db.put({ _id: "test", foo: "bar" });
201
- expect(ok).toBeTruthy();
202
- const idx = index(db, "foo");
203
- const result = await idx.query();
204
- expect(result).toBeTruthy();
205
- expect(result.rows).toBeTruthy();
206
- expect(result.rows.length).toBe(1);
207
- expect(result.rows[0].key).toBe("bar");
208
- });
209
- it("should query with multiple successive functions", async () => {
210
- interface TestDoc {
211
- _id: string;
212
- foo: string;
213
- baz: string;
214
- }
215
- await db.put<TestDoc>({ _id: "test", foo: "bar", baz: "qux" });
216
- const query1 = await db.query<TestDoc, string>((doc) => {
217
- return doc.foo;
218
- });
219
- const query2 = await db.query<TestDoc, string>((doc) => {
220
- return doc.baz;
221
- });
222
- expect(query1).toBeTruthy();
223
- expect(query1.rows).toBeTruthy();
224
- expect(query1.rows.length).toBe(1);
225
- expect(query2).toBeTruthy();
226
- expect(query2.rows).toBeTruthy();
227
- expect(query2.rows.length).toBe(1);
228
- });
229
- });
230
-
231
- describe("benchmarking with compaction", function () {
232
- let db: Database;
233
- const sthis = ensureSuperThis();
234
- afterEach(async () => {
235
- await db.close();
236
- await db.destroy();
237
- });
238
- beforeEach(async () => {
239
- // erase the existing test data
240
- await sthis.start();
241
- db = fireproof("test-benchmark-compaction", { autoCompact: 3 });
242
- });
243
- it.skip("insert during compaction", async () => {
244
- const ok = await db.put({ _id: "test", foo: "fast" });
245
- expect(ok).toBeTruthy();
246
- expect(ok.id).toBe("test");
247
- expect(db.ledger.crdt.clock.head).toBeTruthy();
248
- expect(db.ledger.crdt.clock.head.length).toBe(1);
249
-
250
- const numDocs = 20;
251
- const batchSize = 5;
252
-
253
- const doing = null;
254
- for (let i = 0; i < numDocs; i += batchSize) {
255
- // console.log("batch", i, db.blockstore.loader?.carLog.length);
256
- const ops: Promise<DocResponse>[] = [];
257
- db.put({ foo: "fast" });
258
- // await doing
259
- // doing = db.compact()
260
- db.put({ foo: "fast" });
261
- for (let j = 0; j < batchSize && i + j < numDocs; j++) {
262
- ops.push(
263
- db.put({
264
- data: Math.random(),
265
- fire: Math.random().toString().repeat(25),
266
- }),
267
- );
268
- }
269
- const blocks = db.ledger.crdt.blockstore as EncryptedBlockstore;
270
- const loader = blocks.loader;
271
- expect(loader).toBeTruthy();
272
-
273
- db.put({
274
- data: Math.random(),
275
- fire: Math.random().toString().repeat(25),
276
- });
277
-
278
- await Promise.all(ops);
279
- // console.log("batch done", i, db.blockstore.loader?.carLog.length);
280
- }
281
- await doing;
282
- });
283
- });
284
-
285
- describe("benchmarking a ledger", function () {
286
- let db: Database;
287
- const sthis = ensureSuperThis();
288
- afterEach(async () => {
289
- await db.close();
290
- await db.destroy();
291
- });
292
- beforeEach(async () => {
293
- await sthis.start();
294
- // erase the existing test data
295
- db = fireproof("test-benchmark", { autoCompact: 100000, public: true });
296
- // db = fireproof(null, {autoCompact: 100000})
297
- });
298
-
299
- // run benchmarking tests
300
- // remove skip below
301
- // run:
302
- // npm test -- --grep 'insert and read many records'
303
- //
304
- it.skip("passing: insert and read many records", async () => {
305
- const ok = await db.put({ _id: "test", foo: "fast" });
306
- expect(ok).toBeTruthy();
307
- expect(ok.id).toBe("test");
308
-
309
- expect(db.ledger.crdt.clock.head).toBeTruthy();
310
- expect(db.ledger.crdt.clock.head.length).toBe(1);
311
-
312
- const numDocs = 2500;
313
- const batchSize = 500;
314
- // console.time(`insert and read ${numDocs} records`);
315
-
316
- for (let i = 0; i < numDocs; i += batchSize) {
317
- const ops: Promise<DocResponse>[] = [];
318
- for (let j = 0; j < batchSize && i + j < numDocs; j++) {
319
- ops.push(
320
- db
321
- .put({
322
- _id: `test${i + j}`,
323
- fire: Math.random()
324
- .toString()
325
- .repeat(25 * 1024),
326
- })
327
- .then((ok) => {
328
- db.get<{ fire: string }>(`test${i + j}`).then((doc) => {
329
- expect(doc.fire).toBeTruthy();
330
- });
331
- return ok;
332
- }),
333
- );
334
- }
335
- await Promise.all(ops);
336
- }
337
-
338
- // console.timeEnd(`insert and read ${numDocs} records`);
339
-
340
- // console.time('allDocs')
341
- // const allDocsResult2 = await db.allDocs()
342
- // console.timeEnd('allDocs')
343
- // equals(allDocsResult2.rows.length, numDocs+1)
344
-
345
- // console.time("open new DB");
346
- const newDb = fireproof("test-benchmark", { autoCompact: 100000, public: true });
347
- const doc = await newDb.get<{ foo: string }>("test");
348
- expect(doc.foo).toBe("fast");
349
- // console.timeEnd("open new DB");
350
-
351
- // console.time("changes");
352
- const result = await db.changes(); // takes 1.5 seconds (doesn't have to load blocks from cars)
353
- // console.timeEnd("changes");
354
- expect(result.rows.length).toBe(numDocs + 1);
355
-
356
- // this takes 1 minute w 1000 docs
357
- // console.time("changes new DB");
358
- const result2 = await newDb.changes();
359
- // console.timeEnd("changes new DB");
360
- expect(result2.rows.length).toBe(numDocs + 1);
361
-
362
- await sleep(1000);
363
-
364
- // console.time("COMPACT");
365
- await db.compact();
366
- // console.timeEnd("COMPACT");
367
-
368
- // todo compaction should not need this write to show in the new db
369
- await db.put({ _id: "compacted-test", foo: "bar" });
370
-
371
- // console.log('car log length', db._crdt.blockstore.loader.carLog.length)
372
- const blocks = db.ledger.crdt.blockstore as EncryptedBlockstore;
373
- const loader = blocks.loader;
374
- expect(loader).toBeTruthy();
375
- expect(loader.carLog.length).toBe(2);
376
-
377
- // console.time('allDocs new DB') // takes forever on 5k
378
- // const allDocsResult = await newDb.allDocs()
379
- // console.timeEnd('allDocs new DB')
380
- // equals(allDocsResult.rows.length, numDocs+1)
381
- await sleep(100);
382
-
383
- // console.time("compacted reopen again");
384
- const newDb2 = fireproof("test-benchmark", { autoCompact: 100000, public: true });
385
- const doc21 = await newDb2.get<FooType>("test");
386
- expect(doc21.foo).toBe("fast");
387
- const blocks2 = newDb2.ledger.crdt.blockstore as EncryptedBlockstore;
388
- const loader2 = blocks2.loader;
389
- expect(loader2).toBeTruthy();
390
-
391
- expect(loader2.carLog.length).toBe(2);
392
-
393
- const doc2 = await newDb2.get<FooType>("compacted-test");
394
-
395
- expect(doc2.foo).toBe("bar");
396
-
397
- expect(doc2.foo).toBe("bar");
398
- // console.timeEnd("compacted reopen again");
399
-
400
- await sleep(100);
401
-
402
- // console.time("compacted changes new DB2");
403
- const result3 = await newDb2.changes();
404
- // console.timeEnd("compacted changes new DB2");
405
- expect(result3.rows.length).toBe(numDocs + 2);
406
-
407
- // console.time("compacted newDb2 insert and read 100 records");
408
- const ops2: Promise<void>[] = [];
409
- for (let i = 0; i < 100; i++) {
410
- const ok = newDb2
411
- .put({
412
- _id: `test${i}`,
413
- fire: Math.random()
414
- .toString()
415
- .repeat(25 * 1024),
416
- })
417
- .then(() => {
418
- newDb2.get<{ fire: number }>(`test${i}`).then((doc) => {
419
- expect(doc.fire).toBeTruthy();
420
- });
421
- });
422
- ops2.push(ok);
423
- }
424
- await Promise.all(ops2);
425
- // console.timeEnd("compacted newDb2 insert and read 100 records");
426
-
427
- // triggers OOM on my machine
428
- // await sleep(100)
429
- // console.time('compacted allDocs new DB2')
430
- // const allDocsResult3 = await newDb2.allDocs()
431
- // console.timeEnd('compacted allDocs new DB2')
432
- // equals(allDocsResult3.rows.length, numDocs+2)
433
- }, 20000000);
434
- });
435
-
436
- describe("Reopening a ledger", function () {
437
- interface Doc {
438
- foo: string;
439
- }
440
- let db: Database;
441
- const sthis = ensureSuperThis();
442
- afterEach(async () => {
443
- await db.close();
444
- await db.destroy();
445
- });
446
- beforeEach(async () => {
447
- // erase the existing test data
448
- await sthis.start();
449
-
450
- db = fireproof("test-reopen", { autoCompact: 100000 });
451
- const ok = await db.put({ _id: "test", foo: "bar" });
452
- expect(ok).toBeTruthy();
453
- expect(ok.id).toBe("test");
454
-
455
- expect(db.ledger.crdt.clock.head).toBeDefined();
456
- expect(db.ledger.crdt.clock.head.length).toBe(1);
457
- });
458
-
459
- it("should persist data", async () => {
460
- const doc = await db.get<Doc>("test");
461
- expect(doc.foo).toBe("bar");
462
- });
463
-
464
- it("should have the same data on reopen", async () => {
465
- const db2 = fireproof("test-reopen");
466
- const doc = await db2.get<FooType>("test");
467
- expect(doc.foo).toBe("bar");
468
- expect(db2.ledger.crdt.clock.head).toBeDefined();
469
- expect(db2.ledger.crdt.clock.head.length).toBe(1);
470
- expect(db2.ledger.crdt.clock.head).toEqual(db.ledger.crdt.clock.head);
471
- await db2.close();
472
- });
473
-
474
- it("should have a car in the car log", async () => {
475
- await db.ledger.crdt.ready();
476
- const blocks = db.ledger.crdt.blockstore as EncryptedBlockstore;
477
- const loader = blocks.loader;
478
- expect(loader).toBeDefined();
479
- expect(loader.carLog).toBeDefined();
480
- expect(loader.carLog.length).toBe(1 + 1 /* genesis */);
481
- });
482
-
483
- it("should have carlog after reopen", async () => {
484
- const db2 = fireproof("test-reopen");
485
- await db2.ledger.crdt.ready();
486
- const blocks = db2.ledger.crdt.blockstore as EncryptedBlockstore;
487
- const loader = blocks.loader;
488
- expect(loader).toBeDefined();
489
- expect(loader.carLog).toBeDefined();
490
- expect(loader.carLog.length).toBe(1 + 1 /* genesis */);
491
- await db2.close();
492
- });
493
-
494
- it("faster, should have the same data on reopen after reopen and update", async () => {
495
- for (let i = 0; i < 4; i++) {
496
- // console.log('iteration', i)
497
- const db = fireproof("test-reopen");
498
- // assert(db._crdt.xready());
499
- await db.ready();
500
- const blocks = db.ledger.crdt.blockstore as EncryptedBlockstore;
501
- const loader = blocks.loader;
502
- expect(loader.carLog.length).toBe(i + 1 + 1 /* genesis */);
503
- const ok = await db.put({ _id: `test${i}`, fire: "proof".repeat(50 * 1024) });
504
- expect(ok).toBeTruthy();
505
- expect(loader.carLog.length).toBe(i + 2 + 1 /* genesis */);
506
- const doc = await db.get<FireType>(`test${i}`);
507
- expect(doc.fire).toBe("proof".repeat(50 * 1024));
508
- await db.close();
509
- }
510
- }, 20000);
511
-
512
- it.skip("passing slow, should have the same data on reopen after reopen and update", async () => {
513
- for (let i = 0; i < 200; i++) {
514
- // console.log("iteration", i);
515
- // console.time("db open");
516
- const db = fireproof("test-reopen", { autoCompact: 1000 }); // try with 10
517
- // assert(db._crdt.ready);
518
- await db.ready();
519
- // console.timeEnd("db open");
520
- const blocks = db.ledger.crdt.blockstore as EncryptedBlockstore;
521
- const loader = blocks.loader;
522
- expect(loader).toBeDefined();
523
- expect(loader.carLog.length).toBe(i + 1);
524
- // console.log('car log length', loader.carLog.length)
525
- // console.time("db put");
526
- const ok = await db.put({ _id: `test${i}`, fire: "proof".repeat(50 * 1024) });
527
- // console.timeEnd("db put");
528
- expect(ok).toBeTruthy();
529
- expect(loader.carLog.length).toBe(i + 2);
530
- // console.time("db get");
531
- const doc = await db.get<FireType>(`test${i}`);
532
- // console.timeEnd("db get");
533
- expect(doc.fire).toBe("proof".repeat(50 * 1024));
534
- }
535
- }, 200000);
536
- });
537
-
538
- describe("Reopening a ledger with indexes", function () {
539
- interface Doc {
540
- foo: string;
541
- }
542
- let db: Database;
543
- let idx: Index<Doc, string>;
544
- let didMap: boolean;
545
- let mapFn: MapFn<Doc>;
546
- const sthis = ensureSuperThis();
547
- afterEach(async () => {
548
- await db.close();
549
- await db.destroy();
550
- });
551
- beforeEach(async () => {
552
- await sthis.start();
553
- db = fireproof("test-reopen-idx");
554
- const ok = await db.put({ _id: "test", foo: "bar" });
555
- expect(ok.id).toBe("test");
556
-
557
- didMap = false;
558
-
559
- mapFn = (doc: Doc) => {
560
- didMap = true;
561
- return doc.foo;
562
- };
563
- idx = index<Doc, string>(db, "foo", mapFn);
564
- });
565
-
566
- it("should persist data", async () => {
567
- const doc = await db.get<Doc>("test");
568
- expect(doc.foo).toBe("bar");
569
- const idx2 = index<Doc, string>(db, "foo");
570
- expect(idx2).toBe(idx);
571
- const result = await idx2.query();
572
- expect(result).toBeTruthy();
573
- expect(result.rows).toBeTruthy();
574
- expect(result.rows.length).toBe(1);
575
- expect(result.rows[0].key).toBe("bar");
576
- expect(didMap).toBeTruthy();
577
- });
578
-
579
- it("should reuse the index", async () => {
580
- const idx2 = index(db, "foo", mapFn);
581
- expect(idx2).toBe(idx);
582
- const result = await idx2.query();
583
- expect(result).toBeTruthy();
584
- expect(result.rows).toBeTruthy();
585
- expect(result.rows.length).toBe(1);
586
- expect(result.rows[0].key).toBe("bar");
587
- expect(didMap).toBeTruthy();
588
- didMap = false;
589
- const r2 = await idx2.query();
590
- expect(r2).toBeTruthy();
591
- expect(r2.rows).toBeTruthy();
592
- expect(r2.rows.length).toBe(1);
593
- expect(r2.rows[0].key).toBe("bar");
594
- expect(didMap).toBeFalsy();
595
- });
596
-
597
- it("should have the same data on reopen", async () => {
598
- const db2 = fireproof("test-reopen-idx");
599
- const doc = await db2.get<FooType>("test");
600
- expect(doc.foo).toBe("bar");
601
- expect(db2.ledger.crdt.clock.head).toBeTruthy();
602
- expect(db2.ledger.crdt.clock.head.length).toBe(1);
603
- expect(db2.ledger.crdt.clock.head).toEqual(db.ledger.crdt.clock.head);
604
- });
605
-
606
- it("should have the same data on reopen after a query", async () => {
607
- const r0 = await idx.query();
608
- expect(r0).toBeTruthy();
609
- expect(r0.rows).toBeTruthy();
610
- expect(r0.rows.length).toBe(1);
611
- expect(r0.rows[0].key).toBe("bar");
612
-
613
- const db2 = fireproof("test-reopen-idx");
614
- const doc = await db2.get<FooType>("test");
615
- expect(doc.foo).toBe("bar");
616
- expect(db2.ledger.crdt.clock.head).toBeTruthy();
617
- expect(db2.ledger.crdt.clock.head.length).toBe(1);
618
- expect(db2.ledger.crdt.clock.head).toEqual(db.ledger.crdt.clock.head);
619
- });
620
-
621
- // it('should query the same data on reopen', async () =>{
622
- // const r0 = await idx.query()
623
- // assert(r0)
624
- // assert(r0.rows)
625
- // equals(r0.rows.length, 1)
626
- // equals(r0.rows[0].key, 'bar')
627
-
628
- // const db2 = fireproof('test-reopen-idx')
629
- // const d2 = await db2.get('test')
630
- // equals(d2.foo, 'bar')
631
- // didMap = false
632
- // const idx3 = db2.index('foo', mapFn)
633
- // const result = await idx3.query()
634
- // assert(result)
635
- // assert(result.rows)
636
- // equals(result.rows.length, 1)
637
- // equals(result.rows[0].key, 'bar')
638
- // assert(!didMap)
639
- // })
640
- });
641
-
642
- describe("basic js verify", function () {
643
- const sthis = ensureSuperThis();
644
- beforeAll(async () => {
645
- await sthis.start();
646
- });
647
- it("should include cids in arrays", async () => {
648
- const db = fireproof("test-verify");
649
- const ok = await db.put({ _id: "test", foo: ["bar", "bam"] });
650
- expect(ok.id).toBe("test");
651
- const ok2 = await db.put({ _id: "test2", foo: ["bar", "bam"] });
652
- expect(ok2.id).toBe("test2");
653
- const blocks = db.ledger.crdt.blockstore as EncryptedBlockstore;
654
- const loader = blocks.loader;
655
- expect(loader).toBeTruthy();
656
- const cid = loader.carLog.asArray()[0][0];
657
- const cid2 = db.ledger.crdt.clock.head[0];
658
- expect(cid).not.toBe(cid2);
659
- expect(cid).not.toBe(cid2);
660
- const cidList = [cid, cid2];
661
- const cid3 = CID.parse(cid.toString());
662
- expect(cidList.includes(cid3)).toBeFalsy(); // sad trombone
663
- expect(carLogIncludesGroup(cidList, cid3)).toBeTruthy();
664
- await db.close();
665
- await db.destroy();
666
- });
667
- });
668
-
669
- describe("same workload twice, same CID", function () {
670
- let dbA: Database;
671
- let dbB: Database;
672
- let headA: string;
673
- let headB: string;
674
-
675
- const sthis = ensureSuperThis();
676
- // let configA: any;
677
- // let configB: any;
678
-
679
- const configA: ConfigOpts = {
680
- storeUrls: {
681
- base: storageURL(sthis).build().setParam("storekey", "@test@"),
682
- },
683
- };
684
-
685
- const configB: ConfigOpts = {
686
- storeUrls: {
687
- base: storageURL(sthis).build().setParam("storekey", "@test@"),
688
- },
689
- };
690
-
691
- afterEach(async () => {
692
- await dbA.close();
693
- await dbA.destroy();
694
- await dbB.close();
695
- await dbB.destroy();
696
- });
697
- beforeEach(async () => {
698
- let ok: DocResponse;
699
- await sthis.start();
700
- // todo this fails because the test setup doesn't properly configure both ledgers to use the same key
701
- dbA = fireproof("test-dual-workload-a", configA);
702
- await dbA.destroy();
703
- for (const doc of docs) {
704
- ok = await dbA.put(doc);
705
- expect(ok).toBeTruthy();
706
- expect(ok.id).toBeTruthy();
707
- }
708
- headA = dbA.ledger.crdt.clock.head.toString();
709
-
710
- // todo this fails because the test setup doesn't properly configure both ledgers to use the same key
711
- dbB = fireproof("test-dual-workload-b", configB);
712
- await dbA.destroy();
713
- for (const doc of docs) {
714
- ok = await dbB.put(doc);
715
- expect(ok).toBeTruthy();
716
- expect(ok.id).toBeTruthy();
717
- }
718
- headB = dbB.ledger.crdt.clock.head.toString();
719
- });
720
- it("should have head A and B", async () => {
721
- expect(headA).toBeTruthy();
722
- expect(headB).toBeTruthy();
723
- expect(headA).toEqual(headB);
724
- expect(headA.length).toBeGreaterThan(10);
725
- });
726
- it("should have same car log", async () => {
727
- const logA = dbA.ledger.crdt.blockstore.loader?.carLog;
728
- expect(logA).toBeTruthy();
729
- assert(logA);
730
- expect(logA.length).toBe(docs.length + 1 /*genesis*/);
731
-
732
- const logB = dbB.ledger.crdt.blockstore.loader?.carLog;
733
- expect(logB).toBeTruthy();
734
- assert(logB);
735
- expect(logB.length).toBe(docs.length + 1 /*genesis*/);
736
-
737
- const logA2 = logA.asArray().map((c) => c.toString());
738
- const logB2 = logB.asArray().map((c) => c.toString());
739
-
740
- expect(logA2.length).toBe(logB2.length);
741
-
742
- // todo this fails because the test setup doesn't properly configure both ledgers to use the same key
743
- // expect(logA2).toEqual(logB2);
744
- });
745
- it("should have same car log after compact", async () => {
746
- await dbA.compact();
747
- await dbB.compact();
748
-
749
- const cmpLogA = dbA.ledger.crdt.blockstore.loader?.carLog;
750
- expect(cmpLogA).toBeTruthy();
751
- assert(cmpLogA);
752
- expect(cmpLogA.length).toBe(1);
753
-
754
- const cmpLogB = dbB.ledger.crdt.blockstore.loader?.carLog;
755
- expect(cmpLogB).toBeTruthy();
756
- assert(cmpLogB);
757
- expect(cmpLogB.length).toBe(1);
758
-
759
- const cmpLogA2 = cmpLogA.asArray().map((c) => c.toString());
760
- const cmpLogB2 = cmpLogB.asArray().map((c) => c.toString());
761
-
762
- expect(cmpLogA2.length).toBe(cmpLogB2.length);
763
-
764
- // todo this fails because the test setup doesn't properly configure both ledgers to use the same key
765
- // expect(cmpLogA2).toEqual(cmpLogB2);
766
- });
767
- });