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.
Files changed (85) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +40 -0
  3. package/lib/db-structure.d.ts +7 -0
  4. package/lib/db-structure.js +67 -0
  5. package/lib/db-structure.js.map +1 -0
  6. package/lib/index-utils.d.ts +20 -0
  7. package/lib/index-utils.js +324 -0
  8. package/lib/index-utils.js.map +1 -0
  9. package/lib/index.d.ts +23 -0
  10. package/lib/index.js +197 -0
  11. package/lib/index.js.map +1 -0
  12. package/lib/init-db-structure.d.ts +17 -0
  13. package/lib/init-db-structure.js +111 -0
  14. package/lib/init-db-structure.js.map +1 -0
  15. package/lib/logics/index.d.ts +2 -0
  16. package/lib/logics/index.js +77 -0
  17. package/lib/logics/index.js.map +1 -0
  18. package/lib/logics/view-logics.d.ts +3 -0
  19. package/lib/logics/view-logics.js +167 -0
  20. package/lib/logics/view-logics.js.map +1 -0
  21. package/lib/sample-custom/business-logics.d.ts +3 -0
  22. package/lib/sample-custom/business-logics.js +67 -0
  23. package/lib/sample-custom/business-logics.js.map +1 -0
  24. package/lib/sample-custom/db-structure.d.ts +29 -0
  25. package/lib/sample-custom/db-structure.js +36 -0
  26. package/lib/sample-custom/db-structure.js.map +1 -0
  27. package/lib/sample-custom/security.d.ts +2 -0
  28. package/lib/sample-custom/security.js +63 -0
  29. package/lib/sample-custom/security.js.map +1 -0
  30. package/lib/sample-custom/validators.d.ts +9 -0
  31. package/lib/sample-custom/validators.js +42 -0
  32. package/lib/sample-custom/validators.js.map +1 -0
  33. package/lib/tests/index-utils.test.d.ts +1 -0
  34. package/lib/tests/index-utils.test.js +600 -0
  35. package/lib/tests/index-utils.test.js.map +1 -0
  36. package/lib/tests/index.test.d.ts +1 -0
  37. package/lib/tests/index.test.js +496 -0
  38. package/lib/tests/index.test.js.map +1 -0
  39. package/lib/tests/init-db-structure.test.d.ts +1 -0
  40. package/lib/tests/init-db-structure.test.js +114 -0
  41. package/lib/tests/init-db-structure.test.js.map +1 -0
  42. package/lib/tests/logics/index.test.d.ts +1 -0
  43. package/lib/tests/logics/index.test.js +127 -0
  44. package/lib/tests/logics/index.test.js.map +1 -0
  45. package/lib/tests/logics/view-logics.test.d.ts +1 -0
  46. package/lib/tests/logics/view-logics.test.js +211 -0
  47. package/lib/tests/logics/view-logics.test.js.map +1 -0
  48. package/lib/tests/utils/misc.test.d.ts +1 -0
  49. package/lib/tests/utils/misc.test.js +31 -0
  50. package/lib/tests/utils/misc.test.js.map +1 -0
  51. package/lib/tests/utils/paths.test.d.ts +1 -0
  52. package/lib/tests/utils/paths.test.js +258 -0
  53. package/lib/tests/utils/paths.test.js.map +1 -0
  54. package/lib/tests/utils/query.test.d.ts +1 -0
  55. package/lib/tests/utils/query.test.js +72 -0
  56. package/lib/tests/utils/query.test.js.map +1 -0
  57. package/lib/tests/utils/sample.test.d.ts +1 -0
  58. package/lib/tests/utils/sample.test.js +52 -0
  59. package/lib/tests/utils/sample.test.js.map +1 -0
  60. package/lib/types.d.ts +78 -0
  61. package/lib/types.js +3 -0
  62. package/lib/types.js.map +1 -0
  63. package/lib/utils/db-structure.d.ts +2 -0
  64. package/lib/utils/db-structure.js +9 -0
  65. package/lib/utils/db-structure.js.map +1 -0
  66. package/lib/utils/misc.d.ts +1 -0
  67. package/lib/utils/misc.js +53 -0
  68. package/lib/utils/misc.js.map +1 -0
  69. package/lib/utils/paths.d.ts +16 -0
  70. package/lib/utils/paths.js +136 -0
  71. package/lib/utils/paths.js.map +1 -0
  72. package/lib/utils/query.d.ts +2 -0
  73. package/lib/utils/query.js +41 -0
  74. package/lib/utils/query.js.map +1 -0
  75. package/lib/utils/sample.d.ts +5 -0
  76. package/lib/utils/sample.js +37 -0
  77. package/lib/utils/sample.js.map +1 -0
  78. package/lib/utils.d.ts +12 -0
  79. package/lib/utils.js +67 -0
  80. package/lib/utils.js.map +1 -0
  81. package/package.json +37 -0
  82. package/src/sample-custom/business-logics.ts +51 -0
  83. package/src/sample-custom/db-structure.ts +33 -0
  84. package/src/sample-custom/security.ts +77 -0
  85. package/src/sample-custom/validators.ts +46 -0
@@ -0,0 +1,600 @@
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 admin = __importStar(require("firebase-admin"));
27
+ const index_utils_1 = require("../index-utils");
28
+ const firebase_admin_1 = require("firebase-admin");
29
+ const index_1 = require("../index");
30
+ const paths = __importStar(require("../utils/paths"));
31
+ const db_structure_1 = require("../sample-custom/db-structure");
32
+ const security_1 = require("../sample-custom/security");
33
+ const validators_1 = require("../sample-custom/validators");
34
+ admin.initializeApp();
35
+ jest.spyOn(console, "log").mockImplementation();
36
+ jest.spyOn(console, "info").mockImplementation();
37
+ describe("distribute", () => {
38
+ let dbSpy;
39
+ let colSpy;
40
+ beforeEach(() => {
41
+ const dbDoc = {
42
+ get: jest.fn().mockResolvedValue({ exists: true, data: () => ({}) }),
43
+ set: jest.fn().mockResolvedValue({}),
44
+ delete: jest.fn().mockResolvedValue({}),
45
+ };
46
+ dbSpy = jest.spyOn(admin.firestore(), "doc").mockReturnValue(dbDoc);
47
+ colSpy = jest.spyOn(admin.firestore(), "collection").mockReturnValue({
48
+ doc: jest.fn(() => dbDoc),
49
+ });
50
+ });
51
+ afterEach(() => {
52
+ dbSpy.mockRestore();
53
+ colSpy.mockRestore();
54
+ });
55
+ it("should merge a document to dstPath with instructions", async () => {
56
+ const setSpy = jest.fn().mockResolvedValue({});
57
+ const batchSpy = jest.spyOn(admin.firestore(), "batch").mockReturnValue({
58
+ set: setSpy,
59
+ delete: jest.fn(),
60
+ commit: jest.fn().mockResolvedValue(undefined),
61
+ });
62
+ const userDocsByDstPath = new Map([[
63
+ "/users/test-user-id/documents/test-doc-id",
64
+ {
65
+ action: "merge",
66
+ doc: { name: "test-doc-name-updated" },
67
+ instructions: {
68
+ "count": "++",
69
+ "score": "+5",
70
+ "minusCount": "--",
71
+ "minusScore": "-3",
72
+ },
73
+ dstPath: "/users/test-user-id/documents/test-doc-id",
74
+ },
75
+ ]]);
76
+ (0, index_1.initializeEmberFlow)(admin, db_structure_1.dbStructure, db_structure_1.Entity, security_1.securityConfig, validators_1.validatorConfig, []);
77
+ await (0, index_utils_1.distribute)(userDocsByDstPath);
78
+ expect(batchSpy).toHaveBeenCalledTimes(1);
79
+ expect(admin.firestore().doc).toHaveBeenCalledTimes(1);
80
+ expect(admin.firestore().doc).toHaveBeenCalledWith("/users/test-user-id/documents/test-doc-id");
81
+ expect(setSpy.mock.calls[0][1]).toEqual({
82
+ name: "test-doc-name-updated",
83
+ count: admin.firestore.FieldValue.increment(1),
84
+ score: admin.firestore.FieldValue.increment(5),
85
+ minusCount: admin.firestore.FieldValue.increment(-1),
86
+ minusScore: admin.firestore.FieldValue.increment(-3),
87
+ });
88
+ expect(setSpy.mock.calls[0][2]).toEqual({ merge: true });
89
+ expect(setSpy).toHaveBeenCalledTimes(1);
90
+ batchSpy.mockRestore();
91
+ });
92
+ it("should merge a document to dstPath with # in path", async () => {
93
+ const setSpy = jest.fn().mockResolvedValue({});
94
+ const batchSpy = jest.spyOn(admin.firestore(), "batch").mockReturnValue({
95
+ set: setSpy,
96
+ delete: jest.fn(),
97
+ commit: jest.fn().mockResolvedValue(undefined),
98
+ });
99
+ const randomId = "random-id";
100
+ const docSpy = jest.spyOn(admin.firestore.CollectionReference.prototype, "doc").mockReturnValue({
101
+ set: jest.fn(),
102
+ delete: jest.fn(),
103
+ collection: jest.fn(),
104
+ get: jest.fn(),
105
+ id: randomId,
106
+ parent: jest.fn(),
107
+ path: "/users/test-user-id/documents/" + randomId,
108
+ withConverter: jest.fn(),
109
+ });
110
+ jest.spyOn(admin.firestore(), "collection").mockReturnValue({
111
+ doc: docSpy,
112
+ });
113
+ const userDocsByDstPath = new Map([[
114
+ "/users/test-user-id/documents/#",
115
+ {
116
+ action: "merge",
117
+ doc: { name: "test-doc-name-updated" },
118
+ instructions: undefined,
119
+ dstPath: "/users/test-user-id/documents/#",
120
+ },
121
+ ]]);
122
+ await (0, index_utils_1.distribute)(userDocsByDstPath);
123
+ expect(batchSpy).toHaveBeenCalledTimes(1);
124
+ expect(admin.firestore().collection).toHaveBeenCalledTimes(1);
125
+ expect(admin.firestore().doc).not.toHaveBeenCalled();
126
+ expect(admin.firestore().collection).toHaveBeenCalledWith("/users/test-user-id/documents");
127
+ expect(docSpy).toHaveBeenCalledTimes(1);
128
+ expect(setSpy.mock.calls[0][1]).toEqual({ name: "test-doc-name-updated" });
129
+ expect(setSpy.mock.calls[0][2]).toEqual({ merge: true });
130
+ expect(setSpy).toHaveBeenCalledTimes(1);
131
+ batchSpy.mockRestore();
132
+ docSpy.mockRestore();
133
+ });
134
+ it("should delete a document at dstPath", async () => {
135
+ const deleteSpy = jest.fn().mockResolvedValue({});
136
+ const batchSpy = jest.spyOn(admin.firestore(), "batch").mockReturnValue({
137
+ set: jest.fn(),
138
+ delete: deleteSpy,
139
+ commit: jest.fn().mockResolvedValue(undefined),
140
+ });
141
+ const userDocsByDstPath = new Map([[
142
+ "/users/test-user-id/documents/test-doc-id",
143
+ {
144
+ action: "delete",
145
+ dstPath: "/users/test-user-id/documents/test-doc-id",
146
+ },
147
+ ]]);
148
+ await (0, index_utils_1.distribute)(userDocsByDstPath);
149
+ expect(batchSpy).toHaveBeenCalledTimes(1);
150
+ expect(admin.firestore().doc).toHaveBeenCalledTimes(1);
151
+ expect(admin.firestore().doc).toHaveBeenCalledWith("/users/test-user-id/documents/test-doc-id");
152
+ expect(deleteSpy).toHaveBeenCalledTimes(1);
153
+ batchSpy.mockRestore();
154
+ });
155
+ it("should copy a document to dstPath with shallow copy mode", async () => {
156
+ const setSpy = jest.fn().mockResolvedValue({});
157
+ const batchSpy = jest.spyOn(admin.firestore(), "batch").mockReturnValue({
158
+ set: setSpy,
159
+ delete: jest.fn(),
160
+ commit: jest.fn().mockResolvedValue(undefined),
161
+ });
162
+ const userDocsByDstPath = new Map([[
163
+ "/users/test-user-id/documents/test-doc-id",
164
+ {
165
+ action: "copy",
166
+ copyMode: "shallow",
167
+ srcPath: "/users/test-user-id-1/documents/test-doc-id",
168
+ dstPath: "/users/test-user-id-2/documents/test-doc-id",
169
+ },
170
+ ]]);
171
+ await (0, index_utils_1.distribute)(userDocsByDstPath);
172
+ expect(batchSpy).toHaveBeenCalledTimes(1);
173
+ expect(admin.firestore().doc).toHaveBeenCalledTimes(2);
174
+ expect(admin.firestore().doc).toHaveBeenCalledWith("/users/test-user-id-1/documents/test-doc-id");
175
+ expect(admin.firestore().doc).toHaveBeenCalledWith("/users/test-user-id-2/documents/test-doc-id");
176
+ expect(setSpy.mock.calls[0][1]).toEqual({});
177
+ expect(setSpy).toHaveBeenCalledTimes(1);
178
+ batchSpy.mockRestore();
179
+ });
180
+ it("should copy a document to dstPath with recursive copy mode", async () => {
181
+ const setSpy = jest.fn().mockResolvedValue({});
182
+ const batchSpy = jest.spyOn(admin.firestore(), "batch").mockReturnValue({
183
+ set: setSpy,
184
+ delete: jest.fn(),
185
+ commit: jest.fn().mockResolvedValue(undefined),
186
+ });
187
+ const srcDocMock = {
188
+ get: jest.fn().mockResolvedValue({
189
+ exists: true,
190
+ data: () => ({ field: "value" }),
191
+ }),
192
+ };
193
+ const mockDoc = jest.spyOn(admin.firestore(), "doc").mockReturnValue(srcDocMock);
194
+ const mockExpandAndGroupDocPaths = jest.spyOn(paths, "expandAndGroupDocPaths").mockResolvedValue({});
195
+ const userDocsByDstPath = new Map([[
196
+ "/users/test-user-id-2/documents/test-doc-id",
197
+ {
198
+ action: "copy",
199
+ copyMode: "recursive",
200
+ srcPath: "/users/test-user-id-1/documents/test-doc-id",
201
+ dstPath: "/users/test-user-id-2/documents/test-doc-id",
202
+ },
203
+ ]]);
204
+ await (0, index_utils_1.distribute)(userDocsByDstPath);
205
+ expect(mockExpandAndGroupDocPaths).toHaveBeenCalledTimes(1);
206
+ expect(batchSpy).toHaveBeenCalledTimes(1);
207
+ expect(admin.firestore().doc).toHaveBeenCalledTimes(2);
208
+ expect(admin.firestore().doc).toHaveBeenCalledWith("/users/test-user-id-1/documents/test-doc-id");
209
+ expect(admin.firestore().doc).toHaveBeenCalledWith("/users/test-user-id-2/documents/test-doc-id");
210
+ expect(setSpy.mock.calls[0][1]).toEqual({ field: "value" });
211
+ expect(setSpy).toHaveBeenCalledTimes(1);
212
+ batchSpy.mockRestore();
213
+ mockDoc.mockRestore();
214
+ mockExpandAndGroupDocPaths.mockRestore();
215
+ });
216
+ });
217
+ describe("revertModificationsOutsideForm", () => {
218
+ let dbSpy;
219
+ let mockSnapshot;
220
+ beforeEach(() => {
221
+ dbSpy = jest.spyOn(admin.firestore(), "doc").mockReturnValue({
222
+ get: jest.fn().mockResolvedValue(mockSnapshot),
223
+ update: jest.fn().mockResolvedValue({}),
224
+ });
225
+ mockSnapshot = {
226
+ ref: {
227
+ update: jest.fn().mockResolvedValue({}),
228
+ },
229
+ data: jest.fn().mockReturnValue({}),
230
+ };
231
+ });
232
+ afterEach(() => {
233
+ dbSpy.mockRestore();
234
+ });
235
+ const mockDocument = {
236
+ "name": "Alice",
237
+ "age": 25,
238
+ "@form": {
239
+ "name": "Alicia",
240
+ "age": 26,
241
+ "@status": "submit",
242
+ },
243
+ };
244
+ const mockBeforeDocument = {
245
+ "name": "Alice",
246
+ "age": 26,
247
+ "@form": {
248
+ "name": "Alice",
249
+ "age": 26,
250
+ "@status": "finished",
251
+ },
252
+ };
253
+ it("should revert modifications to fields outside the @form object", async () => {
254
+ const updateSpy = jest.spyOn(mockSnapshot.ref, "update");
255
+ await (0, index_utils_1.revertModificationsOutsideForm)(mockDocument, mockBeforeDocument, mockSnapshot);
256
+ expect(updateSpy).toHaveBeenCalledWith({ age: 26 });
257
+ });
258
+ it("should not revert modifications to fields inside the @form object", async () => {
259
+ const updateSpy = jest.spyOn(mockSnapshot.ref, "update");
260
+ await (0, index_utils_1.revertModificationsOutsideForm)(mockDocument, mockBeforeDocument, mockSnapshot);
261
+ expect(updateSpy).not.toHaveBeenCalledWith({ "@form": { "name": "Alice" } });
262
+ });
263
+ it("should not update the snapshot if there are no modifications to revert", async () => {
264
+ const mockDocument = {
265
+ "name": "Alice",
266
+ "age": 26,
267
+ "@form": {
268
+ "name": "Alicia",
269
+ "age": 25,
270
+ "@status": "processing",
271
+ },
272
+ };
273
+ const updateSpy = jest.spyOn(mockSnapshot.ref, "update");
274
+ await (0, index_utils_1.revertModificationsOutsideForm)(mockDocument, mockBeforeDocument, mockSnapshot);
275
+ expect(updateSpy).not.toHaveBeenCalled();
276
+ });
277
+ });
278
+ describe("validateForm", () => {
279
+ const docPath = "users/1";
280
+ it("returns an object with empty validationResult when document is valid", async () => {
281
+ const entity = "user";
282
+ const document = {
283
+ name: "John Doe",
284
+ email: "johndoe@example.com",
285
+ password: "abc123",
286
+ };
287
+ const [hasValidationError, validationResult] = await (0, index_utils_1.validateForm)(entity, document, docPath);
288
+ expect(hasValidationError).toBe(false);
289
+ expect(validationResult).toEqual({});
290
+ });
291
+ it("returns an object with validation errors when document is invalid", async () => {
292
+ const entity = "user";
293
+ const document = {
294
+ name: "",
295
+ email: "johndoe@example.com",
296
+ password: "abc",
297
+ };
298
+ const [hasValidationError, validationResult] = await (0, index_utils_1.validateForm)(entity, document, docPath);
299
+ expect(hasValidationError).toBe(true);
300
+ expect(validationResult).toEqual({ name: ["Name is required"] });
301
+ });
302
+ });
303
+ describe("getFormModifiedFields", () => {
304
+ it("should return an empty array when there are no form fields", () => {
305
+ const document = { name: "John Doe", age: 30 };
306
+ const modifiedFields = (0, index_utils_1.getFormModifiedFields)(document);
307
+ expect(modifiedFields).toEqual([]);
308
+ });
309
+ it("should return an array of modified form fields", () => {
310
+ const document = {
311
+ "name": "John Doe",
312
+ "age": 30,
313
+ "@form": {
314
+ "name": "Jane Doe",
315
+ "address": "123 Main St",
316
+ "@status": "submit",
317
+ },
318
+ };
319
+ const modifiedFields = (0, index_utils_1.getFormModifiedFields)(document);
320
+ expect(modifiedFields).toEqual(["name", "address"]);
321
+ });
322
+ it("should return an empty array when form is empty", () => {
323
+ const document = {
324
+ "name": "John Doe",
325
+ "age": 30,
326
+ "@form": {
327
+ "@status": "submit",
328
+ },
329
+ };
330
+ const modifiedFields = (0, index_utils_1.getFormModifiedFields)(document);
331
+ expect(modifiedFields).toEqual([]);
332
+ });
333
+ });
334
+ describe("delayFormSubmissionAndCheckIfCancelled", () => {
335
+ test("should delay form submission for 500 ms and not cancel form submission", async () => {
336
+ const delay = 500;
337
+ const snapshot = {
338
+ ref: {
339
+ update: jest.fn(),
340
+ get: jest.fn().mockResolvedValue({
341
+ data: () => ({ "@form": { "@status": "delay" } }),
342
+ }),
343
+ },
344
+ };
345
+ const cancelFormSubmission = await (0, index_utils_1.delayFormSubmissionAndCheckIfCancelled)(delay, snapshot);
346
+ expect(cancelFormSubmission).toBe(false);
347
+ expect(snapshot.ref.update).toHaveBeenCalledTimes(1);
348
+ expect(snapshot.ref.update).toHaveBeenCalledWith({ "@form.@status": "delay" });
349
+ expect(snapshot.ref.get).toHaveBeenCalledTimes(1);
350
+ expect(snapshot.ref.get).toHaveBeenCalledWith();
351
+ });
352
+ test("should delay form submission for 2000 ms and cancel form submission", async () => {
353
+ const delay = 2000;
354
+ const snapshot = {
355
+ ref: {
356
+ update: jest.fn(),
357
+ get: jest.fn().mockResolvedValue({
358
+ data: () => ({ "@form": { "@status": "cancel" } }),
359
+ }),
360
+ },
361
+ };
362
+ const cancelFormSubmission = await (0, index_utils_1.delayFormSubmissionAndCheckIfCancelled)(delay, snapshot);
363
+ expect(cancelFormSubmission).toBe(true);
364
+ expect(snapshot.ref.update).toHaveBeenCalledTimes(1);
365
+ expect(snapshot.ref.update).toHaveBeenCalledWith({ "@form.@status": "delay" });
366
+ expect(snapshot.ref.get).toHaveBeenCalledTimes(1);
367
+ expect(snapshot.ref.get).toHaveBeenCalledWith();
368
+ });
369
+ });
370
+ describe("runBusinessLogics", () => {
371
+ const actionType = "create";
372
+ const formModifiedFields = ["field1", "field2"];
373
+ const entity = "user";
374
+ const action = {
375
+ actionType,
376
+ path: "users/user123",
377
+ document: {
378
+ "@form": {
379
+ "@actionType": actionType,
380
+ },
381
+ "field1": "value1",
382
+ "field2": "value2",
383
+ "field3": "value3",
384
+ },
385
+ status: "processing",
386
+ timeCreated: firebase_admin_1.firestore.Timestamp.now(),
387
+ modifiedFields: formModifiedFields,
388
+ };
389
+ it("should call all matching logics and return their results", async () => {
390
+ const logicFn1 = jest.fn().mockResolvedValue({ status: "finished" });
391
+ const logicFn2 = jest.fn().mockResolvedValue({ status: "finished" });
392
+ const logicFn3 = jest.fn().mockResolvedValue({ status: "error", message: "Error message" });
393
+ const logics = [
394
+ {
395
+ name: "Logic 1",
396
+ actionTypes: ["create"],
397
+ modifiedFields: ["field1"],
398
+ entities: ["user"],
399
+ logicFn: logicFn1,
400
+ },
401
+ {
402
+ name: "Logic 2",
403
+ actionTypes: "all",
404
+ modifiedFields: ["field2"],
405
+ entities: ["user"],
406
+ logicFn: logicFn2,
407
+ },
408
+ {
409
+ name: "Logic 3",
410
+ actionTypes: ["delete"],
411
+ modifiedFields: ["field3"],
412
+ entities: ["user"],
413
+ logicFn: logicFn3,
414
+ },
415
+ ];
416
+ (0, index_1.initializeEmberFlow)(admin, db_structure_1.dbStructure, db_structure_1.Entity, security_1.securityConfig, validators_1.validatorConfig, logics);
417
+ const results = await (0, index_utils_1.runBusinessLogics)(actionType, formModifiedFields, entity, action);
418
+ expect(logicFn1).toHaveBeenCalledWith(action);
419
+ expect(logicFn2).toHaveBeenCalledWith(action);
420
+ expect(logicFn3).not.toHaveBeenCalled();
421
+ expect(results).toEqual([
422
+ { status: "finished" },
423
+ { status: "finished" },
424
+ ]);
425
+ });
426
+ it("should return an empty array if no matching logics are found", async () => {
427
+ const logics = [
428
+ {
429
+ name: "Logic 1",
430
+ actionTypes: ["create"],
431
+ modifiedFields: ["field1"],
432
+ entities: ["customentity"],
433
+ logicFn: jest.fn(),
434
+ },
435
+ {
436
+ name: "Logic 2",
437
+ actionTypes: ["update"],
438
+ modifiedFields: ["field2"],
439
+ entities: ["customentity"],
440
+ logicFn: jest.fn(),
441
+ },
442
+ {
443
+ name: "Logic 3",
444
+ actionTypes: ["delete"],
445
+ modifiedFields: ["field3"],
446
+ entities: ["customentity"],
447
+ logicFn: jest.fn(),
448
+ },
449
+ ];
450
+ (0, index_1.initializeEmberFlow)(admin, db_structure_1.dbStructure, db_structure_1.Entity, security_1.securityConfig, validators_1.validatorConfig, logics);
451
+ const results = await (0, index_utils_1.runBusinessLogics)(actionType, formModifiedFields, entity, action);
452
+ expect(results).toEqual([]);
453
+ });
454
+ });
455
+ describe("groupDocsByUserAndDstPath", () => {
456
+ (0, index_1.initializeEmberFlow)(admin, db_structure_1.dbStructure, db_structure_1.Entity, {}, {}, []);
457
+ const docsByDstPath = new Map([
458
+ ["users/user123/document1", { action: "merge", dstPath: "users/user123/document1", doc: { field1: "value1", field2: "value2" } }],
459
+ ["users/user123/document2", { action: "merge", dstPath: "users/user123/document2", doc: { field3: "value3", field6: "value6" } }],
460
+ ["users/user456/document3", { action: "merge", dstPath: "users/user456/document3", doc: { field4: "value4" } }],
461
+ ["users/user789/document4", { action: "delete", dstPath: "users/user789/document4" }],
462
+ ["othercollection/document5", { action: "merge", dstPath: "othercollection/document5", doc: { field5: "value5" } }],
463
+ ]);
464
+ it("should group documents by destination path and user", () => {
465
+ const userId = "user123";
466
+ const expectedResults = {
467
+ userDocsByDstPath: new Map([
468
+ ["users/user123/document1", { action: "merge", dstPath: "users/user123/document1", doc: { field1: "value1", field2: "value2" } }],
469
+ ["users/user123/document2", { action: "merge", dstPath: "users/user123/document2", doc: { field3: "value3", field6: "value6" } }],
470
+ ]),
471
+ otherUsersDocsByDstPath: new Map([
472
+ ["users/user456/document3", { action: "merge", dstPath: "users/user456/document3", doc: { field4: "value4" } }],
473
+ ["users/user789/document4", { action: "delete", dstPath: "users/user789/document4" }],
474
+ ["othercollection/document5", { action: "merge", dstPath: "othercollection/document5", doc: { field5: "value5" } }],
475
+ ]),
476
+ };
477
+ const results = (0, index_utils_1.groupDocsByUserAndDstPath)(docsByDstPath, userId);
478
+ expect(results).toEqual(expectedResults);
479
+ });
480
+ });
481
+ describe("consolidateLogicResultsDocs", () => {
482
+ it("should consolidate logic results documents correctly", () => {
483
+ // Arrange
484
+ const logicResults = [
485
+ {
486
+ name: "logic 1",
487
+ timeFinished: firebase_admin_1.firestore.Timestamp.now(),
488
+ status: "finished",
489
+ documents: [
490
+ { action: "merge", dstPath: "path1", doc: { field1: "value1" }, instructions: { field2: "++" } },
491
+ { action: "delete", dstPath: "path2" },
492
+ ],
493
+ },
494
+ {
495
+ name: "logic 2",
496
+ timeFinished: firebase_admin_1.firestore.Timestamp.now(),
497
+ status: "finished",
498
+ documents: [
499
+ { action: "merge", dstPath: "path1", doc: { field1: "value1a" }, instructions: { field2: "--" } },
500
+ { action: "merge", dstPath: "path1", doc: { field3: "value3" }, instructions: { field4: "--" } },
501
+ { action: "copy", srcPath: "path3", dstPath: "path4" },
502
+ { action: "merge", dstPath: "path2", doc: { field4: "value4" } },
503
+ { action: "merge", dstPath: "path7", doc: { field6: "value7" } },
504
+ ],
505
+ },
506
+ {
507
+ name: "logic 3",
508
+ timeFinished: firebase_admin_1.firestore.Timestamp.now(),
509
+ status: "finished",
510
+ documents: [
511
+ { action: "copy", srcPath: "path5", dstPath: "path6" },
512
+ { action: "delete", dstPath: "path7" },
513
+ { action: "delete", dstPath: "path7" },
514
+ { action: "copy", srcPath: "path3", dstPath: "path4" },
515
+ ],
516
+ },
517
+ {
518
+ name: "logic 4",
519
+ timeFinished: firebase_admin_1.firestore.Timestamp.now(),
520
+ status: "finished",
521
+ documents: [
522
+ { action: "delete", dstPath: "path2" },
523
+ { action: "copy", srcPath: "path3", dstPath: "path7" },
524
+ ],
525
+ },
526
+ ];
527
+ // Mock console.warn
528
+ const consoleWarnSpy = jest.spyOn(console, "warn").mockImplementation(jest.fn());
529
+ // Act
530
+ const result = (0, index_utils_1.consolidateAndGroupByDstPath)(logicResults);
531
+ // Assert
532
+ const expectedResult = new Map([
533
+ ["path1", { action: "merge", dstPath: "path1", doc: { field1: "value1a", field3: "value3" }, instructions: { field2: "--", field4: "--" } }],
534
+ ["path2", { action: "delete", dstPath: "path2" }],
535
+ ["path4", { action: "copy", srcPath: "path3", dstPath: "path4" }],
536
+ ["path6", { action: "copy", srcPath: "path5", dstPath: "path6" }],
537
+ ["path7", { action: "copy", srcPath: "path3", dstPath: "path7" }],
538
+ ]);
539
+ expect(result).toEqual(expectedResult);
540
+ // Verify that console.warn was called
541
+ expect(consoleWarnSpy).toHaveBeenCalledTimes(8);
542
+ // Verify that console.warn was called with the correct message
543
+ expect(consoleWarnSpy.mock.calls[0][0]).toBe("Overwriting key \"field1\" in doc for dstPath \"path1\"");
544
+ expect(consoleWarnSpy.mock.calls[1][0]).toBe("Overwriting key \"field2\" in instructions for dstPath \"path1\"");
545
+ expect(consoleWarnSpy.mock.calls[2][0]).toBe("Action \"merge\" ignored because a \"delete\" for dstPath \"path2\" already exists");
546
+ expect(consoleWarnSpy.mock.calls[3][0]).toBe("Action \"merge\" for dstPath \"path7\" is being overwritten by action \"delete\"");
547
+ expect(consoleWarnSpy.mock.calls[4][0]).toBe("Action \"delete\" ignored because a \"delete\" for dstPath \"path7\" already exists");
548
+ expect(consoleWarnSpy.mock.calls[5][0]).toBe("Action \"copy\" ignored because \"copy\" for dstPath \"path4\" already exists");
549
+ expect(consoleWarnSpy.mock.calls[6][0]).toBe("Action \"delete\" ignored because a \"delete\" for dstPath \"path2\" already exists");
550
+ expect(consoleWarnSpy.mock.calls[7][0]).toBe("Action \"delete\" for dstPath \"path7\" is being replaced by action \"copy\"");
551
+ // Cleanup
552
+ consoleWarnSpy.mockRestore();
553
+ });
554
+ });
555
+ describe("runViewLogics", () => {
556
+ // Define mock functions
557
+ const viewLogicFn1 = jest.fn();
558
+ const viewLogicFn2 = jest.fn();
559
+ const customViewLogicsConfig = [
560
+ {
561
+ name: "logic 1",
562
+ entity: "user",
563
+ modifiedFields: ["sampleField1", "sampleField2"],
564
+ viewLogicFn: viewLogicFn1,
565
+ },
566
+ {
567
+ name: "logic 2",
568
+ entity: "user",
569
+ modifiedFields: ["sampleField3"],
570
+ viewLogicFn: viewLogicFn2,
571
+ },
572
+ ];
573
+ beforeEach(() => {
574
+ jest.spyOn(index_utils_1._mockable, "getViewLogicsConfig").mockReturnValue(customViewLogicsConfig);
575
+ });
576
+ it("should run view logics properly", async () => {
577
+ const dstPathLogicDocsMap = new Map();
578
+ const logicResult1 = {
579
+ action: "merge",
580
+ doc: { name: "value1", sampleField2: "value2" },
581
+ dstPath: "users/user123",
582
+ };
583
+ const logicResult2 = {
584
+ action: "delete",
585
+ dstPath: "users/user124",
586
+ };
587
+ dstPathLogicDocsMap.set(logicResult1.dstPath, logicResult1);
588
+ dstPathLogicDocsMap.set(logicResult2.dstPath, logicResult2);
589
+ viewLogicFn1.mockResolvedValue({});
590
+ viewLogicFn2.mockResolvedValue({});
591
+ const results = await (0, index_utils_1.runViewLogics)(dstPathLogicDocsMap);
592
+ expect(viewLogicFn1).toHaveBeenCalledTimes(2);
593
+ expect(viewLogicFn1.mock.calls[0][0]).toBe(logicResult1);
594
+ expect(viewLogicFn1.mock.calls[1][0]).toBe(logicResult2);
595
+ expect(viewLogicFn2).toHaveBeenCalledTimes(1);
596
+ expect(viewLogicFn2).toHaveBeenCalledWith(logicResult2);
597
+ expect(results).toHaveLength(3);
598
+ });
599
+ });
600
+ //# sourceMappingURL=index-utils.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-utils.test.js","sourceRoot":"","sources":["../../src/tests/index-utils.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};