emberflow 1.0.8
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/LICENSE +21 -0
- package/README.md +40 -0
- package/lib/db-structure.d.ts +7 -0
- package/lib/db-structure.js +67 -0
- package/lib/db-structure.js.map +1 -0
- package/lib/index-utils.d.ts +20 -0
- package/lib/index-utils.js +324 -0
- package/lib/index-utils.js.map +1 -0
- package/lib/index.d.ts +23 -0
- package/lib/index.js +197 -0
- package/lib/index.js.map +1 -0
- package/lib/init-db-structure.d.ts +17 -0
- package/lib/init-db-structure.js +111 -0
- package/lib/init-db-structure.js.map +1 -0
- package/lib/logics/index.d.ts +2 -0
- package/lib/logics/index.js +77 -0
- package/lib/logics/index.js.map +1 -0
- package/lib/logics/view-logics.d.ts +3 -0
- package/lib/logics/view-logics.js +167 -0
- package/lib/logics/view-logics.js.map +1 -0
- package/lib/sample-custom/business-logics.d.ts +3 -0
- package/lib/sample-custom/business-logics.js +67 -0
- package/lib/sample-custom/business-logics.js.map +1 -0
- package/lib/sample-custom/db-structure.d.ts +29 -0
- package/lib/sample-custom/db-structure.js +36 -0
- package/lib/sample-custom/db-structure.js.map +1 -0
- package/lib/sample-custom/security.d.ts +2 -0
- package/lib/sample-custom/security.js +63 -0
- package/lib/sample-custom/security.js.map +1 -0
- package/lib/sample-custom/validators.d.ts +9 -0
- package/lib/sample-custom/validators.js +42 -0
- package/lib/sample-custom/validators.js.map +1 -0
- package/lib/tests/index-utils.test.d.ts +1 -0
- package/lib/tests/index-utils.test.js +600 -0
- package/lib/tests/index-utils.test.js.map +1 -0
- package/lib/tests/index.test.d.ts +1 -0
- package/lib/tests/index.test.js +496 -0
- package/lib/tests/index.test.js.map +1 -0
- package/lib/tests/init-db-structure.test.d.ts +1 -0
- package/lib/tests/init-db-structure.test.js +114 -0
- package/lib/tests/init-db-structure.test.js.map +1 -0
- package/lib/tests/logics/index.test.d.ts +1 -0
- package/lib/tests/logics/index.test.js +127 -0
- package/lib/tests/logics/index.test.js.map +1 -0
- package/lib/tests/logics/view-logics.test.d.ts +1 -0
- package/lib/tests/logics/view-logics.test.js +211 -0
- package/lib/tests/logics/view-logics.test.js.map +1 -0
- package/lib/tests/utils/misc.test.d.ts +1 -0
- package/lib/tests/utils/misc.test.js +31 -0
- package/lib/tests/utils/misc.test.js.map +1 -0
- package/lib/tests/utils/paths.test.d.ts +1 -0
- package/lib/tests/utils/paths.test.js +258 -0
- package/lib/tests/utils/paths.test.js.map +1 -0
- package/lib/tests/utils/query.test.d.ts +1 -0
- package/lib/tests/utils/query.test.js +72 -0
- package/lib/tests/utils/query.test.js.map +1 -0
- package/lib/tests/utils/sample.test.d.ts +1 -0
- package/lib/tests/utils/sample.test.js +52 -0
- package/lib/tests/utils/sample.test.js.map +1 -0
- package/lib/types.d.ts +78 -0
- package/lib/types.js +3 -0
- package/lib/types.js.map +1 -0
- package/lib/utils/db-structure.d.ts +2 -0
- package/lib/utils/db-structure.js +9 -0
- package/lib/utils/db-structure.js.map +1 -0
- package/lib/utils/misc.d.ts +1 -0
- package/lib/utils/misc.js +53 -0
- package/lib/utils/misc.js.map +1 -0
- package/lib/utils/paths.d.ts +16 -0
- package/lib/utils/paths.js +136 -0
- package/lib/utils/paths.js.map +1 -0
- package/lib/utils/query.d.ts +2 -0
- package/lib/utils/query.js +41 -0
- package/lib/utils/query.js.map +1 -0
- package/lib/utils/sample.d.ts +5 -0
- package/lib/utils/sample.js +37 -0
- package/lib/utils/sample.js.map +1 -0
- package/lib/utils.d.ts +12 -0
- package/lib/utils.js +67 -0
- package/lib/utils.js.map +1 -0
- package/package.json +37 -0
- package/src/sample-custom/business-logics.ts +51 -0
- package/src/sample-custom/db-structure.ts +33 -0
- package/src/sample-custom/security.ts +77 -0
- package/src/sample-custom/validators.ts +46 -0
|
@@ -0,0 +1,496 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
const index_1 = require("../index");
|
|
27
|
+
const indexutils = __importStar(require("../index-utils"));
|
|
28
|
+
const admin = __importStar(require("firebase-admin"));
|
|
29
|
+
const firebase_admin_1 = require("firebase-admin");
|
|
30
|
+
var Timestamp = firebase_admin_1.firestore.Timestamp;
|
|
31
|
+
const db_structure_1 = require("../sample-custom/db-structure");
|
|
32
|
+
admin.initializeApp();
|
|
33
|
+
(0, index_1.initializeEmberFlow)(admin, db_structure_1.dbStructure, db_structure_1.Entity, {}, {}, []);
|
|
34
|
+
function createDocumentSnapshot(data, refPath, exists = true) {
|
|
35
|
+
return {
|
|
36
|
+
exists,
|
|
37
|
+
id: "test-id",
|
|
38
|
+
ref: {
|
|
39
|
+
id: "test-id",
|
|
40
|
+
path: refPath,
|
|
41
|
+
set: jest.fn(),
|
|
42
|
+
update: jest.fn(),
|
|
43
|
+
delete: jest.fn(),
|
|
44
|
+
get: jest.fn(),
|
|
45
|
+
},
|
|
46
|
+
data: () => data,
|
|
47
|
+
get: jest.fn(),
|
|
48
|
+
isEqual: jest.fn(),
|
|
49
|
+
create_time: index_1._mockable.createNowTimestamp(),
|
|
50
|
+
update_time: index_1._mockable.createNowTimestamp(),
|
|
51
|
+
readTime: index_1._mockable.createNowTimestamp(),
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
function createChange(beforeData, afterData, refPath) {
|
|
55
|
+
return {
|
|
56
|
+
before: createDocumentSnapshot(beforeData, refPath),
|
|
57
|
+
after: createDocumentSnapshot(afterData, refPath),
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
describe("onDocChange", () => {
|
|
61
|
+
const entity = "user";
|
|
62
|
+
const refPath = "/example/test-id";
|
|
63
|
+
const contextWithoutAuth = {
|
|
64
|
+
auth: undefined,
|
|
65
|
+
authType: "ADMIN",
|
|
66
|
+
eventId: "test-event-id",
|
|
67
|
+
eventType: "test-event-type",
|
|
68
|
+
params: {},
|
|
69
|
+
resource: {
|
|
70
|
+
name: "projects/test-project/databases/(default)/documents/test",
|
|
71
|
+
service: "firestore.googleapis.com",
|
|
72
|
+
type: "type",
|
|
73
|
+
},
|
|
74
|
+
timestamp: "2022-03-15T18:52:04.369Z",
|
|
75
|
+
};
|
|
76
|
+
const contextWithAuth = {
|
|
77
|
+
auth: {
|
|
78
|
+
uid: "test-uid",
|
|
79
|
+
token: {
|
|
80
|
+
email: "test-email",
|
|
81
|
+
email_verified: true,
|
|
82
|
+
name: "test-name",
|
|
83
|
+
picture: "test-picture",
|
|
84
|
+
sub: "test-sub",
|
|
85
|
+
},
|
|
86
|
+
},
|
|
87
|
+
authType: "ADMIN",
|
|
88
|
+
eventId: "test-event-id",
|
|
89
|
+
eventType: "test-event-type",
|
|
90
|
+
params: {},
|
|
91
|
+
resource: {
|
|
92
|
+
name: "projects/test-project/databases/(default)/documents/test",
|
|
93
|
+
service: "firestore.googleapis.com",
|
|
94
|
+
type: "type",
|
|
95
|
+
},
|
|
96
|
+
timestamp: "2022-03-15T18:52:04.369Z",
|
|
97
|
+
};
|
|
98
|
+
beforeEach(() => {
|
|
99
|
+
// ...
|
|
100
|
+
jest.spyOn(admin, "initializeApp").mockImplementation();
|
|
101
|
+
const docMock = {
|
|
102
|
+
set: jest.fn(),
|
|
103
|
+
get: jest.fn(),
|
|
104
|
+
update: jest.fn(),
|
|
105
|
+
delete: jest.fn(),
|
|
106
|
+
parent: {},
|
|
107
|
+
path: "",
|
|
108
|
+
firestore: {},
|
|
109
|
+
id: "",
|
|
110
|
+
isEqual: jest.fn(),
|
|
111
|
+
// Add the missing properties and methods
|
|
112
|
+
collection: jest.fn(),
|
|
113
|
+
listCollections: jest.fn(),
|
|
114
|
+
create: jest.fn(),
|
|
115
|
+
onSnapshot: jest.fn(),
|
|
116
|
+
withConverter: jest.fn(),
|
|
117
|
+
// Add other required properties/methods as needed
|
|
118
|
+
};
|
|
119
|
+
const collectionMock = {
|
|
120
|
+
doc: jest.fn(() => docMock),
|
|
121
|
+
// Add other required properties/methods as needed
|
|
122
|
+
};
|
|
123
|
+
// Mock admin.firestore
|
|
124
|
+
const firestoreMock = jest.spyOn(admin, "firestore");
|
|
125
|
+
const firestoreInstance = {
|
|
126
|
+
collection: jest.fn(() => collectionMock),
|
|
127
|
+
settings: jest.fn(),
|
|
128
|
+
doc: jest.fn(),
|
|
129
|
+
collectionGroup: jest.fn(),
|
|
130
|
+
getAll: jest.fn(),
|
|
131
|
+
runTransaction: jest.fn(),
|
|
132
|
+
batch: jest.fn(),
|
|
133
|
+
terminate: jest.fn(),
|
|
134
|
+
// Add the missing methods
|
|
135
|
+
recursiveDelete: jest.fn(),
|
|
136
|
+
listCollections: jest.fn(),
|
|
137
|
+
bulkWriter: jest.fn(),
|
|
138
|
+
bundle: jest.fn(),
|
|
139
|
+
};
|
|
140
|
+
firestoreMock.mockImplementation(() => firestoreInstance);
|
|
141
|
+
// Add the spy for _mockable
|
|
142
|
+
jest.spyOn(index_1._mockable, "createNowTimestamp").mockReturnValue(Timestamp.now());
|
|
143
|
+
jest.spyOn(console, "log").mockImplementation();
|
|
144
|
+
});
|
|
145
|
+
afterEach(() => {
|
|
146
|
+
jest.restoreAllMocks();
|
|
147
|
+
});
|
|
148
|
+
it("should not execute when auth is null", async () => {
|
|
149
|
+
const change = createChange({}, {}, refPath);
|
|
150
|
+
await (0, index_1.onDocChange)(entity, change, contextWithoutAuth, "delete");
|
|
151
|
+
expect(console.log).toHaveBeenCalledWith("Auth is null, then this change is initiated by the service account and should be ignored");
|
|
152
|
+
expect(console.log).toHaveBeenCalledTimes(1);
|
|
153
|
+
});
|
|
154
|
+
it("should re-add deleted document", async () => {
|
|
155
|
+
const deletedDocumentData = {
|
|
156
|
+
field1: "value1",
|
|
157
|
+
field2: "value2",
|
|
158
|
+
};
|
|
159
|
+
const change = createChange(deletedDocumentData, null, refPath);
|
|
160
|
+
await (0, index_1.onDocChange)(entity, change, contextWithAuth, "delete");
|
|
161
|
+
expect(change.after.ref.set).toHaveBeenCalledWith(deletedDocumentData);
|
|
162
|
+
expect(change.after.ref.set).toHaveBeenCalledTimes(1);
|
|
163
|
+
expect(console.log).toHaveBeenCalledWith("Document re-added with ID test-id");
|
|
164
|
+
expect(console.log).toHaveBeenCalledTimes(4);
|
|
165
|
+
});
|
|
166
|
+
it("should revert modifications outside form", async () => {
|
|
167
|
+
const beforeData = {
|
|
168
|
+
field1: "oldValue",
|
|
169
|
+
field2: "oldValue",
|
|
170
|
+
field3: {
|
|
171
|
+
nestedField1: "oldValue",
|
|
172
|
+
nestedField2: "oldValue",
|
|
173
|
+
},
|
|
174
|
+
};
|
|
175
|
+
const afterData = {
|
|
176
|
+
"field1": "newValue",
|
|
177
|
+
"field2": "oldValue",
|
|
178
|
+
"field3": {
|
|
179
|
+
nestedField1: "newValue",
|
|
180
|
+
nestedField2: "oldValue",
|
|
181
|
+
},
|
|
182
|
+
"@form": {
|
|
183
|
+
"@actionType": "update",
|
|
184
|
+
"@status": "submit",
|
|
185
|
+
},
|
|
186
|
+
};
|
|
187
|
+
const change = createChange(beforeData, afterData, refPath);
|
|
188
|
+
// Mock validateForm to return a validation error
|
|
189
|
+
jest.spyOn(indexutils, "validateForm").mockResolvedValue([
|
|
190
|
+
true,
|
|
191
|
+
{
|
|
192
|
+
field1: ["error message 1"],
|
|
193
|
+
field2: ["error message 2"],
|
|
194
|
+
},
|
|
195
|
+
]);
|
|
196
|
+
const revertModificationsOutsideFormMock = jest.spyOn(indexutils, "revertModificationsOutsideForm").mockResolvedValue();
|
|
197
|
+
await (0, index_1.onDocChange)("user", change, contextWithAuth, "update");
|
|
198
|
+
expect(revertModificationsOutsideFormMock).toHaveBeenCalledWith(afterData, beforeData, change.after);
|
|
199
|
+
expect(indexutils.validateForm).toHaveBeenCalledWith("user", afterData, refPath);
|
|
200
|
+
expect(change.after.ref.update).toHaveBeenCalledWith({
|
|
201
|
+
"@form.@status": "form-validation-failed",
|
|
202
|
+
"@form.@message": { "field1": ["error message 1"], "field2": ["error message 2"] },
|
|
203
|
+
});
|
|
204
|
+
expect(change.after.ref.update).toHaveBeenCalledTimes(1);
|
|
205
|
+
});
|
|
206
|
+
it("should return on security check failure", async () => {
|
|
207
|
+
const getSecurityFnMock = jest.spyOn(indexutils, "getSecurityFn");
|
|
208
|
+
const rejectedSecurityResult = {
|
|
209
|
+
status: "rejected",
|
|
210
|
+
message: "Unauthorized access",
|
|
211
|
+
};
|
|
212
|
+
const securityFnMock = jest.fn().mockResolvedValue(rejectedSecurityResult);
|
|
213
|
+
getSecurityFnMock.mockReturnValue(securityFnMock);
|
|
214
|
+
const beforeData = {
|
|
215
|
+
"field1": "oldValue",
|
|
216
|
+
"field2": "oldValue",
|
|
217
|
+
"field3": {
|
|
218
|
+
nestedField1: "oldValue",
|
|
219
|
+
nestedField2: "oldValue",
|
|
220
|
+
},
|
|
221
|
+
"@form": {
|
|
222
|
+
"field1": "oldValue",
|
|
223
|
+
"field2": "oldValue",
|
|
224
|
+
"@status": "submit",
|
|
225
|
+
},
|
|
226
|
+
};
|
|
227
|
+
const afterData = {
|
|
228
|
+
"field1": "oldValue",
|
|
229
|
+
"field2": "oldValue",
|
|
230
|
+
"field3": {
|
|
231
|
+
nestedField1: "oldValue",
|
|
232
|
+
nestedField2: "oldValue",
|
|
233
|
+
},
|
|
234
|
+
"@form": {
|
|
235
|
+
"field1": "newValue",
|
|
236
|
+
"field2": "oldValue",
|
|
237
|
+
"@actionType": "update",
|
|
238
|
+
"@status": "submit",
|
|
239
|
+
},
|
|
240
|
+
};
|
|
241
|
+
const change = createChange(beforeData, afterData, refPath);
|
|
242
|
+
const validateFormMock = jest.spyOn(indexutils, "validateForm");
|
|
243
|
+
validateFormMock.mockResolvedValue([false, {}]);
|
|
244
|
+
await (0, index_1.onDocChange)(entity, change, contextWithAuth, "update");
|
|
245
|
+
expect(getSecurityFnMock).toHaveBeenCalledWith(entity);
|
|
246
|
+
expect(validateFormMock).toHaveBeenCalledWith(entity, change.after.data(), refPath);
|
|
247
|
+
expect(securityFnMock).toHaveBeenCalledWith(entity, change.after.data(), "update", ["field1"]);
|
|
248
|
+
expect(change.after.ref.update).toHaveBeenCalledWith({
|
|
249
|
+
"@form.@status": "security-error",
|
|
250
|
+
"@form.@message": "Unauthorized access",
|
|
251
|
+
});
|
|
252
|
+
expect(console.log).toHaveBeenCalledWith(`Security check failed: ${rejectedSecurityResult.message}`);
|
|
253
|
+
});
|
|
254
|
+
it("should call delayFormSubmissionAndCheckIfCancelled with correct parameters", async () => {
|
|
255
|
+
jest.spyOn(indexutils, "revertModificationsOutsideForm").mockResolvedValue();
|
|
256
|
+
jest.spyOn(indexutils, "validateForm").mockResolvedValue([false, {}]);
|
|
257
|
+
jest.spyOn(indexutils, "getFormModifiedFields").mockReturnValue(["field1", "field2"]);
|
|
258
|
+
jest.spyOn(indexutils, "getSecurityFn").mockReturnValue(() => Promise.resolve({ status: "allowed" }));
|
|
259
|
+
const delayFormSubmissionAndCheckIfCancelledSpy = jest.spyOn(indexutils, "delayFormSubmissionAndCheckIfCancelled").mockResolvedValue(true);
|
|
260
|
+
const doc = {
|
|
261
|
+
"@form": {
|
|
262
|
+
"@delay": 1000,
|
|
263
|
+
"@status": "submit",
|
|
264
|
+
"@actionType": "create",
|
|
265
|
+
},
|
|
266
|
+
"someField": "exampleValue",
|
|
267
|
+
};
|
|
268
|
+
const change = createChange(null, doc, "/example/test-id");
|
|
269
|
+
const event = "create";
|
|
270
|
+
await (0, index_1.onDocChange)("user", change, contextWithAuth, event);
|
|
271
|
+
// Test that the delayFormSubmissionAndCheckIfCancelled function is called with the correct parameters
|
|
272
|
+
expect(delayFormSubmissionAndCheckIfCancelledSpy).toHaveBeenCalledWith(1000, change.after);
|
|
273
|
+
// Test that snapshot.ref.update is called with the correct parameters
|
|
274
|
+
expect(change.after.ref.update).toHaveBeenCalledWith({ "@form.@status": "cancelled" });
|
|
275
|
+
});
|
|
276
|
+
it("should not process the form if @form.@status is not 'submit'", async () => {
|
|
277
|
+
jest.spyOn(indexutils, "revertModificationsOutsideForm").mockResolvedValue();
|
|
278
|
+
jest.spyOn(indexutils, "validateForm").mockResolvedValue([false, {}]);
|
|
279
|
+
jest.spyOn(indexutils, "getFormModifiedFields").mockReturnValue(["field1", "field2"]);
|
|
280
|
+
jest.spyOn(indexutils, "getSecurityFn").mockReturnValue(() => Promise.resolve({ status: "allowed" }));
|
|
281
|
+
const delayFormSubmissionAndCheckIfCancelledSpy = jest.spyOn(indexutils, "delayFormSubmissionAndCheckIfCancelled").mockResolvedValue(true);
|
|
282
|
+
const doc = {
|
|
283
|
+
"@form": {
|
|
284
|
+
"@actionType": "create",
|
|
285
|
+
"@status": "not-submit",
|
|
286
|
+
"@delay": 1000,
|
|
287
|
+
},
|
|
288
|
+
"someField": "exampleValue",
|
|
289
|
+
};
|
|
290
|
+
const change = createChange(null, doc, "/example/test-id");
|
|
291
|
+
const event = "create";
|
|
292
|
+
await (0, index_1.onDocChange)("user", change, contextWithAuth, event);
|
|
293
|
+
// Test that the delayFormSubmissionAndCheckIfCancelled function is NOT called
|
|
294
|
+
expect(indexutils.revertModificationsOutsideForm).toHaveBeenCalled();
|
|
295
|
+
expect(indexutils.getFormModifiedFields).not.toHaveBeenCalled();
|
|
296
|
+
expect(indexutils.getSecurityFn).not.toHaveBeenCalled();
|
|
297
|
+
expect(delayFormSubmissionAndCheckIfCancelledSpy).not.toHaveBeenCalled();
|
|
298
|
+
// Test that snapshot.ref.update is NOT called
|
|
299
|
+
expect(change.after.ref.update).not.toHaveBeenCalled();
|
|
300
|
+
});
|
|
301
|
+
it("should set @form.@status to 'submitted' after passing all checks", async () => {
|
|
302
|
+
jest.spyOn(indexutils, "revertModificationsOutsideForm").mockResolvedValue();
|
|
303
|
+
jest.spyOn(indexutils, "validateForm").mockResolvedValue([false, {}]);
|
|
304
|
+
jest.spyOn(indexutils, "getFormModifiedFields").mockReturnValue(["field1", "field2"]);
|
|
305
|
+
jest.spyOn(indexutils, "getSecurityFn").mockReturnValue(() => Promise.resolve({ status: "allowed" }));
|
|
306
|
+
jest.spyOn(indexutils, "delayFormSubmissionAndCheckIfCancelled").mockResolvedValue(false);
|
|
307
|
+
const addActionSpy = jest.fn().mockResolvedValue({
|
|
308
|
+
update: jest.fn(),
|
|
309
|
+
});
|
|
310
|
+
jest.spyOn(admin.firestore(), "collection").mockReturnValue({
|
|
311
|
+
add: addActionSpy,
|
|
312
|
+
});
|
|
313
|
+
const doc = {
|
|
314
|
+
"@form": {
|
|
315
|
+
"@actionType": "create",
|
|
316
|
+
"name": "test",
|
|
317
|
+
"@status": "submit",
|
|
318
|
+
},
|
|
319
|
+
"someField": "exampleValue",
|
|
320
|
+
};
|
|
321
|
+
const change = createChange(null, doc, "/example/test-id");
|
|
322
|
+
const event = "create";
|
|
323
|
+
await (0, index_1.onDocChange)("user", change, contextWithAuth, event);
|
|
324
|
+
// Test that the snapshot.ref.update is called with the correct parameters
|
|
325
|
+
expect(change.after.ref.update).toHaveBeenCalledWith({ "@form.@status": "processing" });
|
|
326
|
+
expect(change.after.ref.update).toHaveBeenCalledWith({ "@form.@status": "submitted" });
|
|
327
|
+
// Test that addActionSpy is called with the correct parameters
|
|
328
|
+
expect(addActionSpy).toHaveBeenCalled();
|
|
329
|
+
});
|
|
330
|
+
it("should set @form.@status to 'logic-error' if there are logic error results", async () => {
|
|
331
|
+
jest.spyOn(indexutils, "revertModificationsOutsideForm").mockResolvedValue();
|
|
332
|
+
jest.spyOn(indexutils, "validateForm").mockResolvedValue([false, {}]);
|
|
333
|
+
jest.spyOn(indexutils, "getFormModifiedFields").mockReturnValue(["field1", "field2"]);
|
|
334
|
+
jest.spyOn(indexutils, "getSecurityFn").mockReturnValue(() => Promise.resolve({ status: "allowed" }));
|
|
335
|
+
jest.spyOn(indexutils, "delayFormSubmissionAndCheckIfCancelled").mockResolvedValue(false);
|
|
336
|
+
const errorMessage = "logic error message";
|
|
337
|
+
const runBusinessLogicsSpy = jest.spyOn(indexutils, "runBusinessLogics").mockResolvedValue([
|
|
338
|
+
{
|
|
339
|
+
name: "testLogic",
|
|
340
|
+
status: "error",
|
|
341
|
+
message: errorMessage,
|
|
342
|
+
timeFinished: index_1._mockable.createNowTimestamp(),
|
|
343
|
+
documents: [],
|
|
344
|
+
},
|
|
345
|
+
]);
|
|
346
|
+
const actionRefUpdateSpy = jest.fn();
|
|
347
|
+
const collectionAddSpy = jest.fn().mockResolvedValue({
|
|
348
|
+
update: actionRefUpdateSpy,
|
|
349
|
+
collection: jest.fn().mockReturnValue({
|
|
350
|
+
add: jest.fn(),
|
|
351
|
+
}),
|
|
352
|
+
});
|
|
353
|
+
jest.spyOn(admin.firestore(), "collection").mockReturnValue({ add: collectionAddSpy });
|
|
354
|
+
const doc = {
|
|
355
|
+
"@form": {
|
|
356
|
+
"@actionType": "create",
|
|
357
|
+
"name": "test",
|
|
358
|
+
"@status": "submit",
|
|
359
|
+
},
|
|
360
|
+
"someField": "exampleValue",
|
|
361
|
+
};
|
|
362
|
+
const change = createChange(null, doc, "/example/test-id");
|
|
363
|
+
const event = "create";
|
|
364
|
+
await (0, index_1.onDocChange)("user", change, contextWithAuth, event);
|
|
365
|
+
// Test that the runBusinessLogics function was called with the correct parameters
|
|
366
|
+
expect(runBusinessLogicsSpy).toHaveBeenCalledWith("create", ["field1", "field2"], "user", expect.objectContaining({
|
|
367
|
+
actionType: "create",
|
|
368
|
+
document: {
|
|
369
|
+
"@form": {
|
|
370
|
+
"@actionType": "create",
|
|
371
|
+
"@status": "submit",
|
|
372
|
+
"name": "test",
|
|
373
|
+
},
|
|
374
|
+
"someField": "exampleValue",
|
|
375
|
+
},
|
|
376
|
+
modifiedFields: ["field1", "field2"],
|
|
377
|
+
path: "/example/test-id",
|
|
378
|
+
status: "processing",
|
|
379
|
+
// TimeCreated is not specified because it's dynamic
|
|
380
|
+
}));
|
|
381
|
+
// Test that the snapshot.ref.update is called with the correct parameters
|
|
382
|
+
expect(change.after.ref.update).toHaveBeenCalledTimes(3);
|
|
383
|
+
const updateMock = change.after.ref.update;
|
|
384
|
+
expect(updateMock.mock.calls[0][0]).toEqual({ "@form.@status": "processing" });
|
|
385
|
+
expect(updateMock.mock.calls[1][0]).toEqual({ "@form.@status": "submitted" });
|
|
386
|
+
expect(updateMock.mock.calls[2][0]).toEqual({ "@form.@status": "finished" });
|
|
387
|
+
// Test that collectionAddSpy is not called if there are logic errors
|
|
388
|
+
expect(collectionAddSpy).toHaveBeenCalledTimes(1);
|
|
389
|
+
expect(collectionAddSpy).toHaveBeenCalledWith(expect.objectContaining({
|
|
390
|
+
actionType: "create",
|
|
391
|
+
document: {
|
|
392
|
+
"@form": {
|
|
393
|
+
"@actionType": "create",
|
|
394
|
+
"@status": "submit",
|
|
395
|
+
"name": "test",
|
|
396
|
+
},
|
|
397
|
+
"someField": "exampleValue",
|
|
398
|
+
},
|
|
399
|
+
modifiedFields: ["field1", "field2"],
|
|
400
|
+
path: "/example/test-id",
|
|
401
|
+
status: "processing",
|
|
402
|
+
// TimeCreated is not specified because it's dynamic
|
|
403
|
+
}));
|
|
404
|
+
expect(actionRefUpdateSpy).toHaveBeenCalledTimes(2);
|
|
405
|
+
expect(actionRefUpdateSpy.mock.calls[0][0]).toEqual({ status: "finished-with-error", message: errorMessage });
|
|
406
|
+
});
|
|
407
|
+
// ... existing test code ...
|
|
408
|
+
it("should execute the sequence of operations correctly", async () => {
|
|
409
|
+
jest.spyOn(indexutils, "revertModificationsOutsideForm").mockResolvedValue();
|
|
410
|
+
jest.spyOn(indexutils, "validateForm").mockResolvedValue([false, {}]);
|
|
411
|
+
jest.spyOn(indexutils, "getFormModifiedFields").mockReturnValue(["field1", "field2"]);
|
|
412
|
+
jest.spyOn(indexutils, "getSecurityFn").mockReturnValue(() => Promise.resolve({ status: "allowed" }));
|
|
413
|
+
jest.spyOn(indexutils, "delayFormSubmissionAndCheckIfCancelled").mockResolvedValue(false);
|
|
414
|
+
const businessLogicResults = [
|
|
415
|
+
{
|
|
416
|
+
name: "testLogic",
|
|
417
|
+
status: "finished",
|
|
418
|
+
timeFinished: index_1._mockable.createNowTimestamp(),
|
|
419
|
+
documents: [],
|
|
420
|
+
},
|
|
421
|
+
];
|
|
422
|
+
const runBusinessLogicsSpy = jest.spyOn(indexutils, "runBusinessLogics").mockResolvedValue(businessLogicResults);
|
|
423
|
+
const actionRefUpdateSpy = jest.fn();
|
|
424
|
+
const collectionAddSpy = jest.fn().mockResolvedValue({
|
|
425
|
+
update: actionRefUpdateSpy,
|
|
426
|
+
collection: jest.fn().mockReturnValue({
|
|
427
|
+
add: jest.fn(),
|
|
428
|
+
}),
|
|
429
|
+
});
|
|
430
|
+
jest.spyOn(admin.firestore(), "collection").mockReturnValue({ add: collectionAddSpy });
|
|
431
|
+
const doc = {
|
|
432
|
+
"@form": {
|
|
433
|
+
"@actionType": "create",
|
|
434
|
+
"name": "test",
|
|
435
|
+
"@status": "submit",
|
|
436
|
+
},
|
|
437
|
+
"someField": "exampleValue",
|
|
438
|
+
};
|
|
439
|
+
const change = createChange(null, doc, "/example/test-id");
|
|
440
|
+
const event = "create";
|
|
441
|
+
const consolidatedLogicResults = new Map();
|
|
442
|
+
const consolidatedViewLogicResults = new Map();
|
|
443
|
+
const consolidatedPeerSyncViewLogicResults = new Map();
|
|
444
|
+
const userDocsByDstPath = new Map();
|
|
445
|
+
const otherUsersDocsByDstPath = new Map();
|
|
446
|
+
const viewLogicResults = [];
|
|
447
|
+
const userViewDocsByDstPath = new Map();
|
|
448
|
+
const otherUsersViewDocsByDstPath = new Map();
|
|
449
|
+
const peerSyncViewLogicResults = [];
|
|
450
|
+
const otherUsersPeerSyncViewDocsByDstPath = new Map();
|
|
451
|
+
jest.spyOn(indexutils, "consolidateAndGroupByDstPath")
|
|
452
|
+
.mockReturnValueOnce(consolidatedLogicResults)
|
|
453
|
+
.mockReturnValueOnce(consolidatedViewLogicResults)
|
|
454
|
+
.mockReturnValue(consolidatedPeerSyncViewLogicResults);
|
|
455
|
+
jest.spyOn(indexutils, "groupDocsByUserAndDstPath")
|
|
456
|
+
.mockReturnValueOnce({
|
|
457
|
+
userDocsByDstPath,
|
|
458
|
+
otherUsersDocsByDstPath,
|
|
459
|
+
})
|
|
460
|
+
.mockReturnValueOnce({
|
|
461
|
+
userDocsByDstPath: userViewDocsByDstPath,
|
|
462
|
+
otherUsersDocsByDstPath: otherUsersViewDocsByDstPath,
|
|
463
|
+
})
|
|
464
|
+
.mockReturnValueOnce({
|
|
465
|
+
userDocsByDstPath: new Map(),
|
|
466
|
+
otherUsersDocsByDstPath: otherUsersPeerSyncViewDocsByDstPath,
|
|
467
|
+
});
|
|
468
|
+
jest.spyOn(indexutils, "runViewLogics").mockResolvedValue(viewLogicResults);
|
|
469
|
+
jest.spyOn(indexutils, "runPeerSyncViews").mockResolvedValue(peerSyncViewLogicResults);
|
|
470
|
+
jest.spyOn(indexutils, "distribute");
|
|
471
|
+
await (0, index_1.onDocChange)("user", change, contextWithAuth, event);
|
|
472
|
+
// Test that the runBusinessLogics function was called with the correct parameters
|
|
473
|
+
expect(runBusinessLogicsSpy).toHaveBeenCalled();
|
|
474
|
+
// Test that the snapshot.ref.update is called with the correct parameters
|
|
475
|
+
expect(change.after.ref.update).toHaveBeenCalledTimes(3);
|
|
476
|
+
expect(collectionAddSpy).toHaveBeenCalledTimes(1);
|
|
477
|
+
// Test that the functions are called in the correct sequence
|
|
478
|
+
expect(indexutils.consolidateAndGroupByDstPath).toHaveBeenNthCalledWith(1, businessLogicResults);
|
|
479
|
+
expect(indexutils.groupDocsByUserAndDstPath).toHaveBeenNthCalledWith(1, consolidatedLogicResults, "test-uid");
|
|
480
|
+
expect(indexutils.runViewLogics).toHaveBeenCalledWith(userDocsByDstPath);
|
|
481
|
+
expect(indexutils.consolidateAndGroupByDstPath).toHaveBeenNthCalledWith(2, viewLogicResults);
|
|
482
|
+
expect(indexutils.groupDocsByUserAndDstPath).toHaveBeenNthCalledWith(2, consolidatedViewLogicResults, "test-uid");
|
|
483
|
+
expect(indexutils.distribute).toHaveBeenNthCalledWith(1, userDocsByDstPath);
|
|
484
|
+
expect(indexutils.distribute).toHaveBeenNthCalledWith(2, userViewDocsByDstPath);
|
|
485
|
+
expect(change.after.ref.update).toHaveBeenCalledWith({ "@form.@status": "finished" });
|
|
486
|
+
expect(indexutils.runPeerSyncViews).toHaveBeenCalledWith(userDocsByDstPath);
|
|
487
|
+
expect(indexutils.consolidateAndGroupByDstPath).toHaveBeenNthCalledWith(3, peerSyncViewLogicResults);
|
|
488
|
+
expect(indexutils.groupDocsByUserAndDstPath).toHaveBeenNthCalledWith(3, consolidatedPeerSyncViewLogicResults, "test-uid");
|
|
489
|
+
expect(indexutils.distribute).toHaveBeenCalledWith(otherUsersDocsByDstPath);
|
|
490
|
+
expect(indexutils.distribute).toHaveBeenCalledWith(otherUsersViewDocsByDstPath);
|
|
491
|
+
expect(indexutils.distribute).toHaveBeenCalledWith(otherUsersPeerSyncViewDocsByDstPath);
|
|
492
|
+
expect(actionRefUpdateSpy).toHaveBeenCalledTimes(1);
|
|
493
|
+
expect(actionRefUpdateSpy.mock.calls[0][0]).toEqual({ status: "finished" });
|
|
494
|
+
});
|
|
495
|
+
});
|
|
496
|
+
//# sourceMappingURL=index.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../src/tests/index.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const init_db_structure_1 = require("../init-db-structure");
|
|
4
|
+
describe("traverseBFS", () => {
|
|
5
|
+
it("should traverse the object structure and return paths", () => {
|
|
6
|
+
const input = {
|
|
7
|
+
a: {
|
|
8
|
+
b: {
|
|
9
|
+
c: {},
|
|
10
|
+
d: {},
|
|
11
|
+
},
|
|
12
|
+
e: {
|
|
13
|
+
f: "View:b:prop1,prop2",
|
|
14
|
+
},
|
|
15
|
+
},
|
|
16
|
+
h: {
|
|
17
|
+
i: {
|
|
18
|
+
"View:b:prop1,prop2": {},
|
|
19
|
+
},
|
|
20
|
+
},
|
|
21
|
+
};
|
|
22
|
+
const expectedOutput = [
|
|
23
|
+
"a",
|
|
24
|
+
"h",
|
|
25
|
+
"a/b",
|
|
26
|
+
"a/e",
|
|
27
|
+
"h/i",
|
|
28
|
+
"a/b/c",
|
|
29
|
+
"a/b/d",
|
|
30
|
+
"a/e#f=View:b:prop1,prop2",
|
|
31
|
+
"h/i=View:b:prop1,prop2",
|
|
32
|
+
];
|
|
33
|
+
const result = (0, init_db_structure_1.traverseBFS)(input);
|
|
34
|
+
expect(result).toEqual(expectedOutput);
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
describe("mapDocPaths", () => {
|
|
38
|
+
it("should map document paths based on the given entity object", () => {
|
|
39
|
+
const paths = [
|
|
40
|
+
"as",
|
|
41
|
+
"hs",
|
|
42
|
+
"as/a",
|
|
43
|
+
"hs/h",
|
|
44
|
+
"as/a/cs",
|
|
45
|
+
"as/a/cs/c",
|
|
46
|
+
"as/a/cs/c#f=View:a:prop1,prop2",
|
|
47
|
+
"hs/h=View:a:prop1,prop2",
|
|
48
|
+
];
|
|
49
|
+
const Entity = {
|
|
50
|
+
Entity1: "a",
|
|
51
|
+
Entity2: "h",
|
|
52
|
+
Entity3: "c",
|
|
53
|
+
};
|
|
54
|
+
const expectedOutput = {
|
|
55
|
+
"a": "as/{aId}",
|
|
56
|
+
"h": "hs/{hId}",
|
|
57
|
+
"c": "as/{aId}/cs/{cId}",
|
|
58
|
+
};
|
|
59
|
+
const result = (0, init_db_structure_1.mapDocPaths)(paths, Entity);
|
|
60
|
+
expect(result).toEqual(expectedOutput);
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
describe("mapViewPaths", () => {
|
|
64
|
+
it("should map view paths based on the given paths and Entity object", () => {
|
|
65
|
+
const paths = [
|
|
66
|
+
"as",
|
|
67
|
+
"hs",
|
|
68
|
+
"as/a",
|
|
69
|
+
"as/a/bs/b",
|
|
70
|
+
"as/a/bs/b#f=View:a:prop1,prop2",
|
|
71
|
+
"as/a/ds/d=View:a:prop1,prop2",
|
|
72
|
+
];
|
|
73
|
+
const Entity = {
|
|
74
|
+
Entity1: "a",
|
|
75
|
+
Entity2: "b",
|
|
76
|
+
Entity3: "d",
|
|
77
|
+
};
|
|
78
|
+
const docPaths = {
|
|
79
|
+
"a": "as/{aId}",
|
|
80
|
+
"b": "as/{aId}/bs/{bId}",
|
|
81
|
+
"d": "as/{aId}/ds/{dId}",
|
|
82
|
+
};
|
|
83
|
+
const expectedOutput = [
|
|
84
|
+
{
|
|
85
|
+
destEntity: "b",
|
|
86
|
+
destProp: "f",
|
|
87
|
+
srcProps: ["prop1", "prop2"],
|
|
88
|
+
srcEntity: "a",
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
destEntity: "d",
|
|
92
|
+
srcProps: ["prop1", "prop2"],
|
|
93
|
+
srcEntity: "a",
|
|
94
|
+
},
|
|
95
|
+
];
|
|
96
|
+
const result = (0, init_db_structure_1.mapViewDefinitions)(paths, Entity, docPaths);
|
|
97
|
+
expect(result).toEqual(expectedOutput);
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
describe("mapColPaths", () => {
|
|
101
|
+
it("should map collection paths based on the given document paths", () => {
|
|
102
|
+
const docPathsMap = {
|
|
103
|
+
"c": "as/{aId}/bs/{bId}",
|
|
104
|
+
"d": "as/{aId/ds/{dId}",
|
|
105
|
+
};
|
|
106
|
+
const expectedOutput = {
|
|
107
|
+
"c": "as/{aId}/bs",
|
|
108
|
+
"d": "as/{aId/ds",
|
|
109
|
+
};
|
|
110
|
+
const result = (0, init_db_structure_1.mapColPaths)(docPathsMap);
|
|
111
|
+
expect(result).toEqual(expectedOutput);
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
//# sourceMappingURL=init-db-structure.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init-db-structure.test.js","sourceRoot":"","sources":["../../src/tests/init-db-structure.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|