remult 0.22.3 → 0.22.4

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 (253) hide show
  1. package/esm/angular/interfaces/index.d.ts +1 -0
  2. package/esm/angular/interfaces/index.js +1 -0
  3. package/esm/angular/interfaces/src/column-collection.d.ts +70 -0
  4. package/esm/angular/interfaces/src/column-collection.js +341 -0
  5. package/esm/angular/interfaces/src/data-area-settings.d.ts +15 -0
  6. package/esm/angular/interfaces/src/data-area-settings.js +35 -0
  7. package/esm/angular/interfaces/src/data-control-interfaces.d.ts +36 -0
  8. package/esm/angular/interfaces/src/data-control-interfaces.js +57 -0
  9. package/esm/angular/interfaces/src/dataList.d.ts +13 -0
  10. package/esm/angular/interfaces/src/dataList.js +42 -0
  11. package/esm/angular/interfaces/src/filter-helper.d.ts +13 -0
  12. package/esm/angular/interfaces/src/filter-helper.js +59 -0
  13. package/esm/angular/interfaces/src/grid-settings.d.ts +145 -0
  14. package/esm/angular/interfaces/src/grid-settings.js +387 -0
  15. package/esm/angular/interfaces/src/public_api.d.ts +4 -0
  16. package/esm/angular/interfaces/src/public_api.js +4 -0
  17. package/esm/angular/src/angular/RemultAngularPluginsService.d.ts +4 -0
  18. package/esm/angular/src/angular/RemultAngularPluginsService.js +3 -0
  19. package/esm/angular/src/angular/data-control/data-control2.component.d.ts +49 -0
  20. package/esm/angular/src/angular/data-control/data-control2.component.js +138 -0
  21. package/esm/core/SseSubscriptionServer.d.ts +33 -0
  22. package/esm/core/SseSubscriptionServer.js +107 -0
  23. package/esm/core/assign.d.ts +1 -0
  24. package/esm/core/assign.js +5 -0
  25. package/esm/core/classType.d.ts +3 -0
  26. package/esm/core/classType.js +1 -0
  27. package/esm/core/index.d.ts +27 -0
  28. package/esm/core/index.js +25 -0
  29. package/esm/core/inputTypes.d.ts +9 -0
  30. package/esm/core/inputTypes.js +9 -0
  31. package/esm/core/live-query/data-provider-live-query-storage.d.ts +22 -0
  32. package/esm/core/live-query/data-provider-live-query-storage.js +71 -0
  33. package/esm/core/postgres/index.d.ts +2 -0
  34. package/esm/core/postgres/index.js +2 -0
  35. package/esm/core/postgres/postgres-data-provider.d.ts +36 -0
  36. package/esm/core/postgres/postgres-data-provider.js +120 -0
  37. package/esm/core/postgres/schema-builder.d.ts +17 -0
  38. package/esm/core/postgres/schema-builder.js +153 -0
  39. package/esm/core/remult-fresh.d.ts +17 -0
  40. package/esm/core/remult-fresh.js +29 -0
  41. package/esm/core/remult-knex/index.d.ts +30 -0
  42. package/esm/core/remult-knex/index.js +446 -0
  43. package/esm/core/remult-mongo.d.ts +24 -0
  44. package/esm/core/remult-mongo.js +254 -0
  45. package/esm/core/server/JsonEntityFileStorage.d.ts +10 -0
  46. package/esm/core/server/JsonEntityFileStorage.js +25 -0
  47. package/esm/core/server/core.d.ts +4 -0
  48. package/esm/core/server/core.js +4 -0
  49. package/esm/core/server/expressBridge.d.ts +182 -0
  50. package/esm/core/server/expressBridge.js +938 -0
  51. package/esm/core/server/index.d.ts +6 -0
  52. package/esm/core/server/index.js +9 -0
  53. package/esm/core/server/initAsyncHooks.d.ts +1 -0
  54. package/esm/core/server/initAsyncHooks.js +9 -0
  55. package/esm/core/server/initDataProvider.d.ts +2 -0
  56. package/esm/core/server/initDataProvider.js +14 -0
  57. package/esm/core/src/__EntityValueProvider.d.ts +11 -0
  58. package/esm/core/src/__EntityValueProvider.js +1 -0
  59. package/esm/core/src/__RowsOfDataForTesting.d.ts +3 -0
  60. package/esm/core/src/__RowsOfDataForTesting.js +1 -0
  61. package/esm/core/src/backend-tests/backend-database-test-setup.backend-spec.d.ts +6 -0
  62. package/esm/core/src/backend-tests/backend-database-test-setup.backend-spec.js +147 -0
  63. package/{src → esm/core/src}/backend-tests/my-test.backend-spec.d.ts +1 -1
  64. package/esm/core/src/backend-tests/my-test.backend-spec.js +197 -0
  65. package/esm/core/src/backend-tests/test-http-server.backend-spec.d.ts +1 -0
  66. package/esm/core/src/backend-tests/test-http-server.backend-spec.js +167 -0
  67. package/esm/core/src/buildRestDataProvider.d.ts +31 -0
  68. package/esm/core/src/buildRestDataProvider.js +113 -0
  69. package/esm/core/src/column-interfaces.d.ts +154 -0
  70. package/esm/core/src/column-interfaces.js +7 -0
  71. package/esm/core/src/column.d.ts +58 -0
  72. package/esm/core/src/column.js +174 -0
  73. package/esm/core/src/context.d.ts +134 -0
  74. package/esm/core/src/context.js +286 -0
  75. package/esm/core/src/data-api.d.ts +39 -0
  76. package/esm/core/src/data-api.js +279 -0
  77. package/esm/core/src/data-interfaces.d.ts +41 -0
  78. package/esm/core/src/data-interfaces.js +12 -0
  79. package/esm/core/src/data-providers/array-entity-data-provider.d.ts +22 -0
  80. package/esm/core/src/data-providers/array-entity-data-provider.js +252 -0
  81. package/esm/core/src/data-providers/in-memory-database.d.ts +9 -0
  82. package/esm/core/src/data-providers/in-memory-database.js +14 -0
  83. package/esm/core/src/data-providers/json-data-provider.d.ts +12 -0
  84. package/esm/core/src/data-providers/json-data-provider.js +55 -0
  85. package/esm/core/src/data-providers/rest-data-provider.d.ts +49 -0
  86. package/esm/core/src/data-providers/rest-data-provider.js +256 -0
  87. package/esm/core/src/data-providers/sql-database.d.ts +33 -0
  88. package/esm/core/src/data-providers/sql-database.js +384 -0
  89. package/esm/core/src/data-providers/web-sql-data-provider.d.ts +24 -0
  90. package/esm/core/src/data-providers/web-sql-data-provider.js +143 -0
  91. package/esm/core/src/entity.d.ts +91 -0
  92. package/esm/core/src/entity.js +1 -0
  93. package/esm/core/src/filter/filter-consumer-bridge-to-sql-request.d.ts +50 -0
  94. package/esm/core/src/filter/filter-consumer-bridge-to-sql-request.js +150 -0
  95. package/esm/core/src/filter/filter-consumer-bridge-to-url-builder.d.ts +1 -0
  96. package/esm/core/src/filter/filter-consumer-bridge-to-url-builder.js +1 -0
  97. package/esm/core/src/filter/filter-interfaces.d.ts +85 -0
  98. package/esm/core/src/filter/filter-interfaces.js +477 -0
  99. package/esm/core/src/live-query/LiveQueryClient.d.ts +20 -0
  100. package/esm/core/src/live-query/LiveQueryClient.js +188 -0
  101. package/esm/core/src/live-query/SseSubscriptionClient.d.ts +5 -0
  102. package/esm/core/src/live-query/SseSubscriptionClient.js +86 -0
  103. package/esm/core/src/live-query/SubscriptionChannel.d.ts +72 -0
  104. package/esm/core/src/live-query/SubscriptionChannel.js +123 -0
  105. package/esm/core/src/live-query/SubscriptionServer.d.ts +53 -0
  106. package/esm/core/src/live-query/SubscriptionServer.js +111 -0
  107. package/esm/core/src/live-query/live-query-tests.spec.d.ts +6 -0
  108. package/esm/core/src/live-query/live-query-tests.spec.js +952 -0
  109. package/esm/core/src/remult-proxy.d.ts +35 -0
  110. package/esm/core/src/remult-proxy.js +113 -0
  111. package/esm/core/src/remult3/DecoratorReplacer.d.ts +10 -0
  112. package/esm/core/src/remult3/DecoratorReplacer.js +20 -0
  113. package/esm/core/src/remult3/RepositoryImplementation.d.ts +355 -0
  114. package/esm/core/src/remult3/RepositoryImplementation.js +2109 -0
  115. package/esm/core/src/remult3/index.d.ts +2 -0
  116. package/esm/core/src/remult3/index.js +2 -0
  117. package/esm/core/src/remult3/remult3.d.ts +395 -0
  118. package/esm/core/src/remult3/remult3.js +2 -0
  119. package/esm/core/src/server-action.d.ts +81 -0
  120. package/esm/core/src/server-action.js +394 -0
  121. package/esm/core/src/shared-tests/db-tests-setup.d.ts +32 -0
  122. package/esm/core/src/shared-tests/db-tests-setup.js +78 -0
  123. package/esm/core/src/shared-tests/db-tests.db-tests.d.ts +25 -0
  124. package/esm/core/src/shared-tests/db-tests.db-tests.js +810 -0
  125. package/esm/core/src/shared-tests/deleteAll.d.ts +2 -0
  126. package/esm/core/src/shared-tests/deleteAll.js +4 -0
  127. package/esm/core/src/shared-tests/entityWithValidations.d.ts +14 -0
  128. package/esm/core/src/shared-tests/entityWithValidations.js +43 -0
  129. package/esm/core/src/shared-tests/index.d.ts +4 -0
  130. package/esm/core/src/shared-tests/index.js +4 -0
  131. package/esm/core/src/shared-tests/test-custom-id-column.spec.d.ts +1 -0
  132. package/esm/core/src/shared-tests/test-custom-id-column.spec.js +67 -0
  133. package/esm/core/src/shared-tests/test-special-value.spec.d.ts +10 -0
  134. package/esm/core/src/shared-tests/test-special-value.spec.js +73 -0
  135. package/esm/core/src/shared-tests/test-update-with-null.spec.d.ts +1 -0
  136. package/esm/core/src/shared-tests/test-update-with-null.spec.js +31 -0
  137. package/esm/core/src/sort.d.ts +16 -0
  138. package/esm/core/src/sort.js +103 -0
  139. package/esm/core/src/sql-command.d.ts +19 -0
  140. package/esm/core/src/sql-command.js +1 -0
  141. package/esm/core/src/test.d.ts +3 -0
  142. package/esm/core/src/test.js +12 -0
  143. package/esm/core/src/tests/Done.d.ts +5 -0
  144. package/esm/core/src/tests/Done.js +9 -0
  145. package/esm/core/src/tests/RowProvider.spec.d.ts +16 -0
  146. package/esm/core/src/tests/RowProvider.spec.js +631 -0
  147. package/esm/core/src/tests/TestDataApiResponse.d.ts +10 -0
  148. package/esm/core/src/tests/TestDataApiResponse.js +22 -0
  149. package/esm/core/src/tests/basicRowFunctionality.spec.d.ts +8 -0
  150. package/esm/core/src/tests/basicRowFunctionality.spec.js +2103 -0
  151. package/esm/core/src/tests/c.d.ts +8 -0
  152. package/esm/core/src/tests/c.js +13 -0
  153. package/esm/core/src/tests/createData.d.ts +7 -0
  154. package/esm/core/src/tests/createData.js +22 -0
  155. package/esm/core/src/tests/d.d.ts +6 -0
  156. package/esm/core/src/tests/d.js +11 -0
  157. package/esm/core/src/tests/dWithPrefilter.d.ts +7 -0
  158. package/esm/core/src/tests/dWithPrefilter.js +18 -0
  159. package/esm/core/src/tests/entityForCustomFilter.d.ts +16 -0
  160. package/esm/core/src/tests/entityForCustomFilter.js +33 -0
  161. package/esm/core/src/tests/entityWithValidationsOnColumn.d.ts +5 -0
  162. package/esm/core/src/tests/entityWithValidationsOnColumn.js +13 -0
  163. package/esm/core/src/tests/frontend-database-tests-setup.spec.d.ts +4 -0
  164. package/esm/core/src/tests/frontend-database-tests-setup.spec.js +37 -0
  165. package/esm/core/src/tests/h.d.ts +6 -0
  166. package/esm/core/src/tests/h.js +24 -0
  167. package/esm/core/src/tests/remult-3-basic-tests.spec.d.ts +1 -0
  168. package/esm/core/src/tests/remult-3-basic-tests.spec.js +236 -0
  169. package/esm/core/src/tests/remult-3-entities.d.ts +23 -0
  170. package/esm/core/src/tests/remult-3-entities.js +39 -0
  171. package/esm/core/src/tests/tasks.d.ts +6 -0
  172. package/esm/core/src/tests/tasks.js +10 -0
  173. package/esm/core/src/tests/test-context-as-storage.spec.d.ts +0 -0
  174. package/esm/core/src/tests/test-context-as-storage.spec.js +1 -0
  175. package/esm/core/src/tests/test-data-api/predefined-filter.spec.d.ts +1 -0
  176. package/esm/core/src/tests/test-data-api/predefined-filter.spec.js +389 -0
  177. package/esm/core/src/tests/test-data-api/test-put-with-validation.spec.d.ts +5 -0
  178. package/esm/core/src/tests/test-data-api/test-put-with-validation.spec.js +152 -0
  179. package/esm/core/src/tests/test-decorator-precedence.spec.d.ts +1 -0
  180. package/esm/core/src/tests/test-decorator-precedence.spec.js +38 -0
  181. package/esm/core/src/tests/test-default-value.spec.d.ts +1 -0
  182. package/esm/core/src/tests/test-default-value.spec.js +33 -0
  183. package/esm/core/src/tests/test-entity-inheritance.spec.d.ts +14 -0
  184. package/esm/core/src/tests/test-entity-inheritance.spec.js +82 -0
  185. package/esm/core/src/tests/test-exceptions.spec.d.ts +1 -0
  186. package/esm/core/src/tests/test-exceptions.spec.js +375 -0
  187. package/esm/core/src/tests/test-json.spec.d.ts +1 -0
  188. package/esm/core/src/tests/test-json.spec.js +115 -0
  189. package/esm/core/src/tests/test-many-to-one-relation-in-entity.spec.d.ts +9 -0
  190. package/esm/core/src/tests/test-many-to-one-relation-in-entity.spec.js +809 -0
  191. package/esm/core/src/tests/test-non-active-record.spec.d.ts +1 -0
  192. package/esm/core/src/tests/test-non-active-record.spec.js +66 -0
  193. package/esm/core/src/tests/test-object-column.spec.d.ts +1 -0
  194. package/esm/core/src/tests/test-object-column.spec.js +189 -0
  195. package/esm/core/src/tests/test-paged-foreach.spec.d.ts +1 -0
  196. package/esm/core/src/tests/test-paged-foreach.spec.js +328 -0
  197. package/esm/core/src/tests/test-remult-angular.spec.d.ts +1 -0
  198. package/esm/core/src/tests/test-remult-angular.spec.js +23 -0
  199. package/esm/core/src/tests/test-server-controller.spec.d.ts +7 -0
  200. package/esm/core/src/tests/test-server-controller.spec.js +489 -0
  201. package/esm/core/src/tests/test-server-expressions.spec.d.ts +1 -0
  202. package/esm/core/src/tests/test-server-expressions.spec.js +178 -0
  203. package/esm/core/src/tests/test-server-method-on-entity.spec.d.ts +1 -0
  204. package/esm/core/src/tests/test-server-method-on-entity.spec.js +306 -0
  205. package/esm/core/src/tests/test-sql-expression.spec.d.ts +5 -0
  206. package/esm/core/src/tests/test-sql-expression.spec.js +205 -0
  207. package/esm/core/src/tests/test-sql.spec.d.ts +1 -0
  208. package/esm/core/src/tests/test-sql.spec.js +170 -0
  209. package/esm/core/src/tests/test-subscribe.spec.d.ts +1 -0
  210. package/esm/core/src/tests/test-subscribe.spec.js +135 -0
  211. package/esm/core/src/tests/test-type-recovery.spec.d.ts +1 -0
  212. package/esm/core/src/tests/test-type-recovery.spec.js +49 -0
  213. package/esm/core/src/tests/test-where-api.spec.d.ts +1 -0
  214. package/esm/core/src/tests/test-where-api.spec.js +434 -0
  215. package/esm/core/src/tests/testHelper.spec.d.ts +36 -0
  216. package/esm/core/src/tests/testHelper.spec.js +226 -0
  217. package/esm/core/src/tests/testModel/models.d.ts +16 -0
  218. package/esm/core/src/tests/testModel/models.js +25 -0
  219. package/esm/core/src/validators.d.ts +14 -0
  220. package/esm/core/src/validators.js +33 -0
  221. package/{valueConverters.d.ts → esm/core/src/valueConverters.d.ts} +13 -12
  222. package/esm/core/src/valueConverters.js +197 -0
  223. package/esm/core/urlBuilder.d.ts +6 -0
  224. package/esm/core/urlBuilder.js +20 -0
  225. package/esm/graphql.js +27 -27
  226. package/esm/postgres/schema-builder.js +4 -4
  227. package/esm/src/remult3/RepositoryImplementation.d.ts +1 -1
  228. package/esm/src/remult3/RepositoryImplementation.js +27 -4
  229. package/esm/src/shared-tests/db-tests.db-tests.js +57 -0
  230. package/esm/test-servers/shared/Task.d.ts +9 -0
  231. package/esm/test-servers/shared/Task.js +32 -0
  232. package/esm/test.d.ts +5 -0
  233. package/esm/test.js +6 -0
  234. package/package.json +1 -1
  235. package/src/remult3/RepositoryImplementation.d.ts +1 -1
  236. package/src/remult3/RepositoryImplementation.js +88 -63
  237. package/src/shared-tests/db-tests.db-tests.js +97 -0
  238. package/esm/src/id-entity.d.ts +0 -4
  239. package/esm/src/id-entity.js +0 -8
  240. package/postgres/postgresColumnSyntax.d.ts +0 -2
  241. package/postgres/postgresColumnSyntax.js +0 -34
  242. package/remult-middleware.d.ts +0 -2
  243. package/remult-middleware.js +0 -70
  244. package/server/register-actions-on-server.d.ts +0 -3
  245. package/server/register-actions-on-server.js +0 -50
  246. package/server/register-entities-on-server.d.ts +0 -3
  247. package/server/register-entities-on-server.js +0 -19
  248. package/src/backend-tests/my-test.backend-spec.js +0 -217
  249. package/src/backend-tests/test-http-server.backend-spec.d.ts +0 -6
  250. package/src/backend-tests/test-http-server.backend-spec.js +0 -342
  251. package/src/id-entity.d.ts +0 -4
  252. package/src/id-entity.js +0 -17
  253. package/valueConverters.js +0 -168
@@ -0,0 +1,809 @@
1
+ import { Remult } from '../context';
2
+ import { InMemoryDataProvider } from '../data-providers/in-memory-database';
3
+ import { Field, Entity, EntityBase, Fields, getEntityRef } from '../remult3';
4
+ import { entityFilterToJson, Filter } from '../filter/filter-interfaces';
5
+ import { Language } from './RowProvider.spec';
6
+ import { WebSqlDataProvider } from '../data-providers/web-sql-data-provider';
7
+ import { SqlDatabase } from '../data-providers/sql-database';
8
+ import { DataApi } from '../data-api';
9
+ import { actionInfo } from '../server-action';
10
+ import { Done } from './Done';
11
+ import { TestDataApiResponse } from './TestDataApiResponse';
12
+ import { h } from './h';
13
+ @Entity('categories')
14
+ class Categories extends EntityBase {
15
+ @Fields.integer()
16
+ id;
17
+ @Fields.string()
18
+ name;
19
+ @Field(() => Language)
20
+ language;
21
+ @Fields.boolean()
22
+ archive = false;
23
+ }
24
+ @Entity('suppliers')
25
+ class Suppliers extends EntityBase {
26
+ @Fields.string()
27
+ supplierId;
28
+ @Fields.string()
29
+ name;
30
+ }
31
+ @Entity('products')
32
+ class Products extends EntityBase {
33
+ @Fields.integer()
34
+ id;
35
+ @Fields.string()
36
+ name;
37
+ @Field(() => Categories, {
38
+ lazy: true
39
+ })
40
+ category;
41
+ @Field(() => Suppliers)
42
+ supplier;
43
+ }
44
+ @Entity('products')
45
+ class ProductsEager extends EntityBase {
46
+ @Fields.integer()
47
+ id;
48
+ @Fields.string()
49
+ name;
50
+ @Field(() => Categories)
51
+ category;
52
+ }
53
+ @Entity('profile')
54
+ class profile extends EntityBase {
55
+ remult;
56
+ @Fields.string()
57
+ id;
58
+ async rel() {
59
+ return this.remult.repo(following).findFirst({ id: '1', profile: this }, {
60
+ createIfNotFound: true
61
+ });
62
+ }
63
+ @Fields.boolean({
64
+ serverExpression: async (self) => {
65
+ await self.rel();
66
+ return false;
67
+ }
68
+ })
69
+ following;
70
+ constructor(remult) {
71
+ super();
72
+ this.remult = remult;
73
+ }
74
+ }
75
+ @Entity('following')
76
+ class following extends EntityBase {
77
+ @Fields.string()
78
+ id;
79
+ @Field(() => profile)
80
+ profile;
81
+ }
82
+ describe("many to one relation", () => {
83
+ beforeEach(() => actionInfo.runningOnServer = true);
84
+ afterEach(() => actionInfo.runningOnServer = false);
85
+ it("xx", async () => {
86
+ let mem = new InMemoryDataProvider();
87
+ let remult = new Remult();
88
+ remult.dataProvider = (mem);
89
+ await remult.repo(profile).create({ id: '1' }).save();
90
+ let p = await remult.repo(profile).findId('1');
91
+ expect(p.following).toBe(false);
92
+ });
93
+ it("test that it is loaded to begin with", async () => {
94
+ let mem = new InMemoryDataProvider();
95
+ let remult = new Remult();
96
+ remult.dataProvider = (mem);
97
+ let category = await remult.repo(Categories).create({ id: 1, name: 'cat 1' }).save();
98
+ await remult.repo(Products).create({ id: 1, name: 'p1', category }).save();
99
+ remult.clearAllCache();
100
+ let p = await remult.repo(ProductsEager).findId(1);
101
+ expect(p.category.id).toBe(1);
102
+ expect(p.$.category.getId()).toBe(1);
103
+ });
104
+ it("test repo save", async () => {
105
+ let remult = new Remult(new InMemoryDataProvider);
106
+ let category = await remult.repo(Categories).create({ id: 1, name: 'cat 1' }).save();
107
+ let p = await remult.repo(Products).save({ name: 'p1', category });
108
+ expect(p.category.id).toBe(1);
109
+ });
110
+ it("test repo save2", async () => {
111
+ let remult = new Remult(new InMemoryDataProvider);
112
+ let category = await remult.repo(Categories).create({ id: 1, name: 'cat 1' }).save();
113
+ let p = await remult.repo(Products).create({ name: 'p1' }).save();
114
+ expect(p.category).toBeNull();
115
+ p = await remult.repo(Products).save({ id: 0, category });
116
+ expect(p.category.id).toBe(1);
117
+ expect(p.name).toBe('p1');
118
+ });
119
+ it("test that it is loaded onDemand", async () => {
120
+ let mem = new InMemoryDataProvider();
121
+ let remult = new Remult();
122
+ remult.dataProvider = (mem);
123
+ let category = await remult.repo(Categories).create({ id: 1, name: 'cat 1' }).save();
124
+ await remult.repo(Products).create({ id: 1, name: 'p1', category }).save();
125
+ remult.clearAllCache();
126
+ let p = await remult.repo(ProductsEager).findId(1, { load: () => [] });
127
+ expect(p.category).toBe(undefined);
128
+ await p.$.category.load();
129
+ expect(p.category.id).toBe(1);
130
+ });
131
+ it("test that it is loaded onDemand", async () => {
132
+ let mem = new InMemoryDataProvider();
133
+ let remult = new Remult();
134
+ remult.dataProvider = (mem);
135
+ let category = await remult.repo(Categories).create({ id: 1, name: 'cat 1' }).save();
136
+ await remult.repo(Products).create({ id: 1, name: 'p1', category }).save();
137
+ remult.clearAllCache();
138
+ let p = await remult.repo(ProductsEager).findFirst({ id: 1 }, {
139
+ load: () => []
140
+ });
141
+ expect(p.category).toBe(undefined);
142
+ await p.$.category.load();
143
+ expect(p.category.id).toBe(1);
144
+ });
145
+ it("what", async () => {
146
+ let mem = new InMemoryDataProvider();
147
+ let remult = new Remult();
148
+ remult.dataProvider = (mem);
149
+ let cat = remult.repo(Categories).create();
150
+ cat.id = 1;
151
+ cat.name = "cat 1";
152
+ await cat.save();
153
+ let p = remult.repo(Products).create();
154
+ p.id = 10;
155
+ p.name = "prod 10";
156
+ p.category = cat;
157
+ expect(p.category.id).toBe(1, "right after set");
158
+ // expect(p.category.name).toBe("cat 1", "right after set");
159
+ await p.$.category.load();
160
+ expect(p.category.name).toBe("cat 1", "after set and wait load");
161
+ await p.save();
162
+ expect(p.category.name).toBe("cat 1", "after save");
163
+ expect(mem.rows[remult.repo(Products).metadata.key][0].category).toBe(1);
164
+ expect(p._.toApiJson().category).toBe(1, "to api pojo");
165
+ p = await remult.repo(Products).findFirst();
166
+ expect(p.id).toBe(10);
167
+ expect(p.category.id).toBe(1);
168
+ await p.$.category.load();
169
+ expect(p.category.name).toBe("cat 1");
170
+ expect((await p.$.name.load())).toBe("prod 10");
171
+ expect(await remult.repo(Products).count({ category: cat })).toBe(1);
172
+ let c2 = remult.repo(Categories).create();
173
+ c2.id = 2;
174
+ c2.name = "cat 2";
175
+ await c2.save();
176
+ expect(p._.wasChanged()).toBe(false, "x");
177
+ expect(p.$.category.valueChanged()).toBe(false, "y");
178
+ p.category = c2;
179
+ expect(p._.wasChanged()).toBe(true);
180
+ expect(p.$.category.valueChanged()).toBe(true);
181
+ expect(p.$.category.value.id).toBe(2);
182
+ expect(p.$.category.originalValue.id).toBe(1);
183
+ await p.save();
184
+ expect(p._.wasChanged()).toBe(false, "a");
185
+ expect(p.$.category.valueChanged()).toBe(false);
186
+ expect(p.$.category.value.id).toBe(2);
187
+ expect(p.$.category.originalValue.id).toBe(2);
188
+ p.category = null;
189
+ await p.save();
190
+ expect(p.$.category.inputValue).toBeNull();
191
+ p.category = cat;
192
+ expect(p.$.category.inputValue).toBe("1");
193
+ p.$.category.inputValue = "2";
194
+ expect(p.category).toBe(c2);
195
+ });
196
+ it("test wait load", async () => {
197
+ let mem = new InMemoryDataProvider();
198
+ let remult = new Remult();
199
+ remult.dataProvider = (mem);
200
+ let cat = remult.repo(Categories).create();
201
+ cat.id = 1;
202
+ cat.name = "cat 1";
203
+ await cat.save();
204
+ let c2 = remult.repo(Categories).create();
205
+ c2.id = 2;
206
+ c2.name = "cat 2";
207
+ await c2.save();
208
+ let p = remult.repo(Products).create();
209
+ p.id = 10;
210
+ p.name = "prod 10";
211
+ p.category = cat;
212
+ await p.save();
213
+ remult = new Remult();
214
+ remult.dataProvider = (mem);
215
+ p = await remult.repo(Products).findFirst();
216
+ p.category = c2;
217
+ await p.$.category.load();
218
+ expect(p.category.name).toBe("cat 2");
219
+ expect(p.$.category.value.name).toBe("cat 2");
220
+ expect(p.$.category.originalValue.name).toBe("cat 1");
221
+ });
222
+ it("test null", async () => {
223
+ let mem = new InMemoryDataProvider();
224
+ let remult = new Remult();
225
+ remult.dataProvider = (mem);
226
+ let p = remult.repo(Products).create();
227
+ p.id = 10;
228
+ p.name = "prod 10";
229
+ expect(p.category).toBe(null);
230
+ expect(p.category === undefined).toBe(false);
231
+ expect(p.category === null).toBe(true);
232
+ expect(null == undefined).toBe(true);
233
+ //expect(p.category==undefined).toBe(false);
234
+ expect(p.category == null).toBe(true);
235
+ await p.save();
236
+ p = await remult.repo(Products).findFirst();
237
+ expect(p.category).toBe(null);
238
+ expect(await remult.repo(Products).count({ category: null })).toBe(1);
239
+ });
240
+ it("test stages", async () => {
241
+ let mem = new InMemoryDataProvider();
242
+ let remult = new Remult();
243
+ remult.dataProvider = (mem);
244
+ let p = remult.repo(Products).create();
245
+ p.id = 10;
246
+ p.name = "prod 10";
247
+ let c = remult.repo(Categories).create();
248
+ c.id = 1;
249
+ c.name = "cat 1";
250
+ await c.save();
251
+ p.category = c;
252
+ await p.save();
253
+ remult = new Remult();
254
+ remult.dataProvider = (mem);
255
+ p = await remult.repo(Products).findFirst();
256
+ expect(p.category).toBeUndefined();
257
+ expect(p.category === undefined).toBe(true);
258
+ expect(p.category === null).toBe(false);
259
+ await p.$.category.load();
260
+ expect(p.category.name).toBe("cat 1");
261
+ });
262
+ it("test update from api", async () => {
263
+ let mem = new InMemoryDataProvider();
264
+ let remult = new Remult();
265
+ remult.dataProvider = (mem);
266
+ let p = remult.repo(Products).create();
267
+ p.id = 10;
268
+ p.name = "prod 10";
269
+ let c = remult.repo(Categories).create();
270
+ c.id = 1;
271
+ c.name = "cat 1";
272
+ await c.save();
273
+ await p.save();
274
+ expect(p.category).toBeNull();
275
+ p._._updateEntityBasedOnApi({ category: 1 });
276
+ expect(p.$.category.inputValue).toBe('1');
277
+ await p.$.category.load();
278
+ expect(p.category.id).toBe(c.id);
279
+ });
280
+ it("test easy create", async () => {
281
+ let mem = new InMemoryDataProvider();
282
+ let remult = new Remult();
283
+ remult.dataProvider = (mem);
284
+ let c = await remult.repo(Categories).create({
285
+ id: 1,
286
+ name: 'cat 1'
287
+ }).save();
288
+ expect(c.id).toBe(1);
289
+ expect(c.name).toBe('cat 1');
290
+ let p = remult.repo(Products).create({
291
+ id: 10,
292
+ name: "prod 10",
293
+ category: c
294
+ });
295
+ expect(p.category.id).toBe(1);
296
+ await p.save();
297
+ expect(p.category.id).toBe(1);
298
+ });
299
+ it("test filter create", async () => {
300
+ let mem = new InMemoryDataProvider();
301
+ let remult = new Remult();
302
+ remult.dataProvider = (mem);
303
+ let c = await remult.repo(Categories).create({
304
+ id: 1,
305
+ name: 'cat 1'
306
+ }).save();
307
+ let c2 = await remult.repo(Categories).create({
308
+ id: 2,
309
+ name: 'cat 2'
310
+ }).save();
311
+ let repo = remult.repo(Products);
312
+ await repo.create({
313
+ id: 10,
314
+ name: "prod 10",
315
+ category: c
316
+ }).save();
317
+ await repo.create({
318
+ id: 11,
319
+ name: "prod 1",
320
+ category: c
321
+ }).save();
322
+ await repo.create({
323
+ id: 12,
324
+ name: "prod 12",
325
+ category: c2
326
+ }).save();
327
+ await repo.create({
328
+ id: 13,
329
+ name: "prod 13",
330
+ }).save();
331
+ await repo.create({
332
+ id: 14,
333
+ name: "prod 14",
334
+ }).save();
335
+ await repo.create({
336
+ id: 15,
337
+ name: "prod 15",
338
+ }).save();
339
+ async function test(where, expected) {
340
+ expect(await repo.count(where)).toBe(expected);
341
+ function log(x) {
342
+ return x;
343
+ }
344
+ expect(await repo.count(log(Filter.entityFilterFromJson(repo.metadata, log(entityFilterToJson(repo.metadata, where)))))).toBe(expected, "packed where");
345
+ }
346
+ await test({ category: c }, 2);
347
+ await test({ category: null }, 3);
348
+ await test({ category: c2 }, 1);
349
+ });
350
+ it("test that not too many reads are made", async () => {
351
+ let mem = new InMemoryDataProvider();
352
+ let remult = new Remult();
353
+ remult.dataProvider = (mem);
354
+ let cat = await remult.repo(Categories).create({
355
+ id: 1, name: 'cat 2'
356
+ }).save();
357
+ let p = await remult.repo(Products).create({
358
+ id: 10,
359
+ name: "prod 10",
360
+ category: cat
361
+ }).save();
362
+ let fetches = 0;
363
+ remult = new Remult();
364
+ remult.dataProvider = ({
365
+ transaction: undefined,
366
+ getEntityDataProvider: e => {
367
+ let r = mem.getEntityDataProvider(e);
368
+ return {
369
+ find: x => {
370
+ fetches++;
371
+ return r.find(x);
372
+ }, count: r.count, delete: r.delete, insert: r.insert, update: r.update
373
+ };
374
+ }
375
+ });
376
+ p = await remult.repo(Products).findFirst();
377
+ expect(fetches).toBe(1);
378
+ p._.toApiJson();
379
+ expect(fetches).toBe(1);
380
+ });
381
+ it("test that not too many reads are made when getting multiple entities", async () => {
382
+ let mem = new InMemoryDataProvider();
383
+ let remult = new Remult(mem);
384
+ await remult.repo(Products).create({
385
+ id: 10,
386
+ name: "prod 10",
387
+ category: await remult.repo(Categories).create({
388
+ id: 1, name: 'cat 1'
389
+ }).save()
390
+ }).save();
391
+ await remult.repo(Products).create({
392
+ id: 11,
393
+ name: "prod 11",
394
+ category: await remult.repo(Categories).create({
395
+ id: 2, name: 'cat 2'
396
+ }).save()
397
+ }).save();
398
+ await remult.repo(Products).create({
399
+ id: 12,
400
+ name: "prod 12",
401
+ category: await remult.repo(Categories).create({
402
+ id: 3, name: 'cat 3'
403
+ }).save()
404
+ }).save();
405
+ let fetches = 0;
406
+ remult = new Remult();
407
+ remult.dataProvider = ({
408
+ transaction: undefined,
409
+ getEntityDataProvider: e => {
410
+ let r = mem.getEntityDataProvider(e);
411
+ return {
412
+ find: x => {
413
+ fetches++;
414
+ return r.find(x);
415
+ }, count: r.count, delete: r.delete, insert: r.insert, update: r.update
416
+ };
417
+ }
418
+ });
419
+ let r = await remult.repo(Products).find({ load: x => [x.category] });
420
+ expect(fetches).toBe(2);
421
+ for (const z of r) {
422
+ await z.$.category.load();
423
+ }
424
+ expect(fetches).toBe(2);
425
+ });
426
+ it("test update only updates what's needed", async () => {
427
+ let mem = new InMemoryDataProvider();
428
+ let remult = new Remult();
429
+ remult.dataProvider = (mem);
430
+ let cat = await remult.repo(Categories).create({
431
+ id: 1, name: 'cat 2'
432
+ }).save();
433
+ let p = await remult.repo(Products).create({
434
+ id: 10,
435
+ name: "prod 10",
436
+ category: cat
437
+ }).save();
438
+ let d = new Done();
439
+ remult.dataProvider = ({
440
+ transaction: undefined,
441
+ getEntityDataProvider: e => {
442
+ let r = mem.getEntityDataProvider(e);
443
+ return {
444
+ find: x => r.find(x), count: r.count, delete: r.delete, insert: r.insert, update: (id, data) => {
445
+ d.ok();
446
+ expect(data).toEqual({ name: "prod 11" });
447
+ return r.update(id, data);
448
+ }
449
+ };
450
+ }
451
+ });
452
+ p = await remult.repo(Products).findFirst();
453
+ p.name = "prod 11";
454
+ await p.save();
455
+ d.test();
456
+ });
457
+ it("test is null doesn't invoke read", async () => {
458
+ let mem = new InMemoryDataProvider();
459
+ let remult = new Remult();
460
+ remult.dataProvider = (mem);
461
+ let cat = await remult.repo(Categories).create({
462
+ id: 1, name: 'cat 1'
463
+ }).save();
464
+ let p = await remult.repo(Products).create({
465
+ id: 10,
466
+ name: "prod 10",
467
+ category: cat
468
+ }).save();
469
+ let fetches = 0;
470
+ await remult.repo(Categories).create({ id: 2, name: 'cat2' }).save();
471
+ await remult.repo(Categories).create({ id: 3, name: 'cat3' }).save();
472
+ remult = new Remult();
473
+ remult.dataProvider = ({
474
+ transaction: undefined,
475
+ getEntityDataProvider: e => {
476
+ let r = mem.getEntityDataProvider(e);
477
+ return {
478
+ find: x => {
479
+ fetches++;
480
+ return r.find(x);
481
+ }, count: r.count, delete: r.delete, insert: r.insert, update: r.update
482
+ };
483
+ }
484
+ });
485
+ p = await remult.repo(Products).findFirst();
486
+ expect(fetches).toBe(1);
487
+ expect(p.$.category.valueIsNull()).toBe(false);
488
+ expect(fetches).toBe(1);
489
+ await p.$.category.load();
490
+ expect(fetches).toBe(2);
491
+ p.category = 2;
492
+ expect(fetches).toBe(2);
493
+ await p.$.category.load();
494
+ expect(fetches).toBe(3);
495
+ expect(p.category.name).toBe("cat2");
496
+ p.$.category.setId(3);
497
+ expect(fetches).toBe(3);
498
+ await p.$.category.load();
499
+ expect(fetches).toBe(4);
500
+ expect(p.category.name).toBe("cat3");
501
+ });
502
+ it("test to and from json ", async () => {
503
+ let mem = new InMemoryDataProvider();
504
+ let remult = new Remult();
505
+ remult.dataProvider = (mem);
506
+ let cat = await remult.repo(Categories).create({
507
+ id: 1, name: 'cat 2', language: Language.Russian
508
+ }).save();
509
+ let json = cat._.toApiJson();
510
+ let x = await remult.repo(Categories).fromJson(json);
511
+ expect(x.isNew()).toBe(false);
512
+ expect(x.language).toBe(Language.Russian);
513
+ expect(x.archive).toBe(false);
514
+ x.name = 'cat 3';
515
+ await x.save();
516
+ let rows = await remult.repo(Categories).find();
517
+ expect(rows.length).toBe(1);
518
+ expect(rows[0].name).toBe('cat 3');
519
+ });
520
+ it("test to and from json 2", async () => {
521
+ let mem = new InMemoryDataProvider();
522
+ let remult = new Remult();
523
+ remult.dataProvider = (mem);
524
+ let cat = await remult.repo(Categories).create({
525
+ id: 1, name: 'cat 2'
526
+ }).save();
527
+ let p = await remult.repo(Products).create({ id: 10, name: 'p1' }).save();
528
+ let json = p._.toApiJson();
529
+ let x = await remult.repo(Products).fromJson(json);
530
+ expect(x.isNew()).toBe(false);
531
+ await p.$.category.load();
532
+ expect(p.category).toBe(null);
533
+ p.category = cat;
534
+ await p.save();
535
+ json = p._.toApiJson();
536
+ x = await remult.repo(Products).fromJson(json);
537
+ expect(x.isNew()).toBe(false);
538
+ await p.$.category.load();
539
+ expect(p.category.id).toBe(cat.id);
540
+ });
541
+ it("test to and from json 2", async () => {
542
+ let mem = new InMemoryDataProvider();
543
+ let remult = new Remult();
544
+ remult.dataProvider = (mem);
545
+ let cat = await (await remult.repo(Categories).fromJson({
546
+ id: 1, name: 'cat 2'
547
+ }, true)).save();
548
+ expect(await remult.repo(Categories).count()).toBe(1);
549
+ });
550
+ it("test lookup with create", async () => {
551
+ let mem = new InMemoryDataProvider();
552
+ let remult = new Remult();
553
+ remult.dataProvider = (mem);
554
+ let cat = await remult.repo(Categories).create({
555
+ id: 1, name: 'cat 2'
556
+ }).save();
557
+ let p = await remult.repo(Products).findFirst({ id: 10, category: cat }, { createIfNotFound: true });
558
+ expect(p.isNew()).toBe(true);
559
+ expect(p.id).toBe(10);
560
+ expect((await p.$.category.load()).id).toBe(cat.id);
561
+ });
562
+ it("test set with id", async () => {
563
+ let mem = new InMemoryDataProvider();
564
+ let remult = new Remult();
565
+ remult.dataProvider = (mem);
566
+ let cat = await remult.repo(Categories).create({
567
+ id: 1, name: 'cat 2'
568
+ }).save();
569
+ let p = remult.repo(Products).create({
570
+ id: 10,
571
+ category: 1
572
+ });
573
+ expect(p.id).toBe(10);
574
+ expect((await p.$.category.load()).id).toBe(cat.id);
575
+ });
576
+ it("test set with json object", async () => {
577
+ let mem = new InMemoryDataProvider();
578
+ let remult = new Remult();
579
+ remult.dataProvider = (mem);
580
+ let cat = await remult.repo(Categories).create({
581
+ id: 1, name: 'cat 2'
582
+ }).save();
583
+ let p = remult.repo(Products).create({
584
+ id: 10,
585
+ category: cat._.toApiJson()
586
+ });
587
+ expect(p.id).toBe(10);
588
+ expect((await p.$.category.load()).id).toBe(cat.id);
589
+ expect((await p.$.category.load()).isNew()).toBe(false);
590
+ });
591
+ it("test relation in sql", async () => {
592
+ var wsql = new WebSqlDataProvider("test2");
593
+ let db = new SqlDatabase(wsql);
594
+ let remult = new Remult();
595
+ remult.dataProvider = (db);
596
+ for (const x of [Categories, Products, Suppliers]) {
597
+ let e = remult.repo(x).metadata;
598
+ await wsql.dropTable(e);
599
+ await wsql.createTable(e);
600
+ }
601
+ let cat = await remult.repo(Categories).create({ id: 1, name: 'cat' }).save();
602
+ let sup = await remult.repo(Suppliers).create({ supplierId: 'sup1', name: 'sup1name' }).save();
603
+ let p = await remult.repo(Products).create({
604
+ id: 10,
605
+ name: 'prod',
606
+ category: cat,
607
+ supplier: sup
608
+ }).save();
609
+ await p.$.category.load();
610
+ expect(p.category.id).toBe(cat.id);
611
+ let sqlr = (await db.execute("select category,supplier from products")).rows[0];
612
+ expect(sqlr.category).toEqual('1.0');
613
+ expect(sqlr.supplier).toBe('sup1');
614
+ expect(await remult.repo(Products).count({ supplier: sup })).toBe(1);
615
+ expect(await remult.repo(Products).count({ supplier: [sup] })).toBe(1);
616
+ });
617
+ it("test filter with id", async () => {
618
+ let mem = new InMemoryDataProvider();
619
+ let remult = new Remult();
620
+ remult.dataProvider = (mem);
621
+ const c1 = await remult.repo(Categories).create({ id: 1, name: 'cat 1' }).save();
622
+ const c2 = await remult.repo(Categories).create({ id: 2, name: 'cat 2' }).save();
623
+ const c3 = await remult.repo(Categories).create({ id: 3, name: 'cat 3' }).save();
624
+ await remult.repo(Products).create({ id: 10, category: c1 }).save();
625
+ await remult.repo(Products).create({ id: 20, category: c2 }).save();
626
+ await remult.repo(Products).create({ id: 30, category: c3 }).save();
627
+ expect(await remult.repo(Products).count({ category: { $id: 1 } })).toBe(1);
628
+ expect(await remult.repo(Products).count({ category: { $id: [2, 3] } })).toBe(2);
629
+ expect(await remult.repo(Products).count({ category: { $id: { $ne: 1 } } })).toBe(2);
630
+ expect(await remult.repo(Products).count({ category: { $id: { $ne: [2, 3] } } })).toBe(1);
631
+ expect(await remult.repo(Products).count({ category: { $id: { $in: [2, 3] } } })).toBe(2);
632
+ expect(await remult.repo(Products).count({ category: { $id: { $nin: [2, 3] } } })).toBe(1);
633
+ });
634
+ it("test cache", async () => {
635
+ const remult = new Remult(new InMemoryDataProvider());
636
+ const cat = await remult.repo(Categories).insert({ id: 1, name: "c1", archive: true });
637
+ cat["x"] = true;
638
+ const p = await remult.repo(Products2).insert({ id: 1, name: "p1", cat });
639
+ await p.$.cat.load();
640
+ expect(p.cat["x"]).toBe(true);
641
+ expect(p.cat.archive).toBe(true);
642
+ });
643
+ it("test cache2", async () => {
644
+ const remult = new Remult(new InMemoryDataProvider());
645
+ const cat = await remult.repo(Categories).insert({ id: 1, name: "c1", archive: true });
646
+ cat["x"] = true;
647
+ const p = await remult.repo(Products2).insert({ id: 1, name: "p1", cat: { id: 1, name: "b" } });
648
+ await p.$.cat.load();
649
+ expect(p.cat.archive).toBe(undefined);
650
+ });
651
+ });
652
+ @Entity("products2")
653
+ class Products2 extends EntityBase {
654
+ @Fields.integer()
655
+ id = 0;
656
+ @Fields.string()
657
+ name = '';
658
+ @Field(() => Categories)
659
+ cat;
660
+ }
661
+ let z;
662
+ z = {
663
+ id: 3,
664
+ name: 'noam'
665
+ };
666
+ describe("Test entity relation and count finds", () => {
667
+ it("test it", async () => {
668
+ let mem = new InMemoryDataProvider();
669
+ let c = new Remult();
670
+ c.dataProvider = (mem);
671
+ await c.repo(h).create({ id: '1' }).save();
672
+ expect(mem.rows['h'][0]).toEqual({ id: '1', refH: '', refHId: '' });
673
+ let countFind = 0;
674
+ c = new Remult();
675
+ c.dataProvider = ({
676
+ transaction: mem.transaction,
677
+ getEntityDataProvider: x => {
678
+ let r = mem.getEntityDataProvider(x);
679
+ return {
680
+ count: r.count,
681
+ delete: r.delete,
682
+ insert: r.insert,
683
+ update: r.update,
684
+ find: (o) => {
685
+ countFind++;
686
+ return r.find(o);
687
+ }
688
+ };
689
+ }
690
+ });
691
+ let h1 = await c.repo(h).findId('1');
692
+ await h1.$.refH.load();
693
+ expect(countFind).toBe(1);
694
+ });
695
+ it("test api", async () => {
696
+ let mem = new InMemoryDataProvider();
697
+ let c = new Remult();
698
+ c.dataProvider = (mem);
699
+ let a = await c.repo(h).create({ id: 'a' }).save();
700
+ let b = await c.repo(h).create({ id: 'b' }).save();
701
+ await c.repo(h).create({ id: 'd', refH: a }).save();
702
+ c = new Remult(); //clear the cache;
703
+ c.dataProvider = (mem);
704
+ let api = new DataApi(c.repo(h), c);
705
+ let t = new TestDataApiResponse();
706
+ let done = new Done();
707
+ t.success = d => {
708
+ expect(d.id).toBe('d');
709
+ expect(d.refH).toBe('b');
710
+ expect(d.refHId).toBe('b');
711
+ done.ok();
712
+ };
713
+ await api.put(t, 'd', { refH: 'b' });
714
+ done.test();
715
+ });
716
+ it("test api get array doesn't load", async () => {
717
+ let mem = new InMemoryDataProvider();
718
+ let c = new Remult();
719
+ c.dataProvider = (mem);
720
+ let a = await c.repo(h).create({ id: 'a' }).save();
721
+ let b = await c.repo(h).create({ id: 'b' }).save();
722
+ await c.repo(h).create({ id: 'd', refH: a }).save();
723
+ c = new Remult(); //clear the cache;
724
+ let fetches = 0;
725
+ c.dataProvider = ({
726
+ transaction: undefined,
727
+ getEntityDataProvider: e => {
728
+ let r = mem.getEntityDataProvider(e);
729
+ return {
730
+ find: x => {
731
+ fetches++;
732
+ return r.find(x);
733
+ }, count: r.count, delete: r.delete, insert: r.insert, update: r.update
734
+ };
735
+ }
736
+ }); //clear the cache;
737
+ let api = new DataApi(c.repo(h), c);
738
+ let t = new TestDataApiResponse();
739
+ let done = new Done();
740
+ t.success = d => {
741
+ done.ok();
742
+ };
743
+ await api.getArray(t, {
744
+ get: (key) => {
745
+ if (key == 'id')
746
+ return 'd';
747
+ }
748
+ });
749
+ done.test();
750
+ expect(fetches).toBe(1);
751
+ });
752
+ });
753
+ @Entity("testUpdateDate")
754
+ export class testUpdateDate extends EntityBase {
755
+ @Fields.integer()
756
+ id;
757
+ @Fields.date()
758
+ date = new Date(176, 6, 16);
759
+ }
760
+ it("test that it doesn't save if it doesn't need to", async () => {
761
+ let mem = new InMemoryDataProvider();
762
+ let updates = 0;
763
+ let repo = new Remult({
764
+ transaction: undefined,
765
+ getEntityDataProvider: e => {
766
+ let r = mem.getEntityDataProvider(e);
767
+ return {
768
+ find: x => {
769
+ return r.find(x);
770
+ }, count: r.count, delete: r.delete, insert: x => r.insert(x), update: (id, x) => { updates++; return r.update(id, x); }
771
+ };
772
+ }
773
+ }).repo(testUpdateDate);
774
+ await Promise.all(await repo.find().then(x => x.map(y => repo.delete(y))));
775
+ var r = await repo.create({ id: 1 }).save();
776
+ expect(updates).toBe(0);
777
+ await r.save();
778
+ expect(updates).toBe(0);
779
+ r.date = new Date(1978, 3, 15);
780
+ await r.save();
781
+ expect(updates).toBe(1);
782
+ });
783
+ it("test set uuid", async () => {
784
+ const remult = new Remult(new InMemoryDataProvider());
785
+ const x = await remult.repo(Contact).insert({ id: 'a', name: 'a' });
786
+ expect(x.id).toBe('a');
787
+ });
788
+ @Entity("contact")
789
+ class Contact {
790
+ @Fields.uuid()
791
+ id;
792
+ @Fields.string()
793
+ name = '';
794
+ }
795
+ @Entity("tag")
796
+ class Tags {
797
+ @Fields.uuid()
798
+ id;
799
+ @Field(() => Contact)
800
+ contact;
801
+ }
802
+ describe("Test many to one without active record", () => {
803
+ it("should work", async () => {
804
+ const remult = new Remult(new InMemoryDataProvider());
805
+ const c = await remult.repo(Contact).insert({ name: 'c1' });
806
+ const t = await remult.repo(Tags).insert({ contact: c });
807
+ expect(getEntityRef(t).fields.contact.getId()).toBe(c.id);
808
+ });
809
+ });