@reventlessdev/reventless-local 3.0.0-alpha.249 → 3.0.0-alpha.251

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 (174) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/package.json +13 -13
  3. package/src/BakedManifest.res +5 -6
  4. package/src/EmitCapabilities.res +3 -1
  5. package/src/LocalPlatformRegistry.res +3 -1
  6. package/src/LocalPlatformStart.res +7 -6
  7. package/src/LocalSeedTarget.res +3 -1
  8. package/src/Platform.res +291 -215
  9. package/src/ShellConfig.res +10 -17
  10. package/src/UiHints.res +8 -14
  11. package/src/UiSlots.res +10 -17
  12. package/src/adapter/Api/LocalEvents_Server.res +5 -3
  13. package/src/adapter/Api/LocalGraphQL_Adapter.res +4 -4
  14. package/src/adapter/Auth/LocalAuth.res +12 -16
  15. package/src/adapter/Auth/LocalAuth.res.mjs +2 -1
  16. package/src/adapter/Auth/UserStore.res +13 -40
  17. package/src/adapter/Auth/UserStore.res.mjs +11 -67
  18. package/src/adapter/Backend.res +1 -2
  19. package/src/adapter/CommandGenerator/CommandGeneratorResolvers_GraphQL.res +42 -26
  20. package/src/adapter/CommandGenerator/InboundTranslationResolvers_GraphQL.res +13 -3
  21. package/src/adapter/CommandTopic/LocalCommandTopicChannel.res +15 -17
  22. package/src/adapter/CommandTopic/LocalCommandTopicRemoteChannel.res +18 -22
  23. package/src/adapter/Counter/LocalCounterHandler.res +1 -1
  24. package/src/adapter/DcbEventLog/DcbEventLogStorage_InMemory.res +33 -22
  25. package/src/adapter/DcbEventLog/DcbEventLogStorage_Sqlite.res +57 -57
  26. package/src/adapter/DomainGraphQL_Server.res +35 -34
  27. package/src/adapter/DomainMCP_Server.res +45 -41
  28. package/src/adapter/EventCollector/LocalEventCollectorChannel.res +47 -36
  29. package/src/adapter/EventHistory/EventHistoryResolvers_GraphQL.res +15 -12
  30. package/src/adapter/EventLog/EventLogStorage_InMemory.res +9 -4
  31. package/src/adapter/EventLog/EventLogStorage_Sqlite.res +36 -24
  32. package/src/adapter/EventTopic/LocalEventTopicPublisher.res +9 -3
  33. package/src/adapter/Heartbeat/LocalHeartbeatRunner.res +9 -14
  34. package/src/adapter/LocalBus.res +12 -12
  35. package/src/adapter/LocalCapabilities.res +6 -0
  36. package/src/adapter/LocalCapabilities.res.mjs +5 -2
  37. package/src/adapter/LocalGeocodeResolvers.res +1 -4
  38. package/src/adapter/LocalSideEffectHandler.res +1 -1
  39. package/src/adapter/LocalStateChangeDescriptor.res +2 -1
  40. package/src/adapter/MCP_ServerInstance.res +51 -39
  41. package/src/adapter/ObjectStore/LocalObjectStore.res +5 -2
  42. package/src/adapter/ObjectStore/ObjectStoreStorage_FileSystem.res +1 -2
  43. package/src/adapter/PlatformGraphQL_Server.res +10 -6
  44. package/src/adapter/PlatformGraphQL_Server.res.mjs +2 -1
  45. package/src/adapter/ProjectionCheckpoint.res +8 -1
  46. package/src/adapter/ProjectionPending.res +1 -3
  47. package/src/adapter/QueryDb/LocalQueryDbStorage.res +2 -1
  48. package/src/adapter/QueryDb/QueryDbResolvers_GraphQL.res +367 -269
  49. package/src/adapter/QueryDb/QueryDbStorage_InMemory.res +5 -3
  50. package/src/adapter/QueryDb/QueryDbStorage_Sqlite.res +63 -40
  51. package/src/adapter/QueryDb/SortKey_Filter.res +14 -6
  52. package/src/adapter/Runtime/LocalAggregateRuntime_Builder.res +12 -10
  53. package/src/adapter/Runtime/LocalEventCollectorRuntime_Builder.res +8 -2
  54. package/src/adapter/Runtime/LocalPluginRuntime_Builder.res +1 -4
  55. package/src/adapter/Scheduler/LocalScheduledPublisher.res +12 -12
  56. package/src/adapter/SqliteDriver.res +16 -4
  57. package/src/adapter/Task/TaskBucket_Sqlite.res +5 -6
  58. package/src/components/Aggregate_Builder.res +6 -1
  59. package/src/components/Counter_Builder.res +1 -5
  60. package/src/components/DcbEventLog_Builder.res +5 -3
  61. package/src/components/ExtensionPoint_Builder.res +13 -15
  62. package/src/components/InboundTranslationSlice_Builder.res +3 -2
  63. package/src/components/OutboundTranslationSlice_Builder.res +3 -2
  64. package/src/components/ReadModel_Builder.res +18 -20
  65. package/src/components/StateViewSlice_Builder.res +3 -2
  66. package/src/components/Task_Builder.res +12 -13
  67. package/src/reset/LocalSeedReset.res +2 -5
  68. package/src/test/Mocks/MockDcbEventLogStorage.res +5 -1
  69. package/src/test/Mocks/MockEventLogStorage.res +8 -3
  70. package/src/test/Mocks/MockQueryDbStorage.res +3 -2
  71. package/src/test/TestRunner.res +1 -1
  72. package/tests/BakedManifestFilesTest.res +7 -10
  73. package/tests/LocalEventTapTest.res +26 -21
  74. package/tests/LocalPlatformStartTest.res +33 -28
  75. package/tests/PluginEventDecodeTest.res +3 -3
  76. package/tests/ShellConfigTest.res +30 -21
  77. package/tests/SplitApiFixtures.res +34 -10
  78. package/tests/SplitApiTest.res +92 -62
  79. package/tests/adapter/BackendParityTest.res +180 -130
  80. package/tests/adapter/CollectNEventsTest.res +6 -4
  81. package/tests/adapter/CommandAuthorizationTest.res +47 -41
  82. package/tests/adapter/CommandTopicChannelTest.res +163 -139
  83. package/tests/adapter/CounterHandlerTest.res +95 -77
  84. package/tests/adapter/DcbEventLogStorageSqliteTest.res +171 -168
  85. package/tests/adapter/DcbEventLogStorageTest.res +264 -207
  86. package/tests/adapter/DomainGraphQL_ServerTest.res +53 -43
  87. package/tests/adapter/EventCollectorChannelTest.res +153 -124
  88. package/tests/adapter/EventHistoryResolverTest.res +46 -18
  89. package/tests/adapter/EventLogSnapshotParityTest.res +57 -45
  90. package/tests/adapter/EventLogStorageSqliteTest.res +9 -10
  91. package/tests/adapter/EventTapTest.res +37 -20
  92. package/tests/adapter/EventTopicPublisherTest.res +74 -50
  93. package/tests/adapter/GraphQLSubscriptionBridgeTest.res +4 -3
  94. package/tests/adapter/GraphQL_SchemaInspectorTest.res +666 -568
  95. package/tests/adapter/GraphQL_SubscriptionResolversTest.res +105 -96
  96. package/tests/adapter/HeartbeatRunnerTest.res +99 -81
  97. package/tests/adapter/InboundTranslationMutationTest.res +4 -1
  98. package/tests/adapter/LocalAuthHttpTest.res +79 -85
  99. package/tests/adapter/LocalAuthLoginTest.res +42 -50
  100. package/tests/adapter/LocalAuthTest.res +8 -16
  101. package/tests/adapter/LocalAuthUserStoreTest.res +2 -7
  102. package/tests/adapter/LocalBusBoundedTest.res +187 -117
  103. package/tests/adapter/LocalBusPubSubTest.res +118 -76
  104. package/tests/adapter/LocalDispatchContextTest.res +1 -2
  105. package/tests/adapter/LocalEvents_ServerTest.res +242 -187
  106. package/tests/adapter/PgProjectionCatchupTest.res +44 -10
  107. package/tests/adapter/ProjectionCheckpointTest.res +261 -206
  108. package/tests/adapter/QueryDbGsiTtlTest.res +123 -83
  109. package/tests/adapter/QueryDbListPushdownParityTest.res +107 -67
  110. package/tests/adapter/QueryDbListResolverTest.res +225 -208
  111. package/tests/adapter/QueryDbResolvedFieldsTest.res +17 -14
  112. package/tests/adapter/QueryDbStorageSqliteTest.res +33 -49
  113. package/tests/adapter/QueryDbStorageTest.res +163 -117
  114. package/tests/adapter/QueryDbUnionRoundTripTest.res +8 -10
  115. package/tests/adapter/QueryEngineTest.res +179 -126
  116. package/tests/adapter/ScheduledPublisherTest.res +171 -135
  117. package/tests/adapter/ServedBucketHttpTest.res +65 -59
  118. package/tests/adapter/SortKey_FilterTest.res +19 -3
  119. package/tests/adapter/SqliteDriverTest.res +13 -10
  120. package/tests/adapter/TaskBucketTest.res +94 -80
  121. package/tests/components/aggregate/AggregateTest.res +31 -18
  122. package/tests/components/automationslice/AutomationSliceCallbackTest.res +259 -222
  123. package/tests/components/automationslice/AutomationSliceFixtures.res +4 -2
  124. package/tests/components/automationslice/AutomationSliceSelfDeadlockFixtures.res +38 -38
  125. package/tests/components/automationslice/MixedSourceAutomationSliceFixtures.res +12 -14
  126. package/tests/components/automationslice/MixedSourceAutomationSliceTest.res +8 -32
  127. package/tests/components/commandgenerator/CommandGeneratorFixtures.res +7 -5
  128. package/tests/components/commandgenerator/CommandGeneratorTest.res +40 -31
  129. package/tests/components/commandtopic/CommandTopicFixtures.res +3 -4
  130. package/tests/components/commandtopic/CommandTopicStreamFixtures.res +7 -5
  131. package/tests/components/commandtopic/CommandTopicTest.res +24 -15
  132. package/tests/components/counter/CounterFixtures.res +6 -8
  133. package/tests/components/dcb/DcbCrossPartitionFixtures.res +8 -2
  134. package/tests/components/dcb/DcbCrossPartitionReadTest.res +20 -13
  135. package/tests/components/dcb/DcbEventLogAppendStreamTest.res +12 -8
  136. package/tests/components/dcb/DcbEventLogStreamTest.res +88 -61
  137. package/tests/components/dcb/DcbFixtures.res +4 -1
  138. package/tests/components/dcb/DcbTest.res +9 -6
  139. package/tests/components/eventcollector/EventCollectorFixtures.res +0 -1
  140. package/tests/components/eventcollector/EventCollectorTest.res +6 -3
  141. package/tests/components/eventlog/EventLogAppendStreamTest.res +88 -68
  142. package/tests/components/eventlog/EventLogConflictTest.res +8 -4
  143. package/tests/components/eventlog/EventLogFixtures.res +3 -3
  144. package/tests/components/eventlog/EventLogProvisioningSeamTest.res +26 -13
  145. package/tests/components/eventlog/EventLogStreamTest.res +119 -56
  146. package/tests/components/eventlog/EventLogTest.res +20 -4
  147. package/tests/components/eventtopic/EventTopicFixtures.res +3 -3
  148. package/tests/components/eventtopic/EventTopicStreamFixtures.res +1 -2
  149. package/tests/components/eventtopic/EventTopicStreamTest.res +7 -1
  150. package/tests/components/extensionpoint/ExtensionPointFixtures.res +14 -9
  151. package/tests/components/extensionpoint/ExtensionPointTest.res +3 -2
  152. package/tests/components/heartbeat/HeartbeatFixtures.res +5 -6
  153. package/tests/components/heartbeat/HeartbeatTest.res +56 -47
  154. package/tests/components/inboundtranslationslice/InboundTranslationSliceCallbackTest.res +271 -249
  155. package/tests/components/inboundtranslationslice/InboundTranslationSliceFixtures.res +3 -2
  156. package/tests/components/outboundtranslationslice/OutboundTranslationSliceCallbackTest.res +361 -276
  157. package/tests/components/outboundtranslationslice/OutboundTranslationSliceFixtures.res +8 -10
  158. package/tests/components/outboundtranslationslice/OutboundTranslationSlicePlatformFixtures.res +37 -43
  159. package/tests/components/querydb/QueryDbFixtures.res +1 -5
  160. package/tests/components/querydb/QueryDbTest.res +2 -4
  161. package/tests/components/readmodel/DcbReadModelE2EFixtures.res +15 -18
  162. package/tests/components/readmodel/MixedSourceReadModelFixtures.res +5 -7
  163. package/tests/components/readmodel/ReadModelFixtures.res +8 -8
  164. package/tests/components/scheduler/SchedulerTest.res +76 -58
  165. package/tests/components/sideeffecthandler/SideEffectHandlerFixtures.res +4 -4
  166. package/tests/components/stateviewslice/StateViewSliceDisplayNameFixtures.res +5 -7
  167. package/tests/components/stateviewslice/StateViewSliceFixtures.res +8 -6
  168. package/tests/components/stateviewslice/StateViewSliceSubIdFixtures.res +17 -11
  169. package/tests/components/stateviewslice/StateViewSliceSubIdTest.res +12 -2
  170. package/tests/components/task/TaskFixtures.res +5 -5
  171. package/tests/components/task/TaskTest.res +95 -80
  172. package/tests/plugin/PluginsProjection_GWT.res +3 -1
  173. package/tests/plugin/UiFragments_GWT.res +6 -1
  174. package/tests/reset/LocalSeedResetTest.res +1 -0
@@ -9,144 +9,197 @@ let opts: Pulumi.CustomResourceOptions.t = {}
9
9
 
10
10
  describe("LocalQueryEngine", () => {
11
11
  describe("query", () => {
12
- testPromise("query by id returns items saved in the matching QueryDbStorage", async () => {
13
- module TestBus = LocalBus.Make()
14
- module Storage = LocalQueryDbStorage.Make(TestBus)
15
- module QE = LocalQueryEngine.Make(TestBus)
16
- let s = Storage.make(~name="users", ~indexes=[], ~api=(), ~apiRole=(), ~owner=None, ~opts)
17
- let ops = await s.operations->TestRunner.resolve
18
- let _ = await ops.save("user-1", JSON.Encode.string("Alice"), ReventlessCore.QueryDb.Any, None)
19
- let engine = await QE.make(Dict.make())->TestRunner.resolve
20
- let items = await engine.query(
21
- ~readModelName="users",
22
- ~id=Reventless.QueryEngine.String("user-1"),
23
- )
24
- expect(items->Array.length)->toBe(1)
25
- expect(items->Array.getUnsafe(0))->toEqual(JSON.Encode.string("Alice"))
26
- })
12
+ testPromise(
13
+ "query by id returns items saved in the matching QueryDbStorage",
14
+ async () => {
15
+ module TestBus = LocalBus.Make()
16
+ module Storage = LocalQueryDbStorage.Make(TestBus)
17
+ module QE = LocalQueryEngine.Make(TestBus)
18
+ let s = Storage.make(~name="users", ~indexes=[], ~api=(), ~apiRole=(), ~owner=None, ~opts)
19
+ let ops = await s.operations->TestRunner.resolve
20
+ let _ = await ops.save(
21
+ "user-1",
22
+ JSON.Encode.string("Alice"),
23
+ ReventlessCore.QueryDb.Any,
24
+ None,
25
+ )
26
+ let engine = await QE.make(Dict.make())->TestRunner.resolve
27
+ let items = await engine.query(
28
+ ~readModelName="users",
29
+ ~id=Reventless.QueryEngine.String("user-1"),
30
+ )
31
+ expect(items->Array.length)->toBe(1)
32
+ expect(items->Array.getUnsafe(0))->toEqual(JSON.Encode.string("Alice"))
33
+ },
34
+ )
27
35
 
28
- testPromise("query with explicit key overrides the id parameter", async () => {
29
- module TestBus = LocalBus.Make()
30
- module Storage = LocalQueryDbStorage.Make(TestBus)
31
- module QE = LocalQueryEngine.Make(TestBus)
32
- let s = Storage.make(~name="products", ~indexes=[], ~api=(), ~apiRole=(), ~owner=None, ~opts)
33
- let ops = await s.operations->TestRunner.resolve
34
- let _ =
35
- await ops.save("prod-key", JSON.Encode.string("Widget"), ReventlessCore.QueryDb.Any, None)
36
- let engine = await QE.make(Dict.make())->TestRunner.resolve
37
- let items = await engine.query(
38
- ~readModelName="products",
39
- ~key="prod-key",
40
- ~id=Reventless.QueryEngine.String("ignored"),
41
- )
42
- expect(items->Array.length)->toBe(1)
43
- expect(items->Array.getUnsafe(0))->toEqual(JSON.Encode.string("Widget"))
44
- })
36
+ testPromise(
37
+ "query with explicit key overrides the id parameter",
38
+ async () => {
39
+ module TestBus = LocalBus.Make()
40
+ module Storage = LocalQueryDbStorage.Make(TestBus)
41
+ module QE = LocalQueryEngine.Make(TestBus)
42
+ let s = Storage.make(
43
+ ~name="products",
44
+ ~indexes=[],
45
+ ~api=(),
46
+ ~apiRole=(),
47
+ ~owner=None,
48
+ ~opts,
49
+ )
50
+ let ops = await s.operations->TestRunner.resolve
51
+ let _ = await ops.save(
52
+ "prod-key",
53
+ JSON.Encode.string("Widget"),
54
+ ReventlessCore.QueryDb.Any,
55
+ None,
56
+ )
57
+ let engine = await QE.make(Dict.make())->TestRunner.resolve
58
+ let items = await engine.query(
59
+ ~readModelName="products",
60
+ ~key="prod-key",
61
+ ~id=Reventless.QueryEngine.String("ignored"),
62
+ )
63
+ expect(items->Array.length)->toBe(1)
64
+ expect(items->Array.getUnsafe(0))->toEqual(JSON.Encode.string("Widget"))
65
+ },
66
+ )
45
67
 
46
- testPromise("query for unknown readModelName returns empty array", async () => {
47
- module TestBus = LocalBus.Make()
48
- module QE = LocalQueryEngine.Make(TestBus)
49
- let engine = await QE.make(Dict.make())->TestRunner.resolve
50
- let items = await engine.query(
51
- ~readModelName="no-such-model",
52
- ~id=Reventless.QueryEngine.String("any"),
53
- )
54
- expect(items->Array.length)->toBe(0)
55
- })
68
+ testPromise(
69
+ "query for unknown readModelName returns empty array",
70
+ async () => {
71
+ module TestBus = LocalBus.Make()
72
+ module QE = LocalQueryEngine.Make(TestBus)
73
+ let engine = await QE.make(Dict.make())->TestRunner.resolve
74
+ let items = await engine.query(
75
+ ~readModelName="no-such-model",
76
+ ~id=Reventless.QueryEngine.String("any"),
77
+ )
78
+ expect(items->Array.length)->toBe(0)
79
+ },
80
+ )
56
81
 
57
- testPromise("query with Int id converts to string key for lookup", async () => {
58
- module TestBus = LocalBus.Make()
59
- module Storage = LocalQueryDbStorage.Make(TestBus)
60
- module QE = LocalQueryEngine.Make(TestBus)
61
- let s = Storage.make(~name="counters", ~indexes=[], ~api=(), ~apiRole=(), ~owner=None, ~opts)
62
- let ops = await s.operations->TestRunner.resolve
63
- let _ = await ops.save("42", JSON.Encode.int(100), ReventlessCore.QueryDb.Any, None)
64
- let engine = await QE.make(Dict.make())->TestRunner.resolve
65
- let items = await engine.query(
66
- ~readModelName="counters",
67
- ~id=Reventless.QueryEngine.Int(42),
68
- )
69
- expect(items->Array.length)->toBe(1)
70
- })
82
+ testPromise(
83
+ "query with Int id converts to string key for lookup",
84
+ async () => {
85
+ module TestBus = LocalBus.Make()
86
+ module Storage = LocalQueryDbStorage.Make(TestBus)
87
+ module QE = LocalQueryEngine.Make(TestBus)
88
+ let s = Storage.make(
89
+ ~name="counters",
90
+ ~indexes=[],
91
+ ~api=(),
92
+ ~apiRole=(),
93
+ ~owner=None,
94
+ ~opts,
95
+ )
96
+ let ops = await s.operations->TestRunner.resolve
97
+ let _ = await ops.save("42", JSON.Encode.int(100), ReventlessCore.QueryDb.Any, None)
98
+ let engine = await QE.make(Dict.make())->TestRunner.resolve
99
+ let items = await engine.query(
100
+ ~readModelName="counters",
101
+ ~id=Reventless.QueryEngine.Int(42),
102
+ )
103
+ expect(items->Array.length)->toBe(1)
104
+ },
105
+ )
71
106
  })
72
107
 
73
108
  describe("scan", () => {
74
- testPromise("scan returns all items from the matching QueryDbStorage", async () => {
75
- module TestBus = LocalBus.Make()
76
- module Storage = LocalQueryDbStorage.Make(TestBus)
77
- module QE = LocalQueryEngine.Make(TestBus)
78
- let s = Storage.make(~name="orders", ~indexes=[], ~api=(), ~apiRole=(), ~owner=None, ~opts)
79
- let ops = await s.operations->TestRunner.resolve
80
- let _ = await ops.save("o1", JSON.Encode.string("order1"), ReventlessCore.QueryDb.Any, None)
81
- let _ = await ops.save("o2", JSON.Encode.string("order2"), ReventlessCore.QueryDb.Any, None)
82
- let engine = await QE.make(Dict.make())->TestRunner.resolve
83
- let items = await engine.scan(~readModelName="orders", ~filterConfigs=[], ~limit=100)
84
- expect(items->Array.length)->toBe(2)
85
- })
109
+ testPromise(
110
+ "scan returns all items from the matching QueryDbStorage",
111
+ async () => {
112
+ module TestBus = LocalBus.Make()
113
+ module Storage = LocalQueryDbStorage.Make(TestBus)
114
+ module QE = LocalQueryEngine.Make(TestBus)
115
+ let s = Storage.make(~name="orders", ~indexes=[], ~api=(), ~apiRole=(), ~owner=None, ~opts)
116
+ let ops = await s.operations->TestRunner.resolve
117
+ let _ = await ops.save("o1", JSON.Encode.string("order1"), ReventlessCore.QueryDb.Any, None)
118
+ let _ = await ops.save("o2", JSON.Encode.string("order2"), ReventlessCore.QueryDb.Any, None)
119
+ let engine = await QE.make(Dict.make())->TestRunner.resolve
120
+ let items = await engine.scan(~readModelName="orders", ~filterConfigs=[], ~limit=100)
121
+ expect(items->Array.length)->toBe(2)
122
+ },
123
+ )
86
124
 
87
- testPromise("scan for unknown readModelName returns empty array", async () => {
88
- module TestBus = LocalBus.Make()
89
- module QE = LocalQueryEngine.Make(TestBus)
90
- let engine = await QE.make(Dict.make())->TestRunner.resolve
91
- let items = await engine.scan(~readModelName="no-such-model", ~filterConfigs=[], ~limit=100)
92
- expect(items->Array.length)->toBe(0)
93
- })
125
+ testPromise(
126
+ "scan for unknown readModelName returns empty array",
127
+ async () => {
128
+ module TestBus = LocalBus.Make()
129
+ module QE = LocalQueryEngine.Make(TestBus)
130
+ let engine = await QE.make(Dict.make())->TestRunner.resolve
131
+ let items = await engine.scan(~readModelName="no-such-model", ~filterConfigs=[], ~limit=100)
132
+ expect(items->Array.length)->toBe(0)
133
+ },
134
+ )
94
135
  })
95
136
 
96
137
  describe("scan with ~limit", () => {
97
- testPromise("~limit=2 on a 5-item QueryDb returns exactly 2 items", async () => {
98
- module TestBus = LocalBus.Make()
99
- module Storage = LocalQueryDbStorage.Make(TestBus)
100
- module QE = LocalQueryEngine.Make(TestBus)
101
- let s = Storage.make(~name="items", ~indexes=[], ~api=(), ~apiRole=(), ~owner=None, ~opts)
102
- let ops = await s.operations->TestRunner.resolve
103
- let _ = await ops.save("k1", JSON.Encode.string("a"), ReventlessCore.QueryDb.Any, None)
104
- let _ = await ops.save("k2", JSON.Encode.string("b"), ReventlessCore.QueryDb.Any, None)
105
- let _ = await ops.save("k3", JSON.Encode.string("c"), ReventlessCore.QueryDb.Any, None)
106
- let _ = await ops.save("k4", JSON.Encode.string("d"), ReventlessCore.QueryDb.Any, None)
107
- let _ = await ops.save("k5", JSON.Encode.string("e"), ReventlessCore.QueryDb.Any, None)
108
- let engine = await QE.make(Dict.make())->TestRunner.resolve
109
- let result = await engine.scan(~readModelName="items", ~filterConfigs=[], ~limit=2)
110
- expect(result->Array.length)->toBe(2)
111
- })
138
+ testPromise(
139
+ "~limit=2 on a 5-item QueryDb returns exactly 2 items",
140
+ async () => {
141
+ module TestBus = LocalBus.Make()
142
+ module Storage = LocalQueryDbStorage.Make(TestBus)
143
+ module QE = LocalQueryEngine.Make(TestBus)
144
+ let s = Storage.make(~name="items", ~indexes=[], ~api=(), ~apiRole=(), ~owner=None, ~opts)
145
+ let ops = await s.operations->TestRunner.resolve
146
+ let _ = await ops.save("k1", JSON.Encode.string("a"), ReventlessCore.QueryDb.Any, None)
147
+ let _ = await ops.save("k2", JSON.Encode.string("b"), ReventlessCore.QueryDb.Any, None)
148
+ let _ = await ops.save("k3", JSON.Encode.string("c"), ReventlessCore.QueryDb.Any, None)
149
+ let _ = await ops.save("k4", JSON.Encode.string("d"), ReventlessCore.QueryDb.Any, None)
150
+ let _ = await ops.save("k5", JSON.Encode.string("e"), ReventlessCore.QueryDb.Any, None)
151
+ let engine = await QE.make(Dict.make())->TestRunner.resolve
152
+ let result = await engine.scan(~readModelName="items", ~filterConfigs=[], ~limit=2)
153
+ expect(result->Array.length)->toBe(2)
154
+ },
155
+ )
112
156
 
113
- testPromise("~limit larger than total returns all items (no padding)", async () => {
114
- module TestBus = LocalBus.Make()
115
- module Storage = LocalQueryDbStorage.Make(TestBus)
116
- module QE = LocalQueryEngine.Make(TestBus)
117
- let s = Storage.make(~name="things", ~indexes=[], ~api=(), ~apiRole=(), ~owner=None, ~opts)
118
- let ops = await s.operations->TestRunner.resolve
119
- let _ = await ops.save("t1", JSON.Encode.string("x"), ReventlessCore.QueryDb.Any, None)
120
- let _ = await ops.save("t2", JSON.Encode.string("y"), ReventlessCore.QueryDb.Any, None)
121
- let engine = await QE.make(Dict.make())->TestRunner.resolve
122
- let result = await engine.scan(~readModelName="things", ~filterConfigs=[], ~limit=100)
123
- expect(result->Array.length)->toBe(2)
124
- })
157
+ testPromise(
158
+ "~limit larger than total returns all items (no padding)",
159
+ async () => {
160
+ module TestBus = LocalBus.Make()
161
+ module Storage = LocalQueryDbStorage.Make(TestBus)
162
+ module QE = LocalQueryEngine.Make(TestBus)
163
+ let s = Storage.make(~name="things", ~indexes=[], ~api=(), ~apiRole=(), ~owner=None, ~opts)
164
+ let ops = await s.operations->TestRunner.resolve
165
+ let _ = await ops.save("t1", JSON.Encode.string("x"), ReventlessCore.QueryDb.Any, None)
166
+ let _ = await ops.save("t2", JSON.Encode.string("y"), ReventlessCore.QueryDb.Any, None)
167
+ let engine = await QE.make(Dict.make())->TestRunner.resolve
168
+ let result = await engine.scan(~readModelName="things", ~filterConfigs=[], ~limit=100)
169
+ expect(result->Array.length)->toBe(2)
170
+ },
171
+ )
125
172
 
126
- testPromise("~limit=0 returns empty array", async () => {
127
- module TestBus = LocalBus.Make()
128
- module Storage = LocalQueryDbStorage.Make(TestBus)
129
- module QE = LocalQueryEngine.Make(TestBus)
130
- let s = Storage.make(~name="stuff", ~indexes=[], ~api=(), ~apiRole=(), ~owner=None, ~opts)
131
- let ops = await s.operations->TestRunner.resolve
132
- let _ = await ops.save("s1", JSON.Encode.string("z"), ReventlessCore.QueryDb.Any, None)
133
- let engine = await QE.make(Dict.make())->TestRunner.resolve
134
- let result = await engine.scan(~readModelName="stuff", ~filterConfigs=[], ~limit=0)
135
- expect(result->Array.length)->toBe(0)
136
- })
173
+ testPromise(
174
+ "~limit=0 returns empty array",
175
+ async () => {
176
+ module TestBus = LocalBus.Make()
177
+ module Storage = LocalQueryDbStorage.Make(TestBus)
178
+ module QE = LocalQueryEngine.Make(TestBus)
179
+ let s = Storage.make(~name="stuff", ~indexes=[], ~api=(), ~apiRole=(), ~owner=None, ~opts)
180
+ let ops = await s.operations->TestRunner.resolve
181
+ let _ = await ops.save("s1", JSON.Encode.string("z"), ReventlessCore.QueryDb.Any, None)
182
+ let engine = await QE.make(Dict.make())->TestRunner.resolve
183
+ let result = await engine.scan(~readModelName="stuff", ~filterConfigs=[], ~limit=0)
184
+ expect(result->Array.length)->toBe(0)
185
+ },
186
+ )
137
187
 
138
- testPromise("~limit=3 on a 3-item QueryDb returns all 3 items", async () => {
139
- module TestBus = LocalBus.Make()
140
- module Storage = LocalQueryDbStorage.Make(TestBus)
141
- module QE = LocalQueryEngine.Make(TestBus)
142
- let s = Storage.make(~name="widgets", ~indexes=[], ~api=(), ~apiRole=(), ~owner=None, ~opts)
143
- let ops = await s.operations->TestRunner.resolve
144
- let _ = await ops.save("w1", JSON.Encode.string("p"), ReventlessCore.QueryDb.Any, None)
145
- let _ = await ops.save("w2", JSON.Encode.string("q"), ReventlessCore.QueryDb.Any, None)
146
- let _ = await ops.save("w3", JSON.Encode.string("r"), ReventlessCore.QueryDb.Any, None)
147
- let engine = await QE.make(Dict.make())->TestRunner.resolve
148
- let result = await engine.scan(~readModelName="widgets", ~filterConfigs=[], ~limit=3)
149
- expect(result->Array.length)->toBe(3)
150
- })
188
+ testPromise(
189
+ "~limit=3 on a 3-item QueryDb returns all 3 items",
190
+ async () => {
191
+ module TestBus = LocalBus.Make()
192
+ module Storage = LocalQueryDbStorage.Make(TestBus)
193
+ module QE = LocalQueryEngine.Make(TestBus)
194
+ let s = Storage.make(~name="widgets", ~indexes=[], ~api=(), ~apiRole=(), ~owner=None, ~opts)
195
+ let ops = await s.operations->TestRunner.resolve
196
+ let _ = await ops.save("w1", JSON.Encode.string("p"), ReventlessCore.QueryDb.Any, None)
197
+ let _ = await ops.save("w2", JSON.Encode.string("q"), ReventlessCore.QueryDb.Any, None)
198
+ let _ = await ops.save("w3", JSON.Encode.string("r"), ReventlessCore.QueryDb.Any, None)
199
+ let engine = await QE.make(Dict.make())->TestRunner.resolve
200
+ let result = await engine.scan(~readModelName="widgets", ~filterConfigs=[], ~limit=3)
201
+ expect(result->Array.length)->toBe(3)
202
+ },
203
+ )
151
204
  })
152
205
  })