@voidhash/mimic-effect 1.0.0-beta.1 → 1.0.0-beta.10

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 (142) hide show
  1. package/.turbo/turbo-build.log +116 -74
  2. package/dist/ColdStorage.cjs +9 -5
  3. package/dist/ColdStorage.d.cts.map +1 -1
  4. package/dist/ColdStorage.d.mts.map +1 -1
  5. package/dist/ColdStorage.mjs +9 -5
  6. package/dist/ColdStorage.mjs.map +1 -1
  7. package/dist/DocumentInstance.cjs +263 -0
  8. package/dist/DocumentInstance.d.cts +78 -0
  9. package/dist/DocumentInstance.d.cts.map +1 -0
  10. package/dist/DocumentInstance.d.mts +78 -0
  11. package/dist/DocumentInstance.d.mts.map +1 -0
  12. package/dist/DocumentInstance.mjs +264 -0
  13. package/dist/DocumentInstance.mjs.map +1 -0
  14. package/dist/Errors.cjs +10 -1
  15. package/dist/Errors.d.cts +18 -3
  16. package/dist/Errors.d.cts.map +1 -1
  17. package/dist/Errors.d.mts +18 -3
  18. package/dist/Errors.d.mts.map +1 -1
  19. package/dist/Errors.mjs +9 -1
  20. package/dist/Errors.mjs.map +1 -1
  21. package/dist/HotStorage.cjs +39 -12
  22. package/dist/HotStorage.d.cts +17 -1
  23. package/dist/HotStorage.d.cts.map +1 -1
  24. package/dist/HotStorage.d.mts +17 -1
  25. package/dist/HotStorage.d.mts.map +1 -1
  26. package/dist/HotStorage.mjs +39 -12
  27. package/dist/HotStorage.mjs.map +1 -1
  28. package/dist/Metrics.cjs +29 -1
  29. package/dist/Metrics.d.cts +5 -0
  30. package/dist/Metrics.d.cts.map +1 -1
  31. package/dist/Metrics.d.mts +5 -0
  32. package/dist/Metrics.d.mts.map +1 -1
  33. package/dist/Metrics.mjs +26 -1
  34. package/dist/Metrics.mjs.map +1 -1
  35. package/dist/MimicClusterServerEngine.cjs +44 -139
  36. package/dist/MimicClusterServerEngine.d.cts.map +1 -1
  37. package/dist/MimicClusterServerEngine.d.mts +1 -1
  38. package/dist/MimicClusterServerEngine.d.mts.map +1 -1
  39. package/dist/MimicClusterServerEngine.mjs +46 -141
  40. package/dist/MimicClusterServerEngine.mjs.map +1 -1
  41. package/dist/MimicServer.cjs +20 -20
  42. package/dist/MimicServer.d.cts.map +1 -1
  43. package/dist/MimicServer.d.mts.map +1 -1
  44. package/dist/MimicServer.mjs +20 -20
  45. package/dist/MimicServer.mjs.map +1 -1
  46. package/dist/MimicServerEngine.cjs +92 -11
  47. package/dist/MimicServerEngine.d.cts +12 -4
  48. package/dist/MimicServerEngine.d.cts.map +1 -1
  49. package/dist/MimicServerEngine.d.mts +12 -4
  50. package/dist/MimicServerEngine.d.mts.map +1 -1
  51. package/dist/MimicServerEngine.mjs +94 -13
  52. package/dist/MimicServerEngine.mjs.map +1 -1
  53. package/dist/PresenceManager.cjs +5 -5
  54. package/dist/PresenceManager.d.cts.map +1 -1
  55. package/dist/PresenceManager.d.mts.map +1 -1
  56. package/dist/PresenceManager.mjs +5 -5
  57. package/dist/PresenceManager.mjs.map +1 -1
  58. package/dist/Protocol.d.cts +1 -1
  59. package/dist/Protocol.d.mts +1 -1
  60. package/dist/Types.d.cts +9 -2
  61. package/dist/Types.d.cts.map +1 -1
  62. package/dist/Types.d.mts +9 -2
  63. package/dist/Types.d.mts.map +1 -1
  64. package/dist/index.cjs +5 -6
  65. package/dist/index.d.cts +3 -3
  66. package/dist/index.d.mts +3 -3
  67. package/dist/index.mjs +3 -3
  68. package/dist/testing/ColdStorageTestSuite.cjs +508 -0
  69. package/dist/testing/ColdStorageTestSuite.d.cts +36 -0
  70. package/dist/testing/ColdStorageTestSuite.d.cts.map +1 -0
  71. package/dist/testing/ColdStorageTestSuite.d.mts +36 -0
  72. package/dist/testing/ColdStorageTestSuite.d.mts.map +1 -0
  73. package/dist/testing/ColdStorageTestSuite.mjs +508 -0
  74. package/dist/testing/ColdStorageTestSuite.mjs.map +1 -0
  75. package/dist/testing/FailingStorage.cjs +162 -0
  76. package/dist/testing/FailingStorage.d.cts +43 -0
  77. package/dist/testing/FailingStorage.d.cts.map +1 -0
  78. package/dist/testing/FailingStorage.d.mts +43 -0
  79. package/dist/testing/FailingStorage.d.mts.map +1 -0
  80. package/dist/testing/FailingStorage.mjs +163 -0
  81. package/dist/testing/FailingStorage.mjs.map +1 -0
  82. package/dist/testing/HotStorageTestSuite.cjs +820 -0
  83. package/dist/testing/HotStorageTestSuite.d.cts +42 -0
  84. package/dist/testing/HotStorageTestSuite.d.cts.map +1 -0
  85. package/dist/testing/HotStorageTestSuite.d.mts +42 -0
  86. package/dist/testing/HotStorageTestSuite.d.mts.map +1 -0
  87. package/dist/testing/HotStorageTestSuite.mjs +820 -0
  88. package/dist/testing/HotStorageTestSuite.mjs.map +1 -0
  89. package/dist/testing/StorageIntegrationTestSuite.cjs +487 -0
  90. package/dist/testing/StorageIntegrationTestSuite.d.cts +37 -0
  91. package/dist/testing/StorageIntegrationTestSuite.d.cts.map +1 -0
  92. package/dist/testing/StorageIntegrationTestSuite.d.mts +37 -0
  93. package/dist/testing/StorageIntegrationTestSuite.d.mts.map +1 -0
  94. package/dist/testing/StorageIntegrationTestSuite.mjs +487 -0
  95. package/dist/testing/StorageIntegrationTestSuite.mjs.map +1 -0
  96. package/dist/testing/assertions.cjs +117 -0
  97. package/dist/testing/assertions.mjs +112 -0
  98. package/dist/testing/assertions.mjs.map +1 -0
  99. package/dist/testing/index.cjs +14 -0
  100. package/dist/testing/index.d.cts +6 -0
  101. package/dist/testing/index.d.mts +6 -0
  102. package/dist/testing/index.mjs +7 -0
  103. package/dist/testing/types.cjs +15 -0
  104. package/dist/testing/types.d.cts +90 -0
  105. package/dist/testing/types.d.cts.map +1 -0
  106. package/dist/testing/types.d.mts +90 -0
  107. package/dist/testing/types.d.mts.map +1 -0
  108. package/dist/testing/types.mjs +16 -0
  109. package/dist/testing/types.mjs.map +1 -0
  110. package/package.json +8 -3
  111. package/src/ColdStorage.ts +21 -12
  112. package/src/DocumentInstance.ts +527 -0
  113. package/src/Errors.ts +15 -1
  114. package/src/HotStorage.ts +115 -24
  115. package/src/Metrics.ts +30 -0
  116. package/src/MimicClusterServerEngine.ts +120 -275
  117. package/src/MimicServer.ts +83 -75
  118. package/src/MimicServerEngine.ts +230 -30
  119. package/src/PresenceManager.ts +44 -34
  120. package/src/Types.ts +9 -2
  121. package/src/index.ts +5 -35
  122. package/src/testing/ColdStorageTestSuite.ts +589 -0
  123. package/src/testing/FailingStorage.ts +338 -0
  124. package/src/testing/HotStorageTestSuite.ts +1105 -0
  125. package/src/testing/StorageIntegrationTestSuite.ts +736 -0
  126. package/src/testing/assertions.ts +188 -0
  127. package/src/testing/index.ts +83 -0
  128. package/src/testing/types.ts +100 -0
  129. package/tests/ColdStorage.test.ts +8 -120
  130. package/tests/DocumentInstance.test.ts +669 -0
  131. package/tests/HotStorage.test.ts +7 -126
  132. package/tests/StorageIntegration.test.ts +259 -0
  133. package/tsdown.config.ts +1 -1
  134. package/dist/DocumentManager.cjs +0 -229
  135. package/dist/DocumentManager.d.cts +0 -59
  136. package/dist/DocumentManager.d.cts.map +0 -1
  137. package/dist/DocumentManager.d.mts +0 -59
  138. package/dist/DocumentManager.d.mts.map +0 -1
  139. package/dist/DocumentManager.mjs +0 -227
  140. package/dist/DocumentManager.mjs.map +0 -1
  141. package/src/DocumentManager.ts +0 -506
  142. package/tests/DocumentManager.test.ts +0 -335
@@ -0,0 +1,508 @@
1
+ const require_ColdStorage = require('../ColdStorage.cjs');
2
+ const require_objectSpread2 = require('../_virtual/_@oxc-project_runtime@0.103.0/helpers/objectSpread2.cjs');
3
+ const require_assertions = require('./assertions.cjs');
4
+ let effect = require("effect");
5
+
6
+ //#region src/testing/ColdStorageTestSuite.ts
7
+ /**
8
+ * @voidhash/mimic-effect/testing - ColdStorage Test Suite
9
+ *
10
+ * Comprehensive test suite for ColdStorage adapter implementations.
11
+ * These tests verify that an adapter correctly implements the ColdStorage interface
12
+ * and can reliably store/retrieve document snapshots without data loss.
13
+ */
14
+ const Categories = {
15
+ BasicOperations: "Basic Operations",
16
+ DataIntegrity: "Data Integrity",
17
+ VersionHandling: "Version Handling",
18
+ TimestampHandling: "Timestamp Handling",
19
+ DocumentIdEdgeCases: "Document ID Edge Cases",
20
+ DocumentIsolation: "Document Isolation",
21
+ ConsistencyGuarantees: "Consistency Guarantees"
22
+ };
23
+ const makeDoc = (overrides = {}) => require_objectSpread2._objectSpread2({
24
+ state: { title: "Test Document" },
25
+ version: 1,
26
+ schemaVersion: 1,
27
+ savedAt: Date.now()
28
+ }, overrides);
29
+ const generateLargeState = (sizeKB) => {
30
+ const chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
31
+ const targetBytes = sizeKB * 1024;
32
+ let content = "";
33
+ while (content.length < targetBytes) content += chars[Math.floor(Math.random() * 62)];
34
+ return {
35
+ content,
36
+ padding: Array(100).fill("x")
37
+ };
38
+ };
39
+ const tests = [
40
+ {
41
+ name: "load returns undefined for non-existent document",
42
+ category: Categories.BasicOperations,
43
+ run: effect.Effect.gen(function* () {
44
+ yield* require_assertions.assertUndefined(yield* (yield* require_ColdStorage.ColdStorageTag).load("non-existent-doc-id-12345"), "Expected undefined for non-existent document");
45
+ })
46
+ },
47
+ {
48
+ name: "save then load returns exact same document",
49
+ category: Categories.BasicOperations,
50
+ run: effect.Effect.gen(function* () {
51
+ const storage = yield* require_ColdStorage.ColdStorageTag;
52
+ const doc = makeDoc();
53
+ yield* storage.save("test-doc-1", doc);
54
+ yield* require_assertions.assertEqual(yield* storage.load("test-doc-1"), doc, "Loaded document should match saved document");
55
+ })
56
+ },
57
+ {
58
+ name: "save overwrites existing document",
59
+ category: Categories.BasicOperations,
60
+ run: effect.Effect.gen(function* () {
61
+ const storage = yield* require_ColdStorage.ColdStorageTag;
62
+ const doc1 = makeDoc({
63
+ state: { title: "First" },
64
+ version: 1
65
+ });
66
+ const doc2 = makeDoc({
67
+ state: { title: "Second" },
68
+ version: 2
69
+ });
70
+ yield* storage.save("test-doc-2", doc1);
71
+ yield* storage.save("test-doc-2", doc2);
72
+ yield* require_assertions.assertEqual(yield* storage.load("test-doc-2"), doc2, "Should return the second (overwritten) document");
73
+ })
74
+ },
75
+ {
76
+ name: "delete removes document",
77
+ category: Categories.BasicOperations,
78
+ run: effect.Effect.gen(function* () {
79
+ const storage = yield* require_ColdStorage.ColdStorageTag;
80
+ const doc = makeDoc();
81
+ yield* storage.save("test-doc-3", doc);
82
+ yield* storage.delete("test-doc-3");
83
+ yield* require_assertions.assertUndefined(yield* storage.load("test-doc-3"), "Document should be undefined after deletion");
84
+ })
85
+ },
86
+ {
87
+ name: "delete on non-existent document does not error",
88
+ category: Categories.BasicOperations,
89
+ run: effect.Effect.gen(function* () {
90
+ yield* (yield* require_ColdStorage.ColdStorageTag).delete("definitely-non-existent-doc-xyz");
91
+ })
92
+ },
93
+ {
94
+ name: "all StoredDocument fields are preserved",
95
+ category: Categories.DataIntegrity,
96
+ run: effect.Effect.gen(function* () {
97
+ const storage = yield* require_ColdStorage.ColdStorageTag;
98
+ const doc = {
99
+ state: { nested: { value: 42 } },
100
+ version: 123,
101
+ schemaVersion: 2,
102
+ savedAt: 17040672e5
103
+ };
104
+ yield* storage.save("fields-test", doc);
105
+ const definedLoaded = yield* require_assertions.assertDefined(yield* storage.load("fields-test"), "Document should exist");
106
+ yield* require_assertions.assertEqual(definedLoaded.state, doc.state, "state should be preserved");
107
+ yield* require_assertions.assertEqual(definedLoaded.version, doc.version, "version should be preserved");
108
+ yield* require_assertions.assertEqual(definedLoaded.schemaVersion, doc.schemaVersion, "schemaVersion should be preserved");
109
+ yield* require_assertions.assertEqual(definedLoaded.savedAt, doc.savedAt, "savedAt should be preserved");
110
+ })
111
+ },
112
+ {
113
+ name: "complex nested state objects survive roundtrip",
114
+ category: Categories.DataIntegrity,
115
+ run: effect.Effect.gen(function* () {
116
+ const storage = yield* require_ColdStorage.ColdStorageTag;
117
+ const doc = makeDoc({ state: {
118
+ level1: {
119
+ level2: { level3: {
120
+ value: "deep",
121
+ array: [
122
+ 1,
123
+ 2,
124
+ { nested: true }
125
+ ]
126
+ } },
127
+ sibling: "value"
128
+ },
129
+ topLevel: 42
130
+ } });
131
+ yield* storage.save("complex-state", doc);
132
+ yield* require_assertions.assertEqual(yield* storage.load("complex-state"), doc, "Complex nested state should survive roundtrip");
133
+ })
134
+ },
135
+ {
136
+ name: "arrays in state survive roundtrip",
137
+ category: Categories.DataIntegrity,
138
+ run: effect.Effect.gen(function* () {
139
+ const storage = yield* require_ColdStorage.ColdStorageTag;
140
+ const doc = makeDoc({ state: {
141
+ numbers: [
142
+ 1,
143
+ 2,
144
+ 3,
145
+ 4,
146
+ 5
147
+ ],
148
+ strings: [
149
+ "a",
150
+ "b",
151
+ "c"
152
+ ],
153
+ mixed: [
154
+ 1,
155
+ "two",
156
+ { three: 3 },
157
+ [4]
158
+ ],
159
+ empty: []
160
+ } });
161
+ yield* storage.save("arrays-test", doc);
162
+ yield* require_assertions.assertEqual(yield* storage.load("arrays-test"), doc, "Arrays should survive roundtrip");
163
+ })
164
+ },
165
+ {
166
+ name: "null values in state survive roundtrip",
167
+ category: Categories.DataIntegrity,
168
+ run: effect.Effect.gen(function* () {
169
+ const storage = yield* require_ColdStorage.ColdStorageTag;
170
+ const doc = makeDoc({ state: {
171
+ nullValue: null,
172
+ nested: { alsoNull: null },
173
+ array: [
174
+ null,
175
+ 1,
176
+ null
177
+ ]
178
+ } });
179
+ yield* storage.save("null-test", doc);
180
+ yield* require_assertions.assertEqual(yield* storage.load("null-test"), doc, "null values should survive roundtrip");
181
+ })
182
+ },
183
+ {
184
+ name: "empty object survives roundtrip",
185
+ category: Categories.DataIntegrity,
186
+ run: effect.Effect.gen(function* () {
187
+ const storage = yield* require_ColdStorage.ColdStorageTag;
188
+ const doc = makeDoc({ state: {} });
189
+ yield* storage.save("empty-obj", doc);
190
+ yield* require_assertions.assertEqual(yield* storage.load("empty-obj"), doc, "Empty object should survive roundtrip");
191
+ })
192
+ },
193
+ {
194
+ name: "empty array survives roundtrip",
195
+ category: Categories.DataIntegrity,
196
+ run: effect.Effect.gen(function* () {
197
+ const storage = yield* require_ColdStorage.ColdStorageTag;
198
+ const doc = makeDoc({ state: [] });
199
+ yield* storage.save("empty-arr", doc);
200
+ yield* require_assertions.assertEqual(yield* storage.load("empty-arr"), doc, "Empty array should survive roundtrip");
201
+ })
202
+ },
203
+ {
204
+ name: "unicode strings in state survive roundtrip",
205
+ category: Categories.DataIntegrity,
206
+ run: effect.Effect.gen(function* () {
207
+ const storage = yield* require_ColdStorage.ColdStorageTag;
208
+ const doc = makeDoc({ state: {
209
+ emoji: "Hello! How are you?",
210
+ chinese: "Chinese Characters",
211
+ arabic: "Arabic Letters",
212
+ special: "Combined: Cafe"
213
+ } });
214
+ yield* storage.save("unicode-test", doc);
215
+ yield* require_assertions.assertEqual(yield* storage.load("unicode-test"), doc, "Unicode strings should survive roundtrip");
216
+ })
217
+ },
218
+ {
219
+ name: "large state objects (100KB+) survive roundtrip",
220
+ category: Categories.DataIntegrity,
221
+ run: effect.Effect.gen(function* () {
222
+ const storage = yield* require_ColdStorage.ColdStorageTag;
223
+ const doc = makeDoc({ state: generateLargeState(100) });
224
+ yield* storage.save("large-doc", doc);
225
+ yield* require_assertions.assertEqual(yield* storage.load("large-doc"), doc, "Large documents should survive roundtrip");
226
+ })
227
+ },
228
+ {
229
+ name: "special JSON characters survive roundtrip",
230
+ category: Categories.DataIntegrity,
231
+ run: effect.Effect.gen(function* () {
232
+ const storage = yield* require_ColdStorage.ColdStorageTag;
233
+ const doc = makeDoc({ state: {
234
+ quotes: "He said \"hello\"",
235
+ backslash: "path\\to\\file",
236
+ newline: "line1\nline2",
237
+ tab: "col1 col2",
238
+ mixed: "All: \"\\\n "
239
+ } });
240
+ yield* storage.save("special-chars", doc);
241
+ yield* require_assertions.assertEqual(yield* storage.load("special-chars"), doc, "Special JSON characters should survive roundtrip");
242
+ })
243
+ },
244
+ {
245
+ name: "version 0 is preserved correctly",
246
+ category: Categories.VersionHandling,
247
+ run: effect.Effect.gen(function* () {
248
+ const storage = yield* require_ColdStorage.ColdStorageTag;
249
+ const doc = makeDoc({ version: 0 });
250
+ yield* storage.save("version-0", doc);
251
+ yield* require_assertions.assertEqual((yield* require_assertions.assertDefined(yield* storage.load("version-0"), "Document should exist")).version, 0, "Version 0 should be preserved");
252
+ })
253
+ },
254
+ {
255
+ name: "version 1 is preserved correctly",
256
+ category: Categories.VersionHandling,
257
+ run: effect.Effect.gen(function* () {
258
+ const storage = yield* require_ColdStorage.ColdStorageTag;
259
+ const doc = makeDoc({ version: 1 });
260
+ yield* storage.save("version-1", doc);
261
+ yield* require_assertions.assertEqual((yield* require_assertions.assertDefined(yield* storage.load("version-1"), "Document should exist")).version, 1, "Version 1 should be preserved");
262
+ })
263
+ },
264
+ {
265
+ name: "large version numbers are preserved",
266
+ category: Categories.VersionHandling,
267
+ run: effect.Effect.gen(function* () {
268
+ const storage = yield* require_ColdStorage.ColdStorageTag;
269
+ const largeVersion = Number.MAX_SAFE_INTEGER;
270
+ const doc = makeDoc({ version: largeVersion });
271
+ yield* storage.save("large-version", doc);
272
+ yield* require_assertions.assertEqual((yield* require_assertions.assertDefined(yield* storage.load("large-version"), "Document should exist")).version, largeVersion, "Large version number should be preserved exactly");
273
+ })
274
+ },
275
+ {
276
+ name: "schema version is preserved correctly",
277
+ category: Categories.VersionHandling,
278
+ run: effect.Effect.gen(function* () {
279
+ const storage = yield* require_ColdStorage.ColdStorageTag;
280
+ const doc = makeDoc({ schemaVersion: 42 });
281
+ yield* storage.save("schema-version", doc);
282
+ yield* require_assertions.assertEqual((yield* require_assertions.assertDefined(yield* storage.load("schema-version"), "Document should exist")).schemaVersion, 42, "Schema version should be preserved");
283
+ })
284
+ },
285
+ {
286
+ name: "savedAt timestamp is preserved exactly",
287
+ category: Categories.TimestampHandling,
288
+ run: effect.Effect.gen(function* () {
289
+ const storage = yield* require_ColdStorage.ColdStorageTag;
290
+ const timestamp = 17040672e5;
291
+ const doc = makeDoc({ savedAt: timestamp });
292
+ yield* storage.save("timestamp-exact", doc);
293
+ yield* require_assertions.assertEqual((yield* require_assertions.assertDefined(yield* storage.load("timestamp-exact"), "Document should exist")).savedAt, timestamp, "savedAt should be preserved exactly");
294
+ })
295
+ },
296
+ {
297
+ name: "timestamp 0 is preserved correctly",
298
+ category: Categories.TimestampHandling,
299
+ run: effect.Effect.gen(function* () {
300
+ const storage = yield* require_ColdStorage.ColdStorageTag;
301
+ const doc = makeDoc({ savedAt: 0 });
302
+ yield* storage.save("timestamp-0", doc);
303
+ yield* require_assertions.assertEqual((yield* require_assertions.assertDefined(yield* storage.load("timestamp-0"), "Document should exist")).savedAt, 0, "Timestamp 0 should be preserved");
304
+ })
305
+ },
306
+ {
307
+ name: "recent timestamps are preserved correctly",
308
+ category: Categories.TimestampHandling,
309
+ run: effect.Effect.gen(function* () {
310
+ const storage = yield* require_ColdStorage.ColdStorageTag;
311
+ const now = Date.now();
312
+ const doc = makeDoc({ savedAt: now });
313
+ yield* storage.save("timestamp-recent", doc);
314
+ yield* require_assertions.assertEqual((yield* require_assertions.assertDefined(yield* storage.load("timestamp-recent"), "Document should exist")).savedAt, now, "Recent timestamp should be preserved");
315
+ })
316
+ },
317
+ {
318
+ name: "long documentId (1000+ chars) works",
319
+ category: Categories.DocumentIdEdgeCases,
320
+ run: effect.Effect.gen(function* () {
321
+ const storage = yield* require_ColdStorage.ColdStorageTag;
322
+ const longId = "x".repeat(1e3);
323
+ const doc = makeDoc();
324
+ yield* storage.save(longId, doc);
325
+ yield* require_assertions.assertEqual(yield* storage.load(longId), doc, "Long documentId should work correctly");
326
+ })
327
+ },
328
+ {
329
+ name: "unicode documentId works",
330
+ category: Categories.DocumentIdEdgeCases,
331
+ run: effect.Effect.gen(function* () {
332
+ const storage = yield* require_ColdStorage.ColdStorageTag;
333
+ const unicodeId = "doc-test-id";
334
+ const doc = makeDoc();
335
+ yield* storage.save(unicodeId, doc);
336
+ yield* require_assertions.assertEqual(yield* storage.load(unicodeId), doc, "Unicode documentId should work correctly");
337
+ })
338
+ },
339
+ {
340
+ name: "documentId with special chars works",
341
+ category: Categories.DocumentIdEdgeCases,
342
+ run: effect.Effect.gen(function* () {
343
+ const storage = yield* require_ColdStorage.ColdStorageTag;
344
+ const specialId = "doc/path:to.file";
345
+ const doc = makeDoc();
346
+ yield* storage.save(specialId, doc);
347
+ yield* require_assertions.assertEqual(yield* storage.load(specialId), doc, "DocumentId with special chars should work");
348
+ })
349
+ },
350
+ {
351
+ name: "documentId with spaces works",
352
+ category: Categories.DocumentIdEdgeCases,
353
+ run: effect.Effect.gen(function* () {
354
+ const storage = yield* require_ColdStorage.ColdStorageTag;
355
+ const spacedId = "doc with spaces";
356
+ const doc = makeDoc();
357
+ yield* storage.save(spacedId, doc);
358
+ yield* require_assertions.assertEqual(yield* storage.load(spacedId), doc, "DocumentId with spaces should work");
359
+ })
360
+ },
361
+ {
362
+ name: "different documents are stored independently",
363
+ category: Categories.DocumentIsolation,
364
+ run: effect.Effect.gen(function* () {
365
+ const storage = yield* require_ColdStorage.ColdStorageTag;
366
+ const doc1 = makeDoc({
367
+ state: { id: 1 },
368
+ version: 1
369
+ });
370
+ const doc2 = makeDoc({
371
+ state: { id: 2 },
372
+ version: 2
373
+ });
374
+ yield* storage.save("iso-doc-1", doc1);
375
+ yield* storage.save("iso-doc-2", doc2);
376
+ const loaded1 = yield* storage.load("iso-doc-1");
377
+ const loaded2 = yield* storage.load("iso-doc-2");
378
+ yield* require_assertions.assertEqual(loaded1, doc1, "First document should be unchanged");
379
+ yield* require_assertions.assertEqual(loaded2, doc2, "Second document should be unchanged");
380
+ })
381
+ },
382
+ {
383
+ name: "deleting one document does not affect others",
384
+ category: Categories.DocumentIsolation,
385
+ run: effect.Effect.gen(function* () {
386
+ const storage = yield* require_ColdStorage.ColdStorageTag;
387
+ const doc1 = makeDoc({ state: { id: 1 } });
388
+ const doc2 = makeDoc({ state: { id: 2 } });
389
+ yield* storage.save("del-iso-1", doc1);
390
+ yield* storage.save("del-iso-2", doc2);
391
+ yield* storage.delete("del-iso-1");
392
+ const loaded1 = yield* storage.load("del-iso-1");
393
+ const loaded2 = yield* storage.load("del-iso-2");
394
+ yield* require_assertions.assertUndefined(loaded1, "Deleted document should be undefined");
395
+ yield* require_assertions.assertEqual(loaded2, doc2, "Other document should be unchanged");
396
+ })
397
+ },
398
+ {
399
+ name: "updating one document does not affect others",
400
+ category: Categories.DocumentIsolation,
401
+ run: effect.Effect.gen(function* () {
402
+ const storage = yield* require_ColdStorage.ColdStorageTag;
403
+ const doc1v1 = makeDoc({
404
+ state: {
405
+ id: 1,
406
+ v: 1
407
+ },
408
+ version: 1
409
+ });
410
+ const doc1v2 = makeDoc({
411
+ state: {
412
+ id: 1,
413
+ v: 2
414
+ },
415
+ version: 2
416
+ });
417
+ const doc2 = makeDoc({ state: { id: 2 } });
418
+ yield* storage.save("upd-iso-1", doc1v1);
419
+ yield* storage.save("upd-iso-2", doc2);
420
+ yield* storage.save("upd-iso-1", doc1v2);
421
+ const loaded1 = yield* storage.load("upd-iso-1");
422
+ const loaded2 = yield* storage.load("upd-iso-2");
423
+ yield* require_assertions.assertEqual(loaded1, doc1v2, "Updated document should have new value");
424
+ yield* require_assertions.assertEqual(loaded2, doc2, "Other document should be unchanged");
425
+ })
426
+ },
427
+ {
428
+ name: "multiple saves to same doc, load returns latest",
429
+ category: Categories.ConsistencyGuarantees,
430
+ run: effect.Effect.gen(function* () {
431
+ const storage = yield* require_ColdStorage.ColdStorageTag;
432
+ const doc1 = makeDoc({
433
+ state: { v: 1 },
434
+ version: 1
435
+ });
436
+ const doc2 = makeDoc({
437
+ state: { v: 2 },
438
+ version: 2
439
+ });
440
+ const doc3 = makeDoc({
441
+ state: { v: 3 },
442
+ version: 3
443
+ });
444
+ yield* storage.save("multi-save", doc1);
445
+ yield* storage.save("multi-save", doc2);
446
+ yield* storage.save("multi-save", doc3);
447
+ yield* require_assertions.assertEqual(yield* storage.load("multi-save"), doc3, "Should return the latest saved document");
448
+ })
449
+ },
450
+ {
451
+ name: "save-delete-save sequence works correctly",
452
+ category: Categories.ConsistencyGuarantees,
453
+ run: effect.Effect.gen(function* () {
454
+ const storage = yield* require_ColdStorage.ColdStorageTag;
455
+ const doc1 = makeDoc({
456
+ state: { phase: "first" },
457
+ version: 1
458
+ });
459
+ const doc2 = makeDoc({
460
+ state: { phase: "second" },
461
+ version: 2
462
+ });
463
+ yield* storage.save("sds-test", doc1);
464
+ yield* storage.delete("sds-test");
465
+ yield* storage.save("sds-test", doc2);
466
+ yield* require_assertions.assertEqual(yield* storage.load("sds-test"), doc2, "Should return document saved after delete");
467
+ })
468
+ }
469
+ ];
470
+ /**
471
+ * Get all ColdStorage test cases.
472
+ *
473
+ * @returns Array of test cases that require ColdStorageTag
474
+ */
475
+ const makeTests = () => tests;
476
+ /**
477
+ * Run all tests and collect results.
478
+ *
479
+ * @returns Effect that produces TestResults
480
+ */
481
+ const runAll = () => effect.Effect.gen(function* () {
482
+ const passed = [];
483
+ const failed = [];
484
+ for (const test of tests) {
485
+ const result = yield* effect.Effect.either(test.run);
486
+ if (result._tag === "Right") passed.push(test);
487
+ else failed.push({
488
+ test,
489
+ error: result.left
490
+ });
491
+ }
492
+ return {
493
+ passed,
494
+ failed,
495
+ total: tests.length,
496
+ passCount: passed.length,
497
+ failCount: failed.length
498
+ };
499
+ });
500
+ const ColdStorageTestSuite = {
501
+ Categories,
502
+ makeTests,
503
+ runAll
504
+ };
505
+
506
+ //#endregion
507
+ exports.Categories = Categories;
508
+ exports.ColdStorageTestSuite = ColdStorageTestSuite;
@@ -0,0 +1,36 @@
1
+ import { ColdStorageError } from "../Errors.cjs";
2
+ import { ColdStorageTag } from "../ColdStorage.cjs";
3
+ import { StorageTestCase, TestError, TestResults } from "./types.cjs";
4
+ import { Effect } from "effect";
5
+
6
+ //#region src/testing/ColdStorageTestSuite.d.ts
7
+
8
+ /**
9
+ * Error type for ColdStorage tests - can be either a TestError or a ColdStorageError
10
+ */
11
+ type ColdStorageTestError = TestError | ColdStorageError;
12
+ declare const Categories: {
13
+ readonly BasicOperations: "Basic Operations";
14
+ readonly DataIntegrity: "Data Integrity";
15
+ readonly VersionHandling: "Version Handling";
16
+ readonly TimestampHandling: "Timestamp Handling";
17
+ readonly DocumentIdEdgeCases: "Document ID Edge Cases";
18
+ readonly DocumentIsolation: "Document Isolation";
19
+ readonly ConsistencyGuarantees: "Consistency Guarantees";
20
+ };
21
+ declare const ColdStorageTestSuite: {
22
+ Categories: {
23
+ readonly BasicOperations: "Basic Operations";
24
+ readonly DataIntegrity: "Data Integrity";
25
+ readonly VersionHandling: "Version Handling";
26
+ readonly TimestampHandling: "Timestamp Handling";
27
+ readonly DocumentIdEdgeCases: "Document ID Edge Cases";
28
+ readonly DocumentIsolation: "Document Isolation";
29
+ readonly ConsistencyGuarantees: "Consistency Guarantees";
30
+ };
31
+ makeTests: () => StorageTestCase<ColdStorageTestError, ColdStorageTag>[];
32
+ runAll: () => Effect.Effect<TestResults<ColdStorageTestError, ColdStorageTag>, never, ColdStorageTag>;
33
+ };
34
+ //#endregion
35
+ export { Categories, ColdStorageTestError, ColdStorageTestSuite };
36
+ //# sourceMappingURL=ColdStorageTestSuite.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ColdStorageTestSuite.d.cts","names":[],"sources":["../../src/testing/ColdStorageTestSuite.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;AA6iBE,KAvhBU,oBAAA,GAAuB,SAuhBjC,GAvhB6C,gBAuhB7C;AAHwB,cA9gBb,UA8gBoB,EAAA;EAAM,SAAA,eAAA,EAAA,kBAAA;;;;;;;;cA8B1B;;;;;;;;;;mBAxCgB,gBAC3B,sBACA;gBAQwB,MAAA,CAAO,OAC/B,YAAY,sBAAsB,wBAElC"}
@@ -0,0 +1,36 @@
1
+ import { ColdStorageError } from "../Errors.mjs";
2
+ import { ColdStorageTag } from "../ColdStorage.mjs";
3
+ import { StorageTestCase, TestError, TestResults } from "./types.mjs";
4
+ import { Effect } from "effect";
5
+
6
+ //#region src/testing/ColdStorageTestSuite.d.ts
7
+
8
+ /**
9
+ * Error type for ColdStorage tests - can be either a TestError or a ColdStorageError
10
+ */
11
+ type ColdStorageTestError = TestError | ColdStorageError;
12
+ declare const Categories: {
13
+ readonly BasicOperations: "Basic Operations";
14
+ readonly DataIntegrity: "Data Integrity";
15
+ readonly VersionHandling: "Version Handling";
16
+ readonly TimestampHandling: "Timestamp Handling";
17
+ readonly DocumentIdEdgeCases: "Document ID Edge Cases";
18
+ readonly DocumentIsolation: "Document Isolation";
19
+ readonly ConsistencyGuarantees: "Consistency Guarantees";
20
+ };
21
+ declare const ColdStorageTestSuite: {
22
+ Categories: {
23
+ readonly BasicOperations: "Basic Operations";
24
+ readonly DataIntegrity: "Data Integrity";
25
+ readonly VersionHandling: "Version Handling";
26
+ readonly TimestampHandling: "Timestamp Handling";
27
+ readonly DocumentIdEdgeCases: "Document ID Edge Cases";
28
+ readonly DocumentIsolation: "Document Isolation";
29
+ readonly ConsistencyGuarantees: "Consistency Guarantees";
30
+ };
31
+ makeTests: () => StorageTestCase<ColdStorageTestError, ColdStorageTag>[];
32
+ runAll: () => Effect.Effect<TestResults<ColdStorageTestError, ColdStorageTag>, never, ColdStorageTag>;
33
+ };
34
+ //#endregion
35
+ export { Categories, ColdStorageTestError, ColdStorageTestSuite };
36
+ //# sourceMappingURL=ColdStorageTestSuite.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ColdStorageTestSuite.d.mts","names":[],"sources":["../../src/testing/ColdStorageTestSuite.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;AA6iBE,KAvhBU,oBAAA,GAAuB,SAuhBjC,GAvhB6C,gBAuhB7C;AAHwB,cA9gBb,UA8gBoB,EAAA;EAAM,SAAA,eAAA,EAAA,kBAAA;;;;;;;;cA8B1B;;;;;;;;;;mBAxCgB,gBAC3B,sBACA;gBAQwB,MAAA,CAAO,OAC/B,YAAY,sBAAsB,wBAElC"}