@reventlessdev/reventless-local 3.0.0-alpha.113
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1197 -0
- package/LICENSE +202 -0
- package/__mocks__/emptyModule.js +2 -0
- package/__mocks__/nodeSqlite.mjs +6 -0
- package/package.json +67 -0
- package/rescript.json +39 -0
- package/src/Platform.res +2162 -0
- package/src/Platform.res.mjs +3389 -0
- package/src/adapter/Api/LocalGraphQL_Adapter.res +29 -0
- package/src/adapter/Api/LocalGraphQL_Adapter.res.mjs +26 -0
- package/src/adapter/Api/LocalGraphQL_SubscriptionResolvers.res +146 -0
- package/src/adapter/Api/LocalGraphQL_SubscriptionResolvers.res.mjs +88 -0
- package/src/adapter/Auth/Auth_GraphqlContext.res +83 -0
- package/src/adapter/Auth/Auth_GraphqlContext.res.mjs +76 -0
- package/src/adapter/Auth/LocalAuth.res +239 -0
- package/src/adapter/Auth/LocalAuth.res.mjs +247 -0
- package/src/adapter/Auth/UserStore.res +134 -0
- package/src/adapter/Auth/UserStore.res.mjs +146 -0
- package/src/adapter/Backend.res +46 -0
- package/src/adapter/Backend.res.mjs +66 -0
- package/src/adapter/BackendState.res +34 -0
- package/src/adapter/BackendState.res.mjs +42 -0
- package/src/adapter/Cloner/LocalClonerRunner.res +13 -0
- package/src/adapter/Cloner/LocalClonerRunner.res.mjs +12 -0
- package/src/adapter/CommandGenerator/CommandGeneratorResolvers_GraphQL.res +329 -0
- package/src/adapter/CommandGenerator/CommandGeneratorResolvers_GraphQL.res.mjs +301 -0
- package/src/adapter/CommandGenerator/InboundTranslationResolvers_GraphQL.res +76 -0
- package/src/adapter/CommandGenerator/InboundTranslationResolvers_GraphQL.res.mjs +57 -0
- package/src/adapter/CommandGenerator/LocalCommandGeneratorResolvers.res +19 -0
- package/src/adapter/CommandGenerator/LocalCommandGeneratorResolvers.res.mjs +19 -0
- package/src/adapter/CommandTopic/LocalCommandTopicChannel.res +104 -0
- package/src/adapter/CommandTopic/LocalCommandTopicChannel.res.mjs +82 -0
- package/src/adapter/CommandTopic/LocalCommandTopicRemoteChannel.res +32 -0
- package/src/adapter/CommandTopic/LocalCommandTopicRemoteChannel.res.mjs +38 -0
- package/src/adapter/Counter/LocalCounterHandler.res +42 -0
- package/src/adapter/Counter/LocalCounterHandler.res.mjs +45 -0
- package/src/adapter/DcbEventLog/DcbEventLogStorage_InMemory.res +131 -0
- package/src/adapter/DcbEventLog/DcbEventLogStorage_InMemory.res.mjs +140 -0
- package/src/adapter/DcbEventLog/DcbEventLogStorage_Sqlite.res +334 -0
- package/src/adapter/DcbEventLog/DcbEventLogStorage_Sqlite.res.mjs +299 -0
- package/src/adapter/DomainGraphQL_Server.res +565 -0
- package/src/adapter/DomainGraphQL_Server.res.mjs +576 -0
- package/src/adapter/DomainMCP_Server.res +369 -0
- package/src/adapter/DomainMCP_Server.res.mjs +358 -0
- package/src/adapter/EventCollector/LocalEventCollectorChannel.res +87 -0
- package/src/adapter/EventCollector/LocalEventCollectorChannel.res.mjs +45 -0
- package/src/adapter/EventLog/EventLogStorage_InMemory.res +105 -0
- package/src/adapter/EventLog/EventLogStorage_InMemory.res.mjs +117 -0
- package/src/adapter/EventLog/EventLogStorage_Sqlite.res +145 -0
- package/src/adapter/EventLog/EventLogStorage_Sqlite.res.mjs +155 -0
- package/src/adapter/EventTopic/LocalEventTopicPublisher.res +36 -0
- package/src/adapter/EventTopic/LocalEventTopicPublisher.res.mjs +31 -0
- package/src/adapter/GraphQL_Server.res +6 -0
- package/src/adapter/GraphQL_Server.res.mjs +154 -0
- package/src/adapter/GraphQL_ServerInstance.res +310 -0
- package/src/adapter/GraphQL_ServerInstance.res.mjs +257 -0
- package/src/adapter/Heartbeat/LocalHeartbeatRunner.res +57 -0
- package/src/adapter/Heartbeat/LocalHeartbeatRunner.res.mjs +34 -0
- package/src/adapter/LocalBus.res +498 -0
- package/src/adapter/LocalBus.res.mjs +1011 -0
- package/src/adapter/LocalPluginSpec.res +16 -0
- package/src/adapter/LocalPluginSpec.res.mjs +33 -0
- package/src/adapter/LocalSideEffectHandler.res +44 -0
- package/src/adapter/LocalSideEffectHandler.res.mjs +34 -0
- package/src/adapter/MCP_Server.res +4 -0
- package/src/adapter/MCP_Server.res.mjs +67 -0
- package/src/adapter/MCP_ServerInstance.res +362 -0
- package/src/adapter/MCP_ServerInstance.res.mjs +313 -0
- package/src/adapter/PlatformGraphQL_Server.res +75 -0
- package/src/adapter/PlatformGraphQL_Server.res.mjs +84 -0
- package/src/adapter/PlatformMCP_Server.res +23 -0
- package/src/adapter/PlatformMCP_Server.res.mjs +46 -0
- package/src/adapter/QueryDb/QueryDbResolvers_GraphQL.res +793 -0
- package/src/adapter/QueryDb/QueryDbResolvers_GraphQL.res.mjs +569 -0
- package/src/adapter/QueryDb/QueryDbStorage_InMemory.res +242 -0
- package/src/adapter/QueryDb/QueryDbStorage_InMemory.res.mjs +241 -0
- package/src/adapter/QueryDb/QueryDbStorage_Sqlite.res +339 -0
- package/src/adapter/QueryDb/QueryDbStorage_Sqlite.res.mjs +318 -0
- package/src/adapter/QueryDb/SortKey_Filter.res +48 -0
- package/src/adapter/QueryDb/SortKey_Filter.res.mjs +46 -0
- package/src/adapter/QueryEngine/LocalQueryEngine.res +57 -0
- package/src/adapter/QueryEngine/LocalQueryEngine.res.mjs +56 -0
- package/src/adapter/Runtime/LocalAggregateRuntime_Builder.res +91 -0
- package/src/adapter/Runtime/LocalAggregateRuntime_Builder.res.mjs +50 -0
- package/src/adapter/Runtime/LocalEventCollectorRuntime_Builder.res +47 -0
- package/src/adapter/Runtime/LocalEventCollectorRuntime_Builder.res.mjs +37 -0
- package/src/adapter/Runtime/LocalPluginRuntime_Builder.res +11 -0
- package/src/adapter/Runtime/LocalPluginRuntime_Builder.res.mjs +30 -0
- package/src/adapter/Runtime/LocalRuntimeEnvironment.res +54 -0
- package/src/adapter/Runtime/LocalRuntimeEnvironment.res.mjs +40 -0
- package/src/adapter/Scheduler/LocalScheduledPublisher.res +102 -0
- package/src/adapter/Scheduler/LocalScheduledPublisher.res.mjs +84 -0
- package/src/adapter/SqliteDriver.res +52 -0
- package/src/adapter/SqliteDriver.res.mjs +76 -0
- package/src/adapter/SqliteDriver.resi +31 -0
- package/src/adapter/Task/LocalTaskBucket.res +75 -0
- package/src/adapter/Task/LocalTaskBucket.res.mjs +48 -0
- package/src/adapter/Task/TaskBucket_Sqlite.res +47 -0
- package/src/adapter/Task/TaskBucket_Sqlite.res.mjs +40 -0
- package/src/components/Aggregate_Builder.res +55 -0
- package/src/components/Aggregate_Builder.res.mjs +140 -0
- package/src/components/AutomationSlice_Builder.res +41 -0
- package/src/components/AutomationSlice_Builder.res.mjs +57 -0
- package/src/components/Counter_Builder.res +14 -0
- package/src/components/Counter_Builder.res.mjs +32 -0
- package/src/components/DcbEventLog_Builder.res +18 -0
- package/src/components/DcbEventLog_Builder.res.mjs +24 -0
- package/src/components/ExtensionPoint_Builder.res +25 -0
- package/src/components/ExtensionPoint_Builder.res.mjs +44 -0
- package/src/components/InboundTranslationSlice_Builder.res +34 -0
- package/src/components/InboundTranslationSlice_Builder.res.mjs +45 -0
- package/src/components/OutboundTranslationSlice_Builder.res +43 -0
- package/src/components/OutboundTranslationSlice_Builder.res.mjs +59 -0
- package/src/components/Plugin_Builder.res +37 -0
- package/src/components/Plugin_Builder.res.mjs +67 -0
- package/src/components/ReadModel_Builder.res +47 -0
- package/src/components/ReadModel_Builder.res.mjs +54 -0
- package/src/components/StateChangeSlice_Builder.res +19 -0
- package/src/components/StateChangeSlice_Builder.res.mjs +21 -0
- package/src/components/StateViewSlice_Builder.res +42 -0
- package/src/components/StateViewSlice_Builder.res.mjs +58 -0
- package/src/components/Task_Builder.res +28 -0
- package/src/components/Task_Builder.res.mjs +41 -0
- package/src/reexport/CommandTopic.res +3 -0
- package/src/reexport/CommandTopic.res.mjs +55 -0
- package/src/test/Mocks/MockDcbEventLogStorage.res +136 -0
- package/src/test/Mocks/MockDcbEventLogStorage.res.mjs +146 -0
- package/src/test/Mocks/MockEventLogStorage.res +57 -0
- package/src/test/Mocks/MockEventLogStorage.res.mjs +65 -0
- package/src/test/Mocks/MockPublisher.res +29 -0
- package/src/test/Mocks/MockPublisher.res.mjs +28 -0
- package/src/test/Mocks/MockQueryDbStorage.res +104 -0
- package/src/test/Mocks/MockQueryDbStorage.res.mjs +136 -0
- package/src/test/TestRunner.res +96 -0
- package/src/test/TestRunner.res.mjs +71 -0
- package/tests/SplitApiFixtures.res +84 -0
- package/tests/SplitApiFixtures.res.mjs +88 -0
- package/tests/SplitApiTest.res +102 -0
- package/tests/SplitApiTest.res.mjs +82 -0
- package/tests/TestFixtures.res +54 -0
- package/tests/TestFixtures.res.mjs +65 -0
- package/tests/adapter/BackendParityTest.res +94 -0
- package/tests/adapter/BackendParityTest.res.mjs +96 -0
- package/tests/adapter/CollectNEventsTest.res +82 -0
- package/tests/adapter/CollectNEventsTest.res.mjs +83 -0
- package/tests/adapter/CommandAuthorizationTest.res +200 -0
- package/tests/adapter/CommandAuthorizationTest.res.mjs +190 -0
- package/tests/adapter/CommandTopicChannelTest.res +174 -0
- package/tests/adapter/CommandTopicChannelTest.res.mjs +170 -0
- package/tests/adapter/CounterHandlerTest.res +113 -0
- package/tests/adapter/CounterHandlerTest.res.mjs +96 -0
- package/tests/adapter/DcbEventLogStorageSqliteTest.res +157 -0
- package/tests/adapter/DcbEventLogStorageSqliteTest.res.mjs +165 -0
- package/tests/adapter/DcbEventLogStorageTest.res +187 -0
- package/tests/adapter/DcbEventLogStorageTest.res.mjs +195 -0
- package/tests/adapter/EventCollectorChannelTest.res +166 -0
- package/tests/adapter/EventCollectorChannelTest.res.mjs +178 -0
- package/tests/adapter/EventLogStorageSqliteTest.res +105 -0
- package/tests/adapter/EventLogStorageSqliteTest.res.mjs +116 -0
- package/tests/adapter/EventTapTest.res +102 -0
- package/tests/adapter/EventTapTest.res.mjs +94 -0
- package/tests/adapter/EventTopicPublisherTest.res +76 -0
- package/tests/adapter/EventTopicPublisherTest.res.mjs +86 -0
- package/tests/adapter/GraphQL_SchemaInspectorTest.res +763 -0
- package/tests/adapter/GraphQL_SchemaInspectorTest.res.mjs +578 -0
- package/tests/adapter/GraphQL_SubscriptionResolversTest.res +161 -0
- package/tests/adapter/GraphQL_SubscriptionResolversTest.res.mjs +134 -0
- package/tests/adapter/HeartbeatRunnerTest.res +136 -0
- package/tests/adapter/HeartbeatRunnerTest.res.mjs +96 -0
- package/tests/adapter/LocalAuthHttpTest.res +224 -0
- package/tests/adapter/LocalAuthHttpTest.res.mjs +237 -0
- package/tests/adapter/LocalAuthLoginTest.res +180 -0
- package/tests/adapter/LocalAuthLoginTest.res.mjs +207 -0
- package/tests/adapter/LocalAuthTest.res +106 -0
- package/tests/adapter/LocalAuthTest.res.mjs +145 -0
- package/tests/adapter/LocalAuthUserStoreTest.res +172 -0
- package/tests/adapter/LocalAuthUserStoreTest.res.mjs +208 -0
- package/tests/adapter/LocalBusBoundedTest.res +157 -0
- package/tests/adapter/LocalBusBoundedTest.res.mjs +168 -0
- package/tests/adapter/LocalBusPubSubTest.res +81 -0
- package/tests/adapter/LocalBusPubSubTest.res.mjs +81 -0
- package/tests/adapter/QueryDbGsiTtlTest.res +268 -0
- package/tests/adapter/QueryDbGsiTtlTest.res.mjs +209 -0
- package/tests/adapter/QueryDbListResolverTest.res +361 -0
- package/tests/adapter/QueryDbListResolverTest.res.mjs +426 -0
- package/tests/adapter/QueryDbStorageSqliteTest.res +159 -0
- package/tests/adapter/QueryDbStorageSqliteTest.res.mjs +126 -0
- package/tests/adapter/QueryDbStorageTest.res +171 -0
- package/tests/adapter/QueryDbStorageTest.res.mjs +170 -0
- package/tests/adapter/QueryEngineTest.res +152 -0
- package/tests/adapter/QueryEngineTest.res.mjs +148 -0
- package/tests/adapter/ScheduledPublisherTest.res +199 -0
- package/tests/adapter/ScheduledPublisherTest.res.mjs +203 -0
- package/tests/adapter/SortKey_FilterTest.res +103 -0
- package/tests/adapter/SortKey_FilterTest.res.mjs +135 -0
- package/tests/adapter/SqliteDriverTest.res +86 -0
- package/tests/adapter/SqliteDriverTest.res.mjs +101 -0
- package/tests/adapter/TaskBucketSqliteTest.res +44 -0
- package/tests/adapter/TaskBucketSqliteTest.res.mjs +40 -0
- package/tests/adapter/TaskBucketTest.res +106 -0
- package/tests/adapter/TaskBucketTest.res.mjs +118 -0
- package/tests/components/aggregate/AggregateFixtures.res +78 -0
- package/tests/components/aggregate/AggregateFixtures.res.mjs +109 -0
- package/tests/components/aggregate/AggregateTest.res +129 -0
- package/tests/components/aggregate/AggregateTest.res.mjs +129 -0
- package/tests/components/automationslice/AutomationSliceCallbackTest.res +212 -0
- package/tests/components/automationslice/AutomationSliceCallbackTest.res.mjs +233 -0
- package/tests/components/automationslice/AutomationSliceFixtures.res +189 -0
- package/tests/components/automationslice/AutomationSliceFixtures.res.mjs +276 -0
- package/tests/components/automationslice/AutomationSliceSelfDeadlockFixtures.res +289 -0
- package/tests/components/automationslice/AutomationSliceSelfDeadlockFixtures.res.mjs +453 -0
- package/tests/components/automationslice/AutomationSliceSelfDeadlockTest.res +47 -0
- package/tests/components/automationslice/AutomationSliceSelfDeadlockTest.res.mjs +31 -0
- package/tests/components/automationslice/MixedSourceAutomationSliceFixtures.res +213 -0
- package/tests/components/automationslice/MixedSourceAutomationSliceFixtures.res.mjs +268 -0
- package/tests/components/automationslice/MixedSourceAutomationSliceTest.res +118 -0
- package/tests/components/automationslice/MixedSourceAutomationSliceTest.res.mjs +99 -0
- package/tests/components/commandgenerator/CommandGeneratorFixtures.res +73 -0
- package/tests/components/commandgenerator/CommandGeneratorFixtures.res.mjs +109 -0
- package/tests/components/commandgenerator/CommandGeneratorTest.res +43 -0
- package/tests/components/commandgenerator/CommandGeneratorTest.res.mjs +46 -0
- package/tests/components/commandtopic/CommandTopicFixtures.res +37 -0
- package/tests/components/commandtopic/CommandTopicFixtures.res.mjs +68 -0
- package/tests/components/commandtopic/CommandTopicStreamFixtures.res +43 -0
- package/tests/components/commandtopic/CommandTopicStreamFixtures.res.mjs +91 -0
- package/tests/components/commandtopic/CommandTopicStreamTest.res +30 -0
- package/tests/components/commandtopic/CommandTopicStreamTest.res.mjs +35 -0
- package/tests/components/commandtopic/CommandTopicTest.res +55 -0
- package/tests/components/commandtopic/CommandTopicTest.res.mjs +62 -0
- package/tests/components/counter/CounterFixtures.res +42 -0
- package/tests/components/counter/CounterFixtures.res.mjs +34 -0
- package/tests/components/counter/CounterTest.res +46 -0
- package/tests/components/counter/CounterTest.res.mjs +61 -0
- package/tests/components/dcb/DcbCrossPartitionFixtures.res +170 -0
- package/tests/components/dcb/DcbCrossPartitionFixtures.res.mjs +276 -0
- package/tests/components/dcb/DcbCrossPartitionReadTest.res +68 -0
- package/tests/components/dcb/DcbCrossPartitionReadTest.res.mjs +78 -0
- package/tests/components/dcb/DcbEventLogAppendStreamTest.res +72 -0
- package/tests/components/dcb/DcbEventLogAppendStreamTest.res.mjs +82 -0
- package/tests/components/dcb/DcbEventLogStreamTest.res +103 -0
- package/tests/components/dcb/DcbEventLogStreamTest.res.mjs +91 -0
- package/tests/components/dcb/DcbFixtures.res +145 -0
- package/tests/components/dcb/DcbFixtures.res.mjs +221 -0
- package/tests/components/dcb/DcbTest.res +55 -0
- package/tests/components/dcb/DcbTest.res.mjs +55 -0
- package/tests/components/eventcollector/EventCollectorFixtures.res +42 -0
- package/tests/components/eventcollector/EventCollectorFixtures.res.mjs +49 -0
- package/tests/components/eventcollector/EventCollectorTest.res +37 -0
- package/tests/components/eventcollector/EventCollectorTest.res.mjs +36 -0
- package/tests/components/eventlog/EventLogAppendStreamTest.res +93 -0
- package/tests/components/eventlog/EventLogAppendStreamTest.res.mjs +113 -0
- package/tests/components/eventlog/EventLogConflictTest.res +86 -0
- package/tests/components/eventlog/EventLogConflictTest.res.mjs +81 -0
- package/tests/components/eventlog/EventLogFixtures.res +52 -0
- package/tests/components/eventlog/EventLogFixtures.res.mjs +80 -0
- package/tests/components/eventlog/EventLogStreamTest.res +98 -0
- package/tests/components/eventlog/EventLogStreamTest.res.mjs +142 -0
- package/tests/components/eventlog/EventLogTest.res +53 -0
- package/tests/components/eventlog/EventLogTest.res.mjs +74 -0
- package/tests/components/eventtopic/EventTopicFixtures.res +47 -0
- package/tests/components/eventtopic/EventTopicFixtures.res.mjs +77 -0
- package/tests/components/eventtopic/EventTopicStreamFixtures.res +27 -0
- package/tests/components/eventtopic/EventTopicStreamFixtures.res.mjs +62 -0
- package/tests/components/eventtopic/EventTopicStreamTest.res +35 -0
- package/tests/components/eventtopic/EventTopicStreamTest.res.mjs +44 -0
- package/tests/components/eventtopic/EventTopicTest.res +35 -0
- package/tests/components/eventtopic/EventTopicTest.res.mjs +43 -0
- package/tests/components/extensionpoint/ExtensionPointFixtures.res +145 -0
- package/tests/components/extensionpoint/ExtensionPointFixtures.res.mjs +188 -0
- package/tests/components/extensionpoint/ExtensionPointTest.res +62 -0
- package/tests/components/extensionpoint/ExtensionPointTest.res.mjs +55 -0
- package/tests/components/heartbeat/HeartbeatFixtures.res +48 -0
- package/tests/components/heartbeat/HeartbeatFixtures.res.mjs +46 -0
- package/tests/components/heartbeat/HeartbeatTest.res +67 -0
- package/tests/components/heartbeat/HeartbeatTest.res.mjs +65 -0
- package/tests/components/inboundtranslationslice/InboundTranslationSliceCallbackTest.res +241 -0
- package/tests/components/inboundtranslationslice/InboundTranslationSliceCallbackTest.res.mjs +239 -0
- package/tests/components/inboundtranslationslice/InboundTranslationSliceFixtures.res +36 -0
- package/tests/components/inboundtranslationslice/InboundTranslationSliceFixtures.res.mjs +73 -0
- package/tests/components/outboundtranslationslice/OutboundTranslationSliceCallbackTest.res +191 -0
- package/tests/components/outboundtranslationslice/OutboundTranslationSliceCallbackTest.res.mjs +297 -0
- package/tests/components/outboundtranslationslice/OutboundTranslationSliceFixtures.res +78 -0
- package/tests/components/outboundtranslationslice/OutboundTranslationSliceFixtures.res.mjs +137 -0
- package/tests/components/querydb/QueryDbFixtures.res +39 -0
- package/tests/components/querydb/QueryDbFixtures.res.mjs +73 -0
- package/tests/components/querydb/QueryDbSubIdFixtures.res +44 -0
- package/tests/components/querydb/QueryDbSubIdFixtures.res.mjs +80 -0
- package/tests/components/querydb/QueryDbSubIdTest.res +104 -0
- package/tests/components/querydb/QueryDbSubIdTest.res.mjs +104 -0
- package/tests/components/querydb/QueryDbTest.res +81 -0
- package/tests/components/querydb/QueryDbTest.res.mjs +126 -0
- package/tests/components/readmodel/DcbReadModelE2EFixtures.res +215 -0
- package/tests/components/readmodel/DcbReadModelE2EFixtures.res.mjs +308 -0
- package/tests/components/readmodel/DcbReadModelE2ETest.res +45 -0
- package/tests/components/readmodel/DcbReadModelE2ETest.res.mjs +37 -0
- package/tests/components/readmodel/DcbReadModelTypoFailFastTest.res +88 -0
- package/tests/components/readmodel/DcbReadModelTypoFailFastTest.res.mjs +152 -0
- package/tests/components/readmodel/MixedSourceReadModelFixtures.res +181 -0
- package/tests/components/readmodel/MixedSourceReadModelFixtures.res.mjs +277 -0
- package/tests/components/readmodel/MixedSourceReadModelTest.res +61 -0
- package/tests/components/readmodel/MixedSourceReadModelTest.res.mjs +68 -0
- package/tests/components/readmodel/ReadModelFixtures.res +138 -0
- package/tests/components/readmodel/ReadModelFixtures.res.mjs +169 -0
- package/tests/components/readmodel/ReadModelTest.res +46 -0
- package/tests/components/readmodel/ReadModelTest.res.mjs +36 -0
- package/tests/components/scheduler/SchedulerFixtures.res +59 -0
- package/tests/components/scheduler/SchedulerFixtures.res.mjs +63 -0
- package/tests/components/scheduler/SchedulerTest.res +76 -0
- package/tests/components/scheduler/SchedulerTest.res.mjs +86 -0
- package/tests/components/sideeffecthandler/SideEffectHandlerFixtures.res +133 -0
- package/tests/components/sideeffecthandler/SideEffectHandlerFixtures.res.mjs +149 -0
- package/tests/components/sideeffecthandler/SideEffectHandlerTest.res +39 -0
- package/tests/components/sideeffecthandler/SideEffectHandlerTest.res.mjs +28 -0
- package/tests/components/stateviewslice/StateViewSliceFixtures.res +117 -0
- package/tests/components/stateviewslice/StateViewSliceFixtures.res.mjs +188 -0
- package/tests/components/stateviewslice/StateViewSliceSubIdFixtures.res +117 -0
- package/tests/components/stateviewslice/StateViewSliceSubIdFixtures.res.mjs +183 -0
- package/tests/components/stateviewslice/StateViewSliceSubIdTest.res +78 -0
- package/tests/components/stateviewslice/StateViewSliceSubIdTest.res.mjs +107 -0
- package/tests/components/stateviewslice/StateViewSliceTest.res +59 -0
- package/tests/components/stateviewslice/StateViewSliceTest.res.mjs +72 -0
- package/tests/components/task/TaskFixtures.res +87 -0
- package/tests/components/task/TaskFixtures.res.mjs +82 -0
- package/tests/components/task/TaskTest.res +98 -0
- package/tests/components/task/TaskTest.res.mjs +46 -0
- package/tests/plugin/PluginBehavior_GWT.res +146 -0
- package/tests/plugin/PluginBehavior_GWT.res.mjs +281 -0
- package/tests/plugin/Plugin_Fixtures.res +61 -0
- package/tests/plugin/Plugin_Fixtures.res.mjs +105 -0
- package/tests/plugin/PluginsProjection_GWT.res +95 -0
- package/tests/plugin/PluginsProjection_GWT.res.mjs +120 -0
- package/tests/plugin/UIFragmentRegistryProjection_GWT.res +72 -0
- package/tests/plugin/UIFragmentRegistryProjection_GWT.res.mjs +117 -0
- package/tests/setup/sqliteGlobal.cjs +12 -0
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
// Generated by ReScript, PLEASE EDIT WITH CARE
|
|
2
|
+
|
|
3
|
+
import * as Stream from "@reventlessdev/rescript-effect/src/Stream.res.mjs";
|
|
4
|
+
import * as Effect from "effect/Effect";
|
|
5
|
+
import * as Stream$1 from "effect/Stream";
|
|
6
|
+
import * as Component$ReventlessCore from "@reventlessdev/reventless-core/src/components/Component.res.mjs";
|
|
7
|
+
import * as TestRunner$ReventlessLocal from "../../../src/test/TestRunner.res.mjs";
|
|
8
|
+
import * as EventLogFixtures$ReventlessLocal from "./EventLogFixtures.res.mjs";
|
|
9
|
+
|
|
10
|
+
globalThis.describe("EventLog.appendStream (in-memory adapter)", () => {
|
|
11
|
+
globalThis.beforeAll(async () => {
|
|
12
|
+
await TestRunner$ReventlessLocal.resolve(Component$ReventlessCore.operations(EventLogFixtures$ReventlessLocal.eventLog));
|
|
13
|
+
});
|
|
14
|
+
globalThis.beforeEach(() => EventLogFixtures$ReventlessLocal.reset());
|
|
15
|
+
globalThis.describe("basic append", () => {
|
|
16
|
+
globalThis.test("appendStream writes all events to storage", async () => {
|
|
17
|
+
let ops = await TestRunner$ReventlessLocal.resolve(Component$ReventlessCore.operations(EventLogFixtures$ReventlessLocal.eventLog));
|
|
18
|
+
let stream = Stream$1.fromIterable([
|
|
19
|
+
{
|
|
20
|
+
TAG: "ItemCreated",
|
|
21
|
+
name: "e1"
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
TAG: "ItemCreated",
|
|
25
|
+
name: "e2"
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
TAG: "ItemCreated",
|
|
29
|
+
name: "e3"
|
|
30
|
+
}
|
|
31
|
+
]);
|
|
32
|
+
await Effect.runPromise(ops.appendStream(0, "as-basic-1", stream));
|
|
33
|
+
let replayed = await ops.replay("as-basic-1");
|
|
34
|
+
globalThis.expect(replayed.length).toBe(3);
|
|
35
|
+
});
|
|
36
|
+
globalThis.test("appendStream on empty stream writes nothing", async () => {
|
|
37
|
+
let ops = await TestRunner$ReventlessLocal.resolve(Component$ReventlessCore.operations(EventLogFixtures$ReventlessLocal.eventLog));
|
|
38
|
+
await Effect.runPromise(ops.appendStream(0, "as-empty-1", Stream$1.empty));
|
|
39
|
+
let replayed = await ops.replay("as-empty-1");
|
|
40
|
+
globalThis.expect(replayed.length).toBe(0);
|
|
41
|
+
});
|
|
42
|
+
globalThis.test("appendStream preserves event order", async () => {
|
|
43
|
+
let ops = await TestRunner$ReventlessLocal.resolve(Component$ReventlessCore.operations(EventLogFixtures$ReventlessLocal.eventLog));
|
|
44
|
+
let stream = Stream$1.fromIterable([
|
|
45
|
+
{
|
|
46
|
+
TAG: "ItemCreated",
|
|
47
|
+
name: "first"
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
TAG: "ItemDeleted",
|
|
51
|
+
id: "second"
|
|
52
|
+
}
|
|
53
|
+
]);
|
|
54
|
+
await Effect.runPromise(ops.appendStream(0, "as-order-1", stream));
|
|
55
|
+
let replayed = await Effect.runPromise(Stream.runCollect(ops.replayStream("as-order-1")));
|
|
56
|
+
let first = replayed[0];
|
|
57
|
+
globalThis.expect(first).toEqual({
|
|
58
|
+
TAG: "ItemCreated",
|
|
59
|
+
name: "first"
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
globalThis.test("appendStream after array append continues from correct sequenceNr", async () => {
|
|
63
|
+
let ops = await TestRunner$ReventlessLocal.resolve(Component$ReventlessCore.operations(EventLogFixtures$ReventlessLocal.eventLog));
|
|
64
|
+
await ops.append(0, "as-seq-1", [EventLogFixtures$ReventlessLocal.makeEvent$p("as-seq-1", {
|
|
65
|
+
TAG: "ItemCreated",
|
|
66
|
+
name: "initial"
|
|
67
|
+
})]);
|
|
68
|
+
let stream = Stream$1.fromIterable([{
|
|
69
|
+
TAG: "ItemCreated",
|
|
70
|
+
name: "streamed"
|
|
71
|
+
}]);
|
|
72
|
+
await Effect.runPromise(ops.appendStream(1, "as-seq-1", stream));
|
|
73
|
+
let replayed = await ops.replay("as-seq-1");
|
|
74
|
+
globalThis.expect(replayed.length).toBe(2);
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
globalThis.describe("replayStream → appendStream pipeline", () => {
|
|
78
|
+
globalThis.test("can copy events from one aggregate to another via streams", async () => {
|
|
79
|
+
let ops = await TestRunner$ReventlessLocal.resolve(Component$ReventlessCore.operations(EventLogFixtures$ReventlessLocal.eventLog));
|
|
80
|
+
await ops.append(0, "as-src-1", [
|
|
81
|
+
EventLogFixtures$ReventlessLocal.makeEvent$p("as-src-1", {
|
|
82
|
+
TAG: "ItemCreated",
|
|
83
|
+
name: "a"
|
|
84
|
+
}),
|
|
85
|
+
EventLogFixtures$ReventlessLocal.makeEvent$p("as-src-1", {
|
|
86
|
+
TAG: "ItemDeleted",
|
|
87
|
+
id: "b"
|
|
88
|
+
})
|
|
89
|
+
]);
|
|
90
|
+
let sourceStream = ops.replayStream("as-src-1");
|
|
91
|
+
await Effect.runPromise(ops.appendStream(0, "as-dst-1", sourceStream));
|
|
92
|
+
let destEvents = await ops.replay("as-dst-1");
|
|
93
|
+
globalThis.expect(destEvents.length).toBe(2);
|
|
94
|
+
});
|
|
95
|
+
globalThis.test("copied events round-trip through decode correctly", async () => {
|
|
96
|
+
let ops = await TestRunner$ReventlessLocal.resolve(Component$ReventlessCore.operations(EventLogFixtures$ReventlessLocal.eventLog));
|
|
97
|
+
await ops.append(0, "as-src-2", [EventLogFixtures$ReventlessLocal.makeEvent$p("as-src-2", {
|
|
98
|
+
TAG: "ItemCreated",
|
|
99
|
+
name: "copied"
|
|
100
|
+
})]);
|
|
101
|
+
let sourceStream = ops.replayStream("as-src-2");
|
|
102
|
+
await Effect.runPromise(ops.appendStream(0, "as-dst-2", sourceStream));
|
|
103
|
+
let destEvents = await Effect.runPromise(Stream.runCollect(ops.replayStream("as-dst-2")));
|
|
104
|
+
let first = destEvents[0];
|
|
105
|
+
globalThis.expect(first).toEqual({
|
|
106
|
+
TAG: "ItemCreated",
|
|
107
|
+
name: "copied"
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
/* Not a pure module */
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
// Tests for optimistic locking conflict detection in EventLog (in-memory).
|
|
2
|
+
|
|
3
|
+
open JestGlobals
|
|
4
|
+
open EventLogFixtures
|
|
5
|
+
|
|
6
|
+
describe("EventLog — conflict detection (in-memory)", () => {
|
|
7
|
+
let _ = beforeAllAsync(async () => {
|
|
8
|
+
let _ = await eventLog->ReventlessCore.Component.operations->TestRunner.resolve
|
|
9
|
+
})
|
|
10
|
+
|
|
11
|
+
let _ = beforeEach(() => reset())
|
|
12
|
+
|
|
13
|
+
testPromise("append with stale sequenceNr returns conflict error", async () => {
|
|
14
|
+
let ops = await eventLog->ReventlessCore.Component.operations->TestRunner.resolve
|
|
15
|
+
let _ = await ops.append(
|
|
16
|
+
0,
|
|
17
|
+
"conflict-1",
|
|
18
|
+
[makeEvent'("conflict-1", ItemEventLogSpec.ItemCreated({name: "First"}))],
|
|
19
|
+
)
|
|
20
|
+
// Now storage has 1 event for "conflict-1"; passing sequenceNr=0 again should conflict
|
|
21
|
+
let result = await ops.append(
|
|
22
|
+
0,
|
|
23
|
+
"conflict-1",
|
|
24
|
+
[makeEvent'("conflict-1", ItemEventLogSpec.ItemCreated({name: "Duplicate"}))],
|
|
25
|
+
)
|
|
26
|
+
expect(Result.isError(result))->toBe(true)
|
|
27
|
+
})
|
|
28
|
+
|
|
29
|
+
testPromise("append with correct sequenceNr succeeds after prior append", async () => {
|
|
30
|
+
let ops = await eventLog->ReventlessCore.Component.operations->TestRunner.resolve
|
|
31
|
+
let _ = await ops.append(
|
|
32
|
+
0,
|
|
33
|
+
"conflict-2",
|
|
34
|
+
[makeEvent'("conflict-2", ItemEventLogSpec.ItemCreated({name: "First"}))],
|
|
35
|
+
)
|
|
36
|
+
let result = await ops.append(
|
|
37
|
+
1,
|
|
38
|
+
"conflict-2",
|
|
39
|
+
[makeEvent'("conflict-2", ItemEventLogSpec.ItemDeleted({id: "conflict-2"}))],
|
|
40
|
+
)
|
|
41
|
+
expect(Result.isOk(result))->toBe(true)
|
|
42
|
+
})
|
|
43
|
+
|
|
44
|
+
testPromise("conflict does not publish events to event topic", async () => {
|
|
45
|
+
let ops = await eventLog->ReventlessCore.Component.operations->TestRunner.resolve
|
|
46
|
+
let _ = await ops.append(
|
|
47
|
+
0,
|
|
48
|
+
"conflict-3",
|
|
49
|
+
[makeEvent'("conflict-3", ItemEventLogSpec.ItemCreated({name: "First"}))],
|
|
50
|
+
)
|
|
51
|
+
reset() // Reset captured count after first append
|
|
52
|
+
let _ = await ops.append(
|
|
53
|
+
0,
|
|
54
|
+
"conflict-3",
|
|
55
|
+
[makeEvent'("conflict-3", ItemEventLogSpec.ItemCreated({name: "Duplicate"}))],
|
|
56
|
+
)
|
|
57
|
+
expect(capturedTopicEventCount.contents)->toBe(0)
|
|
58
|
+
})
|
|
59
|
+
|
|
60
|
+
testPromise("conflict does not store events", async () => {
|
|
61
|
+
let ops = await eventLog->ReventlessCore.Component.operations->TestRunner.resolve
|
|
62
|
+
let _ = await ops.append(
|
|
63
|
+
0,
|
|
64
|
+
"conflict-4",
|
|
65
|
+
[makeEvent'("conflict-4", ItemEventLogSpec.ItemCreated({name: "First"}))],
|
|
66
|
+
)
|
|
67
|
+
let _ = await ops.append(
|
|
68
|
+
0,
|
|
69
|
+
"conflict-4",
|
|
70
|
+
[makeEvent'("conflict-4", ItemEventLogSpec.ItemCreated({name: "Should not be stored"}))],
|
|
71
|
+
)
|
|
72
|
+
let replayed = await ops.replay("conflict-4")
|
|
73
|
+
expect(replayed->Array.length)->toBe(1)
|
|
74
|
+
})
|
|
75
|
+
|
|
76
|
+
testPromise("batch append with correct sequenceNr stores all events", async () => {
|
|
77
|
+
let ops = await eventLog->ReventlessCore.Component.operations->TestRunner.resolve
|
|
78
|
+
let result = await ops.append(0, "conflict-5", [
|
|
79
|
+
makeEvent'("conflict-5", ItemEventLogSpec.ItemCreated({name: "e1"})),
|
|
80
|
+
makeEvent'("conflict-5", ItemEventLogSpec.ItemDeleted({id: "e2"})),
|
|
81
|
+
])
|
|
82
|
+
expect(Result.isOk(result))->toBe(true)
|
|
83
|
+
let replayed = await ops.replay("conflict-5")
|
|
84
|
+
expect(replayed->Array.length)->toBe(2)
|
|
85
|
+
})
|
|
86
|
+
})
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
// Generated by ReScript, PLEASE EDIT WITH CARE
|
|
2
|
+
|
|
3
|
+
import * as Stdlib_Result from "@rescript/runtime/lib/es6/Stdlib_Result.js";
|
|
4
|
+
import * as Component$ReventlessCore from "@reventlessdev/reventless-core/src/components/Component.res.mjs";
|
|
5
|
+
import * as TestRunner$ReventlessLocal from "../../../src/test/TestRunner.res.mjs";
|
|
6
|
+
import * as EventLogFixtures$ReventlessLocal from "./EventLogFixtures.res.mjs";
|
|
7
|
+
|
|
8
|
+
globalThis.describe("EventLog — conflict detection (in-memory)", () => {
|
|
9
|
+
globalThis.beforeAll(async () => {
|
|
10
|
+
await TestRunner$ReventlessLocal.resolve(Component$ReventlessCore.operations(EventLogFixtures$ReventlessLocal.eventLog));
|
|
11
|
+
});
|
|
12
|
+
globalThis.beforeEach(() => EventLogFixtures$ReventlessLocal.reset());
|
|
13
|
+
globalThis.test("append with stale sequenceNr returns conflict error", async () => {
|
|
14
|
+
let ops = await TestRunner$ReventlessLocal.resolve(Component$ReventlessCore.operations(EventLogFixtures$ReventlessLocal.eventLog));
|
|
15
|
+
await ops.append(0, "conflict-1", [EventLogFixtures$ReventlessLocal.makeEvent$p("conflict-1", {
|
|
16
|
+
TAG: "ItemCreated",
|
|
17
|
+
name: "First"
|
|
18
|
+
})]);
|
|
19
|
+
let result = await ops.append(0, "conflict-1", [EventLogFixtures$ReventlessLocal.makeEvent$p("conflict-1", {
|
|
20
|
+
TAG: "ItemCreated",
|
|
21
|
+
name: "Duplicate"
|
|
22
|
+
})]);
|
|
23
|
+
globalThis.expect(Stdlib_Result.isError(result)).toBe(true);
|
|
24
|
+
});
|
|
25
|
+
globalThis.test("append with correct sequenceNr succeeds after prior append", async () => {
|
|
26
|
+
let ops = await TestRunner$ReventlessLocal.resolve(Component$ReventlessCore.operations(EventLogFixtures$ReventlessLocal.eventLog));
|
|
27
|
+
await ops.append(0, "conflict-2", [EventLogFixtures$ReventlessLocal.makeEvent$p("conflict-2", {
|
|
28
|
+
TAG: "ItemCreated",
|
|
29
|
+
name: "First"
|
|
30
|
+
})]);
|
|
31
|
+
let result = await ops.append(1, "conflict-2", [EventLogFixtures$ReventlessLocal.makeEvent$p("conflict-2", {
|
|
32
|
+
TAG: "ItemDeleted",
|
|
33
|
+
id: "conflict-2"
|
|
34
|
+
})]);
|
|
35
|
+
globalThis.expect(Stdlib_Result.isOk(result)).toBe(true);
|
|
36
|
+
});
|
|
37
|
+
globalThis.test("conflict does not publish events to event topic", async () => {
|
|
38
|
+
let ops = await TestRunner$ReventlessLocal.resolve(Component$ReventlessCore.operations(EventLogFixtures$ReventlessLocal.eventLog));
|
|
39
|
+
await ops.append(0, "conflict-3", [EventLogFixtures$ReventlessLocal.makeEvent$p("conflict-3", {
|
|
40
|
+
TAG: "ItemCreated",
|
|
41
|
+
name: "First"
|
|
42
|
+
})]);
|
|
43
|
+
EventLogFixtures$ReventlessLocal.reset();
|
|
44
|
+
await ops.append(0, "conflict-3", [EventLogFixtures$ReventlessLocal.makeEvent$p("conflict-3", {
|
|
45
|
+
TAG: "ItemCreated",
|
|
46
|
+
name: "Duplicate"
|
|
47
|
+
})]);
|
|
48
|
+
globalThis.expect(EventLogFixtures$ReventlessLocal.capturedTopicEventCount.contents).toBe(0);
|
|
49
|
+
});
|
|
50
|
+
globalThis.test("conflict does not store events", async () => {
|
|
51
|
+
let ops = await TestRunner$ReventlessLocal.resolve(Component$ReventlessCore.operations(EventLogFixtures$ReventlessLocal.eventLog));
|
|
52
|
+
await ops.append(0, "conflict-4", [EventLogFixtures$ReventlessLocal.makeEvent$p("conflict-4", {
|
|
53
|
+
TAG: "ItemCreated",
|
|
54
|
+
name: "First"
|
|
55
|
+
})]);
|
|
56
|
+
await ops.append(0, "conflict-4", [EventLogFixtures$ReventlessLocal.makeEvent$p("conflict-4", {
|
|
57
|
+
TAG: "ItemCreated",
|
|
58
|
+
name: "Should not be stored"
|
|
59
|
+
})]);
|
|
60
|
+
let replayed = await ops.replay("conflict-4");
|
|
61
|
+
globalThis.expect(replayed.length).toBe(1);
|
|
62
|
+
});
|
|
63
|
+
globalThis.test("batch append with correct sequenceNr stores all events", async () => {
|
|
64
|
+
let ops = await TestRunner$ReventlessLocal.resolve(Component$ReventlessCore.operations(EventLogFixtures$ReventlessLocal.eventLog));
|
|
65
|
+
let result = await ops.append(0, "conflict-5", [
|
|
66
|
+
EventLogFixtures$ReventlessLocal.makeEvent$p("conflict-5", {
|
|
67
|
+
TAG: "ItemCreated",
|
|
68
|
+
name: "e1"
|
|
69
|
+
}),
|
|
70
|
+
EventLogFixtures$ReventlessLocal.makeEvent$p("conflict-5", {
|
|
71
|
+
TAG: "ItemDeleted",
|
|
72
|
+
id: "e2"
|
|
73
|
+
})
|
|
74
|
+
]);
|
|
75
|
+
globalThis.expect(Stdlib_Result.isOk(result)).toBe(true);
|
|
76
|
+
let replayed = await ops.replay("conflict-5");
|
|
77
|
+
globalThis.expect(replayed.length).toBe(2);
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
/* Not a pure module */
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
// Integration test fixtures for EventLog builder (in-memory).
|
|
2
|
+
|
|
3
|
+
open TestFixtures
|
|
4
|
+
|
|
5
|
+
// ─────────────────────────────────────────────────────────────
|
|
6
|
+
// Test event spec
|
|
7
|
+
// ─────────────────────────────────────────────────────────────
|
|
8
|
+
|
|
9
|
+
module ItemEventLogSpec = {
|
|
10
|
+
module Id = Reventless.Id.StringPure
|
|
11
|
+
let name = "TestItemEventLog"
|
|
12
|
+
|
|
13
|
+
@schema
|
|
14
|
+
type event = | ItemCreated({name: string}) | ItemDeleted({id: string})
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
// ─────────────────────────────────────────────────────────────
|
|
18
|
+
// Bus and Pulumi setup
|
|
19
|
+
// ─────────────────────────────────────────────────────────────
|
|
20
|
+
|
|
21
|
+
module Bus = LocalBus.Make()
|
|
22
|
+
|
|
23
|
+
// Capture events published to the event topic.
|
|
24
|
+
// Topic name = Spec.name ++ "EventTopic" = "TestItemEventLogEventTopic"
|
|
25
|
+
let capturedTopicEventCount: ref<int> = ref(0)
|
|
26
|
+
let _ = Bus.subscribeToEvents("TestItemEventLogEventTopic", async (_, _, _) => {
|
|
27
|
+
capturedTopicEventCount := capturedTopicEventCount.contents + 1
|
|
28
|
+
})
|
|
29
|
+
|
|
30
|
+
let _ = TestRunner.setup()
|
|
31
|
+
|
|
32
|
+
// ─────────────────────────────────────────────────────────────
|
|
33
|
+
// Build EventLog using in-memory adapters directly
|
|
34
|
+
// ─────────────────────────────────────────────────────────────
|
|
35
|
+
|
|
36
|
+
module EventLogMaker = ReventlessCore.EventLog_Builder.Make(
|
|
37
|
+
ItemEventLogSpec,
|
|
38
|
+
EventLogStorage_InMemory,
|
|
39
|
+
LocalEventTopicPublisher.Make(Bus),
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
let eventLog = EventLogMaker.make(~name="TestItemEventLog")
|
|
43
|
+
|
|
44
|
+
let makeEvent' = (id, event) => ({
|
|
45
|
+
Reventless.Message.id,
|
|
46
|
+
meta: testMeta,
|
|
47
|
+
event,
|
|
48
|
+
}: Reventless.Message.event'<string, ItemEventLogSpec.event>)
|
|
49
|
+
|
|
50
|
+
let reset = () => {
|
|
51
|
+
capturedTopicEventCount := 0
|
|
52
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
// Generated by ReScript, PLEASE EDIT WITH CARE
|
|
2
|
+
|
|
3
|
+
import * as S from "sury/src/S.res.mjs";
|
|
4
|
+
import * as Id$Reventless from "@reventlessdev/reventless-spec/src/types/Id.res.mjs";
|
|
5
|
+
import * as LocalBus$ReventlessLocal from "../../../src/adapter/LocalBus.res.mjs";
|
|
6
|
+
import * as TestRunner$ReventlessLocal from "../../../src/test/TestRunner.res.mjs";
|
|
7
|
+
import * as TestFixtures$ReventlessLocal from "../../TestFixtures.res.mjs";
|
|
8
|
+
import * as EventLog_Builder$ReventlessCore from "@reventlessdev/reventless-core/src/components/EventLog/EventLog_Builder.res.mjs";
|
|
9
|
+
import * as EventLogStorage_InMemory$ReventlessLocal from "../../../src/adapter/EventLog/EventLogStorage_InMemory.res.mjs";
|
|
10
|
+
import * as LocalEventTopicPublisher$ReventlessLocal from "../../../src/adapter/EventTopic/LocalEventTopicPublisher.res.mjs";
|
|
11
|
+
|
|
12
|
+
let name = "TestItemEventLog";
|
|
13
|
+
|
|
14
|
+
let eventSchema = S.union([
|
|
15
|
+
S.schema(s => ({
|
|
16
|
+
TAG: "ItemCreated",
|
|
17
|
+
name: s.m(S.string)
|
|
18
|
+
})),
|
|
19
|
+
S.schema(s => ({
|
|
20
|
+
TAG: "ItemDeleted",
|
|
21
|
+
id: s.m(S.string)
|
|
22
|
+
}))
|
|
23
|
+
]);
|
|
24
|
+
|
|
25
|
+
let ItemEventLogSpec = {
|
|
26
|
+
Id: undefined,
|
|
27
|
+
name: name,
|
|
28
|
+
eventSchema: eventSchema
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
let Bus = LocalBus$ReventlessLocal.Make({});
|
|
32
|
+
|
|
33
|
+
let capturedTopicEventCount = {
|
|
34
|
+
contents: 0
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
Bus.subscribeToEvents("TestItemEventLogEventTopic", async (param, param$1, param$2) => {
|
|
38
|
+
capturedTopicEventCount.contents = capturedTopicEventCount.contents + 1 | 0;
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
TestRunner$ReventlessLocal.setup();
|
|
42
|
+
|
|
43
|
+
let EventLogMaker = EventLog_Builder$ReventlessCore.Make({
|
|
44
|
+
Id: {
|
|
45
|
+
schema: Id$Reventless.StringPure.schema,
|
|
46
|
+
make: prim => prim,
|
|
47
|
+
makeFromString: prim => prim,
|
|
48
|
+
toString: prim => prim,
|
|
49
|
+
cmp: Id$Reventless.StringPure.cmp
|
|
50
|
+
},
|
|
51
|
+
name: name,
|
|
52
|
+
eventSchema: eventSchema
|
|
53
|
+
})({
|
|
54
|
+
make: EventLogStorage_InMemory$ReventlessLocal.make
|
|
55
|
+
})(LocalEventTopicPublisher$ReventlessLocal.Make(Bus));
|
|
56
|
+
|
|
57
|
+
let eventLog = EventLogMaker.make("TestItemEventLog", undefined);
|
|
58
|
+
|
|
59
|
+
function makeEvent$p(id, event) {
|
|
60
|
+
return {
|
|
61
|
+
id: id,
|
|
62
|
+
meta: TestFixtures$ReventlessLocal.testMeta,
|
|
63
|
+
event: event
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function reset() {
|
|
68
|
+
capturedTopicEventCount.contents = 0;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export {
|
|
72
|
+
ItemEventLogSpec,
|
|
73
|
+
Bus,
|
|
74
|
+
capturedTopicEventCount,
|
|
75
|
+
EventLogMaker,
|
|
76
|
+
eventLog,
|
|
77
|
+
makeEvent$p,
|
|
78
|
+
reset,
|
|
79
|
+
}
|
|
80
|
+
/* eventSchema Not a pure module */
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
// Tests for EventLog.replayStream (Phase B of effect-stream-integration plan).
|
|
2
|
+
// These tests verify the streaming replay API and the (state, count) fold pattern
|
|
3
|
+
// used by Aggregate_Callback to replace the two-pass replay + Array.length approach.
|
|
4
|
+
|
|
5
|
+
open JestGlobals
|
|
6
|
+
open EventLogFixtures
|
|
7
|
+
|
|
8
|
+
describe("EventLog.replayStream (in-memory adapter)", () => {
|
|
9
|
+
let _ = beforeAllAsync(async () => {
|
|
10
|
+
let _ = await eventLog->ReventlessCore.Component.operations->TestRunner.resolve
|
|
11
|
+
})
|
|
12
|
+
|
|
13
|
+
let _ = beforeEach(() => reset())
|
|
14
|
+
|
|
15
|
+
describe("basic streaming", () => {
|
|
16
|
+
testPromise("replayStream returns all appended events", async () => {
|
|
17
|
+
let ops = await eventLog->ReventlessCore.Component.operations->TestRunner.resolve
|
|
18
|
+
let _ = await ops.append(0, "stream-1", [makeEvent'("stream-1", ItemEventLogSpec.ItemCreated({name: "Widget"}))])
|
|
19
|
+
let _ = await ops.append(1, "stream-1", [makeEvent'("stream-1", ItemEventLogSpec.ItemDeleted({id: "stream-1"}))])
|
|
20
|
+
let count = await ops.replayStream("stream-1")
|
|
21
|
+
->Stream.runFold(0, (n, _) => n + 1)
|
|
22
|
+
->Effect.runPromise
|
|
23
|
+
expect(count)->toBe(2)
|
|
24
|
+
})
|
|
25
|
+
|
|
26
|
+
testPromise("replayStream for unknown id returns empty stream", async () => {
|
|
27
|
+
let ops = await eventLog->ReventlessCore.Component.operations->TestRunner.resolve
|
|
28
|
+
let count = await ops.replayStream("no-such-id")
|
|
29
|
+
->Stream.runFold(0, (n, _) => n + 1)
|
|
30
|
+
->Effect.runPromise
|
|
31
|
+
expect(count)->toBe(0)
|
|
32
|
+
})
|
|
33
|
+
|
|
34
|
+
testPromise("replayStream emits events in append order", async () => {
|
|
35
|
+
let ops = await eventLog->ReventlessCore.Component.operations->TestRunner.resolve
|
|
36
|
+
let _ = await ops.append(0, "stream-2", [makeEvent'("stream-2", ItemEventLogSpec.ItemCreated({name: "First"}))])
|
|
37
|
+
let _ = await ops.append(1, "stream-2", [makeEvent'("stream-2", ItemEventLogSpec.ItemDeleted({id: "stream-2"}))])
|
|
38
|
+
let events = await ops.replayStream("stream-2")
|
|
39
|
+
->Stream.runCollect
|
|
40
|
+
->Effect.runPromise
|
|
41
|
+
expect(events->Array.length)->toBe(2)
|
|
42
|
+
// First emitted is the Created event
|
|
43
|
+
let first = events->Array.getUnsafe(0)
|
|
44
|
+
expect(first)->toEqual(ItemEventLogSpec.ItemCreated({name: "First"}))
|
|
45
|
+
})
|
|
46
|
+
|
|
47
|
+
testPromise("separate aggregate IDs have independent streams", async () => {
|
|
48
|
+
let ops = await eventLog->ReventlessCore.Component.operations->TestRunner.resolve
|
|
49
|
+
let _ = await ops.append(0, "agg-X", [makeEvent'("agg-X", ItemEventLogSpec.ItemCreated({name: "X"}))])
|
|
50
|
+
let _ = await ops.append(0, "agg-Y", [makeEvent'("agg-Y", ItemEventLogSpec.ItemCreated({name: "Y1"})), makeEvent'("agg-Y", ItemEventLogSpec.ItemDeleted({id: "agg-Y"}))])
|
|
51
|
+
let countX = await ops.replayStream("agg-X")
|
|
52
|
+
->Stream.runFold(0, (n, _) => n + 1)
|
|
53
|
+
->Effect.runPromise
|
|
54
|
+
let countY = await ops.replayStream("agg-Y")
|
|
55
|
+
->Stream.runFold(0, (n, _) => n + 1)
|
|
56
|
+
->Effect.runPromise
|
|
57
|
+
expect(countX)->toBe(1)
|
|
58
|
+
expect(countY)->toBe(2)
|
|
59
|
+
})
|
|
60
|
+
|
|
61
|
+
testPromise("take(2) on a 5-event log returns only 2 events", async () => {
|
|
62
|
+
let ops = await eventLog->ReventlessCore.Component.operations->TestRunner.resolve
|
|
63
|
+
let _ = await ops.append(0, "stream-3", [
|
|
64
|
+
makeEvent'("stream-3", ItemEventLogSpec.ItemCreated({name: "e1"})),
|
|
65
|
+
makeEvent'("stream-3", ItemEventLogSpec.ItemDeleted({id: "e2"})),
|
|
66
|
+
makeEvent'("stream-3", ItemEventLogSpec.ItemCreated({name: "e3"})),
|
|
67
|
+
makeEvent'("stream-3", ItemEventLogSpec.ItemDeleted({id: "e4"})),
|
|
68
|
+
makeEvent'("stream-3", ItemEventLogSpec.ItemCreated({name: "e5"})),
|
|
69
|
+
])
|
|
70
|
+
let first2 = await ops.replayStream("stream-3")
|
|
71
|
+
->Stream.take(2)
|
|
72
|
+
->Stream.runCollect
|
|
73
|
+
->Effect.runPromise
|
|
74
|
+
expect(first2->Array.length)->toBe(2)
|
|
75
|
+
})
|
|
76
|
+
})
|
|
77
|
+
|
|
78
|
+
describe("tuple fold — (state, count) pattern used in Aggregate_Callback", () => {
|
|
79
|
+
testPromise("runFold produces correct count for sequenceNr", async () => {
|
|
80
|
+
let ops = await eventLog->ReventlessCore.Component.operations->TestRunner.resolve
|
|
81
|
+
let _ = await ops.append(0, "fold-1", [makeEvent'("fold-1", ItemEventLogSpec.ItemCreated({name: "e1"})), makeEvent'("fold-1", ItemEventLogSpec.ItemDeleted({id: "e2"}))])
|
|
82
|
+
let _ = await ops.append(2, "fold-1", [makeEvent'("fold-1", ItemEventLogSpec.ItemCreated({name: "e3"}))])
|
|
83
|
+
let (_state, count) = await ops.replayStream("fold-1")
|
|
84
|
+
->Stream.runFold((None, 0), ((st, n), _ev) => (st, n + 1))
|
|
85
|
+
->Effect.runPromise
|
|
86
|
+
expect(count)->toBe(3)
|
|
87
|
+
})
|
|
88
|
+
|
|
89
|
+
testPromise("runFold on empty stream returns initial accumulator", async () => {
|
|
90
|
+
let ops = await eventLog->ReventlessCore.Component.operations->TestRunner.resolve
|
|
91
|
+
let (state, count) = await ops.replayStream("unknown-fold")
|
|
92
|
+
->Stream.runFold((None, 0), ((st, n), _ev) => (st, n + 1))
|
|
93
|
+
->Effect.runPromise
|
|
94
|
+
expect(state)->toEqual(None)
|
|
95
|
+
expect(count)->toBe(0)
|
|
96
|
+
})
|
|
97
|
+
})
|
|
98
|
+
})
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
// Generated by ReScript, PLEASE EDIT WITH CARE
|
|
2
|
+
|
|
3
|
+
import * as Stream from "@reventlessdev/rescript-effect/src/Stream.res.mjs";
|
|
4
|
+
import * as Effect from "effect/Effect";
|
|
5
|
+
import * as Stream$1 from "effect/Stream";
|
|
6
|
+
import * as Component$ReventlessCore from "@reventlessdev/reventless-core/src/components/Component.res.mjs";
|
|
7
|
+
import * as TestRunner$ReventlessLocal from "../../../src/test/TestRunner.res.mjs";
|
|
8
|
+
import * as EventLogFixtures$ReventlessLocal from "./EventLogFixtures.res.mjs";
|
|
9
|
+
|
|
10
|
+
globalThis.describe("EventLog.replayStream (in-memory adapter)", () => {
|
|
11
|
+
globalThis.beforeAll(async () => {
|
|
12
|
+
await TestRunner$ReventlessLocal.resolve(Component$ReventlessCore.operations(EventLogFixtures$ReventlessLocal.eventLog));
|
|
13
|
+
});
|
|
14
|
+
globalThis.beforeEach(() => EventLogFixtures$ReventlessLocal.reset());
|
|
15
|
+
globalThis.describe("basic streaming", () => {
|
|
16
|
+
globalThis.test("replayStream returns all appended events", async () => {
|
|
17
|
+
let ops = await TestRunner$ReventlessLocal.resolve(Component$ReventlessCore.operations(EventLogFixtures$ReventlessLocal.eventLog));
|
|
18
|
+
await ops.append(0, "stream-1", [EventLogFixtures$ReventlessLocal.makeEvent$p("stream-1", {
|
|
19
|
+
TAG: "ItemCreated",
|
|
20
|
+
name: "Widget"
|
|
21
|
+
})]);
|
|
22
|
+
await ops.append(1, "stream-1", [EventLogFixtures$ReventlessLocal.makeEvent$p("stream-1", {
|
|
23
|
+
TAG: "ItemDeleted",
|
|
24
|
+
id: "stream-1"
|
|
25
|
+
})]);
|
|
26
|
+
let count = await Effect.runPromise(Stream$1.runFold(ops.replayStream("stream-1"), 0, (n, param) => n + 1 | 0));
|
|
27
|
+
globalThis.expect(count).toBe(2);
|
|
28
|
+
});
|
|
29
|
+
globalThis.test("replayStream for unknown id returns empty stream", async () => {
|
|
30
|
+
let ops = await TestRunner$ReventlessLocal.resolve(Component$ReventlessCore.operations(EventLogFixtures$ReventlessLocal.eventLog));
|
|
31
|
+
let count = await Effect.runPromise(Stream$1.runFold(ops.replayStream("no-such-id"), 0, (n, param) => n + 1 | 0));
|
|
32
|
+
globalThis.expect(count).toBe(0);
|
|
33
|
+
});
|
|
34
|
+
globalThis.test("replayStream emits events in append order", async () => {
|
|
35
|
+
let ops = await TestRunner$ReventlessLocal.resolve(Component$ReventlessCore.operations(EventLogFixtures$ReventlessLocal.eventLog));
|
|
36
|
+
await ops.append(0, "stream-2", [EventLogFixtures$ReventlessLocal.makeEvent$p("stream-2", {
|
|
37
|
+
TAG: "ItemCreated",
|
|
38
|
+
name: "First"
|
|
39
|
+
})]);
|
|
40
|
+
await ops.append(1, "stream-2", [EventLogFixtures$ReventlessLocal.makeEvent$p("stream-2", {
|
|
41
|
+
TAG: "ItemDeleted",
|
|
42
|
+
id: "stream-2"
|
|
43
|
+
})]);
|
|
44
|
+
let events = await Effect.runPromise(Stream.runCollect(ops.replayStream("stream-2")));
|
|
45
|
+
globalThis.expect(events.length).toBe(2);
|
|
46
|
+
let first = events[0];
|
|
47
|
+
globalThis.expect(first).toEqual({
|
|
48
|
+
TAG: "ItemCreated",
|
|
49
|
+
name: "First"
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
globalThis.test("separate aggregate IDs have independent streams", async () => {
|
|
53
|
+
let ops = await TestRunner$ReventlessLocal.resolve(Component$ReventlessCore.operations(EventLogFixtures$ReventlessLocal.eventLog));
|
|
54
|
+
await ops.append(0, "agg-X", [EventLogFixtures$ReventlessLocal.makeEvent$p("agg-X", {
|
|
55
|
+
TAG: "ItemCreated",
|
|
56
|
+
name: "X"
|
|
57
|
+
})]);
|
|
58
|
+
await ops.append(0, "agg-Y", [
|
|
59
|
+
EventLogFixtures$ReventlessLocal.makeEvent$p("agg-Y", {
|
|
60
|
+
TAG: "ItemCreated",
|
|
61
|
+
name: "Y1"
|
|
62
|
+
}),
|
|
63
|
+
EventLogFixtures$ReventlessLocal.makeEvent$p("agg-Y", {
|
|
64
|
+
TAG: "ItemDeleted",
|
|
65
|
+
id: "agg-Y"
|
|
66
|
+
})
|
|
67
|
+
]);
|
|
68
|
+
let countX = await Effect.runPromise(Stream$1.runFold(ops.replayStream("agg-X"), 0, (n, param) => n + 1 | 0));
|
|
69
|
+
let countY = await Effect.runPromise(Stream$1.runFold(ops.replayStream("agg-Y"), 0, (n, param) => n + 1 | 0));
|
|
70
|
+
globalThis.expect(countX).toBe(1);
|
|
71
|
+
globalThis.expect(countY).toBe(2);
|
|
72
|
+
});
|
|
73
|
+
globalThis.test("take(2) on a 5-event log returns only 2 events", async () => {
|
|
74
|
+
let ops = await TestRunner$ReventlessLocal.resolve(Component$ReventlessCore.operations(EventLogFixtures$ReventlessLocal.eventLog));
|
|
75
|
+
await ops.append(0, "stream-3", [
|
|
76
|
+
EventLogFixtures$ReventlessLocal.makeEvent$p("stream-3", {
|
|
77
|
+
TAG: "ItemCreated",
|
|
78
|
+
name: "e1"
|
|
79
|
+
}),
|
|
80
|
+
EventLogFixtures$ReventlessLocal.makeEvent$p("stream-3", {
|
|
81
|
+
TAG: "ItemDeleted",
|
|
82
|
+
id: "e2"
|
|
83
|
+
}),
|
|
84
|
+
EventLogFixtures$ReventlessLocal.makeEvent$p("stream-3", {
|
|
85
|
+
TAG: "ItemCreated",
|
|
86
|
+
name: "e3"
|
|
87
|
+
}),
|
|
88
|
+
EventLogFixtures$ReventlessLocal.makeEvent$p("stream-3", {
|
|
89
|
+
TAG: "ItemDeleted",
|
|
90
|
+
id: "e4"
|
|
91
|
+
}),
|
|
92
|
+
EventLogFixtures$ReventlessLocal.makeEvent$p("stream-3", {
|
|
93
|
+
TAG: "ItemCreated",
|
|
94
|
+
name: "e5"
|
|
95
|
+
})
|
|
96
|
+
]);
|
|
97
|
+
let first2 = await Effect.runPromise(Stream.runCollect(Stream$1.take(ops.replayStream("stream-3"), 2)));
|
|
98
|
+
globalThis.expect(first2.length).toBe(2);
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
globalThis.describe("tuple fold — (state, count) pattern used in Aggregate_Callback", () => {
|
|
102
|
+
globalThis.test("runFold produces correct count for sequenceNr", async () => {
|
|
103
|
+
let ops = await TestRunner$ReventlessLocal.resolve(Component$ReventlessCore.operations(EventLogFixtures$ReventlessLocal.eventLog));
|
|
104
|
+
await ops.append(0, "fold-1", [
|
|
105
|
+
EventLogFixtures$ReventlessLocal.makeEvent$p("fold-1", {
|
|
106
|
+
TAG: "ItemCreated",
|
|
107
|
+
name: "e1"
|
|
108
|
+
}),
|
|
109
|
+
EventLogFixtures$ReventlessLocal.makeEvent$p("fold-1", {
|
|
110
|
+
TAG: "ItemDeleted",
|
|
111
|
+
id: "e2"
|
|
112
|
+
})
|
|
113
|
+
]);
|
|
114
|
+
await ops.append(2, "fold-1", [EventLogFixtures$ReventlessLocal.makeEvent$p("fold-1", {
|
|
115
|
+
TAG: "ItemCreated",
|
|
116
|
+
name: "e3"
|
|
117
|
+
})]);
|
|
118
|
+
let match = await Effect.runPromise(Stream$1.runFold(ops.replayStream("fold-1"), [
|
|
119
|
+
undefined,
|
|
120
|
+
0
|
|
121
|
+
], (param, _ev) => [
|
|
122
|
+
param[0],
|
|
123
|
+
param[1] + 1 | 0
|
|
124
|
+
]));
|
|
125
|
+
globalThis.expect(match[1]).toBe(3);
|
|
126
|
+
});
|
|
127
|
+
globalThis.test("runFold on empty stream returns initial accumulator", async () => {
|
|
128
|
+
let ops = await TestRunner$ReventlessLocal.resolve(Component$ReventlessCore.operations(EventLogFixtures$ReventlessLocal.eventLog));
|
|
129
|
+
let match = await Effect.runPromise(Stream$1.runFold(ops.replayStream("unknown-fold"), [
|
|
130
|
+
undefined,
|
|
131
|
+
0
|
|
132
|
+
], (param, _ev) => [
|
|
133
|
+
param[0],
|
|
134
|
+
param[1] + 1 | 0
|
|
135
|
+
]));
|
|
136
|
+
globalThis.expect(match[0]).toEqual(undefined);
|
|
137
|
+
globalThis.expect(match[1]).toBe(0);
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
/* Not a pure module */
|