@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,73 @@
|
|
|
1
|
+
// Fixtures for CommandGenerator integration tests.
|
|
2
|
+
// Verifies that makeHandler builds a resolver that publishes the correct commandJson.
|
|
3
|
+
|
|
4
|
+
S.enableJson()
|
|
5
|
+
|
|
6
|
+
// Activate Pulumi mock mode (must be called before any Component.make)
|
|
7
|
+
let _ = TestRunner.setup()
|
|
8
|
+
|
|
9
|
+
// ─────────────────────────────────────────────────────────────
|
|
10
|
+
// Aggregate spec (matches the Behavior used in CommandGenerator_Builder.Make)
|
|
11
|
+
// ─────────────────────────────────────────────────────────────
|
|
12
|
+
|
|
13
|
+
module CGSpec = {
|
|
14
|
+
module Id = Reventless.Id.StringPure
|
|
15
|
+
let name = "TestCGAggregate"
|
|
16
|
+
|
|
17
|
+
@schema
|
|
18
|
+
type command = | CreateCGItem({name: string})
|
|
19
|
+
|
|
20
|
+
@schema
|
|
21
|
+
type event = | CGItemCreated({name: string})
|
|
22
|
+
|
|
23
|
+
@schema
|
|
24
|
+
type error = | CGAlreadyExists
|
|
25
|
+
|
|
26
|
+
let moduleUrl: string = %raw(`import.meta.url`)
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// ─────────────────────────────────────────────────────────────
|
|
30
|
+
// Behavior
|
|
31
|
+
// ─────────────────────────────────────────────────────────────
|
|
32
|
+
|
|
33
|
+
module CGBehavior = {
|
|
34
|
+
module Spec = CGSpec
|
|
35
|
+
type state = {name: string}
|
|
36
|
+
|
|
37
|
+
let moduleUrl: string = %raw(`import.meta.url`)
|
|
38
|
+
|
|
39
|
+
let initialState = {name: ""}
|
|
40
|
+
|
|
41
|
+
let evolve = (_state: state, event: CGSpec.event): state =>
|
|
42
|
+
switch event {
|
|
43
|
+
| CGItemCreated({name}) => {name: name}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
let decide = (_state: state, command: CGSpec.command): result<array<CGSpec.event>, CGSpec.error> =>
|
|
47
|
+
switch command {
|
|
48
|
+
| CreateCGItem({name}) => Ok([CGSpec.CGItemCreated({name: name})])
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// ─────────────────────────────────────────────────────────────
|
|
53
|
+
// CommandGenerator builder (in-memory resolvers = no AppSync)
|
|
54
|
+
// ─────────────────────────────────────────────────────────────
|
|
55
|
+
|
|
56
|
+
module CGMaker = ReventlessCore.CommandGenerator_Builder.Make(
|
|
57
|
+
CGSpec,
|
|
58
|
+
LocalCommandGeneratorResolvers,
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
// ─────────────────────────────────────────────────────────────
|
|
62
|
+
// Captured commands
|
|
63
|
+
// ─────────────────────────────────────────────────────────────
|
|
64
|
+
|
|
65
|
+
let capturedCmds: ref<array<Reventless.Message.commandJson>> = ref([])
|
|
66
|
+
|
|
67
|
+
let mockPublish: ReventlessInfra.CommandTopic.publishJsons = async cmds => {
|
|
68
|
+
capturedCmds := capturedCmds.contents->Array.concat(cmds)
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
let resetMocks = () => {
|
|
72
|
+
capturedCmds := []
|
|
73
|
+
}
|
|
@@ -0,0 +1,109 @@
|
|
|
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 TestRunner$ReventlessLocal from "../../../src/test/TestRunner.res.mjs";
|
|
6
|
+
import * as CommandGenerator_Builder$ReventlessCore from "@reventlessdev/reventless-core/src/components/CommandGenerator/CommandGenerator_Builder.res.mjs";
|
|
7
|
+
import * as LocalCommandGeneratorResolvers$ReventlessLocal from "../../../src/adapter/CommandGenerator/LocalCommandGeneratorResolvers.res.mjs";
|
|
8
|
+
|
|
9
|
+
S.enableJson();
|
|
10
|
+
|
|
11
|
+
TestRunner$ReventlessLocal.setup();
|
|
12
|
+
|
|
13
|
+
let name = "TestCGAggregate";
|
|
14
|
+
|
|
15
|
+
let commandSchema = S.schema(s => ({
|
|
16
|
+
TAG: "CreateCGItem",
|
|
17
|
+
name: s.m(S.string)
|
|
18
|
+
}));
|
|
19
|
+
|
|
20
|
+
let eventSchema = S.schema(s => ({
|
|
21
|
+
TAG: "CGItemCreated",
|
|
22
|
+
name: s.m(S.string)
|
|
23
|
+
}));
|
|
24
|
+
|
|
25
|
+
let errorSchema = S.literal("CGAlreadyExists");
|
|
26
|
+
|
|
27
|
+
let moduleUrl = import.meta.url;
|
|
28
|
+
|
|
29
|
+
function commandAuthorization(param) {
|
|
30
|
+
return "AllowAuthenticated";
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
let CGSpec = {
|
|
34
|
+
Id: undefined,
|
|
35
|
+
name: name,
|
|
36
|
+
commandSchema: commandSchema,
|
|
37
|
+
eventSchema: eventSchema,
|
|
38
|
+
errorSchema: errorSchema,
|
|
39
|
+
moduleUrl: moduleUrl,
|
|
40
|
+
commandAuthorization: commandAuthorization
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
let moduleUrl$1 = import.meta.url;
|
|
44
|
+
|
|
45
|
+
function evolve(_state, event) {
|
|
46
|
+
return {
|
|
47
|
+
name: event.name
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function decide(_state, command) {
|
|
52
|
+
return {
|
|
53
|
+
TAG: "Ok",
|
|
54
|
+
_0: [{
|
|
55
|
+
TAG: "CGItemCreated",
|
|
56
|
+
name: command.name
|
|
57
|
+
}]
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
let CGBehavior_initialState = {
|
|
62
|
+
name: ""
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
let CGBehavior = {
|
|
66
|
+
Spec: undefined,
|
|
67
|
+
moduleUrl: moduleUrl$1,
|
|
68
|
+
initialState: CGBehavior_initialState,
|
|
69
|
+
evolve: evolve,
|
|
70
|
+
decide: decide
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
let CGMaker = CommandGenerator_Builder$ReventlessCore.Make({
|
|
74
|
+
Id: {
|
|
75
|
+
schema: Id$Reventless.StringPure.schema,
|
|
76
|
+
make: prim => prim,
|
|
77
|
+
makeFromString: prim => prim,
|
|
78
|
+
toString: prim => prim,
|
|
79
|
+
cmp: Id$Reventless.StringPure.cmp
|
|
80
|
+
},
|
|
81
|
+
name: name,
|
|
82
|
+
eventSchema: eventSchema,
|
|
83
|
+
errorSchema: errorSchema,
|
|
84
|
+
commandSchema: commandSchema,
|
|
85
|
+
moduleUrl: moduleUrl,
|
|
86
|
+
commandAuthorization: commandAuthorization
|
|
87
|
+
})(LocalCommandGeneratorResolvers$ReventlessLocal);
|
|
88
|
+
|
|
89
|
+
let capturedCmds = {
|
|
90
|
+
contents: []
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
async function mockPublish(cmds) {
|
|
94
|
+
capturedCmds.contents = capturedCmds.contents.concat(cmds);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
function resetMocks() {
|
|
98
|
+
capturedCmds.contents = [];
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
export {
|
|
102
|
+
CGSpec,
|
|
103
|
+
CGBehavior,
|
|
104
|
+
CGMaker,
|
|
105
|
+
capturedCmds,
|
|
106
|
+
mockPublish,
|
|
107
|
+
resetMocks,
|
|
108
|
+
}
|
|
109
|
+
/* Not a pure module */
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
// Integration tests for CommandGenerator_Builder (in-memory).
|
|
2
|
+
// Verifies that makeHandler returns a resolver that generates and publishes commands.
|
|
3
|
+
|
|
4
|
+
open JestGlobals
|
|
5
|
+
open CommandGeneratorFixtures
|
|
6
|
+
|
|
7
|
+
describe("CommandGenerator_Builder.Make:", () => {
|
|
8
|
+
let _ = beforeEach(() => resetMocks())
|
|
9
|
+
|
|
10
|
+
describe("makeHandler:", () => {
|
|
11
|
+
testPromise("CreateCGItem payload publishes correct commandJson", async () => {
|
|
12
|
+
// Resolve the handler from the Output wrapper
|
|
13
|
+
let handler = await CGMaker.makeHandler(~publishJsons=mockPublish, ~publishJsonsAndWait=None)->TestRunner.resolve
|
|
14
|
+
|
|
15
|
+
// Build payload: arguments must include id AND the command fields (name).
|
|
16
|
+
// generateCommand stringifies arguments, slices off id (index 0), uses the rest as params.
|
|
17
|
+
let payload: ReventlessCore.CommandGenerator.payload = {
|
|
18
|
+
command: "CreateCGItem",
|
|
19
|
+
arguments: {"id": "item-1", "name": "widget"}->Obj.magic,
|
|
20
|
+
meta: {ip: ["127.0.0.1"], user: "testuser", info: ""},
|
|
21
|
+
identity: Reventless.Identity.anonymous,
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// Call handler — generateCommand is async (awaits publishJsons internally)
|
|
25
|
+
let _ = await handler(payload, ())->Effect.runPromise
|
|
26
|
+
|
|
27
|
+
expect(capturedCmds.contents->Array.length)->toBe(1)
|
|
28
|
+
|
|
29
|
+
let cmd = capturedCmds.contents->Array.getUnsafe(0)
|
|
30
|
+
expect(cmd.id)->toBe("item-1")
|
|
31
|
+
|
|
32
|
+
// commandJson should decode to CreateCGItem({name: "widget"})
|
|
33
|
+
let decoded = cmd.commandJson->S.parseJsonOrThrow(CGSpec.commandSchema)
|
|
34
|
+
expect(decoded)->toEqual(CGSpec.CreateCGItem({name: "widget"}))
|
|
35
|
+
})
|
|
36
|
+
|
|
37
|
+
testPromise("make creates a CommandGenerator component without throwing", async () => {
|
|
38
|
+
let cg = CGMaker.make(~name="test-cg")
|
|
39
|
+
let _ = cg
|
|
40
|
+
expect(true)->toBe(true)
|
|
41
|
+
})
|
|
42
|
+
})
|
|
43
|
+
})
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
// Generated by ReScript, PLEASE EDIT WITH CARE
|
|
2
|
+
|
|
3
|
+
import * as S from "sury/src/S.res.mjs";
|
|
4
|
+
import * as Effect from "effect/Effect";
|
|
5
|
+
import * as Identity$Reventless from "@reventlessdev/reventless-spec/src/types/Identity.res.mjs";
|
|
6
|
+
import * as TestRunner$ReventlessLocal from "../../../src/test/TestRunner.res.mjs";
|
|
7
|
+
import * as CommandGeneratorFixtures$ReventlessLocal from "./CommandGeneratorFixtures.res.mjs";
|
|
8
|
+
|
|
9
|
+
globalThis.describe("CommandGenerator_Builder.Make:", () => {
|
|
10
|
+
globalThis.beforeEach(() => CommandGeneratorFixtures$ReventlessLocal.resetMocks());
|
|
11
|
+
globalThis.describe("makeHandler:", () => {
|
|
12
|
+
globalThis.test("CreateCGItem payload publishes correct commandJson", async () => {
|
|
13
|
+
let handler = await TestRunner$ReventlessLocal.resolve(CommandGeneratorFixtures$ReventlessLocal.CGMaker.makeHandler(CommandGeneratorFixtures$ReventlessLocal.mockPublish, undefined));
|
|
14
|
+
let payload_arguments = {
|
|
15
|
+
id: "item-1",
|
|
16
|
+
name: "widget"
|
|
17
|
+
};
|
|
18
|
+
let payload_meta = {
|
|
19
|
+
ip: ["127.0.0.1"],
|
|
20
|
+
user: "testuser",
|
|
21
|
+
info: ""
|
|
22
|
+
};
|
|
23
|
+
let payload = {
|
|
24
|
+
command: "CreateCGItem",
|
|
25
|
+
arguments: payload_arguments,
|
|
26
|
+
meta: payload_meta,
|
|
27
|
+
identity: Identity$Reventless.anonymous
|
|
28
|
+
};
|
|
29
|
+
await Effect.runPromise(handler(payload, undefined));
|
|
30
|
+
globalThis.expect(CommandGeneratorFixtures$ReventlessLocal.capturedCmds.contents.length).toBe(1);
|
|
31
|
+
let cmd = CommandGeneratorFixtures$ReventlessLocal.capturedCmds.contents[0];
|
|
32
|
+
globalThis.expect(cmd.id).toBe("item-1");
|
|
33
|
+
let decoded = S.parseJsonOrThrow(cmd.commandJson, CommandGeneratorFixtures$ReventlessLocal.CGSpec.commandSchema);
|
|
34
|
+
globalThis.expect(decoded).toEqual({
|
|
35
|
+
TAG: "CreateCGItem",
|
|
36
|
+
name: "widget"
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
globalThis.test("make creates a CommandGenerator component without throwing", async () => {
|
|
40
|
+
CommandGeneratorFixtures$ReventlessLocal.CGMaker.make("test-cg", undefined);
|
|
41
|
+
globalThis.expect(true).toBe(true);
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
/* Not a pure module */
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
// Integration test fixtures for CommandTopic builder (in-memory).
|
|
2
|
+
|
|
3
|
+
module ItemSpec = {
|
|
4
|
+
module Id = Reventless.Id.String
|
|
5
|
+
let name = "TestCommandTopicItem"
|
|
6
|
+
|
|
7
|
+
@schema
|
|
8
|
+
type command = | CreateItem({name: string}) | DeleteItem({id: string})
|
|
9
|
+
|
|
10
|
+
@schema
|
|
11
|
+
type event = | ItemCreated({name: string})
|
|
12
|
+
|
|
13
|
+
@schema
|
|
14
|
+
type error = | AlreadyExists
|
|
15
|
+
|
|
16
|
+
let moduleUrl: string = %raw(`import.meta.url`)
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// ─────────────────────────────────────────────────────────────
|
|
20
|
+
// Bus and Pulumi setup
|
|
21
|
+
// ─────────────────────────────────────────────────────────────
|
|
22
|
+
|
|
23
|
+
module Bus = LocalBus.Make()
|
|
24
|
+
|
|
25
|
+
let _ = TestRunner.setup()
|
|
26
|
+
|
|
27
|
+
// ─────────────────────────────────────────────────────────────
|
|
28
|
+
// Build CommandTopic using in-memory channel
|
|
29
|
+
// ─────────────────────────────────────────────────────────────
|
|
30
|
+
|
|
31
|
+
module CommandTopicMaker = ReventlessCore.CommandTopic_Builder.Make(
|
|
32
|
+
ItemSpec,
|
|
33
|
+
LocalCommandTopicChannel.Make(Bus),
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
let cmdTopic = CommandTopicMaker.make(~name="TestCommandTopic")
|
|
37
|
+
|
|
@@ -0,0 +1,68 @@
|
|
|
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 CommandTopic_Builder$ReventlessCore from "@reventlessdev/reventless-core/src/components/CommandTopic/CommandTopic_Builder.res.mjs";
|
|
8
|
+
import * as LocalCommandTopicChannel$ReventlessLocal from "../../../src/adapter/CommandTopic/LocalCommandTopicChannel.res.mjs";
|
|
9
|
+
|
|
10
|
+
let name = "TestCommandTopicItem";
|
|
11
|
+
|
|
12
|
+
let commandSchema = S.union([
|
|
13
|
+
S.schema(s => ({
|
|
14
|
+
TAG: "CreateItem",
|
|
15
|
+
name: s.m(S.string)
|
|
16
|
+
})),
|
|
17
|
+
S.schema(s => ({
|
|
18
|
+
TAG: "DeleteItem",
|
|
19
|
+
id: s.m(S.string)
|
|
20
|
+
}))
|
|
21
|
+
]);
|
|
22
|
+
|
|
23
|
+
let eventSchema = S.schema(s => ({
|
|
24
|
+
TAG: "ItemCreated",
|
|
25
|
+
name: s.m(S.string)
|
|
26
|
+
}));
|
|
27
|
+
|
|
28
|
+
let errorSchema = S.literal("AlreadyExists");
|
|
29
|
+
|
|
30
|
+
let moduleUrl = import.meta.url;
|
|
31
|
+
|
|
32
|
+
function commandAuthorization(param) {
|
|
33
|
+
return "AllowAuthenticated";
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
let ItemSpec = {
|
|
37
|
+
Id: undefined,
|
|
38
|
+
name: name,
|
|
39
|
+
commandSchema: commandSchema,
|
|
40
|
+
eventSchema: eventSchema,
|
|
41
|
+
errorSchema: errorSchema,
|
|
42
|
+
moduleUrl: moduleUrl,
|
|
43
|
+
commandAuthorization: commandAuthorization
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
let Bus = LocalBus$ReventlessLocal.Make({});
|
|
47
|
+
|
|
48
|
+
TestRunner$ReventlessLocal.setup();
|
|
49
|
+
|
|
50
|
+
let $$let = LocalCommandTopicChannel$ReventlessLocal.Make(Bus);
|
|
51
|
+
|
|
52
|
+
let CommandTopicMaker = CommandTopic_Builder$ReventlessCore.Make({
|
|
53
|
+
Id: Id$Reventless.$$String,
|
|
54
|
+
name: name,
|
|
55
|
+
commandSchema: commandSchema
|
|
56
|
+
})({
|
|
57
|
+
make: $$let.make
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
let cmdTopic = CommandTopicMaker.make("TestCommandTopic", undefined);
|
|
61
|
+
|
|
62
|
+
export {
|
|
63
|
+
ItemSpec,
|
|
64
|
+
Bus,
|
|
65
|
+
CommandTopicMaker,
|
|
66
|
+
cmdTopic,
|
|
67
|
+
}
|
|
68
|
+
/* commandSchema Not a pure module */
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
// Fixtures for CommandTopic.publishJsonsStream tests (Phase I).
|
|
2
|
+
|
|
3
|
+
open TestFixtures
|
|
4
|
+
|
|
5
|
+
module ItemSpec = {
|
|
6
|
+
module Id = Reventless.Id.String
|
|
7
|
+
let name = "StreamCmdItem"
|
|
8
|
+
|
|
9
|
+
@schema
|
|
10
|
+
type command = | CreateItem({name: string}) | DeleteItem({id: string})
|
|
11
|
+
|
|
12
|
+
@schema
|
|
13
|
+
type event = | ItemCreated({name: string})
|
|
14
|
+
|
|
15
|
+
@schema
|
|
16
|
+
type error = | AlreadyExists
|
|
17
|
+
|
|
18
|
+
let moduleUrl: string = %raw(`import.meta.url`)
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
module StreamBus = LocalBus.Make()
|
|
22
|
+
|
|
23
|
+
let _ = TestRunner.setup()
|
|
24
|
+
|
|
25
|
+
module StreamCmdTopicMaker = ReventlessCore.CommandTopic_Builder.Make(
|
|
26
|
+
ItemSpec,
|
|
27
|
+
LocalCommandTopicChannel.Make(StreamBus),
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
let cmdTopic = StreamCmdTopicMaker.make(~name="StreamCmdTopic")
|
|
31
|
+
|
|
32
|
+
// Track dispatched commands per test — reset in beforeEach
|
|
33
|
+
let captured: ref<array<JSON.t>> = ref([])
|
|
34
|
+
|
|
35
|
+
let _ = StreamBus.registerCommandHandler("StreamCmdTopicCmdTopic", async (body, _ctx) => {
|
|
36
|
+
captured := captured.contents->Array.concat([body])
|
|
37
|
+
})
|
|
38
|
+
|
|
39
|
+
let makeJson = (id): Reventless.Message.commandJson => {
|
|
40
|
+
Reventless.Message.id: id,
|
|
41
|
+
meta: testMeta,
|
|
42
|
+
commandJson: ItemSpec.CreateItem({name: id})->ReventlessCore.Message.encode(ItemSpec.commandSchema),
|
|
43
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
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 Message$ReventlessCore from "@reventlessdev/reventless-core/src/Message.res.mjs";
|
|
6
|
+
import * as LocalBus$ReventlessLocal from "../../../src/adapter/LocalBus.res.mjs";
|
|
7
|
+
import * as TestRunner$ReventlessLocal from "../../../src/test/TestRunner.res.mjs";
|
|
8
|
+
import * as TestFixtures$ReventlessLocal from "../../TestFixtures.res.mjs";
|
|
9
|
+
import * as CommandTopic_Builder$ReventlessCore from "@reventlessdev/reventless-core/src/components/CommandTopic/CommandTopic_Builder.res.mjs";
|
|
10
|
+
import * as LocalCommandTopicChannel$ReventlessLocal from "../../../src/adapter/CommandTopic/LocalCommandTopicChannel.res.mjs";
|
|
11
|
+
|
|
12
|
+
let name = "StreamCmdItem";
|
|
13
|
+
|
|
14
|
+
let commandSchema = S.union([
|
|
15
|
+
S.schema(s => ({
|
|
16
|
+
TAG: "CreateItem",
|
|
17
|
+
name: s.m(S.string)
|
|
18
|
+
})),
|
|
19
|
+
S.schema(s => ({
|
|
20
|
+
TAG: "DeleteItem",
|
|
21
|
+
id: s.m(S.string)
|
|
22
|
+
}))
|
|
23
|
+
]);
|
|
24
|
+
|
|
25
|
+
let eventSchema = S.schema(s => ({
|
|
26
|
+
TAG: "ItemCreated",
|
|
27
|
+
name: s.m(S.string)
|
|
28
|
+
}));
|
|
29
|
+
|
|
30
|
+
let errorSchema = S.literal("AlreadyExists");
|
|
31
|
+
|
|
32
|
+
let moduleUrl = import.meta.url;
|
|
33
|
+
|
|
34
|
+
function commandAuthorization(param) {
|
|
35
|
+
return "AllowAuthenticated";
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
let ItemSpec = {
|
|
39
|
+
Id: undefined,
|
|
40
|
+
name: name,
|
|
41
|
+
commandSchema: commandSchema,
|
|
42
|
+
eventSchema: eventSchema,
|
|
43
|
+
errorSchema: errorSchema,
|
|
44
|
+
moduleUrl: moduleUrl,
|
|
45
|
+
commandAuthorization: commandAuthorization
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
let StreamBus = LocalBus$ReventlessLocal.Make({});
|
|
49
|
+
|
|
50
|
+
TestRunner$ReventlessLocal.setup();
|
|
51
|
+
|
|
52
|
+
let $$let = LocalCommandTopicChannel$ReventlessLocal.Make(StreamBus);
|
|
53
|
+
|
|
54
|
+
let StreamCmdTopicMaker = CommandTopic_Builder$ReventlessCore.Make({
|
|
55
|
+
Id: Id$Reventless.$$String,
|
|
56
|
+
name: name,
|
|
57
|
+
commandSchema: commandSchema
|
|
58
|
+
})({
|
|
59
|
+
make: $$let.make
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
let cmdTopic = StreamCmdTopicMaker.make("StreamCmdTopic", undefined);
|
|
63
|
+
|
|
64
|
+
let captured = {
|
|
65
|
+
contents: []
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
StreamBus.registerCommandHandler("StreamCmdTopicCmdTopic", async (body, _ctx) => {
|
|
69
|
+
captured.contents = captured.contents.concat([body]);
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
function makeJson(id) {
|
|
73
|
+
return {
|
|
74
|
+
id: id,
|
|
75
|
+
meta: TestFixtures$ReventlessLocal.testMeta,
|
|
76
|
+
commandJson: Message$ReventlessCore.encode({
|
|
77
|
+
TAG: "CreateItem",
|
|
78
|
+
name: id
|
|
79
|
+
}, commandSchema)
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export {
|
|
84
|
+
ItemSpec,
|
|
85
|
+
StreamBus,
|
|
86
|
+
StreamCmdTopicMaker,
|
|
87
|
+
cmdTopic,
|
|
88
|
+
captured,
|
|
89
|
+
makeJson,
|
|
90
|
+
}
|
|
91
|
+
/* commandSchema Not a pure module */
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
// Tests for CommandTopic.publishJsonsStream (Phase I of effect-stream-integration plan).
|
|
2
|
+
// Verifies that a Stream<commandJson> drives publishing without collecting into an array.
|
|
3
|
+
|
|
4
|
+
open JestGlobals
|
|
5
|
+
open CommandTopicStreamFixtures
|
|
6
|
+
|
|
7
|
+
describe("CommandTopic.publishJsonsStream", () => {
|
|
8
|
+
let _ = beforeAllAsync(async () => {
|
|
9
|
+
let _ = await cmdTopic->ReventlessCore.Component.operations->TestRunner.resolve
|
|
10
|
+
})
|
|
11
|
+
|
|
12
|
+
let _ = beforeEach(() => {
|
|
13
|
+
captured := []
|
|
14
|
+
})
|
|
15
|
+
|
|
16
|
+
testPromise("streams 3 commands to the bus in order", async () => {
|
|
17
|
+
let ops = await cmdTopic->ReventlessCore.Component.operations->TestRunner.resolve
|
|
18
|
+
let stream = [makeJson("cmd-1"), makeJson("cmd-2"), makeJson("cmd-3")]->Stream.fromIterable
|
|
19
|
+
let _ = await ops.publishJsonsStream(stream)->Effect.runPromise
|
|
20
|
+
let _ = await Promise.resolve()
|
|
21
|
+
expect(captured.contents->Array.length)->toBe(3)
|
|
22
|
+
})
|
|
23
|
+
|
|
24
|
+
testPromise("empty stream dispatches nothing", async () => {
|
|
25
|
+
let ops = await cmdTopic->ReventlessCore.Component.operations->TestRunner.resolve
|
|
26
|
+
let _ = await ops.publishJsonsStream(Stream.empty)->Effect.runPromise
|
|
27
|
+
let _ = await Promise.resolve()
|
|
28
|
+
expect(captured.contents->Array.length)->toBe(0)
|
|
29
|
+
})
|
|
30
|
+
})
|
|
@@ -0,0 +1,35 @@
|
|
|
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 CommandTopicStreamFixtures$ReventlessLocal from "./CommandTopicStreamFixtures.res.mjs";
|
|
8
|
+
|
|
9
|
+
globalThis.describe("CommandTopic.publishJsonsStream", () => {
|
|
10
|
+
globalThis.beforeAll(async () => {
|
|
11
|
+
await TestRunner$ReventlessLocal.resolve(Component$ReventlessCore.operations(CommandTopicStreamFixtures$ReventlessLocal.cmdTopic));
|
|
12
|
+
});
|
|
13
|
+
globalThis.beforeEach(() => {
|
|
14
|
+
CommandTopicStreamFixtures$ReventlessLocal.captured.contents = [];
|
|
15
|
+
});
|
|
16
|
+
globalThis.test("streams 3 commands to the bus in order", async () => {
|
|
17
|
+
let ops = await TestRunner$ReventlessLocal.resolve(Component$ReventlessCore.operations(CommandTopicStreamFixtures$ReventlessLocal.cmdTopic));
|
|
18
|
+
let stream = Stream.fromIterable([
|
|
19
|
+
CommandTopicStreamFixtures$ReventlessLocal.makeJson("cmd-1"),
|
|
20
|
+
CommandTopicStreamFixtures$ReventlessLocal.makeJson("cmd-2"),
|
|
21
|
+
CommandTopicStreamFixtures$ReventlessLocal.makeJson("cmd-3")
|
|
22
|
+
]);
|
|
23
|
+
await Effect.runPromise(ops.publishJsonsStream(stream));
|
|
24
|
+
await Promise.resolve();
|
|
25
|
+
globalThis.expect(CommandTopicStreamFixtures$ReventlessLocal.captured.contents.length).toBe(3);
|
|
26
|
+
});
|
|
27
|
+
globalThis.test("empty stream dispatches nothing", async () => {
|
|
28
|
+
let ops = await TestRunner$ReventlessLocal.resolve(Component$ReventlessCore.operations(CommandTopicStreamFixtures$ReventlessLocal.cmdTopic));
|
|
29
|
+
await Effect.runPromise(ops.publishJsonsStream(Stream.empty));
|
|
30
|
+
await Promise.resolve();
|
|
31
|
+
globalThis.expect(CommandTopicStreamFixtures$ReventlessLocal.captured.contents.length).toBe(0);
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
/* Not a pure module */
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
// Integration tests for CommandTopic_Builder with in-memory channel.
|
|
2
|
+
|
|
3
|
+
open TestFixtures
|
|
4
|
+
open JestGlobals
|
|
5
|
+
open CommandTopicFixtures
|
|
6
|
+
|
|
7
|
+
describe("CommandTopic (in-memory)", () => {
|
|
8
|
+
let _ = beforeAllAsync(async () => {
|
|
9
|
+
let _ = await cmdTopic->ReventlessCore.Component.operations->TestRunner.resolve
|
|
10
|
+
})
|
|
11
|
+
|
|
12
|
+
testPromise("publishJsons succeeds without throwing", async () => {
|
|
13
|
+
let ops = await cmdTopic->ReventlessCore.Component.operations->TestRunner.resolve
|
|
14
|
+
let commandJson = ItemSpec.CreateItem({name: "Widget"})->ReventlessCore.Message.encode(ItemSpec.commandSchema)
|
|
15
|
+
let didThrow = ref(false)
|
|
16
|
+
try {
|
|
17
|
+
await ops.publishJsons([{
|
|
18
|
+
Reventless.Message.id: "item-1",
|
|
19
|
+
meta: testMeta,
|
|
20
|
+
commandJson,
|
|
21
|
+
}])
|
|
22
|
+
} catch {
|
|
23
|
+
| _ => didThrow := true
|
|
24
|
+
}
|
|
25
|
+
expect(didThrow.contents)->toBe(false)
|
|
26
|
+
})
|
|
27
|
+
|
|
28
|
+
testPromise("publishJsons with empty array succeeds", async () => {
|
|
29
|
+
let ops = await cmdTopic->ReventlessCore.Component.operations->TestRunner.resolve
|
|
30
|
+
let didThrow = ref(false)
|
|
31
|
+
try {
|
|
32
|
+
await ops.publishJsons([])
|
|
33
|
+
} catch {
|
|
34
|
+
| _ => didThrow := true
|
|
35
|
+
}
|
|
36
|
+
expect(didThrow.contents)->toBe(false)
|
|
37
|
+
})
|
|
38
|
+
|
|
39
|
+
testPromise("publishJsons dispatches to bus channel (TestCommandTopicCmdTopic)", async () => {
|
|
40
|
+
let ops = await cmdTopic->ReventlessCore.Component.operations->TestRunner.resolve
|
|
41
|
+
// Verify the bus receives the command on the expected channel.
|
|
42
|
+
// Channel name = make name ++ ComponentType.toName(CommandTopic) = "TestCommandTopic" ++ "CmdTopic"
|
|
43
|
+
let received: ref<bool> = ref(false)
|
|
44
|
+
Bus.registerCommandHandler("TestCommandTopicCmdTopic", async (_json, _ctx) => {
|
|
45
|
+
received := true
|
|
46
|
+
})
|
|
47
|
+
let commandJson = ItemSpec.DeleteItem({id: "item-99"})->ReventlessCore.Message.encode(ItemSpec.commandSchema)
|
|
48
|
+
await ops.publishJsons([{
|
|
49
|
+
Reventless.Message.id: "item-99",
|
|
50
|
+
meta: testMeta,
|
|
51
|
+
commandJson,
|
|
52
|
+
}])
|
|
53
|
+
expect(received.contents)->toBe(true)
|
|
54
|
+
})
|
|
55
|
+
})
|