braid-blob 0.0.16 → 0.0.17

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/test/tests.js ADDED
@@ -0,0 +1,701 @@
1
+ // Shared test definitions that work in both Node.js and browser environments
2
+ // This file exports a function that takes a test runner and braid_fetch implementation
3
+
4
+ function defineTests(runTest, braid_fetch) {
5
+
6
+ runTest(
7
+ "test that peer.txt gets initialized on a fresh run",
8
+ async () => {
9
+ var r1 = await braid_fetch(`/eval`, {
10
+ method: 'POST',
11
+ body: `void (async () => {
12
+ var test_id = 'test-db-' + Math.random().toString(36).slice(2)
13
+
14
+ var new_bb = braid_blob.create_braid_blob()
15
+ new_bb.db_folder = __dirname + '/' + test_id + '-db'
16
+ new_bb.meta_folder = __dirname + '/' + test_id + '-meta'
17
+
18
+ try {
19
+ await new_bb.serve({}, {})
20
+ } catch (e) {}
21
+
22
+ await require('fs').promises.rm(new_bb.db_folder,
23
+ { recursive: true, force: true })
24
+ await require('fs').promises.rm(new_bb.meta_folder,
25
+ { recursive: true, force: true })
26
+
27
+ res.end(new_bb.peer)
28
+
29
+ })()`
30
+ })
31
+ return '' + ((await r1.text()).length > 5)
32
+ },
33
+ 'true'
34
+ )
35
+
36
+ runTest(
37
+ "test that peer is same the second time we run from same db folder",
38
+ async () => {
39
+ var r1 = await braid_fetch(`/eval`, {
40
+ method: 'POST',
41
+ body: `void (async () => {
42
+ var test_id = 'test-db-' + Math.random().toString(36).slice(2)
43
+ var db = __dirname + '/' + test_id + '-db'
44
+ var meta = __dirname + '/' + test_id + '-meta'
45
+
46
+ var bb1 = braid_blob.create_braid_blob()
47
+ bb1.db_folder = db
48
+ bb1.meta_folder = meta
49
+
50
+ try {
51
+ await bb1.serve({}, {})
52
+ } catch (e) {}
53
+
54
+ var bb2 = braid_blob.create_braid_blob()
55
+ bb2.db_folder = db
56
+ bb2.meta_folder = meta
57
+
58
+ try {
59
+ await bb2.serve({}, {})
60
+ } catch (e) {}
61
+
62
+ await require('fs').promises.rm(db, { recursive: true, force: true })
63
+ await require('fs').promises.rm(meta, { recursive: true, force: true })
64
+
65
+ res.end('' + (bb1.peer === bb2.peer))
66
+ })()`
67
+ })
68
+ return await r1.text()
69
+ },
70
+ 'true'
71
+ )
72
+
73
+ runTest(
74
+ "test that we can set the peer of a braid_blob object",
75
+ async () => {
76
+ var r1 = await braid_fetch(`/eval`, {
77
+ method: 'POST',
78
+ body: `void (async () => {
79
+ var test_id = 'test-db-' + Math.random().toString(36).slice(2)
80
+ var db = __dirname + '/' + test_id + '-db'
81
+ var meta = __dirname + '/' + test_id + '-meta'
82
+
83
+ var bb1 = braid_blob.create_braid_blob()
84
+ bb1.db_folder = db
85
+ bb1.meta_folder = meta
86
+ bb1.peer = 'test_peer'
87
+
88
+ try {
89
+ await bb1.serve({}, {})
90
+ } catch (e) {}
91
+
92
+ await require('fs').promises.rm(db, { recursive: true, force: true })
93
+ await require('fs').promises.rm(meta, { recursive: true, force: true })
94
+
95
+ res.end(bb1.peer)
96
+ })()`
97
+ })
98
+ return await r1.text()
99
+ },
100
+ 'test_peer'
101
+ )
102
+
103
+ runTest(
104
+ "test that PUTing with shorter event id doesn't do anything.",
105
+ async () => {
106
+ var key = 'test-' + Math.random().toString(36).slice(2)
107
+
108
+ var r = await braid_fetch(`/${key}`, {
109
+ method: 'PUT',
110
+ version: ['11'],
111
+ body: 'xyz'
112
+ })
113
+ if (!r.ok) throw 'got: ' + r.statusCode
114
+
115
+ var r = await braid_fetch(`/${key}`, {
116
+ method: 'PUT',
117
+ version: ['9'],
118
+ body: 'abc'
119
+ })
120
+ if (!r.ok) throw 'got: ' + r.statusCode
121
+
122
+ var r = await braid_fetch(`/${key}`)
123
+ return await r.text()
124
+ },
125
+ 'xyz'
126
+ )
127
+
128
+ runTest(
129
+ "test that we ignore stuff after the ? in a url",
130
+ async () => {
131
+ var key = 'test-' + Math.random().toString(36).slice(2)
132
+
133
+ var r = await braid_fetch(`/${key}?blah`, {
134
+ method: 'PUT',
135
+ version: ['11'],
136
+ body: 'yo!'
137
+ })
138
+ if (!r.ok) throw 'got: ' + r.statusCode
139
+
140
+ var r = await braid_fetch(`/${key}`)
141
+ return await r.text()
142
+ },
143
+ 'yo!'
144
+ )
145
+
146
+ runTest(
147
+ "test that we ignore stuff after the # in a url",
148
+ async () => {
149
+ var key = 'test-' + Math.random().toString(36).slice(2)
150
+
151
+ var r = await braid_fetch(`/${key}#blah?bloop`, {
152
+ method: 'PUT',
153
+ version: ['11'],
154
+ body: 'hi!'
155
+ })
156
+ if (!r.ok) throw 'got: ' + r.statusCode
157
+
158
+ var r = await braid_fetch(`/${key}`)
159
+ return await r.text()
160
+ },
161
+ 'hi!'
162
+ )
163
+
164
+ runTest(
165
+ "test send an update to another peer",
166
+ async () => {
167
+ var key = 'test-' + Math.random().toString(36).slice(2)
168
+
169
+ var r = await braid_fetch(`/${key}`, {
170
+ method: 'PUT',
171
+ headers: {'Content-Type': 'text/plain'},
172
+ version: ['1'],
173
+ body: 'xyz'
174
+ })
175
+ if (!r.ok) throw 'got: ' + r.statusCode
176
+
177
+ var a = new AbortController()
178
+ var r = await braid_fetch(`/${key}`, {
179
+ signal: a.signal,
180
+ subscribe: true,
181
+ peer: key
182
+ })
183
+
184
+ var p = new Promise(done => {
185
+ r.subscribe(update => {
186
+ if (update.version?.[0] !== '2') return
187
+ done(update.body_text)
188
+ a.abort()
189
+ })
190
+ })
191
+
192
+ var r = await braid_fetch(`/${key}`, {
193
+ method: 'PUT',
194
+ headers: {'Content-Type': 'text/plain'},
195
+ version: ['2'],
196
+ body: 'abc'
197
+ })
198
+ if (!r.ok) throw 'got: ' + r.statusCode
199
+
200
+ return await p
201
+ },
202
+ 'abc'
203
+ )
204
+
205
+ runTest(
206
+ "test having multiple subs",
207
+ async () => {
208
+ var key = 'test-' + Math.random().toString(36).slice(2)
209
+ var key2 = 'test2-' + Math.random().toString(36).slice(2)
210
+
211
+ var r = await braid_fetch(`/${key}`, {
212
+ method: 'PUT',
213
+ headers: {'Content-Type': 'text/plain'},
214
+ version: ['1'],
215
+ body: 'xyz'
216
+ })
217
+ if (!r.ok) throw 'got: ' + r.statusCode
218
+
219
+ var a = new AbortController()
220
+ var r = await braid_fetch(`/${key}`, {
221
+ signal: a.signal,
222
+ subscribe: true,
223
+ peer: key
224
+ })
225
+
226
+ var p = new Promise(done => {
227
+ r.subscribe(update => {
228
+
229
+ console.log(`p1 update = `, update)
230
+
231
+ if (update.version?.[0] !== '2') return
232
+ done(update.body_text)
233
+ }, (e) => {
234
+ console.log(`yooo`, e)
235
+ })
236
+ })
237
+
238
+ var r = await braid_fetch(`/${key2}`, {
239
+ method: 'PUT',
240
+ headers: {'Content-Type': 'text/plain'},
241
+ version: ['1'],
242
+ body: 'xyz2'
243
+ })
244
+ if (!r.ok) throw 'got: ' + r.statusCode
245
+
246
+ var a = new AbortController()
247
+ var r = await braid_fetch(`/${key2}`, {
248
+ signal: a.signal,
249
+ subscribe: true,
250
+ peer: key2
251
+ })
252
+
253
+ var p2 = new Promise(done => {
254
+ r.subscribe(update => {
255
+
256
+ console.log(`p2 update = `, update)
257
+
258
+ if (update.version?.[0] !== '2') return
259
+ done(update.body_text)
260
+ }, e => {
261
+ console.log(`yooo`, e)
262
+
263
+ })
264
+ })
265
+
266
+ var r = await braid_fetch(`/${key}`, {
267
+ method: 'PUT',
268
+ headers: {'Content-Type': 'text/plain'},
269
+ version: ['2'],
270
+ body: 'abc'
271
+ })
272
+ if (!r.ok) throw 'got: ' + r.statusCode
273
+
274
+ var r = await braid_fetch(`/${key2}`, {
275
+ method: 'PUT',
276
+ headers: {'Content-Type': 'text/plain'},
277
+ version: ['2'],
278
+ body: 'abc2'
279
+ })
280
+ if (!r.ok) throw 'got: ' + r.statusCode
281
+
282
+ var ret = await Promise.all([p, p2])
283
+ a.abort()
284
+ return 'got: ' + ret
285
+
286
+ },
287
+ 'got: abc,abc2'
288
+ )
289
+
290
+ runTest(
291
+ "test getting a 406",
292
+ async () => {
293
+ var key = 'test-' + Math.random().toString(36).slice(2)
294
+
295
+ var r = await braid_fetch(`/${key}`, {
296
+ method: 'PUT',
297
+ headers: {'Content-Type': 'text/plain'},
298
+ version: ['1'],
299
+ parents: [],
300
+ body: 'xyz'
301
+ })
302
+ if (!r.ok) throw 'got: ' + r.statusCode
303
+
304
+ var r = await braid_fetch(`/${key}`, {
305
+ headers: {Accept: 'text/html'}
306
+ })
307
+ return r.status + ' ' + await r.text()
308
+ },
309
+ '406 Content-Type of text/plain not in Accept: text/html'
310
+ )
311
+
312
+ runTest(
313
+ "test deleting something",
314
+ async () => {
315
+ var key = 'test-' + Math.random().toString(36).slice(2)
316
+
317
+ var r = await braid_fetch(`/${key}`, {
318
+ method: 'PUT',
319
+ version: ['1'],
320
+ parents: [],
321
+ body: 'xyz'
322
+ })
323
+ if (!r.ok) throw 'got: ' + r.statusCode
324
+
325
+ var r = await braid_fetch(`/${key}`, {
326
+ method: 'DELETE',
327
+ })
328
+ if (!r.ok) throw 'got: ' + r.statusCode
329
+
330
+ var r = await braid_fetch(`/${key}`)
331
+ return r.status
332
+ },
333
+ '404'
334
+ )
335
+
336
+ runTest(
337
+ "test deleting something that doesn't exist",
338
+ async () => {
339
+ var key = 'test-' + Math.random().toString(36).slice(2)
340
+
341
+ var r = await braid_fetch(`/${key}`, {
342
+ method: 'DELETE',
343
+ })
344
+ if (!r.ok) throw 'got: ' + r.statusCode
345
+
346
+ return r.status
347
+ },
348
+ '204'
349
+ )
350
+
351
+ runTest(
352
+ "test that subscribe returns current-version header",
353
+ async () => {
354
+ var key = 'test-' + Math.random().toString(36).slice(2)
355
+
356
+ var r = await braid_fetch(`/${key}`, {
357
+ method: 'PUT',
358
+ version: ['1'],
359
+ parents: [],
360
+ body: 'xyz'
361
+ })
362
+ if (!r.ok) throw 'got: ' + r.statusCode
363
+
364
+ var a = new AbortController()
365
+ var r = await braid_fetch(`/${key}`, {
366
+ signal: a.signal,
367
+ subscribe: true
368
+ })
369
+ a.abort()
370
+ return r.headers.get('current-version')
371
+ },
372
+ '"1"'
373
+ )
374
+
375
+ runTest(
376
+ "test that subscribe returns version as string-number in array",
377
+ async () => {
378
+ var key = 'test-' + Math.random().toString(36).slice(2)
379
+
380
+ var r = await braid_fetch(`/${key}`, {
381
+ method: 'PUT',
382
+ version: ['1'],
383
+ parents: [],
384
+ body: 'xyz'
385
+ })
386
+ if (!r.ok) throw 'got: ' + r.statusCode
387
+
388
+ var a = new AbortController()
389
+ var r = await braid_fetch(`/${key}`, {
390
+ signal: a.signal,
391
+ subscribe: true
392
+ })
393
+
394
+ var x = await new Promise(done => {
395
+ r.subscribe(update => {
396
+ done(update.version)
397
+ })
398
+ })
399
+
400
+ a.abort()
401
+ return JSON.stringify(x)
402
+ },
403
+ '["1"]'
404
+ )
405
+
406
+ runTest(
407
+ "test that subscribe's update's versions are string-number in array",
408
+ async () => {
409
+ var key = 'test-' + Math.random().toString(36).slice(2)
410
+
411
+ var r = await braid_fetch(`/${key}`, {
412
+ method: 'PUT',
413
+ version: ['4'],
414
+ body: 'xyz'
415
+ })
416
+ if (!r.ok) throw 'got: ' + r.statusCode
417
+
418
+ var a = new AbortController()
419
+ var r = await braid_fetch(`/${key}`, {
420
+ signal: a.signal,
421
+ subscribe: true,
422
+ parents: ['0']
423
+ })
424
+
425
+ var p = new Promise(done => {
426
+ r.subscribe(update => {
427
+ done(update.version)
428
+ })
429
+ })
430
+
431
+ var ret = await p
432
+ a.abort()
433
+ return JSON.stringify(ret)
434
+ },
435
+ '["4"]'
436
+ )
437
+
438
+ runTest(
439
+ "test that non-subscribe returns version header",
440
+ async () => {
441
+ var key = 'test-' + Math.random().toString(36).slice(2)
442
+
443
+ var r = await braid_fetch(`/${key}`, {
444
+ method: 'PUT',
445
+ version: ['2'],
446
+ parents: [],
447
+ body: 'xyz'
448
+ })
449
+ if (!r.ok) throw 'got: ' + r.statusCode
450
+
451
+ var r = await braid_fetch(`/${key}`)
452
+ return r.headers.get('version')
453
+ },
454
+ '"2"'
455
+ )
456
+
457
+ runTest(
458
+ "test that PUTing at version [] doesn't do anything.",
459
+ async () => {
460
+ var key = 'test-' + Math.random().toString(36).slice(2)
461
+
462
+ var r = await braid_fetch(`/${key}`, {
463
+ method: 'PUT',
464
+ version: [],
465
+ parents: [],
466
+ body: 'xyz'
467
+ })
468
+ if (!r.ok) throw 'got: ' + r.statusCode
469
+
470
+ var r = await braid_fetch(`/${key}`)
471
+ return r.status
472
+ },
473
+ '404'
474
+ )
475
+
476
+ runTest(
477
+ "test that subscribe sends no version if parents is big enough.",
478
+ async () => {
479
+ var key = 'test-' + Math.random().toString(36).slice(2)
480
+
481
+ var r = await braid_fetch(`/${key}`, {
482
+ method: 'PUT',
483
+ version: ['3'],
484
+ parents: [],
485
+ body: 'xyz'
486
+ })
487
+ if (!r.ok) throw 'got: ' + r.statusCode
488
+
489
+ var a = new AbortController()
490
+ var r = await braid_fetch(`/${key}`, {
491
+ signal: a.signal,
492
+ subscribe: true,
493
+ parents: ['3']
494
+ })
495
+
496
+ var received_update = false
497
+ var promise_a = new Promise(done => {
498
+ r.subscribe(async (update) => {
499
+ received_update = true
500
+ done()
501
+ })
502
+ })
503
+
504
+ var promise_b = new Promise(done => setTimeout(done, 300))
505
+
506
+ await Promise.race([promise_a, promise_b])
507
+ a.abort()
508
+
509
+ return '' + received_update
510
+ },
511
+ 'false'
512
+ )
513
+
514
+ runTest(
515
+ "test that subscribe sends 404 if there is no file.",
516
+ async () => {
517
+ var key = 'test-' + Math.random().toString(36).slice(2)
518
+
519
+ var r = await braid_fetch(`/${key}`, {
520
+ subscribe: true,
521
+ })
522
+ return r.status
523
+ },
524
+ '404'
525
+ )
526
+
527
+ runTest(
528
+ "test that we get 404 when file doesn't exist, on GET without subscribe.",
529
+ async () => {
530
+ var key = 'test-' + Math.random().toString(36).slice(2)
531
+
532
+ var r = await braid_fetch(`/${key}`)
533
+
534
+ return `${r.status}`
535
+ },
536
+ '404'
537
+ )
538
+
539
+ runTest(
540
+ "test second subscription to same key",
541
+ async () => {
542
+ var key = 'test-' + Math.random().toString(36).slice(2)
543
+
544
+ var r = await braid_fetch(`/${key}`, {
545
+ method: 'PUT',
546
+ version: ['3'],
547
+ parents: [],
548
+ body: 'xyz'
549
+ })
550
+ if (!r.ok) throw 'got: ' + r.statusCode
551
+
552
+ var a = new AbortController()
553
+ var r = await braid_fetch(`/${key}`, {
554
+ signal: a.signal,
555
+ subscribe: true,
556
+ parents: ['3']
557
+ })
558
+
559
+ var a2 = new AbortController()
560
+ var r2 = await braid_fetch(`/${key}`, {
561
+ signal: a2.signal,
562
+ subscribe: true,
563
+ parents: ['2']
564
+ })
565
+
566
+ var body = await new Promise(done => {
567
+ r2.subscribe((update) => done(update.body_text))
568
+ })
569
+
570
+ a.abort()
571
+ a2.abort()
572
+ return body
573
+ },
574
+ 'xyz'
575
+ )
576
+
577
+ runTest(
578
+ "test PUTing when server already has blob",
579
+ async () => {
580
+ var key = 'test-' + Math.random().toString(36).slice(2)
581
+
582
+ var r = await braid_fetch(`/${key}`, {
583
+ method: 'PUT',
584
+ version: ['3'],
585
+ parents: [],
586
+ body: 'xyz'
587
+ })
588
+ if (!r.ok) throw 'got: ' + r.statusCode
589
+
590
+ var r = await braid_fetch(`/${key}`, {
591
+ method: 'PUT',
592
+ version: ['4'],
593
+ parents: [],
594
+ body: 'XYZ'
595
+ })
596
+ if (!r.ok) throw 'got: ' + r.statusCode
597
+
598
+ return await (await braid_fetch(`/${key}`)).text()
599
+ },
600
+ 'XYZ'
601
+ )
602
+
603
+ runTest(
604
+ "test PUTing when server has newer version",
605
+ async () => {
606
+ var key = 'test-' + Math.random().toString(36).slice(2)
607
+
608
+ var r = await braid_fetch(`/${key}`, {
609
+ method: 'PUT',
610
+ version: ['3'],
611
+ parents: [],
612
+ body: 'xyz'
613
+ })
614
+ if (!r.ok) throw 'got: ' + r.statusCode
615
+
616
+ var r = await braid_fetch(`/${key}`, {
617
+ method: 'PUT',
618
+ version: ['2'],
619
+ parents: [],
620
+ body: 'XYZ'
621
+ })
622
+ if (!r.ok) throw 'got: ' + r.statusCode
623
+
624
+ return r.headers.get('version')
625
+ },
626
+ '"3"'
627
+ )
628
+
629
+ runTest(
630
+ "test that version we get back is the version we set",
631
+ async () => {
632
+ var key = 'test-' + Math.random().toString(36).slice(2)
633
+
634
+ var r = await braid_fetch(`/${key}`, {
635
+ method: 'PUT',
636
+ version: ['1760077018883'],
637
+ parents: [],
638
+ body: 'xyz'
639
+ })
640
+ if (!r.ok) throw 'got: ' + r.statusCode
641
+
642
+ var r = await braid_fetch(`/${key}`)
643
+ return r.headers.get('version')
644
+ },
645
+ '"1760077018883"'
646
+ )
647
+
648
+ runTest(
649
+ "test that subscribe gets back editable:true.",
650
+ async () => {
651
+ var key = 'test-' + Math.random().toString(36).slice(2)
652
+
653
+ var r = await braid_fetch(`/${key}`, {
654
+ method: 'PUT',
655
+ body: 'xyz'
656
+ })
657
+ if (!r.ok) throw 'got: ' + r.statusCode
658
+
659
+ var a = new AbortController()
660
+ var r = await braid_fetch(`/${key}`, {
661
+ signal: a.signal,
662
+ subscribe: true,
663
+ parents: ['3']
664
+ })
665
+
666
+ var ret = r.headers.get('editable')
667
+ a.abort()
668
+ return '' + ret
669
+ },
670
+ 'true'
671
+ )
672
+
673
+ runTest(
674
+ "test that we can override editable on the server.",
675
+ async () => {
676
+ var r1 = await braid_fetch(`/eval`, {
677
+ method: 'POST',
678
+ subscribe: true,
679
+ body: `void (async () => {
680
+ req.method = 'GET'
681
+ res.setHeader('editable', 'false')
682
+ braid_blob.serve(req, res, {key: ':test'})
683
+ })()`
684
+ })
685
+ return r1.headers.get('editable')
686
+
687
+ },
688
+ 'false'
689
+ )
690
+
691
+ }
692
+
693
+ // Export for Node.js (CommonJS)
694
+ if (typeof module !== 'undefined' && module.exports) {
695
+ module.exports = defineTests
696
+ }
697
+
698
+ // Export for browser (global)
699
+ if (typeof window !== 'undefined') {
700
+ window.defineTests = defineTests
701
+ }