@voidhash/mimic-effect 1.0.0-beta.16 → 1.0.0-beta.18

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 (99) hide show
  1. package/dist/ColdStorage.cjs +1 -1
  2. package/dist/ColdStorage.d.cts +2 -2
  3. package/dist/ColdStorage.d.cts.map +1 -1
  4. package/dist/ColdStorage.d.mts +2 -2
  5. package/dist/ColdStorage.d.mts.map +1 -1
  6. package/dist/ColdStorage.mjs +2 -2
  7. package/dist/ColdStorage.mjs.map +1 -1
  8. package/dist/DocumentInstance.cjs +13 -13
  9. package/dist/DocumentInstance.mjs +13 -13
  10. package/dist/DocumentInstance.mjs.map +1 -1
  11. package/dist/Errors.d.cts +8 -8
  12. package/dist/Errors.d.cts.map +1 -1
  13. package/dist/Errors.d.mts +8 -8
  14. package/dist/Errors.d.mts.map +1 -1
  15. package/dist/HotStorage.cjs +1 -1
  16. package/dist/HotStorage.d.cts +2 -2
  17. package/dist/HotStorage.d.mts +2 -2
  18. package/dist/HotStorage.mjs +2 -2
  19. package/dist/HotStorage.mjs.map +1 -1
  20. package/dist/Metrics.cjs +6 -6
  21. package/dist/Metrics.d.cts +21 -23
  22. package/dist/Metrics.d.cts.map +1 -1
  23. package/dist/Metrics.d.mts +21 -23
  24. package/dist/Metrics.d.mts.map +1 -1
  25. package/dist/Metrics.mjs +7 -7
  26. package/dist/Metrics.mjs.map +1 -1
  27. package/dist/MimicAuthService.cjs +1 -1
  28. package/dist/MimicAuthService.d.cts +2 -2
  29. package/dist/MimicAuthService.d.cts.map +1 -1
  30. package/dist/MimicAuthService.d.mts +2 -2
  31. package/dist/MimicAuthService.d.mts.map +1 -1
  32. package/dist/MimicAuthService.mjs +2 -2
  33. package/dist/MimicAuthService.mjs.map +1 -1
  34. package/dist/MimicClusterServerEngine.cjs +38 -41
  35. package/dist/MimicClusterServerEngine.d.cts +1 -1
  36. package/dist/MimicClusterServerEngine.d.mts +1 -1
  37. package/dist/MimicClusterServerEngine.mjs +31 -34
  38. package/dist/MimicClusterServerEngine.mjs.map +1 -1
  39. package/dist/MimicServer.cjs +23 -23
  40. package/dist/MimicServer.d.cts +3 -3
  41. package/dist/MimicServer.d.cts.map +1 -1
  42. package/dist/MimicServer.d.mts +3 -3
  43. package/dist/MimicServer.d.mts.map +1 -1
  44. package/dist/MimicServer.mjs +22 -22
  45. package/dist/MimicServer.mjs.map +1 -1
  46. package/dist/MimicServerEngine.cjs +13 -13
  47. package/dist/MimicServerEngine.d.cts +2 -2
  48. package/dist/MimicServerEngine.d.mts +2 -2
  49. package/dist/MimicServerEngine.mjs +14 -14
  50. package/dist/MimicServerEngine.mjs.map +1 -1
  51. package/dist/PresenceManager.cjs +4 -4
  52. package/dist/PresenceManager.d.cts +2 -2
  53. package/dist/PresenceManager.d.mts +2 -2
  54. package/dist/PresenceManager.mjs +5 -5
  55. package/dist/PresenceManager.mjs.map +1 -1
  56. package/dist/Types.d.cts +1 -1
  57. package/dist/Types.d.mts +1 -1
  58. package/dist/testing/ColdStorageTestSuite.cjs +3 -3
  59. package/dist/testing/ColdStorageTestSuite.mjs +3 -3
  60. package/dist/testing/ColdStorageTestSuite.mjs.map +1 -1
  61. package/dist/testing/HotStorageTestSuite.cjs +13 -13
  62. package/dist/testing/HotStorageTestSuite.mjs +13 -13
  63. package/dist/testing/HotStorageTestSuite.mjs.map +1 -1
  64. package/dist/testing/StorageIntegrationTestSuite.cjs +3 -3
  65. package/dist/testing/StorageIntegrationTestSuite.mjs +3 -3
  66. package/dist/testing/StorageIntegrationTestSuite.mjs.map +1 -1
  67. package/dist/testing/types.d.cts +3 -3
  68. package/dist/testing/types.d.cts.map +1 -1
  69. package/dist/testing/types.d.mts +1 -1
  70. package/dist/testing/types.d.mts.map +1 -1
  71. package/package.json +17 -21
  72. package/src/ColdStorage.ts +4 -5
  73. package/src/DocumentInstance.ts +13 -13
  74. package/src/HotStorage.ts +3 -3
  75. package/src/Metrics.ts +22 -16
  76. package/src/MimicAuthService.ts +3 -3
  77. package/src/MimicClusterServerEngine.ts +35 -35
  78. package/src/MimicServer.ts +26 -30
  79. package/src/MimicServerEngine.ts +15 -15
  80. package/src/PresenceManager.ts +6 -6
  81. package/src/Types.ts +1 -1
  82. package/src/testing/ColdStorageTestSuite.ts +3 -3
  83. package/src/testing/HotStorageTestSuite.ts +17 -17
  84. package/src/testing/StorageIntegrationTestSuite.ts +3 -3
  85. package/.turbo/turbo-build.log +0 -154
  86. package/tests/ColdStorage.test.ts +0 -24
  87. package/tests/DocumentInstance.test.ts +0 -669
  88. package/tests/HotStorage.test.ts +0 -24
  89. package/tests/MimicAuthService.test.ts +0 -153
  90. package/tests/MimicClusterServerEngine.test.ts +0 -587
  91. package/tests/MimicServer.test.ts +0 -142
  92. package/tests/MimicServerEngine.test.ts +0 -547
  93. package/tests/PresenceManager.test.ts +0 -380
  94. package/tests/Protocol.test.ts +0 -190
  95. package/tests/StorageIntegration.test.ts +0 -259
  96. package/tsconfig.build.json +0 -24
  97. package/tsconfig.json +0 -8
  98. package/tsdown.config.ts +0 -18
  99. package/vitest.mts +0 -11
@@ -1 +1 @@
1
- {"version":3,"file":"HotStorageTestSuite.mjs","names":["tests: StorageTestCase<HotStorageTestError, HotStorageTag>[]","entry: WalEntry","passed: StorageTestCase<HotStorageTestError, HotStorageTag>[]","failed: Array<{\n test: StorageTestCase<HotStorageTestError, HotStorageTag>;\n error: HotStorageTestError;\n }>"],"sources":["../../src/testing/HotStorageTestSuite.ts"],"sourcesContent":["/**\n * @voidhash/mimic-effect/testing - HotStorage Test Suite\n *\n * Comprehensive test suite for HotStorage (WAL) adapter implementations.\n * These tests verify that an adapter correctly implements the HotStorage interface\n * and can reliably store/retrieve WAL entries for document recovery.\n */\nimport { Effect, Schema } from \"effect\";\nimport { Transaction, OperationPath, Operation, OperationDefinition } from \"@voidhash/mimic\";\nimport { HotStorageTag } from \"../HotStorage\";\nimport { type HotStorageError, WalVersionGapError } from \"../Errors\";\nimport type { WalEntry } from \"../Types\";\nimport type { StorageTestCase, TestResults } from \"./types\";\nimport { TestError } from \"./types\";\nimport {\n assertEqual,\n assertLength,\n assertEmpty,\n assertSortedBy,\n assertTrue,\n} from \"./assertions\";\n\n/**\n * Error type for HotStorage tests - can be either a TestError, HotStorageError, or WalVersionGapError\n */\nexport type HotStorageTestError = TestError | HotStorageError | WalVersionGapError;\n\n// =============================================================================\n// Test Operation Definitions\n// =============================================================================\n\n/**\n * Test operation definition for creating proper Operation objects in tests.\n * Using Schema.Unknown allows any payload type for flexibility in testing.\n */\nconst TestSetDefinition = OperationDefinition.make({\n kind: \"test.set\" as const,\n payload: Schema.Unknown,\n target: Schema.Unknown,\n apply: (payload: unknown) => payload,\n});\n\n/**\n * Custom operation definition for testing operation kind preservation.\n */\nconst CustomOpDefinition = OperationDefinition.make({\n kind: \"custom.operation\" as const,\n payload: Schema.Unknown,\n target: Schema.Unknown,\n apply: (payload: unknown) => payload,\n});\n\n// =============================================================================\n// Categories\n// =============================================================================\n\nexport const Categories = {\n BasicOperations: \"Basic Operations\",\n VersionFiltering: \"Version Filtering\",\n OrderingGuarantees: \"Ordering Guarantees\",\n TruncationEdgeCases: \"Truncation Edge Cases\",\n WalEntryIntegrity: \"WAL Entry Integrity\",\n DocumentIsolation: \"Document Isolation\",\n LargeScaleOperations: \"Large-Scale Operations\",\n DocumentIdEdgeCases: \"Document ID Edge Cases\",\n GapChecking: \"Gap Checking\",\n TransactionEncoding: \"Transaction Encoding\",\n} as const;\n\n// =============================================================================\n// Helper Functions\n// =============================================================================\n\nconst makeEntry = (version: number, timestamp?: number): WalEntry => ({\n transaction: Transaction.make([]),\n version,\n timestamp: timestamp ?? Date.now(),\n});\n\nconst makeEntryWithData = (\n version: number,\n data: unknown,\n timestamp?: number\n): WalEntry => ({\n transaction: Transaction.make([\n Operation.fromDefinition(OperationPath.make(\"data\"), TestSetDefinition, data),\n ]),\n version,\n timestamp: timestamp ?? Date.now(),\n});\n\nconst makeEntryWithPath = (\n version: number,\n pathString: string,\n payload: unknown,\n timestamp?: number\n): WalEntry => ({\n transaction: Transaction.make([\n Operation.fromDefinition(OperationPath.make(pathString), TestSetDefinition, payload),\n ]),\n version,\n timestamp: timestamp ?? Date.now(),\n});\n\n// =============================================================================\n// Test Definitions\n// =============================================================================\n\nconst tests: StorageTestCase<HotStorageTestError, HotStorageTag>[] = [\n // ---------------------------------------------------------------------------\n // Basic Operations\n // ---------------------------------------------------------------------------\n {\n name: \"getEntries returns empty array for non-existent document\",\n category: Categories.BasicOperations,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n const result = yield* storage.getEntries(\"non-existent-hot-doc\", 0);\n yield* assertEmpty(result, \"Should return empty array for non-existent document\");\n }),\n },\n\n {\n name: \"append then getEntries returns the entry\",\n category: Categories.BasicOperations,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n const entry = makeEntry(1);\n yield* storage.append(\"basic-append\", entry);\n const entries = yield* storage.getEntries(\"basic-append\", 0);\n yield* assertLength(entries, 1, \"Should have one entry\");\n yield* assertEqual(entries[0]!.version, 1, \"Entry version should match\");\n }),\n },\n\n {\n name: \"multiple append calls accumulate entries\",\n category: Categories.BasicOperations,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n yield* storage.append(\"multi-append\", makeEntry(1));\n yield* storage.append(\"multi-append\", makeEntry(2));\n yield* storage.append(\"multi-append\", makeEntry(3));\n const entries = yield* storage.getEntries(\"multi-append\", 0);\n yield* assertLength(entries, 3, \"Should have three entries\");\n }),\n },\n\n {\n name: \"truncate removes entries with version <= upToVersion\",\n category: Categories.BasicOperations,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n yield* storage.append(\"truncate-basic\", makeEntry(1));\n yield* storage.append(\"truncate-basic\", makeEntry(2));\n yield* storage.append(\"truncate-basic\", makeEntry(3));\n yield* storage.truncate(\"truncate-basic\", 2);\n const entries = yield* storage.getEntries(\"truncate-basic\", 0);\n yield* assertLength(entries, 1, \"Should have one entry after truncate\");\n yield* assertEqual(entries[0]!.version, 3, \"Only version 3 should remain\");\n }),\n },\n\n {\n name: \"truncate on non-existent document does not error\",\n category: Categories.BasicOperations,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n yield* storage.truncate(\"non-existent-truncate\", 100);\n }),\n },\n\n // ---------------------------------------------------------------------------\n // Version Filtering (Critical for Recovery)\n // ---------------------------------------------------------------------------\n {\n name: \"getEntries(doc, 0) returns all entries\",\n category: Categories.VersionFiltering,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n yield* storage.append(\"filter-all\", makeEntry(1));\n yield* storage.append(\"filter-all\", makeEntry(2));\n yield* storage.append(\"filter-all\", makeEntry(3));\n const entries = yield* storage.getEntries(\"filter-all\", 0);\n yield* assertLength(entries, 3, \"sinceVersion=0 should return all entries\");\n }),\n },\n\n {\n name: \"getEntries(doc, n) returns only entries with version > n\",\n category: Categories.VersionFiltering,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n yield* storage.append(\"filter-n\", makeEntry(1));\n yield* storage.append(\"filter-n\", makeEntry(2));\n yield* storage.append(\"filter-n\", makeEntry(3));\n yield* storage.append(\"filter-n\", makeEntry(4));\n const entries = yield* storage.getEntries(\"filter-n\", 2);\n yield* assertLength(entries, 2, \"Should return entries with version > 2\");\n yield* assertEqual(entries[0]!.version, 3, \"First entry should be version 3\");\n yield* assertEqual(entries[1]!.version, 4, \"Second entry should be version 4\");\n }),\n },\n\n {\n name: \"getEntries(doc, exactVersion) excludes that exact version\",\n category: Categories.VersionFiltering,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n yield* storage.append(\"filter-exact\", makeEntry(5));\n yield* storage.append(\"filter-exact\", makeEntry(6));\n yield* storage.append(\"filter-exact\", makeEntry(7));\n const entries = yield* storage.getEntries(\"filter-exact\", 6);\n yield* assertLength(entries, 1, \"Should exclude version 6\");\n yield* assertEqual(entries[0]!.version, 7, \"Only version 7 should be returned\");\n }),\n },\n\n {\n name: \"getEntries(doc, maxVersion) returns empty array\",\n category: Categories.VersionFiltering,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n yield* storage.append(\"filter-max\", makeEntry(1));\n yield* storage.append(\"filter-max\", makeEntry(2));\n yield* storage.append(\"filter-max\", makeEntry(3));\n const entries = yield* storage.getEntries(\"filter-max\", 3);\n yield* assertEmpty(entries, \"sinceVersion >= maxVersion should return empty\");\n }),\n },\n\n {\n name: \"getEntries(doc, MAX_SAFE_INTEGER) returns empty array\",\n category: Categories.VersionFiltering,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n yield* storage.append(\"filter-huge\", makeEntry(1));\n yield* storage.append(\"filter-huge\", makeEntry(1000000));\n const entries = yield* storage.getEntries(\"filter-huge\", Number.MAX_SAFE_INTEGER);\n yield* assertEmpty(entries, \"sinceVersion=MAX_SAFE_INTEGER should return empty\");\n }),\n },\n\n // ---------------------------------------------------------------------------\n // Ordering Guarantees\n // ---------------------------------------------------------------------------\n {\n name: \"entries returned sorted by version ascending\",\n category: Categories.OrderingGuarantees,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n yield* storage.append(\"order-test\", makeEntry(1));\n yield* storage.append(\"order-test\", makeEntry(2));\n yield* storage.append(\"order-test\", makeEntry(3));\n const entries = yield* storage.getEntries(\"order-test\", 0);\n yield* assertSortedBy(entries, \"version\", \"Entries should be sorted by version\");\n }),\n },\n\n {\n name: \"out-of-order appends are sorted correctly on retrieval\",\n category: Categories.OrderingGuarantees,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n yield* storage.append(\"ooo-test\", makeEntry(3));\n yield* storage.append(\"ooo-test\", makeEntry(1));\n yield* storage.append(\"ooo-test\", makeEntry(4));\n yield* storage.append(\"ooo-test\", makeEntry(2));\n const entries = yield* storage.getEntries(\"ooo-test\", 0);\n yield* assertLength(entries, 4, \"Should have all 4 entries\");\n yield* assertEqual(entries[0]!.version, 1, \"First should be version 1\");\n yield* assertEqual(entries[1]!.version, 2, \"Second should be version 2\");\n yield* assertEqual(entries[2]!.version, 3, \"Third should be version 3\");\n yield* assertEqual(entries[3]!.version, 4, \"Fourth should be version 4\");\n }),\n },\n\n // ---------------------------------------------------------------------------\n // Truncation Edge Cases\n // ---------------------------------------------------------------------------\n {\n name: \"truncate(doc, 0) removes nothing (versions > 0 kept)\",\n category: Categories.TruncationEdgeCases,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n yield* storage.append(\"trunc-0\", makeEntry(1));\n yield* storage.append(\"trunc-0\", makeEntry(2));\n yield* storage.truncate(\"trunc-0\", 0);\n const entries = yield* storage.getEntries(\"trunc-0\", 0);\n yield* assertLength(entries, 2, \"truncate(0) should keep all entries with version > 0\");\n }),\n },\n\n {\n name: \"truncate(doc, maxVersion) removes all entries\",\n category: Categories.TruncationEdgeCases,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n yield* storage.append(\"trunc-all\", makeEntry(1));\n yield* storage.append(\"trunc-all\", makeEntry(2));\n yield* storage.append(\"trunc-all\", makeEntry(3));\n yield* storage.truncate(\"trunc-all\", 3);\n const entries = yield* storage.getEntries(\"trunc-all\", 0);\n yield* assertEmpty(entries, \"truncate(maxVersion) should remove all entries\");\n }),\n },\n\n {\n name: \"truncate(doc, middleVersion) removes correct entries\",\n category: Categories.TruncationEdgeCases,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n yield* storage.append(\"trunc-mid\", makeEntry(1));\n yield* storage.append(\"trunc-mid\", makeEntry(2));\n yield* storage.append(\"trunc-mid\", makeEntry(3));\n yield* storage.append(\"trunc-mid\", makeEntry(4));\n yield* storage.append(\"trunc-mid\", makeEntry(5));\n yield* storage.truncate(\"trunc-mid\", 3);\n const entries = yield* storage.getEntries(\"trunc-mid\", 0);\n yield* assertLength(entries, 2, \"Should keep versions 4 and 5\");\n yield* assertEqual(entries[0]!.version, 4, \"First remaining should be 4\");\n yield* assertEqual(entries[1]!.version, 5, \"Second remaining should be 5\");\n }),\n },\n\n {\n name: \"multiple truncates work correctly\",\n category: Categories.TruncationEdgeCases,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n yield* storage.append(\"multi-trunc\", makeEntry(1));\n yield* storage.append(\"multi-trunc\", makeEntry(2));\n yield* storage.append(\"multi-trunc\", makeEntry(3));\n yield* storage.append(\"multi-trunc\", makeEntry(4));\n yield* storage.append(\"multi-trunc\", makeEntry(5));\n yield* storage.truncate(\"multi-trunc\", 2);\n yield* storage.truncate(\"multi-trunc\", 4);\n const entries = yield* storage.getEntries(\"multi-trunc\", 0);\n yield* assertLength(entries, 1, \"Should only have version 5\");\n yield* assertEqual(entries[0]!.version, 5, \"Only version 5 should remain\");\n }),\n },\n\n {\n name: \"truncate followed by append works correctly\",\n category: Categories.TruncationEdgeCases,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n yield* storage.append(\"trunc-append\", makeEntry(1));\n yield* storage.append(\"trunc-append\", makeEntry(2));\n yield* storage.truncate(\"trunc-append\", 2);\n yield* storage.append(\"trunc-append\", makeEntry(3));\n yield* storage.append(\"trunc-append\", makeEntry(4));\n const entries = yield* storage.getEntries(\"trunc-append\", 0);\n yield* assertLength(entries, 2, \"Should have versions 3 and 4\");\n yield* assertEqual(entries[0]!.version, 3, \"First should be 3\");\n yield* assertEqual(entries[1]!.version, 4, \"Second should be 4\");\n }),\n },\n\n // ---------------------------------------------------------------------------\n // WAL Entry Data Integrity\n // ---------------------------------------------------------------------------\n {\n name: \"transaction data is preserved exactly\",\n category: Categories.WalEntryIntegrity,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n const entry = makeEntryWithData(1, { key: \"value\", nested: { a: 1 } });\n yield* storage.append(\"tx-data\", entry);\n const entries = yield* storage.getEntries(\"tx-data\", 0);\n yield* assertLength(entries, 1, \"Should have one entry\");\n yield* assertEqual(\n entries[0]!.transaction,\n entry.transaction,\n \"Transaction should be preserved exactly\"\n );\n }),\n },\n\n {\n name: \"version number is preserved exactly\",\n category: Categories.WalEntryIntegrity,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n const version = 42;\n const entry = makeEntry(version);\n yield* storage.append(\"version-preserve\", entry);\n const entries = yield* storage.getEntries(\"version-preserve\", 0);\n yield* assertEqual(entries[0]!.version, version, \"Version should be preserved exactly\");\n }),\n },\n\n {\n name: \"timestamp is preserved exactly\",\n category: Categories.WalEntryIntegrity,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n const timestamp = 1704067200000;\n const entry = makeEntry(1, timestamp);\n yield* storage.append(\"timestamp-preserve\", entry);\n const entries = yield* storage.getEntries(\"timestamp-preserve\", 0);\n yield* assertEqual(\n entries[0]!.timestamp,\n timestamp,\n \"Timestamp should be preserved exactly\"\n );\n }),\n },\n\n {\n name: \"complex transaction operations survive roundtrip\",\n category: Categories.WalEntryIntegrity,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n const entry: WalEntry = {\n transaction: Transaction.make([\n Operation.fromDefinition(OperationPath.make(\"a\"), TestSetDefinition, 1),\n Operation.fromDefinition(OperationPath.make(\"b/c\"), TestSetDefinition, \"nested\"),\n Operation.fromDefinition(OperationPath.make(\"arr\"), TestSetDefinition, [1, 2, 3]),\n ]),\n version: 1,\n timestamp: Date.now(),\n };\n yield* storage.append(\"complex-tx\", entry);\n const entries = yield* storage.getEntries(\"complex-tx\", 0);\n yield* assertEqual(\n entries[0]!.transaction,\n entry.transaction,\n \"Complex transaction should survive roundtrip\"\n );\n }),\n },\n\n // ---------------------------------------------------------------------------\n // Document Isolation\n // ---------------------------------------------------------------------------\n {\n name: \"different documents have independent entry lists\",\n category: Categories.DocumentIsolation,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n yield* storage.append(\"iso-hot-1\", makeEntry(1));\n yield* storage.append(\"iso-hot-1\", makeEntry(2));\n yield* storage.append(\"iso-hot-2\", makeEntry(10));\n const entries1 = yield* storage.getEntries(\"iso-hot-1\", 0);\n const entries2 = yield* storage.getEntries(\"iso-hot-2\", 0);\n yield* assertLength(entries1, 2, \"Doc 1 should have 2 entries\");\n yield* assertLength(entries2, 1, \"Doc 2 should have 1 entry\");\n yield* assertEqual(entries1[0]!.version, 1, \"Doc 1 first entry version\");\n yield* assertEqual(entries2[0]!.version, 10, \"Doc 2 first entry version\");\n }),\n },\n\n {\n name: \"appending to one doc does not affect others\",\n category: Categories.DocumentIsolation,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n yield* storage.append(\"append-iso-1\", makeEntry(1));\n const beforeAppend = yield* storage.getEntries(\"append-iso-1\", 0);\n yield* storage.append(\"append-iso-2\", makeEntry(100));\n yield* storage.append(\"append-iso-2\", makeEntry(101));\n const afterAppend = yield* storage.getEntries(\"append-iso-1\", 0);\n yield* assertEqual(\n beforeAppend.length,\n afterAppend.length,\n \"Appending to doc 2 should not affect doc 1\"\n );\n }),\n },\n\n {\n name: \"truncating one doc does not affect others\",\n category: Categories.DocumentIsolation,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n yield* storage.append(\"trunc-iso-1\", makeEntry(1));\n yield* storage.append(\"trunc-iso-1\", makeEntry(2));\n yield* storage.append(\"trunc-iso-2\", makeEntry(1));\n yield* storage.append(\"trunc-iso-2\", makeEntry(2));\n yield* storage.truncate(\"trunc-iso-1\", 2);\n const entries1 = yield* storage.getEntries(\"trunc-iso-1\", 0);\n const entries2 = yield* storage.getEntries(\"trunc-iso-2\", 0);\n yield* assertEmpty(entries1, \"Doc 1 should be empty after truncate\");\n yield* assertLength(entries2, 2, \"Doc 2 should still have 2 entries\");\n }),\n },\n\n // ---------------------------------------------------------------------------\n // Large-Scale Operations\n // ---------------------------------------------------------------------------\n {\n name: \"handle 1000+ entries per document\",\n category: Categories.LargeScaleOperations,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n const count = 1000;\n for (let i = 1; i <= count; i++) {\n yield* storage.append(\"large-entries\", makeEntry(i));\n }\n const entries = yield* storage.getEntries(\"large-entries\", 0);\n yield* assertLength(entries, count, `Should have ${count} entries`);\n yield* assertSortedBy(entries, \"version\", \"Should be sorted by version\");\n yield* assertEqual(entries[0]!.version, 1, \"First should be version 1\");\n yield* assertEqual(entries[count - 1]!.version, count, `Last should be version ${count}`);\n }),\n },\n\n {\n name: \"handle 100+ documents\",\n category: Categories.LargeScaleOperations,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n const docCount = 100;\n for (let i = 0; i < docCount; i++) {\n yield* storage.append(`multi-doc-${i}`, makeEntry(1));\n yield* storage.append(`multi-doc-${i}`, makeEntry(2));\n }\n let totalEntries = 0;\n for (let i = 0; i < docCount; i++) {\n const entries = yield* storage.getEntries(`multi-doc-${i}`, 0);\n totalEntries += entries.length;\n yield* assertLength(entries, 2, `Doc ${i} should have 2 entries`);\n }\n yield* assertEqual(totalEntries, docCount * 2, \"Total entries should match\");\n }),\n },\n\n {\n name: \"large transaction data (10KB+) survives roundtrip\",\n category: Categories.LargeScaleOperations,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n const largeData = \"x\".repeat(10 * 1024);\n const entry = makeEntryWithData(1, { content: largeData });\n yield* storage.append(\"large-tx\", entry);\n const entries = yield* storage.getEntries(\"large-tx\", 0);\n yield* assertLength(entries, 1, \"Should have one entry\");\n yield* assertEqual(\n entries[0]!.transaction,\n entry.transaction,\n \"Large transaction data should survive roundtrip\"\n );\n }),\n },\n\n // ---------------------------------------------------------------------------\n // Document ID Edge Cases\n // ---------------------------------------------------------------------------\n {\n name: \"long documentId (1000+ chars) works\",\n category: Categories.DocumentIdEdgeCases,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n const longId = \"h\".repeat(1000);\n const entry = makeEntry(1);\n yield* storage.append(longId, entry);\n const entries = yield* storage.getEntries(longId, 0);\n yield* assertLength(entries, 1, \"Long documentId should work\");\n }),\n },\n\n {\n name: \"unicode documentId works\",\n category: Categories.DocumentIdEdgeCases,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n const unicodeId = \"hot-doc-id\";\n const entry = makeEntry(1);\n yield* storage.append(unicodeId, entry);\n const entries = yield* storage.getEntries(unicodeId, 0);\n yield* assertLength(entries, 1, \"Unicode documentId should work\");\n }),\n },\n\n {\n name: \"documentId with special chars works\",\n category: Categories.DocumentIdEdgeCases,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n const specialId = \"hot/path:to.wal\";\n const entry = makeEntry(1);\n yield* storage.append(specialId, entry);\n const entries = yield* storage.getEntries(specialId, 0);\n yield* assertLength(entries, 1, \"DocumentId with special chars should work\");\n }),\n },\n\n {\n name: \"documentId with spaces works\",\n category: Categories.DocumentIdEdgeCases,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n const spacedId = \"hot doc with spaces\";\n const entry = makeEntry(1);\n yield* storage.append(spacedId, entry);\n const entries = yield* storage.getEntries(spacedId, 0);\n yield* assertLength(entries, 1, \"DocumentId with spaces should work\");\n }),\n },\n\n {\n name: \"version 0 entry is handled correctly\",\n category: Categories.VersionFiltering,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n yield* storage.append(\"version-0-entry\", makeEntry(0));\n yield* storage.append(\"version-0-entry\", makeEntry(1));\n const entriesFromNeg = yield* storage.getEntries(\"version-0-entry\", -1);\n yield* assertTrue(\n entriesFromNeg.some((e) => e.version === 0),\n \"Version 0 entry should be retrievable with sinceVersion < 0\"\n );\n const entriesFrom0 = yield* storage.getEntries(\"version-0-entry\", 0);\n yield* assertTrue(\n !entriesFrom0.some((e) => e.version === 0),\n \"Version 0 entry should be excluded with sinceVersion = 0\"\n );\n }),\n },\n\n // ---------------------------------------------------------------------------\n // Gap Checking (appendWithCheck)\n // ---------------------------------------------------------------------------\n {\n name: \"appendWithCheck succeeds for first entry (expectedVersion=1)\",\n category: Categories.GapChecking,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n const entry = makeEntry(1);\n yield* storage.appendWithCheck(\"gap-check-first\", entry, 1);\n const entries = yield* storage.getEntries(\"gap-check-first\", 0);\n yield* assertLength(entries, 1, \"Should have one entry\");\n yield* assertEqual(entries[0]!.version, 1, \"Entry version should be 1\");\n }),\n },\n\n {\n name: \"appendWithCheck succeeds for consecutive versions\",\n category: Categories.GapChecking,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n yield* storage.appendWithCheck(\"gap-check-consecutive\", makeEntry(1), 1);\n yield* storage.appendWithCheck(\"gap-check-consecutive\", makeEntry(2), 2);\n yield* storage.appendWithCheck(\"gap-check-consecutive\", makeEntry(3), 3);\n const entries = yield* storage.getEntries(\"gap-check-consecutive\", 0);\n yield* assertLength(entries, 3, \"Should have three entries\");\n yield* assertEqual(entries[0]!.version, 1, \"First entry version should be 1\");\n yield* assertEqual(entries[1]!.version, 2, \"Second entry version should be 2\");\n yield* assertEqual(entries[2]!.version, 3, \"Third entry version should be 3\");\n }),\n },\n\n {\n name: \"appendWithCheck fails for version gap (skipping version 2)\",\n category: Categories.GapChecking,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n yield* storage.appendWithCheck(\"gap-check-fail\", makeEntry(1), 1);\n // Attempt to append version 3, skipping version 2\n const result = yield* Effect.either(\n storage.appendWithCheck(\"gap-check-fail\", makeEntry(3), 3)\n );\n yield* assertTrue(\n result._tag === \"Left\",\n \"appendWithCheck should fail when there's a version gap\"\n );\n if (result._tag === \"Left\") {\n yield* assertTrue(\n result.left._tag === \"WalVersionGapError\",\n \"Error should be WalVersionGapError\"\n );\n }\n // Verify version 3 was not appended\n const entries = yield* storage.getEntries(\"gap-check-fail\", 0);\n yield* assertLength(entries, 1, \"Should only have version 1\");\n yield* assertEqual(entries[0]!.version, 1, \"Only version 1 should exist\");\n }),\n },\n\n {\n name: \"appendWithCheck fails if first entry is not version 1\",\n category: Categories.GapChecking,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n // Attempt to append version 2 as first entry (expecting gap error)\n const result = yield* Effect.either(\n storage.appendWithCheck(\"gap-check-not-first\", makeEntry(2), 2)\n );\n yield* assertTrue(\n result._tag === \"Left\",\n \"appendWithCheck should fail when first entry is not version 1\"\n );\n if (result._tag === \"Left\") {\n yield* assertTrue(\n result.left._tag === \"WalVersionGapError\",\n \"Error should be WalVersionGapError\"\n );\n }\n // Verify nothing was appended\n const entries = yield* storage.getEntries(\"gap-check-not-first\", 0);\n yield* assertEmpty(entries, \"No entries should exist after failed append\");\n }),\n },\n\n {\n name: \"appendWithCheck fails when entry already exists at expectedVersion\",\n category: Categories.GapChecking,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n yield* storage.appendWithCheck(\"gap-check-duplicate\", makeEntry(1), 1);\n // Attempt to append another version 1\n const result = yield* Effect.either(\n storage.appendWithCheck(\"gap-check-duplicate\", makeEntry(1), 1)\n );\n yield* assertTrue(\n result._tag === \"Left\",\n \"appendWithCheck should fail when version already exists\"\n );\n // Verify still only one entry\n const entries = yield* storage.getEntries(\"gap-check-duplicate\", 0);\n yield* assertLength(entries, 1, \"Should still only have one entry\");\n }),\n },\n\n {\n name: \"appendWithCheck after truncate works correctly\",\n category: Categories.GapChecking,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n // Append versions 1, 2, 3\n yield* storage.appendWithCheck(\"gap-check-truncate\", makeEntry(1), 1);\n yield* storage.appendWithCheck(\"gap-check-truncate\", makeEntry(2), 2);\n yield* storage.appendWithCheck(\"gap-check-truncate\", makeEntry(3), 3);\n // Truncate up to version 2\n yield* storage.truncate(\"gap-check-truncate\", 2);\n // Now append version 4 (should succeed since last entry is version 3)\n yield* storage.appendWithCheck(\"gap-check-truncate\", makeEntry(4), 4);\n const entries = yield* storage.getEntries(\"gap-check-truncate\", 0);\n yield* assertLength(entries, 2, \"Should have versions 3 and 4\");\n yield* assertEqual(entries[0]!.version, 3, \"First should be version 3\");\n yield* assertEqual(entries[1]!.version, 4, \"Second should be version 4\");\n }),\n },\n\n {\n name: \"appendWithCheck with baseVersion after full truncate works\",\n category: Categories.GapChecking,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n // Append versions 1, 2, 3\n yield* storage.appendWithCheck(\"gap-base-version\", makeEntry(1), 1, 0);\n yield* storage.appendWithCheck(\"gap-base-version\", makeEntry(2), 2, 0);\n yield* storage.appendWithCheck(\"gap-base-version\", makeEntry(3), 3, 0);\n // Truncate ALL entries (simulates snapshot at version 3)\n yield* storage.truncate(\"gap-base-version\", 3);\n // Verify WAL is empty\n const entriesAfterTruncate = yield* storage.getEntries(\"gap-base-version\", 0);\n yield* assertEmpty(entriesAfterTruncate, \"WAL should be empty after full truncate\");\n // Append version 4 WITH baseVersion=3 (simulates knowing snapshot version)\n yield* storage.appendWithCheck(\"gap-base-version\", makeEntry(4), 4, 3);\n const entries = yield* storage.getEntries(\"gap-base-version\", 0);\n yield* assertLength(entries, 1, \"Should have version 4\");\n yield* assertEqual(entries[0]!.version, 4, \"Entry should be version 4\");\n }),\n },\n\n {\n name: \"appendWithCheck with baseVersion still detects gaps\",\n category: Categories.GapChecking,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n // Truncate (to establish empty WAL scenario)\n yield* storage.truncate(\"gap-base-detect\", 5);\n // Try to append version 7 with baseVersion=5 (skipping version 6)\n const result = yield* Effect.either(\n storage.appendWithCheck(\"gap-base-detect\", makeEntry(7), 7, 5)\n );\n yield* assertTrue(result._tag === \"Left\", \"Should fail when skipping version 6\");\n if (result._tag === \"Left\") {\n yield* assertTrue(\n result.left._tag === \"WalVersionGapError\",\n \"Error should be WalVersionGapError\"\n );\n }\n }),\n },\n\n {\n name: \"appendWithCheck with baseVersion=0 allows version 1\",\n category: Categories.GapChecking,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n // New document scenario: baseVersion=0, first entry should be version 1\n yield* storage.appendWithCheck(\"gap-base-zero\", makeEntry(1), 1, 0);\n const entries = yield* storage.getEntries(\"gap-base-zero\", 0);\n yield* assertLength(entries, 1, \"Should have version 1\");\n yield* assertEqual(entries[0]!.version, 1, \"Entry should be version 1\");\n }),\n },\n\n // ---------------------------------------------------------------------------\n // Transaction Encoding (Critical for OperationPath preservation)\n // ---------------------------------------------------------------------------\n {\n name: \"OperationPath has _tag after roundtrip\",\n category: Categories.TransactionEncoding,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n const entry = makeEntryWithPath(1, \"users/0/name\", \"Alice\");\n yield* storage.append(\"op-path-tag\", entry);\n const entries = yield* storage.getEntries(\"op-path-tag\", 0);\n yield* assertLength(entries, 1, \"Should have one entry\");\n const op = entries[0]!.transaction.ops[0]!;\n yield* assertTrue(\n op.path._tag === \"OperationPath\",\n \"path should have _tag 'OperationPath'\"\n );\n }),\n },\n\n {\n name: \"OperationPath.toTokens() works after roundtrip\",\n category: Categories.TransactionEncoding,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n const entry = makeEntryWithPath(1, \"users/0/name\", \"Alice\");\n yield* storage.append(\"op-path-tokens\", entry);\n const entries = yield* storage.getEntries(\"op-path-tokens\", 0);\n yield* assertLength(entries, 1, \"Should have one entry\");\n const op = entries[0]!.transaction.ops[0]!;\n yield* assertTrue(\n typeof op.path.toTokens === \"function\",\n \"path.toTokens should be a function\"\n );\n const tokens = op.path.toTokens();\n yield* assertEqual(\n tokens,\n [\"users\", \"0\", \"name\"],\n \"toTokens() should return correct path tokens\"\n );\n }),\n },\n\n {\n name: \"OperationPath.concat() works after roundtrip\",\n category: Categories.TransactionEncoding,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n const entry = makeEntryWithPath(1, \"users/0\", { name: \"Alice\" });\n yield* storage.append(\"op-path-concat\", entry);\n const entries = yield* storage.getEntries(\"op-path-concat\", 0);\n yield* assertLength(entries, 1, \"Should have one entry\");\n const op = entries[0]!.transaction.ops[0]!;\n yield* assertTrue(\n typeof op.path.concat === \"function\",\n \"path.concat should be a function\"\n );\n const extended = op.path.concat(OperationPath.make(\"name\"));\n yield* assertEqual(\n extended.toTokens(),\n [\"users\", \"0\", \"name\"],\n \"concat() should work correctly\"\n );\n }),\n },\n\n {\n name: \"OperationPath.append() works after roundtrip\",\n category: Categories.TransactionEncoding,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n const entry = makeEntryWithPath(1, \"users\", []);\n yield* storage.append(\"op-path-append\", entry);\n const entries = yield* storage.getEntries(\"op-path-append\", 0);\n yield* assertLength(entries, 1, \"Should have one entry\");\n const op = entries[0]!.transaction.ops[0]!;\n yield* assertTrue(\n typeof op.path.append === \"function\",\n \"path.append should be a function\"\n );\n const extended = op.path.append(\"0\");\n yield* assertEqual(\n extended.toTokens(),\n [\"users\", \"0\"],\n \"append() should work correctly\"\n );\n }),\n },\n\n {\n name: \"OperationPath.pop() works after roundtrip\",\n category: Categories.TransactionEncoding,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n const entry = makeEntryWithPath(1, \"users/0/name\", \"Alice\");\n yield* storage.append(\"op-path-pop\", entry);\n const entries = yield* storage.getEntries(\"op-path-pop\", 0);\n yield* assertLength(entries, 1, \"Should have one entry\");\n const op = entries[0]!.transaction.ops[0]!;\n yield* assertTrue(\n typeof op.path.pop === \"function\",\n \"path.pop should be a function\"\n );\n const popped = op.path.pop();\n yield* assertEqual(\n popped.toTokens(),\n [\"users\", \"0\"],\n \"pop() should remove last token\"\n );\n }),\n },\n\n {\n name: \"OperationPath.shift() works after roundtrip\",\n category: Categories.TransactionEncoding,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n const entry = makeEntryWithPath(1, \"users/0/name\", \"Alice\");\n yield* storage.append(\"op-path-shift\", entry);\n const entries = yield* storage.getEntries(\"op-path-shift\", 0);\n yield* assertLength(entries, 1, \"Should have one entry\");\n const op = entries[0]!.transaction.ops[0]!;\n yield* assertTrue(\n typeof op.path.shift === \"function\",\n \"path.shift should be a function\"\n );\n const shifted = op.path.shift();\n yield* assertEqual(\n shifted.toTokens(),\n [\"0\", \"name\"],\n \"shift() should remove first token\"\n );\n }),\n },\n\n {\n name: \"transaction with multiple operations preserves all OperationPaths\",\n category: Categories.TransactionEncoding,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n const entry: WalEntry = {\n transaction: Transaction.make([\n Operation.fromDefinition(OperationPath.make(\"users/0/name\"), TestSetDefinition, \"Alice\"),\n Operation.fromDefinition(OperationPath.make(\"users/1/name\"), TestSetDefinition, \"Bob\"),\n Operation.fromDefinition(OperationPath.make(\"count\"), TestSetDefinition, 2),\n ]),\n version: 1,\n timestamp: Date.now(),\n };\n yield* storage.append(\"multi-op-paths\", entry);\n const entries = yield* storage.getEntries(\"multi-op-paths\", 0);\n yield* assertLength(entries, 1, \"Should have one entry\");\n const ops = entries[0]!.transaction.ops;\n yield* assertLength([...ops], 3, \"Should have 3 operations\");\n // Verify all paths have working methods\n for (const op of ops) {\n yield* assertTrue(\n op.path._tag === \"OperationPath\",\n \"Each operation path should have _tag\"\n );\n yield* assertTrue(\n typeof op.path.toTokens === \"function\",\n \"Each operation path should have toTokens method\"\n );\n }\n yield* assertEqual(\n ops[0]!.path.toTokens(),\n [\"users\", \"0\", \"name\"],\n \"First path should be correct\"\n );\n yield* assertEqual(\n ops[1]!.path.toTokens(),\n [\"users\", \"1\", \"name\"],\n \"Second path should be correct\"\n );\n yield* assertEqual(\n ops[2]!.path.toTokens(),\n [\"count\"],\n \"Third path should be correct\"\n );\n }),\n },\n\n {\n name: \"nested path with many segments survives roundtrip\",\n category: Categories.TransactionEncoding,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n const deepPath = \"level1/level2/level3/level4/level5\";\n const entry = makeEntryWithPath(1, deepPath, \"deep value\");\n yield* storage.append(\"deep-path\", entry);\n const entries = yield* storage.getEntries(\"deep-path\", 0);\n yield* assertLength(entries, 1, \"Should have one entry\");\n const op = entries[0]!.transaction.ops[0]!;\n yield* assertEqual(\n op.path.toTokens(),\n [\"level1\", \"level2\", \"level3\", \"level4\", \"level5\"],\n \"Deep nested path should survive roundtrip\"\n );\n }),\n },\n\n {\n name: \"empty path survives roundtrip\",\n category: Categories.TransactionEncoding,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n const entry = makeEntryWithPath(1, \"\", { root: true });\n yield* storage.append(\"empty-path\", entry);\n const entries = yield* storage.getEntries(\"empty-path\", 0);\n yield* assertLength(entries, 1, \"Should have one entry\");\n const op = entries[0]!.transaction.ops[0]!;\n yield* assertTrue(\n op.path._tag === \"OperationPath\",\n \"Empty path should still be OperationPath\"\n );\n yield* assertTrue(\n typeof op.path.toTokens === \"function\",\n \"Empty path should have toTokens method\"\n );\n }),\n },\n\n {\n name: \"transaction id is preserved after roundtrip\",\n category: Categories.TransactionEncoding,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n const entry = makeEntryWithPath(1, \"test\", \"value\");\n const originalId = entry.transaction.id;\n yield* storage.append(\"tx-id-preserve\", entry);\n const entries = yield* storage.getEntries(\"tx-id-preserve\", 0);\n yield* assertLength(entries, 1, \"Should have one entry\");\n yield* assertEqual(\n entries[0]!.transaction.id,\n originalId,\n \"Transaction id should be preserved\"\n );\n }),\n },\n\n {\n name: \"transaction timestamp is preserved after roundtrip\",\n category: Categories.TransactionEncoding,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n const entry = makeEntryWithPath(1, \"test\", \"value\");\n const originalTimestamp = entry.transaction.timestamp;\n yield* storage.append(\"tx-timestamp-preserve\", entry);\n const entries = yield* storage.getEntries(\"tx-timestamp-preserve\", 0);\n yield* assertLength(entries, 1, \"Should have one entry\");\n yield* assertEqual(\n entries[0]!.transaction.timestamp,\n originalTimestamp,\n \"Transaction timestamp should be preserved\"\n );\n }),\n },\n\n {\n name: \"operation kind is preserved after roundtrip\",\n category: Categories.TransactionEncoding,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n const entry: WalEntry = {\n transaction: Transaction.make([\n Operation.fromDefinition(OperationPath.make(\"data\"), CustomOpDefinition, \"test\"),\n ]),\n version: 1,\n timestamp: Date.now(),\n };\n yield* storage.append(\"op-kind-preserve\", entry);\n const entries = yield* storage.getEntries(\"op-kind-preserve\", 0);\n yield* assertLength(entries, 1, \"Should have one entry\");\n yield* assertEqual(\n entries[0]!.transaction.ops[0]!.kind,\n \"custom.operation\",\n \"Operation kind should be preserved\"\n );\n }),\n },\n\n {\n name: \"operation payload with complex object survives roundtrip\",\n category: Categories.TransactionEncoding,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n const complexPayload = {\n nested: { value: 42, array: [1, 2, 3] },\n nullValue: null,\n string: \"test\",\n };\n const entry = makeEntryWithPath(1, \"data\", complexPayload);\n yield* storage.append(\"complex-payload\", entry);\n const entries = yield* storage.getEntries(\"complex-payload\", 0);\n yield* assertLength(entries, 1, \"Should have one entry\");\n yield* assertEqual(\n entries[0]!.transaction.ops[0]!.payload,\n complexPayload,\n \"Complex payload should survive roundtrip\"\n );\n }),\n },\n];\n\n// =============================================================================\n// Exports\n// =============================================================================\n\n/**\n * Get all HotStorage test cases.\n *\n * @returns Array of test cases that require HotStorageTag\n */\nexport const makeTests = (): StorageTestCase<\n HotStorageTestError,\n HotStorageTag\n>[] => tests;\n\n/**\n * Run all tests and collect results.\n *\n * @returns Effect that produces TestResults\n */\nexport const runAll = (): Effect.Effect<\n TestResults<HotStorageTestError, HotStorageTag>,\n never,\n HotStorageTag\n> =>\n Effect.gen(function* () {\n const passed: StorageTestCase<HotStorageTestError, HotStorageTag>[] = [];\n const failed: Array<{\n test: StorageTestCase<HotStorageTestError, HotStorageTag>;\n error: HotStorageTestError;\n }> = [];\n\n for (const test of tests) {\n const result = yield* Effect.either(test.run);\n if (result._tag === \"Right\") {\n passed.push(test);\n } else {\n failed.push({ test, error: result.left });\n }\n }\n\n return {\n passed,\n failed,\n total: tests.length,\n passCount: passed.length,\n failCount: failed.length,\n };\n });\n\nexport const HotStorageTestSuite = {\n Categories,\n makeTests,\n runAll,\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"HotStorageTestSuite.mjs","names":["tests: StorageTestCase<HotStorageTestError, HotStorageTag>[]","entry: WalEntry","passed: StorageTestCase<HotStorageTestError, HotStorageTag>[]","failed: Array<{\n test: StorageTestCase<HotStorageTestError, HotStorageTag>;\n error: HotStorageTestError;\n }>"],"sources":["../../src/testing/HotStorageTestSuite.ts"],"sourcesContent":["/**\n * @voidhash/mimic-effect/testing - HotStorage Test Suite\n *\n * Comprehensive test suite for HotStorage (WAL) adapter implementations.\n * These tests verify that an adapter correctly implements the HotStorage interface\n * and can reliably store/retrieve WAL entries for document recovery.\n */\nimport { Effect, Schema } from \"effect\";\nimport { Transaction, OperationPath, Operation, OperationDefinition } from \"@voidhash/mimic\";\nimport { HotStorageTag } from \"../HotStorage\";\nimport { type HotStorageError, WalVersionGapError } from \"../Errors\";\nimport type { WalEntry } from \"../Types\";\nimport type { StorageTestCase, TestResults } from \"./types\";\nimport { TestError } from \"./types\";\nimport {\n assertEqual,\n assertLength,\n assertEmpty,\n assertSortedBy,\n assertTrue,\n} from \"./assertions\";\n\n/**\n * Error type for HotStorage tests - can be either a TestError, HotStorageError, or WalVersionGapError\n */\nexport type HotStorageTestError = TestError | HotStorageError | WalVersionGapError;\n\n// =============================================================================\n// Test Operation Definitions\n// =============================================================================\n\n/**\n * Test operation definition for creating proper Operation objects in tests.\n * Using Schema.Unknown allows any payload type for flexibility in testing.\n */\nconst TestSetDefinition = OperationDefinition.make({\n kind: \"test.set\" as const,\n payload: Schema.Unknown,\n target: Schema.Unknown,\n apply: (payload: unknown) => payload,\n});\n\n/**\n * Custom operation definition for testing operation kind preservation.\n */\nconst CustomOpDefinition = OperationDefinition.make({\n kind: \"custom.operation\" as const,\n payload: Schema.Unknown,\n target: Schema.Unknown,\n apply: (payload: unknown) => payload,\n});\n\n// =============================================================================\n// Categories\n// =============================================================================\n\nexport const Categories = {\n BasicOperations: \"Basic Operations\",\n VersionFiltering: \"Version Filtering\",\n OrderingGuarantees: \"Ordering Guarantees\",\n TruncationEdgeCases: \"Truncation Edge Cases\",\n WalEntryIntegrity: \"WAL Entry Integrity\",\n DocumentIsolation: \"Document Isolation\",\n LargeScaleOperations: \"Large-Scale Operations\",\n DocumentIdEdgeCases: \"Document ID Edge Cases\",\n GapChecking: \"Gap Checking\",\n TransactionEncoding: \"Transaction Encoding\",\n} as const;\n\n// =============================================================================\n// Helper Functions\n// =============================================================================\n\nconst makeEntry = (version: number, timestamp?: number): WalEntry => ({\n transaction: Transaction.make([]),\n version,\n timestamp: timestamp ?? Date.now(),\n});\n\nconst makeEntryWithData = (\n version: number,\n data: unknown,\n timestamp?: number\n): WalEntry => ({\n transaction: Transaction.make([\n Operation.fromDefinition(OperationPath.make(\"data\"), TestSetDefinition, data),\n ]),\n version,\n timestamp: timestamp ?? Date.now(),\n});\n\nconst makeEntryWithPath = (\n version: number,\n pathString: string,\n payload: unknown,\n timestamp?: number\n): WalEntry => ({\n transaction: Transaction.make([\n Operation.fromDefinition(OperationPath.make(pathString), TestSetDefinition, payload),\n ]),\n version,\n timestamp: timestamp ?? Date.now(),\n});\n\n// =============================================================================\n// Test Definitions\n// =============================================================================\n\nconst tests: StorageTestCase<HotStorageTestError, HotStorageTag>[] = [\n // ---------------------------------------------------------------------------\n // Basic Operations\n // ---------------------------------------------------------------------------\n {\n name: \"getEntries returns empty array for non-existent document\",\n category: Categories.BasicOperations,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n const result = yield* storage.getEntries(\"non-existent-hot-doc\", 0);\n yield* assertEmpty(result, \"Should return empty array for non-existent document\");\n }),\n },\n\n {\n name: \"append then getEntries returns the entry\",\n category: Categories.BasicOperations,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n const entry = makeEntry(1);\n yield* storage.append(\"basic-append\", entry);\n const entries = yield* storage.getEntries(\"basic-append\", 0);\n yield* assertLength(entries, 1, \"Should have one entry\");\n yield* assertEqual(entries[0]!.version, 1, \"Entry version should match\");\n }),\n },\n\n {\n name: \"multiple append calls accumulate entries\",\n category: Categories.BasicOperations,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n yield* storage.append(\"multi-append\", makeEntry(1));\n yield* storage.append(\"multi-append\", makeEntry(2));\n yield* storage.append(\"multi-append\", makeEntry(3));\n const entries = yield* storage.getEntries(\"multi-append\", 0);\n yield* assertLength(entries, 3, \"Should have three entries\");\n }),\n },\n\n {\n name: \"truncate removes entries with version <= upToVersion\",\n category: Categories.BasicOperations,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n yield* storage.append(\"truncate-basic\", makeEntry(1));\n yield* storage.append(\"truncate-basic\", makeEntry(2));\n yield* storage.append(\"truncate-basic\", makeEntry(3));\n yield* storage.truncate(\"truncate-basic\", 2);\n const entries = yield* storage.getEntries(\"truncate-basic\", 0);\n yield* assertLength(entries, 1, \"Should have one entry after truncate\");\n yield* assertEqual(entries[0]!.version, 3, \"Only version 3 should remain\");\n }),\n },\n\n {\n name: \"truncate on non-existent document does not error\",\n category: Categories.BasicOperations,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n yield* storage.truncate(\"non-existent-truncate\", 100);\n }),\n },\n\n // ---------------------------------------------------------------------------\n // Version Filtering (Critical for Recovery)\n // ---------------------------------------------------------------------------\n {\n name: \"getEntries(doc, 0) returns all entries\",\n category: Categories.VersionFiltering,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n yield* storage.append(\"filter-all\", makeEntry(1));\n yield* storage.append(\"filter-all\", makeEntry(2));\n yield* storage.append(\"filter-all\", makeEntry(3));\n const entries = yield* storage.getEntries(\"filter-all\", 0);\n yield* assertLength(entries, 3, \"sinceVersion=0 should return all entries\");\n }),\n },\n\n {\n name: \"getEntries(doc, n) returns only entries with version > n\",\n category: Categories.VersionFiltering,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n yield* storage.append(\"filter-n\", makeEntry(1));\n yield* storage.append(\"filter-n\", makeEntry(2));\n yield* storage.append(\"filter-n\", makeEntry(3));\n yield* storage.append(\"filter-n\", makeEntry(4));\n const entries = yield* storage.getEntries(\"filter-n\", 2);\n yield* assertLength(entries, 2, \"Should return entries with version > 2\");\n yield* assertEqual(entries[0]!.version, 3, \"First entry should be version 3\");\n yield* assertEqual(entries[1]!.version, 4, \"Second entry should be version 4\");\n }),\n },\n\n {\n name: \"getEntries(doc, exactVersion) excludes that exact version\",\n category: Categories.VersionFiltering,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n yield* storage.append(\"filter-exact\", makeEntry(5));\n yield* storage.append(\"filter-exact\", makeEntry(6));\n yield* storage.append(\"filter-exact\", makeEntry(7));\n const entries = yield* storage.getEntries(\"filter-exact\", 6);\n yield* assertLength(entries, 1, \"Should exclude version 6\");\n yield* assertEqual(entries[0]!.version, 7, \"Only version 7 should be returned\");\n }),\n },\n\n {\n name: \"getEntries(doc, maxVersion) returns empty array\",\n category: Categories.VersionFiltering,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n yield* storage.append(\"filter-max\", makeEntry(1));\n yield* storage.append(\"filter-max\", makeEntry(2));\n yield* storage.append(\"filter-max\", makeEntry(3));\n const entries = yield* storage.getEntries(\"filter-max\", 3);\n yield* assertEmpty(entries, \"sinceVersion >= maxVersion should return empty\");\n }),\n },\n\n {\n name: \"getEntries(doc, MAX_SAFE_INTEGER) returns empty array\",\n category: Categories.VersionFiltering,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n yield* storage.append(\"filter-huge\", makeEntry(1));\n yield* storage.append(\"filter-huge\", makeEntry(1000000));\n const entries = yield* storage.getEntries(\"filter-huge\", Number.MAX_SAFE_INTEGER);\n yield* assertEmpty(entries, \"sinceVersion=MAX_SAFE_INTEGER should return empty\");\n }),\n },\n\n // ---------------------------------------------------------------------------\n // Ordering Guarantees\n // ---------------------------------------------------------------------------\n {\n name: \"entries returned sorted by version ascending\",\n category: Categories.OrderingGuarantees,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n yield* storage.append(\"order-test\", makeEntry(1));\n yield* storage.append(\"order-test\", makeEntry(2));\n yield* storage.append(\"order-test\", makeEntry(3));\n const entries = yield* storage.getEntries(\"order-test\", 0);\n yield* assertSortedBy(entries, \"version\", \"Entries should be sorted by version\");\n }),\n },\n\n {\n name: \"out-of-order appends are sorted correctly on retrieval\",\n category: Categories.OrderingGuarantees,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n yield* storage.append(\"ooo-test\", makeEntry(3));\n yield* storage.append(\"ooo-test\", makeEntry(1));\n yield* storage.append(\"ooo-test\", makeEntry(4));\n yield* storage.append(\"ooo-test\", makeEntry(2));\n const entries = yield* storage.getEntries(\"ooo-test\", 0);\n yield* assertLength(entries, 4, \"Should have all 4 entries\");\n yield* assertEqual(entries[0]!.version, 1, \"First should be version 1\");\n yield* assertEqual(entries[1]!.version, 2, \"Second should be version 2\");\n yield* assertEqual(entries[2]!.version, 3, \"Third should be version 3\");\n yield* assertEqual(entries[3]!.version, 4, \"Fourth should be version 4\");\n }),\n },\n\n // ---------------------------------------------------------------------------\n // Truncation Edge Cases\n // ---------------------------------------------------------------------------\n {\n name: \"truncate(doc, 0) removes nothing (versions > 0 kept)\",\n category: Categories.TruncationEdgeCases,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n yield* storage.append(\"trunc-0\", makeEntry(1));\n yield* storage.append(\"trunc-0\", makeEntry(2));\n yield* storage.truncate(\"trunc-0\", 0);\n const entries = yield* storage.getEntries(\"trunc-0\", 0);\n yield* assertLength(entries, 2, \"truncate(0) should keep all entries with version > 0\");\n }),\n },\n\n {\n name: \"truncate(doc, maxVersion) removes all entries\",\n category: Categories.TruncationEdgeCases,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n yield* storage.append(\"trunc-all\", makeEntry(1));\n yield* storage.append(\"trunc-all\", makeEntry(2));\n yield* storage.append(\"trunc-all\", makeEntry(3));\n yield* storage.truncate(\"trunc-all\", 3);\n const entries = yield* storage.getEntries(\"trunc-all\", 0);\n yield* assertEmpty(entries, \"truncate(maxVersion) should remove all entries\");\n }),\n },\n\n {\n name: \"truncate(doc, middleVersion) removes correct entries\",\n category: Categories.TruncationEdgeCases,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n yield* storage.append(\"trunc-mid\", makeEntry(1));\n yield* storage.append(\"trunc-mid\", makeEntry(2));\n yield* storage.append(\"trunc-mid\", makeEntry(3));\n yield* storage.append(\"trunc-mid\", makeEntry(4));\n yield* storage.append(\"trunc-mid\", makeEntry(5));\n yield* storage.truncate(\"trunc-mid\", 3);\n const entries = yield* storage.getEntries(\"trunc-mid\", 0);\n yield* assertLength(entries, 2, \"Should keep versions 4 and 5\");\n yield* assertEqual(entries[0]!.version, 4, \"First remaining should be 4\");\n yield* assertEqual(entries[1]!.version, 5, \"Second remaining should be 5\");\n }),\n },\n\n {\n name: \"multiple truncates work correctly\",\n category: Categories.TruncationEdgeCases,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n yield* storage.append(\"multi-trunc\", makeEntry(1));\n yield* storage.append(\"multi-trunc\", makeEntry(2));\n yield* storage.append(\"multi-trunc\", makeEntry(3));\n yield* storage.append(\"multi-trunc\", makeEntry(4));\n yield* storage.append(\"multi-trunc\", makeEntry(5));\n yield* storage.truncate(\"multi-trunc\", 2);\n yield* storage.truncate(\"multi-trunc\", 4);\n const entries = yield* storage.getEntries(\"multi-trunc\", 0);\n yield* assertLength(entries, 1, \"Should only have version 5\");\n yield* assertEqual(entries[0]!.version, 5, \"Only version 5 should remain\");\n }),\n },\n\n {\n name: \"truncate followed by append works correctly\",\n category: Categories.TruncationEdgeCases,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n yield* storage.append(\"trunc-append\", makeEntry(1));\n yield* storage.append(\"trunc-append\", makeEntry(2));\n yield* storage.truncate(\"trunc-append\", 2);\n yield* storage.append(\"trunc-append\", makeEntry(3));\n yield* storage.append(\"trunc-append\", makeEntry(4));\n const entries = yield* storage.getEntries(\"trunc-append\", 0);\n yield* assertLength(entries, 2, \"Should have versions 3 and 4\");\n yield* assertEqual(entries[0]!.version, 3, \"First should be 3\");\n yield* assertEqual(entries[1]!.version, 4, \"Second should be 4\");\n }),\n },\n\n // ---------------------------------------------------------------------------\n // WAL Entry Data Integrity\n // ---------------------------------------------------------------------------\n {\n name: \"transaction data is preserved exactly\",\n category: Categories.WalEntryIntegrity,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n const entry = makeEntryWithData(1, { key: \"value\", nested: { a: 1 } });\n yield* storage.append(\"tx-data\", entry);\n const entries = yield* storage.getEntries(\"tx-data\", 0);\n yield* assertLength(entries, 1, \"Should have one entry\");\n yield* assertEqual(\n entries[0]!.transaction,\n entry.transaction,\n \"Transaction should be preserved exactly\"\n );\n }),\n },\n\n {\n name: \"version number is preserved exactly\",\n category: Categories.WalEntryIntegrity,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n const version = 42;\n const entry = makeEntry(version);\n yield* storage.append(\"version-preserve\", entry);\n const entries = yield* storage.getEntries(\"version-preserve\", 0);\n yield* assertEqual(entries[0]!.version, version, \"Version should be preserved exactly\");\n }),\n },\n\n {\n name: \"timestamp is preserved exactly\",\n category: Categories.WalEntryIntegrity,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n const timestamp = 1704067200000;\n const entry = makeEntry(1, timestamp);\n yield* storage.append(\"timestamp-preserve\", entry);\n const entries = yield* storage.getEntries(\"timestamp-preserve\", 0);\n yield* assertEqual(\n entries[0]!.timestamp,\n timestamp,\n \"Timestamp should be preserved exactly\"\n );\n }),\n },\n\n {\n name: \"complex transaction operations survive roundtrip\",\n category: Categories.WalEntryIntegrity,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n const entry: WalEntry = {\n transaction: Transaction.make([\n Operation.fromDefinition(OperationPath.make(\"a\"), TestSetDefinition, 1),\n Operation.fromDefinition(OperationPath.make(\"b/c\"), TestSetDefinition, \"nested\"),\n Operation.fromDefinition(OperationPath.make(\"arr\"), TestSetDefinition, [1, 2, 3]),\n ]),\n version: 1,\n timestamp: Date.now(),\n };\n yield* storage.append(\"complex-tx\", entry);\n const entries = yield* storage.getEntries(\"complex-tx\", 0);\n yield* assertEqual(\n entries[0]!.transaction,\n entry.transaction,\n \"Complex transaction should survive roundtrip\"\n );\n }),\n },\n\n // ---------------------------------------------------------------------------\n // Document Isolation\n // ---------------------------------------------------------------------------\n {\n name: \"different documents have independent entry lists\",\n category: Categories.DocumentIsolation,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n yield* storage.append(\"iso-hot-1\", makeEntry(1));\n yield* storage.append(\"iso-hot-1\", makeEntry(2));\n yield* storage.append(\"iso-hot-2\", makeEntry(10));\n const entries1 = yield* storage.getEntries(\"iso-hot-1\", 0);\n const entries2 = yield* storage.getEntries(\"iso-hot-2\", 0);\n yield* assertLength(entries1, 2, \"Doc 1 should have 2 entries\");\n yield* assertLength(entries2, 1, \"Doc 2 should have 1 entry\");\n yield* assertEqual(entries1[0]!.version, 1, \"Doc 1 first entry version\");\n yield* assertEqual(entries2[0]!.version, 10, \"Doc 2 first entry version\");\n }),\n },\n\n {\n name: \"appending to one doc does not affect others\",\n category: Categories.DocumentIsolation,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n yield* storage.append(\"append-iso-1\", makeEntry(1));\n const beforeAppend = yield* storage.getEntries(\"append-iso-1\", 0);\n yield* storage.append(\"append-iso-2\", makeEntry(100));\n yield* storage.append(\"append-iso-2\", makeEntry(101));\n const afterAppend = yield* storage.getEntries(\"append-iso-1\", 0);\n yield* assertEqual(\n beforeAppend.length,\n afterAppend.length,\n \"Appending to doc 2 should not affect doc 1\"\n );\n }),\n },\n\n {\n name: \"truncating one doc does not affect others\",\n category: Categories.DocumentIsolation,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n yield* storage.append(\"trunc-iso-1\", makeEntry(1));\n yield* storage.append(\"trunc-iso-1\", makeEntry(2));\n yield* storage.append(\"trunc-iso-2\", makeEntry(1));\n yield* storage.append(\"trunc-iso-2\", makeEntry(2));\n yield* storage.truncate(\"trunc-iso-1\", 2);\n const entries1 = yield* storage.getEntries(\"trunc-iso-1\", 0);\n const entries2 = yield* storage.getEntries(\"trunc-iso-2\", 0);\n yield* assertEmpty(entries1, \"Doc 1 should be empty after truncate\");\n yield* assertLength(entries2, 2, \"Doc 2 should still have 2 entries\");\n }),\n },\n\n // ---------------------------------------------------------------------------\n // Large-Scale Operations\n // ---------------------------------------------------------------------------\n {\n name: \"handle 1000+ entries per document\",\n category: Categories.LargeScaleOperations,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n const count = 1000;\n for (let i = 1; i <= count; i++) {\n yield* storage.append(\"large-entries\", makeEntry(i));\n }\n const entries = yield* storage.getEntries(\"large-entries\", 0);\n yield* assertLength(entries, count, `Should have ${count} entries`);\n yield* assertSortedBy(entries, \"version\", \"Should be sorted by version\");\n yield* assertEqual(entries[0]!.version, 1, \"First should be version 1\");\n yield* assertEqual(entries[count - 1]!.version, count, `Last should be version ${count}`);\n }),\n },\n\n {\n name: \"handle 100+ documents\",\n category: Categories.LargeScaleOperations,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n const docCount = 100;\n for (let i = 0; i < docCount; i++) {\n yield* storage.append(`multi-doc-${i}`, makeEntry(1));\n yield* storage.append(`multi-doc-${i}`, makeEntry(2));\n }\n let totalEntries = 0;\n for (let i = 0; i < docCount; i++) {\n const entries = yield* storage.getEntries(`multi-doc-${i}`, 0);\n totalEntries += entries.length;\n yield* assertLength(entries, 2, `Doc ${i} should have 2 entries`);\n }\n yield* assertEqual(totalEntries, docCount * 2, \"Total entries should match\");\n }),\n },\n\n {\n name: \"large transaction data (10KB+) survives roundtrip\",\n category: Categories.LargeScaleOperations,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n const largeData = \"x\".repeat(10 * 1024);\n const entry = makeEntryWithData(1, { content: largeData });\n yield* storage.append(\"large-tx\", entry);\n const entries = yield* storage.getEntries(\"large-tx\", 0);\n yield* assertLength(entries, 1, \"Should have one entry\");\n yield* assertEqual(\n entries[0]!.transaction,\n entry.transaction,\n \"Large transaction data should survive roundtrip\"\n );\n }),\n },\n\n // ---------------------------------------------------------------------------\n // Document ID Edge Cases\n // ---------------------------------------------------------------------------\n {\n name: \"long documentId (1000+ chars) works\",\n category: Categories.DocumentIdEdgeCases,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n const longId = \"h\".repeat(1000);\n const entry = makeEntry(1);\n yield* storage.append(longId, entry);\n const entries = yield* storage.getEntries(longId, 0);\n yield* assertLength(entries, 1, \"Long documentId should work\");\n }),\n },\n\n {\n name: \"unicode documentId works\",\n category: Categories.DocumentIdEdgeCases,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n const unicodeId = \"hot-doc-id\";\n const entry = makeEntry(1);\n yield* storage.append(unicodeId, entry);\n const entries = yield* storage.getEntries(unicodeId, 0);\n yield* assertLength(entries, 1, \"Unicode documentId should work\");\n }),\n },\n\n {\n name: \"documentId with special chars works\",\n category: Categories.DocumentIdEdgeCases,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n const specialId = \"hot/path:to.wal\";\n const entry = makeEntry(1);\n yield* storage.append(specialId, entry);\n const entries = yield* storage.getEntries(specialId, 0);\n yield* assertLength(entries, 1, \"DocumentId with special chars should work\");\n }),\n },\n\n {\n name: \"documentId with spaces works\",\n category: Categories.DocumentIdEdgeCases,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n const spacedId = \"hot doc with spaces\";\n const entry = makeEntry(1);\n yield* storage.append(spacedId, entry);\n const entries = yield* storage.getEntries(spacedId, 0);\n yield* assertLength(entries, 1, \"DocumentId with spaces should work\");\n }),\n },\n\n {\n name: \"version 0 entry is handled correctly\",\n category: Categories.VersionFiltering,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n yield* storage.append(\"version-0-entry\", makeEntry(0));\n yield* storage.append(\"version-0-entry\", makeEntry(1));\n const entriesFromNeg = yield* storage.getEntries(\"version-0-entry\", -1);\n yield* assertTrue(\n entriesFromNeg.some((e) => e.version === 0),\n \"Version 0 entry should be retrievable with sinceVersion < 0\"\n );\n const entriesFrom0 = yield* storage.getEntries(\"version-0-entry\", 0);\n yield* assertTrue(\n !entriesFrom0.some((e) => e.version === 0),\n \"Version 0 entry should be excluded with sinceVersion = 0\"\n );\n }),\n },\n\n // ---------------------------------------------------------------------------\n // Gap Checking (appendWithCheck)\n // ---------------------------------------------------------------------------\n {\n name: \"appendWithCheck succeeds for first entry (expectedVersion=1)\",\n category: Categories.GapChecking,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n const entry = makeEntry(1);\n yield* storage.appendWithCheck(\"gap-check-first\", entry, 1);\n const entries = yield* storage.getEntries(\"gap-check-first\", 0);\n yield* assertLength(entries, 1, \"Should have one entry\");\n yield* assertEqual(entries[0]!.version, 1, \"Entry version should be 1\");\n }),\n },\n\n {\n name: \"appendWithCheck succeeds for consecutive versions\",\n category: Categories.GapChecking,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n yield* storage.appendWithCheck(\"gap-check-consecutive\", makeEntry(1), 1);\n yield* storage.appendWithCheck(\"gap-check-consecutive\", makeEntry(2), 2);\n yield* storage.appendWithCheck(\"gap-check-consecutive\", makeEntry(3), 3);\n const entries = yield* storage.getEntries(\"gap-check-consecutive\", 0);\n yield* assertLength(entries, 3, \"Should have three entries\");\n yield* assertEqual(entries[0]!.version, 1, \"First entry version should be 1\");\n yield* assertEqual(entries[1]!.version, 2, \"Second entry version should be 2\");\n yield* assertEqual(entries[2]!.version, 3, \"Third entry version should be 3\");\n }),\n },\n\n {\n name: \"appendWithCheck fails for version gap (skipping version 2)\",\n category: Categories.GapChecking,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n yield* storage.appendWithCheck(\"gap-check-fail\", makeEntry(1), 1);\n // Attempt to append version 3, skipping version 2\n const result = yield* Effect.result(\n storage.appendWithCheck(\"gap-check-fail\", makeEntry(3), 3)\n );\n yield* assertTrue(\n result._tag === \"Failure\",\n \"appendWithCheck should fail when there's a version gap\"\n );\n if (result._tag === \"Failure\") {\n yield* assertTrue(\n result.failure._tag === \"WalVersionGapError\",\n \"Error should be WalVersionGapError\"\n );\n }\n // Verify version 3 was not appended\n const entries = yield* storage.getEntries(\"gap-check-fail\", 0);\n yield* assertLength(entries, 1, \"Should only have version 1\");\n yield* assertEqual(entries[0]!.version, 1, \"Only version 1 should exist\");\n }),\n },\n\n {\n name: \"appendWithCheck fails if first entry is not version 1\",\n category: Categories.GapChecking,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n // Attempt to append version 2 as first entry (expecting gap error)\n const result = yield* Effect.result(\n storage.appendWithCheck(\"gap-check-not-first\", makeEntry(2), 2)\n );\n yield* assertTrue(\n result._tag === \"Failure\",\n \"appendWithCheck should fail when first entry is not version 1\"\n );\n if (result._tag === \"Failure\") {\n yield* assertTrue(\n result.failure._tag === \"WalVersionGapError\",\n \"Error should be WalVersionGapError\"\n );\n }\n // Verify nothing was appended\n const entries = yield* storage.getEntries(\"gap-check-not-first\", 0);\n yield* assertEmpty(entries, \"No entries should exist after failed append\");\n }),\n },\n\n {\n name: \"appendWithCheck fails when entry already exists at expectedVersion\",\n category: Categories.GapChecking,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n yield* storage.appendWithCheck(\"gap-check-duplicate\", makeEntry(1), 1);\n // Attempt to append another version 1\n const result = yield* Effect.result(\n storage.appendWithCheck(\"gap-check-duplicate\", makeEntry(1), 1)\n );\n yield* assertTrue(\n result._tag === \"Failure\",\n \"appendWithCheck should fail when version already exists\"\n );\n // Verify still only one entry\n const entries = yield* storage.getEntries(\"gap-check-duplicate\", 0);\n yield* assertLength(entries, 1, \"Should still only have one entry\");\n }),\n },\n\n {\n name: \"appendWithCheck after truncate works correctly\",\n category: Categories.GapChecking,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n // Append versions 1, 2, 3\n yield* storage.appendWithCheck(\"gap-check-truncate\", makeEntry(1), 1);\n yield* storage.appendWithCheck(\"gap-check-truncate\", makeEntry(2), 2);\n yield* storage.appendWithCheck(\"gap-check-truncate\", makeEntry(3), 3);\n // Truncate up to version 2\n yield* storage.truncate(\"gap-check-truncate\", 2);\n // Now append version 4 (should succeed since last entry is version 3)\n yield* storage.appendWithCheck(\"gap-check-truncate\", makeEntry(4), 4);\n const entries = yield* storage.getEntries(\"gap-check-truncate\", 0);\n yield* assertLength(entries, 2, \"Should have versions 3 and 4\");\n yield* assertEqual(entries[0]!.version, 3, \"First should be version 3\");\n yield* assertEqual(entries[1]!.version, 4, \"Second should be version 4\");\n }),\n },\n\n {\n name: \"appendWithCheck with baseVersion after full truncate works\",\n category: Categories.GapChecking,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n // Append versions 1, 2, 3\n yield* storage.appendWithCheck(\"gap-base-version\", makeEntry(1), 1, 0);\n yield* storage.appendWithCheck(\"gap-base-version\", makeEntry(2), 2, 0);\n yield* storage.appendWithCheck(\"gap-base-version\", makeEntry(3), 3, 0);\n // Truncate ALL entries (simulates snapshot at version 3)\n yield* storage.truncate(\"gap-base-version\", 3);\n // Verify WAL is empty\n const entriesAfterTruncate = yield* storage.getEntries(\"gap-base-version\", 0);\n yield* assertEmpty(entriesAfterTruncate, \"WAL should be empty after full truncate\");\n // Append version 4 WITH baseVersion=3 (simulates knowing snapshot version)\n yield* storage.appendWithCheck(\"gap-base-version\", makeEntry(4), 4, 3);\n const entries = yield* storage.getEntries(\"gap-base-version\", 0);\n yield* assertLength(entries, 1, \"Should have version 4\");\n yield* assertEqual(entries[0]!.version, 4, \"Entry should be version 4\");\n }),\n },\n\n {\n name: \"appendWithCheck with baseVersion still detects gaps\",\n category: Categories.GapChecking,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n // Truncate (to establish empty WAL scenario)\n yield* storage.truncate(\"gap-base-detect\", 5);\n // Try to append version 7 with baseVersion=5 (skipping version 6)\n const result = yield* Effect.result(\n storage.appendWithCheck(\"gap-base-detect\", makeEntry(7), 7, 5)\n );\n yield* assertTrue(result._tag === \"Failure\", \"Should fail when skipping version 6\");\n if (result._tag === \"Failure\") {\n yield* assertTrue(\n result.failure._tag === \"WalVersionGapError\",\n \"Error should be WalVersionGapError\"\n );\n }\n }),\n },\n\n {\n name: \"appendWithCheck with baseVersion=0 allows version 1\",\n category: Categories.GapChecking,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n // New document scenario: baseVersion=0, first entry should be version 1\n yield* storage.appendWithCheck(\"gap-base-zero\", makeEntry(1), 1, 0);\n const entries = yield* storage.getEntries(\"gap-base-zero\", 0);\n yield* assertLength(entries, 1, \"Should have version 1\");\n yield* assertEqual(entries[0]!.version, 1, \"Entry should be version 1\");\n }),\n },\n\n // ---------------------------------------------------------------------------\n // Transaction Encoding (Critical for OperationPath preservation)\n // ---------------------------------------------------------------------------\n {\n name: \"OperationPath has _tag after roundtrip\",\n category: Categories.TransactionEncoding,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n const entry = makeEntryWithPath(1, \"users/0/name\", \"Alice\");\n yield* storage.append(\"op-path-tag\", entry);\n const entries = yield* storage.getEntries(\"op-path-tag\", 0);\n yield* assertLength(entries, 1, \"Should have one entry\");\n const op = entries[0]!.transaction.ops[0]!;\n yield* assertTrue(\n op.path._tag === \"OperationPath\",\n \"path should have _tag 'OperationPath'\"\n );\n }),\n },\n\n {\n name: \"OperationPath.toTokens() works after roundtrip\",\n category: Categories.TransactionEncoding,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n const entry = makeEntryWithPath(1, \"users/0/name\", \"Alice\");\n yield* storage.append(\"op-path-tokens\", entry);\n const entries = yield* storage.getEntries(\"op-path-tokens\", 0);\n yield* assertLength(entries, 1, \"Should have one entry\");\n const op = entries[0]!.transaction.ops[0]!;\n yield* assertTrue(\n typeof op.path.toTokens === \"function\",\n \"path.toTokens should be a function\"\n );\n const tokens = op.path.toTokens();\n yield* assertEqual(\n tokens,\n [\"users\", \"0\", \"name\"],\n \"toTokens() should return correct path tokens\"\n );\n }),\n },\n\n {\n name: \"OperationPath.concat() works after roundtrip\",\n category: Categories.TransactionEncoding,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n const entry = makeEntryWithPath(1, \"users/0\", { name: \"Alice\" });\n yield* storage.append(\"op-path-concat\", entry);\n const entries = yield* storage.getEntries(\"op-path-concat\", 0);\n yield* assertLength(entries, 1, \"Should have one entry\");\n const op = entries[0]!.transaction.ops[0]!;\n yield* assertTrue(\n typeof op.path.concat === \"function\",\n \"path.concat should be a function\"\n );\n const extended = op.path.concat(OperationPath.make(\"name\"));\n yield* assertEqual(\n extended.toTokens(),\n [\"users\", \"0\", \"name\"],\n \"concat() should work correctly\"\n );\n }),\n },\n\n {\n name: \"OperationPath.append() works after roundtrip\",\n category: Categories.TransactionEncoding,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n const entry = makeEntryWithPath(1, \"users\", []);\n yield* storage.append(\"op-path-append\", entry);\n const entries = yield* storage.getEntries(\"op-path-append\", 0);\n yield* assertLength(entries, 1, \"Should have one entry\");\n const op = entries[0]!.transaction.ops[0]!;\n yield* assertTrue(\n typeof op.path.append === \"function\",\n \"path.append should be a function\"\n );\n const extended = op.path.append(\"0\");\n yield* assertEqual(\n extended.toTokens(),\n [\"users\", \"0\"],\n \"append() should work correctly\"\n );\n }),\n },\n\n {\n name: \"OperationPath.pop() works after roundtrip\",\n category: Categories.TransactionEncoding,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n const entry = makeEntryWithPath(1, \"users/0/name\", \"Alice\");\n yield* storage.append(\"op-path-pop\", entry);\n const entries = yield* storage.getEntries(\"op-path-pop\", 0);\n yield* assertLength(entries, 1, \"Should have one entry\");\n const op = entries[0]!.transaction.ops[0]!;\n yield* assertTrue(\n typeof op.path.pop === \"function\",\n \"path.pop should be a function\"\n );\n const popped = op.path.pop();\n yield* assertEqual(\n popped.toTokens(),\n [\"users\", \"0\"],\n \"pop() should remove last token\"\n );\n }),\n },\n\n {\n name: \"OperationPath.shift() works after roundtrip\",\n category: Categories.TransactionEncoding,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n const entry = makeEntryWithPath(1, \"users/0/name\", \"Alice\");\n yield* storage.append(\"op-path-shift\", entry);\n const entries = yield* storage.getEntries(\"op-path-shift\", 0);\n yield* assertLength(entries, 1, \"Should have one entry\");\n const op = entries[0]!.transaction.ops[0]!;\n yield* assertTrue(\n typeof op.path.shift === \"function\",\n \"path.shift should be a function\"\n );\n const shifted = op.path.shift();\n yield* assertEqual(\n shifted.toTokens(),\n [\"0\", \"name\"],\n \"shift() should remove first token\"\n );\n }),\n },\n\n {\n name: \"transaction with multiple operations preserves all OperationPaths\",\n category: Categories.TransactionEncoding,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n const entry: WalEntry = {\n transaction: Transaction.make([\n Operation.fromDefinition(OperationPath.make(\"users/0/name\"), TestSetDefinition, \"Alice\"),\n Operation.fromDefinition(OperationPath.make(\"users/1/name\"), TestSetDefinition, \"Bob\"),\n Operation.fromDefinition(OperationPath.make(\"count\"), TestSetDefinition, 2),\n ]),\n version: 1,\n timestamp: Date.now(),\n };\n yield* storage.append(\"multi-op-paths\", entry);\n const entries = yield* storage.getEntries(\"multi-op-paths\", 0);\n yield* assertLength(entries, 1, \"Should have one entry\");\n const ops = entries[0]!.transaction.ops;\n yield* assertLength([...ops], 3, \"Should have 3 operations\");\n // Verify all paths have working methods\n for (const op of ops) {\n yield* assertTrue(\n op.path._tag === \"OperationPath\",\n \"Each operation path should have _tag\"\n );\n yield* assertTrue(\n typeof op.path.toTokens === \"function\",\n \"Each operation path should have toTokens method\"\n );\n }\n yield* assertEqual(\n ops[0]!.path.toTokens(),\n [\"users\", \"0\", \"name\"],\n \"First path should be correct\"\n );\n yield* assertEqual(\n ops[1]!.path.toTokens(),\n [\"users\", \"1\", \"name\"],\n \"Second path should be correct\"\n );\n yield* assertEqual(\n ops[2]!.path.toTokens(),\n [\"count\"],\n \"Third path should be correct\"\n );\n }),\n },\n\n {\n name: \"nested path with many segments survives roundtrip\",\n category: Categories.TransactionEncoding,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n const deepPath = \"level1/level2/level3/level4/level5\";\n const entry = makeEntryWithPath(1, deepPath, \"deep value\");\n yield* storage.append(\"deep-path\", entry);\n const entries = yield* storage.getEntries(\"deep-path\", 0);\n yield* assertLength(entries, 1, \"Should have one entry\");\n const op = entries[0]!.transaction.ops[0]!;\n yield* assertEqual(\n op.path.toTokens(),\n [\"level1\", \"level2\", \"level3\", \"level4\", \"level5\"],\n \"Deep nested path should survive roundtrip\"\n );\n }),\n },\n\n {\n name: \"empty path survives roundtrip\",\n category: Categories.TransactionEncoding,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n const entry = makeEntryWithPath(1, \"\", { root: true });\n yield* storage.append(\"empty-path\", entry);\n const entries = yield* storage.getEntries(\"empty-path\", 0);\n yield* assertLength(entries, 1, \"Should have one entry\");\n const op = entries[0]!.transaction.ops[0]!;\n yield* assertTrue(\n op.path._tag === \"OperationPath\",\n \"Empty path should still be OperationPath\"\n );\n yield* assertTrue(\n typeof op.path.toTokens === \"function\",\n \"Empty path should have toTokens method\"\n );\n }),\n },\n\n {\n name: \"transaction id is preserved after roundtrip\",\n category: Categories.TransactionEncoding,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n const entry = makeEntryWithPath(1, \"test\", \"value\");\n const originalId = entry.transaction.id;\n yield* storage.append(\"tx-id-preserve\", entry);\n const entries = yield* storage.getEntries(\"tx-id-preserve\", 0);\n yield* assertLength(entries, 1, \"Should have one entry\");\n yield* assertEqual(\n entries[0]!.transaction.id,\n originalId,\n \"Transaction id should be preserved\"\n );\n }),\n },\n\n {\n name: \"transaction timestamp is preserved after roundtrip\",\n category: Categories.TransactionEncoding,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n const entry = makeEntryWithPath(1, \"test\", \"value\");\n const originalTimestamp = entry.transaction.timestamp;\n yield* storage.append(\"tx-timestamp-preserve\", entry);\n const entries = yield* storage.getEntries(\"tx-timestamp-preserve\", 0);\n yield* assertLength(entries, 1, \"Should have one entry\");\n yield* assertEqual(\n entries[0]!.transaction.timestamp,\n originalTimestamp,\n \"Transaction timestamp should be preserved\"\n );\n }),\n },\n\n {\n name: \"operation kind is preserved after roundtrip\",\n category: Categories.TransactionEncoding,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n const entry: WalEntry = {\n transaction: Transaction.make([\n Operation.fromDefinition(OperationPath.make(\"data\"), CustomOpDefinition, \"test\"),\n ]),\n version: 1,\n timestamp: Date.now(),\n };\n yield* storage.append(\"op-kind-preserve\", entry);\n const entries = yield* storage.getEntries(\"op-kind-preserve\", 0);\n yield* assertLength(entries, 1, \"Should have one entry\");\n yield* assertEqual(\n entries[0]!.transaction.ops[0]!.kind,\n \"custom.operation\",\n \"Operation kind should be preserved\"\n );\n }),\n },\n\n {\n name: \"operation payload with complex object survives roundtrip\",\n category: Categories.TransactionEncoding,\n run: Effect.gen(function* () {\n const storage = yield* HotStorageTag;\n const complexPayload = {\n nested: { value: 42, array: [1, 2, 3] },\n nullValue: null,\n string: \"test\",\n };\n const entry = makeEntryWithPath(1, \"data\", complexPayload);\n yield* storage.append(\"complex-payload\", entry);\n const entries = yield* storage.getEntries(\"complex-payload\", 0);\n yield* assertLength(entries, 1, \"Should have one entry\");\n yield* assertEqual(\n entries[0]!.transaction.ops[0]!.payload,\n complexPayload,\n \"Complex payload should survive roundtrip\"\n );\n }),\n },\n];\n\n// =============================================================================\n// Exports\n// =============================================================================\n\n/**\n * Get all HotStorage test cases.\n *\n * @returns Array of test cases that require HotStorageTag\n */\nexport const makeTests = (): StorageTestCase<\n HotStorageTestError,\n HotStorageTag\n>[] => tests;\n\n/**\n * Run all tests and collect results.\n *\n * @returns Effect that produces TestResults\n */\nexport const runAll = (): Effect.Effect<\n TestResults<HotStorageTestError, HotStorageTag>,\n never,\n HotStorageTag\n> =>\n Effect.gen(function* () {\n const passed: StorageTestCase<HotStorageTestError, HotStorageTag>[] = [];\n const failed: Array<{\n test: StorageTestCase<HotStorageTestError, HotStorageTag>;\n error: HotStorageTestError;\n }> = [];\n\n for (const test of tests) {\n const result = yield* Effect.result(test.run);\n if (result._tag === \"Success\") {\n passed.push(test);\n } else {\n failed.push({ test, error: result.failure });\n }\n }\n\n return {\n passed,\n failed,\n total: tests.length,\n passCount: passed.length,\n failCount: failed.length,\n };\n });\n\nexport const HotStorageTestSuite = {\n Categories,\n makeTests,\n runAll,\n};\n"],"mappings":"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"}
@@ -463,15 +463,15 @@ const runAll = (layer) => effect.Effect.gen(function* () {
463
463
  const tests = makeTests();
464
464
  const results = [];
465
465
  for (const test of tests) {
466
- const result = yield* effect.Effect.either(test.run.pipe(effect.Effect.provide(layer)));
467
- if (result._tag === "Right") results.push({
466
+ const result = yield* effect.Effect.result(test.run.pipe(effect.Effect.provide(layer)));
467
+ if (result._tag === "Success") results.push({
468
468
  name: test.name,
469
469
  passed: true
470
470
  });
471
471
  else results.push({
472
472
  name: test.name,
473
473
  passed: false,
474
- error: result.left
474
+ error: result.failure
475
475
  });
476
476
  }
477
477
  return results;
@@ -463,15 +463,15 @@ const runAll = (layer) => Effect.gen(function* () {
463
463
  const tests = makeTests();
464
464
  const results = [];
465
465
  for (const test of tests) {
466
- const result = yield* Effect.either(test.run.pipe(Effect.provide(layer)));
467
- if (result._tag === "Right") results.push({
466
+ const result = yield* Effect.result(test.run.pipe(Effect.provide(layer)));
467
+ if (result._tag === "Success") results.push({
468
468
  name: test.name,
469
469
  passed: true
470
470
  });
471
471
  else results.push({
472
472
  name: test.name,
473
473
  passed: false,
474
- error: result.left
474
+ error: result.failure
475
475
  });
476
476
  }
477
477
  return results;
@@ -1 +1 @@
1
- {"version":3,"file":"StorageIntegrationTestSuite.mjs","names":["snapshotWalCoordinationTests: IntegrationTestCase[]","versionVerificationTests: IntegrationTestCase[]","recoveryScenarioTests: IntegrationTestCase[]","transactionEncodingTests: IntegrationTestCase[]","entry: WalEntry","results: Array<{ name: string; passed: boolean; error?: unknown }>"],"sources":["../../src/testing/StorageIntegrationTestSuite.ts"],"sourcesContent":["/**\n * @voidhash/mimic-effect/testing - StorageIntegrationTestSuite\n *\n * Integration tests for verifying Hot/Cold storage coordination.\n * Tests snapshot + WAL replay, failure handling, and version verification.\n *\n * @example\n * ```typescript\n * import { StorageIntegrationTestSuite } from \"@voidhash/mimic-effect/testing\";\n * import { describe, it } from \"vitest\";\n * import { Effect, Layer } from \"effect\";\n * import { ColdStorage, HotStorage } from \"@voidhash/mimic-effect\";\n *\n * describe(\"Storage Integration\", () => {\n * const layer = Layer.mergeAll(\n * ColdStorage.InMemory.make(),\n * HotStorage.InMemory.make()\n * );\n *\n * for (const test of StorageIntegrationTestSuite.makeTests()) {\n * it(test.name, () =>\n * Effect.runPromise(test.run.pipe(Effect.provide(layer)))\n * );\n * }\n * });\n * ```\n */\nimport { Effect, Schema } from \"effect\";\nimport { Transaction, OperationPath, Operation, OperationDefinition } from \"@voidhash/mimic\";\nimport { ColdStorageTag } from \"../ColdStorage\";\nimport { HotStorageTag } from \"../HotStorage\";\nimport { ColdStorageError, HotStorageError } from \"../Errors\";\nimport type { StoredDocument, WalEntry } from \"../Types\";\nimport type { StorageTestCase } from \"./types\";\nimport {\n assertEqual,\n assertTrue,\n assertLength,\n assertEmpty,\n assertDefined,\n assertUndefined,\n} from \"./assertions\";\n\n// =============================================================================\n// Test Categories\n// =============================================================================\n\nexport const Categories = {\n SNAPSHOT_WAL_COORDINATION: \"Snapshot + WAL Coordination\",\n VERSION_VERIFICATION: \"Version Verification\",\n RECOVERY_SCENARIOS: \"Recovery Scenarios\",\n TRANSACTION_ENCODING: \"Transaction Encoding\",\n} as const;\n\n// =============================================================================\n// Test Operation Definitions\n// =============================================================================\n\n/**\n * Test operation definition for creating proper Operation objects in tests.\n */\nconst TestSetDefinition = OperationDefinition.make({\n kind: \"test.set\" as const,\n payload: Schema.Unknown,\n target: Schema.Unknown,\n apply: (payload: unknown) => payload,\n});\n\n// =============================================================================\n// Test Helpers\n// =============================================================================\n\nconst makeSnapshot = (\n version: number,\n state: unknown = { data: `v${version}` }\n): StoredDocument => ({\n state,\n version,\n schemaVersion: 1,\n savedAt: Date.now(),\n});\n\nconst makeWalEntry = (\n version: number,\n pathString: string = \"data\",\n payload: unknown = `v${version}`\n): WalEntry => ({\n transaction: Transaction.make([\n Operation.fromDefinition(OperationPath.make(pathString), TestSetDefinition, payload),\n ]),\n version,\n timestamp: Date.now(),\n});\n\n// =============================================================================\n// Test Definitions\n// =============================================================================\n\ntype IntegrationTestCase = StorageTestCase<ColdStorageError | HotStorageError, ColdStorageTag | HotStorageTag>;\n\nconst snapshotWalCoordinationTests: IntegrationTestCase[] = [\n {\n name: \"load empty document returns undefined snapshot and empty WAL\",\n category: Categories.SNAPSHOT_WAL_COORDINATION,\n run: Effect.gen(function* () {\n const cold = yield* ColdStorageTag;\n const hot = yield* HotStorageTag;\n\n const snapshot = yield* cold.load(\"empty-doc\");\n const walEntries = yield* hot.getEntries(\"empty-doc\", 0);\n\n assertUndefined(snapshot, \"Snapshot should be undefined for new doc\");\n assertEmpty(walEntries, \"WAL should be empty for new doc\");\n }),\n },\n\n {\n name: \"restore from snapshot only (no WAL)\",\n category: Categories.SNAPSHOT_WAL_COORDINATION,\n run: Effect.gen(function* () {\n const cold = yield* ColdStorageTag;\n const hot = yield* HotStorageTag;\n\n const docId = \"snapshot-only\";\n const snapshot = makeSnapshot(5, { title: \"Hello\" });\n\n yield* cold.save(docId, snapshot);\n\n const loaded = yield* cold.load(docId);\n const walEntries = yield* hot.getEntries(docId, 5);\n\n assertDefined(loaded, \"Snapshot should be loaded\");\n assertEqual(loaded!.version, 5, \"Snapshot version should match\");\n assertEqual(loaded!.state, { title: \"Hello\" }, \"Snapshot state should match\");\n assertEmpty(walEntries, \"WAL should be empty after snapshot version\");\n }),\n },\n\n {\n name: \"restore from WAL only (no snapshot)\",\n category: Categories.SNAPSHOT_WAL_COORDINATION,\n run: Effect.gen(function* () {\n const cold = yield* ColdStorageTag;\n const hot = yield* HotStorageTag;\n\n const docId = \"wal-only\";\n\n yield* hot.append(docId, makeWalEntry(1));\n yield* hot.append(docId, makeWalEntry(2));\n yield* hot.append(docId, makeWalEntry(3));\n\n const snapshot = yield* cold.load(docId);\n const walEntries = yield* hot.getEntries(docId, 0);\n\n assertUndefined(snapshot, \"No snapshot should exist\");\n assertLength(walEntries, 3, \"Should have 3 WAL entries\");\n assertEqual(walEntries[0]!.version, 1, \"First entry should be v1\");\n assertEqual(walEntries[2]!.version, 3, \"Last entry should be v3\");\n }),\n },\n\n {\n name: \"restore from snapshot + WAL replay\",\n category: Categories.SNAPSHOT_WAL_COORDINATION,\n run: Effect.gen(function* () {\n const cold = yield* ColdStorageTag;\n const hot = yield* HotStorageTag;\n\n const docId = \"snapshot-plus-wal\";\n\n // Save snapshot at v5\n yield* cold.save(docId, makeSnapshot(5));\n\n // Add WAL entries for v6, v7, v8\n yield* hot.append(docId, makeWalEntry(6));\n yield* hot.append(docId, makeWalEntry(7));\n yield* hot.append(docId, makeWalEntry(8));\n\n const snapshot = yield* cold.load(docId);\n const walEntries = yield* hot.getEntries(docId, snapshot!.version);\n\n assertEqual(snapshot!.version, 5, \"Snapshot at v5\");\n assertLength(walEntries, 3, \"3 WAL entries after snapshot\");\n assertEqual(walEntries[0]!.version, 6, \"First WAL entry is v6\");\n assertEqual(walEntries[2]!.version, 8, \"Last WAL entry is v8\");\n }),\n },\n\n {\n name: \"truncate WAL after snapshot\",\n category: Categories.SNAPSHOT_WAL_COORDINATION,\n run: Effect.gen(function* () {\n const cold = yield* ColdStorageTag;\n const hot = yield* HotStorageTag;\n\n const docId = \"truncate-test\";\n\n // Add WAL entries 1-5\n for (let i = 1; i <= 5; i++) {\n yield* hot.append(docId, makeWalEntry(i));\n }\n\n // Save snapshot at v3\n yield* cold.save(docId, makeSnapshot(3));\n\n // Truncate WAL up to v3\n yield* hot.truncate(docId, 3);\n\n const walEntries = yield* hot.getEntries(docId, 0);\n\n assertLength(walEntries, 2, \"Only v4 and v5 should remain\");\n assertEqual(walEntries[0]!.version, 4, \"First remaining is v4\");\n assertEqual(walEntries[1]!.version, 5, \"Last remaining is v5\");\n }),\n },\n\n {\n name: \"snapshot overwrites previous snapshot\",\n category: Categories.SNAPSHOT_WAL_COORDINATION,\n run: Effect.gen(function* () {\n const cold = yield* ColdStorageTag;\n\n const docId = \"overwrite-test\";\n\n yield* cold.save(docId, makeSnapshot(1, { old: true }));\n yield* cold.save(docId, makeSnapshot(5, { new: true }));\n\n const loaded = yield* cold.load(docId);\n\n assertEqual(loaded!.version, 5, \"Should have newer version\");\n assertEqual(loaded!.state, { new: true }, \"Should have newer state\");\n }),\n },\n];\n\nconst versionVerificationTests: IntegrationTestCase[] = [\n {\n name: \"WAL entries are ordered by version\",\n category: Categories.VERSION_VERIFICATION,\n run: Effect.gen(function* () {\n const hot = yield* HotStorageTag;\n\n const docId = \"ordering-test\";\n\n // Append out of order\n yield* hot.append(docId, makeWalEntry(3));\n yield* hot.append(docId, makeWalEntry(1));\n yield* hot.append(docId, makeWalEntry(2));\n\n const entries = yield* hot.getEntries(docId, 0);\n\n assertLength(entries, 3, \"All entries should be returned\");\n assertEqual(entries[0]!.version, 1, \"First should be v1\");\n assertEqual(entries[1]!.version, 2, \"Second should be v2\");\n assertEqual(entries[2]!.version, 3, \"Third should be v3\");\n }),\n },\n\n {\n name: \"getEntries filters by sinceVersion correctly\",\n category: Categories.VERSION_VERIFICATION,\n run: Effect.gen(function* () {\n const hot = yield* HotStorageTag;\n\n const docId = \"filter-test\";\n\n for (let i = 1; i <= 10; i++) {\n yield* hot.append(docId, makeWalEntry(i));\n }\n\n const fromV5 = yield* hot.getEntries(docId, 5);\n const fromV8 = yield* hot.getEntries(docId, 8);\n const fromV10 = yield* hot.getEntries(docId, 10);\n\n assertLength(fromV5, 5, \"v6-v10 = 5 entries\");\n assertEqual(fromV5[0]!.version, 6, \"First entry after v5 is v6\");\n\n assertLength(fromV8, 2, \"v9-v10 = 2 entries\");\n assertEqual(fromV8[0]!.version, 9, \"First entry after v8 is v9\");\n\n assertEmpty(fromV10, \"No entries after v10\");\n }),\n },\n\n {\n name: \"detect version gap between snapshot and WAL\",\n category: Categories.VERSION_VERIFICATION,\n run: Effect.gen(function* () {\n const cold = yield* ColdStorageTag;\n const hot = yield* HotStorageTag;\n\n const docId = \"gap-detection\";\n\n // Snapshot at v5\n yield* cold.save(docId, makeSnapshot(5));\n\n // WAL starts at v7 (gap: v6 missing)\n yield* hot.append(docId, makeWalEntry(7));\n yield* hot.append(docId, makeWalEntry(8));\n\n const snapshot = yield* cold.load(docId);\n const walEntries = yield* hot.getEntries(docId, snapshot!.version);\n\n assertEqual(snapshot!.version, 5, \"Snapshot at v5\");\n assertLength(walEntries, 2, \"Two WAL entries\");\n\n // Gap detection: first WAL entry should be v6, but it's v7\n const firstWalVersion = walEntries[0]!.version;\n const expectedFirst = snapshot!.version + 1;\n const hasGap = firstWalVersion !== expectedFirst;\n\n assertTrue(hasGap, \"Should detect gap (v7 != v6)\");\n }),\n },\n\n {\n name: \"detect internal WAL gaps\",\n category: Categories.VERSION_VERIFICATION,\n run: Effect.gen(function* () {\n const hot = yield* HotStorageTag;\n\n const docId = \"internal-gap\";\n\n yield* hot.append(docId, makeWalEntry(1));\n yield* hot.append(docId, makeWalEntry(2));\n // Skip v3\n yield* hot.append(docId, makeWalEntry(4));\n yield* hot.append(docId, makeWalEntry(5));\n\n const entries = yield* hot.getEntries(docId, 0);\n\n // Check for internal gaps\n let gapFound = false;\n for (let i = 1; i < entries.length; i++) {\n const prev = entries[i - 1]!.version;\n const curr = entries[i]!.version;\n if (curr !== prev + 1) {\n gapFound = true;\n break;\n }\n }\n\n assertTrue(gapFound, \"Should detect internal gap between v2 and v4\");\n }),\n },\n\n {\n name: \"no gap when WAL is continuous\",\n category: Categories.VERSION_VERIFICATION,\n run: Effect.gen(function* () {\n const cold = yield* ColdStorageTag;\n const hot = yield* HotStorageTag;\n\n const docId = \"no-gap\";\n\n yield* cold.save(docId, makeSnapshot(5));\n yield* hot.append(docId, makeWalEntry(6));\n yield* hot.append(docId, makeWalEntry(7));\n yield* hot.append(docId, makeWalEntry(8));\n\n const snapshot = yield* cold.load(docId);\n const walEntries = yield* hot.getEntries(docId, snapshot!.version);\n\n const firstWalVersion = walEntries[0]!.version;\n const expectedFirst = snapshot!.version + 1;\n const hasGap = firstWalVersion !== expectedFirst;\n\n assertTrue(!hasGap, \"Should not detect gap (v6 == v6)\");\n }),\n },\n];\n\nconst recoveryScenarioTests: IntegrationTestCase[] = [\n {\n name: \"full recovery: snapshot + WAL + new transactions\",\n category: Categories.RECOVERY_SCENARIOS,\n run: Effect.gen(function* () {\n const cold = yield* ColdStorageTag;\n const hot = yield* HotStorageTag;\n\n const docId = \"full-recovery\";\n\n // Initial state: snapshot at v3, WAL v4-v5\n yield* cold.save(docId, makeSnapshot(3, { count: 3 }));\n yield* hot.append(docId, makeWalEntry(4));\n yield* hot.append(docId, makeWalEntry(5));\n\n // \"Recovery\" - load snapshot and WAL\n const snapshot = yield* cold.load(docId);\n const walEntries = yield* hot.getEntries(docId, snapshot!.version);\n\n assertEqual(snapshot!.version, 3, \"Snapshot version\");\n assertLength(walEntries, 2, \"WAL entries to replay\");\n\n // Simulate new transaction after recovery\n yield* hot.append(docId, makeWalEntry(6));\n\n const newWal = yield* hot.getEntries(docId, 5);\n assertLength(newWal, 1, \"One new entry after recovery\");\n assertEqual(newWal[0]!.version, 6, \"New entry is v6\");\n }),\n },\n\n {\n name: \"recovery from only WAL (cold start)\",\n category: Categories.RECOVERY_SCENARIOS,\n run: Effect.gen(function* () {\n const cold = yield* ColdStorageTag;\n const hot = yield* HotStorageTag;\n\n const docId = \"cold-start\";\n\n // Only WAL entries, no snapshot (new document that hasn't been snapshotted)\n yield* hot.append(docId, makeWalEntry(1));\n yield* hot.append(docId, makeWalEntry(2));\n\n const snapshot = yield* cold.load(docId);\n const walEntries = yield* hot.getEntries(docId, 0);\n\n assertUndefined(snapshot, \"No snapshot exists\");\n assertLength(walEntries, 2, \"All WAL entries from beginning\");\n }),\n },\n\n {\n name: \"recovery after truncation failure (WAL has old entries)\",\n category: Categories.RECOVERY_SCENARIOS,\n run: Effect.gen(function* () {\n const cold = yield* ColdStorageTag;\n const hot = yield* HotStorageTag;\n\n const docId = \"truncate-failed\";\n\n // Simulate: snapshot saved at v5, but truncate failed\n // So WAL still has v3, v4, v5, v6\n yield* hot.append(docId, makeWalEntry(3));\n yield* hot.append(docId, makeWalEntry(4));\n yield* hot.append(docId, makeWalEntry(5));\n yield* hot.append(docId, makeWalEntry(6));\n\n yield* cold.save(docId, makeSnapshot(5));\n\n // Recovery should only replay v6\n const snapshot = yield* cold.load(docId);\n const walEntries = yield* hot.getEntries(docId, snapshot!.version);\n\n assertEqual(snapshot!.version, 5, \"Snapshot at v5\");\n assertLength(walEntries, 1, \"Only v6 should be replayed\");\n assertEqual(walEntries[0]!.version, 6, \"Entry is v6\");\n }),\n },\n\n {\n name: \"idempotent snapshot save\",\n category: Categories.RECOVERY_SCENARIOS,\n run: Effect.gen(function* () {\n const cold = yield* ColdStorageTag;\n\n const docId = \"idempotent\";\n\n const snapshot1 = makeSnapshot(5, { first: true });\n const snapshot2 = makeSnapshot(5, { second: true });\n\n yield* cold.save(docId, snapshot1);\n yield* cold.save(docId, snapshot2);\n\n const loaded = yield* cold.load(docId);\n\n // Last write wins\n assertEqual(loaded!.state, { second: true }, \"Second save overwrites\");\n }),\n },\n];\n\nconst transactionEncodingTests: IntegrationTestCase[] = [\n {\n name: \"OperationPath survives full recovery cycle (snapshot + WAL)\",\n category: Categories.TRANSACTION_ENCODING,\n run: Effect.gen(function* () {\n const cold = yield* ColdStorageTag;\n const hot = yield* HotStorageTag;\n\n const docId = \"op-path-recovery\";\n\n // Save snapshot at v3\n yield* cold.save(docId, makeSnapshot(3, { count: 3 }));\n\n // Add WAL entries with proper OperationPath\n yield* hot.append(docId, makeWalEntry(4, \"users/0/name\", \"Alice\"));\n yield* hot.append(docId, makeWalEntry(5, \"users/1/name\", \"Bob\"));\n\n // Simulate recovery\n const snapshot = yield* cold.load(docId);\n const walEntries = yield* hot.getEntries(docId, snapshot!.version);\n\n assertLength(walEntries, 2, \"Should have 2 WAL entries\");\n\n // Verify OperationPath is properly reconstructed\n const firstOp = walEntries[0]!.transaction.ops[0]!;\n const secondOp = walEntries[1]!.transaction.ops[0]!;\n\n assertTrue(\n firstOp.path._tag === \"OperationPath\",\n \"First op path should be OperationPath\"\n );\n assertTrue(\n typeof firstOp.path.toTokens === \"function\",\n \"First op path should have toTokens method\"\n );\n assertEqual(\n firstOp.path.toTokens(),\n [\"users\", \"0\", \"name\"],\n \"First op path tokens should be correct\"\n );\n assertEqual(\n secondOp.path.toTokens(),\n [\"users\", \"1\", \"name\"],\n \"Second op path tokens should be correct\"\n );\n }),\n },\n\n {\n name: \"OperationPath methods work after WAL-only recovery\",\n category: Categories.TRANSACTION_ENCODING,\n run: Effect.gen(function* () {\n const cold = yield* ColdStorageTag;\n const hot = yield* HotStorageTag;\n\n const docId = \"op-path-wal-only\";\n\n // No snapshot, only WAL\n yield* hot.append(docId, makeWalEntry(1, \"config/theme\", \"dark\"));\n yield* hot.append(docId, makeWalEntry(2, \"config/language\", \"en\"));\n\n const snapshot = yield* cold.load(docId);\n assertUndefined(snapshot, \"No snapshot should exist\");\n\n const walEntries = yield* hot.getEntries(docId, 0);\n assertLength(walEntries, 2, \"Should have 2 WAL entries\");\n\n // Test OperationPath methods\n const path = walEntries[0]!.transaction.ops[0]!.path;\n\n // Test concat\n const extended = path.concat(OperationPath.make(\"subkey\"));\n assertEqual(\n extended.toTokens(),\n [\"config\", \"theme\", \"subkey\"],\n \"concat should work\"\n );\n\n // Test pop\n const popped = path.pop();\n assertEqual(popped.toTokens(), [\"config\"], \"pop should work\");\n\n // Test append\n const appended = path.append(\"extra\");\n assertEqual(\n appended.toTokens(),\n [\"config\", \"theme\", \"extra\"],\n \"append should work\"\n );\n }),\n },\n\n {\n name: \"transaction encoding survives truncation cycle\",\n category: Categories.TRANSACTION_ENCODING,\n run: Effect.gen(function* () {\n const cold = yield* ColdStorageTag;\n const hot = yield* HotStorageTag;\n\n const docId = \"op-path-truncate-cycle\";\n\n // Add WAL entries 1-5\n for (let i = 1; i <= 5; i++) {\n yield* hot.append(docId, makeWalEntry(i, `path/${i}`, `value${i}`));\n }\n\n // Save snapshot at v3 and truncate\n yield* cold.save(docId, makeSnapshot(3));\n yield* hot.truncate(docId, 3);\n\n // Verify remaining entries have proper OperationPath\n const walEntries = yield* hot.getEntries(docId, 0);\n assertLength(walEntries, 2, \"Should have versions 4 and 5\");\n\n for (const entry of walEntries) {\n const op = entry.transaction.ops[0]!;\n assertTrue(\n op.path._tag === \"OperationPath\",\n \"Path should be OperationPath after truncation\"\n );\n assertTrue(\n typeof op.path.toTokens === \"function\",\n \"Path should have toTokens method after truncation\"\n );\n }\n\n assertEqual(\n walEntries[0]!.transaction.ops[0]!.path.toTokens(),\n [\"path\", \"4\"],\n \"Version 4 path should be correct\"\n );\n assertEqual(\n walEntries[1]!.transaction.ops[0]!.path.toTokens(),\n [\"path\", \"5\"],\n \"Version 5 path should be correct\"\n );\n }),\n },\n\n {\n name: \"complex nested paths survive integration roundtrip\",\n category: Categories.TRANSACTION_ENCODING,\n run: Effect.gen(function* () {\n const hot = yield* HotStorageTag;\n\n const docId = \"complex-nested-paths\";\n\n const complexPath = \"documents/users/0/profile/settings/notifications\";\n yield* hot.append(docId, makeWalEntry(1, complexPath, { enabled: true }));\n\n const entries = yield* hot.getEntries(docId, 0);\n assertLength(entries, 1, \"Should have one entry\");\n\n const op = entries[0]!.transaction.ops[0]!;\n assertEqual(\n op.path.toTokens(),\n [\"documents\", \"users\", \"0\", \"profile\", \"settings\", \"notifications\"],\n \"Complex nested path should survive roundtrip\"\n );\n\n // Test that path operations work on complex paths\n const shifted = op.path.shift();\n assertEqual(\n shifted.toTokens(),\n [\"users\", \"0\", \"profile\", \"settings\", \"notifications\"],\n \"shift should work on complex path\"\n );\n }),\n },\n\n {\n name: \"multiple operations per transaction preserve all OperationPaths\",\n category: Categories.TRANSACTION_ENCODING,\n run: Effect.gen(function* () {\n const hot = yield* HotStorageTag;\n\n const docId = \"multi-op-integration\";\n\n const entry: WalEntry = {\n transaction: Transaction.make([\n Operation.fromDefinition(OperationPath.make(\"users/0\"), TestSetDefinition, { name: \"Alice\" }),\n Operation.fromDefinition(OperationPath.make(\"users/1\"), TestSetDefinition, { name: \"Bob\" }),\n Operation.fromDefinition(OperationPath.make(\"meta/count\"), TestSetDefinition, 2),\n ]),\n version: 1,\n timestamp: Date.now(),\n };\n\n yield* hot.append(docId, entry);\n\n const entries = yield* hot.getEntries(docId, 0);\n assertLength(entries, 1, \"Should have one entry\");\n\n const ops = entries[0]!.transaction.ops;\n assertEqual(ops.length, 3, \"Should have 3 operations\");\n\n // Verify all paths\n assertEqual(ops[0]!.path.toTokens(), [\"users\", \"0\"], \"First path correct\");\n assertEqual(ops[1]!.path.toTokens(), [\"users\", \"1\"], \"Second path correct\");\n assertEqual(ops[2]!.path.toTokens(), [\"meta\", \"count\"], \"Third path correct\");\n\n // Verify all have methods\n for (const op of ops) {\n assertTrue(\n typeof op.path.concat === \"function\",\n \"Each path should have concat method\"\n );\n assertTrue(\n typeof op.path.append === \"function\",\n \"Each path should have append method\"\n );\n }\n }),\n },\n];\n\n// =============================================================================\n// Test Suite Export\n// =============================================================================\n\n/**\n * Generate all integration test cases\n */\nexport const makeTests = (): IntegrationTestCase[] => [\n ...snapshotWalCoordinationTests,\n ...versionVerificationTests,\n ...recoveryScenarioTests,\n ...transactionEncodingTests,\n];\n\n/**\n * Run all integration tests and collect results\n */\nexport const runAll = <R>(\n layer: import(\"effect\").Layer.Layer<ColdStorageTag | HotStorageTag, never, R>\n) =>\n Effect.gen(function* () {\n const tests = makeTests();\n const results: Array<{ name: string; passed: boolean; error?: unknown }> = [];\n\n for (const test of tests) {\n const result = yield* Effect.either(test.run.pipe(Effect.provide(layer)));\n\n if (result._tag === \"Right\") {\n results.push({ name: test.name, passed: true });\n } else {\n results.push({ name: test.name, passed: false, error: result.left });\n }\n }\n\n return results;\n });\n\n// =============================================================================\n// Export Namespace\n// =============================================================================\n\nexport const StorageIntegrationTestSuite = {\n Categories,\n makeTests,\n runAll,\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"StorageIntegrationTestSuite.mjs","names":["snapshotWalCoordinationTests: IntegrationTestCase[]","versionVerificationTests: IntegrationTestCase[]","recoveryScenarioTests: IntegrationTestCase[]","transactionEncodingTests: IntegrationTestCase[]","entry: WalEntry","results: Array<{ name: string; passed: boolean; error?: unknown }>"],"sources":["../../src/testing/StorageIntegrationTestSuite.ts"],"sourcesContent":["/**\n * @voidhash/mimic-effect/testing - StorageIntegrationTestSuite\n *\n * Integration tests for verifying Hot/Cold storage coordination.\n * Tests snapshot + WAL replay, failure handling, and version verification.\n *\n * @example\n * ```typescript\n * import { StorageIntegrationTestSuite } from \"@voidhash/mimic-effect/testing\";\n * import { describe, it } from \"vitest\";\n * import { Effect, Layer } from \"effect\";\n * import { ColdStorage, HotStorage } from \"@voidhash/mimic-effect\";\n *\n * describe(\"Storage Integration\", () => {\n * const layer = Layer.mergeAll(\n * ColdStorage.InMemory.make(),\n * HotStorage.InMemory.make()\n * );\n *\n * for (const test of StorageIntegrationTestSuite.makeTests()) {\n * it(test.name, () =>\n * Effect.runPromise(test.run.pipe(Effect.provide(layer)))\n * );\n * }\n * });\n * ```\n */\nimport { Effect, Schema } from \"effect\";\nimport { Transaction, OperationPath, Operation, OperationDefinition } from \"@voidhash/mimic\";\nimport { ColdStorageTag } from \"../ColdStorage\";\nimport { HotStorageTag } from \"../HotStorage\";\nimport { ColdStorageError, HotStorageError } from \"../Errors\";\nimport type { StoredDocument, WalEntry } from \"../Types\";\nimport type { StorageTestCase } from \"./types\";\nimport {\n assertEqual,\n assertTrue,\n assertLength,\n assertEmpty,\n assertDefined,\n assertUndefined,\n} from \"./assertions\";\n\n// =============================================================================\n// Test Categories\n// =============================================================================\n\nexport const Categories = {\n SNAPSHOT_WAL_COORDINATION: \"Snapshot + WAL Coordination\",\n VERSION_VERIFICATION: \"Version Verification\",\n RECOVERY_SCENARIOS: \"Recovery Scenarios\",\n TRANSACTION_ENCODING: \"Transaction Encoding\",\n} as const;\n\n// =============================================================================\n// Test Operation Definitions\n// =============================================================================\n\n/**\n * Test operation definition for creating proper Operation objects in tests.\n */\nconst TestSetDefinition = OperationDefinition.make({\n kind: \"test.set\" as const,\n payload: Schema.Unknown,\n target: Schema.Unknown,\n apply: (payload: unknown) => payload,\n});\n\n// =============================================================================\n// Test Helpers\n// =============================================================================\n\nconst makeSnapshot = (\n version: number,\n state: unknown = { data: `v${version}` }\n): StoredDocument => ({\n state,\n version,\n schemaVersion: 1,\n savedAt: Date.now(),\n});\n\nconst makeWalEntry = (\n version: number,\n pathString: string = \"data\",\n payload: unknown = `v${version}`\n): WalEntry => ({\n transaction: Transaction.make([\n Operation.fromDefinition(OperationPath.make(pathString), TestSetDefinition, payload),\n ]),\n version,\n timestamp: Date.now(),\n});\n\n// =============================================================================\n// Test Definitions\n// =============================================================================\n\ntype IntegrationTestCase = StorageTestCase<ColdStorageError | HotStorageError, ColdStorageTag | HotStorageTag>;\n\nconst snapshotWalCoordinationTests: IntegrationTestCase[] = [\n {\n name: \"load empty document returns undefined snapshot and empty WAL\",\n category: Categories.SNAPSHOT_WAL_COORDINATION,\n run: Effect.gen(function* () {\n const cold = yield* ColdStorageTag;\n const hot = yield* HotStorageTag;\n\n const snapshot = yield* cold.load(\"empty-doc\");\n const walEntries = yield* hot.getEntries(\"empty-doc\", 0);\n\n assertUndefined(snapshot, \"Snapshot should be undefined for new doc\");\n assertEmpty(walEntries, \"WAL should be empty for new doc\");\n }),\n },\n\n {\n name: \"restore from snapshot only (no WAL)\",\n category: Categories.SNAPSHOT_WAL_COORDINATION,\n run: Effect.gen(function* () {\n const cold = yield* ColdStorageTag;\n const hot = yield* HotStorageTag;\n\n const docId = \"snapshot-only\";\n const snapshot = makeSnapshot(5, { title: \"Hello\" });\n\n yield* cold.save(docId, snapshot);\n\n const loaded = yield* cold.load(docId);\n const walEntries = yield* hot.getEntries(docId, 5);\n\n assertDefined(loaded, \"Snapshot should be loaded\");\n assertEqual(loaded!.version, 5, \"Snapshot version should match\");\n assertEqual(loaded!.state, { title: \"Hello\" }, \"Snapshot state should match\");\n assertEmpty(walEntries, \"WAL should be empty after snapshot version\");\n }),\n },\n\n {\n name: \"restore from WAL only (no snapshot)\",\n category: Categories.SNAPSHOT_WAL_COORDINATION,\n run: Effect.gen(function* () {\n const cold = yield* ColdStorageTag;\n const hot = yield* HotStorageTag;\n\n const docId = \"wal-only\";\n\n yield* hot.append(docId, makeWalEntry(1));\n yield* hot.append(docId, makeWalEntry(2));\n yield* hot.append(docId, makeWalEntry(3));\n\n const snapshot = yield* cold.load(docId);\n const walEntries = yield* hot.getEntries(docId, 0);\n\n assertUndefined(snapshot, \"No snapshot should exist\");\n assertLength(walEntries, 3, \"Should have 3 WAL entries\");\n assertEqual(walEntries[0]!.version, 1, \"First entry should be v1\");\n assertEqual(walEntries[2]!.version, 3, \"Last entry should be v3\");\n }),\n },\n\n {\n name: \"restore from snapshot + WAL replay\",\n category: Categories.SNAPSHOT_WAL_COORDINATION,\n run: Effect.gen(function* () {\n const cold = yield* ColdStorageTag;\n const hot = yield* HotStorageTag;\n\n const docId = \"snapshot-plus-wal\";\n\n // Save snapshot at v5\n yield* cold.save(docId, makeSnapshot(5));\n\n // Add WAL entries for v6, v7, v8\n yield* hot.append(docId, makeWalEntry(6));\n yield* hot.append(docId, makeWalEntry(7));\n yield* hot.append(docId, makeWalEntry(8));\n\n const snapshot = yield* cold.load(docId);\n const walEntries = yield* hot.getEntries(docId, snapshot!.version);\n\n assertEqual(snapshot!.version, 5, \"Snapshot at v5\");\n assertLength(walEntries, 3, \"3 WAL entries after snapshot\");\n assertEqual(walEntries[0]!.version, 6, \"First WAL entry is v6\");\n assertEqual(walEntries[2]!.version, 8, \"Last WAL entry is v8\");\n }),\n },\n\n {\n name: \"truncate WAL after snapshot\",\n category: Categories.SNAPSHOT_WAL_COORDINATION,\n run: Effect.gen(function* () {\n const cold = yield* ColdStorageTag;\n const hot = yield* HotStorageTag;\n\n const docId = \"truncate-test\";\n\n // Add WAL entries 1-5\n for (let i = 1; i <= 5; i++) {\n yield* hot.append(docId, makeWalEntry(i));\n }\n\n // Save snapshot at v3\n yield* cold.save(docId, makeSnapshot(3));\n\n // Truncate WAL up to v3\n yield* hot.truncate(docId, 3);\n\n const walEntries = yield* hot.getEntries(docId, 0);\n\n assertLength(walEntries, 2, \"Only v4 and v5 should remain\");\n assertEqual(walEntries[0]!.version, 4, \"First remaining is v4\");\n assertEqual(walEntries[1]!.version, 5, \"Last remaining is v5\");\n }),\n },\n\n {\n name: \"snapshot overwrites previous snapshot\",\n category: Categories.SNAPSHOT_WAL_COORDINATION,\n run: Effect.gen(function* () {\n const cold = yield* ColdStorageTag;\n\n const docId = \"overwrite-test\";\n\n yield* cold.save(docId, makeSnapshot(1, { old: true }));\n yield* cold.save(docId, makeSnapshot(5, { new: true }));\n\n const loaded = yield* cold.load(docId);\n\n assertEqual(loaded!.version, 5, \"Should have newer version\");\n assertEqual(loaded!.state, { new: true }, \"Should have newer state\");\n }),\n },\n];\n\nconst versionVerificationTests: IntegrationTestCase[] = [\n {\n name: \"WAL entries are ordered by version\",\n category: Categories.VERSION_VERIFICATION,\n run: Effect.gen(function* () {\n const hot = yield* HotStorageTag;\n\n const docId = \"ordering-test\";\n\n // Append out of order\n yield* hot.append(docId, makeWalEntry(3));\n yield* hot.append(docId, makeWalEntry(1));\n yield* hot.append(docId, makeWalEntry(2));\n\n const entries = yield* hot.getEntries(docId, 0);\n\n assertLength(entries, 3, \"All entries should be returned\");\n assertEqual(entries[0]!.version, 1, \"First should be v1\");\n assertEqual(entries[1]!.version, 2, \"Second should be v2\");\n assertEqual(entries[2]!.version, 3, \"Third should be v3\");\n }),\n },\n\n {\n name: \"getEntries filters by sinceVersion correctly\",\n category: Categories.VERSION_VERIFICATION,\n run: Effect.gen(function* () {\n const hot = yield* HotStorageTag;\n\n const docId = \"filter-test\";\n\n for (let i = 1; i <= 10; i++) {\n yield* hot.append(docId, makeWalEntry(i));\n }\n\n const fromV5 = yield* hot.getEntries(docId, 5);\n const fromV8 = yield* hot.getEntries(docId, 8);\n const fromV10 = yield* hot.getEntries(docId, 10);\n\n assertLength(fromV5, 5, \"v6-v10 = 5 entries\");\n assertEqual(fromV5[0]!.version, 6, \"First entry after v5 is v6\");\n\n assertLength(fromV8, 2, \"v9-v10 = 2 entries\");\n assertEqual(fromV8[0]!.version, 9, \"First entry after v8 is v9\");\n\n assertEmpty(fromV10, \"No entries after v10\");\n }),\n },\n\n {\n name: \"detect version gap between snapshot and WAL\",\n category: Categories.VERSION_VERIFICATION,\n run: Effect.gen(function* () {\n const cold = yield* ColdStorageTag;\n const hot = yield* HotStorageTag;\n\n const docId = \"gap-detection\";\n\n // Snapshot at v5\n yield* cold.save(docId, makeSnapshot(5));\n\n // WAL starts at v7 (gap: v6 missing)\n yield* hot.append(docId, makeWalEntry(7));\n yield* hot.append(docId, makeWalEntry(8));\n\n const snapshot = yield* cold.load(docId);\n const walEntries = yield* hot.getEntries(docId, snapshot!.version);\n\n assertEqual(snapshot!.version, 5, \"Snapshot at v5\");\n assertLength(walEntries, 2, \"Two WAL entries\");\n\n // Gap detection: first WAL entry should be v6, but it's v7\n const firstWalVersion = walEntries[0]!.version;\n const expectedFirst = snapshot!.version + 1;\n const hasGap = firstWalVersion !== expectedFirst;\n\n assertTrue(hasGap, \"Should detect gap (v7 != v6)\");\n }),\n },\n\n {\n name: \"detect internal WAL gaps\",\n category: Categories.VERSION_VERIFICATION,\n run: Effect.gen(function* () {\n const hot = yield* HotStorageTag;\n\n const docId = \"internal-gap\";\n\n yield* hot.append(docId, makeWalEntry(1));\n yield* hot.append(docId, makeWalEntry(2));\n // Skip v3\n yield* hot.append(docId, makeWalEntry(4));\n yield* hot.append(docId, makeWalEntry(5));\n\n const entries = yield* hot.getEntries(docId, 0);\n\n // Check for internal gaps\n let gapFound = false;\n for (let i = 1; i < entries.length; i++) {\n const prev = entries[i - 1]!.version;\n const curr = entries[i]!.version;\n if (curr !== prev + 1) {\n gapFound = true;\n break;\n }\n }\n\n assertTrue(gapFound, \"Should detect internal gap between v2 and v4\");\n }),\n },\n\n {\n name: \"no gap when WAL is continuous\",\n category: Categories.VERSION_VERIFICATION,\n run: Effect.gen(function* () {\n const cold = yield* ColdStorageTag;\n const hot = yield* HotStorageTag;\n\n const docId = \"no-gap\";\n\n yield* cold.save(docId, makeSnapshot(5));\n yield* hot.append(docId, makeWalEntry(6));\n yield* hot.append(docId, makeWalEntry(7));\n yield* hot.append(docId, makeWalEntry(8));\n\n const snapshot = yield* cold.load(docId);\n const walEntries = yield* hot.getEntries(docId, snapshot!.version);\n\n const firstWalVersion = walEntries[0]!.version;\n const expectedFirst = snapshot!.version + 1;\n const hasGap = firstWalVersion !== expectedFirst;\n\n assertTrue(!hasGap, \"Should not detect gap (v6 == v6)\");\n }),\n },\n];\n\nconst recoveryScenarioTests: IntegrationTestCase[] = [\n {\n name: \"full recovery: snapshot + WAL + new transactions\",\n category: Categories.RECOVERY_SCENARIOS,\n run: Effect.gen(function* () {\n const cold = yield* ColdStorageTag;\n const hot = yield* HotStorageTag;\n\n const docId = \"full-recovery\";\n\n // Initial state: snapshot at v3, WAL v4-v5\n yield* cold.save(docId, makeSnapshot(3, { count: 3 }));\n yield* hot.append(docId, makeWalEntry(4));\n yield* hot.append(docId, makeWalEntry(5));\n\n // \"Recovery\" - load snapshot and WAL\n const snapshot = yield* cold.load(docId);\n const walEntries = yield* hot.getEntries(docId, snapshot!.version);\n\n assertEqual(snapshot!.version, 3, \"Snapshot version\");\n assertLength(walEntries, 2, \"WAL entries to replay\");\n\n // Simulate new transaction after recovery\n yield* hot.append(docId, makeWalEntry(6));\n\n const newWal = yield* hot.getEntries(docId, 5);\n assertLength(newWal, 1, \"One new entry after recovery\");\n assertEqual(newWal[0]!.version, 6, \"New entry is v6\");\n }),\n },\n\n {\n name: \"recovery from only WAL (cold start)\",\n category: Categories.RECOVERY_SCENARIOS,\n run: Effect.gen(function* () {\n const cold = yield* ColdStorageTag;\n const hot = yield* HotStorageTag;\n\n const docId = \"cold-start\";\n\n // Only WAL entries, no snapshot (new document that hasn't been snapshotted)\n yield* hot.append(docId, makeWalEntry(1));\n yield* hot.append(docId, makeWalEntry(2));\n\n const snapshot = yield* cold.load(docId);\n const walEntries = yield* hot.getEntries(docId, 0);\n\n assertUndefined(snapshot, \"No snapshot exists\");\n assertLength(walEntries, 2, \"All WAL entries from beginning\");\n }),\n },\n\n {\n name: \"recovery after truncation failure (WAL has old entries)\",\n category: Categories.RECOVERY_SCENARIOS,\n run: Effect.gen(function* () {\n const cold = yield* ColdStorageTag;\n const hot = yield* HotStorageTag;\n\n const docId = \"truncate-failed\";\n\n // Simulate: snapshot saved at v5, but truncate failed\n // So WAL still has v3, v4, v5, v6\n yield* hot.append(docId, makeWalEntry(3));\n yield* hot.append(docId, makeWalEntry(4));\n yield* hot.append(docId, makeWalEntry(5));\n yield* hot.append(docId, makeWalEntry(6));\n\n yield* cold.save(docId, makeSnapshot(5));\n\n // Recovery should only replay v6\n const snapshot = yield* cold.load(docId);\n const walEntries = yield* hot.getEntries(docId, snapshot!.version);\n\n assertEqual(snapshot!.version, 5, \"Snapshot at v5\");\n assertLength(walEntries, 1, \"Only v6 should be replayed\");\n assertEqual(walEntries[0]!.version, 6, \"Entry is v6\");\n }),\n },\n\n {\n name: \"idempotent snapshot save\",\n category: Categories.RECOVERY_SCENARIOS,\n run: Effect.gen(function* () {\n const cold = yield* ColdStorageTag;\n\n const docId = \"idempotent\";\n\n const snapshot1 = makeSnapshot(5, { first: true });\n const snapshot2 = makeSnapshot(5, { second: true });\n\n yield* cold.save(docId, snapshot1);\n yield* cold.save(docId, snapshot2);\n\n const loaded = yield* cold.load(docId);\n\n // Last write wins\n assertEqual(loaded!.state, { second: true }, \"Second save overwrites\");\n }),\n },\n];\n\nconst transactionEncodingTests: IntegrationTestCase[] = [\n {\n name: \"OperationPath survives full recovery cycle (snapshot + WAL)\",\n category: Categories.TRANSACTION_ENCODING,\n run: Effect.gen(function* () {\n const cold = yield* ColdStorageTag;\n const hot = yield* HotStorageTag;\n\n const docId = \"op-path-recovery\";\n\n // Save snapshot at v3\n yield* cold.save(docId, makeSnapshot(3, { count: 3 }));\n\n // Add WAL entries with proper OperationPath\n yield* hot.append(docId, makeWalEntry(4, \"users/0/name\", \"Alice\"));\n yield* hot.append(docId, makeWalEntry(5, \"users/1/name\", \"Bob\"));\n\n // Simulate recovery\n const snapshot = yield* cold.load(docId);\n const walEntries = yield* hot.getEntries(docId, snapshot!.version);\n\n assertLength(walEntries, 2, \"Should have 2 WAL entries\");\n\n // Verify OperationPath is properly reconstructed\n const firstOp = walEntries[0]!.transaction.ops[0]!;\n const secondOp = walEntries[1]!.transaction.ops[0]!;\n\n assertTrue(\n firstOp.path._tag === \"OperationPath\",\n \"First op path should be OperationPath\"\n );\n assertTrue(\n typeof firstOp.path.toTokens === \"function\",\n \"First op path should have toTokens method\"\n );\n assertEqual(\n firstOp.path.toTokens(),\n [\"users\", \"0\", \"name\"],\n \"First op path tokens should be correct\"\n );\n assertEqual(\n secondOp.path.toTokens(),\n [\"users\", \"1\", \"name\"],\n \"Second op path tokens should be correct\"\n );\n }),\n },\n\n {\n name: \"OperationPath methods work after WAL-only recovery\",\n category: Categories.TRANSACTION_ENCODING,\n run: Effect.gen(function* () {\n const cold = yield* ColdStorageTag;\n const hot = yield* HotStorageTag;\n\n const docId = \"op-path-wal-only\";\n\n // No snapshot, only WAL\n yield* hot.append(docId, makeWalEntry(1, \"config/theme\", \"dark\"));\n yield* hot.append(docId, makeWalEntry(2, \"config/language\", \"en\"));\n\n const snapshot = yield* cold.load(docId);\n assertUndefined(snapshot, \"No snapshot should exist\");\n\n const walEntries = yield* hot.getEntries(docId, 0);\n assertLength(walEntries, 2, \"Should have 2 WAL entries\");\n\n // Test OperationPath methods\n const path = walEntries[0]!.transaction.ops[0]!.path;\n\n // Test concat\n const extended = path.concat(OperationPath.make(\"subkey\"));\n assertEqual(\n extended.toTokens(),\n [\"config\", \"theme\", \"subkey\"],\n \"concat should work\"\n );\n\n // Test pop\n const popped = path.pop();\n assertEqual(popped.toTokens(), [\"config\"], \"pop should work\");\n\n // Test append\n const appended = path.append(\"extra\");\n assertEqual(\n appended.toTokens(),\n [\"config\", \"theme\", \"extra\"],\n \"append should work\"\n );\n }),\n },\n\n {\n name: \"transaction encoding survives truncation cycle\",\n category: Categories.TRANSACTION_ENCODING,\n run: Effect.gen(function* () {\n const cold = yield* ColdStorageTag;\n const hot = yield* HotStorageTag;\n\n const docId = \"op-path-truncate-cycle\";\n\n // Add WAL entries 1-5\n for (let i = 1; i <= 5; i++) {\n yield* hot.append(docId, makeWalEntry(i, `path/${i}`, `value${i}`));\n }\n\n // Save snapshot at v3 and truncate\n yield* cold.save(docId, makeSnapshot(3));\n yield* hot.truncate(docId, 3);\n\n // Verify remaining entries have proper OperationPath\n const walEntries = yield* hot.getEntries(docId, 0);\n assertLength(walEntries, 2, \"Should have versions 4 and 5\");\n\n for (const entry of walEntries) {\n const op = entry.transaction.ops[0]!;\n assertTrue(\n op.path._tag === \"OperationPath\",\n \"Path should be OperationPath after truncation\"\n );\n assertTrue(\n typeof op.path.toTokens === \"function\",\n \"Path should have toTokens method after truncation\"\n );\n }\n\n assertEqual(\n walEntries[0]!.transaction.ops[0]!.path.toTokens(),\n [\"path\", \"4\"],\n \"Version 4 path should be correct\"\n );\n assertEqual(\n walEntries[1]!.transaction.ops[0]!.path.toTokens(),\n [\"path\", \"5\"],\n \"Version 5 path should be correct\"\n );\n }),\n },\n\n {\n name: \"complex nested paths survive integration roundtrip\",\n category: Categories.TRANSACTION_ENCODING,\n run: Effect.gen(function* () {\n const hot = yield* HotStorageTag;\n\n const docId = \"complex-nested-paths\";\n\n const complexPath = \"documents/users/0/profile/settings/notifications\";\n yield* hot.append(docId, makeWalEntry(1, complexPath, { enabled: true }));\n\n const entries = yield* hot.getEntries(docId, 0);\n assertLength(entries, 1, \"Should have one entry\");\n\n const op = entries[0]!.transaction.ops[0]!;\n assertEqual(\n op.path.toTokens(),\n [\"documents\", \"users\", \"0\", \"profile\", \"settings\", \"notifications\"],\n \"Complex nested path should survive roundtrip\"\n );\n\n // Test that path operations work on complex paths\n const shifted = op.path.shift();\n assertEqual(\n shifted.toTokens(),\n [\"users\", \"0\", \"profile\", \"settings\", \"notifications\"],\n \"shift should work on complex path\"\n );\n }),\n },\n\n {\n name: \"multiple operations per transaction preserve all OperationPaths\",\n category: Categories.TRANSACTION_ENCODING,\n run: Effect.gen(function* () {\n const hot = yield* HotStorageTag;\n\n const docId = \"multi-op-integration\";\n\n const entry: WalEntry = {\n transaction: Transaction.make([\n Operation.fromDefinition(OperationPath.make(\"users/0\"), TestSetDefinition, { name: \"Alice\" }),\n Operation.fromDefinition(OperationPath.make(\"users/1\"), TestSetDefinition, { name: \"Bob\" }),\n Operation.fromDefinition(OperationPath.make(\"meta/count\"), TestSetDefinition, 2),\n ]),\n version: 1,\n timestamp: Date.now(),\n };\n\n yield* hot.append(docId, entry);\n\n const entries = yield* hot.getEntries(docId, 0);\n assertLength(entries, 1, \"Should have one entry\");\n\n const ops = entries[0]!.transaction.ops;\n assertEqual(ops.length, 3, \"Should have 3 operations\");\n\n // Verify all paths\n assertEqual(ops[0]!.path.toTokens(), [\"users\", \"0\"], \"First path correct\");\n assertEqual(ops[1]!.path.toTokens(), [\"users\", \"1\"], \"Second path correct\");\n assertEqual(ops[2]!.path.toTokens(), [\"meta\", \"count\"], \"Third path correct\");\n\n // Verify all have methods\n for (const op of ops) {\n assertTrue(\n typeof op.path.concat === \"function\",\n \"Each path should have concat method\"\n );\n assertTrue(\n typeof op.path.append === \"function\",\n \"Each path should have append method\"\n );\n }\n }),\n },\n];\n\n// =============================================================================\n// Test Suite Export\n// =============================================================================\n\n/**\n * Generate all integration test cases\n */\nexport const makeTests = (): IntegrationTestCase[] => [\n ...snapshotWalCoordinationTests,\n ...versionVerificationTests,\n ...recoveryScenarioTests,\n ...transactionEncodingTests,\n];\n\n/**\n * Run all integration tests and collect results\n */\nexport const runAll = <R>(\n layer: import(\"effect\").Layer.Layer<ColdStorageTag | HotStorageTag, never, R>\n) =>\n Effect.gen(function* () {\n const tests = makeTests();\n const results: Array<{ name: string; passed: boolean; error?: unknown }> = [];\n\n for (const test of tests) {\n const result = yield* Effect.result(test.run.pipe(Effect.provide(layer)));\n\n if (result._tag === \"Success\") {\n results.push({ name: test.name, passed: true });\n } else {\n results.push({ name: test.name, passed: false, error: result.failure });\n }\n }\n\n return results;\n });\n\n// =============================================================================\n// Export Namespace\n// =============================================================================\n\nexport const StorageIntegrationTestSuite = {\n Categories,\n makeTests,\n runAll,\n};\n"],"mappings":"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"}
@@ -1,10 +1,10 @@
1
1
  import { Effect } from "effect";
2
- import * as effect_Types7 from "effect/Types";
3
- import * as effect_Cause7 from "effect/Cause";
2
+ import * as effect_Types0 from "effect/Types";
3
+ import * as effect_Cause0 from "effect/Cause";
4
4
 
5
5
  //#region src/testing/types.d.ts
6
6
 
7
- declare const TestError_base: new <A extends Record<string, any> = {}>(args: effect_Types7.Equals<A, {}> extends true ? void : { readonly [P in keyof A as P extends "_tag" ? never : P]: A[P] }) => effect_Cause7.YieldableError & {
7
+ declare const TestError_base: new <A extends Record<string, any> = {}>(args: effect_Types0.MatchRecord<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P] }, void, { readonly [P in keyof A as P extends "_tag" ? never : P]: A[P] }>) => effect_Cause0.YieldableError & {
8
8
  readonly _tag: "TestError";
9
9
  } & Readonly<A>;
10
10
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.cts","names":[],"sources":["../../src/testing/types.ts"],"sourcesContent":[],"mappings":";;;;;;cAKsC;;;;;;cASzB,SAAA,SAAkB;;;;;;EAAlB,SAAA,MAAU,CAAA,EAAA,OAAQ;AAmC/B,CAAA,CAAA,CAAA;;;;AAgBA;;;;;;AAuBA;;;;;;;;;;;;;UAvCiB;;;;;;gBAMD,MAAA,CAAO,aAAa,GAAG;;;;;UAUtB;;iBAEA,gBAAgB,GAAG;;kBAElB;;;;;;;;;;;;;;;;;;UAmBD;;mBAEE,gBAAgB,GAAG;;mBAEnB,WAAW,GAAG"}
1
+ {"version":3,"file":"types.d.cts","names":[],"sources":["../../src/testing/types.ts"],"sourcesContent":[],"mappings":";;;;;;cAKsC;;;;;;cASzB,SAAA,SAAkB;;;;;;;;;AAA/B;AAmCA;;;;;AAgBA;;;;;;AAuBA;;;;;;;;;UAvCiB;;;;;;gBAMD,MAAA,CAAO,aAAa,GAAG;;;;;UAUtB;;iBAEA,gBAAgB,GAAG;;kBAElB;;;;;;;;;;;;;;;;;;UAmBD;;mBAEE,gBAAgB,GAAG;;mBAEnB,WAAW,GAAG"}
@@ -4,7 +4,7 @@ import * as effect_Cause0 from "effect/Cause";
4
4
 
5
5
  //#region src/testing/types.d.ts
6
6
 
7
- declare const TestError_base: new <A extends Record<string, any> = {}>(args: effect_Types0.Equals<A, {}> extends true ? void : { readonly [P in keyof A as P extends "_tag" ? never : P]: A[P] }) => effect_Cause0.YieldableError & {
7
+ declare const TestError_base: new <A extends Record<string, any> = {}>(args: effect_Types0.MatchRecord<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P] }, void, { readonly [P in keyof A as P extends "_tag" ? never : P]: A[P] }>) => effect_Cause0.YieldableError & {
8
8
  readonly _tag: "TestError";
9
9
  } & Readonly<A>;
10
10
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.mts","names":[],"sources":["../../src/testing/types.ts"],"sourcesContent":[],"mappings":";;;;;;cAKsC;;;;;;cASzB,SAAA,SAAkB;;;;;;EAAlB,SAAA,MAAU,CAAA,EAAA,OAAQ;AAmC/B,CAAA,CAAA,CAAA;;;;AAgBA;;;;;;AAuBA;;;;;;;;;;;;;UAvCiB;;;;;;gBAMD,MAAA,CAAO,aAAa,GAAG;;;;;UAUtB;;iBAEA,gBAAgB,GAAG;;kBAElB;;;;;;;;;;;;;;;;;;UAmBD;;mBAEE,gBAAgB,GAAG;;mBAEnB,WAAW,GAAG"}
1
+ {"version":3,"file":"types.d.mts","names":[],"sources":["../../src/testing/types.ts"],"sourcesContent":[],"mappings":";;;;;;cAKsC;;;;;;cASzB,SAAA,SAAkB;;;;;;;;;AAA/B;AAmCA;;;;;AAgBA;;;;;;AAuBA;;;;;;;;;UAvCiB;;;;;;gBAMD,MAAA,CAAO,aAAa,GAAG;;;;;UAUtB;;iBAEA,gBAAgB,GAAG;;kBAElB;;;;;;;;;;;;;;;;;;UAmBD;;mBAEE,gBAAgB,GAAG;;mBAEnB,WAAW,GAAG"}