@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,426 @@
1
+ // Generated by ReScript, PLEASE EDIT WITH CARE
2
+
3
+ import * as S from "sury/src/S.res.mjs";
4
+ import * as Stdlib_JSON from "@rescript/runtime/lib/es6/Stdlib_JSON.js";
5
+ import * as Id$Reventless from "@reventlessdev/reventless-spec/src/types/Id.res.mjs";
6
+ import * as Stdlib_Option from "@rescript/runtime/lib/es6/Stdlib_Option.js";
7
+ import * as Pulumi from "@pulumi/pulumi";
8
+ import * as Stdlib_JsError from "@rescript/runtime/lib/es6/Stdlib_JsError.js";
9
+ import * as DcbTag$Reventless from "@reventlessdev/reventless-spec/src/components/DcbTag.res.mjs";
10
+ import * as Identity$Reventless from "@reventlessdev/reventless-spec/src/types/Identity.res.mjs";
11
+ import * as ReadModel$Reventless from "@reventlessdev/reventless-spec/src/components/ReadModel.res.mjs";
12
+ import * as Component$ReventlessCore from "@reventlessdev/reventless-core/src/components/Component.res.mjs";
13
+ import * as LocalBus$ReventlessLocal from "../../src/adapter/LocalBus.res.mjs";
14
+ import * as TestRunner$ReventlessLocal from "../../src/test/TestRunner.res.mjs";
15
+ import * as StateAnnotations$Reventless from "@reventlessdev/reventless-spec/src/components/StateAnnotations.res.mjs";
16
+ import * as Plugin_Helpers$ReventlessCore from "@reventlessdev/reventless-core/src/plugin/component/Plugin_Helpers.res.mjs";
17
+ import * as QueryDb_Adapter$ReventlessCore from "@reventlessdev/reventless-core/src/components/QueryDb/QueryDb_Adapter.res.mjs";
18
+ import * as QueryDb_Builder$ReventlessCore from "@reventlessdev/reventless-core/src/components/QueryDb/QueryDb_Builder.res.mjs";
19
+ import * as DomainGraphQL_Server$ReventlessLocal from "../../src/adapter/DomainGraphQL_Server.res.mjs";
20
+ import * as QueryDbStorage_InMemory$ReventlessLocal from "../../src/adapter/QueryDb/QueryDbStorage_InMemory.res.mjs";
21
+ import * as QueryDbResolvers_GraphQL$ReventlessLocal from "../../src/adapter/QueryDb/QueryDbResolvers_GraphQL.res.mjs";
22
+
23
+ TestRunner$ReventlessLocal.setup();
24
+
25
+ let rowStateSchema = S.schema(s => ({
26
+ productId: s.m(DcbTag$Reventless.string),
27
+ status: s.m(S.string),
28
+ name: s.m(S.string)
29
+ }));
30
+
31
+ let rowStateSchemaWithAnnotations = S.Metadata.set(rowStateSchema, StateAnnotations$Reventless.stateAnnotationsId, {
32
+ ids: ["productId"],
33
+ compositeIds: [],
34
+ subIds: [],
35
+ compositeSubIds: [],
36
+ indexes: [],
37
+ hidden: [],
38
+ summary: [],
39
+ drillTargets: [],
40
+ drillTargetKeys: [],
41
+ collapsed: [],
42
+ scan: ["status"],
43
+ scanSort: ["name"],
44
+ status: undefined,
45
+ visibility: undefined
46
+ });
47
+
48
+ let newrecord = {...Identity$Reventless.anonymous};
49
+
50
+ let emptyCtx = Object.fromEntries([
51
+ [
52
+ "request",
53
+ Object.fromEntries([[
54
+ "headers",
55
+ {}
56
+ ]])
57
+ ],
58
+ [
59
+ "identity",
60
+ (newrecord.groups = ["User"], newrecord.username = "test-user", newrecord.userId = "test-user", newrecord)
61
+ ]
62
+ ]);
63
+
64
+ function argsOf(entries) {
65
+ return Object.fromEntries(entries);
66
+ }
67
+
68
+ function strJson(prim) {
69
+ return prim;
70
+ }
71
+
72
+ function numJson(n) {
73
+ return n;
74
+ }
75
+
76
+ function getField(json, key) {
77
+ return Stdlib_Option.flatMap(Stdlib_JSON.Decode.object(json), d => d[key]);
78
+ }
79
+
80
+ function getString(json, key) {
81
+ return Stdlib_Option.flatMap(getField(json, key), Stdlib_JSON.Decode.string);
82
+ }
83
+
84
+ function getEdges(response) {
85
+ return Stdlib_Option.getOr(Stdlib_Option.flatMap(getField(response, "edges"), Stdlib_JSON.Decode.array), []);
86
+ }
87
+
88
+ function edgeCursor(edge) {
89
+ return Stdlib_Option.getOr(getString(edge, "cursor"), "");
90
+ }
91
+
92
+ function edgeNodeField(edge, field) {
93
+ return Stdlib_Option.getOr(Stdlib_Option.flatMap(getField(edge, "node"), n => getString(n, field)), "");
94
+ }
95
+
96
+ function pageInfo(response) {
97
+ return Stdlib_Option.getOr(getField(response, "pageInfo"), null);
98
+ }
99
+
100
+ function pageInfoBool(response, key) {
101
+ return Stdlib_Option.getOr(Stdlib_Option.flatMap(getField(pageInfo(response), key), Stdlib_JSON.Decode.bool), false);
102
+ }
103
+
104
+ function pageInfoString(response, key) {
105
+ return getString(pageInfo(response), key);
106
+ }
107
+
108
+ async function buildFixture(name) {
109
+ let Bus = LocalBus$ReventlessLocal.Make({});
110
+ let Storage = QueryDbStorage_InMemory$ReventlessLocal.Make(Bus);
111
+ let Resolvers = QueryDbResolvers_GraphQL$ReventlessLocal.Make(Bus);
112
+ let moduleUrl = import.meta.url;
113
+ let config = ReadModel$Reventless.config(undefined, undefined, undefined);
114
+ let QDbResolversAdapter = QueryDb_Adapter$ReventlessCore.NoResolvers({
115
+ make: Storage.make
116
+ });
117
+ let Maker = QueryDb_Builder$ReventlessCore.Make({
118
+ Id: {
119
+ schema: Id$Reventless.StringPure.schema,
120
+ make: prim => prim,
121
+ makeFromString: prim => prim,
122
+ toString: prim => prim,
123
+ cmp: Id$Reventless.StringPure.cmp
124
+ },
125
+ name: name,
126
+ moduleUrl: moduleUrl,
127
+ stateSchema: rowStateSchema,
128
+ config: config,
129
+ subIdConfig: undefined,
130
+ authorization: "AllowAuthenticated",
131
+ visibility: "Public"
132
+ })({
133
+ make: Storage.make
134
+ })(QDbResolversAdapter);
135
+ let listFieldName = name + "s";
136
+ Plugin_Helpers$ReventlessCore.queryFieldNamesRegistry[name] = {
137
+ singleFieldName: name,
138
+ listFieldName: listFieldName,
139
+ returnTypeName: name,
140
+ pluralTypeName: "[" + name + "]",
141
+ includeIdParam: true,
142
+ connectionSpec: true
143
+ };
144
+ Plugin_Helpers$ReventlessCore.stateSchemaRegistry[name] = rowStateSchemaWithAnnotations;
145
+ let queryDb = Maker.make(undefined, undefined, undefined, undefined);
146
+ let ops = await TestRunner$ReventlessLocal.resolve(Component$ReventlessCore.operations(queryDb));
147
+ Resolvers.make(name, undefined, undefined, Pulumi.output(""), [], undefined, [], [], "AllowAuthenticated", {});
148
+ let r = DomainGraphQL_Server$ReventlessLocal.getQueryResolver(listFieldName);
149
+ let resolver = r !== undefined ? r : Stdlib_JsError.throwWithMessage("resolver not registered: " + listFieldName);
150
+ let rows = [
151
+ [
152
+ "p-1",
153
+ "active",
154
+ "Charlie"
155
+ ],
156
+ [
157
+ "p-2",
158
+ "active",
159
+ "Alpha"
160
+ ],
161
+ [
162
+ "p-3",
163
+ "inactive",
164
+ "Echo"
165
+ ],
166
+ [
167
+ "p-4",
168
+ "active",
169
+ "Bravo"
170
+ ],
171
+ [
172
+ "p-5",
173
+ "inactive",
174
+ "Delta"
175
+ ]
176
+ ];
177
+ for (let i = 0, i_finish = rows.length; i < i_finish; ++i) {
178
+ let match = rows[i];
179
+ let pid = match[0];
180
+ await ops.save(pid, {
181
+ productId: pid,
182
+ status: match[1],
183
+ name: match[2]
184
+ }, "Init", undefined);
185
+ }
186
+ return [
187
+ resolver,
188
+ listFieldName
189
+ ];
190
+ }
191
+
192
+ globalThis.describe("QueryDb list resolver — keyset pagination", () => {
193
+ globalThis.beforeEach(() => DomainGraphQL_Server$ReventlessLocal.reset());
194
+ globalThis.test("first: 2 over a 5-row fixture returns 2 edges and hasNextPage = true", async () => {
195
+ let match = await buildFixture("PageA");
196
+ let response = await match[0](null, Object.fromEntries([[
197
+ "first",
198
+ 2
199
+ ]]), emptyCtx);
200
+ let edges = getEdges(response);
201
+ globalThis.expect(edges.length).toBe(2);
202
+ globalThis.expect(pageInfoBool(response, "hasNextPage")).toBe(true);
203
+ globalThis.expect(pageInfoBool(response, "hasPreviousPage")).toBe(false);
204
+ globalThis.expect(edgeNodeField(edges[0], "productId")).toBe("p-1");
205
+ globalThis.expect(edgeNodeField(edges[1], "productId")).toBe("p-2");
206
+ });
207
+ globalThis.test("after: <endCursor> walks forward without overlap", async () => {
208
+ let match = await buildFixture("PageB");
209
+ let resolver = match[0];
210
+ let page1 = await resolver(null, Object.fromEntries([[
211
+ "first",
212
+ 2
213
+ ]]), emptyCtx);
214
+ let endCursor1 = Stdlib_Option.getOr(getString(pageInfo(page1), "endCursor"), "");
215
+ let page2 = await resolver(null, Object.fromEntries([
216
+ [
217
+ "first",
218
+ 2
219
+ ],
220
+ [
221
+ "after",
222
+ endCursor1
223
+ ]
224
+ ]), emptyCtx);
225
+ let edges2 = getEdges(page2);
226
+ globalThis.expect(edges2.length).toBe(2);
227
+ globalThis.expect(edgeNodeField(edges2[0], "productId")).toBe("p-3");
228
+ globalThis.expect(edgeNodeField(edges2[1], "productId")).toBe("p-4");
229
+ globalThis.expect(pageInfoBool(page2, "hasNextPage")).toBe(true);
230
+ let endCursor2 = Stdlib_Option.getOr(getString(pageInfo(page2), "endCursor"), "");
231
+ let page3 = await resolver(null, Object.fromEntries([
232
+ [
233
+ "first",
234
+ 2
235
+ ],
236
+ [
237
+ "after",
238
+ endCursor2
239
+ ]
240
+ ]), emptyCtx);
241
+ let edges3 = getEdges(page3);
242
+ globalThis.expect(edges3.length).toBe(1);
243
+ globalThis.expect(edgeNodeField(edges3[0], "productId")).toBe("p-5");
244
+ globalThis.expect(pageInfoBool(page3, "hasNextPage")).toBe(false);
245
+ });
246
+ globalThis.test("last + before walks backward and flips hasPreviousPage", async () => {
247
+ let match = await buildFixture("PageC");
248
+ let resolver = match[0];
249
+ let page1 = await resolver(null, Object.fromEntries([[
250
+ "first",
251
+ 2
252
+ ]]), emptyCtx);
253
+ let endCursor1 = Stdlib_Option.getOr(getString(pageInfo(page1), "endCursor"), "");
254
+ let page2 = await resolver(null, Object.fromEntries([
255
+ [
256
+ "first",
257
+ 2
258
+ ],
259
+ [
260
+ "after",
261
+ endCursor1
262
+ ]
263
+ ]), emptyCtx);
264
+ let endCursor2 = Stdlib_Option.getOr(getString(pageInfo(page2), "endCursor"), "");
265
+ let page3 = await resolver(null, Object.fromEntries([
266
+ [
267
+ "first",
268
+ 2
269
+ ],
270
+ [
271
+ "after",
272
+ endCursor2
273
+ ]
274
+ ]), emptyCtx);
275
+ let startCursor3 = Stdlib_Option.getOr(getString(pageInfo(page3), "startCursor"), "");
276
+ let backPage = await resolver(null, Object.fromEntries([
277
+ [
278
+ "last",
279
+ 2
280
+ ],
281
+ [
282
+ "before",
283
+ startCursor3
284
+ ]
285
+ ]), emptyCtx);
286
+ let backEdges = getEdges(backPage);
287
+ globalThis.expect(backEdges.length).toBe(2);
288
+ globalThis.expect(edgeNodeField(backEdges[0], "productId")).toBe("p-3");
289
+ globalThis.expect(edgeNodeField(backEdges[1], "productId")).toBe("p-4");
290
+ globalThis.expect(pageInfoBool(backPage, "hasPreviousPage")).toBe(true);
291
+ globalThis.expect(pageInfoBool(backPage, "hasNextPage")).toBe(false);
292
+ let backStart = Stdlib_Option.getOr(getString(pageInfo(backPage), "startCursor"), "");
293
+ let firstPage = await resolver(null, Object.fromEntries([
294
+ [
295
+ "last",
296
+ 2
297
+ ],
298
+ [
299
+ "before",
300
+ backStart
301
+ ]
302
+ ]), emptyCtx);
303
+ let firstEdges = getEdges(firstPage);
304
+ globalThis.expect(firstEdges.length).toBe(2);
305
+ globalThis.expect(edgeNodeField(firstEdges[0], "productId")).toBe("p-1");
306
+ globalThis.expect(edgeNodeField(firstEdges[1], "productId")).toBe("p-2");
307
+ globalThis.expect(pageInfoBool(firstPage, "hasPreviousPage")).toBe(false);
308
+ });
309
+ globalThis.test("filter.<field>Eq + first / after paginates only the narrowed subset", async () => {
310
+ let match = await buildFixture("PageD");
311
+ let resolver = match[0];
312
+ let activeFilter = Object.fromEntries([[
313
+ "statusEq",
314
+ "active"
315
+ ]]);
316
+ let page1 = await resolver(null, Object.fromEntries([
317
+ [
318
+ "filter",
319
+ activeFilter
320
+ ],
321
+ [
322
+ "first",
323
+ 2
324
+ ]
325
+ ]), emptyCtx);
326
+ let edges1 = getEdges(page1);
327
+ globalThis.expect(edges1.length).toBe(2);
328
+ globalThis.expect(edgeNodeField(edges1[0], "productId")).toBe("p-1");
329
+ globalThis.expect(edgeNodeField(edges1[1], "productId")).toBe("p-2");
330
+ globalThis.expect(pageInfoBool(page1, "hasNextPage")).toBe(true);
331
+ let endCursor1 = Stdlib_Option.getOr(getString(pageInfo(page1), "endCursor"), "");
332
+ let page2 = await resolver(null, Object.fromEntries([
333
+ [
334
+ "filter",
335
+ activeFilter
336
+ ],
337
+ [
338
+ "first",
339
+ 2
340
+ ],
341
+ [
342
+ "after",
343
+ endCursor1
344
+ ]
345
+ ]), emptyCtx);
346
+ let edges2 = getEdges(page2);
347
+ globalThis.expect(edges2.length).toBe(1);
348
+ globalThis.expect(edgeNodeField(edges2[0], "productId")).toBe("p-4");
349
+ globalThis.expect(pageInfoBool(page2, "hasNextPage")).toBe(false);
350
+ });
351
+ globalThis.test("orderBy DESC + first / after paginates the reverse-sorted view", async () => {
352
+ let match = await buildFixture("PageE");
353
+ let resolver = match[0];
354
+ let orderBy = Object.fromEntries([
355
+ [
356
+ "field",
357
+ "name"
358
+ ],
359
+ [
360
+ "direction",
361
+ "DESC"
362
+ ]
363
+ ]);
364
+ let page1 = await resolver(null, Object.fromEntries([
365
+ [
366
+ "orderBy",
367
+ orderBy
368
+ ],
369
+ [
370
+ "first",
371
+ 2
372
+ ]
373
+ ]), emptyCtx);
374
+ let edges1 = getEdges(page1);
375
+ globalThis.expect(edges1.length).toBe(2);
376
+ globalThis.expect(edgeNodeField(edges1[0], "name")).toBe("Echo");
377
+ globalThis.expect(edgeNodeField(edges1[1], "name")).toBe("Delta");
378
+ globalThis.expect(pageInfoBool(page1, "hasNextPage")).toBe(true);
379
+ let endCursor1 = Stdlib_Option.getOr(getString(pageInfo(page1), "endCursor"), "");
380
+ let page2 = await resolver(null, Object.fromEntries([
381
+ [
382
+ "orderBy",
383
+ orderBy
384
+ ],
385
+ [
386
+ "first",
387
+ 2
388
+ ],
389
+ [
390
+ "after",
391
+ endCursor1
392
+ ]
393
+ ]), emptyCtx);
394
+ let edges2 = getEdges(page2);
395
+ globalThis.expect(edges2.length).toBe(2);
396
+ globalThis.expect(edgeNodeField(edges2[0], "name")).toBe("Charlie");
397
+ globalThis.expect(edgeNodeField(edges2[1], "name")).toBe("Bravo");
398
+ });
399
+ globalThis.test("bare request (no first / after) returns a single bounded page", async () => {
400
+ let match = await buildFixture("PageF");
401
+ let response = await match[0](null, Object.fromEntries([]), emptyCtx);
402
+ let edges = getEdges(response);
403
+ globalThis.expect(edges.length).toBe(5);
404
+ globalThis.expect(pageInfoBool(response, "hasNextPage")).toBe(false);
405
+ globalThis.expect(pageInfoBool(response, "hasPreviousPage")).toBe(false);
406
+ });
407
+ });
408
+
409
+ export {
410
+ rowStateSchema,
411
+ rowStateSchemaWithAnnotations,
412
+ emptyCtx,
413
+ argsOf,
414
+ strJson,
415
+ numJson,
416
+ getField,
417
+ getString,
418
+ getEdges,
419
+ edgeCursor,
420
+ edgeNodeField,
421
+ pageInfo,
422
+ pageInfoBool,
423
+ pageInfoString,
424
+ buildFixture,
425
+ }
426
+ /* Not a pure module */
@@ -0,0 +1,159 @@
1
+ // Round-trip test for QueryDbStorage_Sqlite.
2
+
3
+ open JestGlobals
4
+
5
+ let _ = TestRunner.setup()
6
+ let opts: Pulumi.CustomResourceOptions.t = {}
7
+
8
+ let makeFreshDb = () => SqliteDriver.openDb(~path=":memory:")
9
+
10
+ describe("QueryDbStorage_Sqlite", () => {
11
+ testPromise("save then loadStream round-trips an item", async () => {
12
+ module TestBus = LocalBus.Make()
13
+ module DbProvider = {
14
+ let db = makeFreshDb()
15
+ }
16
+ module Storage = QueryDbStorage_Sqlite.Make(TestBus, DbProvider)
17
+
18
+ let s = Storage.make(~name="rm1", ~indexes=[], ~api=(), ~apiRole=(), ~opts)
19
+ let ops = await s.operations->TestRunner.resolve
20
+
21
+ let _ = await ops.save(
22
+ "id1",
23
+ JSON.Encode.string("value1"),
24
+ ReventlessCore.QueryDb.Any,
25
+ None,
26
+ )
27
+
28
+ let items =
29
+ await ops.loadStream("id1")
30
+ ->Stream.runCollect
31
+ ->Effect.catchAll(_ => Effect.succeed([]))
32
+ ->Effect.runPromise
33
+
34
+ expect(items->Array.length)->toBe(1)
35
+ expect(items->Array.getUnsafe(0))->toEqual(JSON.Encode.string("value1"))
36
+ })
37
+
38
+ testPromise("save overwrites existing item at same (id, subKey)", async () => {
39
+ module TestBus = LocalBus.Make()
40
+ module DbProvider = {
41
+ let db = makeFreshDb()
42
+ }
43
+ module Storage = QueryDbStorage_Sqlite.Make(TestBus, DbProvider)
44
+
45
+ let s = Storage.make(~name="rm2", ~indexes=[], ~api=(), ~apiRole=(), ~opts)
46
+ let ops = await s.operations->TestRunner.resolve
47
+
48
+ let _ = await ops.save("k", JSON.Encode.string("a"), ReventlessCore.QueryDb.Any, None)
49
+ let _ = await ops.save("k", JSON.Encode.string("b"), ReventlessCore.QueryDb.Any, None)
50
+
51
+ let items =
52
+ await ops.loadStream("k")
53
+ ->Stream.runCollect
54
+ ->Effect.catchAll(_ => Effect.succeed([]))
55
+ ->Effect.runPromise
56
+
57
+ expect(items->Array.length)->toBe(1)
58
+ expect(items->Array.getUnsafe(0))->toEqual(JSON.Encode.string("b"))
59
+ })
60
+
61
+ testPromise("saveBatch atomically writes several items", async () => {
62
+ module TestBus = LocalBus.Make()
63
+ module DbProvider = {
64
+ let db = makeFreshDb()
65
+ }
66
+ module Storage = QueryDbStorage_Sqlite.Make(TestBus, DbProvider)
67
+
68
+ let s = Storage.make(~name="rm3", ~indexes=[], ~api=(), ~apiRole=(), ~opts)
69
+ let ops = await s.operations->TestRunner.resolve
70
+
71
+ let _ = await ops.saveBatch([
72
+ ("id1", JSON.Encode.string("one"), None),
73
+ ("id2", JSON.Encode.string("two"), None),
74
+ ("id3", JSON.Encode.string("three"), None),
75
+ ])
76
+
77
+ let items1 =
78
+ await ops.loadStream("id1")
79
+ ->Stream.runCollect
80
+ ->Effect.catchAll(_ => Effect.succeed([]))
81
+ ->Effect.runPromise
82
+ let items2 =
83
+ await ops.loadStream("id2")
84
+ ->Stream.runCollect
85
+ ->Effect.catchAll(_ => Effect.succeed([]))
86
+ ->Effect.runPromise
87
+ let items3 =
88
+ await ops.loadStream("id3")
89
+ ->Stream.runCollect
90
+ ->Effect.catchAll(_ => Effect.succeed([]))
91
+ ->Effect.runPromise
92
+
93
+ expect(items1->Array.length)->toBe(1)
94
+ expect(items2->Array.length)->toBe(1)
95
+ expect(items3->Array.length)->toBe(1)
96
+ })
97
+
98
+ testPromise("delete removes an item from a partition", async () => {
99
+ module TestBus = LocalBus.Make()
100
+ module DbProvider = {
101
+ let db = makeFreshDb()
102
+ }
103
+ module Storage = QueryDbStorage_Sqlite.Make(TestBus, DbProvider)
104
+
105
+ let s = Storage.make(~name="rm4", ~indexes=[], ~api=(), ~apiRole=(), ~opts)
106
+ let ops = await s.operations->TestRunner.resolve
107
+
108
+ let _ = await ops.save("k", JSON.Encode.string("a"), ReventlessCore.QueryDb.Any, None)
109
+ let _ = await ops.delete("k", None)
110
+
111
+ let items =
112
+ await ops.loadStream("k")
113
+ ->Stream.runCollect
114
+ ->Effect.catchAll(_ => Effect.succeed([]))
115
+ ->Effect.runPromise
116
+
117
+ expect(items->Array.length)->toBe(0)
118
+ })
119
+
120
+ testPromise("items persist across a file reopen", async () => {
121
+ let path = `/tmp/reventless-test-qdb-${Float.toString(Date.now())}.db`
122
+
123
+ // Session 1: write
124
+ {
125
+ module TestBus = LocalBus.Make()
126
+ module DbProvider = {
127
+ let db = SqliteDriver.openDb(~path)
128
+ }
129
+ module Storage = QueryDbStorage_Sqlite.Make(TestBus, DbProvider)
130
+ let s = Storage.make(~name="persist", ~indexes=[], ~api=(), ~apiRole=(), ~opts)
131
+ let ops = await s.operations->TestRunner.resolve
132
+ let _ = await ops.save(
133
+ "k",
134
+ JSON.Encode.string("hello"),
135
+ ReventlessCore.QueryDb.Any,
136
+ None,
137
+ )
138
+ DbProvider.db->SqliteDriver.close
139
+ }
140
+
141
+ // Session 2: read back
142
+ module TestBus2 = LocalBus.Make()
143
+ module DbProvider2 = {
144
+ let db = SqliteDriver.openDb(~path)
145
+ }
146
+ module Storage2 = QueryDbStorage_Sqlite.Make(TestBus2, DbProvider2)
147
+ let s2 = Storage2.make(~name="persist", ~indexes=[], ~api=(), ~apiRole=(), ~opts)
148
+ let ops2 = await s2.operations->TestRunner.resolve
149
+ let items =
150
+ await ops2.loadStream("k")
151
+ ->Stream.runCollect
152
+ ->Effect.catchAll(_ => Effect.succeed([]))
153
+ ->Effect.runPromise
154
+
155
+ expect(items->Array.length)->toBe(1)
156
+ expect(items->Array.getUnsafe(0))->toEqual(JSON.Encode.string("hello"))
157
+ DbProvider2.db->SqliteDriver.close
158
+ })
159
+ })