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.
- package/esm/angular/interfaces/index.d.ts +1 -0
- package/esm/angular/interfaces/index.js +1 -0
- package/esm/angular/interfaces/src/column-collection.d.ts +70 -0
- package/esm/angular/interfaces/src/column-collection.js +341 -0
- package/esm/angular/interfaces/src/data-area-settings.d.ts +15 -0
- package/esm/angular/interfaces/src/data-area-settings.js +35 -0
- package/esm/angular/interfaces/src/data-control-interfaces.d.ts +36 -0
- package/esm/angular/interfaces/src/data-control-interfaces.js +57 -0
- package/esm/angular/interfaces/src/dataList.d.ts +13 -0
- package/esm/angular/interfaces/src/dataList.js +42 -0
- package/esm/angular/interfaces/src/filter-helper.d.ts +13 -0
- package/esm/angular/interfaces/src/filter-helper.js +59 -0
- package/esm/angular/interfaces/src/grid-settings.d.ts +145 -0
- package/esm/angular/interfaces/src/grid-settings.js +387 -0
- package/esm/angular/interfaces/src/public_api.d.ts +4 -0
- package/esm/angular/interfaces/src/public_api.js +4 -0
- package/esm/angular/src/angular/RemultAngularPluginsService.d.ts +4 -0
- package/esm/angular/src/angular/RemultAngularPluginsService.js +3 -0
- package/esm/angular/src/angular/data-control/data-control2.component.d.ts +49 -0
- package/esm/angular/src/angular/data-control/data-control2.component.js +138 -0
- package/esm/core/SseSubscriptionServer.d.ts +33 -0
- package/esm/core/SseSubscriptionServer.js +107 -0
- package/esm/core/assign.d.ts +1 -0
- package/esm/core/assign.js +5 -0
- package/esm/core/classType.d.ts +3 -0
- package/esm/core/classType.js +1 -0
- package/esm/core/index.d.ts +27 -0
- package/esm/core/index.js +25 -0
- package/esm/core/inputTypes.d.ts +9 -0
- package/esm/core/inputTypes.js +9 -0
- package/esm/core/live-query/data-provider-live-query-storage.d.ts +22 -0
- package/esm/core/live-query/data-provider-live-query-storage.js +71 -0
- package/esm/core/postgres/index.d.ts +2 -0
- package/esm/core/postgres/index.js +2 -0
- package/esm/core/postgres/postgres-data-provider.d.ts +36 -0
- package/esm/core/postgres/postgres-data-provider.js +120 -0
- package/esm/core/postgres/schema-builder.d.ts +17 -0
- package/esm/core/postgres/schema-builder.js +153 -0
- package/esm/core/remult-fresh.d.ts +17 -0
- package/esm/core/remult-fresh.js +29 -0
- package/esm/core/remult-knex/index.d.ts +30 -0
- package/esm/core/remult-knex/index.js +446 -0
- package/esm/core/remult-mongo.d.ts +24 -0
- package/esm/core/remult-mongo.js +254 -0
- package/esm/core/server/JsonEntityFileStorage.d.ts +10 -0
- package/esm/core/server/JsonEntityFileStorage.js +25 -0
- package/esm/core/server/core.d.ts +4 -0
- package/esm/core/server/core.js +4 -0
- package/esm/core/server/expressBridge.d.ts +182 -0
- package/esm/core/server/expressBridge.js +938 -0
- package/esm/core/server/index.d.ts +6 -0
- package/esm/core/server/index.js +9 -0
- package/esm/core/server/initAsyncHooks.d.ts +1 -0
- package/esm/core/server/initAsyncHooks.js +9 -0
- package/esm/core/server/initDataProvider.d.ts +2 -0
- package/esm/core/server/initDataProvider.js +14 -0
- package/esm/core/src/__EntityValueProvider.d.ts +11 -0
- package/esm/core/src/__EntityValueProvider.js +1 -0
- package/esm/core/src/__RowsOfDataForTesting.d.ts +3 -0
- package/esm/core/src/__RowsOfDataForTesting.js +1 -0
- package/esm/core/src/backend-tests/backend-database-test-setup.backend-spec.d.ts +6 -0
- package/esm/core/src/backend-tests/backend-database-test-setup.backend-spec.js +147 -0
- package/{src → esm/core/src}/backend-tests/my-test.backend-spec.d.ts +1 -1
- package/esm/core/src/backend-tests/my-test.backend-spec.js +197 -0
- package/esm/core/src/backend-tests/test-http-server.backend-spec.d.ts +1 -0
- package/esm/core/src/backend-tests/test-http-server.backend-spec.js +167 -0
- package/esm/core/src/buildRestDataProvider.d.ts +31 -0
- package/esm/core/src/buildRestDataProvider.js +113 -0
- package/esm/core/src/column-interfaces.d.ts +154 -0
- package/esm/core/src/column-interfaces.js +7 -0
- package/esm/core/src/column.d.ts +58 -0
- package/esm/core/src/column.js +174 -0
- package/esm/core/src/context.d.ts +134 -0
- package/esm/core/src/context.js +286 -0
- package/esm/core/src/data-api.d.ts +39 -0
- package/esm/core/src/data-api.js +279 -0
- package/esm/core/src/data-interfaces.d.ts +41 -0
- package/esm/core/src/data-interfaces.js +12 -0
- package/esm/core/src/data-providers/array-entity-data-provider.d.ts +22 -0
- package/esm/core/src/data-providers/array-entity-data-provider.js +252 -0
- package/esm/core/src/data-providers/in-memory-database.d.ts +9 -0
- package/esm/core/src/data-providers/in-memory-database.js +14 -0
- package/esm/core/src/data-providers/json-data-provider.d.ts +12 -0
- package/esm/core/src/data-providers/json-data-provider.js +55 -0
- package/esm/core/src/data-providers/rest-data-provider.d.ts +49 -0
- package/esm/core/src/data-providers/rest-data-provider.js +256 -0
- package/esm/core/src/data-providers/sql-database.d.ts +33 -0
- package/esm/core/src/data-providers/sql-database.js +384 -0
- package/esm/core/src/data-providers/web-sql-data-provider.d.ts +24 -0
- package/esm/core/src/data-providers/web-sql-data-provider.js +143 -0
- package/esm/core/src/entity.d.ts +91 -0
- package/esm/core/src/entity.js +1 -0
- package/esm/core/src/filter/filter-consumer-bridge-to-sql-request.d.ts +50 -0
- package/esm/core/src/filter/filter-consumer-bridge-to-sql-request.js +150 -0
- package/esm/core/src/filter/filter-consumer-bridge-to-url-builder.d.ts +1 -0
- package/esm/core/src/filter/filter-consumer-bridge-to-url-builder.js +1 -0
- package/esm/core/src/filter/filter-interfaces.d.ts +85 -0
- package/esm/core/src/filter/filter-interfaces.js +477 -0
- package/esm/core/src/live-query/LiveQueryClient.d.ts +20 -0
- package/esm/core/src/live-query/LiveQueryClient.js +188 -0
- package/esm/core/src/live-query/SseSubscriptionClient.d.ts +5 -0
- package/esm/core/src/live-query/SseSubscriptionClient.js +86 -0
- package/esm/core/src/live-query/SubscriptionChannel.d.ts +72 -0
- package/esm/core/src/live-query/SubscriptionChannel.js +123 -0
- package/esm/core/src/live-query/SubscriptionServer.d.ts +53 -0
- package/esm/core/src/live-query/SubscriptionServer.js +111 -0
- package/esm/core/src/live-query/live-query-tests.spec.d.ts +6 -0
- package/esm/core/src/live-query/live-query-tests.spec.js +952 -0
- package/esm/core/src/remult-proxy.d.ts +35 -0
- package/esm/core/src/remult-proxy.js +113 -0
- package/esm/core/src/remult3/DecoratorReplacer.d.ts +10 -0
- package/esm/core/src/remult3/DecoratorReplacer.js +20 -0
- package/esm/core/src/remult3/RepositoryImplementation.d.ts +355 -0
- package/esm/core/src/remult3/RepositoryImplementation.js +2109 -0
- package/esm/core/src/remult3/index.d.ts +2 -0
- package/esm/core/src/remult3/index.js +2 -0
- package/esm/core/src/remult3/remult3.d.ts +395 -0
- package/esm/core/src/remult3/remult3.js +2 -0
- package/esm/core/src/server-action.d.ts +81 -0
- package/esm/core/src/server-action.js +394 -0
- package/esm/core/src/shared-tests/db-tests-setup.d.ts +32 -0
- package/esm/core/src/shared-tests/db-tests-setup.js +78 -0
- package/esm/core/src/shared-tests/db-tests.db-tests.d.ts +25 -0
- package/esm/core/src/shared-tests/db-tests.db-tests.js +810 -0
- package/esm/core/src/shared-tests/deleteAll.d.ts +2 -0
- package/esm/core/src/shared-tests/deleteAll.js +4 -0
- package/esm/core/src/shared-tests/entityWithValidations.d.ts +14 -0
- package/esm/core/src/shared-tests/entityWithValidations.js +43 -0
- package/esm/core/src/shared-tests/index.d.ts +4 -0
- package/esm/core/src/shared-tests/index.js +4 -0
- package/esm/core/src/shared-tests/test-custom-id-column.spec.d.ts +1 -0
- package/esm/core/src/shared-tests/test-custom-id-column.spec.js +67 -0
- package/esm/core/src/shared-tests/test-special-value.spec.d.ts +10 -0
- package/esm/core/src/shared-tests/test-special-value.spec.js +73 -0
- package/esm/core/src/shared-tests/test-update-with-null.spec.d.ts +1 -0
- package/esm/core/src/shared-tests/test-update-with-null.spec.js +31 -0
- package/esm/core/src/sort.d.ts +16 -0
- package/esm/core/src/sort.js +103 -0
- package/esm/core/src/sql-command.d.ts +19 -0
- package/esm/core/src/sql-command.js +1 -0
- package/esm/core/src/test.d.ts +3 -0
- package/esm/core/src/test.js +12 -0
- package/esm/core/src/tests/Done.d.ts +5 -0
- package/esm/core/src/tests/Done.js +9 -0
- package/esm/core/src/tests/RowProvider.spec.d.ts +16 -0
- package/esm/core/src/tests/RowProvider.spec.js +631 -0
- package/esm/core/src/tests/TestDataApiResponse.d.ts +10 -0
- package/esm/core/src/tests/TestDataApiResponse.js +22 -0
- package/esm/core/src/tests/basicRowFunctionality.spec.d.ts +8 -0
- package/esm/core/src/tests/basicRowFunctionality.spec.js +2103 -0
- package/esm/core/src/tests/c.d.ts +8 -0
- package/esm/core/src/tests/c.js +13 -0
- package/esm/core/src/tests/createData.d.ts +7 -0
- package/esm/core/src/tests/createData.js +22 -0
- package/esm/core/src/tests/d.d.ts +6 -0
- package/esm/core/src/tests/d.js +11 -0
- package/esm/core/src/tests/dWithPrefilter.d.ts +7 -0
- package/esm/core/src/tests/dWithPrefilter.js +18 -0
- package/esm/core/src/tests/entityForCustomFilter.d.ts +16 -0
- package/esm/core/src/tests/entityForCustomFilter.js +33 -0
- package/esm/core/src/tests/entityWithValidationsOnColumn.d.ts +5 -0
- package/esm/core/src/tests/entityWithValidationsOnColumn.js +13 -0
- package/esm/core/src/tests/frontend-database-tests-setup.spec.d.ts +4 -0
- package/esm/core/src/tests/frontend-database-tests-setup.spec.js +37 -0
- package/esm/core/src/tests/h.d.ts +6 -0
- package/esm/core/src/tests/h.js +24 -0
- package/esm/core/src/tests/remult-3-basic-tests.spec.d.ts +1 -0
- package/esm/core/src/tests/remult-3-basic-tests.spec.js +236 -0
- package/esm/core/src/tests/remult-3-entities.d.ts +23 -0
- package/esm/core/src/tests/remult-3-entities.js +39 -0
- package/esm/core/src/tests/tasks.d.ts +6 -0
- package/esm/core/src/tests/tasks.js +10 -0
- package/esm/core/src/tests/test-context-as-storage.spec.d.ts +0 -0
- package/esm/core/src/tests/test-context-as-storage.spec.js +1 -0
- package/esm/core/src/tests/test-data-api/predefined-filter.spec.d.ts +1 -0
- package/esm/core/src/tests/test-data-api/predefined-filter.spec.js +389 -0
- package/esm/core/src/tests/test-data-api/test-put-with-validation.spec.d.ts +5 -0
- package/esm/core/src/tests/test-data-api/test-put-with-validation.spec.js +152 -0
- package/esm/core/src/tests/test-decorator-precedence.spec.d.ts +1 -0
- package/esm/core/src/tests/test-decorator-precedence.spec.js +38 -0
- package/esm/core/src/tests/test-default-value.spec.d.ts +1 -0
- package/esm/core/src/tests/test-default-value.spec.js +33 -0
- package/esm/core/src/tests/test-entity-inheritance.spec.d.ts +14 -0
- package/esm/core/src/tests/test-entity-inheritance.spec.js +82 -0
- package/esm/core/src/tests/test-exceptions.spec.d.ts +1 -0
- package/esm/core/src/tests/test-exceptions.spec.js +375 -0
- package/esm/core/src/tests/test-json.spec.d.ts +1 -0
- package/esm/core/src/tests/test-json.spec.js +115 -0
- package/esm/core/src/tests/test-many-to-one-relation-in-entity.spec.d.ts +9 -0
- package/esm/core/src/tests/test-many-to-one-relation-in-entity.spec.js +809 -0
- package/esm/core/src/tests/test-non-active-record.spec.d.ts +1 -0
- package/esm/core/src/tests/test-non-active-record.spec.js +66 -0
- package/esm/core/src/tests/test-object-column.spec.d.ts +1 -0
- package/esm/core/src/tests/test-object-column.spec.js +189 -0
- package/esm/core/src/tests/test-paged-foreach.spec.d.ts +1 -0
- package/esm/core/src/tests/test-paged-foreach.spec.js +328 -0
- package/esm/core/src/tests/test-remult-angular.spec.d.ts +1 -0
- package/esm/core/src/tests/test-remult-angular.spec.js +23 -0
- package/esm/core/src/tests/test-server-controller.spec.d.ts +7 -0
- package/esm/core/src/tests/test-server-controller.spec.js +489 -0
- package/esm/core/src/tests/test-server-expressions.spec.d.ts +1 -0
- package/esm/core/src/tests/test-server-expressions.spec.js +178 -0
- package/esm/core/src/tests/test-server-method-on-entity.spec.d.ts +1 -0
- package/esm/core/src/tests/test-server-method-on-entity.spec.js +306 -0
- package/esm/core/src/tests/test-sql-expression.spec.d.ts +5 -0
- package/esm/core/src/tests/test-sql-expression.spec.js +205 -0
- package/esm/core/src/tests/test-sql.spec.d.ts +1 -0
- package/esm/core/src/tests/test-sql.spec.js +170 -0
- package/esm/core/src/tests/test-subscribe.spec.d.ts +1 -0
- package/esm/core/src/tests/test-subscribe.spec.js +135 -0
- package/esm/core/src/tests/test-type-recovery.spec.d.ts +1 -0
- package/esm/core/src/tests/test-type-recovery.spec.js +49 -0
- package/esm/core/src/tests/test-where-api.spec.d.ts +1 -0
- package/esm/core/src/tests/test-where-api.spec.js +434 -0
- package/esm/core/src/tests/testHelper.spec.d.ts +36 -0
- package/esm/core/src/tests/testHelper.spec.js +226 -0
- package/esm/core/src/tests/testModel/models.d.ts +16 -0
- package/esm/core/src/tests/testModel/models.js +25 -0
- package/esm/core/src/validators.d.ts +14 -0
- package/esm/core/src/validators.js +33 -0
- package/{valueConverters.d.ts → esm/core/src/valueConverters.d.ts} +13 -12
- package/esm/core/src/valueConverters.js +197 -0
- package/esm/core/urlBuilder.d.ts +6 -0
- package/esm/core/urlBuilder.js +20 -0
- package/esm/graphql.js +27 -27
- package/esm/postgres/schema-builder.js +4 -4
- package/esm/src/remult3/RepositoryImplementation.d.ts +1 -1
- package/esm/src/remult3/RepositoryImplementation.js +27 -4
- package/esm/src/shared-tests/db-tests.db-tests.js +57 -0
- package/esm/test-servers/shared/Task.d.ts +9 -0
- package/esm/test-servers/shared/Task.js +32 -0
- package/esm/test.d.ts +5 -0
- package/esm/test.js +6 -0
- package/package.json +1 -1
- package/src/remult3/RepositoryImplementation.d.ts +1 -1
- package/src/remult3/RepositoryImplementation.js +88 -63
- package/src/shared-tests/db-tests.db-tests.js +97 -0
- package/esm/src/id-entity.d.ts +0 -4
- package/esm/src/id-entity.js +0 -8
- package/postgres/postgresColumnSyntax.d.ts +0 -2
- package/postgres/postgresColumnSyntax.js +0 -34
- package/remult-middleware.d.ts +0 -2
- package/remult-middleware.js +0 -70
- package/server/register-actions-on-server.d.ts +0 -3
- package/server/register-actions-on-server.js +0 -50
- package/server/register-entities-on-server.d.ts +0 -3
- package/server/register-entities-on-server.js +0 -19
- package/src/backend-tests/my-test.backend-spec.js +0 -217
- package/src/backend-tests/test-http-server.backend-spec.d.ts +0 -6
- package/src/backend-tests/test-http-server.backend-spec.js +0 -342
- package/src/id-entity.d.ts +0 -4
- package/src/id-entity.js +0 -17
- package/valueConverters.js +0 -168
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { InMemoryDataProvider } from "../..";
|
|
2
|
+
import { Remult } from "../context";
|
|
3
|
+
import { Entity, EntityBase, Field, Fields } from "../remult3";
|
|
4
|
+
import { Validators } from "../validators";
|
|
5
|
+
describe("test subscribe", () => {
|
|
6
|
+
it("basics", async () => {
|
|
7
|
+
let repo = new Remult(new InMemoryDataProvider()).repo(myEntity);
|
|
8
|
+
for (const del of await repo.find()) {
|
|
9
|
+
await del.delete();
|
|
10
|
+
}
|
|
11
|
+
let state = {
|
|
12
|
+
title: '',
|
|
13
|
+
wasChanged: false,
|
|
14
|
+
isNew: false,
|
|
15
|
+
error: '',
|
|
16
|
+
titleError: ''
|
|
17
|
+
};
|
|
18
|
+
let i = repo.create();
|
|
19
|
+
let r = i._.subscribe(() => {
|
|
20
|
+
state.title = i.title;
|
|
21
|
+
state.wasChanged = i._.wasChanged();
|
|
22
|
+
state.isNew = i._.isNew();
|
|
23
|
+
state.error = i._.error;
|
|
24
|
+
state.titleError = i.$.title.error;
|
|
25
|
+
});
|
|
26
|
+
i.title = 'a';
|
|
27
|
+
expect(state.title).toBe('a');
|
|
28
|
+
i.title = 'ab';
|
|
29
|
+
expect(state.title).toBe("ab");
|
|
30
|
+
expect(state.wasChanged).toBe(true);
|
|
31
|
+
expect(state.isNew).toBe(true);
|
|
32
|
+
let x = i.save();
|
|
33
|
+
expect(i._.isLoading).toBe(true);
|
|
34
|
+
await x;
|
|
35
|
+
expect(i._.isLoading).toBe(false);
|
|
36
|
+
expect(state.title).toBe('ab');
|
|
37
|
+
expect(state.wasChanged).toBe(false);
|
|
38
|
+
expect(state.isNew).toBe(false);
|
|
39
|
+
i.$.title.error = 'error';
|
|
40
|
+
expect(state.titleError).toBe('error');
|
|
41
|
+
i._.error = "error";
|
|
42
|
+
expect(state.error).toBe('error');
|
|
43
|
+
});
|
|
44
|
+
it("observed", async () => {
|
|
45
|
+
let repo = new Remult(new InMemoryDataProvider()).repo(myEntity);
|
|
46
|
+
for (const del of await repo.find()) {
|
|
47
|
+
await del.delete();
|
|
48
|
+
}
|
|
49
|
+
let i = repo.create();
|
|
50
|
+
let observed = false;
|
|
51
|
+
i._.subscribe({
|
|
52
|
+
reportChanged: () => { },
|
|
53
|
+
reportObserved: () => observed = true
|
|
54
|
+
});
|
|
55
|
+
function testObserved(what) {
|
|
56
|
+
observed = false;
|
|
57
|
+
what();
|
|
58
|
+
expect(observed).toBe(true);
|
|
59
|
+
}
|
|
60
|
+
testObserved(() => { i.title.toString(); });
|
|
61
|
+
testObserved(() => { i.$.title.valueChanged(); });
|
|
62
|
+
testObserved(() => { i.isNew(); });
|
|
63
|
+
testObserved(() => { i._.wasChanged(); });
|
|
64
|
+
});
|
|
65
|
+
it("refInitWorks", async () => {
|
|
66
|
+
let repo = new Remult(new InMemoryDataProvider()).repo(myEntity);
|
|
67
|
+
for (const del of await repo.find()) {
|
|
68
|
+
await del.delete();
|
|
69
|
+
}
|
|
70
|
+
entityRefInitCount = 0;
|
|
71
|
+
let remultInitCount = 0;
|
|
72
|
+
Remult.entityRefInit = () => remultInitCount++;
|
|
73
|
+
let i = repo.create({ title: "a" });
|
|
74
|
+
expect(entityRefInitCount).toBe(1);
|
|
75
|
+
expect(remultInitCount).toBe(1);
|
|
76
|
+
await i.save();
|
|
77
|
+
expect(entityRefInitCount).toBe(1);
|
|
78
|
+
expect(remultInitCount).toBe(1);
|
|
79
|
+
Remult.entityRefInit = undefined;
|
|
80
|
+
});
|
|
81
|
+
it("test subscribe with many to one", async () => {
|
|
82
|
+
const remult = new Remult(new InMemoryDataProvider());
|
|
83
|
+
const repo = remult.repo(entityWithManyToOne);
|
|
84
|
+
for (const del of await repo.find()) {
|
|
85
|
+
await del.delete();
|
|
86
|
+
}
|
|
87
|
+
let refRowA = await remult.repo(myEntity).create({ title: 'a' }).save();
|
|
88
|
+
let refRowB = await remult.repo(myEntity).create({ title: 'b' }).save();
|
|
89
|
+
let reflect = { title: '' };
|
|
90
|
+
let r = repo.create();
|
|
91
|
+
let sub = r._.subscribe(() => reflect.title = r.entity?.title);
|
|
92
|
+
r.entity = refRowA;
|
|
93
|
+
expect(reflect.title).toBe('a');
|
|
94
|
+
sub();
|
|
95
|
+
r.entity = refRowB;
|
|
96
|
+
expect(reflect.title).toBe('a');
|
|
97
|
+
});
|
|
98
|
+
it("test subscribe to field with many to one", async () => {
|
|
99
|
+
const remult = new Remult(new InMemoryDataProvider());
|
|
100
|
+
const repo = remult.repo(entityWithManyToOne);
|
|
101
|
+
for (const del of await repo.find()) {
|
|
102
|
+
await del.delete();
|
|
103
|
+
}
|
|
104
|
+
let refRowA = await remult.repo(myEntity).create({ title: 'a' }).save();
|
|
105
|
+
let refRowB = await remult.repo(myEntity).create({ title: 'b' }).save();
|
|
106
|
+
let reflect = { title: '' };
|
|
107
|
+
let r = repo.create();
|
|
108
|
+
let sub = r.$.entity.subscribe(() => reflect.title = r.entity?.title);
|
|
109
|
+
r.entity = refRowA;
|
|
110
|
+
expect(reflect.title).toBe('a');
|
|
111
|
+
sub();
|
|
112
|
+
r.entity = refRowB;
|
|
113
|
+
expect(reflect.title).toBe('a');
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
let entityRefInitCount = 0;
|
|
117
|
+
@Entity("theEntity", {
|
|
118
|
+
allowApiCrud: true,
|
|
119
|
+
entityRefInit: () => entityRefInitCount++
|
|
120
|
+
})
|
|
121
|
+
class myEntity extends EntityBase {
|
|
122
|
+
@Fields.string({
|
|
123
|
+
validate: Validators.required
|
|
124
|
+
})
|
|
125
|
+
title = '';
|
|
126
|
+
}
|
|
127
|
+
@Entity("entityWithManyToOne", {
|
|
128
|
+
allowApiCrud: true
|
|
129
|
+
})
|
|
130
|
+
class entityWithManyToOne extends EntityBase {
|
|
131
|
+
@Fields.number()
|
|
132
|
+
id = 0;
|
|
133
|
+
@Field(() => myEntity)
|
|
134
|
+
entity;
|
|
135
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { Remult } from "../context";
|
|
2
|
+
import { InMemoryDataProvider } from "../data-providers/in-memory-database";
|
|
3
|
+
import { Entity, Fields } from "../remult3";
|
|
4
|
+
import { describeClass } from "../remult3/DecoratorReplacer";
|
|
5
|
+
describe("type recovery", () => {
|
|
6
|
+
const entity = class {
|
|
7
|
+
id = 0;
|
|
8
|
+
date = new Date();
|
|
9
|
+
};
|
|
10
|
+
describeClass(entity, Entity("x"), {
|
|
11
|
+
id: Fields.number(),
|
|
12
|
+
date: Fields.dateOnly({
|
|
13
|
+
validate: (_, ref) => ref.value.getFullYear() < 1980
|
|
14
|
+
})
|
|
15
|
+
});
|
|
16
|
+
let mem = new InMemoryDataProvider();
|
|
17
|
+
const repo = new Remult(mem).repo(entity);
|
|
18
|
+
beforeEach(async () => {
|
|
19
|
+
for (const item of await repo.find()) {
|
|
20
|
+
await repo.delete(item);
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
it("test insert works with Date", async () => {
|
|
24
|
+
let r = await repo.insert({ id: 0, date: '1976-06-16' });
|
|
25
|
+
expect(r.date.getFullYear()).toBe(1976);
|
|
26
|
+
});
|
|
27
|
+
it("test validate with Date", async () => {
|
|
28
|
+
let r = await repo.validate({ id: 0, date: '1976-06-16' });
|
|
29
|
+
expect(r).toBeUndefined();
|
|
30
|
+
});
|
|
31
|
+
it("test create", async () => {
|
|
32
|
+
let r = repo.create({ id: 0, date: '1976-06-16' });
|
|
33
|
+
expect(r.date.getFullYear()).toBe(1976);
|
|
34
|
+
});
|
|
35
|
+
it("test save works with Date", async () => {
|
|
36
|
+
let r = await repo.save({ date: '1976-06-16' });
|
|
37
|
+
expect(r.date.getFullYear()).toBe(1976);
|
|
38
|
+
});
|
|
39
|
+
it("test update using save", async () => {
|
|
40
|
+
await repo.insert({ id: 1, date: '1975-06-16' });
|
|
41
|
+
let r = await repo.save({ id: 1, date: '1976-06-16' });
|
|
42
|
+
expect(r.date.getFullYear()).toBe(1976);
|
|
43
|
+
});
|
|
44
|
+
it("test update ", async () => {
|
|
45
|
+
await repo.insert({ id: 1, date: '1975-06-16' });
|
|
46
|
+
let r = await repo.update(1, { date: '1976-06-16' });
|
|
47
|
+
expect(r.date.getFullYear()).toBe(1976);
|
|
48
|
+
});
|
|
49
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,434 @@
|
|
|
1
|
+
import { testRestDb } from './testHelper.spec';
|
|
2
|
+
import { TestDataApiResponse } from "./TestDataApiResponse";
|
|
3
|
+
import { Done } from "./Done";
|
|
4
|
+
import { WebSqlDataProvider } from '../data-providers/web-sql-data-provider';
|
|
5
|
+
import { Remult } from '../context';
|
|
6
|
+
import { SqlDatabase } from '../data-providers/sql-database';
|
|
7
|
+
import { Categories } from './remult-3-entities';
|
|
8
|
+
import { insertFourRows } from './RowProvider.spec';
|
|
9
|
+
import { Entity, EntityBase, Fields } from '../remult3';
|
|
10
|
+
import { InMemoryDataProvider } from '../data-providers/in-memory-database';
|
|
11
|
+
import { customUrlToken, Filter } from '../filter/filter-interfaces';
|
|
12
|
+
import { RestDataProvider } from '../data-providers/rest-data-provider';
|
|
13
|
+
import { DataApi } from '../data-api';
|
|
14
|
+
import { ArrayEntityDataProvider } from '../data-providers/array-entity-data-provider';
|
|
15
|
+
import { dbNamesOf } from '../filter/filter-consumer-bridge-to-sql-request';
|
|
16
|
+
import { entityForrawFilter } from './entityForCustomFilter';
|
|
17
|
+
import { describeClass } from '../remult3/DecoratorReplacer';
|
|
18
|
+
describe("test where stuff", () => {
|
|
19
|
+
let repo;
|
|
20
|
+
beforeAll(async (done) => {
|
|
21
|
+
[repo] = await insertFourRows();
|
|
22
|
+
done();
|
|
23
|
+
});
|
|
24
|
+
it("test in statement", async () => {
|
|
25
|
+
expect(await repo.count({ id: [undefined] })).toBe(0);
|
|
26
|
+
expect(await repo.count({ id: [1, undefined, 3] })).toBe(2);
|
|
27
|
+
});
|
|
28
|
+
it("test and", async () => {
|
|
29
|
+
expect(await repo.count({ categoryName: 'yoni' })).toBe(1);
|
|
30
|
+
expect(await repo.count({ categoryName: { $gte: 'yoni' } })).toBe(1);
|
|
31
|
+
expect(await repo.count({ id: 1 })).toBe(1);
|
|
32
|
+
expect(await repo.count({ id: 1, categoryName: 'yoni' })).toBe(0);
|
|
33
|
+
expect(await repo.count({ id: 1, $and: [{ categoryName: 'yoni' }] })).toBe(0);
|
|
34
|
+
expect(await repo.count({ $and: [{ id: 1 }, { categoryName: 'yoni' }] })).toBe(0);
|
|
35
|
+
});
|
|
36
|
+
it("test two values", async () => {
|
|
37
|
+
expect(await repo.count({ $and: [{ id: 1 }, { id: 2 }] })).toBe(0);
|
|
38
|
+
});
|
|
39
|
+
it("test two values", async () => {
|
|
40
|
+
const json = await Filter.fromEntityFilter(repo.metadata, { $and: [{ id: 1 }, { id: 2 }] }).toJson();
|
|
41
|
+
expect(await repo.count(Filter.entityFilterFromJson(repo.metadata, json))).toBe(0);
|
|
42
|
+
});
|
|
43
|
+
it("test in and", async () => {
|
|
44
|
+
const json = await Filter.fromEntityFilter(repo.metadata, { $and: [{ id: [1, 2] }, { id: [2] }] }).toJson();
|
|
45
|
+
expect(await repo.count(Filter.entityFilterFromJson(repo.metadata, json))).toBe(1);
|
|
46
|
+
});
|
|
47
|
+
it("test basics", async () => {
|
|
48
|
+
let fo = {
|
|
49
|
+
where: { id: { ">=": 2 } }
|
|
50
|
+
};
|
|
51
|
+
expect(await repo.count({ id: { $lte: 3 }, $and: [fo.where] })).toBe(2);
|
|
52
|
+
expect(await repo.count({ id: { $lte: 3 }, $and: [fo.where] })).toBe(2);
|
|
53
|
+
expect(await repo.count({ $and: [fo.where], id: { $lte: 3 } })).toBe(2);
|
|
54
|
+
expect(await repo.count({ id: { $lte: 3 }, $and: [fo.where] })).toBe(2);
|
|
55
|
+
});
|
|
56
|
+
it("test basics_2", async () => {
|
|
57
|
+
let fo = {
|
|
58
|
+
where: { id: { $gte: 2 } }
|
|
59
|
+
};
|
|
60
|
+
expect(await repo.count({ id: { $lte: 3 }, $and: [fo.where, undefined] })).toBe(2);
|
|
61
|
+
});
|
|
62
|
+
it("test basics_2_2", async () => {
|
|
63
|
+
let fo = {
|
|
64
|
+
where: { id: { ">=": 2 } }
|
|
65
|
+
};
|
|
66
|
+
expect(await repo.count({ id: { $lte: 3 }, $and: [fo.where] })).toBe(2);
|
|
67
|
+
});
|
|
68
|
+
it("test basics_2_3", async () => {
|
|
69
|
+
let fo = {
|
|
70
|
+
where: { id: { ">=": 2 } }
|
|
71
|
+
};
|
|
72
|
+
expect(await repo.count({ id: { $lte: 3 }, $and: [fo.where] })).toBe(2);
|
|
73
|
+
});
|
|
74
|
+
it("test basics_2_1", async () => {
|
|
75
|
+
let fo = {
|
|
76
|
+
where: { id: { $gte: 2 } }
|
|
77
|
+
};
|
|
78
|
+
expect(await repo.count({ id: { $lte: 3 }, $and: [fo.where, undefined] })).toBe(2);
|
|
79
|
+
});
|
|
80
|
+
it("test basics_3", async () => {
|
|
81
|
+
let fo = {
|
|
82
|
+
where: { id: { ">=": 2 } }
|
|
83
|
+
};
|
|
84
|
+
expect(await repo.count({ id: { $lte: 3 }, $and: [fo.where] })).toBe(2);
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
describe("custom filter", () => {
|
|
88
|
+
it("test that it works", async () => {
|
|
89
|
+
let c = new Remult().repo(entityForrawFilter, new InMemoryDataProvider());
|
|
90
|
+
for (let id = 0; id < 5; id++) {
|
|
91
|
+
await c.create({ id }).save();
|
|
92
|
+
}
|
|
93
|
+
expect(await (c.count(entityForrawFilter.filter({ oneAndThree: true }))))
|
|
94
|
+
.toBe(2);
|
|
95
|
+
});
|
|
96
|
+
it("works with serialize filter", async () => {
|
|
97
|
+
let z = entityForrawFilter.oneAndThree();
|
|
98
|
+
let c = new Remult().repo(entityForrawFilter, new InMemoryDataProvider());
|
|
99
|
+
let json = (await Filter.fromEntityFilter(c.metadata, entityForrawFilter.oneAndThree())).toJson();
|
|
100
|
+
expect(json).toEqual({
|
|
101
|
+
$custom$oneAndThree: {}
|
|
102
|
+
});
|
|
103
|
+
let json3 = Filter.entityFilterToJson(c.metadata, Filter.entityFilterFromJson(c.metadata, json));
|
|
104
|
+
expect(json3).toEqual(json);
|
|
105
|
+
});
|
|
106
|
+
it("test that it works", () => testRestDb(async ({ remult }) => {
|
|
107
|
+
let c = remult.repo(entityForrawFilter);
|
|
108
|
+
for (let id = 0; id < 5; id++) {
|
|
109
|
+
await c.create({ id }).save();
|
|
110
|
+
}
|
|
111
|
+
expect(await (c.count(entityForrawFilter.oneAndThree()))).toBe(2);
|
|
112
|
+
expect((await (c.findFirst(entityForrawFilter.testNumericValue(2)))).id).toBe(2);
|
|
113
|
+
expect((await (c.findFirst(entityForrawFilter.testObjectValue({ val: 2 })))).id).toBe(2);
|
|
114
|
+
}));
|
|
115
|
+
;
|
|
116
|
+
it("test that it works with sql", async () => {
|
|
117
|
+
let w = new WebSqlDataProvider("testWithFilter");
|
|
118
|
+
let c = new Remult().repo(entityForrawFilter, new SqlDatabase(w));
|
|
119
|
+
await w.dropTable(c.metadata);
|
|
120
|
+
for (let id = 0; id < 5; id++) {
|
|
121
|
+
await c.create({ id }).save();
|
|
122
|
+
}
|
|
123
|
+
const e = await dbNamesOf(c.metadata);
|
|
124
|
+
expect(await (c.count(SqlDatabase.rawFilter(async (x) => x.sql = e.id + ' in (' + x.addParameterAndReturnSqlToken(1) + "," + x.addParameterAndReturnSqlToken(3, c.metadata.fields.id) + ")"))))
|
|
125
|
+
.toBe(2);
|
|
126
|
+
expect(await (c.count(entityForrawFilter.filter({ dbOneOrThree: true })))).toBe(2);
|
|
127
|
+
});
|
|
128
|
+
it("test that it works with arrayFilter", async () => {
|
|
129
|
+
let c = new Remult().repo(entityForrawFilter, new InMemoryDataProvider());
|
|
130
|
+
for (let id = 0; id < 5; id++) {
|
|
131
|
+
await c.create({ id }).save();
|
|
132
|
+
}
|
|
133
|
+
expect(await (c.count(ArrayEntityDataProvider.rawFilter(x => x.id == 1 || x.id == 3))))
|
|
134
|
+
.toBe(2);
|
|
135
|
+
expect(await (c.count(entityForrawFilter.filter({ dbOneOrThree: true })))).toBe(2);
|
|
136
|
+
});
|
|
137
|
+
it("test or and promise in translate", async () => {
|
|
138
|
+
let c = new Remult().repo(entityForrawFilter, new InMemoryDataProvider());
|
|
139
|
+
for (let id = 0; id < 5; id++) {
|
|
140
|
+
await c.create({ id }).save();
|
|
141
|
+
}
|
|
142
|
+
"".toString();
|
|
143
|
+
expect(await (c.count({
|
|
144
|
+
$or: [entityForrawFilter.filter({ dbOneOrThree: true }), { id: 4 }]
|
|
145
|
+
}))).toBe(3);
|
|
146
|
+
});
|
|
147
|
+
it("test sent in api", async () => {
|
|
148
|
+
let ok = new Done();
|
|
149
|
+
let z = new RestDataProvider(() => ({
|
|
150
|
+
httpClient: {
|
|
151
|
+
delete: () => undefined,
|
|
152
|
+
get: async (url) => {
|
|
153
|
+
ok.ok();
|
|
154
|
+
expect(url).toBe('/entityForrawFilter?%24custom%24filter=%7B%22oneAndThree%22%3Atrue%7D&__action=count');
|
|
155
|
+
return { count: 0 };
|
|
156
|
+
},
|
|
157
|
+
post: () => undefined,
|
|
158
|
+
put: () => undefined,
|
|
159
|
+
}, url: ''
|
|
160
|
+
}));
|
|
161
|
+
let c = new Remult();
|
|
162
|
+
c.dataProvider = (z);
|
|
163
|
+
await c.repo(entityForrawFilter).count(entityForrawFilter.filter({ oneAndThree: true }));
|
|
164
|
+
ok.test();
|
|
165
|
+
});
|
|
166
|
+
it("test order by on rest request", async () => {
|
|
167
|
+
let ok = new Done();
|
|
168
|
+
let c = new Remult(new RestDataProvider(() => ({
|
|
169
|
+
httpClient: {
|
|
170
|
+
delete: () => undefined,
|
|
171
|
+
get: async (url) => {
|
|
172
|
+
ok.ok();
|
|
173
|
+
expect(url).toBe('/Categories?_sort=categoryName%2Cid');
|
|
174
|
+
return [];
|
|
175
|
+
},
|
|
176
|
+
post: () => undefined,
|
|
177
|
+
put: () => undefined,
|
|
178
|
+
}, url: ''
|
|
179
|
+
})));
|
|
180
|
+
await c.repo(Categories).find({
|
|
181
|
+
orderBy: {
|
|
182
|
+
categoryName: "asc",
|
|
183
|
+
id: "asc"
|
|
184
|
+
}
|
|
185
|
+
});
|
|
186
|
+
ok.test();
|
|
187
|
+
});
|
|
188
|
+
it("test order by on rest request", async () => {
|
|
189
|
+
let ok = new Done();
|
|
190
|
+
let c = new Remult(new RestDataProvider(() => ({
|
|
191
|
+
httpClient: {
|
|
192
|
+
delete: () => undefined,
|
|
193
|
+
get: async (url) => {
|
|
194
|
+
ok.ok();
|
|
195
|
+
expect(url).toBe('/Categories?_sort=categoryName%2Cid&_order=asc%2Cdesc');
|
|
196
|
+
return [];
|
|
197
|
+
},
|
|
198
|
+
post: () => undefined,
|
|
199
|
+
put: () => undefined,
|
|
200
|
+
}, url: ''
|
|
201
|
+
})));
|
|
202
|
+
await c.repo(Categories).find({
|
|
203
|
+
orderBy: {
|
|
204
|
+
categoryName: "asc",
|
|
205
|
+
id: "desc"
|
|
206
|
+
}
|
|
207
|
+
});
|
|
208
|
+
ok.test();
|
|
209
|
+
});
|
|
210
|
+
it("test find id on api", async () => {
|
|
211
|
+
let myEntity = class {
|
|
212
|
+
id = 0;
|
|
213
|
+
title = '';
|
|
214
|
+
};
|
|
215
|
+
describeClass(myEntity, Entity("test", {
|
|
216
|
+
defaultOrderBy: {
|
|
217
|
+
title: "asc"
|
|
218
|
+
}
|
|
219
|
+
}), {
|
|
220
|
+
id: Fields.integer(),
|
|
221
|
+
title: Fields.string()
|
|
222
|
+
});
|
|
223
|
+
let ok = new Done();
|
|
224
|
+
let z = new RestDataProvider(() => ({
|
|
225
|
+
httpClient: {
|
|
226
|
+
delete: () => undefined,
|
|
227
|
+
get: async (url) => {
|
|
228
|
+
ok.ok();
|
|
229
|
+
expect(url).toBe('/test?id=8');
|
|
230
|
+
return [];
|
|
231
|
+
},
|
|
232
|
+
post: () => undefined,
|
|
233
|
+
put: () => undefined,
|
|
234
|
+
}, url: ''
|
|
235
|
+
}));
|
|
236
|
+
let c = new Remult();
|
|
237
|
+
c.dataProvider = (z);
|
|
238
|
+
await c.repo(myEntity).findId(8);
|
|
239
|
+
ok.test();
|
|
240
|
+
});
|
|
241
|
+
it("test that api reads custom correctly", async () => {
|
|
242
|
+
let remult = new Remult();
|
|
243
|
+
remult.dataProvider = (new InMemoryDataProvider());
|
|
244
|
+
let c = remult.repo(entityForrawFilter);
|
|
245
|
+
for (let id = 0; id < 5; id++) {
|
|
246
|
+
await c.create({ id }).save();
|
|
247
|
+
}
|
|
248
|
+
var api = new DataApi(c, remult);
|
|
249
|
+
let t = new TestDataApiResponse();
|
|
250
|
+
let d = new Done();
|
|
251
|
+
t.success = data => {
|
|
252
|
+
expect(data.count).toBe(2);
|
|
253
|
+
d.ok();
|
|
254
|
+
};
|
|
255
|
+
await api.count(t, {
|
|
256
|
+
get: x => {
|
|
257
|
+
if (x == customUrlToken + "filter")
|
|
258
|
+
return "{\"oneAndThree\":true}";
|
|
259
|
+
return undefined;
|
|
260
|
+
}
|
|
261
|
+
});
|
|
262
|
+
d.test();
|
|
263
|
+
});
|
|
264
|
+
it("test that api reads custom correctly 2", async () => {
|
|
265
|
+
let remult = new Remult();
|
|
266
|
+
remult.dataProvider = (new InMemoryDataProvider());
|
|
267
|
+
let c = remult.repo(entityForrawFilter);
|
|
268
|
+
for (let id = 0; id < 5; id++) {
|
|
269
|
+
await c.create({ id }).save();
|
|
270
|
+
}
|
|
271
|
+
var api = new DataApi(c, remult);
|
|
272
|
+
let t = new TestDataApiResponse();
|
|
273
|
+
let d = new Done();
|
|
274
|
+
t.success = data => {
|
|
275
|
+
expect(data.count).toBe(2);
|
|
276
|
+
d.ok();
|
|
277
|
+
};
|
|
278
|
+
await api.count(t, {
|
|
279
|
+
get: x => {
|
|
280
|
+
if (x == customUrlToken)
|
|
281
|
+
return;
|
|
282
|
+
return undefined;
|
|
283
|
+
}
|
|
284
|
+
}, {
|
|
285
|
+
"$custom$filter": {
|
|
286
|
+
"oneAndThree": true
|
|
287
|
+
}
|
|
288
|
+
});
|
|
289
|
+
d.test();
|
|
290
|
+
});
|
|
291
|
+
it("test that api reads custom correctly 3", async () => {
|
|
292
|
+
let remult = new Remult();
|
|
293
|
+
remult.dataProvider = (new InMemoryDataProvider());
|
|
294
|
+
let c = remult.repo(entityForrawFilter);
|
|
295
|
+
for (let id = 0; id < 5; id++) {
|
|
296
|
+
await c.create({ id }).save();
|
|
297
|
+
}
|
|
298
|
+
var api = new DataApi(c, remult);
|
|
299
|
+
let t = new TestDataApiResponse();
|
|
300
|
+
let d = new Done();
|
|
301
|
+
t.success = data => {
|
|
302
|
+
expect(data.count).toBe(2);
|
|
303
|
+
d.ok();
|
|
304
|
+
};
|
|
305
|
+
await api.count(t, {
|
|
306
|
+
get: x => {
|
|
307
|
+
if (x == customUrlToken)
|
|
308
|
+
return;
|
|
309
|
+
return undefined;
|
|
310
|
+
}
|
|
311
|
+
}, {
|
|
312
|
+
"$custom$filter": {
|
|
313
|
+
"oneAndThree": true
|
|
314
|
+
}
|
|
315
|
+
});
|
|
316
|
+
d.test();
|
|
317
|
+
});
|
|
318
|
+
it("test that api reads custom correctly and translates to db", async () => {
|
|
319
|
+
let remult = new Remult();
|
|
320
|
+
remult.dataProvider = (new InMemoryDataProvider());
|
|
321
|
+
let c = remult.repo(entityForrawFilter);
|
|
322
|
+
for (let id = 0; id < 5; id++) {
|
|
323
|
+
await c.create({ id }).save();
|
|
324
|
+
}
|
|
325
|
+
var api = new DataApi(c, remult);
|
|
326
|
+
let t = new TestDataApiResponse();
|
|
327
|
+
let d = new Done();
|
|
328
|
+
t.success = data => {
|
|
329
|
+
expect(data.count).toBe(2);
|
|
330
|
+
d.ok();
|
|
331
|
+
};
|
|
332
|
+
await api.count(t, {
|
|
333
|
+
get: x => {
|
|
334
|
+
if (x == customUrlToken + "filter")
|
|
335
|
+
return "{\"dbOneOrThree\":true}";
|
|
336
|
+
return undefined;
|
|
337
|
+
}
|
|
338
|
+
});
|
|
339
|
+
d.test();
|
|
340
|
+
});
|
|
341
|
+
});
|
|
342
|
+
function x(what) {
|
|
343
|
+
}
|
|
344
|
+
//reproduce typescript bug with recursive types
|
|
345
|
+
x({});
|
|
346
|
+
@Entity('tasks')
|
|
347
|
+
class task extends EntityBase {
|
|
348
|
+
@Fields.string()
|
|
349
|
+
title = '';
|
|
350
|
+
@Fields.boolean()
|
|
351
|
+
completed = false;
|
|
352
|
+
}
|
|
353
|
+
@Entity('taskWithNull')
|
|
354
|
+
class taskWithNull extends EntityBase {
|
|
355
|
+
@Fields.string()
|
|
356
|
+
title = '';
|
|
357
|
+
@Fields.boolean({ allowNull: true })
|
|
358
|
+
completed;
|
|
359
|
+
}
|
|
360
|
+
describe("missing fields are added in array column", async () => {
|
|
361
|
+
it("not allow null", async () => {
|
|
362
|
+
let db = new InMemoryDataProvider();
|
|
363
|
+
db.rows['tasks'] = [{
|
|
364
|
+
title: 't1'
|
|
365
|
+
},
|
|
366
|
+
{
|
|
367
|
+
title: 't2',
|
|
368
|
+
completed: true
|
|
369
|
+
},
|
|
370
|
+
{
|
|
371
|
+
title: 't3'
|
|
372
|
+
}];
|
|
373
|
+
let r = new Remult();
|
|
374
|
+
r.dataProvider = (db);
|
|
375
|
+
let rep = r.repo(task);
|
|
376
|
+
expect((await rep.find({ orderBy: { completed: "asc", title: 'asc' } })).map(x => x.title)).toEqual(["t1", "t3", "t2"]);
|
|
377
|
+
expect(await rep.count({ completed: false })).toBe(2);
|
|
378
|
+
let t = (await rep.findFirst({ title: 't1' }));
|
|
379
|
+
expect(t.completed).toBe(false);
|
|
380
|
+
t.completed = undefined;
|
|
381
|
+
await t.save();
|
|
382
|
+
expect(t.completed).toBe(false);
|
|
383
|
+
t.completed = null;
|
|
384
|
+
await t.save();
|
|
385
|
+
expect(t.completed).toBe(false);
|
|
386
|
+
t = rep.create({ title: '4' });
|
|
387
|
+
await t.save();
|
|
388
|
+
expect(t.completed).toBe(false);
|
|
389
|
+
});
|
|
390
|
+
it("allow null", async () => {
|
|
391
|
+
let db = new InMemoryDataProvider();
|
|
392
|
+
db.rows['taskWithNull'] = [{
|
|
393
|
+
title: 't1'
|
|
394
|
+
},
|
|
395
|
+
{
|
|
396
|
+
title: 't2',
|
|
397
|
+
completed: true
|
|
398
|
+
},
|
|
399
|
+
{
|
|
400
|
+
title: 't3'
|
|
401
|
+
}];
|
|
402
|
+
let r = new Remult();
|
|
403
|
+
r.dataProvider = (db);
|
|
404
|
+
let rep = r.repo(taskWithNull);
|
|
405
|
+
expect((await rep.find({ orderBy: { completed: "asc", title: "asc" } })).map(x => x.title)).toEqual(["t1", "t3", "t2"]);
|
|
406
|
+
expect(await rep.count({ completed: false })).toBe(0);
|
|
407
|
+
let t = (await rep.findFirst({ title: 't1' }));
|
|
408
|
+
expect(t.completed).toBe(null);
|
|
409
|
+
t.completed = undefined;
|
|
410
|
+
await t.save();
|
|
411
|
+
expect(t.completed).toBe(null);
|
|
412
|
+
t.completed = null;
|
|
413
|
+
await t.save();
|
|
414
|
+
expect(t.completed).toBe(null);
|
|
415
|
+
t = rep.create({ title: '4' });
|
|
416
|
+
await t.save();
|
|
417
|
+
expect(t.completed).toBe(null);
|
|
418
|
+
});
|
|
419
|
+
it("test api with and", () => {
|
|
420
|
+
let x = {
|
|
421
|
+
title: "abc",
|
|
422
|
+
$and: []
|
|
423
|
+
};
|
|
424
|
+
x.$and.push({});
|
|
425
|
+
let y = { $and: [x, x] };
|
|
426
|
+
});
|
|
427
|
+
it("test api with and", () => {
|
|
428
|
+
let x = {
|
|
429
|
+
$and: []
|
|
430
|
+
};
|
|
431
|
+
x.$and.push({});
|
|
432
|
+
let z = x;
|
|
433
|
+
});
|
|
434
|
+
});
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import './frontend-database-tests-setup.spec';
|
|
2
|
+
import { Remult } from "../context";
|
|
3
|
+
import { DataApi } from "../data-api";
|
|
4
|
+
import { DataProvider, EntityDataProvider } from "../data-interfaces";
|
|
5
|
+
import { InMemoryDataProvider } from "../data-providers/in-memory-database";
|
|
6
|
+
import { EntityMetadata } from "../remult3";
|
|
7
|
+
export declare function itForEach<T>(name: string, arrayOfT: T[], runAsync: (item: T) => Promise<any>): void;
|
|
8
|
+
export declare function fitForEach<T>(name: string, arrayOfT: T[], runAsync: (item: T) => Promise<any>): void;
|
|
9
|
+
export declare function testAsIfOnBackend(what: () => Promise<any>): Promise<void>;
|
|
10
|
+
export declare const ActionTestConfig: {
|
|
11
|
+
db: InMemoryDataProvider;
|
|
12
|
+
};
|
|
13
|
+
export declare function testSql(runAsync: (db: {
|
|
14
|
+
db: DataProvider;
|
|
15
|
+
remult: Remult;
|
|
16
|
+
}) => Promise<void>): Promise<void>;
|
|
17
|
+
export declare function testInMemoryDb(runAsync: (db: {
|
|
18
|
+
db: DataProvider;
|
|
19
|
+
remult: Remult;
|
|
20
|
+
}) => Promise<void>): Promise<void>;
|
|
21
|
+
export declare function testRestDb(runAsync: (db: {
|
|
22
|
+
db: DataProvider;
|
|
23
|
+
remult: Remult;
|
|
24
|
+
}) => Promise<void>): Promise<void>;
|
|
25
|
+
export declare function testAllDataProviders(runAsync: (db: {
|
|
26
|
+
db: DataProvider;
|
|
27
|
+
remult: Remult;
|
|
28
|
+
}) => Promise<void>): Promise<void>;
|
|
29
|
+
export declare class MockRestDataProvider implements DataProvider {
|
|
30
|
+
private remult;
|
|
31
|
+
constructor(remult: Remult);
|
|
32
|
+
getEntityDataProvider(metadata: EntityMetadata<any>): EntityDataProvider;
|
|
33
|
+
transaction(action: (dataProvider: DataProvider) => Promise<void>): Promise<void>;
|
|
34
|
+
isProxy: boolean;
|
|
35
|
+
}
|
|
36
|
+
export declare function createMockHttpDataProvider(dataApi: DataApi<any>): import("../data-interfaces").RestDataProviderHttpProvider;
|