@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,169 @@
1
+ // Generated by ReScript, PLEASE EDIT WITH CARE
2
+
3
+ import * as S from "sury/src/S.res.mjs";
4
+ import * as Stream from "@reventlessdev/rescript-effect/src/Stream.res.mjs";
5
+ import * as Id$Reventless from "@reventlessdev/reventless-spec/src/types/Id.res.mjs";
6
+ import * as Effect from "effect/Effect";
7
+ import * as Pulumi from "@pulumi/pulumi";
8
+ import * as Message$Reventless from "@reventlessdev/reventless-spec/src/types/Message.res.mjs";
9
+ import * as ReadModel$Reventless from "@reventlessdev/reventless-spec/src/components/ReadModel.res.mjs";
10
+ import * as Projection$Reventless from "@reventlessdev/reventless-spec/src/types/Projection.res.mjs";
11
+ import * as Adapter$ReventlessInfra from "@reventlessdev/reventless-infra/src/adapter/Adapter.res.mjs";
12
+ import * as LocalBus$ReventlessLocal from "../../../src/adapter/LocalBus.res.mjs";
13
+ import * as TestRunner$ReventlessLocal from "../../../src/test/TestRunner.res.mjs";
14
+ import * as TestFixtures$ReventlessLocal from "../../TestFixtures.res.mjs";
15
+ import * as ReadModel_Builder$ReventlessLocal from "../../../src/components/ReadModel_Builder.res.mjs";
16
+
17
+ let name = "TestItemReadModel";
18
+
19
+ let moduleUrl = import.meta.url;
20
+
21
+ let stateSchema = S.schema(s => ({
22
+ name: s.m(S.string)
23
+ }));
24
+
25
+ let config = ReadModel$Reventless.config(undefined, undefined, undefined);
26
+
27
+ let ItemReadModelSpec = {
28
+ Id: undefined,
29
+ name: name,
30
+ moduleUrl: moduleUrl,
31
+ stateSchema: stateSchema,
32
+ config: config,
33
+ subIdConfig: undefined,
34
+ authorization: "AllowAuthenticated",
35
+ visibility: "Public"
36
+ };
37
+
38
+ let name$1 = "TestItemEventTopic";
39
+
40
+ let eventSchema = S.schema(s => ({
41
+ TAG: "ItemCreated",
42
+ name: s.m(S.string)
43
+ }));
44
+
45
+ let ItemEventSource = {
46
+ Id: undefined,
47
+ name: name$1,
48
+ eventSchema: eventSchema
49
+ };
50
+
51
+ function project(msg) {
52
+ let match = msg.event;
53
+ return {
54
+ TAG: "Create",
55
+ _0: msg.id,
56
+ _1: {
57
+ name: match.name
58
+ }
59
+ };
60
+ }
61
+
62
+ let ItemMapping = Projection$Reventless.Mapping.Make({
63
+ Id: Id$Reventless.$$String,
64
+ name: name$1,
65
+ eventSchema: eventSchema
66
+ })({
67
+ Id: Id$Reventless.$$String,
68
+ name: name,
69
+ stateSchema: stateSchema,
70
+ subIdConfig: undefined
71
+ })({
72
+ project: project
73
+ });
74
+
75
+ Projection$Reventless.Mappings.Make({
76
+ Id: Id$Reventless.$$String,
77
+ name: name,
78
+ stateSchema: stateSchema,
79
+ subIdConfig: undefined
80
+ });
81
+
82
+ let moduleUrl$1 = import.meta.url;
83
+
84
+ let mappings = [ItemMapping];
85
+
86
+ let ItemMappings = {
87
+ moduleUrl: moduleUrl$1,
88
+ mappings: mappings
89
+ };
90
+
91
+ let topicName = "TestItemEventTopic";
92
+
93
+ let topicResource = Adapter$ReventlessInfra.make(Pulumi.output(topicName), Pulumi.output(topicName), Pulumi.output(topicName), Pulumi.output("memory:InMemory"), undefined, undefined, undefined, undefined, undefined, undefined);
94
+
95
+ let allEventTopics = Object.fromEntries([[
96
+ topicName,
97
+ {
98
+ resources: [topicResource]
99
+ }
100
+ ]]);
101
+
102
+ let Bus = LocalBus$ReventlessLocal.Make({});
103
+
104
+ TestRunner$ReventlessLocal.setup();
105
+
106
+ let ReadModelMaker = ReadModel_Builder$ReventlessLocal.Make(Bus);
107
+
108
+ let ItemReadModel = ReadModelMaker.Make({
109
+ Id: Id$Reventless.$$String,
110
+ name: name,
111
+ moduleUrl: moduleUrl,
112
+ stateSchema: stateSchema,
113
+ config: config,
114
+ subIdConfig: undefined,
115
+ authorization: "AllowAuthenticated",
116
+ visibility: "Public"
117
+ })(ItemMappings);
118
+
119
+ let rm = ItemReadModel.make(undefined, undefined, allEventTopics, undefined);
120
+
121
+ let testMeta = TestFixtures$ReventlessLocal.makeTestMeta("TestItemEventTopic");
122
+
123
+ async function publishItemCreated(id, name) {
124
+ let eventJson = Object.fromEntries([
125
+ [
126
+ "id",
127
+ id
128
+ ],
129
+ [
130
+ "meta",
131
+ S.reverseConvertToJsonOrThrow(testMeta, Message$Reventless.metaSchema)
132
+ ],
133
+ [
134
+ "event",
135
+ S.reverseConvertToJsonOrThrow({
136
+ TAG: "ItemCreated",
137
+ name: name
138
+ }, eventSchema)
139
+ ]
140
+ ]);
141
+ return await Bus.publishEvent(topicName, "test", testMeta, eventJson);
142
+ }
143
+
144
+ async function loadState(id) {
145
+ let ops = Bus.getQueryDb("TestItemReadModel");
146
+ if (ops === undefined) {
147
+ return [];
148
+ }
149
+ let states = await Effect.runPromise(Effect.catchAll(Stream.runCollect(ops.loadStream(id)), param => Effect.succeed([])));
150
+ return states.map(json => S.parseJsonOrThrow(json, stateSchema));
151
+ }
152
+
153
+ export {
154
+ ItemReadModelSpec,
155
+ ItemEventSource,
156
+ ItemMapping,
157
+ ItemMappings,
158
+ topicName,
159
+ topicResource,
160
+ allEventTopics,
161
+ Bus,
162
+ ReadModelMaker,
163
+ ItemReadModel,
164
+ rm,
165
+ testMeta,
166
+ publishItemCreated,
167
+ loadState,
168
+ }
169
+ /* moduleUrl Not a pure module */
@@ -0,0 +1,46 @@
1
+ // E2E tests for ReadModel_Builder.
2
+ // Verifies the full publish → EventCollector → projection → QueryDb pipeline.
3
+
4
+ open JestGlobals
5
+ open ReadModelFixtures
6
+
7
+ describe("ReadModel E2E", () => {
8
+ // Force Output chain resolution so EventCollectorChannel subscription is registered
9
+ // before the first test runs.
10
+ //
11
+ // Two resolves are needed:
12
+ // 1. rm.operations chain — triggers the outer queryDb.operations.apply(...) which
13
+ // calls EventCollectorChannel.connect() as a side effect.
14
+ // 2. topicResource.name — resolves the inner resource.name.apply(...) inside connect,
15
+ // which registers the Bus.subscribeToEvents handler.
16
+ let _ = beforeAllAsync(async () => {
17
+ let _ = await rm->ItemReadModel.operations->TestRunner.resolve
18
+ let _ = await topicResource.name->TestRunner.resolve
19
+ })
20
+
21
+ testPromise("ItemCreated event projects into ReadModel state", async () => {
22
+ let _ = await publishItemCreated("item-1", "Widget")
23
+ let states = await loadState("item-1")
24
+ expect(states->Array.length)->toBe(1)
25
+ let state = states->Array.getUnsafe(0)
26
+ expect(state.name)->toBe("Widget")
27
+ })
28
+
29
+ testPromise("query for unknown ID returns empty", async () => {
30
+ let states = await loadState("unknown-id")
31
+ expect(states->Array.length)->toBe(0)
32
+ })
33
+
34
+ testPromise("multiple events project independently", async () => {
35
+ let _ = await publishItemCreated("item-2", "Gadget")
36
+ let _ = await publishItemCreated("item-3", "Doohickey")
37
+ let states2 = await loadState("item-2")
38
+ let states3 = await loadState("item-3")
39
+ expect(states2->Array.length)->toBe(1)
40
+ expect(states3->Array.length)->toBe(1)
41
+ let state2 = states2->Array.getUnsafe(0)
42
+ let state3 = states3->Array.getUnsafe(0)
43
+ expect(state2.name)->toBe("Gadget")
44
+ expect(state3.name)->toBe("Doohickey")
45
+ })
46
+ })
@@ -0,0 +1,36 @@
1
+ // Generated by ReScript, PLEASE EDIT WITH CARE
2
+
3
+ import * as TestRunner$ReventlessLocal from "../../../src/test/TestRunner.res.mjs";
4
+ import * as ReadModelFixtures$ReventlessLocal from "./ReadModelFixtures.res.mjs";
5
+
6
+ globalThis.describe("ReadModel E2E", () => {
7
+ globalThis.beforeAll(async () => {
8
+ await TestRunner$ReventlessLocal.resolve(ReadModelFixtures$ReventlessLocal.ItemReadModel.operations(ReadModelFixtures$ReventlessLocal.rm));
9
+ await TestRunner$ReventlessLocal.resolve(ReadModelFixtures$ReventlessLocal.topicResource.name);
10
+ });
11
+ globalThis.test("ItemCreated event projects into ReadModel state", async () => {
12
+ await ReadModelFixtures$ReventlessLocal.publishItemCreated("item-1", "Widget");
13
+ let states = await ReadModelFixtures$ReventlessLocal.loadState("item-1");
14
+ globalThis.expect(states.length).toBe(1);
15
+ let state = states[0];
16
+ globalThis.expect(state.name).toBe("Widget");
17
+ });
18
+ globalThis.test("query for unknown ID returns empty", async () => {
19
+ let states = await ReadModelFixtures$ReventlessLocal.loadState("unknown-id");
20
+ globalThis.expect(states.length).toBe(0);
21
+ });
22
+ globalThis.test("multiple events project independently", async () => {
23
+ await ReadModelFixtures$ReventlessLocal.publishItemCreated("item-2", "Gadget");
24
+ await ReadModelFixtures$ReventlessLocal.publishItemCreated("item-3", "Doohickey");
25
+ let states2 = await ReadModelFixtures$ReventlessLocal.loadState("item-2");
26
+ let states3 = await ReadModelFixtures$ReventlessLocal.loadState("item-3");
27
+ globalThis.expect(states2.length).toBe(1);
28
+ globalThis.expect(states3.length).toBe(1);
29
+ let state2 = states2[0];
30
+ let state3 = states3[0];
31
+ globalThis.expect(state2.name).toBe("Gadget");
32
+ globalThis.expect(state3.name).toBe("Doohickey");
33
+ });
34
+ });
35
+
36
+ /* Not a pure module */
@@ -0,0 +1,59 @@
1
+ // Fixtures for Scheduler component integration tests.
2
+ // Uses LocalScheduledPublisher + Scheduler_Builder to verify schedule lifecycle.
3
+
4
+ open TestFixtures
5
+ open JestGlobals
6
+
7
+ // Activate Pulumi mock mode (must be called before any Component.make)
8
+ let _ = TestRunner.setup()
9
+
10
+ // ─────────────────────────────────────────────────────────────
11
+ // Isolated bus + scheduled publisher + scheduler maker
12
+ // ─────────────────────────────────────────────────────────────
13
+
14
+ module Bus = LocalBus.Make()
15
+ module SP = LocalScheduledPublisher.Make(Bus)
16
+ module SchedulerMaker = ReventlessCore.Scheduler_Builder.Make(SP)
17
+
18
+ // ─────────────────────────────────────────────────────────────
19
+ // Build the scheduler component (shared across tests)
20
+ // ─────────────────────────────────────────────────────────────
21
+
22
+ let scheduler = SchedulerMaker.make()
23
+
24
+ // ─────────────────────────────────────────────────────────────
25
+ // Helper: resolved Adapter.resolvedResource for a named bus topic
26
+ // ─────────────────────────────────────────────────────────────
27
+
28
+ let makeTopicResource = (name: string): ReventlessInfra.Adapter.resolvedResource => {
29
+ name,
30
+ id: name,
31
+ urn: name,
32
+ resourceInfo: NoInfo,
33
+ service: "memory:InMemory",
34
+ role: "",
35
+ region: "",
36
+ resourceType: "",
37
+ configuration: Dict.make(),
38
+ tags: Dict.make(),
39
+ }
40
+
41
+ let _ = beforeAll(() => {
42
+ jest->useFakeTimers
43
+ })
44
+
45
+ let _ = afterAll(() => {
46
+ SP.reset()
47
+ jest->useRealTimers
48
+ })
49
+
50
+ // ─────────────────────────────────────────────────────────────
51
+ // Resolve scheduler operations once for all tests
52
+ // ─────────────────────────────────────────────────────────────
53
+
54
+ let schedulerOps: ref<option<ReventlessInfra.Scheduler.operations>> = ref(None)
55
+
56
+ let _ = beforeAllAsync(async () => {
57
+ let ops = await scheduler->ReventlessCore.Component.operations->TestRunner.resolve
58
+ schedulerOps := Some(ops)
59
+ })
@@ -0,0 +1,63 @@
1
+ // Generated by ReScript, PLEASE EDIT WITH CARE
2
+
3
+ import * as Globals from "@jest/globals";
4
+ import * as Component$ReventlessCore from "@reventlessdev/reventless-core/src/components/Component.res.mjs";
5
+ import * as LocalBus$ReventlessLocal from "../../../src/adapter/LocalBus.res.mjs";
6
+ import * as TestRunner$ReventlessLocal from "../../../src/test/TestRunner.res.mjs";
7
+ import * as Scheduler_Builder$ReventlessCore from "@reventlessdev/reventless-core/src/components/Scheduler/Scheduler_Builder.res.mjs";
8
+ import * as LocalScheduledPublisher$ReventlessLocal from "../../../src/adapter/Scheduler/LocalScheduledPublisher.res.mjs";
9
+
10
+ TestRunner$ReventlessLocal.setup();
11
+
12
+ let Bus = LocalBus$ReventlessLocal.Make({});
13
+
14
+ let SP = LocalScheduledPublisher$ReventlessLocal.Make(Bus);
15
+
16
+ let SchedulerMaker = Scheduler_Builder$ReventlessCore.Make({
17
+ make: SP.make
18
+ });
19
+
20
+ let scheduler = SchedulerMaker.make(undefined);
21
+
22
+ function makeTopicResource(name) {
23
+ return {
24
+ name: name,
25
+ id: name,
26
+ urn: name,
27
+ resourceInfo: "NoInfo",
28
+ service: "memory:InMemory",
29
+ role: "",
30
+ region: "",
31
+ resourceType: "",
32
+ configuration: {},
33
+ tags: {}
34
+ };
35
+ }
36
+
37
+ globalThis.beforeAll(() => {
38
+ Globals.jest.useFakeTimers();
39
+ });
40
+
41
+ globalThis.afterAll(() => {
42
+ SP.reset();
43
+ Globals.jest.useRealTimers();
44
+ });
45
+
46
+ let schedulerOps = {
47
+ contents: undefined
48
+ };
49
+
50
+ globalThis.beforeAll(async () => {
51
+ let ops = await TestRunner$ReventlessLocal.resolve(Component$ReventlessCore.operations(scheduler));
52
+ schedulerOps.contents = ops;
53
+ });
54
+
55
+ export {
56
+ Bus,
57
+ SP,
58
+ SchedulerMaker,
59
+ scheduler,
60
+ makeTopicResource,
61
+ schedulerOps,
62
+ }
63
+ /* Not a pure module */
@@ -0,0 +1,76 @@
1
+ // Integration tests for Scheduler_Builder (in-memory).
2
+ // Verifies that createSchedule fires events and deleteSchedule prevents firing.
3
+ // Adapter-level timer tests are in adapter/ScheduledPublisherTest.res.
4
+
5
+ open TestFixtures
6
+ open JestGlobals
7
+ open SchedulerFixtures
8
+
9
+ describe("Scheduler_Builder.Make:", () => {
10
+ let _ = afterEach(() => SP.reset())
11
+
12
+ describe("createSchedule:", () => {
13
+ testPromise("recurring schedule fires event on each interval advance", async () => {
14
+ let ops = schedulerOps.contents->Option.getUnsafe
15
+ let count = ref(0)
16
+ Bus.subscribeToEvents("sched-recurring", async (_, _, _) => {
17
+ count := count.contents + 1
18
+ })
19
+ // createSchedule async body has no await — setInterval registered synchronously
20
+ let _ = ops.createSchedule(
21
+ [makeTopicResource("sched-recurring")],
22
+ {name: "test-recurring", rate: Reventless.Schedule.Minutes(1), payload: "{}"},
23
+ )
24
+ // Two microtask ticks: publishEvent uses Effect.all(concurrency=unbounded) which forks
25
+ // child fibers via startFork — one tick runs the child fiber (Queue.offer),
26
+ // a second tick runs the drain fiber callback.
27
+ jest->advanceTimersByTime(60 * 1000)
28
+ let _ = await Promise.resolve(())
29
+ let _ = await Promise.resolve(())
30
+ expect(count.contents)->toBe(1)
31
+ jest->advanceTimersByTime(60 * 1000)
32
+ let _ = await Promise.resolve(())
33
+ let _ = await Promise.resolve(())
34
+ expect(count.contents)->toBe(2)
35
+ })
36
+
37
+ testPromise("single-shot schedule fires once then stops", async () => {
38
+ let ops = schedulerOps.contents->Option.getUnsafe
39
+ let count = ref(0)
40
+ Bus.subscribeToEvents("sched-single", async (_, _, _) => {
41
+ count := count.contents + 1
42
+ })
43
+ let _ = ops.createSchedule(
44
+ [makeTopicResource("sched-single")],
45
+ {
46
+ name: "test-single",
47
+ rate: Reventless.Schedule.Single(2024, 1, 1, 0, 0),
48
+ payload: "{}",
49
+ },
50
+ )
51
+ jest->advanceTimersByTime(0)
52
+ let _ = await Promise.resolve(())
53
+ let _ = await Promise.resolve(())
54
+ expect(count.contents)->toBe(1)
55
+ jest->advanceTimersByTime(60 * 1000)
56
+ expect(count.contents)->toBe(1) // No further firing
57
+ })
58
+ })
59
+
60
+ describe("deleteSchedule:", () => {
61
+ testPromise("deleted schedule does not fire after deletion", async () => {
62
+ let ops = schedulerOps.contents->Option.getUnsafe
63
+ let count = ref(0)
64
+ Bus.subscribeToEvents("sched-delete", async (_, _, _) => {
65
+ count := count.contents + 1
66
+ })
67
+ let _ = ops.createSchedule(
68
+ [makeTopicResource("sched-delete")],
69
+ {name: "test-delete", rate: Reventless.Schedule.Minutes(2), payload: "{}"},
70
+ )
71
+ let _ = ops.deleteSchedule([], "test-delete")
72
+ jest->advanceTimersByTime(2 * 60 * 1000)
73
+ expect(count.contents)->toBe(0)
74
+ })
75
+ })
76
+ })
@@ -0,0 +1,86 @@
1
+ // Generated by ReScript, PLEASE EDIT WITH CARE
2
+
3
+ import * as Globals from "@jest/globals";
4
+ import * as SchedulerFixtures$ReventlessLocal from "./SchedulerFixtures.res.mjs";
5
+
6
+ globalThis.describe("Scheduler_Builder.Make:", () => {
7
+ globalThis.afterEach(() => SchedulerFixtures$ReventlessLocal.SP.reset());
8
+ globalThis.describe("createSchedule:", () => {
9
+ globalThis.test("recurring schedule fires event on each interval advance", async () => {
10
+ let ops = SchedulerFixtures$ReventlessLocal.schedulerOps.contents;
11
+ let count = {
12
+ contents: 0
13
+ };
14
+ SchedulerFixtures$ReventlessLocal.Bus.subscribeToEvents("sched-recurring", async (param, param$1, param$2) => {
15
+ count.contents = count.contents + 1 | 0;
16
+ });
17
+ ops.createSchedule([SchedulerFixtures$ReventlessLocal.makeTopicResource("sched-recurring")], {
18
+ name: "test-recurring",
19
+ rate: {
20
+ TAG: "Minutes",
21
+ _0: 1
22
+ },
23
+ payload: "{}"
24
+ });
25
+ Globals.jest.advanceTimersByTime(60000);
26
+ await Promise.resolve();
27
+ await Promise.resolve();
28
+ globalThis.expect(count.contents).toBe(1);
29
+ Globals.jest.advanceTimersByTime(60000);
30
+ await Promise.resolve();
31
+ await Promise.resolve();
32
+ globalThis.expect(count.contents).toBe(2);
33
+ });
34
+ globalThis.test("single-shot schedule fires once then stops", async () => {
35
+ let ops = SchedulerFixtures$ReventlessLocal.schedulerOps.contents;
36
+ let count = {
37
+ contents: 0
38
+ };
39
+ SchedulerFixtures$ReventlessLocal.Bus.subscribeToEvents("sched-single", async (param, param$1, param$2) => {
40
+ count.contents = count.contents + 1 | 0;
41
+ });
42
+ ops.createSchedule([SchedulerFixtures$ReventlessLocal.makeTopicResource("sched-single")], {
43
+ name: "test-single",
44
+ rate: {
45
+ TAG: "Single",
46
+ _0: 2024,
47
+ _1: 1,
48
+ _2: 1,
49
+ _3: 0,
50
+ _4: 0
51
+ },
52
+ payload: "{}"
53
+ });
54
+ Globals.jest.advanceTimersByTime(0);
55
+ await Promise.resolve();
56
+ await Promise.resolve();
57
+ globalThis.expect(count.contents).toBe(1);
58
+ Globals.jest.advanceTimersByTime(60000);
59
+ globalThis.expect(count.contents).toBe(1);
60
+ });
61
+ });
62
+ globalThis.describe("deleteSchedule:", () => {
63
+ globalThis.test("deleted schedule does not fire after deletion", async () => {
64
+ let ops = SchedulerFixtures$ReventlessLocal.schedulerOps.contents;
65
+ let count = {
66
+ contents: 0
67
+ };
68
+ SchedulerFixtures$ReventlessLocal.Bus.subscribeToEvents("sched-delete", async (param, param$1, param$2) => {
69
+ count.contents = count.contents + 1 | 0;
70
+ });
71
+ ops.createSchedule([SchedulerFixtures$ReventlessLocal.makeTopicResource("sched-delete")], {
72
+ name: "test-delete",
73
+ rate: {
74
+ TAG: "Minutes",
75
+ _0: 2
76
+ },
77
+ payload: "{}"
78
+ });
79
+ ops.deleteSchedule([], "test-delete");
80
+ Globals.jest.advanceTimersByTime(120000);
81
+ globalThis.expect(count.contents).toBe(0);
82
+ });
83
+ });
84
+ });
85
+
86
+ /* Not a pure module */
@@ -0,0 +1,133 @@
1
+ // Fixtures for SideEffectHandler integration tests.
2
+ // Publishes an event to the bus and verifies the side effect execute function is called.
3
+
4
+ open TestFixtures
5
+
6
+ S.enableJson()
7
+
8
+ // ─────────────────────────────────────────────────────────────
9
+ // Isolated bus + Pulumi mock mode
10
+ // ─────────────────────────────────────────────────────────────
11
+
12
+ module Bus = LocalBus.Make()
13
+ let _ = TestRunner.setup()
14
+
15
+ // ─────────────────────────────────────────────────────────────
16
+ // Source event spec
17
+ // ─────────────────────────────────────────────────────────────
18
+
19
+ module TestSEHSource = {
20
+ module Id = Reventless.Id.StringPure
21
+ let name = "TestSEHSource"
22
+
23
+ @schema
24
+ type event = | OrderPlaced({orderId: string})
25
+ }
26
+
27
+ // ─────────────────────────────────────────────────────────────
28
+ // Captured state
29
+ // ─────────────────────────────────────────────────────────────
30
+
31
+ // Each entry: (aggregateId, orderId)
32
+ let capturedOrders: ref<array<(string, string)>> = ref([])
33
+
34
+ // ─────────────────────────────────────────────────────────────
35
+ // Side effect implementation
36
+ // ─────────────────────────────────────────────────────────────
37
+
38
+ module TestSideEffect = {
39
+ module Source = TestSEHSource
40
+ let moduleUrl: string = %raw(`import.meta.url`)
41
+
42
+ let execute = async (
43
+ id: TestSEHSource.Id.t,
44
+ _meta: Reventless.Message.meta,
45
+ event: TestSEHSource.event,
46
+ _queryEngine: Reventless.QueryEngine.operations,
47
+ ) => {
48
+ switch event {
49
+ | OrderPlaced({orderId}) =>
50
+ capturedOrders := capturedOrders.contents->Array.concat([(id, orderId)])
51
+ }
52
+ }
53
+ }
54
+
55
+ // ─────────────────────────────────────────────────────────────
56
+ // EventCollector wiring (core EventCollector_Builder + in-memory adapters)
57
+ // ─────────────────────────────────────────────────────────────
58
+
59
+ module EventCollectorCh = LocalEventCollectorChannel.Make(Bus)
60
+ module SpecificEventCollector = ReventlessCore.EventCollector_Builder.Make(
61
+ LocalRuntimeEnvironment,
62
+ EventCollectorCh,
63
+ )
64
+ module ECRTBuilder = LocalEventCollectorRuntime_Builder.Make(Bus, EventCollectorCh)
65
+
66
+ module SEHBuilder = ReventlessCore.SideEffectHandler_Builder.Make(
67
+ LocalRuntimeEnvironment,
68
+ EventCollectorCh,
69
+ SpecificEventCollector,
70
+ ECRTBuilder,
71
+ )
72
+
73
+ // ─────────────────────────────────────────────────────────────
74
+ // allEventTopics — keyed by Source.name, resource.name = bus topic key
75
+ // ─────────────────────────────────────────────────────────────
76
+
77
+ let topicName = "TestSEHSource"
78
+ let topicResource: ReventlessInfra.Adapter.resource = ReventlessInfra.Adapter.make(
79
+ ~name=topicName->Pulumi.Output.make,
80
+ ~id=topicName->Pulumi.Output.make,
81
+ ~urn=topicName->Pulumi.Output.make,
82
+ ~service="memory:InMemory"->Pulumi.Output.make,
83
+ )
84
+
85
+ let allEventTopics: ReventlessInfra.EventTopic.allOutputs = Dict.fromArray([
86
+ ("TestSEHSource", {ReventlessInfra.EventTopic.resources: [topicResource]}),
87
+ ])
88
+
89
+ // ─────────────────────────────────────────────────────────────
90
+ // Build SideEffectHandler component
91
+ // ─────────────────────────────────────────────────────────────
92
+
93
+ let sideEffects: array<module(Reventless.SideEffect.T)> = [module(TestSideEffect)]
94
+
95
+ let seh = SEHBuilder.make(
96
+ ~name="TestSEH",
97
+ ~sideEffects,
98
+ ~allEventTopics,
99
+ ~allCommandTopics=Pulumi.Output.make(Dict.make()),
100
+ ~queryEngine=mockQueryEngine,
101
+ ~scheduler=mockScheduler,
102
+ ~resourceNaming=mockResourceNaming,
103
+ )
104
+
105
+ // ─────────────────────────────────────────────────────────────
106
+ // Test meta
107
+ // ─────────────────────────────────────────────────────────────
108
+
109
+ let testMeta = makeTestMeta(~service="TestSEHSource")
110
+
111
+ // ─────────────────────────────────────────────────────────────
112
+ // Publish helper — emits {id, meta, event} to the bus topic
113
+ // meta.service must match TestSEHSource.name for the callback to route correctly
114
+ // ─────────────────────────────────────────────────────────────
115
+
116
+ let publishOrderPlaced = async (id, orderId) => {
117
+ let eventJson = JSON.Encode.object(
118
+ Dict.fromArray([
119
+ ("id", id->JSON.Encode.string),
120
+ ("meta", testMeta->S.reverseConvertToJsonOrThrow(Reventless.Message.metaSchema)),
121
+ (
122
+ "event",
123
+ TestSEHSource.OrderPlaced({orderId: orderId})
124
+ ->S.reverseConvertToJsonOrThrow(TestSEHSource.eventSchema),
125
+ ),
126
+ ]),
127
+ )
128
+ await Bus.publishEvent(topicName, "TestSEHSource", testMeta, eventJson)
129
+ }
130
+
131
+ let resetMocks = () => {
132
+ capturedOrders := []
133
+ }