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

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 (170) hide show
  1. package/CHANGELOG.md +8 -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 +11 -15
  15. package/src/adapter/Auth/UserStore.res +5 -7
  16. package/src/adapter/Backend.res +1 -2
  17. package/src/adapter/CommandGenerator/CommandGeneratorResolvers_GraphQL.res +42 -26
  18. package/src/adapter/CommandGenerator/InboundTranslationResolvers_GraphQL.res +13 -3
  19. package/src/adapter/CommandTopic/LocalCommandTopicChannel.res +15 -17
  20. package/src/adapter/CommandTopic/LocalCommandTopicRemoteChannel.res +18 -22
  21. package/src/adapter/Counter/LocalCounterHandler.res +1 -1
  22. package/src/adapter/DcbEventLog/DcbEventLogStorage_InMemory.res +33 -22
  23. package/src/adapter/DcbEventLog/DcbEventLogStorage_Sqlite.res +57 -57
  24. package/src/adapter/DomainGraphQL_Server.res +35 -34
  25. package/src/adapter/DomainMCP_Server.res +45 -41
  26. package/src/adapter/EventCollector/LocalEventCollectorChannel.res +47 -36
  27. package/src/adapter/EventHistory/EventHistoryResolvers_GraphQL.res +15 -12
  28. package/src/adapter/EventLog/EventLogStorage_InMemory.res +9 -4
  29. package/src/adapter/EventLog/EventLogStorage_Sqlite.res +36 -24
  30. package/src/adapter/EventTopic/LocalEventTopicPublisher.res +9 -3
  31. package/src/adapter/Heartbeat/LocalHeartbeatRunner.res +9 -14
  32. package/src/adapter/LocalBus.res +12 -12
  33. package/src/adapter/LocalCapabilities.res.mjs +1 -1
  34. package/src/adapter/LocalGeocodeResolvers.res +1 -4
  35. package/src/adapter/LocalSideEffectHandler.res +1 -1
  36. package/src/adapter/LocalStateChangeDescriptor.res +2 -1
  37. package/src/adapter/MCP_ServerInstance.res +51 -39
  38. package/src/adapter/ObjectStore/LocalObjectStore.res +5 -2
  39. package/src/adapter/ObjectStore/ObjectStoreStorage_FileSystem.res +1 -2
  40. package/src/adapter/PlatformGraphQL_Server.res +9 -5
  41. package/src/adapter/ProjectionCheckpoint.res +8 -1
  42. package/src/adapter/ProjectionPending.res +1 -3
  43. package/src/adapter/QueryDb/LocalQueryDbStorage.res +2 -1
  44. package/src/adapter/QueryDb/QueryDbResolvers_GraphQL.res +367 -269
  45. package/src/adapter/QueryDb/QueryDbStorage_InMemory.res +5 -3
  46. package/src/adapter/QueryDb/QueryDbStorage_Sqlite.res +63 -40
  47. package/src/adapter/QueryDb/SortKey_Filter.res +14 -6
  48. package/src/adapter/Runtime/LocalAggregateRuntime_Builder.res +12 -10
  49. package/src/adapter/Runtime/LocalEventCollectorRuntime_Builder.res +8 -2
  50. package/src/adapter/Runtime/LocalPluginRuntime_Builder.res +1 -4
  51. package/src/adapter/Scheduler/LocalScheduledPublisher.res +12 -12
  52. package/src/adapter/SqliteDriver.res +16 -4
  53. package/src/adapter/Task/TaskBucket_Sqlite.res +5 -6
  54. package/src/components/Aggregate_Builder.res +6 -1
  55. package/src/components/Counter_Builder.res +1 -5
  56. package/src/components/DcbEventLog_Builder.res +5 -3
  57. package/src/components/ExtensionPoint_Builder.res +13 -15
  58. package/src/components/InboundTranslationSlice_Builder.res +3 -2
  59. package/src/components/OutboundTranslationSlice_Builder.res +3 -2
  60. package/src/components/ReadModel_Builder.res +18 -20
  61. package/src/components/StateViewSlice_Builder.res +3 -2
  62. package/src/components/Task_Builder.res +12 -13
  63. package/src/reset/LocalSeedReset.res +2 -5
  64. package/src/test/Mocks/MockDcbEventLogStorage.res +5 -1
  65. package/src/test/Mocks/MockEventLogStorage.res +8 -3
  66. package/src/test/Mocks/MockQueryDbStorage.res +3 -2
  67. package/src/test/TestRunner.res +1 -1
  68. package/tests/BakedManifestFilesTest.res +7 -10
  69. package/tests/LocalEventTapTest.res +26 -21
  70. package/tests/LocalPlatformStartTest.res +33 -28
  71. package/tests/PluginEventDecodeTest.res +3 -3
  72. package/tests/ShellConfigTest.res +30 -21
  73. package/tests/SplitApiFixtures.res +34 -10
  74. package/tests/SplitApiTest.res +92 -62
  75. package/tests/adapter/BackendParityTest.res +180 -130
  76. package/tests/adapter/CollectNEventsTest.res +6 -4
  77. package/tests/adapter/CommandAuthorizationTest.res +47 -41
  78. package/tests/adapter/CommandTopicChannelTest.res +163 -139
  79. package/tests/adapter/CounterHandlerTest.res +95 -77
  80. package/tests/adapter/DcbEventLogStorageSqliteTest.res +171 -168
  81. package/tests/adapter/DcbEventLogStorageTest.res +264 -207
  82. package/tests/adapter/DomainGraphQL_ServerTest.res +53 -43
  83. package/tests/adapter/EventCollectorChannelTest.res +153 -124
  84. package/tests/adapter/EventHistoryResolverTest.res +46 -18
  85. package/tests/adapter/EventLogSnapshotParityTest.res +57 -45
  86. package/tests/adapter/EventLogStorageSqliteTest.res +9 -10
  87. package/tests/adapter/EventTapTest.res +37 -20
  88. package/tests/adapter/EventTopicPublisherTest.res +74 -50
  89. package/tests/adapter/GraphQLSubscriptionBridgeTest.res +4 -3
  90. package/tests/adapter/GraphQL_SchemaInspectorTest.res +666 -568
  91. package/tests/adapter/GraphQL_SubscriptionResolversTest.res +105 -96
  92. package/tests/adapter/HeartbeatRunnerTest.res +99 -81
  93. package/tests/adapter/InboundTranslationMutationTest.res +4 -1
  94. package/tests/adapter/LocalAuthHttpTest.res +79 -85
  95. package/tests/adapter/LocalAuthLoginTest.res +42 -50
  96. package/tests/adapter/LocalAuthTest.res +8 -16
  97. package/tests/adapter/LocalAuthUserStoreTest.res +2 -7
  98. package/tests/adapter/LocalBusBoundedTest.res +187 -117
  99. package/tests/adapter/LocalBusPubSubTest.res +118 -76
  100. package/tests/adapter/LocalDispatchContextTest.res +1 -2
  101. package/tests/adapter/LocalEvents_ServerTest.res +242 -187
  102. package/tests/adapter/PgProjectionCatchupTest.res +44 -10
  103. package/tests/adapter/ProjectionCheckpointTest.res +261 -206
  104. package/tests/adapter/QueryDbGsiTtlTest.res +123 -83
  105. package/tests/adapter/QueryDbListPushdownParityTest.res +107 -67
  106. package/tests/adapter/QueryDbListResolverTest.res +225 -208
  107. package/tests/adapter/QueryDbResolvedFieldsTest.res +17 -14
  108. package/tests/adapter/QueryDbStorageSqliteTest.res +33 -49
  109. package/tests/adapter/QueryDbStorageTest.res +163 -117
  110. package/tests/adapter/QueryDbUnionRoundTripTest.res +8 -10
  111. package/tests/adapter/QueryEngineTest.res +179 -126
  112. package/tests/adapter/ScheduledPublisherTest.res +171 -135
  113. package/tests/adapter/ServedBucketHttpTest.res +65 -59
  114. package/tests/adapter/SortKey_FilterTest.res +19 -3
  115. package/tests/adapter/SqliteDriverTest.res +13 -10
  116. package/tests/adapter/TaskBucketTest.res +94 -80
  117. package/tests/components/aggregate/AggregateTest.res +31 -18
  118. package/tests/components/automationslice/AutomationSliceCallbackTest.res +259 -222
  119. package/tests/components/automationslice/AutomationSliceFixtures.res +4 -2
  120. package/tests/components/automationslice/AutomationSliceSelfDeadlockFixtures.res +38 -38
  121. package/tests/components/automationslice/MixedSourceAutomationSliceFixtures.res +12 -14
  122. package/tests/components/automationslice/MixedSourceAutomationSliceTest.res +8 -32
  123. package/tests/components/commandgenerator/CommandGeneratorFixtures.res +7 -5
  124. package/tests/components/commandgenerator/CommandGeneratorTest.res +40 -31
  125. package/tests/components/commandtopic/CommandTopicFixtures.res +3 -4
  126. package/tests/components/commandtopic/CommandTopicStreamFixtures.res +7 -5
  127. package/tests/components/commandtopic/CommandTopicTest.res +24 -15
  128. package/tests/components/counter/CounterFixtures.res +6 -8
  129. package/tests/components/dcb/DcbCrossPartitionFixtures.res +8 -2
  130. package/tests/components/dcb/DcbCrossPartitionReadTest.res +20 -13
  131. package/tests/components/dcb/DcbEventLogAppendStreamTest.res +12 -8
  132. package/tests/components/dcb/DcbEventLogStreamTest.res +88 -61
  133. package/tests/components/dcb/DcbFixtures.res +4 -1
  134. package/tests/components/dcb/DcbTest.res +9 -6
  135. package/tests/components/eventcollector/EventCollectorFixtures.res +0 -1
  136. package/tests/components/eventcollector/EventCollectorTest.res +6 -3
  137. package/tests/components/eventlog/EventLogAppendStreamTest.res +88 -68
  138. package/tests/components/eventlog/EventLogConflictTest.res +8 -4
  139. package/tests/components/eventlog/EventLogFixtures.res +3 -3
  140. package/tests/components/eventlog/EventLogProvisioningSeamTest.res +26 -13
  141. package/tests/components/eventlog/EventLogStreamTest.res +119 -56
  142. package/tests/components/eventlog/EventLogTest.res +20 -4
  143. package/tests/components/eventtopic/EventTopicFixtures.res +3 -3
  144. package/tests/components/eventtopic/EventTopicStreamFixtures.res +1 -2
  145. package/tests/components/eventtopic/EventTopicStreamTest.res +7 -1
  146. package/tests/components/extensionpoint/ExtensionPointFixtures.res +14 -9
  147. package/tests/components/extensionpoint/ExtensionPointTest.res +3 -2
  148. package/tests/components/heartbeat/HeartbeatFixtures.res +5 -6
  149. package/tests/components/heartbeat/HeartbeatTest.res +56 -47
  150. package/tests/components/inboundtranslationslice/InboundTranslationSliceCallbackTest.res +271 -249
  151. package/tests/components/inboundtranslationslice/InboundTranslationSliceFixtures.res +3 -2
  152. package/tests/components/outboundtranslationslice/OutboundTranslationSliceCallbackTest.res +361 -276
  153. package/tests/components/outboundtranslationslice/OutboundTranslationSliceFixtures.res +8 -10
  154. package/tests/components/outboundtranslationslice/OutboundTranslationSlicePlatformFixtures.res +37 -43
  155. package/tests/components/querydb/QueryDbFixtures.res +1 -5
  156. package/tests/components/querydb/QueryDbTest.res +2 -4
  157. package/tests/components/readmodel/DcbReadModelE2EFixtures.res +15 -18
  158. package/tests/components/readmodel/MixedSourceReadModelFixtures.res +5 -7
  159. package/tests/components/readmodel/ReadModelFixtures.res +8 -8
  160. package/tests/components/scheduler/SchedulerTest.res +76 -58
  161. package/tests/components/sideeffecthandler/SideEffectHandlerFixtures.res +4 -4
  162. package/tests/components/stateviewslice/StateViewSliceDisplayNameFixtures.res +5 -7
  163. package/tests/components/stateviewslice/StateViewSliceFixtures.res +8 -6
  164. package/tests/components/stateviewslice/StateViewSliceSubIdFixtures.res +17 -11
  165. package/tests/components/stateviewslice/StateViewSliceSubIdTest.res +12 -2
  166. package/tests/components/task/TaskFixtures.res +5 -5
  167. package/tests/components/task/TaskTest.res +95 -80
  168. package/tests/plugin/PluginsProjection_GWT.res +3 -1
  169. package/tests/plugin/UiFragments_GWT.res +6 -1
  170. 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
  })