@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,169 @@
|
|
|
1
|
+
// Generated by ReScript, PLEASE EDIT WITH CARE
|
|
2
|
+
|
|
3
|
+
import * as S from "sury/src/S.res.mjs";
|
|
4
|
+
import * as Stream from "@reventlessdev/rescript-effect/src/Stream.res.mjs";
|
|
5
|
+
import * as Id$Reventless from "@reventlessdev/reventless-spec/src/types/Id.res.mjs";
|
|
6
|
+
import * as Effect from "effect/Effect";
|
|
7
|
+
import * as Pulumi from "@pulumi/pulumi";
|
|
8
|
+
import * as Message$Reventless from "@reventlessdev/reventless-spec/src/types/Message.res.mjs";
|
|
9
|
+
import * as ReadModel$Reventless from "@reventlessdev/reventless-spec/src/components/ReadModel.res.mjs";
|
|
10
|
+
import * as Projection$Reventless from "@reventlessdev/reventless-spec/src/types/Projection.res.mjs";
|
|
11
|
+
import * as Adapter$ReventlessInfra from "@reventlessdev/reventless-infra/src/adapter/Adapter.res.mjs";
|
|
12
|
+
import * as LocalBus$ReventlessLocal from "../../../src/adapter/LocalBus.res.mjs";
|
|
13
|
+
import * as TestRunner$ReventlessLocal from "../../../src/test/TestRunner.res.mjs";
|
|
14
|
+
import * as TestFixtures$ReventlessLocal from "../../TestFixtures.res.mjs";
|
|
15
|
+
import * as ReadModel_Builder$ReventlessLocal from "../../../src/components/ReadModel_Builder.res.mjs";
|
|
16
|
+
|
|
17
|
+
let name = "TestItemReadModel";
|
|
18
|
+
|
|
19
|
+
let moduleUrl = import.meta.url;
|
|
20
|
+
|
|
21
|
+
let stateSchema = S.schema(s => ({
|
|
22
|
+
name: s.m(S.string)
|
|
23
|
+
}));
|
|
24
|
+
|
|
25
|
+
let config = ReadModel$Reventless.config(undefined, undefined, undefined);
|
|
26
|
+
|
|
27
|
+
let ItemReadModelSpec = {
|
|
28
|
+
Id: undefined,
|
|
29
|
+
name: name,
|
|
30
|
+
moduleUrl: moduleUrl,
|
|
31
|
+
stateSchema: stateSchema,
|
|
32
|
+
config: config,
|
|
33
|
+
subIdConfig: undefined,
|
|
34
|
+
authorization: "AllowAuthenticated",
|
|
35
|
+
visibility: "Public"
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
let name$1 = "TestItemEventTopic";
|
|
39
|
+
|
|
40
|
+
let eventSchema = S.schema(s => ({
|
|
41
|
+
TAG: "ItemCreated",
|
|
42
|
+
name: s.m(S.string)
|
|
43
|
+
}));
|
|
44
|
+
|
|
45
|
+
let ItemEventSource = {
|
|
46
|
+
Id: undefined,
|
|
47
|
+
name: name$1,
|
|
48
|
+
eventSchema: eventSchema
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
function project(msg) {
|
|
52
|
+
let match = msg.event;
|
|
53
|
+
return {
|
|
54
|
+
TAG: "Create",
|
|
55
|
+
_0: msg.id,
|
|
56
|
+
_1: {
|
|
57
|
+
name: match.name
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
let ItemMapping = Projection$Reventless.Mapping.Make({
|
|
63
|
+
Id: Id$Reventless.$$String,
|
|
64
|
+
name: name$1,
|
|
65
|
+
eventSchema: eventSchema
|
|
66
|
+
})({
|
|
67
|
+
Id: Id$Reventless.$$String,
|
|
68
|
+
name: name,
|
|
69
|
+
stateSchema: stateSchema,
|
|
70
|
+
subIdConfig: undefined
|
|
71
|
+
})({
|
|
72
|
+
project: project
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
Projection$Reventless.Mappings.Make({
|
|
76
|
+
Id: Id$Reventless.$$String,
|
|
77
|
+
name: name,
|
|
78
|
+
stateSchema: stateSchema,
|
|
79
|
+
subIdConfig: undefined
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
let moduleUrl$1 = import.meta.url;
|
|
83
|
+
|
|
84
|
+
let mappings = [ItemMapping];
|
|
85
|
+
|
|
86
|
+
let ItemMappings = {
|
|
87
|
+
moduleUrl: moduleUrl$1,
|
|
88
|
+
mappings: mappings
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
let topicName = "TestItemEventTopic";
|
|
92
|
+
|
|
93
|
+
let topicResource = Adapter$ReventlessInfra.make(Pulumi.output(topicName), Pulumi.output(topicName), Pulumi.output(topicName), Pulumi.output("memory:InMemory"), undefined, undefined, undefined, undefined, undefined, undefined);
|
|
94
|
+
|
|
95
|
+
let allEventTopics = Object.fromEntries([[
|
|
96
|
+
topicName,
|
|
97
|
+
{
|
|
98
|
+
resources: [topicResource]
|
|
99
|
+
}
|
|
100
|
+
]]);
|
|
101
|
+
|
|
102
|
+
let Bus = LocalBus$ReventlessLocal.Make({});
|
|
103
|
+
|
|
104
|
+
TestRunner$ReventlessLocal.setup();
|
|
105
|
+
|
|
106
|
+
let ReadModelMaker = ReadModel_Builder$ReventlessLocal.Make(Bus);
|
|
107
|
+
|
|
108
|
+
let ItemReadModel = ReadModelMaker.Make({
|
|
109
|
+
Id: Id$Reventless.$$String,
|
|
110
|
+
name: name,
|
|
111
|
+
moduleUrl: moduleUrl,
|
|
112
|
+
stateSchema: stateSchema,
|
|
113
|
+
config: config,
|
|
114
|
+
subIdConfig: undefined,
|
|
115
|
+
authorization: "AllowAuthenticated",
|
|
116
|
+
visibility: "Public"
|
|
117
|
+
})(ItemMappings);
|
|
118
|
+
|
|
119
|
+
let rm = ItemReadModel.make(undefined, undefined, allEventTopics, undefined);
|
|
120
|
+
|
|
121
|
+
let testMeta = TestFixtures$ReventlessLocal.makeTestMeta("TestItemEventTopic");
|
|
122
|
+
|
|
123
|
+
async function publishItemCreated(id, name) {
|
|
124
|
+
let eventJson = Object.fromEntries([
|
|
125
|
+
[
|
|
126
|
+
"id",
|
|
127
|
+
id
|
|
128
|
+
],
|
|
129
|
+
[
|
|
130
|
+
"meta",
|
|
131
|
+
S.reverseConvertToJsonOrThrow(testMeta, Message$Reventless.metaSchema)
|
|
132
|
+
],
|
|
133
|
+
[
|
|
134
|
+
"event",
|
|
135
|
+
S.reverseConvertToJsonOrThrow({
|
|
136
|
+
TAG: "ItemCreated",
|
|
137
|
+
name: name
|
|
138
|
+
}, eventSchema)
|
|
139
|
+
]
|
|
140
|
+
]);
|
|
141
|
+
return await Bus.publishEvent(topicName, "test", testMeta, eventJson);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
async function loadState(id) {
|
|
145
|
+
let ops = Bus.getQueryDb("TestItemReadModel");
|
|
146
|
+
if (ops === undefined) {
|
|
147
|
+
return [];
|
|
148
|
+
}
|
|
149
|
+
let states = await Effect.runPromise(Effect.catchAll(Stream.runCollect(ops.loadStream(id)), param => Effect.succeed([])));
|
|
150
|
+
return states.map(json => S.parseJsonOrThrow(json, stateSchema));
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
export {
|
|
154
|
+
ItemReadModelSpec,
|
|
155
|
+
ItemEventSource,
|
|
156
|
+
ItemMapping,
|
|
157
|
+
ItemMappings,
|
|
158
|
+
topicName,
|
|
159
|
+
topicResource,
|
|
160
|
+
allEventTopics,
|
|
161
|
+
Bus,
|
|
162
|
+
ReadModelMaker,
|
|
163
|
+
ItemReadModel,
|
|
164
|
+
rm,
|
|
165
|
+
testMeta,
|
|
166
|
+
publishItemCreated,
|
|
167
|
+
loadState,
|
|
168
|
+
}
|
|
169
|
+
/* moduleUrl Not a pure module */
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
// E2E tests for ReadModel_Builder.
|
|
2
|
+
// Verifies the full publish → EventCollector → projection → QueryDb pipeline.
|
|
3
|
+
|
|
4
|
+
open JestGlobals
|
|
5
|
+
open ReadModelFixtures
|
|
6
|
+
|
|
7
|
+
describe("ReadModel E2E", () => {
|
|
8
|
+
// Force Output chain resolution so EventCollectorChannel subscription is registered
|
|
9
|
+
// before the first test runs.
|
|
10
|
+
//
|
|
11
|
+
// Two resolves are needed:
|
|
12
|
+
// 1. rm.operations chain — triggers the outer queryDb.operations.apply(...) which
|
|
13
|
+
// calls EventCollectorChannel.connect() as a side effect.
|
|
14
|
+
// 2. topicResource.name — resolves the inner resource.name.apply(...) inside connect,
|
|
15
|
+
// which registers the Bus.subscribeToEvents handler.
|
|
16
|
+
let _ = beforeAllAsync(async () => {
|
|
17
|
+
let _ = await rm->ItemReadModel.operations->TestRunner.resolve
|
|
18
|
+
let _ = await topicResource.name->TestRunner.resolve
|
|
19
|
+
})
|
|
20
|
+
|
|
21
|
+
testPromise("ItemCreated event projects into ReadModel state", async () => {
|
|
22
|
+
let _ = await publishItemCreated("item-1", "Widget")
|
|
23
|
+
let states = await loadState("item-1")
|
|
24
|
+
expect(states->Array.length)->toBe(1)
|
|
25
|
+
let state = states->Array.getUnsafe(0)
|
|
26
|
+
expect(state.name)->toBe("Widget")
|
|
27
|
+
})
|
|
28
|
+
|
|
29
|
+
testPromise("query for unknown ID returns empty", async () => {
|
|
30
|
+
let states = await loadState("unknown-id")
|
|
31
|
+
expect(states->Array.length)->toBe(0)
|
|
32
|
+
})
|
|
33
|
+
|
|
34
|
+
testPromise("multiple events project independently", async () => {
|
|
35
|
+
let _ = await publishItemCreated("item-2", "Gadget")
|
|
36
|
+
let _ = await publishItemCreated("item-3", "Doohickey")
|
|
37
|
+
let states2 = await loadState("item-2")
|
|
38
|
+
let states3 = await loadState("item-3")
|
|
39
|
+
expect(states2->Array.length)->toBe(1)
|
|
40
|
+
expect(states3->Array.length)->toBe(1)
|
|
41
|
+
let state2 = states2->Array.getUnsafe(0)
|
|
42
|
+
let state3 = states3->Array.getUnsafe(0)
|
|
43
|
+
expect(state2.name)->toBe("Gadget")
|
|
44
|
+
expect(state3.name)->toBe("Doohickey")
|
|
45
|
+
})
|
|
46
|
+
})
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
// Generated by ReScript, PLEASE EDIT WITH CARE
|
|
2
|
+
|
|
3
|
+
import * as TestRunner$ReventlessLocal from "../../../src/test/TestRunner.res.mjs";
|
|
4
|
+
import * as ReadModelFixtures$ReventlessLocal from "./ReadModelFixtures.res.mjs";
|
|
5
|
+
|
|
6
|
+
globalThis.describe("ReadModel E2E", () => {
|
|
7
|
+
globalThis.beforeAll(async () => {
|
|
8
|
+
await TestRunner$ReventlessLocal.resolve(ReadModelFixtures$ReventlessLocal.ItemReadModel.operations(ReadModelFixtures$ReventlessLocal.rm));
|
|
9
|
+
await TestRunner$ReventlessLocal.resolve(ReadModelFixtures$ReventlessLocal.topicResource.name);
|
|
10
|
+
});
|
|
11
|
+
globalThis.test("ItemCreated event projects into ReadModel state", async () => {
|
|
12
|
+
await ReadModelFixtures$ReventlessLocal.publishItemCreated("item-1", "Widget");
|
|
13
|
+
let states = await ReadModelFixtures$ReventlessLocal.loadState("item-1");
|
|
14
|
+
globalThis.expect(states.length).toBe(1);
|
|
15
|
+
let state = states[0];
|
|
16
|
+
globalThis.expect(state.name).toBe("Widget");
|
|
17
|
+
});
|
|
18
|
+
globalThis.test("query for unknown ID returns empty", async () => {
|
|
19
|
+
let states = await ReadModelFixtures$ReventlessLocal.loadState("unknown-id");
|
|
20
|
+
globalThis.expect(states.length).toBe(0);
|
|
21
|
+
});
|
|
22
|
+
globalThis.test("multiple events project independently", async () => {
|
|
23
|
+
await ReadModelFixtures$ReventlessLocal.publishItemCreated("item-2", "Gadget");
|
|
24
|
+
await ReadModelFixtures$ReventlessLocal.publishItemCreated("item-3", "Doohickey");
|
|
25
|
+
let states2 = await ReadModelFixtures$ReventlessLocal.loadState("item-2");
|
|
26
|
+
let states3 = await ReadModelFixtures$ReventlessLocal.loadState("item-3");
|
|
27
|
+
globalThis.expect(states2.length).toBe(1);
|
|
28
|
+
globalThis.expect(states3.length).toBe(1);
|
|
29
|
+
let state2 = states2[0];
|
|
30
|
+
let state3 = states3[0];
|
|
31
|
+
globalThis.expect(state2.name).toBe("Gadget");
|
|
32
|
+
globalThis.expect(state3.name).toBe("Doohickey");
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
/* Not a pure module */
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
// Fixtures for Scheduler component integration tests.
|
|
2
|
+
// Uses LocalScheduledPublisher + Scheduler_Builder to verify schedule lifecycle.
|
|
3
|
+
|
|
4
|
+
open TestFixtures
|
|
5
|
+
open JestGlobals
|
|
6
|
+
|
|
7
|
+
// Activate Pulumi mock mode (must be called before any Component.make)
|
|
8
|
+
let _ = TestRunner.setup()
|
|
9
|
+
|
|
10
|
+
// ─────────────────────────────────────────────────────────────
|
|
11
|
+
// Isolated bus + scheduled publisher + scheduler maker
|
|
12
|
+
// ─────────────────────────────────────────────────────────────
|
|
13
|
+
|
|
14
|
+
module Bus = LocalBus.Make()
|
|
15
|
+
module SP = LocalScheduledPublisher.Make(Bus)
|
|
16
|
+
module SchedulerMaker = ReventlessCore.Scheduler_Builder.Make(SP)
|
|
17
|
+
|
|
18
|
+
// ─────────────────────────────────────────────────────────────
|
|
19
|
+
// Build the scheduler component (shared across tests)
|
|
20
|
+
// ─────────────────────────────────────────────────────────────
|
|
21
|
+
|
|
22
|
+
let scheduler = SchedulerMaker.make()
|
|
23
|
+
|
|
24
|
+
// ─────────────────────────────────────────────────────────────
|
|
25
|
+
// Helper: resolved Adapter.resolvedResource for a named bus topic
|
|
26
|
+
// ─────────────────────────────────────────────────────────────
|
|
27
|
+
|
|
28
|
+
let makeTopicResource = (name: string): ReventlessInfra.Adapter.resolvedResource => {
|
|
29
|
+
name,
|
|
30
|
+
id: name,
|
|
31
|
+
urn: name,
|
|
32
|
+
resourceInfo: NoInfo,
|
|
33
|
+
service: "memory:InMemory",
|
|
34
|
+
role: "",
|
|
35
|
+
region: "",
|
|
36
|
+
resourceType: "",
|
|
37
|
+
configuration: Dict.make(),
|
|
38
|
+
tags: Dict.make(),
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
let _ = beforeAll(() => {
|
|
42
|
+
jest->useFakeTimers
|
|
43
|
+
})
|
|
44
|
+
|
|
45
|
+
let _ = afterAll(() => {
|
|
46
|
+
SP.reset()
|
|
47
|
+
jest->useRealTimers
|
|
48
|
+
})
|
|
49
|
+
|
|
50
|
+
// ─────────────────────────────────────────────────────────────
|
|
51
|
+
// Resolve scheduler operations once for all tests
|
|
52
|
+
// ─────────────────────────────────────────────────────────────
|
|
53
|
+
|
|
54
|
+
let schedulerOps: ref<option<ReventlessInfra.Scheduler.operations>> = ref(None)
|
|
55
|
+
|
|
56
|
+
let _ = beforeAllAsync(async () => {
|
|
57
|
+
let ops = await scheduler->ReventlessCore.Component.operations->TestRunner.resolve
|
|
58
|
+
schedulerOps := Some(ops)
|
|
59
|
+
})
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
// Generated by ReScript, PLEASE EDIT WITH CARE
|
|
2
|
+
|
|
3
|
+
import * as Globals from "@jest/globals";
|
|
4
|
+
import * as Component$ReventlessCore from "@reventlessdev/reventless-core/src/components/Component.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 Scheduler_Builder$ReventlessCore from "@reventlessdev/reventless-core/src/components/Scheduler/Scheduler_Builder.res.mjs";
|
|
8
|
+
import * as LocalScheduledPublisher$ReventlessLocal from "../../../src/adapter/Scheduler/LocalScheduledPublisher.res.mjs";
|
|
9
|
+
|
|
10
|
+
TestRunner$ReventlessLocal.setup();
|
|
11
|
+
|
|
12
|
+
let Bus = LocalBus$ReventlessLocal.Make({});
|
|
13
|
+
|
|
14
|
+
let SP = LocalScheduledPublisher$ReventlessLocal.Make(Bus);
|
|
15
|
+
|
|
16
|
+
let SchedulerMaker = Scheduler_Builder$ReventlessCore.Make({
|
|
17
|
+
make: SP.make
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
let scheduler = SchedulerMaker.make(undefined);
|
|
21
|
+
|
|
22
|
+
function makeTopicResource(name) {
|
|
23
|
+
return {
|
|
24
|
+
name: name,
|
|
25
|
+
id: name,
|
|
26
|
+
urn: name,
|
|
27
|
+
resourceInfo: "NoInfo",
|
|
28
|
+
service: "memory:InMemory",
|
|
29
|
+
role: "",
|
|
30
|
+
region: "",
|
|
31
|
+
resourceType: "",
|
|
32
|
+
configuration: {},
|
|
33
|
+
tags: {}
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
globalThis.beforeAll(() => {
|
|
38
|
+
Globals.jest.useFakeTimers();
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
globalThis.afterAll(() => {
|
|
42
|
+
SP.reset();
|
|
43
|
+
Globals.jest.useRealTimers();
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
let schedulerOps = {
|
|
47
|
+
contents: undefined
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
globalThis.beforeAll(async () => {
|
|
51
|
+
let ops = await TestRunner$ReventlessLocal.resolve(Component$ReventlessCore.operations(scheduler));
|
|
52
|
+
schedulerOps.contents = ops;
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
export {
|
|
56
|
+
Bus,
|
|
57
|
+
SP,
|
|
58
|
+
SchedulerMaker,
|
|
59
|
+
scheduler,
|
|
60
|
+
makeTopicResource,
|
|
61
|
+
schedulerOps,
|
|
62
|
+
}
|
|
63
|
+
/* Not a pure module */
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
// Integration tests for Scheduler_Builder (in-memory).
|
|
2
|
+
// Verifies that createSchedule fires events and deleteSchedule prevents firing.
|
|
3
|
+
// Adapter-level timer tests are in adapter/ScheduledPublisherTest.res.
|
|
4
|
+
|
|
5
|
+
open TestFixtures
|
|
6
|
+
open JestGlobals
|
|
7
|
+
open SchedulerFixtures
|
|
8
|
+
|
|
9
|
+
describe("Scheduler_Builder.Make:", () => {
|
|
10
|
+
let _ = afterEach(() => SP.reset())
|
|
11
|
+
|
|
12
|
+
describe("createSchedule:", () => {
|
|
13
|
+
testPromise("recurring schedule fires event on each interval advance", async () => {
|
|
14
|
+
let ops = schedulerOps.contents->Option.getUnsafe
|
|
15
|
+
let count = ref(0)
|
|
16
|
+
Bus.subscribeToEvents("sched-recurring", async (_, _, _) => {
|
|
17
|
+
count := count.contents + 1
|
|
18
|
+
})
|
|
19
|
+
// createSchedule async body has no await — setInterval registered synchronously
|
|
20
|
+
let _ = ops.createSchedule(
|
|
21
|
+
[makeTopicResource("sched-recurring")],
|
|
22
|
+
{name: "test-recurring", rate: Reventless.Schedule.Minutes(1), payload: "{}"},
|
|
23
|
+
)
|
|
24
|
+
// Two microtask ticks: publishEvent uses Effect.all(concurrency=unbounded) which forks
|
|
25
|
+
// child fibers via startFork — one tick runs the child fiber (Queue.offer),
|
|
26
|
+
// a second tick runs the drain fiber callback.
|
|
27
|
+
jest->advanceTimersByTime(60 * 1000)
|
|
28
|
+
let _ = await Promise.resolve(())
|
|
29
|
+
let _ = await Promise.resolve(())
|
|
30
|
+
expect(count.contents)->toBe(1)
|
|
31
|
+
jest->advanceTimersByTime(60 * 1000)
|
|
32
|
+
let _ = await Promise.resolve(())
|
|
33
|
+
let _ = await Promise.resolve(())
|
|
34
|
+
expect(count.contents)->toBe(2)
|
|
35
|
+
})
|
|
36
|
+
|
|
37
|
+
testPromise("single-shot schedule fires once then stops", async () => {
|
|
38
|
+
let ops = schedulerOps.contents->Option.getUnsafe
|
|
39
|
+
let count = ref(0)
|
|
40
|
+
Bus.subscribeToEvents("sched-single", async (_, _, _) => {
|
|
41
|
+
count := count.contents + 1
|
|
42
|
+
})
|
|
43
|
+
let _ = ops.createSchedule(
|
|
44
|
+
[makeTopicResource("sched-single")],
|
|
45
|
+
{
|
|
46
|
+
name: "test-single",
|
|
47
|
+
rate: Reventless.Schedule.Single(2024, 1, 1, 0, 0),
|
|
48
|
+
payload: "{}",
|
|
49
|
+
},
|
|
50
|
+
)
|
|
51
|
+
jest->advanceTimersByTime(0)
|
|
52
|
+
let _ = await Promise.resolve(())
|
|
53
|
+
let _ = await Promise.resolve(())
|
|
54
|
+
expect(count.contents)->toBe(1)
|
|
55
|
+
jest->advanceTimersByTime(60 * 1000)
|
|
56
|
+
expect(count.contents)->toBe(1) // No further firing
|
|
57
|
+
})
|
|
58
|
+
})
|
|
59
|
+
|
|
60
|
+
describe("deleteSchedule:", () => {
|
|
61
|
+
testPromise("deleted schedule does not fire after deletion", async () => {
|
|
62
|
+
let ops = schedulerOps.contents->Option.getUnsafe
|
|
63
|
+
let count = ref(0)
|
|
64
|
+
Bus.subscribeToEvents("sched-delete", async (_, _, _) => {
|
|
65
|
+
count := count.contents + 1
|
|
66
|
+
})
|
|
67
|
+
let _ = ops.createSchedule(
|
|
68
|
+
[makeTopicResource("sched-delete")],
|
|
69
|
+
{name: "test-delete", rate: Reventless.Schedule.Minutes(2), payload: "{}"},
|
|
70
|
+
)
|
|
71
|
+
let _ = ops.deleteSchedule([], "test-delete")
|
|
72
|
+
jest->advanceTimersByTime(2 * 60 * 1000)
|
|
73
|
+
expect(count.contents)->toBe(0)
|
|
74
|
+
})
|
|
75
|
+
})
|
|
76
|
+
})
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
// Generated by ReScript, PLEASE EDIT WITH CARE
|
|
2
|
+
|
|
3
|
+
import * as Globals from "@jest/globals";
|
|
4
|
+
import * as SchedulerFixtures$ReventlessLocal from "./SchedulerFixtures.res.mjs";
|
|
5
|
+
|
|
6
|
+
globalThis.describe("Scheduler_Builder.Make:", () => {
|
|
7
|
+
globalThis.afterEach(() => SchedulerFixtures$ReventlessLocal.SP.reset());
|
|
8
|
+
globalThis.describe("createSchedule:", () => {
|
|
9
|
+
globalThis.test("recurring schedule fires event on each interval advance", async () => {
|
|
10
|
+
let ops = SchedulerFixtures$ReventlessLocal.schedulerOps.contents;
|
|
11
|
+
let count = {
|
|
12
|
+
contents: 0
|
|
13
|
+
};
|
|
14
|
+
SchedulerFixtures$ReventlessLocal.Bus.subscribeToEvents("sched-recurring", async (param, param$1, param$2) => {
|
|
15
|
+
count.contents = count.contents + 1 | 0;
|
|
16
|
+
});
|
|
17
|
+
ops.createSchedule([SchedulerFixtures$ReventlessLocal.makeTopicResource("sched-recurring")], {
|
|
18
|
+
name: "test-recurring",
|
|
19
|
+
rate: {
|
|
20
|
+
TAG: "Minutes",
|
|
21
|
+
_0: 1
|
|
22
|
+
},
|
|
23
|
+
payload: "{}"
|
|
24
|
+
});
|
|
25
|
+
Globals.jest.advanceTimersByTime(60000);
|
|
26
|
+
await Promise.resolve();
|
|
27
|
+
await Promise.resolve();
|
|
28
|
+
globalThis.expect(count.contents).toBe(1);
|
|
29
|
+
Globals.jest.advanceTimersByTime(60000);
|
|
30
|
+
await Promise.resolve();
|
|
31
|
+
await Promise.resolve();
|
|
32
|
+
globalThis.expect(count.contents).toBe(2);
|
|
33
|
+
});
|
|
34
|
+
globalThis.test("single-shot schedule fires once then stops", async () => {
|
|
35
|
+
let ops = SchedulerFixtures$ReventlessLocal.schedulerOps.contents;
|
|
36
|
+
let count = {
|
|
37
|
+
contents: 0
|
|
38
|
+
};
|
|
39
|
+
SchedulerFixtures$ReventlessLocal.Bus.subscribeToEvents("sched-single", async (param, param$1, param$2) => {
|
|
40
|
+
count.contents = count.contents + 1 | 0;
|
|
41
|
+
});
|
|
42
|
+
ops.createSchedule([SchedulerFixtures$ReventlessLocal.makeTopicResource("sched-single")], {
|
|
43
|
+
name: "test-single",
|
|
44
|
+
rate: {
|
|
45
|
+
TAG: "Single",
|
|
46
|
+
_0: 2024,
|
|
47
|
+
_1: 1,
|
|
48
|
+
_2: 1,
|
|
49
|
+
_3: 0,
|
|
50
|
+
_4: 0
|
|
51
|
+
},
|
|
52
|
+
payload: "{}"
|
|
53
|
+
});
|
|
54
|
+
Globals.jest.advanceTimersByTime(0);
|
|
55
|
+
await Promise.resolve();
|
|
56
|
+
await Promise.resolve();
|
|
57
|
+
globalThis.expect(count.contents).toBe(1);
|
|
58
|
+
Globals.jest.advanceTimersByTime(60000);
|
|
59
|
+
globalThis.expect(count.contents).toBe(1);
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
globalThis.describe("deleteSchedule:", () => {
|
|
63
|
+
globalThis.test("deleted schedule does not fire after deletion", async () => {
|
|
64
|
+
let ops = SchedulerFixtures$ReventlessLocal.schedulerOps.contents;
|
|
65
|
+
let count = {
|
|
66
|
+
contents: 0
|
|
67
|
+
};
|
|
68
|
+
SchedulerFixtures$ReventlessLocal.Bus.subscribeToEvents("sched-delete", async (param, param$1, param$2) => {
|
|
69
|
+
count.contents = count.contents + 1 | 0;
|
|
70
|
+
});
|
|
71
|
+
ops.createSchedule([SchedulerFixtures$ReventlessLocal.makeTopicResource("sched-delete")], {
|
|
72
|
+
name: "test-delete",
|
|
73
|
+
rate: {
|
|
74
|
+
TAG: "Minutes",
|
|
75
|
+
_0: 2
|
|
76
|
+
},
|
|
77
|
+
payload: "{}"
|
|
78
|
+
});
|
|
79
|
+
ops.deleteSchedule([], "test-delete");
|
|
80
|
+
Globals.jest.advanceTimersByTime(120000);
|
|
81
|
+
globalThis.expect(count.contents).toBe(0);
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
/* Not a pure module */
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
// Fixtures for SideEffectHandler integration tests.
|
|
2
|
+
// Publishes an event to the bus and verifies the side effect execute function is called.
|
|
3
|
+
|
|
4
|
+
open TestFixtures
|
|
5
|
+
|
|
6
|
+
S.enableJson()
|
|
7
|
+
|
|
8
|
+
// ─────────────────────────────────────────────────────────────
|
|
9
|
+
// Isolated bus + Pulumi mock mode
|
|
10
|
+
// ─────────────────────────────────────────────────────────────
|
|
11
|
+
|
|
12
|
+
module Bus = LocalBus.Make()
|
|
13
|
+
let _ = TestRunner.setup()
|
|
14
|
+
|
|
15
|
+
// ─────────────────────────────────────────────────────────────
|
|
16
|
+
// Source event spec
|
|
17
|
+
// ─────────────────────────────────────────────────────────────
|
|
18
|
+
|
|
19
|
+
module TestSEHSource = {
|
|
20
|
+
module Id = Reventless.Id.StringPure
|
|
21
|
+
let name = "TestSEHSource"
|
|
22
|
+
|
|
23
|
+
@schema
|
|
24
|
+
type event = | OrderPlaced({orderId: string})
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// ─────────────────────────────────────────────────────────────
|
|
28
|
+
// Captured state
|
|
29
|
+
// ─────────────────────────────────────────────────────────────
|
|
30
|
+
|
|
31
|
+
// Each entry: (aggregateId, orderId)
|
|
32
|
+
let capturedOrders: ref<array<(string, string)>> = ref([])
|
|
33
|
+
|
|
34
|
+
// ─────────────────────────────────────────────────────────────
|
|
35
|
+
// Side effect implementation
|
|
36
|
+
// ─────────────────────────────────────────────────────────────
|
|
37
|
+
|
|
38
|
+
module TestSideEffect = {
|
|
39
|
+
module Source = TestSEHSource
|
|
40
|
+
let moduleUrl: string = %raw(`import.meta.url`)
|
|
41
|
+
|
|
42
|
+
let execute = async (
|
|
43
|
+
id: TestSEHSource.Id.t,
|
|
44
|
+
_meta: Reventless.Message.meta,
|
|
45
|
+
event: TestSEHSource.event,
|
|
46
|
+
_queryEngine: Reventless.QueryEngine.operations,
|
|
47
|
+
) => {
|
|
48
|
+
switch event {
|
|
49
|
+
| OrderPlaced({orderId}) =>
|
|
50
|
+
capturedOrders := capturedOrders.contents->Array.concat([(id, orderId)])
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// ─────────────────────────────────────────────────────────────
|
|
56
|
+
// EventCollector wiring (core EventCollector_Builder + in-memory adapters)
|
|
57
|
+
// ─────────────────────────────────────────────────────────────
|
|
58
|
+
|
|
59
|
+
module EventCollectorCh = LocalEventCollectorChannel.Make(Bus)
|
|
60
|
+
module SpecificEventCollector = ReventlessCore.EventCollector_Builder.Make(
|
|
61
|
+
LocalRuntimeEnvironment,
|
|
62
|
+
EventCollectorCh,
|
|
63
|
+
)
|
|
64
|
+
module ECRTBuilder = LocalEventCollectorRuntime_Builder.Make(Bus, EventCollectorCh)
|
|
65
|
+
|
|
66
|
+
module SEHBuilder = ReventlessCore.SideEffectHandler_Builder.Make(
|
|
67
|
+
LocalRuntimeEnvironment,
|
|
68
|
+
EventCollectorCh,
|
|
69
|
+
SpecificEventCollector,
|
|
70
|
+
ECRTBuilder,
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
// ─────────────────────────────────────────────────────────────
|
|
74
|
+
// allEventTopics — keyed by Source.name, resource.name = bus topic key
|
|
75
|
+
// ─────────────────────────────────────────────────────────────
|
|
76
|
+
|
|
77
|
+
let topicName = "TestSEHSource"
|
|
78
|
+
let topicResource: ReventlessInfra.Adapter.resource = ReventlessInfra.Adapter.make(
|
|
79
|
+
~name=topicName->Pulumi.Output.make,
|
|
80
|
+
~id=topicName->Pulumi.Output.make,
|
|
81
|
+
~urn=topicName->Pulumi.Output.make,
|
|
82
|
+
~service="memory:InMemory"->Pulumi.Output.make,
|
|
83
|
+
)
|
|
84
|
+
|
|
85
|
+
let allEventTopics: ReventlessInfra.EventTopic.allOutputs = Dict.fromArray([
|
|
86
|
+
("TestSEHSource", {ReventlessInfra.EventTopic.resources: [topicResource]}),
|
|
87
|
+
])
|
|
88
|
+
|
|
89
|
+
// ─────────────────────────────────────────────────────────────
|
|
90
|
+
// Build SideEffectHandler component
|
|
91
|
+
// ─────────────────────────────────────────────────────────────
|
|
92
|
+
|
|
93
|
+
let sideEffects: array<module(Reventless.SideEffect.T)> = [module(TestSideEffect)]
|
|
94
|
+
|
|
95
|
+
let seh = SEHBuilder.make(
|
|
96
|
+
~name="TestSEH",
|
|
97
|
+
~sideEffects,
|
|
98
|
+
~allEventTopics,
|
|
99
|
+
~allCommandTopics=Pulumi.Output.make(Dict.make()),
|
|
100
|
+
~queryEngine=mockQueryEngine,
|
|
101
|
+
~scheduler=mockScheduler,
|
|
102
|
+
~resourceNaming=mockResourceNaming,
|
|
103
|
+
)
|
|
104
|
+
|
|
105
|
+
// ─────────────────────────────────────────────────────────────
|
|
106
|
+
// Test meta
|
|
107
|
+
// ─────────────────────────────────────────────────────────────
|
|
108
|
+
|
|
109
|
+
let testMeta = makeTestMeta(~service="TestSEHSource")
|
|
110
|
+
|
|
111
|
+
// ─────────────────────────────────────────────────────────────
|
|
112
|
+
// Publish helper — emits {id, meta, event} to the bus topic
|
|
113
|
+
// meta.service must match TestSEHSource.name for the callback to route correctly
|
|
114
|
+
// ─────────────────────────────────────────────────────────────
|
|
115
|
+
|
|
116
|
+
let publishOrderPlaced = async (id, orderId) => {
|
|
117
|
+
let eventJson = JSON.Encode.object(
|
|
118
|
+
Dict.fromArray([
|
|
119
|
+
("id", id->JSON.Encode.string),
|
|
120
|
+
("meta", testMeta->S.reverseConvertToJsonOrThrow(Reventless.Message.metaSchema)),
|
|
121
|
+
(
|
|
122
|
+
"event",
|
|
123
|
+
TestSEHSource.OrderPlaced({orderId: orderId})
|
|
124
|
+
->S.reverseConvertToJsonOrThrow(TestSEHSource.eventSchema),
|
|
125
|
+
),
|
|
126
|
+
]),
|
|
127
|
+
)
|
|
128
|
+
await Bus.publishEvent(topicName, "TestSEHSource", testMeta, eventJson)
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
let resetMocks = () => {
|
|
132
|
+
capturedOrders := []
|
|
133
|
+
}
|