@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.
Files changed (334) hide show
  1. package/CHANGELOG.md +1197 -0
  2. package/LICENSE +202 -0
  3. package/__mocks__/emptyModule.js +2 -0
  4. package/__mocks__/nodeSqlite.mjs +6 -0
  5. package/package.json +67 -0
  6. package/rescript.json +39 -0
  7. package/src/Platform.res +2162 -0
  8. package/src/Platform.res.mjs +3389 -0
  9. package/src/adapter/Api/LocalGraphQL_Adapter.res +29 -0
  10. package/src/adapter/Api/LocalGraphQL_Adapter.res.mjs +26 -0
  11. package/src/adapter/Api/LocalGraphQL_SubscriptionResolvers.res +146 -0
  12. package/src/adapter/Api/LocalGraphQL_SubscriptionResolvers.res.mjs +88 -0
  13. package/src/adapter/Auth/Auth_GraphqlContext.res +83 -0
  14. package/src/adapter/Auth/Auth_GraphqlContext.res.mjs +76 -0
  15. package/src/adapter/Auth/LocalAuth.res +239 -0
  16. package/src/adapter/Auth/LocalAuth.res.mjs +247 -0
  17. package/src/adapter/Auth/UserStore.res +134 -0
  18. package/src/adapter/Auth/UserStore.res.mjs +146 -0
  19. package/src/adapter/Backend.res +46 -0
  20. package/src/adapter/Backend.res.mjs +66 -0
  21. package/src/adapter/BackendState.res +34 -0
  22. package/src/adapter/BackendState.res.mjs +42 -0
  23. package/src/adapter/Cloner/LocalClonerRunner.res +13 -0
  24. package/src/adapter/Cloner/LocalClonerRunner.res.mjs +12 -0
  25. package/src/adapter/CommandGenerator/CommandGeneratorResolvers_GraphQL.res +329 -0
  26. package/src/adapter/CommandGenerator/CommandGeneratorResolvers_GraphQL.res.mjs +301 -0
  27. package/src/adapter/CommandGenerator/InboundTranslationResolvers_GraphQL.res +76 -0
  28. package/src/adapter/CommandGenerator/InboundTranslationResolvers_GraphQL.res.mjs +57 -0
  29. package/src/adapter/CommandGenerator/LocalCommandGeneratorResolvers.res +19 -0
  30. package/src/adapter/CommandGenerator/LocalCommandGeneratorResolvers.res.mjs +19 -0
  31. package/src/adapter/CommandTopic/LocalCommandTopicChannel.res +104 -0
  32. package/src/adapter/CommandTopic/LocalCommandTopicChannel.res.mjs +82 -0
  33. package/src/adapter/CommandTopic/LocalCommandTopicRemoteChannel.res +32 -0
  34. package/src/adapter/CommandTopic/LocalCommandTopicRemoteChannel.res.mjs +38 -0
  35. package/src/adapter/Counter/LocalCounterHandler.res +42 -0
  36. package/src/adapter/Counter/LocalCounterHandler.res.mjs +45 -0
  37. package/src/adapter/DcbEventLog/DcbEventLogStorage_InMemory.res +131 -0
  38. package/src/adapter/DcbEventLog/DcbEventLogStorage_InMemory.res.mjs +140 -0
  39. package/src/adapter/DcbEventLog/DcbEventLogStorage_Sqlite.res +334 -0
  40. package/src/adapter/DcbEventLog/DcbEventLogStorage_Sqlite.res.mjs +299 -0
  41. package/src/adapter/DomainGraphQL_Server.res +565 -0
  42. package/src/adapter/DomainGraphQL_Server.res.mjs +576 -0
  43. package/src/adapter/DomainMCP_Server.res +369 -0
  44. package/src/adapter/DomainMCP_Server.res.mjs +358 -0
  45. package/src/adapter/EventCollector/LocalEventCollectorChannel.res +87 -0
  46. package/src/adapter/EventCollector/LocalEventCollectorChannel.res.mjs +45 -0
  47. package/src/adapter/EventLog/EventLogStorage_InMemory.res +105 -0
  48. package/src/adapter/EventLog/EventLogStorage_InMemory.res.mjs +117 -0
  49. package/src/adapter/EventLog/EventLogStorage_Sqlite.res +145 -0
  50. package/src/adapter/EventLog/EventLogStorage_Sqlite.res.mjs +155 -0
  51. package/src/adapter/EventTopic/LocalEventTopicPublisher.res +36 -0
  52. package/src/adapter/EventTopic/LocalEventTopicPublisher.res.mjs +31 -0
  53. package/src/adapter/GraphQL_Server.res +6 -0
  54. package/src/adapter/GraphQL_Server.res.mjs +154 -0
  55. package/src/adapter/GraphQL_ServerInstance.res +310 -0
  56. package/src/adapter/GraphQL_ServerInstance.res.mjs +257 -0
  57. package/src/adapter/Heartbeat/LocalHeartbeatRunner.res +57 -0
  58. package/src/adapter/Heartbeat/LocalHeartbeatRunner.res.mjs +34 -0
  59. package/src/adapter/LocalBus.res +498 -0
  60. package/src/adapter/LocalBus.res.mjs +1011 -0
  61. package/src/adapter/LocalPluginSpec.res +16 -0
  62. package/src/adapter/LocalPluginSpec.res.mjs +33 -0
  63. package/src/adapter/LocalSideEffectHandler.res +44 -0
  64. package/src/adapter/LocalSideEffectHandler.res.mjs +34 -0
  65. package/src/adapter/MCP_Server.res +4 -0
  66. package/src/adapter/MCP_Server.res.mjs +67 -0
  67. package/src/adapter/MCP_ServerInstance.res +362 -0
  68. package/src/adapter/MCP_ServerInstance.res.mjs +313 -0
  69. package/src/adapter/PlatformGraphQL_Server.res +75 -0
  70. package/src/adapter/PlatformGraphQL_Server.res.mjs +84 -0
  71. package/src/adapter/PlatformMCP_Server.res +23 -0
  72. package/src/adapter/PlatformMCP_Server.res.mjs +46 -0
  73. package/src/adapter/QueryDb/QueryDbResolvers_GraphQL.res +793 -0
  74. package/src/adapter/QueryDb/QueryDbResolvers_GraphQL.res.mjs +569 -0
  75. package/src/adapter/QueryDb/QueryDbStorage_InMemory.res +242 -0
  76. package/src/adapter/QueryDb/QueryDbStorage_InMemory.res.mjs +241 -0
  77. package/src/adapter/QueryDb/QueryDbStorage_Sqlite.res +339 -0
  78. package/src/adapter/QueryDb/QueryDbStorage_Sqlite.res.mjs +318 -0
  79. package/src/adapter/QueryDb/SortKey_Filter.res +48 -0
  80. package/src/adapter/QueryDb/SortKey_Filter.res.mjs +46 -0
  81. package/src/adapter/QueryEngine/LocalQueryEngine.res +57 -0
  82. package/src/adapter/QueryEngine/LocalQueryEngine.res.mjs +56 -0
  83. package/src/adapter/Runtime/LocalAggregateRuntime_Builder.res +91 -0
  84. package/src/adapter/Runtime/LocalAggregateRuntime_Builder.res.mjs +50 -0
  85. package/src/adapter/Runtime/LocalEventCollectorRuntime_Builder.res +47 -0
  86. package/src/adapter/Runtime/LocalEventCollectorRuntime_Builder.res.mjs +37 -0
  87. package/src/adapter/Runtime/LocalPluginRuntime_Builder.res +11 -0
  88. package/src/adapter/Runtime/LocalPluginRuntime_Builder.res.mjs +30 -0
  89. package/src/adapter/Runtime/LocalRuntimeEnvironment.res +54 -0
  90. package/src/adapter/Runtime/LocalRuntimeEnvironment.res.mjs +40 -0
  91. package/src/adapter/Scheduler/LocalScheduledPublisher.res +102 -0
  92. package/src/adapter/Scheduler/LocalScheduledPublisher.res.mjs +84 -0
  93. package/src/adapter/SqliteDriver.res +52 -0
  94. package/src/adapter/SqliteDriver.res.mjs +76 -0
  95. package/src/adapter/SqliteDriver.resi +31 -0
  96. package/src/adapter/Task/LocalTaskBucket.res +75 -0
  97. package/src/adapter/Task/LocalTaskBucket.res.mjs +48 -0
  98. package/src/adapter/Task/TaskBucket_Sqlite.res +47 -0
  99. package/src/adapter/Task/TaskBucket_Sqlite.res.mjs +40 -0
  100. package/src/components/Aggregate_Builder.res +55 -0
  101. package/src/components/Aggregate_Builder.res.mjs +140 -0
  102. package/src/components/AutomationSlice_Builder.res +41 -0
  103. package/src/components/AutomationSlice_Builder.res.mjs +57 -0
  104. package/src/components/Counter_Builder.res +14 -0
  105. package/src/components/Counter_Builder.res.mjs +32 -0
  106. package/src/components/DcbEventLog_Builder.res +18 -0
  107. package/src/components/DcbEventLog_Builder.res.mjs +24 -0
  108. package/src/components/ExtensionPoint_Builder.res +25 -0
  109. package/src/components/ExtensionPoint_Builder.res.mjs +44 -0
  110. package/src/components/InboundTranslationSlice_Builder.res +34 -0
  111. package/src/components/InboundTranslationSlice_Builder.res.mjs +45 -0
  112. package/src/components/OutboundTranslationSlice_Builder.res +43 -0
  113. package/src/components/OutboundTranslationSlice_Builder.res.mjs +59 -0
  114. package/src/components/Plugin_Builder.res +37 -0
  115. package/src/components/Plugin_Builder.res.mjs +67 -0
  116. package/src/components/ReadModel_Builder.res +47 -0
  117. package/src/components/ReadModel_Builder.res.mjs +54 -0
  118. package/src/components/StateChangeSlice_Builder.res +19 -0
  119. package/src/components/StateChangeSlice_Builder.res.mjs +21 -0
  120. package/src/components/StateViewSlice_Builder.res +42 -0
  121. package/src/components/StateViewSlice_Builder.res.mjs +58 -0
  122. package/src/components/Task_Builder.res +28 -0
  123. package/src/components/Task_Builder.res.mjs +41 -0
  124. package/src/reexport/CommandTopic.res +3 -0
  125. package/src/reexport/CommandTopic.res.mjs +55 -0
  126. package/src/test/Mocks/MockDcbEventLogStorage.res +136 -0
  127. package/src/test/Mocks/MockDcbEventLogStorage.res.mjs +146 -0
  128. package/src/test/Mocks/MockEventLogStorage.res +57 -0
  129. package/src/test/Mocks/MockEventLogStorage.res.mjs +65 -0
  130. package/src/test/Mocks/MockPublisher.res +29 -0
  131. package/src/test/Mocks/MockPublisher.res.mjs +28 -0
  132. package/src/test/Mocks/MockQueryDbStorage.res +104 -0
  133. package/src/test/Mocks/MockQueryDbStorage.res.mjs +136 -0
  134. package/src/test/TestRunner.res +96 -0
  135. package/src/test/TestRunner.res.mjs +71 -0
  136. package/tests/SplitApiFixtures.res +84 -0
  137. package/tests/SplitApiFixtures.res.mjs +88 -0
  138. package/tests/SplitApiTest.res +102 -0
  139. package/tests/SplitApiTest.res.mjs +82 -0
  140. package/tests/TestFixtures.res +54 -0
  141. package/tests/TestFixtures.res.mjs +65 -0
  142. package/tests/adapter/BackendParityTest.res +94 -0
  143. package/tests/adapter/BackendParityTest.res.mjs +96 -0
  144. package/tests/adapter/CollectNEventsTest.res +82 -0
  145. package/tests/adapter/CollectNEventsTest.res.mjs +83 -0
  146. package/tests/adapter/CommandAuthorizationTest.res +200 -0
  147. package/tests/adapter/CommandAuthorizationTest.res.mjs +190 -0
  148. package/tests/adapter/CommandTopicChannelTest.res +174 -0
  149. package/tests/adapter/CommandTopicChannelTest.res.mjs +170 -0
  150. package/tests/adapter/CounterHandlerTest.res +113 -0
  151. package/tests/adapter/CounterHandlerTest.res.mjs +96 -0
  152. package/tests/adapter/DcbEventLogStorageSqliteTest.res +157 -0
  153. package/tests/adapter/DcbEventLogStorageSqliteTest.res.mjs +165 -0
  154. package/tests/adapter/DcbEventLogStorageTest.res +187 -0
  155. package/tests/adapter/DcbEventLogStorageTest.res.mjs +195 -0
  156. package/tests/adapter/EventCollectorChannelTest.res +166 -0
  157. package/tests/adapter/EventCollectorChannelTest.res.mjs +178 -0
  158. package/tests/adapter/EventLogStorageSqliteTest.res +105 -0
  159. package/tests/adapter/EventLogStorageSqliteTest.res.mjs +116 -0
  160. package/tests/adapter/EventTapTest.res +102 -0
  161. package/tests/adapter/EventTapTest.res.mjs +94 -0
  162. package/tests/adapter/EventTopicPublisherTest.res +76 -0
  163. package/tests/adapter/EventTopicPublisherTest.res.mjs +86 -0
  164. package/tests/adapter/GraphQL_SchemaInspectorTest.res +763 -0
  165. package/tests/adapter/GraphQL_SchemaInspectorTest.res.mjs +578 -0
  166. package/tests/adapter/GraphQL_SubscriptionResolversTest.res +161 -0
  167. package/tests/adapter/GraphQL_SubscriptionResolversTest.res.mjs +134 -0
  168. package/tests/adapter/HeartbeatRunnerTest.res +136 -0
  169. package/tests/adapter/HeartbeatRunnerTest.res.mjs +96 -0
  170. package/tests/adapter/LocalAuthHttpTest.res +224 -0
  171. package/tests/adapter/LocalAuthHttpTest.res.mjs +237 -0
  172. package/tests/adapter/LocalAuthLoginTest.res +180 -0
  173. package/tests/adapter/LocalAuthLoginTest.res.mjs +207 -0
  174. package/tests/adapter/LocalAuthTest.res +106 -0
  175. package/tests/adapter/LocalAuthTest.res.mjs +145 -0
  176. package/tests/adapter/LocalAuthUserStoreTest.res +172 -0
  177. package/tests/adapter/LocalAuthUserStoreTest.res.mjs +208 -0
  178. package/tests/adapter/LocalBusBoundedTest.res +157 -0
  179. package/tests/adapter/LocalBusBoundedTest.res.mjs +168 -0
  180. package/tests/adapter/LocalBusPubSubTest.res +81 -0
  181. package/tests/adapter/LocalBusPubSubTest.res.mjs +81 -0
  182. package/tests/adapter/QueryDbGsiTtlTest.res +268 -0
  183. package/tests/adapter/QueryDbGsiTtlTest.res.mjs +209 -0
  184. package/tests/adapter/QueryDbListResolverTest.res +361 -0
  185. package/tests/adapter/QueryDbListResolverTest.res.mjs +426 -0
  186. package/tests/adapter/QueryDbStorageSqliteTest.res +159 -0
  187. package/tests/adapter/QueryDbStorageSqliteTest.res.mjs +126 -0
  188. package/tests/adapter/QueryDbStorageTest.res +171 -0
  189. package/tests/adapter/QueryDbStorageTest.res.mjs +170 -0
  190. package/tests/adapter/QueryEngineTest.res +152 -0
  191. package/tests/adapter/QueryEngineTest.res.mjs +148 -0
  192. package/tests/adapter/ScheduledPublisherTest.res +199 -0
  193. package/tests/adapter/ScheduledPublisherTest.res.mjs +203 -0
  194. package/tests/adapter/SortKey_FilterTest.res +103 -0
  195. package/tests/adapter/SortKey_FilterTest.res.mjs +135 -0
  196. package/tests/adapter/SqliteDriverTest.res +86 -0
  197. package/tests/adapter/SqliteDriverTest.res.mjs +101 -0
  198. package/tests/adapter/TaskBucketSqliteTest.res +44 -0
  199. package/tests/adapter/TaskBucketSqliteTest.res.mjs +40 -0
  200. package/tests/adapter/TaskBucketTest.res +106 -0
  201. package/tests/adapter/TaskBucketTest.res.mjs +118 -0
  202. package/tests/components/aggregate/AggregateFixtures.res +78 -0
  203. package/tests/components/aggregate/AggregateFixtures.res.mjs +109 -0
  204. package/tests/components/aggregate/AggregateTest.res +129 -0
  205. package/tests/components/aggregate/AggregateTest.res.mjs +129 -0
  206. package/tests/components/automationslice/AutomationSliceCallbackTest.res +212 -0
  207. package/tests/components/automationslice/AutomationSliceCallbackTest.res.mjs +233 -0
  208. package/tests/components/automationslice/AutomationSliceFixtures.res +189 -0
  209. package/tests/components/automationslice/AutomationSliceFixtures.res.mjs +276 -0
  210. package/tests/components/automationslice/AutomationSliceSelfDeadlockFixtures.res +289 -0
  211. package/tests/components/automationslice/AutomationSliceSelfDeadlockFixtures.res.mjs +453 -0
  212. package/tests/components/automationslice/AutomationSliceSelfDeadlockTest.res +47 -0
  213. package/tests/components/automationslice/AutomationSliceSelfDeadlockTest.res.mjs +31 -0
  214. package/tests/components/automationslice/MixedSourceAutomationSliceFixtures.res +213 -0
  215. package/tests/components/automationslice/MixedSourceAutomationSliceFixtures.res.mjs +268 -0
  216. package/tests/components/automationslice/MixedSourceAutomationSliceTest.res +118 -0
  217. package/tests/components/automationslice/MixedSourceAutomationSliceTest.res.mjs +99 -0
  218. package/tests/components/commandgenerator/CommandGeneratorFixtures.res +73 -0
  219. package/tests/components/commandgenerator/CommandGeneratorFixtures.res.mjs +109 -0
  220. package/tests/components/commandgenerator/CommandGeneratorTest.res +43 -0
  221. package/tests/components/commandgenerator/CommandGeneratorTest.res.mjs +46 -0
  222. package/tests/components/commandtopic/CommandTopicFixtures.res +37 -0
  223. package/tests/components/commandtopic/CommandTopicFixtures.res.mjs +68 -0
  224. package/tests/components/commandtopic/CommandTopicStreamFixtures.res +43 -0
  225. package/tests/components/commandtopic/CommandTopicStreamFixtures.res.mjs +91 -0
  226. package/tests/components/commandtopic/CommandTopicStreamTest.res +30 -0
  227. package/tests/components/commandtopic/CommandTopicStreamTest.res.mjs +35 -0
  228. package/tests/components/commandtopic/CommandTopicTest.res +55 -0
  229. package/tests/components/commandtopic/CommandTopicTest.res.mjs +62 -0
  230. package/tests/components/counter/CounterFixtures.res +42 -0
  231. package/tests/components/counter/CounterFixtures.res.mjs +34 -0
  232. package/tests/components/counter/CounterTest.res +46 -0
  233. package/tests/components/counter/CounterTest.res.mjs +61 -0
  234. package/tests/components/dcb/DcbCrossPartitionFixtures.res +170 -0
  235. package/tests/components/dcb/DcbCrossPartitionFixtures.res.mjs +276 -0
  236. package/tests/components/dcb/DcbCrossPartitionReadTest.res +68 -0
  237. package/tests/components/dcb/DcbCrossPartitionReadTest.res.mjs +78 -0
  238. package/tests/components/dcb/DcbEventLogAppendStreamTest.res +72 -0
  239. package/tests/components/dcb/DcbEventLogAppendStreamTest.res.mjs +82 -0
  240. package/tests/components/dcb/DcbEventLogStreamTest.res +103 -0
  241. package/tests/components/dcb/DcbEventLogStreamTest.res.mjs +91 -0
  242. package/tests/components/dcb/DcbFixtures.res +145 -0
  243. package/tests/components/dcb/DcbFixtures.res.mjs +221 -0
  244. package/tests/components/dcb/DcbTest.res +55 -0
  245. package/tests/components/dcb/DcbTest.res.mjs +55 -0
  246. package/tests/components/eventcollector/EventCollectorFixtures.res +42 -0
  247. package/tests/components/eventcollector/EventCollectorFixtures.res.mjs +49 -0
  248. package/tests/components/eventcollector/EventCollectorTest.res +37 -0
  249. package/tests/components/eventcollector/EventCollectorTest.res.mjs +36 -0
  250. package/tests/components/eventlog/EventLogAppendStreamTest.res +93 -0
  251. package/tests/components/eventlog/EventLogAppendStreamTest.res.mjs +113 -0
  252. package/tests/components/eventlog/EventLogConflictTest.res +86 -0
  253. package/tests/components/eventlog/EventLogConflictTest.res.mjs +81 -0
  254. package/tests/components/eventlog/EventLogFixtures.res +52 -0
  255. package/tests/components/eventlog/EventLogFixtures.res.mjs +80 -0
  256. package/tests/components/eventlog/EventLogStreamTest.res +98 -0
  257. package/tests/components/eventlog/EventLogStreamTest.res.mjs +142 -0
  258. package/tests/components/eventlog/EventLogTest.res +53 -0
  259. package/tests/components/eventlog/EventLogTest.res.mjs +74 -0
  260. package/tests/components/eventtopic/EventTopicFixtures.res +47 -0
  261. package/tests/components/eventtopic/EventTopicFixtures.res.mjs +77 -0
  262. package/tests/components/eventtopic/EventTopicStreamFixtures.res +27 -0
  263. package/tests/components/eventtopic/EventTopicStreamFixtures.res.mjs +62 -0
  264. package/tests/components/eventtopic/EventTopicStreamTest.res +35 -0
  265. package/tests/components/eventtopic/EventTopicStreamTest.res.mjs +44 -0
  266. package/tests/components/eventtopic/EventTopicTest.res +35 -0
  267. package/tests/components/eventtopic/EventTopicTest.res.mjs +43 -0
  268. package/tests/components/extensionpoint/ExtensionPointFixtures.res +145 -0
  269. package/tests/components/extensionpoint/ExtensionPointFixtures.res.mjs +188 -0
  270. package/tests/components/extensionpoint/ExtensionPointTest.res +62 -0
  271. package/tests/components/extensionpoint/ExtensionPointTest.res.mjs +55 -0
  272. package/tests/components/heartbeat/HeartbeatFixtures.res +48 -0
  273. package/tests/components/heartbeat/HeartbeatFixtures.res.mjs +46 -0
  274. package/tests/components/heartbeat/HeartbeatTest.res +67 -0
  275. package/tests/components/heartbeat/HeartbeatTest.res.mjs +65 -0
  276. package/tests/components/inboundtranslationslice/InboundTranslationSliceCallbackTest.res +241 -0
  277. package/tests/components/inboundtranslationslice/InboundTranslationSliceCallbackTest.res.mjs +239 -0
  278. package/tests/components/inboundtranslationslice/InboundTranslationSliceFixtures.res +36 -0
  279. package/tests/components/inboundtranslationslice/InboundTranslationSliceFixtures.res.mjs +73 -0
  280. package/tests/components/outboundtranslationslice/OutboundTranslationSliceCallbackTest.res +191 -0
  281. package/tests/components/outboundtranslationslice/OutboundTranslationSliceCallbackTest.res.mjs +297 -0
  282. package/tests/components/outboundtranslationslice/OutboundTranslationSliceFixtures.res +78 -0
  283. package/tests/components/outboundtranslationslice/OutboundTranslationSliceFixtures.res.mjs +137 -0
  284. package/tests/components/querydb/QueryDbFixtures.res +39 -0
  285. package/tests/components/querydb/QueryDbFixtures.res.mjs +73 -0
  286. package/tests/components/querydb/QueryDbSubIdFixtures.res +44 -0
  287. package/tests/components/querydb/QueryDbSubIdFixtures.res.mjs +80 -0
  288. package/tests/components/querydb/QueryDbSubIdTest.res +104 -0
  289. package/tests/components/querydb/QueryDbSubIdTest.res.mjs +104 -0
  290. package/tests/components/querydb/QueryDbTest.res +81 -0
  291. package/tests/components/querydb/QueryDbTest.res.mjs +126 -0
  292. package/tests/components/readmodel/DcbReadModelE2EFixtures.res +215 -0
  293. package/tests/components/readmodel/DcbReadModelE2EFixtures.res.mjs +308 -0
  294. package/tests/components/readmodel/DcbReadModelE2ETest.res +45 -0
  295. package/tests/components/readmodel/DcbReadModelE2ETest.res.mjs +37 -0
  296. package/tests/components/readmodel/DcbReadModelTypoFailFastTest.res +88 -0
  297. package/tests/components/readmodel/DcbReadModelTypoFailFastTest.res.mjs +152 -0
  298. package/tests/components/readmodel/MixedSourceReadModelFixtures.res +181 -0
  299. package/tests/components/readmodel/MixedSourceReadModelFixtures.res.mjs +277 -0
  300. package/tests/components/readmodel/MixedSourceReadModelTest.res +61 -0
  301. package/tests/components/readmodel/MixedSourceReadModelTest.res.mjs +68 -0
  302. package/tests/components/readmodel/ReadModelFixtures.res +138 -0
  303. package/tests/components/readmodel/ReadModelFixtures.res.mjs +169 -0
  304. package/tests/components/readmodel/ReadModelTest.res +46 -0
  305. package/tests/components/readmodel/ReadModelTest.res.mjs +36 -0
  306. package/tests/components/scheduler/SchedulerFixtures.res +59 -0
  307. package/tests/components/scheduler/SchedulerFixtures.res.mjs +63 -0
  308. package/tests/components/scheduler/SchedulerTest.res +76 -0
  309. package/tests/components/scheduler/SchedulerTest.res.mjs +86 -0
  310. package/tests/components/sideeffecthandler/SideEffectHandlerFixtures.res +133 -0
  311. package/tests/components/sideeffecthandler/SideEffectHandlerFixtures.res.mjs +149 -0
  312. package/tests/components/sideeffecthandler/SideEffectHandlerTest.res +39 -0
  313. package/tests/components/sideeffecthandler/SideEffectHandlerTest.res.mjs +28 -0
  314. package/tests/components/stateviewslice/StateViewSliceFixtures.res +117 -0
  315. package/tests/components/stateviewslice/StateViewSliceFixtures.res.mjs +188 -0
  316. package/tests/components/stateviewslice/StateViewSliceSubIdFixtures.res +117 -0
  317. package/tests/components/stateviewslice/StateViewSliceSubIdFixtures.res.mjs +183 -0
  318. package/tests/components/stateviewslice/StateViewSliceSubIdTest.res +78 -0
  319. package/tests/components/stateviewslice/StateViewSliceSubIdTest.res.mjs +107 -0
  320. package/tests/components/stateviewslice/StateViewSliceTest.res +59 -0
  321. package/tests/components/stateviewslice/StateViewSliceTest.res.mjs +72 -0
  322. package/tests/components/task/TaskFixtures.res +87 -0
  323. package/tests/components/task/TaskFixtures.res.mjs +82 -0
  324. package/tests/components/task/TaskTest.res +98 -0
  325. package/tests/components/task/TaskTest.res.mjs +46 -0
  326. package/tests/plugin/PluginBehavior_GWT.res +146 -0
  327. package/tests/plugin/PluginBehavior_GWT.res.mjs +281 -0
  328. package/tests/plugin/Plugin_Fixtures.res +61 -0
  329. package/tests/plugin/Plugin_Fixtures.res.mjs +105 -0
  330. package/tests/plugin/PluginsProjection_GWT.res +95 -0
  331. package/tests/plugin/PluginsProjection_GWT.res.mjs +120 -0
  332. package/tests/plugin/UIFragmentRegistryProjection_GWT.res +72 -0
  333. package/tests/plugin/UIFragmentRegistryProjection_GWT.res.mjs +117 -0
  334. 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
+ })