@reventlessdev/reventless-core 3.0.0-alpha.259 → 3.0.0-alpha.261

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 (209) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/package.json +11 -11
  3. package/src/Behavior.res +1 -4
  4. package/src/Message.res +17 -14
  5. package/src/Projection.res +51 -25
  6. package/src/RequestContext.res +8 -9
  7. package/src/ResourceAttribution.res +28 -14
  8. package/src/adapter/Adapter.res +48 -4
  9. package/src/adapter/EventLogProvisioning/EventLogProvisioning.res +5 -5
  10. package/src/adapter/Messaging/Messaging_Log_Backend.res +10 -7
  11. package/src/adapter/Messaging/Messaging_Log_Backend.res.mjs +2 -4
  12. package/src/adapter/Monitoring/Monitoring.res +16 -17
  13. package/src/adapter/QueryInterception/QueryInterception.res +0 -1
  14. package/src/adapter/Runtime/AggregateRuntime_Builder_Common.res +12 -5
  15. package/src/adapter/Runtime/EventCollectorRuntime_Builder_Single.res +11 -7
  16. package/src/adapter/Runtime/PluginRuntime_Builder_Micro.res +1 -7
  17. package/src/adapter/Runtime/PluginRuntime_Builder_Single.res +1 -7
  18. package/src/adapter/RuntimeExtension/RuntimeExtension.res +0 -1
  19. package/src/admin/Platform_Admin.res +17 -6
  20. package/src/admin/Platform_AdminApi.res +14 -9
  21. package/src/admin/Platform_Admin_Callback.res +1 -1
  22. package/src/admin/Platform_BakedManifest.res +34 -34
  23. package/src/admin/Platform_ComponentDefinitionsApi.res +9 -21
  24. package/src/admin/Platform_PluginStructuresApi.res +15 -12
  25. package/src/admin/UiFragmentRegistry/StateChange/UiFragmentRegistry.res +1 -1
  26. package/src/components/Aggregate/Aggregate.res +13 -12
  27. package/src/components/Aggregate/Aggregate_Builder.res +22 -21
  28. package/src/components/Aggregate/Aggregate_Callback.res +91 -86
  29. package/src/components/Api/ApiNoApiHelpers.res +1 -3
  30. package/src/components/Api/Api_Ids.res +0 -1
  31. package/src/components/Api/Api_Naming.res +41 -18
  32. package/src/components/Api/GraphQL_FragmentGenerator.res +42 -52
  33. package/src/components/Api/GraphQL_FragmentGenerator.res.mjs +11 -4
  34. package/src/components/Api/GraphQL_SchemaInspector.res +5 -3
  35. package/src/components/Api/GraphQL_Stitcher.res +9 -10
  36. package/src/components/Api/MCP_SchemaGenerator.res +8 -12
  37. package/src/components/Api/OwnerScopeDiagnostics.res +1 -2
  38. package/src/components/Api/QueryDbListQuery.res +13 -6
  39. package/src/components/Api/SchemaType.res +40 -20
  40. package/src/components/Api/SchemaType.res.mjs +16 -0
  41. package/src/components/Api/SuryToJsonSchema.res +18 -10
  42. package/src/components/Api/SuryToJsonSchema.res.mjs +135 -121
  43. package/src/components/AutomationSlice/AutomationSlice.res +4 -4
  44. package/src/components/AutomationSlice/AutomationSlice_Builder.res +15 -14
  45. package/src/components/AutomationSlice/AutomationSlice_Callback.res +3 -3
  46. package/src/components/Builder_Helpers.res +12 -23
  47. package/src/components/CommandGenerator/CommandGenerator.res +6 -1
  48. package/src/components/CommandGenerator/CommandGenerator_Builder.res +29 -21
  49. package/src/components/CommandGenerator/CommandGenerator_Callback.res +17 -21
  50. package/src/components/CommandTopic/CommandTopic.res +3 -3
  51. package/src/components/CommandTopic/CommandTopic_Builder.res +10 -10
  52. package/src/components/CommandTopic/CommandTopic_Callback.res +1 -4
  53. package/src/components/CommandTopic/CommandTopic_Helpers.res +1 -2
  54. package/src/components/Counter/Counter_Builder.res +1 -6
  55. package/src/components/Counter/Counter_Callback.res +3 -3
  56. package/src/components/Dcb/Dcb_Builder.res +970 -956
  57. package/src/components/DcbEventLog/DcbEventLog.res +4 -4
  58. package/src/components/DcbEventLog/DcbEventLog_Builder.res +0 -1
  59. package/src/components/DcbEventLog/DcbEventLog_Operations.res +17 -18
  60. package/src/components/EventCollector/EventCollector_Builder.res +2 -1
  61. package/src/components/EventLog/EventLog.res +5 -1
  62. package/src/components/EventLog/EventLog_Operations.res +12 -8
  63. package/src/components/EventMapper/EventMapper.res +8 -10
  64. package/src/components/EventMapper/EventMapper_Builder.res +4 -1
  65. package/src/components/EventMapper/EventMapper_Callback.res +46 -31
  66. package/src/components/EventTopic/EventTopic.res +3 -3
  67. package/src/components/EventTopic/EventTopic_Builder.res +1 -1
  68. package/src/components/Extension/Extension.res +4 -1
  69. package/src/components/Extension/Extension_Operations.res +11 -3
  70. package/src/components/ExtensionPoint/ExtensionPoint.res +3 -3
  71. package/src/components/ExtensionPoint/ExtensionPoint_Builder.res +9 -10
  72. package/src/components/ExtensionPoint/ExtensionPoint_Callback.res +2 -6
  73. package/src/components/ExtensionPoint/ExtensionPoint_Operations.res +13 -5
  74. package/src/components/Heartbeat/Heartbeat_Callback.res +3 -3
  75. package/src/components/InboundTranslationSlice/InboundTranslationSlice.res +4 -4
  76. package/src/components/InboundTranslationSlice/InboundTranslationSlice_Builder.res +7 -10
  77. package/src/components/OutboundTranslationSlice/OutboundTranslationSlice.res +4 -4
  78. package/src/components/OutboundTranslationSlice/OutboundTranslationSlice_Builder.res +15 -14
  79. package/src/components/QueryDb/QueryDb_Adapter.res +1 -3
  80. package/src/components/QueryDb/QueryDb_Operations.res +10 -10
  81. package/src/components/ReadModel/ReadModel.res +3 -3
  82. package/src/components/ReadModel/ReadModel_Builder.res +1 -2
  83. package/src/components/ReadModel/ReadModel_Callback.res +2 -1
  84. package/src/components/SideEffectHandler/SideEffectHandler_Callback.res +5 -2
  85. package/src/components/StateChangeSlice/StateChangeSlice.res +3 -3
  86. package/src/components/StateChangeSlice/StateChangeSlice_Builder.res +23 -4
  87. package/src/components/StateChangeSlice/StateChangeSlice_Callback.res +22 -6
  88. package/src/components/StateTopic.res +1 -3
  89. package/src/components/StateViewSlice/StateViewSlice.res +4 -4
  90. package/src/components/StateViewSlice/StateViewSlice_Builder.res +79 -68
  91. package/src/components/StateViewSlice/StateViewSlice_Callback.res +3 -1
  92. package/src/components/Task/Task.res +3 -3
  93. package/src/components/Task/Task_Adapter.res +4 -1
  94. package/src/components/Task/Task_Builder.res +24 -21
  95. package/src/plugin/api/PluginBaseFragment.res +9 -3
  96. package/src/plugin/component/Capability_Inference.res +8 -10
  97. package/src/plugin/component/Plugin.res +6 -6
  98. package/src/plugin/component/Plugin_Builder.res +54 -50
  99. package/src/plugin/component/Plugin_Callback.res +10 -6
  100. package/src/plugin/component/Plugin_Helpers.res +264 -230
  101. package/src/plugin/component/Plugin_Structure.res +370 -324
  102. package/src/plugin/component/Plugin_SubscriptionSchema.res +8 -6
  103. package/src/plugin/component/SchemaWalker.res +11 -12
  104. package/src/plugin/connect/PluginConnectExtension_Mapping.res +45 -50
  105. package/src/plugin/lifecycle/PluginBehavior.res +3 -4
  106. package/src/plugin/lifecycle/PluginSpec.res +1 -2
  107. package/src/plugin/lifecycle/PluginsProjection.res +16 -5
  108. package/src/plugin/lifecycle/PluginsReadModelSpec.res +0 -2
  109. package/src/util/CommandPublisher.res +9 -2
  110. package/src/util/CsvStream.res +3 -3
  111. package/src/util/Interstack.res +7 -15
  112. package/src/util/Interstack.resi +3 -3
  113. package/src/util/LogFormat.res +5 -9
  114. package/src/util/Logger.res +1 -2
  115. package/src/util/Lru.res +2 -1
  116. package/src/util/Lru.resi +2 -3
  117. package/src/util/ScheduleOps.res +24 -27
  118. package/src/util/StorePrefixCollision.res +6 -9
  119. package/src/util/Util_Promise.res +4 -1
  120. package/src/util/Util_Promise.res.mjs +1 -1
  121. package/tests/IdentityTest.res +166 -113
  122. package/tests/ResourceAttributionTest.res +28 -25
  123. package/tests/StorePrefixCollisionTest.res +2 -1
  124. package/tests/TaskBucketNamingTest.res +3 -2
  125. package/tests/adapter/EventLogProvisioningTest.res +51 -48
  126. package/tests/adapter/MonitoringTest.res +81 -38
  127. package/tests/adapter/QueryInterceptionTest.res +2 -2
  128. package/tests/adapter/RefusalVocabularyTest.res +31 -23
  129. package/tests/adapter/RuntimeExtensionHookReachTest.res +9 -8
  130. package/tests/adapter/RuntimeExtensionTest.res +5 -3
  131. package/tests/admin/AdminApiSchemaDriftTest.res +22 -16
  132. package/tests/admin/Platform_Admin_StructureTest.res +10 -11
  133. package/tests/admin/Platform_BakedManifestTest.res +31 -35
  134. package/tests/admin/Platform_ComponentDefinitionsApiTest.res +18 -15
  135. package/tests/admin/Platform_PluginStructuresApiTest.res +5 -3
  136. package/tests/admin/Platform_UIFragmentsApiTest.res +6 -3
  137. package/tests/aggregate/AggregateCacheTest.res +10 -12
  138. package/tests/aggregate/AggregateCallbackTest.res +75 -46
  139. package/tests/aggregate/AggregateCausationTest.res +19 -20
  140. package/tests/aggregate/AggregateConflictTest.res +41 -19
  141. package/tests/aggregate/AggregateFixtures.res +15 -5
  142. package/tests/aggregate/AggregateRejectionTest.res +97 -80
  143. package/tests/aggregate/AggregateSnapshotTest.res +44 -16
  144. package/tests/api/Api_IdsTest.res +10 -4
  145. package/tests/api/BrandedMarkerCompositionTest.res +48 -36
  146. package/tests/api/GeolocationSemanticTest.res +3 -3
  147. package/tests/api/GraphQL_FragmentGeneratorTest.res +66 -54
  148. package/tests/api/OwnerScopeDiagnosticsTest.res +31 -27
  149. package/tests/api/StorageRefFieldsTest.res +30 -18
  150. package/tests/api/SuryToJsonSchemaTest.res +1338 -981
  151. package/tests/api/SuryToJsonSchemaTest.res.mjs +31 -0
  152. package/tests/api/TaggedUnionSchemaTest.res +17 -24
  153. package/tests/commandgenerator/CommandGeneratorCallbackTest.res +235 -179
  154. package/tests/commandgenerator/CommandGeneratorFixtures.res +8 -13
  155. package/tests/commandgenerator/OwnerStampingTest.res +91 -76
  156. package/tests/commandtopic/CommandOutcomeHookTest.res +198 -155
  157. package/tests/commandtopic/CommandTopicCallbackFixtures.res +5 -4
  158. package/tests/commandtopic/CommandTopicCallbackTest.res +61 -43
  159. package/tests/commandtopic/CommandTopicHelpersRejectionTest.res +70 -55
  160. package/tests/counter/CounterCallbackTest.res +40 -34
  161. package/tests/counter/CounterFixtures.res +4 -4
  162. package/tests/dcb/DcbDecodeTest.res +115 -84
  163. package/tests/dcb/DcbEventLogOperationsTest.res +194 -143
  164. package/tests/dcb/DcbEventLogSchemaTest.res +13 -13
  165. package/tests/dcb/DcbFixtures.res +4 -5
  166. package/tests/dcb/DcbScopeInferenceTest.res +173 -114
  167. package/tests/dcb/DcbStateChangeSliceTest.res +391 -262
  168. package/tests/dcb/DcbTagTest.res +22 -11
  169. package/tests/dcb/DcbValidationTest.res +288 -218
  170. package/tests/eventlog/EventLogFixtures.res +4 -4
  171. package/tests/eventlog/EventLogOperationsTest.res +102 -67
  172. package/tests/eventlog/EventLogRetryTest.res +104 -65
  173. package/tests/eventmapper/EventMapperCallbackTest.res +118 -83
  174. package/tests/eventmapper/EventMapperFixtures.res +15 -23
  175. package/tests/eventmapper/EventMapperTest.res +54 -38
  176. package/tests/eventtopic/EventTopicFixtures.res +3 -4
  177. package/tests/eventtopic/EventTopicOperationsTest.res +41 -29
  178. package/tests/extensionpoint/ExtensionPointCallbackTest.res +58 -45
  179. package/tests/extensionpoint/ExtensionPointFixtures.res +16 -20
  180. package/tests/extensionpoint/ExtensionPointOperationsTest.res +70 -49
  181. package/tests/extensionpoint/PluginDisconnectScheduleTest.res +2 -1
  182. package/tests/logger/LogFormatTest.res +104 -82
  183. package/tests/logger/LoggerLazyTest.res +21 -12
  184. package/tests/message/MessageTest.res +96 -93
  185. package/tests/message/MetaEnvelopeTest.res +26 -30
  186. package/tests/plugin/HeartbeatDisconnectGraceTest.res +31 -25
  187. package/tests/plugin/ManifestVisibilityTest.res +20 -12
  188. package/tests/plugin/PluginDefinitionScalars.res +1 -2
  189. package/tests/plugin/PluginLifecycleCorpusTest.res +15 -12
  190. package/tests/plugin/PluginSpecExperiment.res +0 -1
  191. package/tests/plugin/PluginStructureTest.res +1533 -1030
  192. package/tests/plugin/PluginStructureTest.res.mjs +6 -0
  193. package/tests/plugin/Plugin_EventQuerySchemaTest.res +21 -10
  194. package/tests/plugin/SchemaWalkerTest.res +116 -70
  195. package/tests/plugin/StateChange/PsReserveStock.res +4 -4
  196. package/tests/plugin/StateView/PsAnnotatedView.res +6 -4
  197. package/tests/plugin/StateView/PsAnnotatedView.res.mjs +7 -3
  198. package/tests/plugin/StateView/PsCustomersView.res +4 -4
  199. package/tests/plugin/StateView/PsShipmentsView.res +3 -2
  200. package/tests/projection/LifecycleTrailTest.res +1 -4
  201. package/tests/projection/ProjectionOptimizeTest.res +13 -9
  202. package/tests/querydb/QueryDbFixtures.res +0 -1
  203. package/tests/querydb/QueryDbOperationsTest.res +99 -64
  204. package/tests/querydb/TaggedUnionStampTest.res +10 -8
  205. package/tests/sideeffecthandler/SideEffectHandlerCallbackTest.res +50 -35
  206. package/tests/sideeffecthandler/SideEffectHandlerFixtures.res +4 -10
  207. package/tests/util/CommandPublisherTest.res +0 -1
  208. package/tests/util/CsvStreamTest.res +3 -3
  209. package/tests/util/LruTest.res +84 -56
@@ -81,9 +81,7 @@ describe("QueryDb_Operations stamps union members", () => {
81
81
  }
82
82
  let _ = await Sightings.save("s-1", state, Init, None)
83
83
  let row = storedRow("s-1")
84
- expect(row->field("lastSeen")->field("__typename")->string)->toEqual(
85
- Some("GeolocationLocated"),
86
- )
84
+ expect(row->field("lastSeen")->field("__typename")->string)->toEqual(Some("GeolocationLocated"))
87
85
  let history = row->field("history")->JSON.Decode.array->Option.getOr([])
88
86
  expect(history->Array.map(h => h->field("__typename")->string))->toEqual([
89
87
  Some("GeolocationPending"),
@@ -105,16 +103,19 @@ describe("QueryDb_Operations stamps union members", () => {
105
103
  // is walked and written exactly as it was written before the walk existed.
106
104
  testPromise("a view with no union field stores what it always stored", async () => {
107
105
  let _ = await Items.save("item-1", {name: "Widget", count: 5}, Init, None)
108
- expect(storedRow("item-1")->JSON.stringify)->toBe(
109
- `{"name":"Widget","count":5,"id":"item-1"}`,
110
- )
106
+ expect(storedRow("item-1")->JSON.stringify)->toBe(`{"name":"Widget","count":5,"id":"item-1"}`)
111
107
  })
112
108
 
113
109
  testPromise("saveBatch stamps every row", async () => {
114
110
  let batch = [
115
111
  (
116
112
  "c-4",
117
- ({customerId: "c-4", geolocation: Located({point: {lat: 0.0, lng: 0.0}})}: CustomersSpec.state),
113
+ (
114
+ {
115
+ customerId: "c-4",
116
+ geolocation: Located({point: {lat: 0.0, lng: 0.0}}),
117
+ }: CustomersSpec.state
118
+ ),
118
119
  None,
119
120
  ),
120
121
  (
@@ -141,7 +142,8 @@ describe("a stamped row decodes back", () => {
141
142
  )
142
143
  let result = await Customers.loadStream("c-6")->Stream.runCollect->Effect.runPromise
143
144
  switch result {
144
- | [{geolocation: Located({point})}] => expect((point.lat, point.lng))->toEqual((48.2082, 16.3738))
145
+ | [{geolocation: Located({point})}] =>
146
+ expect((point.lat, point.lng))->toEqual((48.2082, 16.3738))
145
147
  | _ => expect("round trip")->toBe("Located with its point intact")
146
148
  }
147
149
  })
@@ -5,52 +5,67 @@ let _ = beforeEach(() => reset())
5
5
 
6
6
  describe("SideEffectHandler_Callback.handleJsonEvents:", () => {
7
7
  describe("event matching registered side effect", () => {
8
- testPromise("execute called with decoded id and event", async () => {
9
- let event = TestSource.SomethingHappened({value: "hello"})
10
- let eventJson = makeEventJson("entity-1", event)
11
- await TestHandler.handleJsonEvents(Stream.fromIterable([eventJson]))->Effect.runPromise
12
- let call = capturedExecuteCalls.contents->Array.getUnsafe(0)
13
- expect((call.id, call.event))->toEqual(("entity-1", event))
14
- })
8
+ testPromise(
9
+ "execute called with decoded id and event",
10
+ async () => {
11
+ let event = TestSource.SomethingHappened({value: "hello"})
12
+ let eventJson = makeEventJson("entity-1", event)
13
+ await TestHandler.handleJsonEvents(Stream.fromIterable([eventJson]))->Effect.runPromise
14
+ let call = capturedExecuteCalls.contents->Array.getUnsafe(0)
15
+ expect((call.id, call.event))->toEqual(("entity-1", event))
16
+ },
17
+ )
15
18
  })
16
19
 
17
20
  describe("event with no matching source name", () => {
18
- testPromise("execute not called, no error", async () => {
19
- let event = TestSource.SomethingHappened({value: "ignored"})
20
- let eventJson = makeEventJson(~service="UnknownService", "entity-1", event)
21
- await TestHandler.handleJsonEvents(Stream.fromIterable([eventJson]))->Effect.runPromise
22
- expect(capturedExecuteCalls.contents->Array.length)->toBe(0)
23
- })
21
+ testPromise(
22
+ "execute not called, no error",
23
+ async () => {
24
+ let event = TestSource.SomethingHappened({value: "ignored"})
25
+ let eventJson = makeEventJson(~service="UnknownService", "entity-1", event)
26
+ await TestHandler.handleJsonEvents(Stream.fromIterable([eventJson]))->Effect.runPromise
27
+ expect(capturedExecuteCalls.contents->Array.length)->toBe(0)
28
+ },
29
+ )
24
30
  })
25
31
 
26
32
  describe("event with malformed JSON", () => {
27
- testPromise("caught gracefully — does not throw, execute not called", async () => {
28
- let invalidJson = JSON.Encode.string("not-an-object")
29
- await TestHandler.handleJsonEvents(Stream.fromIterable([invalidJson]))->Effect.runPromise
30
- expect(capturedExecuteCalls.contents->Array.length)->toBe(0)
31
- })
33
+ testPromise(
34
+ "caught gracefully — does not throw, execute not called",
35
+ async () => {
36
+ let invalidJson = JSON.Encode.string("not-an-object")
37
+ await TestHandler.handleJsonEvents(Stream.fromIterable([invalidJson]))->Effect.runPromise
38
+ expect(capturedExecuteCalls.contents->Array.length)->toBe(0)
39
+ },
40
+ )
32
41
  })
33
42
 
34
43
  describe("execute throws", () => {
35
- testPromise("error caught per-event, other events still processed", async () => {
36
- // First event causes execute to throw; second event processes normally
37
- executeThrowOnCall := 1
38
- let event = TestSource.SomethingHappened({value: "v"})
39
- let event1 = makeEventJson("entity-1", event)
40
- let event2 = makeEventJson("entity-2", event)
41
- await TestHandler.handleJsonEvents(Stream.fromIterable([event1, event2]))->Effect.runPromise
42
- // entity-2 should still be captured (first event threw)
43
- expect(capturedExecuteCalls.contents->Array.length)->toBe(1)
44
- expect((capturedExecuteCalls.contents->Array.getUnsafe(0)).id)->toBe("entity-2")
45
- })
44
+ testPromise(
45
+ "error caught per-event, other events still processed",
46
+ async () => {
47
+ // First event causes execute to throw; second event processes normally
48
+ executeThrowOnCall := 1
49
+ let event = TestSource.SomethingHappened({value: "v"})
50
+ let event1 = makeEventJson("entity-1", event)
51
+ let event2 = makeEventJson("entity-2", event)
52
+ await TestHandler.handleJsonEvents(Stream.fromIterable([event1, event2]))->Effect.runPromise
53
+ // entity-2 should still be captured (first event threw)
54
+ expect(capturedExecuteCalls.contents->Array.length)->toBe(1)
55
+ expect((capturedExecuteCalls.contents->Array.getUnsafe(0)).id)->toBe("entity-2")
56
+ },
57
+ )
46
58
  })
47
59
 
48
60
  describe("multiple events in batch", () => {
49
- testPromise("each handled independently", async () => {
50
- let event = TestSource.SomethingHappened({value: "v"})
51
- let events = ["entity-1", "entity-2", "entity-3"]->Array.map(id => makeEventJson(id, event))
52
- await TestHandler.handleJsonEvents(Stream.fromIterable(events))->Effect.runPromise
53
- expect(capturedExecuteCalls.contents->Array.length)->toBe(3)
54
- })
61
+ testPromise(
62
+ "each handled independently",
63
+ async () => {
64
+ let event = TestSource.SomethingHappened({value: "v"})
65
+ let events = ["entity-1", "entity-2", "entity-3"]->Array.map(id => makeEventJson(id, event))
66
+ await TestHandler.handleJsonEvents(Stream.fromIterable(events))->Effect.runPromise
67
+ expect(capturedExecuteCalls.contents->Array.length)->toBe(3)
68
+ },
69
+ )
55
70
  })
56
71
  })
@@ -1,4 +1,3 @@
1
-
2
1
  // ─────────────────────────────────────────────────────────────
3
2
  // Event source spec for SideEffect
4
3
  // ─────────────────────────────────────────────────────────────
@@ -8,7 +7,7 @@ module TestSource = {
8
7
  let name = "TestSideEffectSource"
9
8
 
10
9
  @schema
11
- type event = | SomethingHappened({value: string})
10
+ type event = SomethingHappened({value: string})
12
11
  }
13
12
 
14
13
  // ─────────────────────────────────────────────────────────────
@@ -18,7 +17,7 @@ module TestSource = {
18
17
  type executeCall = {id: string, event: TestSource.event}
19
18
 
20
19
  let capturedExecuteCalls: ref<array<executeCall>> = ref([])
21
- let executeThrowOnCall = ref(0) // throw on this call number (1-based); 0 = never throw
20
+ let executeThrowOnCall = ref(0) // throw on this call number (1-based); 0 = never throw
22
21
  let executeCallCount = ref(0)
23
22
 
24
23
  // ─────────────────────────────────────────────────────────────
@@ -35,9 +34,7 @@ module TestSideEffect: Reventless.SideEffect.T = {
35
34
  JsError.throwWithMessage("side effect failed")
36
35
  }
37
36
  capturedExecuteCalls :=
38
- capturedExecuteCalls.contents->Array.concat([
39
- {id: id->TestSource.Id.toString, event},
40
- ])
37
+ capturedExecuteCalls.contents->Array.concat([{id: id->TestSource.Id.toString, event}])
41
38
  }
42
39
  }
43
40
 
@@ -79,10 +76,7 @@ let testMeta: Message.meta = {
79
76
  let makeEventJson = (~service=TestSource.name, id, event): JSON.t =>
80
77
  [
81
78
  ("id", JSON.Encode.string(id)),
82
- (
83
- "meta",
84
- {...testMeta, service: service}->Message.encode(Message.metaSchema),
85
- ),
79
+ ("meta", {...testMeta, service}->Message.encode(Message.metaSchema)),
86
80
  ("event", event->Message.encode(TestSource.eventSchema)),
87
81
  ]
88
82
  ->Dict.fromArray
@@ -11,7 +11,6 @@
11
11
 
12
12
  open JestGlobals
13
13
 
14
-
15
14
  let published: ref<array<Reventless.Message.commandJson>> = ref([])
16
15
 
17
16
  module TestSpec = {
@@ -37,9 +37,9 @@ describe("CsvStream.parseRows", () => {
37
37
  ->Array.join("\n")
38
38
  let path = writeTempCsv("name\n" ++ dataRows)
39
39
  let result = await CsvStream.parseRows(~path)
40
- ->Stream.take(2)
41
- ->Stream.runCollect
42
- ->Effect.runPromise
40
+ ->Stream.take(2)
41
+ ->Stream.runCollect
42
+ ->Effect.runPromise
43
43
  expect(result->Array.length)->toBe(2)
44
44
  })
45
45
 
@@ -2,72 +2,100 @@ open JestGlobals
2
2
 
3
3
  describe("Lru:", () => {
4
4
  describe("get / put", () => {
5
- testSync("get on an empty cache misses", () => {
6
- let cache = Lru.make(~capacity=2)
7
- expect(cache->Lru.get("a"))->toEqual(None)
8
- })
5
+ testSync(
6
+ "get on an empty cache misses",
7
+ () => {
8
+ let cache = Lru.make(~capacity=2)
9
+ expect(cache->Lru.get("a"))->toEqual(None)
10
+ },
11
+ )
9
12
 
10
- testSync("put then get returns the stored value", () => {
11
- let cache = Lru.make(~capacity=2)
12
- cache->Lru.put("a", 1)
13
- expect(cache->Lru.get("a"))->toEqual(Some(1))
14
- })
13
+ testSync(
14
+ "put then get returns the stored value",
15
+ () => {
16
+ let cache = Lru.make(~capacity=2)
17
+ cache->Lru.put("a", 1)
18
+ expect(cache->Lru.get("a"))->toEqual(Some(1))
19
+ },
20
+ )
15
21
 
16
- testSync("put on an existing key overwrites", () => {
17
- let cache = Lru.make(~capacity=2)
18
- cache->Lru.put("a", 1)
19
- cache->Lru.put("a", 2)
20
- expect((cache->Lru.get("a"), cache->Lru.size))->toEqual((Some(2), 1))
21
- })
22
+ testSync(
23
+ "put on an existing key overwrites",
24
+ () => {
25
+ let cache = Lru.make(~capacity=2)
26
+ cache->Lru.put("a", 1)
27
+ cache->Lru.put("a", 2)
28
+ expect((cache->Lru.get("a"), cache->Lru.size))->toEqual((Some(2), 1))
29
+ },
30
+ )
22
31
 
23
- testSync("invalidate removes a key", () => {
24
- let cache = Lru.make(~capacity=2)
25
- cache->Lru.put("a", 1)
26
- cache->Lru.invalidate("a")
27
- expect((cache->Lru.get("a"), cache->Lru.size))->toEqual((None, 0))
28
- })
32
+ testSync(
33
+ "invalidate removes a key",
34
+ () => {
35
+ let cache = Lru.make(~capacity=2)
36
+ cache->Lru.put("a", 1)
37
+ cache->Lru.invalidate("a")
38
+ expect((cache->Lru.get("a"), cache->Lru.size))->toEqual((None, 0))
39
+ },
40
+ )
29
41
  })
30
42
 
31
43
  describe("eviction", () => {
32
- testSync("evicts the least-recently-used entry past capacity", () => {
33
- let cache = Lru.make(~capacity=2)
34
- cache->Lru.put("a", 1)
35
- cache->Lru.put("b", 2)
36
- cache->Lru.put("c", 3) // evicts "a" (oldest)
37
- expect((cache->Lru.get("a"), cache->Lru.get("b"), cache->Lru.get("c"), cache->Lru.size))->toEqual((
38
- None,
39
- Some(2),
40
- Some(3),
41
- 2,
42
- ))
43
- })
44
+ testSync(
45
+ "evicts the least-recently-used entry past capacity",
46
+ () => {
47
+ let cache = Lru.make(~capacity=2)
48
+ cache->Lru.put("a", 1)
49
+ cache->Lru.put("b", 2)
50
+ cache->Lru.put("c", 3) // evicts "a" (oldest)
51
+ expect((
52
+ cache->Lru.get("a"),
53
+ cache->Lru.get("b"),
54
+ cache->Lru.get("c"),
55
+ cache->Lru.size,
56
+ ))->toEqual((None, Some(2), Some(3), 2))
57
+ },
58
+ )
44
59
 
45
- testSync("get refreshes recency so a touched key survives eviction", () => {
46
- let cache = Lru.make(~capacity=2)
47
- cache->Lru.put("a", 1)
48
- cache->Lru.put("b", 2)
49
- let _ = cache->Lru.get("a") // "a" is now most-recently-used
50
- cache->Lru.put("c", 3) // evicts "b", not "a"
51
- expect((cache->Lru.get("a"), cache->Lru.get("b"), cache->Lru.get("c")))->toEqual((
52
- Some(1),
53
- None,
54
- Some(3),
55
- ))
56
- })
60
+ testSync(
61
+ "get refreshes recency so a touched key survives eviction",
62
+ () => {
63
+ let cache = Lru.make(~capacity=2)
64
+ cache->Lru.put("a", 1)
65
+ cache->Lru.put("b", 2)
66
+ let _ = cache->Lru.get("a") // "a" is now most-recently-used
67
+ cache->Lru.put("c", 3) // evicts "b", not "a"
68
+ expect((cache->Lru.get("a"), cache->Lru.get("b"), cache->Lru.get("c")))->toEqual((
69
+ Some(1),
70
+ None,
71
+ Some(3),
72
+ ))
73
+ },
74
+ )
57
75
 
58
- testSync("101 distinct keys against capacity 100 keeps exactly 100", () => {
59
- let cache = Lru.make(~capacity=100)
60
- // 101 distinct keys: 0..100 inclusive.
61
- Array.fromInitializer(~length=101, i => i)->Array.forEach(i => cache->Lru.put(i, i))
62
- expect((cache->Lru.size, cache->Lru.get(0), cache->Lru.get(100)))->toEqual((100, None, Some(100)))
63
- })
76
+ testSync(
77
+ "101 distinct keys against capacity 100 keeps exactly 100",
78
+ () => {
79
+ let cache = Lru.make(~capacity=100)
80
+ // 101 distinct keys: 0..100 inclusive.
81
+ Array.fromInitializer(~length=101, i => i)->Array.forEach(i => cache->Lru.put(i, i))
82
+ expect((cache->Lru.size, cache->Lru.get(0), cache->Lru.get(100)))->toEqual((
83
+ 100,
84
+ None,
85
+ Some(100),
86
+ ))
87
+ },
88
+ )
64
89
  })
65
90
 
66
91
  describe("disabled cache (capacity <= 0)", () => {
67
- testSync("never stores", () => {
68
- let cache = Lru.make(~capacity=0)
69
- cache->Lru.put("a", 1)
70
- expect((cache->Lru.get("a"), cache->Lru.size))->toEqual((None, 0))
71
- })
92
+ testSync(
93
+ "never stores",
94
+ () => {
95
+ let cache = Lru.make(~capacity=0)
96
+ cache->Lru.put("a", 1)
97
+ expect((cache->Lru.get("a"), cache->Lru.size))->toEqual((None, 0))
98
+ },
99
+ )
72
100
  })
73
101
  })