remult 0.22.2 → 0.22.3

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 (255) hide show
  1. package/esm/graphql.js +27 -27
  2. package/esm/postgres/schema-builder.js +4 -4
  3. package/esm/remult-knex/index.js +2 -2
  4. package/esm/src/backend-tests/backend-database-test-setup.backend-spec.js +10 -0
  5. package/esm/src/id-entity.d.ts +4 -0
  6. package/esm/src/id-entity.js +8 -0
  7. package/esm/src/remult3/RepositoryImplementation.js +7 -5
  8. package/esm/src/shared-tests/db-tests.db-tests.js +35 -0
  9. package/package.json +1 -1
  10. package/postgres/postgresColumnSyntax.d.ts +2 -0
  11. package/postgres/postgresColumnSyntax.js +34 -0
  12. package/remult-knex/index.js +2 -2
  13. package/remult-middleware.d.ts +2 -0
  14. package/remult-middleware.js +70 -0
  15. package/server/register-actions-on-server.d.ts +3 -0
  16. package/server/register-actions-on-server.js +50 -0
  17. package/server/register-entities-on-server.d.ts +3 -0
  18. package/server/register-entities-on-server.js +19 -0
  19. package/src/backend-tests/backend-database-test-setup.backend-spec.js +10 -0
  20. package/{esm/core/src → src}/backend-tests/my-test.backend-spec.d.ts +1 -1
  21. package/src/backend-tests/my-test.backend-spec.js +217 -0
  22. package/src/backend-tests/test-http-server.backend-spec.d.ts +6 -0
  23. package/src/backend-tests/test-http-server.backend-spec.js +342 -0
  24. package/src/id-entity.d.ts +4 -0
  25. package/src/id-entity.js +17 -0
  26. package/src/remult3/RepositoryImplementation.js +15 -13
  27. package/src/shared-tests/db-tests.db-tests.js +64 -0
  28. package/{esm/core/src/valueConverters.d.ts → valueConverters.d.ts} +12 -13
  29. package/valueConverters.js +168 -0
  30. package/esm/angular/interfaces/index.d.ts +0 -1
  31. package/esm/angular/interfaces/index.js +0 -1
  32. package/esm/angular/interfaces/src/column-collection.d.ts +0 -70
  33. package/esm/angular/interfaces/src/column-collection.js +0 -341
  34. package/esm/angular/interfaces/src/data-area-settings.d.ts +0 -15
  35. package/esm/angular/interfaces/src/data-area-settings.js +0 -35
  36. package/esm/angular/interfaces/src/data-control-interfaces.d.ts +0 -36
  37. package/esm/angular/interfaces/src/data-control-interfaces.js +0 -57
  38. package/esm/angular/interfaces/src/dataList.d.ts +0 -13
  39. package/esm/angular/interfaces/src/dataList.js +0 -42
  40. package/esm/angular/interfaces/src/filter-helper.d.ts +0 -13
  41. package/esm/angular/interfaces/src/filter-helper.js +0 -59
  42. package/esm/angular/interfaces/src/grid-settings.d.ts +0 -145
  43. package/esm/angular/interfaces/src/grid-settings.js +0 -387
  44. package/esm/angular/interfaces/src/public_api.d.ts +0 -4
  45. package/esm/angular/interfaces/src/public_api.js +0 -4
  46. package/esm/angular/src/angular/RemultAngularPluginsService.d.ts +0 -4
  47. package/esm/angular/src/angular/RemultAngularPluginsService.js +0 -3
  48. package/esm/angular/src/angular/data-control/data-control2.component.d.ts +0 -49
  49. package/esm/angular/src/angular/data-control/data-control2.component.js +0 -138
  50. package/esm/core/SseSubscriptionServer.d.ts +0 -33
  51. package/esm/core/SseSubscriptionServer.js +0 -107
  52. package/esm/core/assign.d.ts +0 -1
  53. package/esm/core/assign.js +0 -5
  54. package/esm/core/classType.d.ts +0 -3
  55. package/esm/core/classType.js +0 -1
  56. package/esm/core/index.d.ts +0 -27
  57. package/esm/core/index.js +0 -25
  58. package/esm/core/inputTypes.d.ts +0 -9
  59. package/esm/core/inputTypes.js +0 -9
  60. package/esm/core/live-query/data-provider-live-query-storage.d.ts +0 -22
  61. package/esm/core/live-query/data-provider-live-query-storage.js +0 -71
  62. package/esm/core/postgres/index.d.ts +0 -2
  63. package/esm/core/postgres/index.js +0 -2
  64. package/esm/core/postgres/postgres-data-provider.d.ts +0 -36
  65. package/esm/core/postgres/postgres-data-provider.js +0 -120
  66. package/esm/core/postgres/schema-builder.d.ts +0 -17
  67. package/esm/core/postgres/schema-builder.js +0 -153
  68. package/esm/core/remult-fresh.d.ts +0 -17
  69. package/esm/core/remult-fresh.js +0 -29
  70. package/esm/core/remult-knex/index.d.ts +0 -30
  71. package/esm/core/remult-knex/index.js +0 -446
  72. package/esm/core/remult-mongo.d.ts +0 -24
  73. package/esm/core/remult-mongo.js +0 -254
  74. package/esm/core/server/JsonEntityFileStorage.d.ts +0 -10
  75. package/esm/core/server/JsonEntityFileStorage.js +0 -25
  76. package/esm/core/server/core.d.ts +0 -4
  77. package/esm/core/server/core.js +0 -4
  78. package/esm/core/server/expressBridge.d.ts +0 -182
  79. package/esm/core/server/expressBridge.js +0 -938
  80. package/esm/core/server/index.d.ts +0 -6
  81. package/esm/core/server/index.js +0 -9
  82. package/esm/core/server/initAsyncHooks.d.ts +0 -1
  83. package/esm/core/server/initAsyncHooks.js +0 -9
  84. package/esm/core/server/initDataProvider.d.ts +0 -2
  85. package/esm/core/server/initDataProvider.js +0 -14
  86. package/esm/core/src/__EntityValueProvider.d.ts +0 -11
  87. package/esm/core/src/__EntityValueProvider.js +0 -1
  88. package/esm/core/src/__RowsOfDataForTesting.d.ts +0 -3
  89. package/esm/core/src/__RowsOfDataForTesting.js +0 -1
  90. package/esm/core/src/backend-tests/backend-database-test-setup.backend-spec.d.ts +0 -6
  91. package/esm/core/src/backend-tests/backend-database-test-setup.backend-spec.js +0 -147
  92. package/esm/core/src/backend-tests/my-test.backend-spec.js +0 -197
  93. package/esm/core/src/backend-tests/test-http-server.backend-spec.d.ts +0 -1
  94. package/esm/core/src/backend-tests/test-http-server.backend-spec.js +0 -167
  95. package/esm/core/src/buildRestDataProvider.d.ts +0 -31
  96. package/esm/core/src/buildRestDataProvider.js +0 -113
  97. package/esm/core/src/column-interfaces.d.ts +0 -154
  98. package/esm/core/src/column-interfaces.js +0 -7
  99. package/esm/core/src/column.d.ts +0 -58
  100. package/esm/core/src/column.js +0 -174
  101. package/esm/core/src/context.d.ts +0 -134
  102. package/esm/core/src/context.js +0 -286
  103. package/esm/core/src/data-api.d.ts +0 -39
  104. package/esm/core/src/data-api.js +0 -279
  105. package/esm/core/src/data-interfaces.d.ts +0 -41
  106. package/esm/core/src/data-interfaces.js +0 -12
  107. package/esm/core/src/data-providers/array-entity-data-provider.d.ts +0 -22
  108. package/esm/core/src/data-providers/array-entity-data-provider.js +0 -252
  109. package/esm/core/src/data-providers/in-memory-database.d.ts +0 -9
  110. package/esm/core/src/data-providers/in-memory-database.js +0 -14
  111. package/esm/core/src/data-providers/json-data-provider.d.ts +0 -12
  112. package/esm/core/src/data-providers/json-data-provider.js +0 -55
  113. package/esm/core/src/data-providers/rest-data-provider.d.ts +0 -49
  114. package/esm/core/src/data-providers/rest-data-provider.js +0 -256
  115. package/esm/core/src/data-providers/sql-database.d.ts +0 -33
  116. package/esm/core/src/data-providers/sql-database.js +0 -384
  117. package/esm/core/src/data-providers/web-sql-data-provider.d.ts +0 -24
  118. package/esm/core/src/data-providers/web-sql-data-provider.js +0 -143
  119. package/esm/core/src/entity.d.ts +0 -91
  120. package/esm/core/src/entity.js +0 -1
  121. package/esm/core/src/filter/filter-consumer-bridge-to-sql-request.d.ts +0 -50
  122. package/esm/core/src/filter/filter-consumer-bridge-to-sql-request.js +0 -150
  123. package/esm/core/src/filter/filter-consumer-bridge-to-url-builder.d.ts +0 -1
  124. package/esm/core/src/filter/filter-consumer-bridge-to-url-builder.js +0 -1
  125. package/esm/core/src/filter/filter-interfaces.d.ts +0 -85
  126. package/esm/core/src/filter/filter-interfaces.js +0 -477
  127. package/esm/core/src/live-query/LiveQueryClient.d.ts +0 -20
  128. package/esm/core/src/live-query/LiveQueryClient.js +0 -188
  129. package/esm/core/src/live-query/SseSubscriptionClient.d.ts +0 -5
  130. package/esm/core/src/live-query/SseSubscriptionClient.js +0 -86
  131. package/esm/core/src/live-query/SubscriptionChannel.d.ts +0 -72
  132. package/esm/core/src/live-query/SubscriptionChannel.js +0 -123
  133. package/esm/core/src/live-query/SubscriptionServer.d.ts +0 -53
  134. package/esm/core/src/live-query/SubscriptionServer.js +0 -111
  135. package/esm/core/src/live-query/live-query-tests.spec.d.ts +0 -6
  136. package/esm/core/src/live-query/live-query-tests.spec.js +0 -952
  137. package/esm/core/src/remult-proxy.d.ts +0 -35
  138. package/esm/core/src/remult-proxy.js +0 -113
  139. package/esm/core/src/remult3/DecoratorReplacer.d.ts +0 -10
  140. package/esm/core/src/remult3/DecoratorReplacer.js +0 -20
  141. package/esm/core/src/remult3/RepositoryImplementation.d.ts +0 -355
  142. package/esm/core/src/remult3/RepositoryImplementation.js +0 -2109
  143. package/esm/core/src/remult3/index.d.ts +0 -2
  144. package/esm/core/src/remult3/index.js +0 -2
  145. package/esm/core/src/remult3/remult3.d.ts +0 -395
  146. package/esm/core/src/remult3/remult3.js +0 -2
  147. package/esm/core/src/server-action.d.ts +0 -81
  148. package/esm/core/src/server-action.js +0 -394
  149. package/esm/core/src/shared-tests/db-tests-setup.d.ts +0 -32
  150. package/esm/core/src/shared-tests/db-tests-setup.js +0 -78
  151. package/esm/core/src/shared-tests/db-tests.db-tests.d.ts +0 -25
  152. package/esm/core/src/shared-tests/db-tests.db-tests.js +0 -810
  153. package/esm/core/src/shared-tests/deleteAll.d.ts +0 -2
  154. package/esm/core/src/shared-tests/deleteAll.js +0 -4
  155. package/esm/core/src/shared-tests/entityWithValidations.d.ts +0 -14
  156. package/esm/core/src/shared-tests/entityWithValidations.js +0 -43
  157. package/esm/core/src/shared-tests/index.d.ts +0 -4
  158. package/esm/core/src/shared-tests/index.js +0 -4
  159. package/esm/core/src/shared-tests/test-custom-id-column.spec.d.ts +0 -1
  160. package/esm/core/src/shared-tests/test-custom-id-column.spec.js +0 -67
  161. package/esm/core/src/shared-tests/test-special-value.spec.d.ts +0 -10
  162. package/esm/core/src/shared-tests/test-special-value.spec.js +0 -73
  163. package/esm/core/src/shared-tests/test-update-with-null.spec.d.ts +0 -1
  164. package/esm/core/src/shared-tests/test-update-with-null.spec.js +0 -31
  165. package/esm/core/src/sort.d.ts +0 -16
  166. package/esm/core/src/sort.js +0 -103
  167. package/esm/core/src/sql-command.d.ts +0 -19
  168. package/esm/core/src/sql-command.js +0 -1
  169. package/esm/core/src/test.d.ts +0 -3
  170. package/esm/core/src/test.js +0 -12
  171. package/esm/core/src/tests/Done.d.ts +0 -5
  172. package/esm/core/src/tests/Done.js +0 -9
  173. package/esm/core/src/tests/RowProvider.spec.d.ts +0 -16
  174. package/esm/core/src/tests/RowProvider.spec.js +0 -631
  175. package/esm/core/src/tests/TestDataApiResponse.d.ts +0 -10
  176. package/esm/core/src/tests/TestDataApiResponse.js +0 -22
  177. package/esm/core/src/tests/basicRowFunctionality.spec.d.ts +0 -8
  178. package/esm/core/src/tests/basicRowFunctionality.spec.js +0 -2103
  179. package/esm/core/src/tests/c.d.ts +0 -8
  180. package/esm/core/src/tests/c.js +0 -13
  181. package/esm/core/src/tests/createData.d.ts +0 -7
  182. package/esm/core/src/tests/createData.js +0 -22
  183. package/esm/core/src/tests/d.d.ts +0 -6
  184. package/esm/core/src/tests/d.js +0 -11
  185. package/esm/core/src/tests/dWithPrefilter.d.ts +0 -7
  186. package/esm/core/src/tests/dWithPrefilter.js +0 -18
  187. package/esm/core/src/tests/entityForCustomFilter.d.ts +0 -16
  188. package/esm/core/src/tests/entityForCustomFilter.js +0 -33
  189. package/esm/core/src/tests/entityWithValidationsOnColumn.d.ts +0 -5
  190. package/esm/core/src/tests/entityWithValidationsOnColumn.js +0 -13
  191. package/esm/core/src/tests/frontend-database-tests-setup.spec.d.ts +0 -4
  192. package/esm/core/src/tests/frontend-database-tests-setup.spec.js +0 -37
  193. package/esm/core/src/tests/h.d.ts +0 -6
  194. package/esm/core/src/tests/h.js +0 -24
  195. package/esm/core/src/tests/remult-3-basic-tests.spec.d.ts +0 -1
  196. package/esm/core/src/tests/remult-3-basic-tests.spec.js +0 -236
  197. package/esm/core/src/tests/remult-3-entities.d.ts +0 -23
  198. package/esm/core/src/tests/remult-3-entities.js +0 -39
  199. package/esm/core/src/tests/tasks.d.ts +0 -6
  200. package/esm/core/src/tests/tasks.js +0 -10
  201. package/esm/core/src/tests/test-context-as-storage.spec.d.ts +0 -0
  202. package/esm/core/src/tests/test-context-as-storage.spec.js +0 -1
  203. package/esm/core/src/tests/test-data-api/predefined-filter.spec.d.ts +0 -1
  204. package/esm/core/src/tests/test-data-api/predefined-filter.spec.js +0 -389
  205. package/esm/core/src/tests/test-data-api/test-put-with-validation.spec.d.ts +0 -5
  206. package/esm/core/src/tests/test-data-api/test-put-with-validation.spec.js +0 -152
  207. package/esm/core/src/tests/test-decorator-precedence.spec.d.ts +0 -1
  208. package/esm/core/src/tests/test-decorator-precedence.spec.js +0 -38
  209. package/esm/core/src/tests/test-default-value.spec.d.ts +0 -1
  210. package/esm/core/src/tests/test-default-value.spec.js +0 -33
  211. package/esm/core/src/tests/test-entity-inheritance.spec.d.ts +0 -14
  212. package/esm/core/src/tests/test-entity-inheritance.spec.js +0 -82
  213. package/esm/core/src/tests/test-exceptions.spec.d.ts +0 -1
  214. package/esm/core/src/tests/test-exceptions.spec.js +0 -375
  215. package/esm/core/src/tests/test-json.spec.d.ts +0 -1
  216. package/esm/core/src/tests/test-json.spec.js +0 -115
  217. package/esm/core/src/tests/test-many-to-one-relation-in-entity.spec.d.ts +0 -9
  218. package/esm/core/src/tests/test-many-to-one-relation-in-entity.spec.js +0 -809
  219. package/esm/core/src/tests/test-non-active-record.spec.d.ts +0 -1
  220. package/esm/core/src/tests/test-non-active-record.spec.js +0 -66
  221. package/esm/core/src/tests/test-object-column.spec.d.ts +0 -1
  222. package/esm/core/src/tests/test-object-column.spec.js +0 -189
  223. package/esm/core/src/tests/test-paged-foreach.spec.d.ts +0 -1
  224. package/esm/core/src/tests/test-paged-foreach.spec.js +0 -328
  225. package/esm/core/src/tests/test-remult-angular.spec.d.ts +0 -1
  226. package/esm/core/src/tests/test-remult-angular.spec.js +0 -23
  227. package/esm/core/src/tests/test-server-controller.spec.d.ts +0 -7
  228. package/esm/core/src/tests/test-server-controller.spec.js +0 -489
  229. package/esm/core/src/tests/test-server-expressions.spec.d.ts +0 -1
  230. package/esm/core/src/tests/test-server-expressions.spec.js +0 -178
  231. package/esm/core/src/tests/test-server-method-on-entity.spec.d.ts +0 -1
  232. package/esm/core/src/tests/test-server-method-on-entity.spec.js +0 -306
  233. package/esm/core/src/tests/test-sql-expression.spec.d.ts +0 -5
  234. package/esm/core/src/tests/test-sql-expression.spec.js +0 -205
  235. package/esm/core/src/tests/test-sql.spec.d.ts +0 -1
  236. package/esm/core/src/tests/test-sql.spec.js +0 -170
  237. package/esm/core/src/tests/test-subscribe.spec.d.ts +0 -1
  238. package/esm/core/src/tests/test-subscribe.spec.js +0 -135
  239. package/esm/core/src/tests/test-type-recovery.spec.d.ts +0 -1
  240. package/esm/core/src/tests/test-type-recovery.spec.js +0 -49
  241. package/esm/core/src/tests/test-where-api.spec.d.ts +0 -1
  242. package/esm/core/src/tests/test-where-api.spec.js +0 -434
  243. package/esm/core/src/tests/testHelper.spec.d.ts +0 -36
  244. package/esm/core/src/tests/testHelper.spec.js +0 -226
  245. package/esm/core/src/tests/testModel/models.d.ts +0 -16
  246. package/esm/core/src/tests/testModel/models.js +0 -25
  247. package/esm/core/src/validators.d.ts +0 -14
  248. package/esm/core/src/validators.js +0 -33
  249. package/esm/core/src/valueConverters.js +0 -197
  250. package/esm/core/urlBuilder.d.ts +0 -6
  251. package/esm/core/urlBuilder.js +0 -20
  252. package/esm/test-servers/shared/Task.d.ts +0 -9
  253. package/esm/test-servers/shared/Task.js +0 -32
  254. package/esm/test.d.ts +0 -5
  255. package/esm/test.js +0 -6
@@ -1,952 +0,0 @@
1
- import { queryConfig, Remult } from "../context";
2
- import { DataApi } from "../data-api";
3
- import { InMemoryDataProvider } from "../data-providers/in-memory-database";
4
- import { Entity, Fields, getEntityRef } from "../remult3";
5
- import { actionInfo } from "../server-action";
6
- import { createMockHttpDataProvider } from "../tests/testHelper.spec";
7
- import { SubscriptionChannel } from "./SubscriptionChannel";
8
- import { LiveQueryClient } from "./LiveQueryClient";
9
- import { LiveQueryPublisher, InMemoryLiveQueryStorage } from "./SubscriptionServer";
10
- import { findOptionsFromJson, findOptionsToJson } from "../data-providers/rest-data-provider";
11
- import { remult } from "../remult-proxy";
12
- const joc = jasmine.objectContaining;
13
- @Entity("event-test", { allowApiCrud: true })
14
- export class eventTestEntity {
15
- @Fields.integer()
16
- id = 0;
17
- @Fields.string()
18
- title;
19
- @Fields.string((o, remult) => o.serverExpression = () => remult.user.name)
20
- selectUser = '';
21
- @Fields.date()
22
- birthDate = new Date(1976, 5, 16);
23
- }
24
- async function setup1() {
25
- const mem = new InMemoryDataProvider();
26
- const serverRemult = new Remult(mem);
27
- serverRemult.user = ({ id: 'server', name: 'server', roles: [] });
28
- const serverRepo = serverRemult.repo(eventTestEntity);
29
- const items = [
30
- { id: 1, title: 'noam' },
31
- { id: 2, title: 'yael' },
32
- { id: 3, title: 'yoni' },
33
- { id: 4, title: 'maayan' },
34
- { id: 5, title: 'itamar' },
35
- { id: 6, title: 'ofri' }
36
- ];
37
- await serverRepo.insert(items);
38
- const remult = new Remult(mem);
39
- remult.user = ({ id: clientId1, name: clientId1, roles: [] });
40
- const clientRepo = remult.repo(eventTestEntity);
41
- const messages = [];
42
- serverRemult.subscriptionServer = {
43
- publishMessage: async (c, m) => { messages.push(...m); },
44
- };
45
- serverRemult.liveQueryStorage = new InMemoryLiveQueryStorage();
46
- const qm = new LiveQueryPublisher(() => (serverRemult.subscriptionServer), () => serverRemult.liveQueryStorage, async (_, _1, c) => c(clientRepo));
47
- let p = new PromiseResolver(qm);
48
- serverRemult.liveQueryPublisher = qm;
49
- await serverRemult.liveQueryStorage.add({
50
- entityKey: clientRepo.metadata.key,
51
- data: {
52
- findOptionsJson: {},
53
- requestJson: {},
54
- lastIds: items.map(x => x.id),
55
- },
56
- id: "xxx"
57
- });
58
- expect(messages.length).toBe(0);
59
- return { serverRepo, messages, flush: () => p.flush() };
60
- }
61
- const clientId1 = "clientId1";
62
- describe("Live Query", () => {
63
- beforeEach(() => { actionInfo.runningOnServer = true; });
64
- afterEach(() => { actionInfo.runningOnServer = false; });
65
- it("test that data is sent with correct remult user", async () => {
66
- const { serverRepo, messages, flush } = await setup1();
67
- const row = await serverRepo.findId(1);
68
- row.title += '1';
69
- await serverRepo.save(row);
70
- await flush();
71
- expect(messages).toEqual([joc({
72
- type: 'replace',
73
- data: joc({
74
- oldId: 1,
75
- item: joc({ selectUser: clientId1 })
76
- })
77
- })]);
78
- });
79
- it("test that id change is supported", async () => {
80
- const { serverRepo, messages, flush } = await setup1();
81
- const row = await serverRepo.findId(1);
82
- row.id = 99;
83
- await serverRepo.save(row);
84
- await flush();
85
- expect(messages).toEqual([joc({
86
- type: 'replace',
87
- data: joc({
88
- oldId: 1,
89
- item: joc({
90
- id: 99,
91
- selectUser: clientId1
92
- })
93
- })
94
- })
95
- ]);
96
- });
97
- it("new row is reported", async () => {
98
- const { serverRepo, messages, flush } = await setup1();
99
- const row = await serverRepo.insert([{ id: 9, title: 'david' }]);
100
- await flush();
101
- expect(messages).toEqual([joc({
102
- type: 'add',
103
- data: joc({
104
- item: joc({
105
- id: 9,
106
- selectUser: clientId1
107
- })
108
- })
109
- })
110
- ]);
111
- });
112
- it("removed row is reported", async () => {
113
- const { serverRepo, messages, flush } = await setup1();
114
- await serverRepo.delete((await serverRepo.findFirst({ id: 1 })));
115
- await flush();
116
- expect(messages).toEqual([joc({
117
- type: 'remove',
118
- data: { id: 1 }
119
- })]);
120
- });
121
- });
122
- function createTestPromise() {
123
- let resume;
124
- const r = new Promise(r => {
125
- resume = () => r({});
126
- });
127
- return Object.assign(r, { resume });
128
- }
129
- class PromiseResolver {
130
- promises = [];
131
- constructor(...who) {
132
- for (const w of who) {
133
- w.runPromise = p => {
134
- this.promises.push(p);
135
- return p;
136
- };
137
- }
138
- }
139
- async flush() {
140
- while (this.promises.length > 0) {
141
- let p = this.promises;
142
- this.promises = [];
143
- await Promise.all(p).catch(err => { });
144
- }
145
- }
146
- }
147
- describe("Live Query Client", () => {
148
- it("registers once", async () => {
149
- let open = 0;
150
- let get = 0;
151
- let sendMessage = x => { };
152
- const lqc = new LiveQueryClient(() => ({
153
- subscriptionClient: {
154
- async openConnection(onMessage) {
155
- open++;
156
- return {
157
- close() {
158
- open--;
159
- },
160
- async subscribe(channel, onMessage) {
161
- sendMessage = x => onMessage([x]);
162
- return () => {
163
- };
164
- },
165
- };
166
- },
167
- },
168
- httpClient: {
169
- get: async (url) => {
170
- get++;
171
- return [{
172
- id: 1,
173
- title: 'noam'
174
- }];
175
- },
176
- put: () => undefined,
177
- post: async () => { },
178
- delete: () => undefined
179
- }
180
- }), () => serverRemult.user?.id);
181
- let p = new PromiseResolver(lqc);
182
- const serverRemult = new Remult(new InMemoryDataProvider());
183
- serverRemult.liveQuerySubscriber = lqc;
184
- const serverRepo = serverRemult.repo(eventTestEntity);
185
- let closeSub1;
186
- let closeSub2;
187
- let result1;
188
- let result2;
189
- closeSub1 = serverRepo.liveQuery().subscribe(({ applyChanges: reducer }) => {
190
- result1 = reducer(result1);
191
- });
192
- closeSub2 = serverRepo.liveQuery().subscribe(({ applyChanges: reducer }) => {
193
- result2 = reducer(result2);
194
- });
195
- await p.flush();
196
- expect(open).toBe(1);
197
- expect(get).toBe(1);
198
- expect(result1[0].title).toBe("noam");
199
- expect(result2[0].title).toBe("noam");
200
- sendMessage({
201
- type: "replace",
202
- data: {
203
- oldId: 1,
204
- item: {
205
- id: 1,
206
- title: 'noam1'
207
- }
208
- }
209
- });
210
- await p.flush();
211
- expect(result1[0].title).toBe("noam1");
212
- expect(result2[0].title).toBe("noam1");
213
- closeSub1();
214
- await p.flush();
215
- sendMessage({
216
- type: "replace",
217
- data: {
218
- oldId: 1,
219
- item: {
220
- id: 1,
221
- title: 'noam2'
222
- }
223
- }
224
- });
225
- await p.flush();
226
- expect(result1[0].title).toBe("noam1");
227
- expect(result2[0].title).toBe("noam2");
228
- closeSub2();
229
- await p.flush();
230
- expect(open).toBe(0);
231
- get = 0;
232
- closeSub1 = lqc.subscribe(serverRepo, {}, {
233
- complete: () => { },
234
- error: () => { },
235
- next: ({ applyChanges: reducer }) => {
236
- result1 = reducer(result1);
237
- }
238
- });
239
- await p.flush();
240
- expect(open).toBe(1);
241
- expect(get).toBe(1);
242
- closeSub1();
243
- await p.flush();
244
- expect(open).toBe(0);
245
- });
246
- });
247
- describe("test live query full cycle", () => {
248
- beforeEach(() => {
249
- queryConfig.defaultPageSize = 100;
250
- });
251
- afterEach(() => {
252
- queryConfig.defaultPageSize = 2;
253
- });
254
- function setup2() {
255
- const mem = new InMemoryDataProvider();
256
- const remult = new Remult(mem);
257
- const repo = remult.repo(eventTestEntity);
258
- const remult2 = new Remult(mem);
259
- const repo2 = remult2.repo(eventTestEntity);
260
- const mh = [];
261
- let messageCount = 0;
262
- remult.liveQueryStorage = new InMemoryLiveQueryStorage();
263
- remult.subscriptionServer = {
264
- async publishMessage(channel, message) {
265
- mh.forEach(x => x(channel, message));
266
- }
267
- };
268
- const qm = new LiveQueryPublisher(() => (remult.subscriptionServer), () => remult.liveQueryStorage, async (_, _1, c) => c(repo));
269
- remult.liveQueryPublisher = qm;
270
- var dataApi = new DataApi(repo, remult);
271
- const clientStatus = {
272
- connected: true,
273
- reconnect: () => { }
274
- };
275
- let unsubscribeCount = 0;
276
- const buildLqc = () => {
277
- return new LiveQueryClient(() => ({
278
- subscriptionClient: {
279
- async openConnection(onReconnect) {
280
- clientStatus.connected = true;
281
- clientStatus.reconnect = () => {
282
- onReconnect();
283
- clientStatus.connected = true;
284
- };
285
- const channels = [];
286
- return {
287
- close() {
288
- },
289
- async subscribe(channel, onMessage) {
290
- channels.push(channel);
291
- mh.push((c, message) => {
292
- if (clientStatus.connected)
293
- if (channels.includes(c) && c == channel) {
294
- messageCount++;
295
- onMessage(message);
296
- }
297
- });
298
- return () => {
299
- unsubscribeCount++;
300
- channels.splice(channels.indexOf(channel), 1);
301
- };
302
- },
303
- };
304
- },
305
- }, httpClient: createMockHttpDataProvider(dataApi)
306
- }), () => remult.user?.id);
307
- };
308
- const lqc1 = buildLqc();
309
- const lqc2 = buildLqc();
310
- var pm = new PromiseResolver(lqc1, lqc2, qm);
311
- remult.liveQuerySubscriber = lqc1;
312
- remult2.liveQuerySubscriber = lqc2;
313
- remult.liveQueryPublisher = qm;
314
- remult2.liveQueryPublisher = qm;
315
- return {
316
- repo, pm, repo2, messageCount: () => messageCount, clientStatus, qm: remult.liveQueryStorage, testApi: () => createMockHttpDataProvider(dataApi), remult,
317
- unsubscribeCount() {
318
- return unsubscribeCount;
319
- }
320
- };
321
- }
322
- it("integration test 1", async () => {
323
- var { repo, pm, repo2 } = setup2();
324
- let result1 = [];
325
- const u = repo.liveQuery().subscribe(({ applyChanges: reducer }) => result1 = reducer(result1));
326
- await pm.flush();
327
- expect(result1.length).toBe(0);
328
- await repo.insert({ id: 1, title: "noam" });
329
- await repo2.insert({ id: 2, title: "yael" });
330
- await pm.flush();
331
- expect(result1.length).toBe(2);
332
- result1[0] = { ...result1[0], title: 'noam1' };
333
- await repo2.save({ ...result1[1], title: 'yael2' });
334
- await pm.flush();
335
- expect(result1.length).toBe(2);
336
- expect(result1[0].title).toBe('noam1');
337
- expect(result1[0].birthDate.getFullYear()).toBe(1976);
338
- expect(result1[1].title).toBe('yael2');
339
- await repo.save(result1[0]);
340
- u();
341
- });
342
- it("integration test 2", async () => {
343
- var { repo, pm, repo2 } = setup2();
344
- let result1 = [];
345
- await repo.insert({ id: 1, title: "noam" });
346
- const u = repo.liveQuery().subscribe(({ applyChanges: reducer }) => result1 = reducer(result1));
347
- await pm.flush();
348
- expect(result1[0].title).toBe('noam');
349
- expect(result1[0].birthDate.getFullYear()).toBe(1976);
350
- u();
351
- });
352
- it("test delete works", async () => {
353
- var { repo, pm, repo2 } = setup2();
354
- let result1 = [];
355
- const u = repo.liveQuery().subscribe(({ applyChanges: reducer }) => result1 = reducer(result1));
356
- await pm.flush();
357
- await repo.insert({ id: 1, title: "noam" });
358
- await repo2.insert({ id: 2, title: "yael" });
359
- await pm.flush();
360
- await repo.delete(result1[1]);
361
- await pm.flush();
362
- expect(result1.length).toBe(1);
363
- u();
364
- });
365
- it("test sort works", async () => {
366
- var { repo, pm, repo2 } = setup2();
367
- let result1 = [];
368
- let items = [];
369
- const u = repo.liveQuery({
370
- orderBy: { title: "desc" }
371
- }).subscribe((info) => {
372
- result1 = info.applyChanges(result1);
373
- items = info.items;
374
- });
375
- await pm.flush();
376
- await repo.insert({ id: 1, title: "noam" });
377
- await pm.flush();
378
- await repo2.insert({ id: 2, title: "yael" });
379
- await pm.flush();
380
- expect(result1.map(r => r.id)).toEqual([1, 2]);
381
- expect(items.map(r => r.id)).toEqual([2, 1]);
382
- u();
383
- });
384
- it("test add works if item already in array", async () => {
385
- var { repo, pm, repo2 } = setup2();
386
- let result1 = [];
387
- const u = repo.liveQuery().subscribe(({ applyChanges: reducer }) => result1 = reducer(result1));
388
- await pm.flush();
389
- result1 = [await repo.insert({ id: 1, title: "noam" })];
390
- await pm.flush();
391
- expect(result1.length).toBe(1);
392
- u();
393
- });
394
- it("test add works if item already in array", async () => {
395
- var { repo, pm, repo2 } = setup2();
396
- let result1 = [];
397
- const u = repo.liveQuery().subscribe(({ applyChanges: reducer }) => result1 = reducer(result1));
398
- await pm.flush();
399
- await repo.insert({ id: 1, title: "noam" });
400
- await pm.flush();
401
- expect(result1.length).toBe(1);
402
- u();
403
- });
404
- it("test quick unsubscribe before subscribe completes", async () => {
405
- const serverRemult = new Remult(new InMemoryDataProvider());
406
- const serverRepo = serverRemult.repo(eventTestEntity);
407
- var dataApi = new DataApi(serverRepo, serverRemult);
408
- var remult = new Remult();
409
- var dp = createMockHttpDataProvider(dataApi);
410
- let waitForUnsubscribe = createTestPromise();
411
- let waitForSubscribe = createTestPromise();
412
- let stats = {
413
- sub: 0,
414
- unSub: 0,
415
- query: 0
416
- };
417
- remult.apiClient.httpClient = {
418
- post: (a, b) => dp.post(a, b),
419
- put: (a, b) => dp.put(a, b),
420
- delete: a => dp.delete(a),
421
- get: async (url) => {
422
- stats.query++;
423
- return dp.get(url);
424
- }
425
- };
426
- let mh = [];
427
- serverRemult.subscriptionServer = {
428
- publishMessage: async (c, m) => mh.forEach(x => x(c, m))
429
- };
430
- serverRemult.liveQueryStorage = new InMemoryLiveQueryStorage();
431
- serverRemult.liveQueryPublisher = new LiveQueryPublisher(() => serverRemult.subscriptionServer, () => serverRemult.liveQueryStorage, async (_, _1, c) => c(serverRemult.repo(eventTestEntity)));
432
- remult.apiClient.subscriptionClient = {
433
- openConnection: async () => {
434
- return {
435
- subscribe: async (a, handler) => {
436
- waitForUnsubscribe.resume();
437
- await waitForSubscribe;
438
- stats.sub++;
439
- mh.push((c, m) => {
440
- handler(m);
441
- });
442
- return () => {
443
- stats.unSub++;
444
- mh = mh.filter(h => h !== handler);
445
- };
446
- },
447
- close: () => {
448
- }
449
- };
450
- }
451
- };
452
- var pm = new PromiseResolver(remult.liveQuerySubscriber, serverRemult.liveQueryPublisher);
453
- const repo = remult.repo(eventTestEntity);
454
- let result1 = [];
455
- let u = repo.liveQuery().subscribe({
456
- next: ({ applyChanges: reducer }) => result1 = reducer(result1),
457
- error: err => {
458
- throw err;
459
- }
460
- });
461
- await waitForUnsubscribe;
462
- u();
463
- waitForSubscribe.resume();
464
- await pm.flush();
465
- await repo.insert({ id: 1, title: "noam" });
466
- await pm.flush();
467
- expect(result1.length).toBe(0);
468
- expect(stats.sub).toBe(1);
469
- expect(stats.unSub).toBe(1);
470
- expect(stats.query).toBe(0);
471
- });
472
- it("test quick unsubscribe before query completes", async () => {
473
- const serverRemult = new Remult(new InMemoryDataProvider());
474
- const serverRepo = serverRemult.repo(eventTestEntity);
475
- var dataApi = new DataApi(serverRepo, serverRemult);
476
- var remult = new Remult();
477
- var dp = createMockHttpDataProvider(dataApi);
478
- let waitForUnsubscribe = createTestPromise();
479
- let waitForGet = createTestPromise();
480
- remult.apiClient.httpClient = {
481
- post: (a, b) => dp.post(a, b),
482
- put: (a, b) => dp.put(a, b),
483
- delete: a => dp.delete(a),
484
- get: async (url) => {
485
- waitForUnsubscribe.resume();
486
- await waitForGet;
487
- return dp.get(url);
488
- }
489
- };
490
- let mh = [];
491
- serverRemult.subscriptionServer = {
492
- publishMessage: async (c, m) => mh.forEach(x => x(c, m))
493
- };
494
- serverRemult.liveQueryStorage = new InMemoryLiveQueryStorage();
495
- serverRemult.liveQueryPublisher = new LiveQueryPublisher(() => serverRemult.subscriptionServer, () => serverRemult.liveQueryStorage, async (_, _1, c) => c(serverRemult.repo(eventTestEntity)));
496
- let stats = {
497
- sub: 0,
498
- unSub: 0
499
- };
500
- remult.apiClient.subscriptionClient = {
501
- openConnection: async () => {
502
- return {
503
- subscribe: async (a, handler) => {
504
- stats.sub++;
505
- mh.push((c, m) => {
506
- handler(m);
507
- });
508
- return () => {
509
- stats.unSub++;
510
- mh = mh.filter(h => h !== handler);
511
- };
512
- },
513
- close: () => {
514
- }
515
- };
516
- }
517
- };
518
- var pm = new PromiseResolver(remult.liveQuerySubscriber, serverRemult.liveQueryPublisher);
519
- const repo = remult.repo(eventTestEntity);
520
- let result1 = [];
521
- let u = repo.liveQuery().subscribe({
522
- next: ({ applyChanges: reducer }) => result1 = reducer(result1),
523
- error: err => {
524
- throw err;
525
- }
526
- });
527
- await waitForUnsubscribe;
528
- u();
529
- waitForGet.resume();
530
- await pm.flush();
531
- await repo.insert({ id: 1, title: "noam" });
532
- await pm.flush();
533
- expect(result1.length).toBe(0);
534
- expect(stats.sub).toBe(1);
535
- expect(stats.unSub).toBe(1);
536
- });
537
- it("test quick unsubscribe and subscribe", async () => {
538
- const serverRemult = new Remult(new InMemoryDataProvider());
539
- const serverRepo = serverRemult.repo(eventTestEntity);
540
- var dataApi = new DataApi(serverRepo, serverRemult);
541
- var remult = new Remult();
542
- var dp = createMockHttpDataProvider(dataApi);
543
- let stats = {
544
- sub: 0,
545
- unSub: 0,
546
- get: 0,
547
- post: 0
548
- };
549
- remult.apiClient.httpClient = {
550
- post: (a, b) => {
551
- stats.post++;
552
- return dp.post(a, b);
553
- },
554
- put: (a, b) => dp.put(a, b),
555
- delete: a => dp.delete(a),
556
- get: async (url) => {
557
- stats.get++;
558
- return dp.get(url);
559
- }
560
- };
561
- let mh = [];
562
- serverRemult.subscriptionServer = {
563
- publishMessage: async (c, m) => mh.forEach(x => x(c, m))
564
- };
565
- serverRemult.liveQueryStorage = new InMemoryLiveQueryStorage();
566
- serverRemult.liveQueryPublisher = new LiveQueryPublisher(() => serverRemult.subscriptionServer, () => serverRemult.liveQueryStorage, async (_, _1, c) => c(serverRemult.repo(eventTestEntity)));
567
- remult.apiClient.subscriptionClient = {
568
- openConnection: async () => {
569
- return {
570
- subscribe: async (a, handler) => {
571
- stats.sub++;
572
- mh.push((c, m) => {
573
- handler(m);
574
- });
575
- return () => {
576
- stats.unSub++;
577
- mh = mh.filter(h => h !== handler);
578
- };
579
- },
580
- close: () => {
581
- }
582
- };
583
- }
584
- };
585
- var pm = new PromiseResolver(remult.liveQuerySubscriber, serverRemult.liveQueryPublisher);
586
- const repo = remult.repo(eventTestEntity);
587
- let result1 = [];
588
- let u = repo.liveQuery().subscribe({
589
- next: ({ applyChanges: reducer }) => result1 = reducer(result1),
590
- error: err => {
591
- throw err;
592
- }
593
- });
594
- await pm.flush();
595
- u();
596
- u = repo.liveQuery().subscribe({
597
- next: ({ applyChanges: reducer }) => result1 = reducer(result1),
598
- error: err => {
599
- throw err;
600
- }
601
- });
602
- await pm.flush();
603
- expect(result1.length).toBe(0);
604
- expect(stats.sub).toBe(2);
605
- expect(stats.unSub).toBe(1);
606
- expect(stats.get).toBe(2);
607
- u();
608
- });
609
- it("test unsubscribe works", async () => {
610
- var { repo, pm, messageCount, qm, unsubscribeCount, remult } = setup2();
611
- let result1 = [];
612
- const unsubscribe = repo.liveQuery().subscribe(({ applyChanges: reducer }) => result1 = reducer(result1));
613
- await pm.flush();
614
- await repo.insert({ id: 1, title: "noam" });
615
- await pm.flush();
616
- expect(result1.length).toBe(1);
617
- expect(messageCount()).toBe(1);
618
- expect(qm.queries.length).toBe(1);
619
- unsubscribe();
620
- await pm.flush();
621
- await repo.insert({ id: 2, title: 'noam' });
622
- await pm.flush();
623
- expect(qm.queries.length).toBe(0);
624
- expect(messageCount()).toBe(1);
625
- expect(unsubscribeCount()).toBe(1);
626
- expect(remult.liveQueryStorage.removeCountForTesting).toBe(1);
627
- unsubscribe();
628
- await pm.flush();
629
- expect(unsubscribeCount()).toBe(1);
630
- expect(remult.liveQueryStorage.removeCountForTesting).toBe(1);
631
- });
632
- it("test unsubscribe works after subscribe and unsubscribe", async () => {
633
- var { repo, pm, messageCount, qm, unsubscribeCount, remult } = setup2();
634
- let result1 = [];
635
- let unsubscribe = repo.liveQuery().subscribe(({ applyChanges: reducer }) => result1 = reducer(result1));
636
- await pm.flush();
637
- unsubscribe();
638
- await pm.flush();
639
- unsubscribe = repo.liveQuery().subscribe(({ applyChanges: reducer }) => result1 = reducer(result1));
640
- await pm.flush();
641
- unsubscribe();
642
- await pm.flush();
643
- expect(unsubscribeCount()).toBe(2);
644
- expect(remult.liveQueryStorage.removeCountForTesting).toBe(2);
645
- });
646
- it("test unsubscribe works after a quick subscribe and unsubscribe", async () => {
647
- var { repo, pm, messageCount, qm, unsubscribeCount, remult } = setup2();
648
- let result1 = [];
649
- let unsubscribe = repo.liveQuery().subscribe(({ applyChanges: reducer }) => result1 = reducer(result1));
650
- unsubscribe();
651
- await pm.flush();
652
- unsubscribe = repo.liveQuery().subscribe(({ applyChanges: reducer }) => result1 = reducer(result1));
653
- await pm.flush();
654
- unsubscribe();
655
- await pm.flush();
656
- expect(unsubscribeCount()).toBe(1);
657
- expect(remult.liveQueryStorage.removeCountForTesting).toBe(1);
658
- });
659
- it("test disconnect and reconnect scenario", async () => {
660
- var { repo, pm, clientStatus } = setup2();
661
- let result1 = [];
662
- const u = repo.liveQuery().subscribe(reducer => result1 = reducer.applyChanges(result1));
663
- await pm.flush();
664
- await repo.insert({ id: 1, title: "noam" });
665
- await pm.flush();
666
- expect(result1.length).toBe(1);
667
- clientStatus.connected = false;
668
- await repo.insert({ id: 2, title: "yael" });
669
- await pm.flush();
670
- expect(result1.length).toBe(1);
671
- clientStatus.reconnect();
672
- expect(clientStatus.connected).toBe(true);
673
- await pm.flush();
674
- expect(result1.length).toBe(2);
675
- u();
676
- });
677
- it("expect pure json object, from live query", async () => {
678
- var { testApi, repo } = setup2();
679
- await repo.insert({ title: 'a' });
680
- const r = await testApi().get('/api/tasks?__action=liveQuery|123');
681
- expect(getEntityRef(r[0], false)).toBe(undefined);
682
- });
683
- it("test 2 subscriptions work", async () => {
684
- var { repo, pm } = setup2();
685
- await repo.insert({ title: 'a' });
686
- await repo.insert({ title: 'b' });
687
- let arr1 = [];
688
- let arr2 = [];
689
- const u1 = repo.liveQuery().subscribe(y => arr1 = y.applyChanges(arr1));
690
- await pm.flush();
691
- const u2 = repo.liveQuery().subscribe(y => {
692
- arr2 = y.applyChanges(arr2);
693
- expect(y.items.length).toBe(2);
694
- });
695
- await pm.flush();
696
- expect(arr1.length).toBe(arr2.length);
697
- u1();
698
- u2();
699
- });
700
- it("test subscription leak", async () => {
701
- var { repo, pm } = setup2();
702
- await repo.insert({ title: 'a1', id: 1 });
703
- await repo.insert({ title: 'a2', id: 2 });
704
- await repo.insert({ title: 'b1', id: 3 });
705
- await repo.insert({ title: 'b2', id: 4 });
706
- let arr1 = [];
707
- let arr2 = [];
708
- let arr1Items = [];
709
- let arr1Messages = [];
710
- let arr2Messages = [];
711
- const u1 = repo.liveQuery({ where: { title: { $contains: "a" } } }).subscribe(y => {
712
- arr1 = y.applyChanges(arr1);
713
- arr1Items.push([...y.items]);
714
- arr1Messages.push(y.changes);
715
- });
716
- await pm.flush();
717
- let done = false;
718
- const u2 = repo.liveQuery({ where: { title: { $contains: "b" } } }).subscribe({
719
- next: y => {
720
- arr2 = y.applyChanges(arr2);
721
- arr2Messages.push(y.changes);
722
- },
723
- complete: () => done = true
724
- });
725
- await pm.flush();
726
- await repo.insert({ title: 'a3', id: 5 });
727
- await pm.flush();
728
- expect(arr1.length).toBe(3);
729
- expect(arr2.length).toBe(2);
730
- expect(arr1Items.length).toBe(2);
731
- expect(arr1Messages.length).toBe(2);
732
- expect(arr2Messages.length).toBe(1);
733
- expect(arr1Items[0].length).toBe(2);
734
- expect(arr1Items[1].length).toBe(3);
735
- expect(arr1Messages[0].length).toBe(1);
736
- expect(arr1Messages[1][0].type).toBe("add");
737
- u1();
738
- expect(done).toBe(false);
739
- u2();
740
- await pm.flush();
741
- ;
742
- expect(done).toBe(true);
743
- });
744
- it("error on channel open", async () => {
745
- let { remult } = await setup2();
746
- remult.apiClient.subscriptionClient = {
747
- openConnection: async () => {
748
- return {
749
- subscribe(channel, onMessage) {
750
- throw "the error";
751
- },
752
- close() {
753
- }
754
- };
755
- }
756
- };
757
- remult.liveQuerySubscriber = new LiveQueryClient(() => remult.apiClient, () => remult.user?.id);
758
- let pm = new PromiseResolver(remult.liveQuerySubscriber);
759
- let error = false;
760
- let u = remult.repo(eventTestEntity).liveQuery().subscribe({
761
- error: er => {
762
- error = true;
763
- }
764
- });
765
- await pm.flush();
766
- expect(error).toBe(true);
767
- u();
768
- });
769
- it("error on channel open", async () => {
770
- let { remult } = await setup2();
771
- remult.apiClient.subscriptionClient = {
772
- openConnection: async () => {
773
- return {
774
- async subscribe(channel, onMessage, onError) {
775
- onError("had error");
776
- return () => { };
777
- },
778
- close() {
779
- }
780
- };
781
- }
782
- };
783
- remult.liveQuerySubscriber = new LiveQueryClient(() => remult.apiClient, () => remult.user?.id);
784
- let pm = new PromiseResolver(remult.liveQuerySubscriber);
785
- let error = false;
786
- let u = remult.repo(eventTestEntity).liveQuery().subscribe({
787
- error: er => {
788
- error = true;
789
- }
790
- });
791
- await pm.flush();
792
- expect(error).toBe(true);
793
- u();
794
- });
795
- });
796
- it("Serialize Find Options", async () => {
797
- const r = new Remult().repo(eventTestEntity);
798
- const findOptions = {
799
- limit: 3,
800
- page: 2,
801
- where: {
802
- $and: [{
803
- title: 'noam'
804
- }]
805
- },
806
- orderBy: {
807
- title: "desc"
808
- }
809
- };
810
- const z = findOptionsToJson(findOptions, r.metadata);
811
- const res = findOptionsFromJson(z, r.metadata);
812
- expect(res).toEqual(findOptions);
813
- });
814
- it("Serialize Find Options1", async () => {
815
- const r = new Remult().repo(eventTestEntity);
816
- const findOptions = {
817
- where: {
818
- $and: [{
819
- title: 'noam'
820
- }]
821
- },
822
- orderBy: {
823
- title: "desc"
824
- },
825
- };
826
- const z = findOptionsToJson(findOptions, r.metadata);
827
- const res = findOptionsFromJson(JSON.parse(JSON.stringify(z)), r.metadata);
828
- expect(res).toEqual(findOptions);
829
- });
830
- it("Serialize Find Options2", async () => {
831
- const r = new Remult().repo(eventTestEntity);
832
- const findOptions = {
833
- where: {
834
- $and: [{
835
- title: 'noam'
836
- }]
837
- },
838
- orderBy: {
839
- title: "desc"
840
- },
841
- load: x => [x.title, x.birthDate]
842
- };
843
- const z = findOptionsToJson(findOptions, r.metadata);
844
- const res = findOptionsFromJson(JSON.parse(JSON.stringify(z)), r.metadata);
845
- expect(res.load(r.fields).map(f => f.key)).toEqual(["title", "birthDate"]);
846
- });
847
- it("test channel subscribe", async () => {
848
- const mc = new SubscriptionChannel("zxcvz");
849
- let sub = 0;
850
- let close = 0;
851
- remult.apiClient.subscriptionClient = {
852
- openConnection: async () => {
853
- return {
854
- subscribe: async (what) => {
855
- sub++;
856
- return () => {
857
- sub--;
858
- };
859
- },
860
- close() {
861
- close++;
862
- },
863
- };
864
- }
865
- };
866
- let pr = new PromiseResolver(remult.liveQuerySubscriber);
867
- let r = await mc.subscribe(() => { });
868
- let r2 = await mc.subscribe(() => { });
869
- await pr.flush();
870
- expect(sub).toBe(1);
871
- r();
872
- await pr.flush();
873
- expect(sub).toBe(1);
874
- r2();
875
- await pr.flush();
876
- expect(sub).toBe(0);
877
- r();
878
- r2();
879
- await pr.flush();
880
- expect(sub).toBe(0);
881
- expect(close).toBe(1);
882
- });
883
- describe("test failure", () => {
884
- it("error on subscribe query", async () => {
885
- let r = new Remult(new InMemoryDataProvider());
886
- r.apiClient.subscriptionClient = {
887
- openConnection: async () => {
888
- return {
889
- subscribe(channel, onMessage) {
890
- throw "the error";
891
- },
892
- close() {
893
- }
894
- };
895
- }
896
- };
897
- let pm = new PromiseResolver(r.liveQuerySubscriber);
898
- let error = false;
899
- let u = r.repo(eventTestEntity).liveQuery().subscribe({ error: er => { error = true; } });
900
- await pm.flush();
901
- expect(error).toBe(true);
902
- u();
903
- });
904
- it("error on subscribe", async () => {
905
- let r = new Remult(new InMemoryDataProvider());
906
- r.liveQueryStorage = new InMemoryLiveQueryStorage();
907
- await r.repo(eventTestEntity).insert({ id: 1, title: "a" });
908
- expect(await r.repo(eventTestEntity).count()).toBe(1);
909
- let items;
910
- let error = false;
911
- var cr = new Remult(createMockHttpDataProvider(new DataApi(r.repo(eventTestEntity), r)));
912
- cr.apiClient.subscriptionClient = {
913
- openConnection: async () => {
914
- return {
915
- subscribe(channel, onMessage) {
916
- throw "the error";
917
- },
918
- close() {
919
- }
920
- };
921
- }
922
- };
923
- let pm = new PromiseResolver(cr.liveQuerySubscriber);
924
- expect(await cr.repo(eventTestEntity).count()).toBe(1);
925
- let u = cr.repo(eventTestEntity).liveQuery().subscribe({ error: er => { error = true; }, next: x => items = x.items });
926
- await pm.flush();
927
- expect(error).toBe(true);
928
- expect(items).toBeUndefined();
929
- u();
930
- });
931
- it("Error on open connection", async () => {
932
- let r = new Remult(new InMemoryDataProvider());
933
- r.liveQueryStorage = new InMemoryLiveQueryStorage();
934
- await r.repo(eventTestEntity).insert({ id: 1, title: "a" });
935
- expect(await r.repo(eventTestEntity).count()).toBe(1);
936
- let items;
937
- let error = false;
938
- var cr = new Remult(createMockHttpDataProvider(new DataApi(r.repo(eventTestEntity), r)));
939
- cr.apiClient.subscriptionClient = {
940
- openConnection: async () => {
941
- throw "open connection error";
942
- }
943
- };
944
- let pm = new PromiseResolver(cr.liveQuerySubscriber);
945
- expect(await cr.repo(eventTestEntity).count()).toBe(1);
946
- let u = cr.repo(eventTestEntity).liveQuery().subscribe({ error: er => { error = true; }, next: x => items = x.items });
947
- await pm.flush();
948
- expect(error).toBe(true);
949
- expect(items).toBeUndefined();
950
- u();
951
- });
952
- });