@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,53 @@
|
|
|
1
|
+
// Integration tests for EventLog_Builder with in-memory adapters.
|
|
2
|
+
|
|
3
|
+
open JestGlobals
|
|
4
|
+
open EventLogFixtures
|
|
5
|
+
|
|
6
|
+
describe("EventLog (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 stores events and replay returns them", async () => {
|
|
14
|
+
let ops = await eventLog->ReventlessCore.Component.operations->TestRunner.resolve
|
|
15
|
+
let event = ItemEventLogSpec.ItemCreated({name: "Widget"})
|
|
16
|
+
let event' = makeEvent'("item-1", event)
|
|
17
|
+
let _ = await ops.append(0, "item-1", [event'])
|
|
18
|
+
let replayed = await ops.replay("item-1")
|
|
19
|
+
expect(replayed->Array.length)->toBe(1)
|
|
20
|
+
let first = replayed->Array.getUnsafe(0)
|
|
21
|
+
expect(first)->toEqual(event)
|
|
22
|
+
})
|
|
23
|
+
|
|
24
|
+
testPromise("append publishes event to event topic", async () => {
|
|
25
|
+
let ops = await eventLog->ReventlessCore.Component.operations->TestRunner.resolve
|
|
26
|
+
let event' = makeEvent'("pub-1", ItemEventLogSpec.ItemCreated({name: "Widget"}))
|
|
27
|
+
let _ = await ops.append(0, "pub-1", [event'])
|
|
28
|
+
expect(capturedTopicEventCount.contents)->toBe(1)
|
|
29
|
+
})
|
|
30
|
+
|
|
31
|
+
testPromise("replay returns empty array for unknown id", async () => {
|
|
32
|
+
let ops = await eventLog->ReventlessCore.Component.operations->TestRunner.resolve
|
|
33
|
+
let events = await ops.replay("unknown-id")
|
|
34
|
+
expect(events->Array.length)->toBe(0)
|
|
35
|
+
})
|
|
36
|
+
|
|
37
|
+
testPromise("multiple appends accumulate events", async () => {
|
|
38
|
+
let ops = await eventLog->ReventlessCore.Component.operations->TestRunner.resolve
|
|
39
|
+
let _ = await ops.append(0, "agg-1", [makeEvent'("agg-1", ItemEventLogSpec.ItemCreated({name: "First"}))])
|
|
40
|
+
let _ = await ops.append(1, "agg-1", [makeEvent'("agg-1", ItemEventLogSpec.ItemDeleted({id: "agg-1"}))])
|
|
41
|
+
let replayed = await ops.replay("agg-1")
|
|
42
|
+
expect(replayed->Array.length)->toBe(2)
|
|
43
|
+
})
|
|
44
|
+
|
|
45
|
+
testPromise("separate aggregates have independent event logs", async () => {
|
|
46
|
+
let ops = await eventLog->ReventlessCore.Component.operations->TestRunner.resolve
|
|
47
|
+
let _ = await ops.append(0, "agg-A", [makeEvent'("agg-A", ItemEventLogSpec.ItemCreated({name: "A"}))])
|
|
48
|
+
let _ = await ops.append(0, "agg-B", [makeEvent'("agg-B", ItemEventLogSpec.ItemDeleted({id: "B"}))])
|
|
49
|
+
let eventsA = await ops.replay("agg-A")
|
|
50
|
+
let eventsB = await ops.replay("agg-B")
|
|
51
|
+
expect((eventsA->Array.length, eventsB->Array.length))->toEqual((1, 1))
|
|
52
|
+
})
|
|
53
|
+
})
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
// Generated by ReScript, PLEASE EDIT WITH CARE
|
|
2
|
+
|
|
3
|
+
import * as Component$ReventlessCore from "@reventlessdev/reventless-core/src/components/Component.res.mjs";
|
|
4
|
+
import * as TestRunner$ReventlessLocal from "../../../src/test/TestRunner.res.mjs";
|
|
5
|
+
import * as EventLogFixtures$ReventlessLocal from "./EventLogFixtures.res.mjs";
|
|
6
|
+
|
|
7
|
+
globalThis.describe("EventLog (in-memory)", () => {
|
|
8
|
+
globalThis.beforeAll(async () => {
|
|
9
|
+
await TestRunner$ReventlessLocal.resolve(Component$ReventlessCore.operations(EventLogFixtures$ReventlessLocal.eventLog));
|
|
10
|
+
});
|
|
11
|
+
globalThis.beforeEach(() => EventLogFixtures$ReventlessLocal.reset());
|
|
12
|
+
globalThis.test("append stores events and replay returns them", async () => {
|
|
13
|
+
let ops = await TestRunner$ReventlessLocal.resolve(Component$ReventlessCore.operations(EventLogFixtures$ReventlessLocal.eventLog));
|
|
14
|
+
let event = {
|
|
15
|
+
TAG: "ItemCreated",
|
|
16
|
+
name: "Widget"
|
|
17
|
+
};
|
|
18
|
+
let event$p = EventLogFixtures$ReventlessLocal.makeEvent$p("item-1", event);
|
|
19
|
+
await ops.append(0, "item-1", [event$p]);
|
|
20
|
+
let replayed = await ops.replay("item-1");
|
|
21
|
+
globalThis.expect(replayed.length).toBe(1);
|
|
22
|
+
let first = replayed[0];
|
|
23
|
+
globalThis.expect(first).toEqual(event);
|
|
24
|
+
});
|
|
25
|
+
globalThis.test("append publishes event to event topic", async () => {
|
|
26
|
+
let ops = await TestRunner$ReventlessLocal.resolve(Component$ReventlessCore.operations(EventLogFixtures$ReventlessLocal.eventLog));
|
|
27
|
+
let event$p = EventLogFixtures$ReventlessLocal.makeEvent$p("pub-1", {
|
|
28
|
+
TAG: "ItemCreated",
|
|
29
|
+
name: "Widget"
|
|
30
|
+
});
|
|
31
|
+
await ops.append(0, "pub-1", [event$p]);
|
|
32
|
+
globalThis.expect(EventLogFixtures$ReventlessLocal.capturedTopicEventCount.contents).toBe(1);
|
|
33
|
+
});
|
|
34
|
+
globalThis.test("replay returns empty array for unknown id", async () => {
|
|
35
|
+
let ops = await TestRunner$ReventlessLocal.resolve(Component$ReventlessCore.operations(EventLogFixtures$ReventlessLocal.eventLog));
|
|
36
|
+
let events = await ops.replay("unknown-id");
|
|
37
|
+
globalThis.expect(events.length).toBe(0);
|
|
38
|
+
});
|
|
39
|
+
globalThis.test("multiple appends accumulate events", async () => {
|
|
40
|
+
let ops = await TestRunner$ReventlessLocal.resolve(Component$ReventlessCore.operations(EventLogFixtures$ReventlessLocal.eventLog));
|
|
41
|
+
await ops.append(0, "agg-1", [EventLogFixtures$ReventlessLocal.makeEvent$p("agg-1", {
|
|
42
|
+
TAG: "ItemCreated",
|
|
43
|
+
name: "First"
|
|
44
|
+
})]);
|
|
45
|
+
await ops.append(1, "agg-1", [EventLogFixtures$ReventlessLocal.makeEvent$p("agg-1", {
|
|
46
|
+
TAG: "ItemDeleted",
|
|
47
|
+
id: "agg-1"
|
|
48
|
+
})]);
|
|
49
|
+
let replayed = await ops.replay("agg-1");
|
|
50
|
+
globalThis.expect(replayed.length).toBe(2);
|
|
51
|
+
});
|
|
52
|
+
globalThis.test("separate aggregates have independent event logs", async () => {
|
|
53
|
+
let ops = await TestRunner$ReventlessLocal.resolve(Component$ReventlessCore.operations(EventLogFixtures$ReventlessLocal.eventLog));
|
|
54
|
+
await ops.append(0, "agg-A", [EventLogFixtures$ReventlessLocal.makeEvent$p("agg-A", {
|
|
55
|
+
TAG: "ItemCreated",
|
|
56
|
+
name: "A"
|
|
57
|
+
})]);
|
|
58
|
+
await ops.append(0, "agg-B", [EventLogFixtures$ReventlessLocal.makeEvent$p("agg-B", {
|
|
59
|
+
TAG: "ItemDeleted",
|
|
60
|
+
id: "B"
|
|
61
|
+
})]);
|
|
62
|
+
let eventsA = await ops.replay("agg-A");
|
|
63
|
+
let eventsB = await ops.replay("agg-B");
|
|
64
|
+
globalThis.expect([
|
|
65
|
+
eventsA.length,
|
|
66
|
+
eventsB.length
|
|
67
|
+
]).toEqual([
|
|
68
|
+
1,
|
|
69
|
+
1
|
|
70
|
+
]);
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
/* Not a pure module */
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
// Integration test fixtures for EventTopic builder (in-memory).
|
|
2
|
+
|
|
3
|
+
open TestFixtures
|
|
4
|
+
|
|
5
|
+
module ItemEventTopicSpec = {
|
|
6
|
+
module Id = Reventless.Id.StringPure
|
|
7
|
+
let name = "TestItemEventTopic"
|
|
8
|
+
|
|
9
|
+
@schema
|
|
10
|
+
type event = | ItemPublished({name: string}) | ItemRemoved({id: string})
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
// ─────────────────────────────────────────────────────────────
|
|
14
|
+
// Bus and Pulumi setup
|
|
15
|
+
// ─────────────────────────────────────────────────────────────
|
|
16
|
+
|
|
17
|
+
module Bus = LocalBus.Make()
|
|
18
|
+
|
|
19
|
+
// Subscribe before building to capture published events
|
|
20
|
+
let capturedEventCount: ref<int> = ref(0)
|
|
21
|
+
// Topic name in bus = make name ++ ComponentType.toName(EventTopic) = "TestItemEventTopic" ++ "EventTopic"
|
|
22
|
+
let _ = Bus.subscribeToEvents("TestItemEventTopicEventTopic", async (_, _, _) => {
|
|
23
|
+
capturedEventCount := capturedEventCount.contents + 1
|
|
24
|
+
})
|
|
25
|
+
|
|
26
|
+
let _ = TestRunner.setup()
|
|
27
|
+
|
|
28
|
+
// ─────────────────────────────────────────────────────────────
|
|
29
|
+
// Build EventTopic using in-memory publisher
|
|
30
|
+
// ─────────────────────────────────────────────────────────────
|
|
31
|
+
|
|
32
|
+
module EventTopicMaker = ReventlessCore.EventTopic_Builder.Make(
|
|
33
|
+
ItemEventTopicSpec,
|
|
34
|
+
LocalEventTopicPublisher.Make(Bus),
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
let eventTopic = EventTopicMaker.make(~name="TestItemEventTopic", ~storageResources=[])
|
|
38
|
+
|
|
39
|
+
let makeEvent' = (id, event) => ({
|
|
40
|
+
Reventless.Message.id,
|
|
41
|
+
meta: testMeta,
|
|
42
|
+
event,
|
|
43
|
+
}: Reventless.Message.event'<string, ItemEventTopicSpec.event>)
|
|
44
|
+
|
|
45
|
+
let reset = () => {
|
|
46
|
+
capturedEventCount := 0
|
|
47
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
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 EventTopic_Builder$ReventlessCore from "@reventlessdev/reventless-core/src/components/EventTopic/EventTopic_Builder.res.mjs";
|
|
9
|
+
import * as LocalEventTopicPublisher$ReventlessLocal from "../../../src/adapter/EventTopic/LocalEventTopicPublisher.res.mjs";
|
|
10
|
+
|
|
11
|
+
let name = "TestItemEventTopic";
|
|
12
|
+
|
|
13
|
+
let eventSchema = S.union([
|
|
14
|
+
S.schema(s => ({
|
|
15
|
+
TAG: "ItemPublished",
|
|
16
|
+
name: s.m(S.string)
|
|
17
|
+
})),
|
|
18
|
+
S.schema(s => ({
|
|
19
|
+
TAG: "ItemRemoved",
|
|
20
|
+
id: s.m(S.string)
|
|
21
|
+
}))
|
|
22
|
+
]);
|
|
23
|
+
|
|
24
|
+
let ItemEventTopicSpec = {
|
|
25
|
+
Id: undefined,
|
|
26
|
+
name: name,
|
|
27
|
+
eventSchema: eventSchema
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
let Bus = LocalBus$ReventlessLocal.Make({});
|
|
31
|
+
|
|
32
|
+
let capturedEventCount = {
|
|
33
|
+
contents: 0
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
Bus.subscribeToEvents("TestItemEventTopicEventTopic", async (param, param$1, param$2) => {
|
|
37
|
+
capturedEventCount.contents = capturedEventCount.contents + 1 | 0;
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
TestRunner$ReventlessLocal.setup();
|
|
41
|
+
|
|
42
|
+
let EventTopicMaker = EventTopic_Builder$ReventlessCore.Make({
|
|
43
|
+
Id: {
|
|
44
|
+
schema: Id$Reventless.StringPure.schema,
|
|
45
|
+
make: prim => prim,
|
|
46
|
+
makeFromString: prim => prim,
|
|
47
|
+
toString: prim => prim,
|
|
48
|
+
cmp: Id$Reventless.StringPure.cmp
|
|
49
|
+
},
|
|
50
|
+
name: name,
|
|
51
|
+
eventSchema: eventSchema
|
|
52
|
+
})(LocalEventTopicPublisher$ReventlessLocal.Make(Bus));
|
|
53
|
+
|
|
54
|
+
let eventTopic = EventTopicMaker.make("TestItemEventTopic", [], undefined);
|
|
55
|
+
|
|
56
|
+
function makeEvent$p(id, event) {
|
|
57
|
+
return {
|
|
58
|
+
id: id,
|
|
59
|
+
meta: TestFixtures$ReventlessLocal.testMeta,
|
|
60
|
+
event: event
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function reset() {
|
|
65
|
+
capturedEventCount.contents = 0;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export {
|
|
69
|
+
ItemEventTopicSpec,
|
|
70
|
+
Bus,
|
|
71
|
+
capturedEventCount,
|
|
72
|
+
EventTopicMaker,
|
|
73
|
+
eventTopic,
|
|
74
|
+
makeEvent$p,
|
|
75
|
+
reset,
|
|
76
|
+
}
|
|
77
|
+
/* eventSchema Not a pure module */
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
// Fixtures for EventTopic.publishJsonStream tests (Phase I).
|
|
2
|
+
|
|
3
|
+
module ItemStreamSpec = {
|
|
4
|
+
module Id = Reventless.Id.StringPure
|
|
5
|
+
let name = "StreamEvtItem"
|
|
6
|
+
|
|
7
|
+
@schema
|
|
8
|
+
type event = | ItemPublished({name: string}) | ItemRemoved({id: string})
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
module StreamEvtBus = LocalBus.Make()
|
|
12
|
+
|
|
13
|
+
let _ = TestRunner.setup()
|
|
14
|
+
|
|
15
|
+
// Topic name = make name ++ "EventTopic" = "StreamEvtTopic" ++ "EventTopic"
|
|
16
|
+
let received: ref<int> = ref(0)
|
|
17
|
+
let _ = StreamEvtBus.subscribeToEvents("StreamEvtTopicEventTopic", async (_, _, _) => {
|
|
18
|
+
received := received.contents + 1
|
|
19
|
+
})
|
|
20
|
+
|
|
21
|
+
module StreamEvtTopicMaker = ReventlessCore.EventTopic_Builder.Make(
|
|
22
|
+
ItemStreamSpec,
|
|
23
|
+
LocalEventTopicPublisher.Make(StreamEvtBus),
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
let evtTopic = StreamEvtTopicMaker.make(~name="StreamEvtTopic", ~storageResources=[])
|
|
27
|
+
|
|
@@ -0,0 +1,62 @@
|
|
|
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 EventTopic_Builder$ReventlessCore from "@reventlessdev/reventless-core/src/components/EventTopic/EventTopic_Builder.res.mjs";
|
|
8
|
+
import * as LocalEventTopicPublisher$ReventlessLocal from "../../../src/adapter/EventTopic/LocalEventTopicPublisher.res.mjs";
|
|
9
|
+
|
|
10
|
+
let name = "StreamEvtItem";
|
|
11
|
+
|
|
12
|
+
let eventSchema = S.union([
|
|
13
|
+
S.schema(s => ({
|
|
14
|
+
TAG: "ItemPublished",
|
|
15
|
+
name: s.m(S.string)
|
|
16
|
+
})),
|
|
17
|
+
S.schema(s => ({
|
|
18
|
+
TAG: "ItemRemoved",
|
|
19
|
+
id: s.m(S.string)
|
|
20
|
+
}))
|
|
21
|
+
]);
|
|
22
|
+
|
|
23
|
+
let ItemStreamSpec = {
|
|
24
|
+
Id: undefined,
|
|
25
|
+
name: name,
|
|
26
|
+
eventSchema: eventSchema
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
let StreamEvtBus = LocalBus$ReventlessLocal.Make({});
|
|
30
|
+
|
|
31
|
+
TestRunner$ReventlessLocal.setup();
|
|
32
|
+
|
|
33
|
+
let received = {
|
|
34
|
+
contents: 0
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
StreamEvtBus.subscribeToEvents("StreamEvtTopicEventTopic", async (param, param$1, param$2) => {
|
|
38
|
+
received.contents = received.contents + 1 | 0;
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
let StreamEvtTopicMaker = EventTopic_Builder$ReventlessCore.Make({
|
|
42
|
+
Id: {
|
|
43
|
+
schema: Id$Reventless.StringPure.schema,
|
|
44
|
+
make: prim => prim,
|
|
45
|
+
makeFromString: prim => prim,
|
|
46
|
+
toString: prim => prim,
|
|
47
|
+
cmp: Id$Reventless.StringPure.cmp
|
|
48
|
+
},
|
|
49
|
+
name: name,
|
|
50
|
+
eventSchema: eventSchema
|
|
51
|
+
})(LocalEventTopicPublisher$ReventlessLocal.Make(StreamEvtBus));
|
|
52
|
+
|
|
53
|
+
let evtTopic = StreamEvtTopicMaker.make("StreamEvtTopic", [], undefined);
|
|
54
|
+
|
|
55
|
+
export {
|
|
56
|
+
ItemStreamSpec,
|
|
57
|
+
StreamEvtBus,
|
|
58
|
+
received,
|
|
59
|
+
StreamEvtTopicMaker,
|
|
60
|
+
evtTopic,
|
|
61
|
+
}
|
|
62
|
+
/* eventSchema Not a pure module */
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
// Tests for EventTopic.publishJsonStream (Phase I of effect-stream-integration plan).
|
|
2
|
+
// Verifies that a Stream<publishJsonStreamItem> drives publishing without collecting into an array.
|
|
3
|
+
|
|
4
|
+
open TestFixtures
|
|
5
|
+
open JestGlobals
|
|
6
|
+
open EventTopicStreamFixtures
|
|
7
|
+
|
|
8
|
+
describe("EventTopic.publishJsonStream", () => {
|
|
9
|
+
let _ = beforeAllAsync(async () => {
|
|
10
|
+
let _ = await evtTopic->ReventlessCore.Component.operations->TestRunner.resolve
|
|
11
|
+
})
|
|
12
|
+
|
|
13
|
+
let _ = beforeEach(() => {
|
|
14
|
+
received := 0
|
|
15
|
+
})
|
|
16
|
+
|
|
17
|
+
testPromise("streams 2 events to all subscribers", async () => {
|
|
18
|
+
let ops = await evtTopic->ReventlessCore.Component.operations->TestRunner.resolve
|
|
19
|
+
let stream = [
|
|
20
|
+
({service: "svc", meta: testMeta, json: JSON.parseOrThrow("{\"ev\":1}")}: ReventlessInfra.EventTopic.publishJsonStreamItem),
|
|
21
|
+
{service: "svc", meta: testMeta, json: JSON.parseOrThrow("{\"ev\":2}")},
|
|
22
|
+
]->Stream.fromIterable
|
|
23
|
+
let _ = await ops.publishJsonStream(stream)->Effect.runPromise
|
|
24
|
+
let _ = await Promise.resolve()
|
|
25
|
+
let _ = await Promise.resolve()
|
|
26
|
+
expect(received.contents)->toBe(2)
|
|
27
|
+
})
|
|
28
|
+
|
|
29
|
+
testPromise("empty stream publishes nothing to subscribers", async () => {
|
|
30
|
+
let ops = await evtTopic->ReventlessCore.Component.operations->TestRunner.resolve
|
|
31
|
+
let _ = await ops.publishJsonStream(Stream.empty)->Effect.runPromise
|
|
32
|
+
let _ = await Promise.resolve()
|
|
33
|
+
expect(received.contents)->toBe(0)
|
|
34
|
+
})
|
|
35
|
+
})
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
// Generated by ReScript, PLEASE EDIT WITH CARE
|
|
2
|
+
|
|
3
|
+
import * as Effect from "effect/Effect";
|
|
4
|
+
import * as Stream from "effect/Stream";
|
|
5
|
+
import * as Component$ReventlessCore from "@reventlessdev/reventless-core/src/components/Component.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 EventTopicStreamFixtures$ReventlessLocal from "./EventTopicStreamFixtures.res.mjs";
|
|
9
|
+
|
|
10
|
+
globalThis.describe("EventTopic.publishJsonStream", () => {
|
|
11
|
+
globalThis.beforeAll(async () => {
|
|
12
|
+
await TestRunner$ReventlessLocal.resolve(Component$ReventlessCore.operations(EventTopicStreamFixtures$ReventlessLocal.evtTopic));
|
|
13
|
+
});
|
|
14
|
+
globalThis.beforeEach(() => {
|
|
15
|
+
EventTopicStreamFixtures$ReventlessLocal.received.contents = 0;
|
|
16
|
+
});
|
|
17
|
+
globalThis.test("streams 2 events to all subscribers", async () => {
|
|
18
|
+
let ops = await TestRunner$ReventlessLocal.resolve(Component$ReventlessCore.operations(EventTopicStreamFixtures$ReventlessLocal.evtTopic));
|
|
19
|
+
let stream = Stream.fromIterable([
|
|
20
|
+
{
|
|
21
|
+
service: "svc",
|
|
22
|
+
meta: TestFixtures$ReventlessLocal.testMeta,
|
|
23
|
+
json: JSON.parse("{\"ev\":1}")
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
service: "svc",
|
|
27
|
+
meta: TestFixtures$ReventlessLocal.testMeta,
|
|
28
|
+
json: JSON.parse("{\"ev\":2}")
|
|
29
|
+
}
|
|
30
|
+
]);
|
|
31
|
+
await Effect.runPromise(ops.publishJsonStream(stream));
|
|
32
|
+
await Promise.resolve();
|
|
33
|
+
await Promise.resolve();
|
|
34
|
+
globalThis.expect(EventTopicStreamFixtures$ReventlessLocal.received.contents).toBe(2);
|
|
35
|
+
});
|
|
36
|
+
globalThis.test("empty stream publishes nothing to subscribers", async () => {
|
|
37
|
+
let ops = await TestRunner$ReventlessLocal.resolve(Component$ReventlessCore.operations(EventTopicStreamFixtures$ReventlessLocal.evtTopic));
|
|
38
|
+
await Effect.runPromise(ops.publishJsonStream(Stream.empty));
|
|
39
|
+
await Promise.resolve();
|
|
40
|
+
globalThis.expect(EventTopicStreamFixtures$ReventlessLocal.received.contents).toBe(0);
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
/* Not a pure module */
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
// Integration tests for EventTopic_Builder with in-memory publisher.
|
|
2
|
+
|
|
3
|
+
open JestGlobals
|
|
4
|
+
open EventTopicFixtures
|
|
5
|
+
|
|
6
|
+
describe("EventTopic (in-memory)", () => {
|
|
7
|
+
let _ = beforeAllAsync(async () => {
|
|
8
|
+
let _ = await eventTopic->ReventlessCore.Component.operations->TestRunner.resolve
|
|
9
|
+
})
|
|
10
|
+
|
|
11
|
+
let _ = beforeEach(() => reset())
|
|
12
|
+
|
|
13
|
+
testPromise("publish sends event to bus subscribers", async () => {
|
|
14
|
+
let ops = await eventTopic->ReventlessCore.Component.operations->TestRunner.resolve
|
|
15
|
+
let event' = makeEvent'("item-1", ItemEventTopicSpec.ItemPublished({name: "Widget"}))
|
|
16
|
+
await ops.publish([event'])
|
|
17
|
+
expect(capturedEventCount.contents)->toBe(1)
|
|
18
|
+
})
|
|
19
|
+
|
|
20
|
+
testPromise("publish multiple events notifies subscribers for each", async () => {
|
|
21
|
+
let ops = await eventTopic->ReventlessCore.Component.operations->TestRunner.resolve
|
|
22
|
+
let events = [
|
|
23
|
+
makeEvent'("item-1", ItemEventTopicSpec.ItemPublished({name: "Widget"})),
|
|
24
|
+
makeEvent'("item-2", ItemEventTopicSpec.ItemRemoved({id: "item-2"})),
|
|
25
|
+
]
|
|
26
|
+
await ops.publish(events)
|
|
27
|
+
expect(capturedEventCount.contents)->toBe(2)
|
|
28
|
+
})
|
|
29
|
+
|
|
30
|
+
testPromise("publish empty array does not notify subscribers", async () => {
|
|
31
|
+
let ops = await eventTopic->ReventlessCore.Component.operations->TestRunner.resolve
|
|
32
|
+
await ops.publish([])
|
|
33
|
+
expect(capturedEventCount.contents)->toBe(0)
|
|
34
|
+
})
|
|
35
|
+
})
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
// Generated by ReScript, PLEASE EDIT WITH CARE
|
|
2
|
+
|
|
3
|
+
import * as Component$ReventlessCore from "@reventlessdev/reventless-core/src/components/Component.res.mjs";
|
|
4
|
+
import * as TestRunner$ReventlessLocal from "../../../src/test/TestRunner.res.mjs";
|
|
5
|
+
import * as EventTopicFixtures$ReventlessLocal from "./EventTopicFixtures.res.mjs";
|
|
6
|
+
|
|
7
|
+
globalThis.describe("EventTopic (in-memory)", () => {
|
|
8
|
+
globalThis.beforeAll(async () => {
|
|
9
|
+
await TestRunner$ReventlessLocal.resolve(Component$ReventlessCore.operations(EventTopicFixtures$ReventlessLocal.eventTopic));
|
|
10
|
+
});
|
|
11
|
+
globalThis.beforeEach(() => EventTopicFixtures$ReventlessLocal.reset());
|
|
12
|
+
globalThis.test("publish sends event to bus subscribers", async () => {
|
|
13
|
+
let ops = await TestRunner$ReventlessLocal.resolve(Component$ReventlessCore.operations(EventTopicFixtures$ReventlessLocal.eventTopic));
|
|
14
|
+
let event$p = EventTopicFixtures$ReventlessLocal.makeEvent$p("item-1", {
|
|
15
|
+
TAG: "ItemPublished",
|
|
16
|
+
name: "Widget"
|
|
17
|
+
});
|
|
18
|
+
await ops.publish([event$p]);
|
|
19
|
+
globalThis.expect(EventTopicFixtures$ReventlessLocal.capturedEventCount.contents).toBe(1);
|
|
20
|
+
});
|
|
21
|
+
globalThis.test("publish multiple events notifies subscribers for each", async () => {
|
|
22
|
+
let ops = await TestRunner$ReventlessLocal.resolve(Component$ReventlessCore.operations(EventTopicFixtures$ReventlessLocal.eventTopic));
|
|
23
|
+
let events = [
|
|
24
|
+
EventTopicFixtures$ReventlessLocal.makeEvent$p("item-1", {
|
|
25
|
+
TAG: "ItemPublished",
|
|
26
|
+
name: "Widget"
|
|
27
|
+
}),
|
|
28
|
+
EventTopicFixtures$ReventlessLocal.makeEvent$p("item-2", {
|
|
29
|
+
TAG: "ItemRemoved",
|
|
30
|
+
id: "item-2"
|
|
31
|
+
})
|
|
32
|
+
];
|
|
33
|
+
await ops.publish(events);
|
|
34
|
+
globalThis.expect(EventTopicFixtures$ReventlessLocal.capturedEventCount.contents).toBe(2);
|
|
35
|
+
});
|
|
36
|
+
globalThis.test("publish empty array does not notify subscribers", async () => {
|
|
37
|
+
let ops = await TestRunner$ReventlessLocal.resolve(Component$ReventlessCore.operations(EventTopicFixtures$ReventlessLocal.eventTopic));
|
|
38
|
+
await ops.publish([]);
|
|
39
|
+
globalThis.expect(EventTopicFixtures$ReventlessLocal.capturedEventCount.contents).toBe(0);
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
/* Not a pure module */
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
// Fixtures for ExtensionPoint integration tests.
|
|
2
|
+
// Verifies that dispatching a command to the EP channel calls publishToAggregates.
|
|
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
|
+
// ExtensionPoint spec
|
|
17
|
+
// EP CommandTopic channel = Spec.name ++ "ExtPoint" ++ "CmdTopic" = "TestEPExtPointCmdTopic"
|
|
18
|
+
// ─────────────────────────────────────────────────────────────
|
|
19
|
+
|
|
20
|
+
module TestEPSpec = {
|
|
21
|
+
let name = "TestEP"
|
|
22
|
+
|
|
23
|
+
@schema
|
|
24
|
+
type command = | Forward({targetId: string})
|
|
25
|
+
|
|
26
|
+
@schema
|
|
27
|
+
type event = | TEPNoEvent // unused — mapOutgoingEvent = None
|
|
28
|
+
|
|
29
|
+
@schema
|
|
30
|
+
type directive = | TEPNoDirective // unused — mapIncomingCommand only uses PublishCommand
|
|
31
|
+
|
|
32
|
+
let moduleUrl: string = %raw(`import.meta.url`)
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// ─────────────────────────────────────────────────────────────
|
|
36
|
+
// Target aggregate spec (receives forwarded commands)
|
|
37
|
+
// ─────────────────────────────────────────────────────────────
|
|
38
|
+
|
|
39
|
+
module DelegateAggSpec = {
|
|
40
|
+
module Id = Reventless.Id.StringPure
|
|
41
|
+
let name = "TargetAgg"
|
|
42
|
+
|
|
43
|
+
@schema
|
|
44
|
+
type command = | Execute({targetId: string})
|
|
45
|
+
|
|
46
|
+
@schema
|
|
47
|
+
type event = | Executed({targetId: string}) // unused but required by Aggregate.Spec
|
|
48
|
+
|
|
49
|
+
@schema
|
|
50
|
+
type error = | TEAggNoError // unused but required by Aggregate.Spec
|
|
51
|
+
|
|
52
|
+
let moduleUrl: string = %raw(`import.meta.url`)
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// ─────────────────────────────────────────────────────────────
|
|
56
|
+
// Mapping: Forward → Execute
|
|
57
|
+
// ─────────────────────────────────────────────────────────────
|
|
58
|
+
|
|
59
|
+
module ForwardMapping = {
|
|
60
|
+
module ExtensionPoint = TestEPSpec
|
|
61
|
+
module Delegate = DelegateAggSpec
|
|
62
|
+
|
|
63
|
+
let moduleUrl = "test:ExtensionPointFixtures:ForwardMapping"
|
|
64
|
+
|
|
65
|
+
let mapIncomingCommand = (
|
|
66
|
+
_id: string,
|
|
67
|
+
cmd: TestEPSpec.command,
|
|
68
|
+
_meta: Reventless.Message.meta,
|
|
69
|
+
): array<ReventlessInfra.ExtensionPointMapping.commandAction<DelegateAggSpec.command, TestEPSpec.directive>> =>
|
|
70
|
+
switch cmd {
|
|
71
|
+
| Forward({targetId}) =>
|
|
72
|
+
let execCmd = DelegateAggSpec.Execute({targetId: targetId})
|
|
73
|
+
[ReventlessInfra.ExtensionPointMapping.PublishCommand(targetId, execCmd)]
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
let mapOutgoingEvent: option<
|
|
77
|
+
ReventlessInfra.ExtensionPointMapping.mapOutgoingEvent<
|
|
78
|
+
DelegateAggSpec.event,
|
|
79
|
+
TestEPSpec.event,
|
|
80
|
+
TestEPSpec.directive,
|
|
81
|
+
>,
|
|
82
|
+
> = None
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// ─────────────────────────────────────────────────────────────
|
|
86
|
+
// Pre-compiled mapping (Spec + Impl → T)
|
|
87
|
+
// ─────────────────────────────────────────────────────────────
|
|
88
|
+
|
|
89
|
+
module TestEPMapping1 = ReventlessInfra.ExtensionPointMapping.Make(ForwardMapping)
|
|
90
|
+
|
|
91
|
+
// ─────────────────────────────────────────────────────────────
|
|
92
|
+
// Mappings collection satisfying ExtensionPoint.Mappings
|
|
93
|
+
// ─────────────────────────────────────────────────────────────
|
|
94
|
+
|
|
95
|
+
module TestEPMappings = {
|
|
96
|
+
module Spec = TestEPSpec
|
|
97
|
+
module type Mapping = ReventlessInfra.ExtensionPointMapping.T with module ExtensionPoint := TestEPSpec
|
|
98
|
+
let name = "TestEPMappings"
|
|
99
|
+
let moduleUrl: string = %raw(`import.meta.url`)
|
|
100
|
+
let mappings: array<module(Mapping)> = [module(TestEPMapping1)]
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// ─────────────────────────────────────────────────────────────
|
|
104
|
+
// In-memory ExtensionPoint builder
|
|
105
|
+
// ─────────────────────────────────────────────────────────────
|
|
106
|
+
|
|
107
|
+
module EPBuilderWithBus = ExtensionPoint_Builder.Make(Bus)
|
|
108
|
+
module TestEP = EPBuilderWithBus.Make(TestEPSpec, TestEPMappings)
|
|
109
|
+
|
|
110
|
+
// ─────────────────────────────────────────────────────────────
|
|
111
|
+
// Captured state
|
|
112
|
+
// ─────────────────────────────────────────────────────────────
|
|
113
|
+
|
|
114
|
+
let capturedCmds: ref<array<Reventless.Message.commandJson>> = ref([])
|
|
115
|
+
|
|
116
|
+
// ─────────────────────────────────────────────────────────────
|
|
117
|
+
// Mock infrastructure
|
|
118
|
+
// ─────────────────────────────────────────────────────────────
|
|
119
|
+
|
|
120
|
+
let mockPublishFn: ReventlessInfra.CommandTopic.publishJsons = async cmds => {
|
|
121
|
+
capturedCmds := capturedCmds.contents->Array.concat(cmds)
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// ─────────────────────────────────────────────────────────────
|
|
125
|
+
// Build ExtensionPoint component
|
|
126
|
+
// ─────────────────────────────────────────────────────────────
|
|
127
|
+
|
|
128
|
+
let ep = TestEP.make(
|
|
129
|
+
~aggregateResources=Dict.fromArray([("TargetAgg", [])]),
|
|
130
|
+
~publishToAggregates=Dict.fromArray([("TargetAgg", mockPublishFn)]),
|
|
131
|
+
~scheduler=mockScheduler,
|
|
132
|
+
~queryEngine=mockQueryEngine,
|
|
133
|
+
~resourceNaming=mockResourceNaming,
|
|
134
|
+
~opts=None,
|
|
135
|
+
)
|
|
136
|
+
|
|
137
|
+
// ─────────────────────────────────────────────────────────────
|
|
138
|
+
// Test meta + helpers
|
|
139
|
+
// ─────────────────────────────────────────────────────────────
|
|
140
|
+
|
|
141
|
+
let testMeta = makeTestMeta(~service="TestEP")
|
|
142
|
+
|
|
143
|
+
let resetMocks = () => {
|
|
144
|
+
capturedCmds := []
|
|
145
|
+
}
|