remult 0.22.1 → 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 (257) 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/remult-mongo.js +6 -6
  5. package/esm/src/backend-tests/backend-database-test-setup.backend-spec.js +30 -0
  6. package/esm/src/id-entity.d.ts +4 -0
  7. package/esm/src/id-entity.js +8 -0
  8. package/esm/src/remult3/RepositoryImplementation.js +7 -5
  9. package/esm/src/shared-tests/db-tests.db-tests.js +35 -0
  10. package/package.json +1 -1
  11. package/postgres/postgresColumnSyntax.d.ts +2 -0
  12. package/postgres/postgresColumnSyntax.js +34 -0
  13. package/remult-knex/index.js +2 -2
  14. package/remult-middleware.d.ts +2 -0
  15. package/remult-middleware.js +70 -0
  16. package/remult-mongo.js +6 -6
  17. package/server/register-actions-on-server.d.ts +3 -0
  18. package/server/register-actions-on-server.js +50 -0
  19. package/server/register-entities-on-server.d.ts +3 -0
  20. package/server/register-entities-on-server.js +19 -0
  21. package/src/backend-tests/backend-database-test-setup.backend-spec.js +60 -0
  22. package/{esm/core/src → src}/backend-tests/my-test.backend-spec.d.ts +1 -1
  23. package/src/backend-tests/my-test.backend-spec.js +217 -0
  24. package/src/backend-tests/test-http-server.backend-spec.d.ts +6 -0
  25. package/src/backend-tests/test-http-server.backend-spec.js +342 -0
  26. package/src/id-entity.d.ts +4 -0
  27. package/src/id-entity.js +17 -0
  28. package/src/remult3/RepositoryImplementation.js +15 -13
  29. package/src/shared-tests/db-tests.db-tests.js +64 -0
  30. package/{esm/core/src/valueConverters.d.ts → valueConverters.d.ts} +12 -13
  31. package/valueConverters.js +168 -0
  32. package/esm/angular/interfaces/index.d.ts +0 -1
  33. package/esm/angular/interfaces/index.js +0 -1
  34. package/esm/angular/interfaces/src/column-collection.d.ts +0 -70
  35. package/esm/angular/interfaces/src/column-collection.js +0 -341
  36. package/esm/angular/interfaces/src/data-area-settings.d.ts +0 -15
  37. package/esm/angular/interfaces/src/data-area-settings.js +0 -35
  38. package/esm/angular/interfaces/src/data-control-interfaces.d.ts +0 -36
  39. package/esm/angular/interfaces/src/data-control-interfaces.js +0 -57
  40. package/esm/angular/interfaces/src/dataList.d.ts +0 -13
  41. package/esm/angular/interfaces/src/dataList.js +0 -42
  42. package/esm/angular/interfaces/src/filter-helper.d.ts +0 -13
  43. package/esm/angular/interfaces/src/filter-helper.js +0 -59
  44. package/esm/angular/interfaces/src/grid-settings.d.ts +0 -145
  45. package/esm/angular/interfaces/src/grid-settings.js +0 -387
  46. package/esm/angular/interfaces/src/public_api.d.ts +0 -4
  47. package/esm/angular/interfaces/src/public_api.js +0 -4
  48. package/esm/angular/src/angular/RemultAngularPluginsService.d.ts +0 -4
  49. package/esm/angular/src/angular/RemultAngularPluginsService.js +0 -3
  50. package/esm/angular/src/angular/data-control/data-control2.component.d.ts +0 -49
  51. package/esm/angular/src/angular/data-control/data-control2.component.js +0 -138
  52. package/esm/core/SseSubscriptionServer.d.ts +0 -33
  53. package/esm/core/SseSubscriptionServer.js +0 -107
  54. package/esm/core/assign.d.ts +0 -1
  55. package/esm/core/assign.js +0 -5
  56. package/esm/core/classType.d.ts +0 -3
  57. package/esm/core/classType.js +0 -1
  58. package/esm/core/index.d.ts +0 -27
  59. package/esm/core/index.js +0 -25
  60. package/esm/core/inputTypes.d.ts +0 -9
  61. package/esm/core/inputTypes.js +0 -9
  62. package/esm/core/live-query/data-provider-live-query-storage.d.ts +0 -22
  63. package/esm/core/live-query/data-provider-live-query-storage.js +0 -71
  64. package/esm/core/postgres/index.d.ts +0 -2
  65. package/esm/core/postgres/index.js +0 -2
  66. package/esm/core/postgres/postgres-data-provider.d.ts +0 -36
  67. package/esm/core/postgres/postgres-data-provider.js +0 -120
  68. package/esm/core/postgres/schema-builder.d.ts +0 -17
  69. package/esm/core/postgres/schema-builder.js +0 -153
  70. package/esm/core/remult-fresh.d.ts +0 -17
  71. package/esm/core/remult-fresh.js +0 -29
  72. package/esm/core/remult-knex/index.d.ts +0 -30
  73. package/esm/core/remult-knex/index.js +0 -446
  74. package/esm/core/remult-mongo.d.ts +0 -24
  75. package/esm/core/remult-mongo.js +0 -254
  76. package/esm/core/server/JsonEntityFileStorage.d.ts +0 -10
  77. package/esm/core/server/JsonEntityFileStorage.js +0 -25
  78. package/esm/core/server/core.d.ts +0 -4
  79. package/esm/core/server/core.js +0 -4
  80. package/esm/core/server/expressBridge.d.ts +0 -182
  81. package/esm/core/server/expressBridge.js +0 -938
  82. package/esm/core/server/index.d.ts +0 -6
  83. package/esm/core/server/index.js +0 -9
  84. package/esm/core/server/initAsyncHooks.d.ts +0 -1
  85. package/esm/core/server/initAsyncHooks.js +0 -9
  86. package/esm/core/server/initDataProvider.d.ts +0 -2
  87. package/esm/core/server/initDataProvider.js +0 -14
  88. package/esm/core/src/__EntityValueProvider.d.ts +0 -11
  89. package/esm/core/src/__EntityValueProvider.js +0 -1
  90. package/esm/core/src/__RowsOfDataForTesting.d.ts +0 -3
  91. package/esm/core/src/__RowsOfDataForTesting.js +0 -1
  92. package/esm/core/src/backend-tests/backend-database-test-setup.backend-spec.d.ts +0 -6
  93. package/esm/core/src/backend-tests/backend-database-test-setup.backend-spec.js +0 -147
  94. package/esm/core/src/backend-tests/my-test.backend-spec.js +0 -197
  95. package/esm/core/src/backend-tests/test-http-server.backend-spec.d.ts +0 -1
  96. package/esm/core/src/backend-tests/test-http-server.backend-spec.js +0 -167
  97. package/esm/core/src/buildRestDataProvider.d.ts +0 -31
  98. package/esm/core/src/buildRestDataProvider.js +0 -113
  99. package/esm/core/src/column-interfaces.d.ts +0 -154
  100. package/esm/core/src/column-interfaces.js +0 -7
  101. package/esm/core/src/column.d.ts +0 -58
  102. package/esm/core/src/column.js +0 -174
  103. package/esm/core/src/context.d.ts +0 -134
  104. package/esm/core/src/context.js +0 -286
  105. package/esm/core/src/data-api.d.ts +0 -39
  106. package/esm/core/src/data-api.js +0 -279
  107. package/esm/core/src/data-interfaces.d.ts +0 -41
  108. package/esm/core/src/data-interfaces.js +0 -12
  109. package/esm/core/src/data-providers/array-entity-data-provider.d.ts +0 -22
  110. package/esm/core/src/data-providers/array-entity-data-provider.js +0 -252
  111. package/esm/core/src/data-providers/in-memory-database.d.ts +0 -9
  112. package/esm/core/src/data-providers/in-memory-database.js +0 -14
  113. package/esm/core/src/data-providers/json-data-provider.d.ts +0 -12
  114. package/esm/core/src/data-providers/json-data-provider.js +0 -55
  115. package/esm/core/src/data-providers/rest-data-provider.d.ts +0 -49
  116. package/esm/core/src/data-providers/rest-data-provider.js +0 -256
  117. package/esm/core/src/data-providers/sql-database.d.ts +0 -33
  118. package/esm/core/src/data-providers/sql-database.js +0 -384
  119. package/esm/core/src/data-providers/web-sql-data-provider.d.ts +0 -24
  120. package/esm/core/src/data-providers/web-sql-data-provider.js +0 -143
  121. package/esm/core/src/entity.d.ts +0 -91
  122. package/esm/core/src/entity.js +0 -1
  123. package/esm/core/src/filter/filter-consumer-bridge-to-sql-request.d.ts +0 -50
  124. package/esm/core/src/filter/filter-consumer-bridge-to-sql-request.js +0 -150
  125. package/esm/core/src/filter/filter-consumer-bridge-to-url-builder.d.ts +0 -1
  126. package/esm/core/src/filter/filter-consumer-bridge-to-url-builder.js +0 -1
  127. package/esm/core/src/filter/filter-interfaces.d.ts +0 -85
  128. package/esm/core/src/filter/filter-interfaces.js +0 -477
  129. package/esm/core/src/live-query/LiveQueryClient.d.ts +0 -20
  130. package/esm/core/src/live-query/LiveQueryClient.js +0 -188
  131. package/esm/core/src/live-query/SseSubscriptionClient.d.ts +0 -5
  132. package/esm/core/src/live-query/SseSubscriptionClient.js +0 -86
  133. package/esm/core/src/live-query/SubscriptionChannel.d.ts +0 -72
  134. package/esm/core/src/live-query/SubscriptionChannel.js +0 -123
  135. package/esm/core/src/live-query/SubscriptionServer.d.ts +0 -53
  136. package/esm/core/src/live-query/SubscriptionServer.js +0 -111
  137. package/esm/core/src/live-query/live-query-tests.spec.d.ts +0 -6
  138. package/esm/core/src/live-query/live-query-tests.spec.js +0 -952
  139. package/esm/core/src/remult-proxy.d.ts +0 -35
  140. package/esm/core/src/remult-proxy.js +0 -113
  141. package/esm/core/src/remult3/DecoratorReplacer.d.ts +0 -10
  142. package/esm/core/src/remult3/DecoratorReplacer.js +0 -20
  143. package/esm/core/src/remult3/RepositoryImplementation.d.ts +0 -355
  144. package/esm/core/src/remult3/RepositoryImplementation.js +0 -2109
  145. package/esm/core/src/remult3/index.d.ts +0 -2
  146. package/esm/core/src/remult3/index.js +0 -2
  147. package/esm/core/src/remult3/remult3.d.ts +0 -395
  148. package/esm/core/src/remult3/remult3.js +0 -2
  149. package/esm/core/src/server-action.d.ts +0 -81
  150. package/esm/core/src/server-action.js +0 -394
  151. package/esm/core/src/shared-tests/db-tests-setup.d.ts +0 -32
  152. package/esm/core/src/shared-tests/db-tests-setup.js +0 -78
  153. package/esm/core/src/shared-tests/db-tests.db-tests.d.ts +0 -25
  154. package/esm/core/src/shared-tests/db-tests.db-tests.js +0 -810
  155. package/esm/core/src/shared-tests/deleteAll.d.ts +0 -2
  156. package/esm/core/src/shared-tests/deleteAll.js +0 -4
  157. package/esm/core/src/shared-tests/entityWithValidations.d.ts +0 -14
  158. package/esm/core/src/shared-tests/entityWithValidations.js +0 -43
  159. package/esm/core/src/shared-tests/index.d.ts +0 -4
  160. package/esm/core/src/shared-tests/index.js +0 -4
  161. package/esm/core/src/shared-tests/test-custom-id-column.spec.d.ts +0 -1
  162. package/esm/core/src/shared-tests/test-custom-id-column.spec.js +0 -67
  163. package/esm/core/src/shared-tests/test-special-value.spec.d.ts +0 -10
  164. package/esm/core/src/shared-tests/test-special-value.spec.js +0 -73
  165. package/esm/core/src/shared-tests/test-update-with-null.spec.d.ts +0 -1
  166. package/esm/core/src/shared-tests/test-update-with-null.spec.js +0 -31
  167. package/esm/core/src/sort.d.ts +0 -16
  168. package/esm/core/src/sort.js +0 -103
  169. package/esm/core/src/sql-command.d.ts +0 -19
  170. package/esm/core/src/sql-command.js +0 -1
  171. package/esm/core/src/test.d.ts +0 -3
  172. package/esm/core/src/test.js +0 -12
  173. package/esm/core/src/tests/Done.d.ts +0 -5
  174. package/esm/core/src/tests/Done.js +0 -9
  175. package/esm/core/src/tests/RowProvider.spec.d.ts +0 -16
  176. package/esm/core/src/tests/RowProvider.spec.js +0 -631
  177. package/esm/core/src/tests/TestDataApiResponse.d.ts +0 -10
  178. package/esm/core/src/tests/TestDataApiResponse.js +0 -22
  179. package/esm/core/src/tests/basicRowFunctionality.spec.d.ts +0 -8
  180. package/esm/core/src/tests/basicRowFunctionality.spec.js +0 -2103
  181. package/esm/core/src/tests/c.d.ts +0 -8
  182. package/esm/core/src/tests/c.js +0 -13
  183. package/esm/core/src/tests/createData.d.ts +0 -7
  184. package/esm/core/src/tests/createData.js +0 -22
  185. package/esm/core/src/tests/d.d.ts +0 -6
  186. package/esm/core/src/tests/d.js +0 -11
  187. package/esm/core/src/tests/dWithPrefilter.d.ts +0 -7
  188. package/esm/core/src/tests/dWithPrefilter.js +0 -18
  189. package/esm/core/src/tests/entityForCustomFilter.d.ts +0 -16
  190. package/esm/core/src/tests/entityForCustomFilter.js +0 -33
  191. package/esm/core/src/tests/entityWithValidationsOnColumn.d.ts +0 -5
  192. package/esm/core/src/tests/entityWithValidationsOnColumn.js +0 -13
  193. package/esm/core/src/tests/frontend-database-tests-setup.spec.d.ts +0 -4
  194. package/esm/core/src/tests/frontend-database-tests-setup.spec.js +0 -37
  195. package/esm/core/src/tests/h.d.ts +0 -6
  196. package/esm/core/src/tests/h.js +0 -24
  197. package/esm/core/src/tests/remult-3-basic-tests.spec.d.ts +0 -1
  198. package/esm/core/src/tests/remult-3-basic-tests.spec.js +0 -236
  199. package/esm/core/src/tests/remult-3-entities.d.ts +0 -23
  200. package/esm/core/src/tests/remult-3-entities.js +0 -39
  201. package/esm/core/src/tests/tasks.d.ts +0 -6
  202. package/esm/core/src/tests/tasks.js +0 -10
  203. package/esm/core/src/tests/test-context-as-storage.spec.d.ts +0 -0
  204. package/esm/core/src/tests/test-context-as-storage.spec.js +0 -1
  205. package/esm/core/src/tests/test-data-api/predefined-filter.spec.d.ts +0 -1
  206. package/esm/core/src/tests/test-data-api/predefined-filter.spec.js +0 -389
  207. package/esm/core/src/tests/test-data-api/test-put-with-validation.spec.d.ts +0 -5
  208. package/esm/core/src/tests/test-data-api/test-put-with-validation.spec.js +0 -152
  209. package/esm/core/src/tests/test-decorator-precedence.spec.d.ts +0 -1
  210. package/esm/core/src/tests/test-decorator-precedence.spec.js +0 -38
  211. package/esm/core/src/tests/test-default-value.spec.d.ts +0 -1
  212. package/esm/core/src/tests/test-default-value.spec.js +0 -33
  213. package/esm/core/src/tests/test-entity-inheritance.spec.d.ts +0 -14
  214. package/esm/core/src/tests/test-entity-inheritance.spec.js +0 -82
  215. package/esm/core/src/tests/test-exceptions.spec.d.ts +0 -1
  216. package/esm/core/src/tests/test-exceptions.spec.js +0 -375
  217. package/esm/core/src/tests/test-json.spec.d.ts +0 -1
  218. package/esm/core/src/tests/test-json.spec.js +0 -115
  219. package/esm/core/src/tests/test-many-to-one-relation-in-entity.spec.d.ts +0 -9
  220. package/esm/core/src/tests/test-many-to-one-relation-in-entity.spec.js +0 -809
  221. package/esm/core/src/tests/test-non-active-record.spec.d.ts +0 -1
  222. package/esm/core/src/tests/test-non-active-record.spec.js +0 -66
  223. package/esm/core/src/tests/test-object-column.spec.d.ts +0 -1
  224. package/esm/core/src/tests/test-object-column.spec.js +0 -189
  225. package/esm/core/src/tests/test-paged-foreach.spec.d.ts +0 -1
  226. package/esm/core/src/tests/test-paged-foreach.spec.js +0 -328
  227. package/esm/core/src/tests/test-remult-angular.spec.d.ts +0 -1
  228. package/esm/core/src/tests/test-remult-angular.spec.js +0 -23
  229. package/esm/core/src/tests/test-server-controller.spec.d.ts +0 -7
  230. package/esm/core/src/tests/test-server-controller.spec.js +0 -489
  231. package/esm/core/src/tests/test-server-expressions.spec.d.ts +0 -1
  232. package/esm/core/src/tests/test-server-expressions.spec.js +0 -178
  233. package/esm/core/src/tests/test-server-method-on-entity.spec.d.ts +0 -1
  234. package/esm/core/src/tests/test-server-method-on-entity.spec.js +0 -306
  235. package/esm/core/src/tests/test-sql-expression.spec.d.ts +0 -5
  236. package/esm/core/src/tests/test-sql-expression.spec.js +0 -205
  237. package/esm/core/src/tests/test-sql.spec.d.ts +0 -1
  238. package/esm/core/src/tests/test-sql.spec.js +0 -170
  239. package/esm/core/src/tests/test-subscribe.spec.d.ts +0 -1
  240. package/esm/core/src/tests/test-subscribe.spec.js +0 -135
  241. package/esm/core/src/tests/test-type-recovery.spec.d.ts +0 -1
  242. package/esm/core/src/tests/test-type-recovery.spec.js +0 -49
  243. package/esm/core/src/tests/test-where-api.spec.d.ts +0 -1
  244. package/esm/core/src/tests/test-where-api.spec.js +0 -434
  245. package/esm/core/src/tests/testHelper.spec.d.ts +0 -36
  246. package/esm/core/src/tests/testHelper.spec.js +0 -226
  247. package/esm/core/src/tests/testModel/models.d.ts +0 -16
  248. package/esm/core/src/tests/testModel/models.js +0 -25
  249. package/esm/core/src/validators.d.ts +0 -14
  250. package/esm/core/src/validators.js +0 -33
  251. package/esm/core/src/valueConverters.js +0 -197
  252. package/esm/core/urlBuilder.d.ts +0 -6
  253. package/esm/core/urlBuilder.js +0 -20
  254. package/esm/test-servers/shared/Task.d.ts +0 -9
  255. package/esm/test-servers/shared/Task.js +0 -32
  256. package/esm/test.d.ts +0 -5
  257. 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
- });