@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,98 @@
1
+ // Integration tests for Task_Builder.Make (in-memory).
2
+ // Verifies that tasks are created with correct outputs and that the bucket
3
+ // callback chain is wired through the in-memory adapter.
4
+ // Low-level handler extraction is covered in adapter/TaskBucketTest.res.
5
+
6
+ open TestFixtures
7
+ open JestGlobals
8
+ open TaskFixtures
9
+
10
+ describe("Task_Builder.Make:", () => {
11
+ let _ = beforeEach(() => resetCaptures())
12
+
13
+ describe("make — no buckets:", () => {
14
+ testPromise("creates component with correct output name", async () => {
15
+ let task = NoBucketsMaker.make(
16
+ ~queryBucketName=mockQueryBucketName,
17
+ ~scheduler=mockScheduler,
18
+ ~schedulerRoleUrn=Pulumi.Output.make(""),
19
+ ~publishToAggregates=mockPublishToAggregates,
20
+ ~queryEngine=mockQueryEngine,
21
+ ~resourceNaming=mockResourceNaming,
22
+ ~allAggregates=Dict.make(),
23
+ ~opts=None,
24
+ )
25
+ let outputs = NoBucketsMaker.outputs(task)
26
+ expect(outputs.name)->toBe("NoBucketsTask")
27
+ })
28
+
29
+ testPromise("task with no buckets has no bucketNames in outputs", async () => {
30
+ let task = NoBucketsMaker.make(
31
+ ~queryBucketName=mockQueryBucketName,
32
+ ~scheduler=mockScheduler,
33
+ ~schedulerRoleUrn=Pulumi.Output.make(""),
34
+ ~publishToAggregates=mockPublishToAggregates,
35
+ ~queryEngine=mockQueryEngine,
36
+ ~resourceNaming=mockResourceNaming,
37
+ ~allAggregates=Dict.make(),
38
+ ~opts=None,
39
+ )
40
+ let outputs = NoBucketsMaker.outputs(task)
41
+ // bucketNames is absent when spec returns no buckets
42
+ expect(outputs.bucketNames->Option.isSome)->toBe(false)
43
+ })
44
+ })
45
+
46
+ describe("make — one named bucket with callback:", () => {
47
+ testPromise("creates component with correct output name", async () => {
48
+ let task = OneBucketMaker.make(
49
+ ~queryBucketName=mockQueryBucketName,
50
+ ~scheduler=mockScheduler,
51
+ ~schedulerRoleUrn=Pulumi.Output.make(""),
52
+ ~publishToAggregates=mockPublishToAggregates,
53
+ ~queryEngine=mockQueryEngine,
54
+ ~resourceNaming=mockResourceNaming,
55
+ ~allAggregates=Dict.make(),
56
+ ~opts=None,
57
+ )
58
+ let outputs = OneBucketMaker.outputs(task)
59
+ expect(outputs.name)->toBe("OneBucketTask")
60
+ })
61
+
62
+ testPromise("bucketNames dict contains the named bucket key", async () => {
63
+ let task = OneBucketMaker.make(
64
+ ~queryBucketName=mockQueryBucketName,
65
+ ~scheduler=mockScheduler,
66
+ ~schedulerRoleUrn=Pulumi.Output.make(""),
67
+ ~publishToAggregates=mockPublishToAggregates,
68
+ ~queryEngine=mockQueryEngine,
69
+ ~resourceNaming=mockResourceNaming,
70
+ ~allAggregates=Dict.make(),
71
+ ~opts=None,
72
+ )
73
+ let outputs = OneBucketMaker.outputs(task)
74
+ let bucketNames = outputs.bucketNames->Option.getUnsafe
75
+ expect(bucketNames->Dict.keysToArray)->toEqual(["Reports"])
76
+ })
77
+
78
+ testPromise("bucket id resolves to the bucket name (in-memory dummy resource)", async () => {
79
+ let task = OneBucketMaker.make(
80
+ ~queryBucketName=mockQueryBucketName,
81
+ ~scheduler=mockScheduler,
82
+ ~schedulerRoleUrn=Pulumi.Output.make(""),
83
+ ~publishToAggregates=mockPublishToAggregates,
84
+ ~queryEngine=mockQueryEngine,
85
+ ~resourceNaming=mockResourceNaming,
86
+ ~allAggregates=Dict.make(),
87
+ ~opts=None,
88
+ )
89
+ let outputs = OneBucketMaker.outputs(task)
90
+ let bucketNames = outputs.bucketNames->Option.getUnsafe
91
+ let idOutput = bucketNames->Dict.get("Reports")->Option.getUnsafe
92
+ let id = await idOutput->TestRunner.resolve
93
+ // In-memory bucket id = resource name: taskName ++ pascalCase(bucketName) ++ "Bucket"
94
+ // = "OneBucketTask" ++ "Reports" ++ "Bucket". The lookup key stays "Reports".
95
+ expect(id)->toBe("OneBucketTaskReportsBucket")
96
+ })
97
+ })
98
+ })
@@ -0,0 +1,46 @@
1
+ // Generated by ReScript, PLEASE EDIT WITH CARE
2
+
3
+ import * as Stdlib_Option from "@rescript/runtime/lib/es6/Stdlib_Option.js";
4
+ import * as Pulumi from "@pulumi/pulumi";
5
+ import * as TestRunner$ReventlessLocal from "../../../src/test/TestRunner.res.mjs";
6
+ import * as TaskFixtures$ReventlessLocal from "./TaskFixtures.res.mjs";
7
+ import * as TestFixtures$ReventlessLocal from "../../TestFixtures.res.mjs";
8
+
9
+ globalThis.describe("Task_Builder.Make:", () => {
10
+ globalThis.beforeEach(() => TaskFixtures$ReventlessLocal.resetCaptures());
11
+ globalThis.describe("make — no buckets:", () => {
12
+ globalThis.test("creates component with correct output name", async () => {
13
+ let task = TaskFixtures$ReventlessLocal.NoBucketsMaker.make(TaskFixtures$ReventlessLocal.mockQueryBucketName, TestFixtures$ReventlessLocal.mockScheduler, Pulumi.output(""), TaskFixtures$ReventlessLocal.mockPublishToAggregates, TestFixtures$ReventlessLocal.mockQueryEngine, TestFixtures$ReventlessLocal.mockResourceNaming, {}, undefined);
14
+ let outputs = TaskFixtures$ReventlessLocal.NoBucketsMaker.outputs(task);
15
+ globalThis.expect(outputs.name).toBe("NoBucketsTask");
16
+ });
17
+ globalThis.test("task with no buckets has no bucketNames in outputs", async () => {
18
+ let task = TaskFixtures$ReventlessLocal.NoBucketsMaker.make(TaskFixtures$ReventlessLocal.mockQueryBucketName, TestFixtures$ReventlessLocal.mockScheduler, Pulumi.output(""), TaskFixtures$ReventlessLocal.mockPublishToAggregates, TestFixtures$ReventlessLocal.mockQueryEngine, TestFixtures$ReventlessLocal.mockResourceNaming, {}, undefined);
19
+ let outputs = TaskFixtures$ReventlessLocal.NoBucketsMaker.outputs(task);
20
+ globalThis.expect(Stdlib_Option.isSome(outputs.bucketNames)).toBe(false);
21
+ });
22
+ });
23
+ globalThis.describe("make — one named bucket with callback:", () => {
24
+ globalThis.test("creates component with correct output name", async () => {
25
+ let task = TaskFixtures$ReventlessLocal.OneBucketMaker.make(TaskFixtures$ReventlessLocal.mockQueryBucketName, TestFixtures$ReventlessLocal.mockScheduler, Pulumi.output(""), TaskFixtures$ReventlessLocal.mockPublishToAggregates, TestFixtures$ReventlessLocal.mockQueryEngine, TestFixtures$ReventlessLocal.mockResourceNaming, {}, undefined);
26
+ let outputs = TaskFixtures$ReventlessLocal.OneBucketMaker.outputs(task);
27
+ globalThis.expect(outputs.name).toBe("OneBucketTask");
28
+ });
29
+ globalThis.test("bucketNames dict contains the named bucket key", async () => {
30
+ let task = TaskFixtures$ReventlessLocal.OneBucketMaker.make(TaskFixtures$ReventlessLocal.mockQueryBucketName, TestFixtures$ReventlessLocal.mockScheduler, Pulumi.output(""), TaskFixtures$ReventlessLocal.mockPublishToAggregates, TestFixtures$ReventlessLocal.mockQueryEngine, TestFixtures$ReventlessLocal.mockResourceNaming, {}, undefined);
31
+ let outputs = TaskFixtures$ReventlessLocal.OneBucketMaker.outputs(task);
32
+ let bucketNames = outputs.bucketNames;
33
+ globalThis.expect(Object.keys(bucketNames)).toEqual(["Reports"]);
34
+ });
35
+ globalThis.test("bucket id resolves to the bucket name (in-memory dummy resource)", async () => {
36
+ let task = TaskFixtures$ReventlessLocal.OneBucketMaker.make(TaskFixtures$ReventlessLocal.mockQueryBucketName, TestFixtures$ReventlessLocal.mockScheduler, Pulumi.output(""), TaskFixtures$ReventlessLocal.mockPublishToAggregates, TestFixtures$ReventlessLocal.mockQueryEngine, TestFixtures$ReventlessLocal.mockResourceNaming, {}, undefined);
37
+ let outputs = TaskFixtures$ReventlessLocal.OneBucketMaker.outputs(task);
38
+ let bucketNames = outputs.bucketNames;
39
+ let idOutput = bucketNames["Reports"];
40
+ let id = await TestRunner$ReventlessLocal.resolve(idOutput);
41
+ globalThis.expect(id).toBe("OneBucketTaskReportsBucket");
42
+ });
43
+ });
44
+ });
45
+
46
+ /* Not a pure module */
@@ -0,0 +1,146 @@
1
+ open ReventlessCore
2
+ open PluginSpec
3
+ open Plugin_Fixtures
4
+ module PluginTest = ReventlessGwt.Behavior_GWT.MakeFromAggregate(PluginSpec, PluginBehavior)
5
+ open PluginTest
6
+
7
+ // Name-keyed lifecycle aggregate. Commands carry the version; the aggregate
8
+ // decides supersession / promotion from event-driven status in `known` and
9
+ // never reads wall-clock time.
10
+
11
+ let supersededV1ByV2 = VersionSuperseded({
12
+ supersededVersion: "1",
13
+ supersededDefinition: pluginDefinition,
14
+ newVersion: "2",
15
+ newDefinition: pluginDefinitionV2,
16
+ })
17
+
18
+ describe("PluginBehavior:", () => {
19
+ // ── Detection → connect handshake ──────────────────────────────────────────
20
+ test("Heartbeat for an unknown version triggers detection", () =>
21
+ givenEvents([])->whenCmd(Heartbeat("1"))->thenEvents([VersionDetected("1")])
22
+ )
23
+
24
+ test("Heartbeat again while still only detected re-triggers detection", () =>
25
+ // VersionDetected does not add the version to `known`, so a repeat heartbeat
26
+ // re-emits it (idempotent handshake trigger).
27
+ givenEvents([VersionDetected("1")])->whenCmd(Heartbeat("1"))->thenEvents([VersionDetected("1")])
28
+ )
29
+
30
+ test("Connect completes the handshake", () =>
31
+ givenEvents([VersionDetected("1")])
32
+ ->whenCmd(Connect(pluginDefinition))
33
+ ->thenEvents([VersionConnected(pluginDefinition)])
34
+ )
35
+
36
+ test("Connect is idempotent for an already-connected version", () =>
37
+ givenEvents([VersionConnected(pluginDefinition)])
38
+ ->whenCmd(Connect(pluginDefinition))
39
+ ->thenNoEvent
40
+ )
41
+
42
+ test("Heartbeat for a connected version is a keep-alive no-op", () =>
43
+ givenEvents([VersionConnected(pluginDefinition)])->whenCmd(Heartbeat("1"))->thenNoEvent
44
+ )
45
+
46
+ // ── Disconnect / reconnect ─────────────────────────────────────────────────
47
+ test("Disconnect of the current version", () =>
48
+ givenEvents([VersionConnected(pluginDefinition)])
49
+ ->whenCmd(Disconnect("1"))
50
+ ->thenEvents([VersionDisconnected(pluginDefinition)])
51
+ )
52
+
53
+ test("Heartbeat reconnects a disconnected version", () =>
54
+ givenEvents([VersionConnected(pluginDefinition), VersionDisconnected(pluginDefinition)])
55
+ ->whenCmd(Heartbeat("1"))
56
+ ->thenEvents([VersionConnected(pluginDefinition)])
57
+ )
58
+
59
+ // ── Supersession (newer version takes over) ────────────────────────────────
60
+ test("A higher version connecting supersedes the current one", () =>
61
+ givenEvents([VersionConnected(pluginDefinition)])
62
+ ->whenCmd(Connect(pluginDefinitionV2))
63
+ ->thenEvents([VersionConnected(pluginDefinitionV2), supersededV1ByV2])
64
+ )
65
+
66
+ test("A lower version connecting does not supersede the current one", () =>
67
+ givenEvents([VersionConnected(pluginDefinitionV2)])
68
+ ->whenCmd(Connect(pluginDefinition))
69
+ ->thenEvents([VersionConnected(pluginDefinition)])
70
+ )
71
+
72
+ // ── Rollback (promote highest still-live on current loss) ───────────────────
73
+ test("Disconnecting the current version promotes the highest live lower version", () =>
74
+ givenEvents([VersionConnected(pluginDefinition), VersionConnected(pluginDefinitionV2)])
75
+ ->whenCmd(Disconnect("2"))
76
+ ->thenEvents([VersionDisconnected(pluginDefinitionV2), VersionPromoted(pluginDefinition)])
77
+ )
78
+
79
+ test("Disconnecting the current with no other live version promotes nothing", () =>
80
+ givenEvents([VersionConnected(pluginDefinition)])
81
+ ->whenCmd(Disconnect("1"))
82
+ ->thenEvents([VersionDisconnected(pluginDefinition)])
83
+ )
84
+
85
+ // ── Admin deactivate / activate ─────────────────────────────────────────────
86
+ test("Deactivate the current version", () =>
87
+ givenEvents([VersionConnected(pluginDefinition)])
88
+ ->whenCmd(Deactivate("1"))
89
+ ->thenEvents([VersionDeactivated(pluginDefinition)])
90
+ )
91
+
92
+ test("Activate a deactivated version", () =>
93
+ givenEvents([VersionConnected(pluginDefinition), VersionDeactivated(pluginDefinition)])
94
+ ->whenCmd(Activate("1"))
95
+ ->thenEvents([VersionActivated(pluginDefinition)])
96
+ )
97
+
98
+ test("Activate an unknown version errors", () =>
99
+ givenEvents([])->whenCmd(Activate("9"))->thenError(UnknownVersion)
100
+ )
101
+
102
+ // ── Manual retire + un-retire (decision A) ─────────────────────────────────
103
+ test("Retire the current version", () =>
104
+ givenEvents([VersionConnected(pluginDefinition)])
105
+ ->whenCmd(Retire("1"))
106
+ ->thenEvents([VersionRetired(pluginDefinition)])
107
+ )
108
+
109
+ test("Heartbeat does NOT revive a retired version (contrast with Disconnected)", () =>
110
+ givenEvents([VersionConnected(pluginDefinition), VersionRetired(pluginDefinition)])
111
+ ->whenCmd(Heartbeat("1"))
112
+ ->thenNoEvent
113
+ )
114
+
115
+ test("Un-retire: admin Activate revives a retired version", () =>
116
+ givenEvents([VersionConnected(pluginDefinition), VersionRetired(pluginDefinition)])
117
+ ->whenCmd(Activate("1"))
118
+ ->thenEvents([VersionActivated(pluginDefinition)])
119
+ )
120
+
121
+ // ── Incompatibility (observation only) ─────────────────────────────────────
122
+ test("ReportIncompatibility records an event without changing state", () =>
123
+ givenEvents([VersionConnected(pluginDefinition)])
124
+ ->whenCmd(ReportIncompatibility(pluginDefinition))
125
+ ->thenEvents([IncompatiblePluginDetected(pluginDefinition)])
126
+ )
127
+
128
+ // ── UI fragments ────────────────────────────────────────────────────────────
129
+ test("Connect with UI fragments emits UIFragmentRegistered", () =>
130
+ givenEvents([VersionDetected("1")])
131
+ ->whenCmd(Connect(pluginDefinitionWithUI))
132
+ ->thenEvents([
133
+ VersionConnected(pluginDefinitionWithUI),
134
+ UIFragmentRegistered({pluginId: pluginDefinitionWithUI.id, manifest: uiManifest}),
135
+ ])
136
+ )
137
+
138
+ test("Disconnect with UI fragments emits UIFragmentDeregistered", () =>
139
+ givenEvents([VersionConnected(pluginDefinitionWithUI)])
140
+ ->whenCmd(Disconnect("1"))
141
+ ->thenEvents([
142
+ VersionDisconnected(pluginDefinitionWithUI),
143
+ UIFragmentDeregistered({pluginId: pluginDefinitionWithUI.id}),
144
+ ])
145
+ )
146
+ })
@@ -0,0 +1,281 @@
1
+ // Generated by ReScript, PLEASE EDIT WITH CARE
2
+
3
+ import * as PluginSpec$ReventlessCore from "@reventlessdev/reventless-core/src/plugin/lifecycle/PluginSpec.res.mjs";
4
+ import * as Behavior_GWT$ReventlessGwt from "@reventlessdev/reventless-gwt/src/Behavior_GWT.res.mjs";
5
+ import * as PluginBehavior$ReventlessCore from "@reventlessdev/reventless-core/src/plugin/lifecycle/PluginBehavior.res.mjs";
6
+ import * as Plugin_Fixtures$ReventlessLocal from "./Plugin_Fixtures.res.mjs";
7
+
8
+ let PluginTest = Behavior_GWT$ReventlessGwt.MakeFromAggregate({
9
+ name: PluginSpec$ReventlessCore.name,
10
+ commandSchema: PluginSpec$ReventlessCore.commandSchema,
11
+ eventSchema: PluginSpec$ReventlessCore.eventSchema,
12
+ errorSchema: PluginSpec$ReventlessCore.errorSchema
13
+ })({
14
+ Spec: {
15
+ name: PluginSpec$ReventlessCore.name,
16
+ commandSchema: PluginSpec$ReventlessCore.commandSchema,
17
+ eventSchema: PluginSpec$ReventlessCore.eventSchema,
18
+ errorSchema: PluginSpec$ReventlessCore.errorSchema
19
+ },
20
+ initialState: PluginBehavior$ReventlessCore.initialState,
21
+ evolve: PluginBehavior$ReventlessCore.evolve,
22
+ decide: PluginBehavior$ReventlessCore.decide,
23
+ moduleUrl: PluginBehavior$ReventlessCore.moduleUrl
24
+ });
25
+
26
+ let supersededV1ByV2 = {
27
+ TAG: "VersionSuperseded",
28
+ _0: {
29
+ supersededVersion: "1",
30
+ supersededDefinition: Plugin_Fixtures$ReventlessLocal.pluginDefinition,
31
+ newVersion: "2",
32
+ newDefinition: Plugin_Fixtures$ReventlessLocal.pluginDefinitionV2
33
+ }
34
+ };
35
+
36
+ PluginTest.describe("PluginBehavior:", () => {
37
+ PluginTest.test("Heartbeat for an unknown version triggers detection", () => PluginTest.thenEvents(PluginTest.whenCmd(PluginTest.givenEvents([]), {
38
+ TAG: "Heartbeat",
39
+ _0: "1"
40
+ }), [{
41
+ TAG: "VersionDetected",
42
+ _0: "1"
43
+ }]));
44
+ PluginTest.test("Heartbeat again while still only detected re-triggers detection", () => PluginTest.thenEvents(PluginTest.whenCmd(PluginTest.givenEvents([{
45
+ TAG: "VersionDetected",
46
+ _0: "1"
47
+ }]), {
48
+ TAG: "Heartbeat",
49
+ _0: "1"
50
+ }), [{
51
+ TAG: "VersionDetected",
52
+ _0: "1"
53
+ }]));
54
+ PluginTest.test("Connect completes the handshake", () => PluginTest.thenEvents(PluginTest.whenCmd(PluginTest.givenEvents([{
55
+ TAG: "VersionDetected",
56
+ _0: "1"
57
+ }]), {
58
+ TAG: "Connect",
59
+ _0: Plugin_Fixtures$ReventlessLocal.pluginDefinition
60
+ }), [{
61
+ TAG: "VersionConnected",
62
+ _0: Plugin_Fixtures$ReventlessLocal.pluginDefinition
63
+ }]));
64
+ PluginTest.test("Connect is idempotent for an already-connected version", () => PluginTest.thenNoEvent(PluginTest.whenCmd(PluginTest.givenEvents([{
65
+ TAG: "VersionConnected",
66
+ _0: Plugin_Fixtures$ReventlessLocal.pluginDefinition
67
+ }]), {
68
+ TAG: "Connect",
69
+ _0: Plugin_Fixtures$ReventlessLocal.pluginDefinition
70
+ })));
71
+ PluginTest.test("Heartbeat for a connected version is a keep-alive no-op", () => PluginTest.thenNoEvent(PluginTest.whenCmd(PluginTest.givenEvents([{
72
+ TAG: "VersionConnected",
73
+ _0: Plugin_Fixtures$ReventlessLocal.pluginDefinition
74
+ }]), {
75
+ TAG: "Heartbeat",
76
+ _0: "1"
77
+ })));
78
+ PluginTest.test("Disconnect of the current version", () => PluginTest.thenEvents(PluginTest.whenCmd(PluginTest.givenEvents([{
79
+ TAG: "VersionConnected",
80
+ _0: Plugin_Fixtures$ReventlessLocal.pluginDefinition
81
+ }]), {
82
+ TAG: "Disconnect",
83
+ _0: "1"
84
+ }), [{
85
+ TAG: "VersionDisconnected",
86
+ _0: Plugin_Fixtures$ReventlessLocal.pluginDefinition
87
+ }]));
88
+ PluginTest.test("Heartbeat reconnects a disconnected version", () => PluginTest.thenEvents(PluginTest.whenCmd(PluginTest.givenEvents([
89
+ {
90
+ TAG: "VersionConnected",
91
+ _0: Plugin_Fixtures$ReventlessLocal.pluginDefinition
92
+ },
93
+ {
94
+ TAG: "VersionDisconnected",
95
+ _0: Plugin_Fixtures$ReventlessLocal.pluginDefinition
96
+ }
97
+ ]), {
98
+ TAG: "Heartbeat",
99
+ _0: "1"
100
+ }), [{
101
+ TAG: "VersionConnected",
102
+ _0: Plugin_Fixtures$ReventlessLocal.pluginDefinition
103
+ }]));
104
+ PluginTest.test("A higher version connecting supersedes the current one", () => PluginTest.thenEvents(PluginTest.whenCmd(PluginTest.givenEvents([{
105
+ TAG: "VersionConnected",
106
+ _0: Plugin_Fixtures$ReventlessLocal.pluginDefinition
107
+ }]), {
108
+ TAG: "Connect",
109
+ _0: Plugin_Fixtures$ReventlessLocal.pluginDefinitionV2
110
+ }), [
111
+ {
112
+ TAG: "VersionConnected",
113
+ _0: Plugin_Fixtures$ReventlessLocal.pluginDefinitionV2
114
+ },
115
+ supersededV1ByV2
116
+ ]));
117
+ PluginTest.test("A lower version connecting does not supersede the current one", () => PluginTest.thenEvents(PluginTest.whenCmd(PluginTest.givenEvents([{
118
+ TAG: "VersionConnected",
119
+ _0: Plugin_Fixtures$ReventlessLocal.pluginDefinitionV2
120
+ }]), {
121
+ TAG: "Connect",
122
+ _0: Plugin_Fixtures$ReventlessLocal.pluginDefinition
123
+ }), [{
124
+ TAG: "VersionConnected",
125
+ _0: Plugin_Fixtures$ReventlessLocal.pluginDefinition
126
+ }]));
127
+ PluginTest.test("Disconnecting the current version promotes the highest live lower version", () => PluginTest.thenEvents(PluginTest.whenCmd(PluginTest.givenEvents([
128
+ {
129
+ TAG: "VersionConnected",
130
+ _0: Plugin_Fixtures$ReventlessLocal.pluginDefinition
131
+ },
132
+ {
133
+ TAG: "VersionConnected",
134
+ _0: Plugin_Fixtures$ReventlessLocal.pluginDefinitionV2
135
+ }
136
+ ]), {
137
+ TAG: "Disconnect",
138
+ _0: "2"
139
+ }), [
140
+ {
141
+ TAG: "VersionDisconnected",
142
+ _0: Plugin_Fixtures$ReventlessLocal.pluginDefinitionV2
143
+ },
144
+ {
145
+ TAG: "VersionPromoted",
146
+ _0: Plugin_Fixtures$ReventlessLocal.pluginDefinition
147
+ }
148
+ ]));
149
+ PluginTest.test("Disconnecting the current with no other live version promotes nothing", () => PluginTest.thenEvents(PluginTest.whenCmd(PluginTest.givenEvents([{
150
+ TAG: "VersionConnected",
151
+ _0: Plugin_Fixtures$ReventlessLocal.pluginDefinition
152
+ }]), {
153
+ TAG: "Disconnect",
154
+ _0: "1"
155
+ }), [{
156
+ TAG: "VersionDisconnected",
157
+ _0: Plugin_Fixtures$ReventlessLocal.pluginDefinition
158
+ }]));
159
+ PluginTest.test("Deactivate the current version", () => PluginTest.thenEvents(PluginTest.whenCmd(PluginTest.givenEvents([{
160
+ TAG: "VersionConnected",
161
+ _0: Plugin_Fixtures$ReventlessLocal.pluginDefinition
162
+ }]), {
163
+ TAG: "Deactivate",
164
+ _0: "1"
165
+ }), [{
166
+ TAG: "VersionDeactivated",
167
+ _0: Plugin_Fixtures$ReventlessLocal.pluginDefinition
168
+ }]));
169
+ PluginTest.test("Activate a deactivated version", () => PluginTest.thenEvents(PluginTest.whenCmd(PluginTest.givenEvents([
170
+ {
171
+ TAG: "VersionConnected",
172
+ _0: Plugin_Fixtures$ReventlessLocal.pluginDefinition
173
+ },
174
+ {
175
+ TAG: "VersionDeactivated",
176
+ _0: Plugin_Fixtures$ReventlessLocal.pluginDefinition
177
+ }
178
+ ]), {
179
+ TAG: "Activate",
180
+ _0: "1"
181
+ }), [{
182
+ TAG: "VersionActivated",
183
+ _0: Plugin_Fixtures$ReventlessLocal.pluginDefinition
184
+ }]));
185
+ PluginTest.test("Activate an unknown version errors", () => PluginTest.thenError(PluginTest.whenCmd(PluginTest.givenEvents([]), {
186
+ TAG: "Activate",
187
+ _0: "9"
188
+ }), "UnknownVersion"));
189
+ PluginTest.test("Retire the current version", () => PluginTest.thenEvents(PluginTest.whenCmd(PluginTest.givenEvents([{
190
+ TAG: "VersionConnected",
191
+ _0: Plugin_Fixtures$ReventlessLocal.pluginDefinition
192
+ }]), {
193
+ TAG: "Retire",
194
+ _0: "1"
195
+ }), [{
196
+ TAG: "VersionRetired",
197
+ _0: Plugin_Fixtures$ReventlessLocal.pluginDefinition
198
+ }]));
199
+ PluginTest.test("Heartbeat does NOT revive a retired version (contrast with Disconnected)", () => PluginTest.thenNoEvent(PluginTest.whenCmd(PluginTest.givenEvents([
200
+ {
201
+ TAG: "VersionConnected",
202
+ _0: Plugin_Fixtures$ReventlessLocal.pluginDefinition
203
+ },
204
+ {
205
+ TAG: "VersionRetired",
206
+ _0: Plugin_Fixtures$ReventlessLocal.pluginDefinition
207
+ }
208
+ ]), {
209
+ TAG: "Heartbeat",
210
+ _0: "1"
211
+ })));
212
+ PluginTest.test("Un-retire: admin Activate revives a retired version", () => PluginTest.thenEvents(PluginTest.whenCmd(PluginTest.givenEvents([
213
+ {
214
+ TAG: "VersionConnected",
215
+ _0: Plugin_Fixtures$ReventlessLocal.pluginDefinition
216
+ },
217
+ {
218
+ TAG: "VersionRetired",
219
+ _0: Plugin_Fixtures$ReventlessLocal.pluginDefinition
220
+ }
221
+ ]), {
222
+ TAG: "Activate",
223
+ _0: "1"
224
+ }), [{
225
+ TAG: "VersionActivated",
226
+ _0: Plugin_Fixtures$ReventlessLocal.pluginDefinition
227
+ }]));
228
+ PluginTest.test("ReportIncompatibility records an event without changing state", () => PluginTest.thenEvents(PluginTest.whenCmd(PluginTest.givenEvents([{
229
+ TAG: "VersionConnected",
230
+ _0: Plugin_Fixtures$ReventlessLocal.pluginDefinition
231
+ }]), {
232
+ TAG: "ReportIncompatibility",
233
+ _0: Plugin_Fixtures$ReventlessLocal.pluginDefinition
234
+ }), [{
235
+ TAG: "IncompatiblePluginDetected",
236
+ _0: Plugin_Fixtures$ReventlessLocal.pluginDefinition
237
+ }]));
238
+ PluginTest.test("Connect with UI fragments emits UIFragmentRegistered", () => PluginTest.thenEvents(PluginTest.whenCmd(PluginTest.givenEvents([{
239
+ TAG: "VersionDetected",
240
+ _0: "1"
241
+ }]), {
242
+ TAG: "Connect",
243
+ _0: Plugin_Fixtures$ReventlessLocal.pluginDefinitionWithUI
244
+ }), [
245
+ {
246
+ TAG: "VersionConnected",
247
+ _0: Plugin_Fixtures$ReventlessLocal.pluginDefinitionWithUI
248
+ },
249
+ {
250
+ TAG: "UIFragmentRegistered",
251
+ _0: {
252
+ pluginId: Plugin_Fixtures$ReventlessLocal.pluginDefinitionWithUI.id,
253
+ manifest: Plugin_Fixtures$ReventlessLocal.uiManifest
254
+ }
255
+ }
256
+ ]));
257
+ PluginTest.test("Disconnect with UI fragments emits UIFragmentDeregistered", () => PluginTest.thenEvents(PluginTest.whenCmd(PluginTest.givenEvents([{
258
+ TAG: "VersionConnected",
259
+ _0: Plugin_Fixtures$ReventlessLocal.pluginDefinitionWithUI
260
+ }]), {
261
+ TAG: "Disconnect",
262
+ _0: "1"
263
+ }), [
264
+ {
265
+ TAG: "VersionDisconnected",
266
+ _0: Plugin_Fixtures$ReventlessLocal.pluginDefinitionWithUI
267
+ },
268
+ {
269
+ TAG: "UIFragmentDeregistered",
270
+ _0: {
271
+ pluginId: Plugin_Fixtures$ReventlessLocal.pluginDefinitionWithUI.id
272
+ }
273
+ }
274
+ ]));
275
+ });
276
+
277
+ export {
278
+ PluginTest,
279
+ supersededV1ByV2,
280
+ }
281
+ /* PluginTest Not a pure module */
@@ -0,0 +1,61 @@
1
+ open ReventlessCore
2
+
3
+ let sc = ReventlessGwt.TestFixtures.statusChange
4
+
5
+ let pluginDefinition: Reventless.Plugin.pluginDefinition = {
6
+ id: "name@1",
7
+ name: "name",
8
+ version: "1",
9
+ extensionPoints: [],
10
+ extensions: [{name: "Core.Plugin.Test", extensionPointName: "Core.Plugin", dcbSources: []}],
11
+ eventCollector: "eventCollector",
12
+ extensionProtocols: [],
13
+ apiSchemaFragment: None,
14
+ apiTarget: None,
15
+ uiFragments: None,
16
+ structure: None,
17
+ dcbEventLog: None,
18
+ }
19
+
20
+ // A higher version of the SAME plugin name — for supersession / rollback tests.
21
+ let pluginDefinitionV2 = {...pluginDefinition, id: "name@2", version: "2"}
22
+
23
+ // Expected current-view row for a def + status + the OTHER currently-connected
24
+ // versions (own version excluded). Reuses the projection's own builder so
25
+ // assertions match the projection output exactly.
26
+ let display = (def, status, otherConnectedVersions): PluginsReadModelSpec.state =>
27
+ PluginsProjection.displayState(def, status, sc, otherConnectedVersions)
28
+
29
+ // Canonical v1 Connected current-view row — no other versions live.
30
+ let state: PluginsReadModelSpec.state = display(pluginDefinition, Connected, [])
31
+
32
+ let uiManifest: Reventless.Plugin.uiFragmentManifest = {
33
+ remoteEntryUrl: "https://cdn.example.com/plugin@1.0/remoteEntry.js",
34
+ panels: [],
35
+ pages: [],
36
+ }
37
+
38
+ let pluginDefinitionWithUI = {
39
+ ...pluginDefinition,
40
+ uiFragments: Some(uiManifest),
41
+ }
42
+
43
+ let extensionPointNames2 = ["Test.Test"]
44
+ let pluginDefinition2 = {
45
+ Reventless.Plugin.id: "name2@1",
46
+ name: "name2",
47
+ version: "1",
48
+ extensionPoints: extensionPointNames2->Array.mapWithIndex((name, idx) => {
49
+ Reventless.Plugin.name,
50
+ commandTopic: `commandTopic${idx->Int.toString}`,
51
+ eventTopic: `eventTopic${idx->Int.toString}`,
52
+ }),
53
+ extensions: [],
54
+ eventCollector: "eventCollector",
55
+ extensionProtocols: [],
56
+ apiSchemaFragment: None,
57
+ apiTarget: None,
58
+ uiFragments: None,
59
+ structure: None,
60
+ dcbEventLog: None,
61
+ }