@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,126 @@
|
|
|
1
|
+
// Generated by ReScript, PLEASE EDIT WITH CARE
|
|
2
|
+
|
|
3
|
+
import * as Stream from "@reventlessdev/rescript-effect/src/Stream.res.mjs";
|
|
4
|
+
import * as Effect from "effect/Effect";
|
|
5
|
+
import * as LocalBus$ReventlessLocal from "../../src/adapter/LocalBus.res.mjs";
|
|
6
|
+
import * as TestRunner$ReventlessLocal from "../../src/test/TestRunner.res.mjs";
|
|
7
|
+
import * as SqliteDriver$ReventlessLocal from "../../src/adapter/SqliteDriver.res.mjs";
|
|
8
|
+
import * as QueryDbStorage_Sqlite$ReventlessLocal from "../../src/adapter/QueryDb/QueryDbStorage_Sqlite.res.mjs";
|
|
9
|
+
|
|
10
|
+
TestRunner$ReventlessLocal.setup();
|
|
11
|
+
|
|
12
|
+
let opts = {};
|
|
13
|
+
|
|
14
|
+
function makeFreshDb() {
|
|
15
|
+
return SqliteDriver$ReventlessLocal.openDb(":memory:");
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
globalThis.describe("QueryDbStorage_Sqlite", () => {
|
|
19
|
+
globalThis.test("save then loadStream round-trips an item", async () => {
|
|
20
|
+
let TestBus = LocalBus$ReventlessLocal.Make({});
|
|
21
|
+
let db = SqliteDriver$ReventlessLocal.openDb(":memory:");
|
|
22
|
+
let DbProvider = {
|
|
23
|
+
db: db
|
|
24
|
+
};
|
|
25
|
+
let Storage = QueryDbStorage_Sqlite$ReventlessLocal.Make(TestBus)(DbProvider);
|
|
26
|
+
let s = Storage.make("rm1", [], undefined, undefined, undefined, undefined, opts);
|
|
27
|
+
let ops = await TestRunner$ReventlessLocal.resolve(s.operations);
|
|
28
|
+
await ops.save("id1", "value1", "Any", undefined);
|
|
29
|
+
let items = await Effect.runPromise(Effect.catchAll(Stream.runCollect(ops.loadStream("id1")), param => Effect.succeed([])));
|
|
30
|
+
globalThis.expect(items.length).toBe(1);
|
|
31
|
+
globalThis.expect(items[0]).toEqual("value1");
|
|
32
|
+
});
|
|
33
|
+
globalThis.test("save overwrites existing item at same (id, subKey)", async () => {
|
|
34
|
+
let TestBus = LocalBus$ReventlessLocal.Make({});
|
|
35
|
+
let db = SqliteDriver$ReventlessLocal.openDb(":memory:");
|
|
36
|
+
let DbProvider = {
|
|
37
|
+
db: db
|
|
38
|
+
};
|
|
39
|
+
let Storage = QueryDbStorage_Sqlite$ReventlessLocal.Make(TestBus)(DbProvider);
|
|
40
|
+
let s = Storage.make("rm2", [], undefined, undefined, undefined, undefined, opts);
|
|
41
|
+
let ops = await TestRunner$ReventlessLocal.resolve(s.operations);
|
|
42
|
+
await ops.save("k", "a", "Any", undefined);
|
|
43
|
+
await ops.save("k", "b", "Any", undefined);
|
|
44
|
+
let items = await Effect.runPromise(Effect.catchAll(Stream.runCollect(ops.loadStream("k")), param => Effect.succeed([])));
|
|
45
|
+
globalThis.expect(items.length).toBe(1);
|
|
46
|
+
globalThis.expect(items[0]).toEqual("b");
|
|
47
|
+
});
|
|
48
|
+
globalThis.test("saveBatch atomically writes several items", async () => {
|
|
49
|
+
let TestBus = LocalBus$ReventlessLocal.Make({});
|
|
50
|
+
let db = SqliteDriver$ReventlessLocal.openDb(":memory:");
|
|
51
|
+
let DbProvider = {
|
|
52
|
+
db: db
|
|
53
|
+
};
|
|
54
|
+
let Storage = QueryDbStorage_Sqlite$ReventlessLocal.Make(TestBus)(DbProvider);
|
|
55
|
+
let s = Storage.make("rm3", [], undefined, undefined, undefined, undefined, opts);
|
|
56
|
+
let ops = await TestRunner$ReventlessLocal.resolve(s.operations);
|
|
57
|
+
await ops.saveBatch([
|
|
58
|
+
[
|
|
59
|
+
"id1",
|
|
60
|
+
"one",
|
|
61
|
+
undefined
|
|
62
|
+
],
|
|
63
|
+
[
|
|
64
|
+
"id2",
|
|
65
|
+
"two",
|
|
66
|
+
undefined
|
|
67
|
+
],
|
|
68
|
+
[
|
|
69
|
+
"id3",
|
|
70
|
+
"three",
|
|
71
|
+
undefined
|
|
72
|
+
]
|
|
73
|
+
]);
|
|
74
|
+
let items1 = await Effect.runPromise(Effect.catchAll(Stream.runCollect(ops.loadStream("id1")), param => Effect.succeed([])));
|
|
75
|
+
let items2 = await Effect.runPromise(Effect.catchAll(Stream.runCollect(ops.loadStream("id2")), param => Effect.succeed([])));
|
|
76
|
+
let items3 = await Effect.runPromise(Effect.catchAll(Stream.runCollect(ops.loadStream("id3")), param => Effect.succeed([])));
|
|
77
|
+
globalThis.expect(items1.length).toBe(1);
|
|
78
|
+
globalThis.expect(items2.length).toBe(1);
|
|
79
|
+
globalThis.expect(items3.length).toBe(1);
|
|
80
|
+
});
|
|
81
|
+
globalThis.test("delete removes an item from a partition", async () => {
|
|
82
|
+
let TestBus = LocalBus$ReventlessLocal.Make({});
|
|
83
|
+
let db = SqliteDriver$ReventlessLocal.openDb(":memory:");
|
|
84
|
+
let DbProvider = {
|
|
85
|
+
db: db
|
|
86
|
+
};
|
|
87
|
+
let Storage = QueryDbStorage_Sqlite$ReventlessLocal.Make(TestBus)(DbProvider);
|
|
88
|
+
let s = Storage.make("rm4", [], undefined, undefined, undefined, undefined, opts);
|
|
89
|
+
let ops = await TestRunner$ReventlessLocal.resolve(s.operations);
|
|
90
|
+
await ops.save("k", "a", "Any", undefined);
|
|
91
|
+
await ops.delete("k", undefined);
|
|
92
|
+
let items = await Effect.runPromise(Effect.catchAll(Stream.runCollect(ops.loadStream("k")), param => Effect.succeed([])));
|
|
93
|
+
globalThis.expect(items.length).toBe(0);
|
|
94
|
+
});
|
|
95
|
+
globalThis.test("items persist across a file reopen", async () => {
|
|
96
|
+
let path = `/tmp/reventless-test-qdb-` + Date.now().toString() + `.db`;
|
|
97
|
+
let TestBus = LocalBus$ReventlessLocal.Make({});
|
|
98
|
+
let db = SqliteDriver$ReventlessLocal.openDb(path);
|
|
99
|
+
let DbProvider = {
|
|
100
|
+
db: db
|
|
101
|
+
};
|
|
102
|
+
let Storage = QueryDbStorage_Sqlite$ReventlessLocal.Make(TestBus)(DbProvider);
|
|
103
|
+
let s = Storage.make("persist", [], undefined, undefined, undefined, undefined, opts);
|
|
104
|
+
let ops = await TestRunner$ReventlessLocal.resolve(s.operations);
|
|
105
|
+
await ops.save("k", "hello", "Any", undefined);
|
|
106
|
+
SqliteDriver$ReventlessLocal.close(db);
|
|
107
|
+
let TestBus2 = LocalBus$ReventlessLocal.Make({});
|
|
108
|
+
let db$1 = SqliteDriver$ReventlessLocal.openDb(path);
|
|
109
|
+
let DbProvider2 = {
|
|
110
|
+
db: db$1
|
|
111
|
+
};
|
|
112
|
+
let Storage2 = QueryDbStorage_Sqlite$ReventlessLocal.Make(TestBus2)(DbProvider2);
|
|
113
|
+
let s2 = Storage2.make("persist", [], undefined, undefined, undefined, undefined, opts);
|
|
114
|
+
let ops2 = await TestRunner$ReventlessLocal.resolve(s2.operations);
|
|
115
|
+
let items = await Effect.runPromise(Effect.catchAll(Stream.runCollect(ops2.loadStream("k")), param => Effect.succeed([])));
|
|
116
|
+
globalThis.expect(items.length).toBe(1);
|
|
117
|
+
globalThis.expect(items[0]).toEqual("hello");
|
|
118
|
+
return SqliteDriver$ReventlessLocal.close(db$1);
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
export {
|
|
123
|
+
opts,
|
|
124
|
+
makeFreshDb,
|
|
125
|
+
}
|
|
126
|
+
/* Not a pure module */
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
// Unit tests for QueryDbStorage_InMemory.
|
|
2
|
+
// Covers save, loadStream, saveBatch, count, delete, deleteBatch, and scan registration.
|
|
3
|
+
|
|
4
|
+
open JestGlobals
|
|
5
|
+
|
|
6
|
+
let _ = TestRunner.setup()
|
|
7
|
+
|
|
8
|
+
let opts: Pulumi.CustomResourceOptions.t = {}
|
|
9
|
+
|
|
10
|
+
describe("QueryDbStorage_InMemory", () => {
|
|
11
|
+
describe("save and load", () => {
|
|
12
|
+
testPromise("save stores state; loadStream retrieves it by id", async () => {
|
|
13
|
+
module TestBus = LocalBus.Make()
|
|
14
|
+
module Storage = QueryDbStorage_InMemory.Make(TestBus)
|
|
15
|
+
let s = Storage.make(~name="rm1", ~indexes=[], ~api=(), ~apiRole=(), ~opts)
|
|
16
|
+
let ops = await s.operations->TestRunner.resolve
|
|
17
|
+
let _ = await ops.save("id1", JSON.Encode.string("value1"), ReventlessCore.QueryDb.Any, None)
|
|
18
|
+
let items =
|
|
19
|
+
await ops.loadStream("id1")
|
|
20
|
+
->Stream.runCollect
|
|
21
|
+
->Effect.catchAll(_ => Effect.succeed([]))
|
|
22
|
+
->Effect.runPromise
|
|
23
|
+
expect(items->Array.length)->toBe(1)
|
|
24
|
+
expect(items->Array.getUnsafe(0))->toEqual(JSON.Encode.string("value1"))
|
|
25
|
+
})
|
|
26
|
+
|
|
27
|
+
testPromise("loadStream returns empty for unknown id", async () => {
|
|
28
|
+
module TestBus = LocalBus.Make()
|
|
29
|
+
module Storage = QueryDbStorage_InMemory.Make(TestBus)
|
|
30
|
+
let s = Storage.make(~name="rm2", ~indexes=[], ~api=(), ~apiRole=(), ~opts)
|
|
31
|
+
let ops = await s.operations->TestRunner.resolve
|
|
32
|
+
let items =
|
|
33
|
+
await ops.loadStream("unknown")
|
|
34
|
+
->Stream.runCollect
|
|
35
|
+
->Effect.catchAll(_ => Effect.succeed([]))
|
|
36
|
+
->Effect.runPromise
|
|
37
|
+
expect(items->Array.length)->toBe(0)
|
|
38
|
+
})
|
|
39
|
+
|
|
40
|
+
testPromise("save overwrites previous state for same id", async () => {
|
|
41
|
+
module TestBus = LocalBus.Make()
|
|
42
|
+
module Storage = QueryDbStorage_InMemory.Make(TestBus)
|
|
43
|
+
let s = Storage.make(~name="rm3", ~indexes=[], ~api=(), ~apiRole=(), ~opts)
|
|
44
|
+
let ops = await s.operations->TestRunner.resolve
|
|
45
|
+
let _ = await ops.save("id1", JSON.Encode.string("old"), ReventlessCore.QueryDb.Any, None)
|
|
46
|
+
let _ = await ops.save("id1", JSON.Encode.string("new"), ReventlessCore.QueryDb.Any, None)
|
|
47
|
+
let items =
|
|
48
|
+
await ops.loadStream("id1")
|
|
49
|
+
->Stream.runCollect
|
|
50
|
+
->Effect.catchAll(_ => Effect.succeed([]))
|
|
51
|
+
->Effect.runPromise
|
|
52
|
+
expect(items->Array.length)->toBe(1)
|
|
53
|
+
expect(items->Array.getUnsafe(0))->toEqual(JSON.Encode.string("new"))
|
|
54
|
+
})
|
|
55
|
+
|
|
56
|
+
testPromise("load delegates to loadStream (backward-compat)", async () => {
|
|
57
|
+
module TestBus = LocalBus.Make()
|
|
58
|
+
module Storage = QueryDbStorage_InMemory.Make(TestBus)
|
|
59
|
+
let s = Storage.make(~name="load-compat", ~indexes=[], ~api=(), ~apiRole=(), ~opts)
|
|
60
|
+
let ops = await s.operations->TestRunner.resolve
|
|
61
|
+
let _ = await ops.save("compat-id", JSON.Encode.string("compat-val"), ReventlessCore.QueryDb.Any, None)
|
|
62
|
+
let streamed = await ops.loadStream("compat-id")->Stream.runCollect->Effect.runPromise
|
|
63
|
+
let loaded = await ops.load("compat-id")
|
|
64
|
+
expect(loaded)->toEqual(Ok(streamed))
|
|
65
|
+
})
|
|
66
|
+
})
|
|
67
|
+
|
|
68
|
+
describe("saveBatch", () => {
|
|
69
|
+
testPromise("stores multiple items; loadStream retrieves each by id", async () => {
|
|
70
|
+
module TestBus = LocalBus.Make()
|
|
71
|
+
module Storage = QueryDbStorage_InMemory.Make(TestBus)
|
|
72
|
+
let s = Storage.make(~name="rm4", ~indexes=[], ~api=(), ~apiRole=(), ~opts)
|
|
73
|
+
let ops = await s.operations->TestRunner.resolve
|
|
74
|
+
let _ = await ops.saveBatch([
|
|
75
|
+
("a", JSON.Encode.string("val-a"), None),
|
|
76
|
+
("b", JSON.Encode.string("val-b"), None),
|
|
77
|
+
])
|
|
78
|
+
let itemsA =
|
|
79
|
+
await ops.loadStream("a")
|
|
80
|
+
->Stream.runCollect
|
|
81
|
+
->Effect.catchAll(_ => Effect.succeed([]))
|
|
82
|
+
->Effect.runPromise
|
|
83
|
+
let itemsB =
|
|
84
|
+
await ops.loadStream("b")
|
|
85
|
+
->Stream.runCollect
|
|
86
|
+
->Effect.catchAll(_ => Effect.succeed([]))
|
|
87
|
+
->Effect.runPromise
|
|
88
|
+
expect(itemsA->Array.getUnsafe(0))->toEqual(JSON.Encode.string("val-a"))
|
|
89
|
+
expect(itemsB->Array.getUnsafe(0))->toEqual(JSON.Encode.string("val-b"))
|
|
90
|
+
})
|
|
91
|
+
})
|
|
92
|
+
|
|
93
|
+
describe("count", () => {
|
|
94
|
+
testPromise("returns the increment value (no real counting semantics)", async () => {
|
|
95
|
+
module TestBus = LocalBus.Make()
|
|
96
|
+
module Storage = QueryDbStorage_InMemory.Make(TestBus)
|
|
97
|
+
let s = Storage.make(~name="rm5", ~indexes=[], ~api=(), ~apiRole=(), ~opts)
|
|
98
|
+
let ops = await s.operations->TestRunner.resolve
|
|
99
|
+
let result = await ops.count("id1", "field", 5)
|
|
100
|
+
expect(result)->toEqual(Ok(5))
|
|
101
|
+
})
|
|
102
|
+
})
|
|
103
|
+
|
|
104
|
+
describe("delete", () => {
|
|
105
|
+
testPromise("removes item; loadStream returns empty", async () => {
|
|
106
|
+
module TestBus = LocalBus.Make()
|
|
107
|
+
module Storage = QueryDbStorage_InMemory.Make(TestBus)
|
|
108
|
+
let s = Storage.make(~name="rm6", ~indexes=[], ~api=(), ~apiRole=(), ~opts)
|
|
109
|
+
let ops = await s.operations->TestRunner.resolve
|
|
110
|
+
let _ = await ops.save("del-id", JSON.Encode.string("v"), ReventlessCore.QueryDb.Any, None)
|
|
111
|
+
let _ = await ops.delete("del-id", None)
|
|
112
|
+
let items =
|
|
113
|
+
await ops.loadStream("del-id")
|
|
114
|
+
->Stream.runCollect
|
|
115
|
+
->Effect.catchAll(_ => Effect.succeed([]))
|
|
116
|
+
->Effect.runPromise
|
|
117
|
+
expect(items->Array.length)->toBe(0)
|
|
118
|
+
})
|
|
119
|
+
|
|
120
|
+
testPromise("deleteBatch removes multiple items", async () => {
|
|
121
|
+
module TestBus = LocalBus.Make()
|
|
122
|
+
module Storage = QueryDbStorage_InMemory.Make(TestBus)
|
|
123
|
+
let s = Storage.make(~name="rm7", ~indexes=[], ~api=(), ~apiRole=(), ~opts)
|
|
124
|
+
let ops = await s.operations->TestRunner.resolve
|
|
125
|
+
let _ = await ops.saveBatch([
|
|
126
|
+
("x", JSON.Encode.string("vx"), None),
|
|
127
|
+
("y", JSON.Encode.string("vy"), None),
|
|
128
|
+
])
|
|
129
|
+
let _ = await ops.deleteBatch([("x", None), ("y", None)])
|
|
130
|
+
let rx =
|
|
131
|
+
await ops.loadStream("x")
|
|
132
|
+
->Stream.runCollect
|
|
133
|
+
->Effect.catchAll(_ => Effect.succeed([]))
|
|
134
|
+
->Effect.runPromise
|
|
135
|
+
let ry =
|
|
136
|
+
await ops.loadStream("y")
|
|
137
|
+
->Stream.runCollect
|
|
138
|
+
->Effect.catchAll(_ => Effect.succeed([]))
|
|
139
|
+
->Effect.runPromise
|
|
140
|
+
expect(rx->Array.length)->toBe(0)
|
|
141
|
+
expect(ry->Array.length)->toBe(0)
|
|
142
|
+
})
|
|
143
|
+
})
|
|
144
|
+
|
|
145
|
+
describe("scan registration", () => {
|
|
146
|
+
testPromise("after save, scan function returns all stored items", async () => {
|
|
147
|
+
module TestBus = LocalBus.Make()
|
|
148
|
+
module Storage = QueryDbStorage_InMemory.Make(TestBus)
|
|
149
|
+
let s = Storage.make(~name="scan-rm", ~indexes=[], ~api=(), ~apiRole=(), ~opts)
|
|
150
|
+
let ops = await s.operations->TestRunner.resolve
|
|
151
|
+
let _ = await ops.save("s1", JSON.Encode.string("item1"), ReventlessCore.QueryDb.Any, None)
|
|
152
|
+
let _ = await ops.save("s2", JSON.Encode.string("item2"), ReventlessCore.QueryDb.Any, None)
|
|
153
|
+
let scanFn = TestBus.getQueryDbScan("scan-rm")->Option.getOr(() => [])
|
|
154
|
+
let all = scanFn()
|
|
155
|
+
expect(all->Array.length)->toBe(2)
|
|
156
|
+
})
|
|
157
|
+
|
|
158
|
+
testPromise("after delete, scan function excludes deleted item", async () => {
|
|
159
|
+
module TestBus = LocalBus.Make()
|
|
160
|
+
module Storage = QueryDbStorage_InMemory.Make(TestBus)
|
|
161
|
+
let s = Storage.make(~name="scan-rm2", ~indexes=[], ~api=(), ~apiRole=(), ~opts)
|
|
162
|
+
let ops = await s.operations->TestRunner.resolve
|
|
163
|
+
let _ = await ops.save("keep", JSON.Encode.string("keep"), ReventlessCore.QueryDb.Any, None)
|
|
164
|
+
let _ = await ops.save("gone", JSON.Encode.string("gone"), ReventlessCore.QueryDb.Any, None)
|
|
165
|
+
let _ = await ops.delete("gone", None)
|
|
166
|
+
let scanFn = TestBus.getQueryDbScan("scan-rm2")->Option.getOr(() => [])
|
|
167
|
+
let all = scanFn()
|
|
168
|
+
expect(all->Array.length)->toBe(1)
|
|
169
|
+
})
|
|
170
|
+
})
|
|
171
|
+
})
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
// Generated by ReScript, PLEASE EDIT WITH CARE
|
|
2
|
+
|
|
3
|
+
import * as Stream from "@reventlessdev/rescript-effect/src/Stream.res.mjs";
|
|
4
|
+
import * as Stdlib_Option from "@rescript/runtime/lib/es6/Stdlib_Option.js";
|
|
5
|
+
import * as Effect from "effect/Effect";
|
|
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 QueryDbStorage_InMemory$ReventlessLocal from "../../src/adapter/QueryDb/QueryDbStorage_InMemory.res.mjs";
|
|
9
|
+
|
|
10
|
+
TestRunner$ReventlessLocal.setup();
|
|
11
|
+
|
|
12
|
+
let opts = {};
|
|
13
|
+
|
|
14
|
+
globalThis.describe("QueryDbStorage_InMemory", () => {
|
|
15
|
+
globalThis.describe("save and load", () => {
|
|
16
|
+
globalThis.test("save stores state; loadStream retrieves it by id", async () => {
|
|
17
|
+
let TestBus = LocalBus$ReventlessLocal.Make({});
|
|
18
|
+
let Storage = QueryDbStorage_InMemory$ReventlessLocal.Make(TestBus);
|
|
19
|
+
let s = Storage.make("rm1", [], undefined, undefined, undefined, undefined, opts);
|
|
20
|
+
let ops = await TestRunner$ReventlessLocal.resolve(s.operations);
|
|
21
|
+
await ops.save("id1", "value1", "Any", undefined);
|
|
22
|
+
let items = await Effect.runPromise(Effect.catchAll(Stream.runCollect(ops.loadStream("id1")), param => Effect.succeed([])));
|
|
23
|
+
globalThis.expect(items.length).toBe(1);
|
|
24
|
+
globalThis.expect(items[0]).toEqual("value1");
|
|
25
|
+
});
|
|
26
|
+
globalThis.test("loadStream returns empty for unknown id", async () => {
|
|
27
|
+
let TestBus = LocalBus$ReventlessLocal.Make({});
|
|
28
|
+
let Storage = QueryDbStorage_InMemory$ReventlessLocal.Make(TestBus);
|
|
29
|
+
let s = Storage.make("rm2", [], undefined, undefined, undefined, undefined, opts);
|
|
30
|
+
let ops = await TestRunner$ReventlessLocal.resolve(s.operations);
|
|
31
|
+
let items = await Effect.runPromise(Effect.catchAll(Stream.runCollect(ops.loadStream("unknown")), param => Effect.succeed([])));
|
|
32
|
+
globalThis.expect(items.length).toBe(0);
|
|
33
|
+
});
|
|
34
|
+
globalThis.test("save overwrites previous state for same id", async () => {
|
|
35
|
+
let TestBus = LocalBus$ReventlessLocal.Make({});
|
|
36
|
+
let Storage = QueryDbStorage_InMemory$ReventlessLocal.Make(TestBus);
|
|
37
|
+
let s = Storage.make("rm3", [], undefined, undefined, undefined, undefined, opts);
|
|
38
|
+
let ops = await TestRunner$ReventlessLocal.resolve(s.operations);
|
|
39
|
+
await ops.save("id1", "old", "Any", undefined);
|
|
40
|
+
await ops.save("id1", "new", "Any", undefined);
|
|
41
|
+
let items = await Effect.runPromise(Effect.catchAll(Stream.runCollect(ops.loadStream("id1")), param => Effect.succeed([])));
|
|
42
|
+
globalThis.expect(items.length).toBe(1);
|
|
43
|
+
globalThis.expect(items[0]).toEqual("new");
|
|
44
|
+
});
|
|
45
|
+
globalThis.test("load delegates to loadStream (backward-compat)", async () => {
|
|
46
|
+
let TestBus = LocalBus$ReventlessLocal.Make({});
|
|
47
|
+
let Storage = QueryDbStorage_InMemory$ReventlessLocal.Make(TestBus);
|
|
48
|
+
let s = Storage.make("load-compat", [], undefined, undefined, undefined, undefined, opts);
|
|
49
|
+
let ops = await TestRunner$ReventlessLocal.resolve(s.operations);
|
|
50
|
+
await ops.save("compat-id", "compat-val", "Any", undefined);
|
|
51
|
+
let streamed = await Effect.runPromise(Stream.runCollect(ops.loadStream("compat-id")));
|
|
52
|
+
let loaded = await ops.load("compat-id");
|
|
53
|
+
globalThis.expect(loaded).toEqual({
|
|
54
|
+
TAG: "Ok",
|
|
55
|
+
_0: streamed
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
globalThis.describe("saveBatch", () => {
|
|
60
|
+
globalThis.test("stores multiple items; loadStream retrieves each by id", async () => {
|
|
61
|
+
let TestBus = LocalBus$ReventlessLocal.Make({});
|
|
62
|
+
let Storage = QueryDbStorage_InMemory$ReventlessLocal.Make(TestBus);
|
|
63
|
+
let s = Storage.make("rm4", [], undefined, undefined, undefined, undefined, opts);
|
|
64
|
+
let ops = await TestRunner$ReventlessLocal.resolve(s.operations);
|
|
65
|
+
await ops.saveBatch([
|
|
66
|
+
[
|
|
67
|
+
"a",
|
|
68
|
+
"val-a",
|
|
69
|
+
undefined
|
|
70
|
+
],
|
|
71
|
+
[
|
|
72
|
+
"b",
|
|
73
|
+
"val-b",
|
|
74
|
+
undefined
|
|
75
|
+
]
|
|
76
|
+
]);
|
|
77
|
+
let itemsA = await Effect.runPromise(Effect.catchAll(Stream.runCollect(ops.loadStream("a")), param => Effect.succeed([])));
|
|
78
|
+
let itemsB = await Effect.runPromise(Effect.catchAll(Stream.runCollect(ops.loadStream("b")), param => Effect.succeed([])));
|
|
79
|
+
globalThis.expect(itemsA[0]).toEqual("val-a");
|
|
80
|
+
globalThis.expect(itemsB[0]).toEqual("val-b");
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
globalThis.describe("count", () => {
|
|
84
|
+
globalThis.test("returns the increment value (no real counting semantics)", async () => {
|
|
85
|
+
let TestBus = LocalBus$ReventlessLocal.Make({});
|
|
86
|
+
let Storage = QueryDbStorage_InMemory$ReventlessLocal.Make(TestBus);
|
|
87
|
+
let s = Storage.make("rm5", [], undefined, undefined, undefined, undefined, opts);
|
|
88
|
+
let ops = await TestRunner$ReventlessLocal.resolve(s.operations);
|
|
89
|
+
let result = await ops.count("id1", "field", 5);
|
|
90
|
+
globalThis.expect(result).toEqual({
|
|
91
|
+
TAG: "Ok",
|
|
92
|
+
_0: 5
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
globalThis.describe("delete", () => {
|
|
97
|
+
globalThis.test("removes item; loadStream returns empty", async () => {
|
|
98
|
+
let TestBus = LocalBus$ReventlessLocal.Make({});
|
|
99
|
+
let Storage = QueryDbStorage_InMemory$ReventlessLocal.Make(TestBus);
|
|
100
|
+
let s = Storage.make("rm6", [], undefined, undefined, undefined, undefined, opts);
|
|
101
|
+
let ops = await TestRunner$ReventlessLocal.resolve(s.operations);
|
|
102
|
+
await ops.save("del-id", "v", "Any", undefined);
|
|
103
|
+
await ops.delete("del-id", undefined);
|
|
104
|
+
let items = await Effect.runPromise(Effect.catchAll(Stream.runCollect(ops.loadStream("del-id")), param => Effect.succeed([])));
|
|
105
|
+
globalThis.expect(items.length).toBe(0);
|
|
106
|
+
});
|
|
107
|
+
globalThis.test("deleteBatch removes multiple items", async () => {
|
|
108
|
+
let TestBus = LocalBus$ReventlessLocal.Make({});
|
|
109
|
+
let Storage = QueryDbStorage_InMemory$ReventlessLocal.Make(TestBus);
|
|
110
|
+
let s = Storage.make("rm7", [], undefined, undefined, undefined, undefined, opts);
|
|
111
|
+
let ops = await TestRunner$ReventlessLocal.resolve(s.operations);
|
|
112
|
+
await ops.saveBatch([
|
|
113
|
+
[
|
|
114
|
+
"x",
|
|
115
|
+
"vx",
|
|
116
|
+
undefined
|
|
117
|
+
],
|
|
118
|
+
[
|
|
119
|
+
"y",
|
|
120
|
+
"vy",
|
|
121
|
+
undefined
|
|
122
|
+
]
|
|
123
|
+
]);
|
|
124
|
+
await ops.deleteBatch([
|
|
125
|
+
[
|
|
126
|
+
"x",
|
|
127
|
+
undefined
|
|
128
|
+
],
|
|
129
|
+
[
|
|
130
|
+
"y",
|
|
131
|
+
undefined
|
|
132
|
+
]
|
|
133
|
+
]);
|
|
134
|
+
let rx = await Effect.runPromise(Effect.catchAll(Stream.runCollect(ops.loadStream("x")), param => Effect.succeed([])));
|
|
135
|
+
let ry = await Effect.runPromise(Effect.catchAll(Stream.runCollect(ops.loadStream("y")), param => Effect.succeed([])));
|
|
136
|
+
globalThis.expect(rx.length).toBe(0);
|
|
137
|
+
globalThis.expect(ry.length).toBe(0);
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
globalThis.describe("scan registration", () => {
|
|
141
|
+
globalThis.test("after save, scan function returns all stored items", async () => {
|
|
142
|
+
let TestBus = LocalBus$ReventlessLocal.Make({});
|
|
143
|
+
let Storage = QueryDbStorage_InMemory$ReventlessLocal.Make(TestBus);
|
|
144
|
+
let s = Storage.make("scan-rm", [], undefined, undefined, undefined, undefined, opts);
|
|
145
|
+
let ops = await TestRunner$ReventlessLocal.resolve(s.operations);
|
|
146
|
+
await ops.save("s1", "item1", "Any", undefined);
|
|
147
|
+
await ops.save("s2", "item2", "Any", undefined);
|
|
148
|
+
let scanFn = Stdlib_Option.getOr(TestBus.getQueryDbScan("scan-rm"), () => []);
|
|
149
|
+
let all = scanFn();
|
|
150
|
+
globalThis.expect(all.length).toBe(2);
|
|
151
|
+
});
|
|
152
|
+
globalThis.test("after delete, scan function excludes deleted item", async () => {
|
|
153
|
+
let TestBus = LocalBus$ReventlessLocal.Make({});
|
|
154
|
+
let Storage = QueryDbStorage_InMemory$ReventlessLocal.Make(TestBus);
|
|
155
|
+
let s = Storage.make("scan-rm2", [], undefined, undefined, undefined, undefined, opts);
|
|
156
|
+
let ops = await TestRunner$ReventlessLocal.resolve(s.operations);
|
|
157
|
+
await ops.save("keep", "keep", "Any", undefined);
|
|
158
|
+
await ops.save("gone", "gone", "Any", undefined);
|
|
159
|
+
await ops.delete("gone", undefined);
|
|
160
|
+
let scanFn = Stdlib_Option.getOr(TestBus.getQueryDbScan("scan-rm2"), () => []);
|
|
161
|
+
let all = scanFn();
|
|
162
|
+
globalThis.expect(all.length).toBe(1);
|
|
163
|
+
});
|
|
164
|
+
});
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
export {
|
|
168
|
+
opts,
|
|
169
|
+
}
|
|
170
|
+
/* Not a pure module */
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
// Unit tests for LocalQueryEngine.
|
|
2
|
+
// Verifies query (by id and key) and scan operations via the bus storage registry.
|
|
3
|
+
|
|
4
|
+
open JestGlobals
|
|
5
|
+
|
|
6
|
+
let _ = TestRunner.setup()
|
|
7
|
+
|
|
8
|
+
let opts: Pulumi.CustomResourceOptions.t = {}
|
|
9
|
+
|
|
10
|
+
describe("LocalQueryEngine", () => {
|
|
11
|
+
describe("query", () => {
|
|
12
|
+
testPromise("query by id returns items saved in the matching QueryDbStorage", async () => {
|
|
13
|
+
module TestBus = LocalBus.Make()
|
|
14
|
+
module Storage = QueryDbStorage_InMemory.Make(TestBus)
|
|
15
|
+
module QE = LocalQueryEngine.Make(TestBus)
|
|
16
|
+
let s = Storage.make(~name="users", ~indexes=[], ~api=(), ~apiRole=(), ~opts)
|
|
17
|
+
let ops = await s.operations->TestRunner.resolve
|
|
18
|
+
let _ = await ops.save("user-1", JSON.Encode.string("Alice"), ReventlessCore.QueryDb.Any, None)
|
|
19
|
+
let engine = await QE.make(Dict.make())->TestRunner.resolve
|
|
20
|
+
let items = await engine.query(
|
|
21
|
+
~readModelName="users",
|
|
22
|
+
~id=Reventless.QueryEngine.String("user-1"),
|
|
23
|
+
)
|
|
24
|
+
expect(items->Array.length)->toBe(1)
|
|
25
|
+
expect(items->Array.getUnsafe(0))->toEqual(JSON.Encode.string("Alice"))
|
|
26
|
+
})
|
|
27
|
+
|
|
28
|
+
testPromise("query with explicit key overrides the id parameter", async () => {
|
|
29
|
+
module TestBus = LocalBus.Make()
|
|
30
|
+
module Storage = QueryDbStorage_InMemory.Make(TestBus)
|
|
31
|
+
module QE = LocalQueryEngine.Make(TestBus)
|
|
32
|
+
let s = Storage.make(~name="products", ~indexes=[], ~api=(), ~apiRole=(), ~opts)
|
|
33
|
+
let ops = await s.operations->TestRunner.resolve
|
|
34
|
+
let _ =
|
|
35
|
+
await ops.save("prod-key", JSON.Encode.string("Widget"), ReventlessCore.QueryDb.Any, None)
|
|
36
|
+
let engine = await QE.make(Dict.make())->TestRunner.resolve
|
|
37
|
+
let items = await engine.query(
|
|
38
|
+
~readModelName="products",
|
|
39
|
+
~key="prod-key",
|
|
40
|
+
~id=Reventless.QueryEngine.String("ignored"),
|
|
41
|
+
)
|
|
42
|
+
expect(items->Array.length)->toBe(1)
|
|
43
|
+
expect(items->Array.getUnsafe(0))->toEqual(JSON.Encode.string("Widget"))
|
|
44
|
+
})
|
|
45
|
+
|
|
46
|
+
testPromise("query for unknown readModelName returns empty array", async () => {
|
|
47
|
+
module TestBus = LocalBus.Make()
|
|
48
|
+
module QE = LocalQueryEngine.Make(TestBus)
|
|
49
|
+
let engine = await QE.make(Dict.make())->TestRunner.resolve
|
|
50
|
+
let items = await engine.query(
|
|
51
|
+
~readModelName="no-such-model",
|
|
52
|
+
~id=Reventless.QueryEngine.String("any"),
|
|
53
|
+
)
|
|
54
|
+
expect(items->Array.length)->toBe(0)
|
|
55
|
+
})
|
|
56
|
+
|
|
57
|
+
testPromise("query with Int id converts to string key for lookup", async () => {
|
|
58
|
+
module TestBus = LocalBus.Make()
|
|
59
|
+
module Storage = QueryDbStorage_InMemory.Make(TestBus)
|
|
60
|
+
module QE = LocalQueryEngine.Make(TestBus)
|
|
61
|
+
let s = Storage.make(~name="counters", ~indexes=[], ~api=(), ~apiRole=(), ~opts)
|
|
62
|
+
let ops = await s.operations->TestRunner.resolve
|
|
63
|
+
let _ = await ops.save("42", JSON.Encode.int(100), ReventlessCore.QueryDb.Any, None)
|
|
64
|
+
let engine = await QE.make(Dict.make())->TestRunner.resolve
|
|
65
|
+
let items = await engine.query(
|
|
66
|
+
~readModelName="counters",
|
|
67
|
+
~id=Reventless.QueryEngine.Int(42),
|
|
68
|
+
)
|
|
69
|
+
expect(items->Array.length)->toBe(1)
|
|
70
|
+
})
|
|
71
|
+
})
|
|
72
|
+
|
|
73
|
+
describe("scan", () => {
|
|
74
|
+
testPromise("scan returns all items from the matching QueryDbStorage", async () => {
|
|
75
|
+
module TestBus = LocalBus.Make()
|
|
76
|
+
module Storage = QueryDbStorage_InMemory.Make(TestBus)
|
|
77
|
+
module QE = LocalQueryEngine.Make(TestBus)
|
|
78
|
+
let s = Storage.make(~name="orders", ~indexes=[], ~api=(), ~apiRole=(), ~opts)
|
|
79
|
+
let ops = await s.operations->TestRunner.resolve
|
|
80
|
+
let _ = await ops.save("o1", JSON.Encode.string("order1"), ReventlessCore.QueryDb.Any, None)
|
|
81
|
+
let _ = await ops.save("o2", JSON.Encode.string("order2"), ReventlessCore.QueryDb.Any, None)
|
|
82
|
+
let engine = await QE.make(Dict.make())->TestRunner.resolve
|
|
83
|
+
let items = await engine.scan(~readModelName="orders", ~filterConfigs=[], ~limit=100)
|
|
84
|
+
expect(items->Array.length)->toBe(2)
|
|
85
|
+
})
|
|
86
|
+
|
|
87
|
+
testPromise("scan for unknown readModelName returns empty array", async () => {
|
|
88
|
+
module TestBus = LocalBus.Make()
|
|
89
|
+
module QE = LocalQueryEngine.Make(TestBus)
|
|
90
|
+
let engine = await QE.make(Dict.make())->TestRunner.resolve
|
|
91
|
+
let items = await engine.scan(~readModelName="no-such-model", ~filterConfigs=[], ~limit=100)
|
|
92
|
+
expect(items->Array.length)->toBe(0)
|
|
93
|
+
})
|
|
94
|
+
})
|
|
95
|
+
|
|
96
|
+
describe("scan with ~limit", () => {
|
|
97
|
+
testPromise("~limit=2 on a 5-item QueryDb returns exactly 2 items", async () => {
|
|
98
|
+
module TestBus = LocalBus.Make()
|
|
99
|
+
module Storage = QueryDbStorage_InMemory.Make(TestBus)
|
|
100
|
+
module QE = LocalQueryEngine.Make(TestBus)
|
|
101
|
+
let s = Storage.make(~name="items", ~indexes=[], ~api=(), ~apiRole=(), ~opts)
|
|
102
|
+
let ops = await s.operations->TestRunner.resolve
|
|
103
|
+
let _ = await ops.save("k1", JSON.Encode.string("a"), ReventlessCore.QueryDb.Any, None)
|
|
104
|
+
let _ = await ops.save("k2", JSON.Encode.string("b"), ReventlessCore.QueryDb.Any, None)
|
|
105
|
+
let _ = await ops.save("k3", JSON.Encode.string("c"), ReventlessCore.QueryDb.Any, None)
|
|
106
|
+
let _ = await ops.save("k4", JSON.Encode.string("d"), ReventlessCore.QueryDb.Any, None)
|
|
107
|
+
let _ = await ops.save("k5", JSON.Encode.string("e"), ReventlessCore.QueryDb.Any, None)
|
|
108
|
+
let engine = await QE.make(Dict.make())->TestRunner.resolve
|
|
109
|
+
let result = await engine.scan(~readModelName="items", ~filterConfigs=[], ~limit=2)
|
|
110
|
+
expect(result->Array.length)->toBe(2)
|
|
111
|
+
})
|
|
112
|
+
|
|
113
|
+
testPromise("~limit larger than total returns all items (no padding)", async () => {
|
|
114
|
+
module TestBus = LocalBus.Make()
|
|
115
|
+
module Storage = QueryDbStorage_InMemory.Make(TestBus)
|
|
116
|
+
module QE = LocalQueryEngine.Make(TestBus)
|
|
117
|
+
let s = Storage.make(~name="things", ~indexes=[], ~api=(), ~apiRole=(), ~opts)
|
|
118
|
+
let ops = await s.operations->TestRunner.resolve
|
|
119
|
+
let _ = await ops.save("t1", JSON.Encode.string("x"), ReventlessCore.QueryDb.Any, None)
|
|
120
|
+
let _ = await ops.save("t2", JSON.Encode.string("y"), ReventlessCore.QueryDb.Any, None)
|
|
121
|
+
let engine = await QE.make(Dict.make())->TestRunner.resolve
|
|
122
|
+
let result = await engine.scan(~readModelName="things", ~filterConfigs=[], ~limit=100)
|
|
123
|
+
expect(result->Array.length)->toBe(2)
|
|
124
|
+
})
|
|
125
|
+
|
|
126
|
+
testPromise("~limit=0 returns empty array", async () => {
|
|
127
|
+
module TestBus = LocalBus.Make()
|
|
128
|
+
module Storage = QueryDbStorage_InMemory.Make(TestBus)
|
|
129
|
+
module QE = LocalQueryEngine.Make(TestBus)
|
|
130
|
+
let s = Storage.make(~name="stuff", ~indexes=[], ~api=(), ~apiRole=(), ~opts)
|
|
131
|
+
let ops = await s.operations->TestRunner.resolve
|
|
132
|
+
let _ = await ops.save("s1", JSON.Encode.string("z"), ReventlessCore.QueryDb.Any, None)
|
|
133
|
+
let engine = await QE.make(Dict.make())->TestRunner.resolve
|
|
134
|
+
let result = await engine.scan(~readModelName="stuff", ~filterConfigs=[], ~limit=0)
|
|
135
|
+
expect(result->Array.length)->toBe(0)
|
|
136
|
+
})
|
|
137
|
+
|
|
138
|
+
testPromise("~limit=3 on a 3-item QueryDb returns all 3 items", async () => {
|
|
139
|
+
module TestBus = LocalBus.Make()
|
|
140
|
+
module Storage = QueryDbStorage_InMemory.Make(TestBus)
|
|
141
|
+
module QE = LocalQueryEngine.Make(TestBus)
|
|
142
|
+
let s = Storage.make(~name="widgets", ~indexes=[], ~api=(), ~apiRole=(), ~opts)
|
|
143
|
+
let ops = await s.operations->TestRunner.resolve
|
|
144
|
+
let _ = await ops.save("w1", JSON.Encode.string("p"), ReventlessCore.QueryDb.Any, None)
|
|
145
|
+
let _ = await ops.save("w2", JSON.Encode.string("q"), ReventlessCore.QueryDb.Any, None)
|
|
146
|
+
let _ = await ops.save("w3", JSON.Encode.string("r"), ReventlessCore.QueryDb.Any, None)
|
|
147
|
+
let engine = await QE.make(Dict.make())->TestRunner.resolve
|
|
148
|
+
let result = await engine.scan(~readModelName="widgets", ~filterConfigs=[], ~limit=3)
|
|
149
|
+
expect(result->Array.length)->toBe(3)
|
|
150
|
+
})
|
|
151
|
+
})
|
|
152
|
+
})
|