@arrai-innovations/reactive-helpers 1.0.0

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 (53) hide show
  1. package/.circleci/config.yml +91 -0
  2. package/.commitlintrc.json +3 -0
  3. package/.editorconfig +5 -0
  4. package/.eslintignore +2 -0
  5. package/.eslintrc.js +26 -0
  6. package/.husky/commit-msg +2 -0
  7. package/.husky/pre-commit +2 -0
  8. package/.idea/encodings.xml +6 -0
  9. package/.idea/inspectionProfiles/Project_Default.xml +6 -0
  10. package/.idea/modules.xml +8 -0
  11. package/.idea/prettier.xml +8 -0
  12. package/.idea/reactive-helpers.iml +15 -0
  13. package/.lintstagedrc +11 -0
  14. package/.prettierignore +4 -0
  15. package/.prettierrc.js +5 -0
  16. package/README.md +598 -0
  17. package/babel.config.js +15 -0
  18. package/index.js +2 -0
  19. package/jest.config.mjs +27 -0
  20. package/package.json +59 -0
  21. package/tests/unit/.eslintrc.js +10 -0
  22. package/tests/unit/expectHelpers.js +6 -0
  23. package/tests/unit/mockOnUnmounted.js +9 -0
  24. package/tests/unit/use/index.spec.js +18 -0
  25. package/tests/unit/use/listFilter.spec.js +332 -0
  26. package/tests/unit/use/listInstance.spec.js +424 -0
  27. package/tests/unit/use/listRelated.spec.js +73 -0
  28. package/tests/unit/use/listSort.spec.js +220 -0
  29. package/tests/unit/use/listSubscription.spec.js +540 -0
  30. package/tests/unit/use/objectInstance.spec.js +897 -0
  31. package/tests/unit/use/objectSubscription.spec.js +671 -0
  32. package/tests/unit/use/search.spec.js +67 -0
  33. package/tests/unit/use/watches.spec.js +252 -0
  34. package/tests/unit/utils/assignReactiveObject.spec.js +127 -0
  35. package/tests/unit/utils/index.spec.js +18 -0
  36. package/tests/unit/utils/keyDiff.spec.js +67 -0
  37. package/tests/unit/utils/set.spec.js +68 -0
  38. package/tests/unit/utils/unrefAndToRawDeep.spec.js +170 -0
  39. package/use/index.js +8 -0
  40. package/use/listFilter.js +157 -0
  41. package/use/listInstance.js +144 -0
  42. package/use/listRelated.js +135 -0
  43. package/use/listSort.js +190 -0
  44. package/use/listSubscription.js +143 -0
  45. package/use/objectInstance.js +222 -0
  46. package/use/objectSubscription.js +188 -0
  47. package/use/search.js +104 -0
  48. package/utils/assignReactiveObject.js +62 -0
  49. package/utils/index.js +5 -0
  50. package/utils/keyDiff.js +10 -0
  51. package/utils/set.js +48 -0
  52. package/utils/unrefAndToRawDeep.js +49 -0
  53. package/utils/watches.js +170 -0
@@ -0,0 +1,897 @@
1
+ import flushPromises from "flush-promises";
2
+ import { nextTick } from "vue";
3
+ import { assignReactiveObject } from "../../../utils";
4
+ import { expectErrorToBeNull } from "../expectHelpers";
5
+ import { inspect } from "util";
6
+
7
+ afterAll(() => {
8
+ jest.restoreAllMocks();
9
+ });
10
+
11
+ describe("use/objectInstance.js", function () {
12
+ let useObjectInstance, ObjectError, useObjectInstances;
13
+ beforeAll(async () => {
14
+ const imported = await import("../../../use/objectInstance");
15
+ useObjectInstance = imported.useObjectInstance;
16
+ ObjectError = imported.ObjectError;
17
+ useObjectInstances = imported.useObjectInstances;
18
+ });
19
+ afterEach(function () {
20
+ jest.resetAllMocks();
21
+ });
22
+ const crudRetrieveResolved = {
23
+ id: 1,
24
+ __str__: "asdf",
25
+ name: "zxcv",
26
+ };
27
+ const crudRetrieveRejected = {
28
+ errors: ["Not found"],
29
+ data: null,
30
+ action: "retrieve",
31
+ response_status: 404,
32
+ request_id: "60799141-959a-4ff7-80bc-1ad6b805a8fd",
33
+ };
34
+ const crudCreateResolved = {
35
+ id: 1,
36
+ __str__: "qwer",
37
+ name: "qwer",
38
+ };
39
+ const crudCreateRejected = {
40
+ errors: [
41
+ {
42
+ name: ["Test object with this name already exists."],
43
+ },
44
+ ],
45
+ data: null,
46
+ action: "create",
47
+ response_status: 400,
48
+ request_id: "60799141-959a-4ff7-80bc-1ad6b805a8fd",
49
+ };
50
+ const crudUpdateResolved = {
51
+ id: 1,
52
+ __str__: "asdf!",
53
+ name: "zxcv!",
54
+ };
55
+ const crudUpdateRejected = {
56
+ errors: [
57
+ {
58
+ name: ["Test object with this name already exists."],
59
+ },
60
+ ],
61
+ data: null,
62
+ action: "update",
63
+ response_status: 400,
64
+ request_id: "60799141-959a-4ff7-80bc-1ad6b805a8fd",
65
+ };
66
+ const crudPatchResolved = {
67
+ id: 1,
68
+ __str__: "asdf!",
69
+ name: "zxcv!",
70
+ };
71
+ const crudPatchRejected = {
72
+ errors: [
73
+ {
74
+ name: ["Test object with this name already exists."],
75
+ },
76
+ ],
77
+ data: null,
78
+ action: "patch",
79
+ response_status: 400,
80
+ request_id: "60799141-959a-4ff7-80bc-1ad6b805a8fd",
81
+ };
82
+ const crudDeleteResolved = {
83
+ errors: [],
84
+ data: null,
85
+ action: "delete",
86
+ response_status: 204,
87
+ request_id: "454619de-6687-4664-ad2a-67cdb393eb70",
88
+ };
89
+ const crudDeleteRejected = {
90
+ errors: ["You cannot delete this object at this time."],
91
+ data: null,
92
+ action: "delete",
93
+ response_status: 400,
94
+ request_id: "454619de-6687-4664-ad2a-67cdb393eb70",
95
+ };
96
+ const fields = ["id", "__str__", "name"];
97
+ describe("retrieve", function () {
98
+ it("success", async function () {
99
+ const objectInstance = useObjectInstance({
100
+ crudArgs: { stream: "test_stream" },
101
+ });
102
+ objectInstance.state.objectInstanceCrud.retrieve = jest.fn();
103
+ let crudRetrieveResolve;
104
+ const crudRetrievePromise = new Promise((resolve) => {
105
+ crudRetrieveResolve = resolve;
106
+ });
107
+ objectInstance.state.objectInstanceCrud.retrieve.mockReturnValueOnce(crudRetrievePromise);
108
+
109
+ expectErrorToBeNull(objectInstance.state.error);
110
+ expect(objectInstance.state.errored).toBe(false);
111
+ expect(objectInstance.state.loading).toBeUndefined();
112
+ expect({ ...objectInstance.state.object }).toEqual({});
113
+ const oiRetrieveResolve = objectInstance.retrieve({ id: 1, fields });
114
+ expectErrorToBeNull(objectInstance.state.error);
115
+ expect(objectInstance.state.errored).toBe(false);
116
+ expect(objectInstance.state.loading).toBe(true);
117
+ expect({ ...objectInstance.state.object }).toEqual({});
118
+ await nextTick();
119
+ crudRetrieveResolve(crudRetrieveResolved);
120
+ await flushPromises();
121
+ expectErrorToBeNull(objectInstance.state.error);
122
+ expect(objectInstance.state.errored).toBe(false);
123
+ expect(objectInstance.state.loading).toBe(false);
124
+ expect({ ...objectInstance.state.object }).toEqual(crudRetrieveResolved);
125
+ expect(objectInstance.state.objectInstanceCrud.retrieve).toHaveBeenCalledWith({
126
+ crudArgs: { stream: "test_stream" },
127
+ id: 1,
128
+ retrieveArgs: { fields: ["id", "__str__", "name"] },
129
+ });
130
+ expect(objectInstance.state.objectInstanceCrud.retrieve).toHaveBeenCalledTimes(1);
131
+ await nextTick();
132
+ await expect(oiRetrieveResolve).resolves.toBe(true);
133
+ });
134
+ it("success (defaultRetrieveArgs)", async function () {
135
+ const objectInstance = useObjectInstance({
136
+ crudArgs: { stream: "test_stream" },
137
+ retrieveArgs: { fields },
138
+ });
139
+ objectInstance.state.objectInstanceCrud.retrieve = jest.fn();
140
+ let crudRetrieveResolve;
141
+ const crudRetrievePromise = new Promise((resolve) => {
142
+ crudRetrieveResolve = resolve;
143
+ });
144
+ objectInstance.state.objectInstanceCrud.retrieve.mockReturnValueOnce(crudRetrievePromise);
145
+ expectErrorToBeNull(objectInstance.state.error);
146
+ expect(objectInstance.state.errored).toBe(false);
147
+ expect(objectInstance.state.loading).toBeUndefined();
148
+ expect({ ...objectInstance.state.object }).toEqual({});
149
+ const oiRetrieveResolve = objectInstance.retrieve({ id: 1 });
150
+ expectErrorToBeNull(objectInstance.state.error);
151
+ expect(objectInstance.state.errored).toBe(false);
152
+ expect(objectInstance.state.loading).toBe(true);
153
+ expect({ ...objectInstance.state.object }).toEqual({});
154
+ crudRetrieveResolve(crudRetrieveResolved);
155
+ await flushPromises();
156
+ expectErrorToBeNull(objectInstance.state.error);
157
+ expect(objectInstance.state.errored).toBe(false);
158
+ expect(objectInstance.state.loading).toBe(false);
159
+ expect({ ...objectInstance.state.object }).toEqual(crudRetrieveResolved);
160
+ expect(objectInstance.state.objectInstanceCrud.retrieve).toHaveBeenCalledWith({
161
+ crudArgs: { stream: "test_stream" },
162
+ id: 1,
163
+ retrieveArgs: { fields: ["id", "__str__", "name"] },
164
+ });
165
+ expect(objectInstance.state.objectInstanceCrud.retrieve).toHaveBeenCalledTimes(1);
166
+ const returnValue = await oiRetrieveResolve;
167
+ expect(returnValue).toBe(true);
168
+ });
169
+ it("errored", async function () {
170
+ const objectInstance = useObjectInstance({
171
+ crudArgs: { stream: "test_stream" },
172
+ });
173
+ objectInstance.state.objectInstanceCrud.retrieve = jest.fn();
174
+ let crudRetrieveReject;
175
+ const crudRetrievePromise = new Promise((resolve, reject) => {
176
+ crudRetrieveReject = reject;
177
+ });
178
+ objectInstance.state.objectInstanceCrud.retrieve.mockReturnValueOnce(crudRetrievePromise);
179
+ expectErrorToBeNull(objectInstance.state.error);
180
+ expect(objectInstance.state.errored).toBe(false);
181
+ expect(objectInstance.state.loading).toBeUndefined();
182
+ expect({ ...objectInstance.state.object }).toEqual({});
183
+ const oiRetrieveResolve = objectInstance.retrieve({ id: 1, fields });
184
+ expectErrorToBeNull(objectInstance.state.error);
185
+ expect(objectInstance.state.errored).toBe(false);
186
+ expect(objectInstance.state.loading).toBe(true);
187
+ expect({ ...objectInstance.state.object }).toEqual({});
188
+ crudRetrieveReject(crudRetrieveRejected);
189
+ await flushPromises();
190
+ expect(objectInstance.state.error).toEqual(crudRetrieveRejected);
191
+ expect(objectInstance.state.errored).toBe(true);
192
+ expect(objectInstance.state.loading).toBe(false);
193
+ expect({ ...objectInstance.state.object }).toEqual({});
194
+ expect(objectInstance.state.objectInstanceCrud.retrieve).toHaveBeenCalledWith({
195
+ crudArgs: { stream: "test_stream" },
196
+ id: 1,
197
+ retrieveArgs: { fields: ["id", "__str__", "name"] },
198
+ });
199
+ expect(objectInstance.state.objectInstanceCrud.retrieve).toHaveBeenCalledTimes(1);
200
+ const returnValue = await oiRetrieveResolve;
201
+ expect(returnValue).toBe(false);
202
+ });
203
+ it("already loading", async function () {
204
+ const objectInstance = useObjectInstance({
205
+ crudArgs: { stream: "test_stream" },
206
+ });
207
+ objectInstance.state.objectInstanceCrud.retrieve = jest.fn();
208
+ objectInstance.state.objectInstanceCrud.retrieve.mockImplementation(() => new Promise(() => {}));
209
+ expectErrorToBeNull(objectInstance.state.error);
210
+ expect(objectInstance.state.errored).toBe(false);
211
+ expect(objectInstance.state.loading).toBeUndefined();
212
+ expect({ ...objectInstance.state.object }).toEqual({});
213
+ objectInstance.retrieve({ id: 1, fields });
214
+ await expect(() => objectInstance.retrieve({ id: 1, fields })).rejects.toThrow(ObjectError);
215
+ expect(objectInstance.state.objectInstanceCrud.retrieve).toHaveBeenCalledWith({
216
+ crudArgs: { stream: "test_stream" },
217
+ id: 1,
218
+ retrieveArgs: { fields: ["id", "__str__", "name"] },
219
+ });
220
+ expect(objectInstance.state.objectInstanceCrud.retrieve).toHaveBeenCalledTimes(1);
221
+ expectErrorToBeNull(objectInstance.state.error);
222
+ expect(objectInstance.state.errored).toBe(false);
223
+ expect(objectInstance.state.loading).toBe(true);
224
+ expect({ ...objectInstance.state.object }).toEqual({});
225
+ });
226
+ });
227
+ describe("create", function () {
228
+ it("success", async function () {
229
+ const objectInstance = useObjectInstance({
230
+ crudArgs: { stream: "test_stream" },
231
+ });
232
+ objectInstance.state.objectInstanceCrud.create = jest.fn();
233
+ let crudCreateResolve;
234
+ const crudCreatePromise = new Promise((resolve) => {
235
+ crudCreateResolve = resolve;
236
+ });
237
+ objectInstance.state.objectInstanceCrud.create.mockReturnValueOnce(crudCreatePromise);
238
+ expectErrorToBeNull(objectInstance.state.error);
239
+ expect(objectInstance.state.errored).toBe(false);
240
+ expect(objectInstance.state.loading).toBeUndefined();
241
+ expect({ ...objectInstance.state.object }).toEqual({});
242
+ const oiCreateResolve = objectInstance.create({
243
+ object: {
244
+ name: "qwer",
245
+ },
246
+ fields,
247
+ });
248
+ expectErrorToBeNull(objectInstance.state.error);
249
+ expect(objectInstance.state.errored).toBe(false);
250
+ expect(objectInstance.state.loading).toBe(true);
251
+ expect({ ...objectInstance.state.object }).toEqual({});
252
+ await nextTick();
253
+ crudCreateResolve(crudCreateResolved);
254
+ await flushPromises();
255
+ expectErrorToBeNull(objectInstance.state.error);
256
+ expect(objectInstance.state.errored).toBe(false);
257
+ expect(objectInstance.state.loading).toBe(false);
258
+ expect({ ...objectInstance.state.object }).toEqual(crudCreateResolved);
259
+ expect(objectInstance.state.objectInstanceCrud.create).toHaveBeenCalledWith({
260
+ crudArgs: {
261
+ stream: "test_stream",
262
+ },
263
+ object: {
264
+ name: "qwer",
265
+ },
266
+ retrieveArgs: { fields: ["id", "__str__", "name"] },
267
+ });
268
+ expect(objectInstance.state.objectInstanceCrud.create).toHaveBeenCalledTimes(1);
269
+ await nextTick();
270
+ await expect(oiCreateResolve).resolves.toBe(true);
271
+ });
272
+ it("success (defaultRetrieveArgs)", async function () {
273
+ const objectInstance = useObjectInstance({
274
+ crudArgs: { stream: "test_stream" },
275
+ retrieveArgs: { fields },
276
+ });
277
+ objectInstance.state.objectInstanceCrud.create = jest.fn();
278
+ let crudCreateResolve;
279
+ const crudCreatePromise = new Promise((resolve) => {
280
+ crudCreateResolve = resolve;
281
+ });
282
+ objectInstance.state.objectInstanceCrud.create.mockReturnValueOnce(crudCreatePromise);
283
+ expectErrorToBeNull(objectInstance.state.error);
284
+ expect(objectInstance.state.errored).toBe(false);
285
+ expect(objectInstance.state.loading).toBeUndefined();
286
+ expect({ ...objectInstance.state.object }).toEqual({});
287
+ const oiCreateResolve = objectInstance.create({
288
+ object: {
289
+ name: "qwer",
290
+ },
291
+ });
292
+ expectErrorToBeNull(objectInstance.state.error);
293
+ expect(objectInstance.state.errored).toBe(false);
294
+ expect(objectInstance.state.loading).toBe(true);
295
+ expect({ ...objectInstance.state.object }).toEqual({});
296
+ crudCreateResolve(crudCreateResolved);
297
+ await flushPromises();
298
+ expectErrorToBeNull(objectInstance.state.error);
299
+ expect(objectInstance.state.errored).toBe(false);
300
+ expect(objectInstance.state.loading).toBe(false);
301
+ expect({ ...objectInstance.state.object }).toEqual(crudCreateResolved);
302
+ expect(objectInstance.state.objectInstanceCrud.create).toHaveBeenCalledWith({
303
+ crudArgs: {
304
+ stream: "test_stream",
305
+ },
306
+ object: {
307
+ name: "qwer",
308
+ },
309
+ retrieveArgs: { fields: ["id", "__str__", "name"] },
310
+ });
311
+ expect(objectInstance.state.objectInstanceCrud.create).toHaveBeenCalledTimes(1);
312
+ const returnValue = await oiCreateResolve;
313
+ expect(returnValue).toBe(true);
314
+ });
315
+ it("errored", async function () {
316
+ const objectInstance = useObjectInstance({
317
+ crudArgs: { stream: "test_stream" },
318
+ });
319
+ objectInstance.state.objectInstanceCrud.create = jest.fn();
320
+ let crudCreateReject;
321
+ const crudCreatePromise = new Promise((resolve, reject) => {
322
+ crudCreateReject = reject;
323
+ });
324
+ objectInstance.state.objectInstanceCrud.create.mockReturnValueOnce(crudCreatePromise);
325
+ expectErrorToBeNull(objectInstance.state.error);
326
+ expect(objectInstance.state.errored).toBe(false);
327
+ expect(objectInstance.state.loading).toBeUndefined();
328
+ expect({ ...objectInstance.state.object }).toEqual({});
329
+ const oiCreateResolve = objectInstance.create({
330
+ object: {
331
+ name: "qwer",
332
+ },
333
+ fields,
334
+ });
335
+ expectErrorToBeNull(objectInstance.state.error);
336
+ expect(objectInstance.state.errored).toBe(false);
337
+ expect(objectInstance.state.loading).toBe(true);
338
+ expect({ ...objectInstance.state.object }).toEqual({});
339
+ crudCreateReject(crudCreateRejected);
340
+ await flushPromises();
341
+ expect(objectInstance.state.error).toEqual(crudCreateRejected);
342
+ expect(objectInstance.state.errored).toBe(true);
343
+ expect(objectInstance.state.loading).toBe(false);
344
+ expect({ ...objectInstance.state.object }).toEqual({});
345
+ expect(objectInstance.state.objectInstanceCrud.create).toHaveBeenCalledWith({
346
+ crudArgs: {
347
+ stream: "test_stream",
348
+ },
349
+ object: {
350
+ name: "qwer",
351
+ },
352
+ retrieveArgs: { fields: ["id", "__str__", "name"] },
353
+ });
354
+ expect(objectInstance.state.objectInstanceCrud.create).toHaveBeenCalledTimes(1);
355
+ const returnValue = await oiCreateResolve;
356
+ expect(returnValue).toBe(false);
357
+ });
358
+ it("already loading", async function () {
359
+ const objectInstance = useObjectInstance({
360
+ crudArgs: { stream: "test_stream" },
361
+ });
362
+ objectInstance.state.objectInstanceCrud.create = jest.fn();
363
+ const crudCreatePromise = new Promise(() => {});
364
+ objectInstance.state.objectInstanceCrud.create.mockReturnValueOnce(crudCreatePromise);
365
+ expectErrorToBeNull(objectInstance.state.error);
366
+ expect(objectInstance.state.errored).toBe(false);
367
+ expect(objectInstance.state.loading).toBeUndefined();
368
+ expect({ ...objectInstance.state.object }).toEqual({});
369
+ objectInstance.create({
370
+ object: {
371
+ name: "qwer",
372
+ },
373
+ fields,
374
+ });
375
+ await expect(() =>
376
+ objectInstance.create({
377
+ object: {
378
+ name: "qwer",
379
+ },
380
+ fields,
381
+ })
382
+ ).rejects.toThrow(ObjectError);
383
+ expect(objectInstance.state.objectInstanceCrud.create).toHaveBeenCalledWith({
384
+ crudArgs: {
385
+ stream: "test_stream",
386
+ },
387
+ object: {
388
+ name: "qwer",
389
+ },
390
+ retrieveArgs: { fields: ["id", "__str__", "name"] },
391
+ });
392
+ expect(objectInstance.state.objectInstanceCrud.create).toHaveBeenCalledTimes(1);
393
+ expectErrorToBeNull(objectInstance.state.error);
394
+ expect(objectInstance.state.errored).toBe(false);
395
+ expect(objectInstance.state.loading).toBe(true);
396
+ expect({ ...objectInstance.state.object }).toEqual({});
397
+ });
398
+ });
399
+ describe("update", function () {
400
+ it("success", async function () {
401
+ const objectInstance = useObjectInstance({
402
+ crudArgs: { stream: "test_stream" },
403
+ });
404
+ let crudUpdateResolve;
405
+ const crudUpdatePromise = new Promise((resolve) => {
406
+ crudUpdateResolve = resolve;
407
+ });
408
+ objectInstance.state.objectInstanceCrud.update = jest.fn();
409
+ objectInstance.state.objectInstanceCrud.update.mockReturnValueOnce(crudUpdatePromise);
410
+ expectErrorToBeNull(objectInstance.state.error);
411
+ expect(objectInstance.state.errored).toBe(false);
412
+ expect(objectInstance.state.loading).toBeUndefined();
413
+ expect({ ...objectInstance.state.object }).toEqual({});
414
+ const oiUpdatePromise = objectInstance.update({
415
+ object: {
416
+ id: 1,
417
+ name: "zxcv!",
418
+ },
419
+ fields,
420
+ });
421
+ expectErrorToBeNull(objectInstance.state.error);
422
+ expect(objectInstance.state.errored).toBe(false);
423
+ expect(objectInstance.state.loading).toBe(true);
424
+ expect({ ...objectInstance.state.object }).toEqual({});
425
+ await nextTick();
426
+ crudUpdateResolve(crudUpdateResolved);
427
+ await flushPromises();
428
+ expectErrorToBeNull(objectInstance.state.error);
429
+ expect(objectInstance.state.errored).toBe(false);
430
+ expect(objectInstance.state.loading).toBe(false);
431
+ expect({ ...objectInstance.state.object }).toEqual(crudUpdateResolved);
432
+ await nextTick();
433
+ await expect(oiUpdatePromise).resolves.toBe(true);
434
+ expect(objectInstance.state.objectInstanceCrud.update).toHaveBeenCalledWith({
435
+ crudArgs: {
436
+ stream: "test_stream",
437
+ },
438
+ object: {
439
+ id: 1,
440
+ name: "zxcv!",
441
+ },
442
+ retrieveArgs: { fields: ["id", "__str__", "name"] },
443
+ });
444
+ expect(objectInstance.state.objectInstanceCrud.update).toHaveBeenCalledTimes(1);
445
+ });
446
+ it("success (defaultRetrieveArgs)", async function () {
447
+ const objectInstance = useObjectInstance({
448
+ crudArgs: { stream: "test_stream" },
449
+ retrieveArgs: { fields },
450
+ });
451
+ let crudUpdateResolve;
452
+ const crudUpdatePromise = new Promise((resolve) => {
453
+ crudUpdateResolve = resolve;
454
+ });
455
+ objectInstance.state.objectInstanceCrud.update = jest.fn();
456
+ objectInstance.state.objectInstanceCrud.update.mockReturnValueOnce(crudUpdatePromise);
457
+ expectErrorToBeNull(objectInstance.state.error);
458
+ expect(objectInstance.state.errored).toBe(false);
459
+ expect(objectInstance.state.loading).toBeUndefined();
460
+ expect({ ...objectInstance.state.object }).toEqual({});
461
+ const oiUpdatePromise = objectInstance.update({
462
+ object: {
463
+ id: 1,
464
+ name: "zxcv!",
465
+ },
466
+ });
467
+ expectErrorToBeNull(objectInstance.state.error);
468
+ expect(objectInstance.state.errored).toBe(false);
469
+ expect(objectInstance.state.loading).toBe(true);
470
+ expect({ ...objectInstance.state.object }).toEqual({});
471
+ crudUpdateResolve(crudUpdateResolved);
472
+ await flushPromises();
473
+ expectErrorToBeNull(objectInstance.state.error);
474
+ expect(objectInstance.state.errored).toBe(false);
475
+ expect(objectInstance.state.loading).toBe(false);
476
+ expect({ ...objectInstance.state.object }).toEqual(crudUpdateResolved);
477
+ await expect(oiUpdatePromise).resolves.toBe(true);
478
+ expect(objectInstance.state.objectInstanceCrud.update).toHaveBeenCalledWith({
479
+ crudArgs: {
480
+ stream: "test_stream",
481
+ },
482
+ object: {
483
+ id: 1,
484
+ name: "zxcv!",
485
+ },
486
+ retrieveArgs: { fields: ["id", "__str__", "name"] },
487
+ });
488
+ expect(objectInstance.state.objectInstanceCrud.update).toHaveBeenCalledTimes(1);
489
+ });
490
+ it("errored", async function () {
491
+ const objectInstance = useObjectInstance({
492
+ crudArgs: { stream: "test_stream" },
493
+ });
494
+ let crudUpdateReject;
495
+ const crudUpdatePromise = new Promise((resolve, reject) => {
496
+ crudUpdateReject = reject;
497
+ });
498
+ objectInstance.state.objectInstanceCrud.update = jest.fn();
499
+ objectInstance.state.objectInstanceCrud.update.mockReturnValueOnce(crudUpdatePromise);
500
+ expectErrorToBeNull(objectInstance.state.error);
501
+ expect(objectInstance.state.errored).toBe(false);
502
+ expect(objectInstance.state.loading).toBeUndefined();
503
+ expect({ ...objectInstance.state.object }).toEqual({});
504
+ const oiUpdatePromise = objectInstance.update({
505
+ object: {
506
+ id: 1,
507
+ name: "zxcv!",
508
+ },
509
+ fields,
510
+ });
511
+ expectErrorToBeNull(objectInstance.state.error);
512
+ expect(objectInstance.state.errored).toBe(false);
513
+ expect(objectInstance.state.loading).toBe(true);
514
+ expect({ ...objectInstance.state.object }).toEqual({});
515
+ crudUpdateReject(crudUpdateRejected);
516
+ await flushPromises();
517
+ expect(objectInstance.state.error).toEqual(crudUpdateRejected);
518
+ expect(objectInstance.state.errored).toBe(true);
519
+ expect(objectInstance.state.loading).toBe(false);
520
+ expect({ ...objectInstance.state.object }).toEqual({});
521
+ await expect(oiUpdatePromise).resolves.toBe(false);
522
+ expect(objectInstance.state.objectInstanceCrud.update).toHaveBeenCalledWith({
523
+ crudArgs: {
524
+ stream: "test_stream",
525
+ },
526
+ object: {
527
+ id: 1,
528
+ name: "zxcv!",
529
+ },
530
+ retrieveArgs: { fields: ["id", "__str__", "name"] },
531
+ });
532
+ expect(objectInstance.state.objectInstanceCrud.update).toHaveBeenCalledTimes(1);
533
+ });
534
+ it("already loading", async function () {
535
+ const objectInstance = useObjectInstance({
536
+ crudArgs: { stream: "test_stream" },
537
+ });
538
+ const crudUpdatePromise = new Promise(() => {});
539
+ objectInstance.state.objectInstanceCrud.update = jest.fn();
540
+ objectInstance.state.objectInstanceCrud.update.mockReturnValueOnce(crudUpdatePromise);
541
+ expectErrorToBeNull(objectInstance.state.error);
542
+ expect(objectInstance.state.errored).toBe(false);
543
+ expect(objectInstance.state.loading).toBeUndefined();
544
+ expect({ ...objectInstance.state.object }).toEqual({});
545
+ objectInstance.update({
546
+ object: {
547
+ id: 1,
548
+ name: "zxcv!",
549
+ },
550
+ fields,
551
+ });
552
+ await expect(() =>
553
+ objectInstance.update({
554
+ object: {
555
+ id: 1,
556
+ name: "zxcv!",
557
+ },
558
+ fields,
559
+ })
560
+ ).rejects.toThrow(ObjectError);
561
+ expectErrorToBeNull(objectInstance.state.error);
562
+ expect(objectInstance.state.errored).toBe(false);
563
+ expect(objectInstance.state.loading).toBe(true);
564
+ expect({ ...objectInstance.state.object }).toEqual({});
565
+ expect(objectInstance.state.objectInstanceCrud.update).toHaveBeenCalledWith({
566
+ crudArgs: {
567
+ stream: "test_stream",
568
+ },
569
+ object: {
570
+ id: 1,
571
+ name: "zxcv!",
572
+ },
573
+ retrieveArgs: { fields: ["id", "__str__", "name"] },
574
+ });
575
+ expect(objectInstance.state.objectInstanceCrud.update).toHaveBeenCalledTimes(1);
576
+ });
577
+ });
578
+ describe("patch", function () {
579
+ it("success", async function () {
580
+ const objectInstance = useObjectInstance({
581
+ crudArgs: { stream: "test_stream" },
582
+ });
583
+ let crudPatchResolve;
584
+ const crudPatchPromise = new Promise((resolve) => {
585
+ crudPatchResolve = resolve;
586
+ });
587
+ objectInstance.state.objectInstanceCrud.patch = jest.fn();
588
+ objectInstance.state.objectInstanceCrud.patch.mockReturnValueOnce(crudPatchPromise);
589
+ expectErrorToBeNull(objectInstance.state.error);
590
+ expect(objectInstance.state.errored).toBe(false);
591
+ expect(objectInstance.state.loading).toBeUndefined();
592
+ expect({ ...objectInstance.state.object }).toEqual({});
593
+ const oiPatchPromise = objectInstance.patch({
594
+ id: 1,
595
+ partialObject: {
596
+ id: 1,
597
+ name: "zxcv!",
598
+ },
599
+ fields,
600
+ });
601
+ expectErrorToBeNull(objectInstance.state.error);
602
+ expect(objectInstance.state.errored).toBe(false);
603
+ expect(objectInstance.state.loading).toBe(true);
604
+ expect({ ...objectInstance.state.object }).toEqual({});
605
+ await nextTick();
606
+ crudPatchResolve(crudPatchResolved);
607
+ await flushPromises();
608
+ expectErrorToBeNull(objectInstance.state.error);
609
+ expect(objectInstance.state.errored).toBe(false);
610
+ expect(objectInstance.state.loading).toBe(false);
611
+ expect({ ...objectInstance.state.object }).toEqual(crudPatchResolved);
612
+ await nextTick();
613
+ await expect(oiPatchPromise).resolves.toBe(true);
614
+ expect(objectInstance.state.objectInstanceCrud.patch).toHaveBeenCalledWith({
615
+ crudArgs: {
616
+ stream: "test_stream",
617
+ },
618
+ id: 1,
619
+ partialObject: {
620
+ id: 1,
621
+ name: "zxcv!",
622
+ },
623
+ retrieveArgs: { fields: ["id", "__str__", "name"] },
624
+ });
625
+ expect(objectInstance.state.objectInstanceCrud.patch).toHaveBeenCalledTimes(1);
626
+ });
627
+ it("success (defaultRetrieveArgs)", async function () {
628
+ const objectInstance = useObjectInstance({
629
+ crudArgs: { stream: "test_stream" },
630
+ retrieveArgs: { fields },
631
+ });
632
+ let crudPatchResolve;
633
+ const crudPatchPromise = new Promise((resolve) => {
634
+ crudPatchResolve = resolve;
635
+ });
636
+ objectInstance.state.objectInstanceCrud.patch = jest.fn();
637
+ objectInstance.state.objectInstanceCrud.patch.mockReturnValueOnce(crudPatchPromise);
638
+ expectErrorToBeNull(objectInstance.state.error);
639
+ expect(objectInstance.state.errored).toBe(false);
640
+ expect(objectInstance.state.loading).toBeUndefined();
641
+ expect({ ...objectInstance.state.object }).toEqual({});
642
+ const oiPatchPromise = objectInstance.patch({
643
+ id: 1,
644
+ partialObject: {
645
+ id: 1,
646
+ name: "zxcv!",
647
+ },
648
+ });
649
+ expectErrorToBeNull(objectInstance.state.error);
650
+ expect(objectInstance.state.errored).toBe(false);
651
+ expect(objectInstance.state.loading).toBe(true);
652
+ expect({ ...objectInstance.state.object }).toEqual({});
653
+ crudPatchResolve(crudPatchResolved);
654
+ await flushPromises();
655
+ expectErrorToBeNull(objectInstance.state.error);
656
+ expect(objectInstance.state.errored).toBe(false);
657
+ expect(objectInstance.state.loading).toBe(false);
658
+ expect({ ...objectInstance.state.object }).toEqual(crudPatchResolved);
659
+ await expect(oiPatchPromise).resolves.toBe(true);
660
+ expect(objectInstance.state.objectInstanceCrud.patch).toHaveBeenCalledWith({
661
+ crudArgs: {
662
+ stream: "test_stream",
663
+ },
664
+ id: 1,
665
+ partialObject: {
666
+ id: 1,
667
+ name: "zxcv!",
668
+ },
669
+ retrieveArgs: { fields: ["id", "__str__", "name"] },
670
+ });
671
+ expect(objectInstance.state.objectInstanceCrud.patch).toHaveBeenCalledTimes(1);
672
+ });
673
+ it("errored", async function () {
674
+ const objectInstance = useObjectInstance({
675
+ crudArgs: { stream: "test_stream" },
676
+ });
677
+ let crudPatchReject;
678
+ const crudPatchPromise = new Promise((resolve, reject) => {
679
+ crudPatchReject = reject;
680
+ });
681
+ objectInstance.state.objectInstanceCrud.patch = jest.fn();
682
+ objectInstance.state.objectInstanceCrud.patch.mockReturnValueOnce(crudPatchPromise);
683
+ expectErrorToBeNull(objectInstance.state.error);
684
+ expect(objectInstance.state.errored).toBe(false);
685
+ expect(objectInstance.state.loading).toBeUndefined();
686
+ expect({ ...objectInstance.state.object }).toEqual({});
687
+ const oiPatchPromise = objectInstance.patch({
688
+ id: 1,
689
+ partialObject: {
690
+ id: 1,
691
+ name: "zxcv!",
692
+ },
693
+ fields,
694
+ });
695
+ expectErrorToBeNull(objectInstance.state.error);
696
+ expect(objectInstance.state.errored).toBe(false);
697
+ expect(objectInstance.state.loading).toBe(true);
698
+ expect({ ...objectInstance.state.object }).toEqual({});
699
+ crudPatchReject(crudPatchRejected);
700
+ await flushPromises();
701
+ expect(objectInstance.state.error).toEqual(crudPatchRejected);
702
+ expect(objectInstance.state.errored).toBe(true);
703
+ expect(objectInstance.state.loading).toBe(false);
704
+ expect({ ...objectInstance.state.object }).toEqual({});
705
+ await expect(oiPatchPromise).resolves.toBe(false);
706
+ expect(objectInstance.state.objectInstanceCrud.patch).toHaveBeenCalledWith({
707
+ crudArgs: {
708
+ stream: "test_stream",
709
+ },
710
+ id: 1,
711
+ partialObject: {
712
+ id: 1,
713
+ name: "zxcv!",
714
+ },
715
+ retrieveArgs: { fields: ["id", "__str__", "name"] },
716
+ });
717
+ expect(objectInstance.state.objectInstanceCrud.patch).toHaveBeenCalledTimes(1);
718
+ });
719
+ it("already loading", async function () {
720
+ const objectInstance = useObjectInstance({
721
+ crudArgs: { stream: "test_stream" },
722
+ });
723
+ const crudPatchPromise = new Promise(() => {});
724
+ objectInstance.state.objectInstanceCrud.patch = jest.fn();
725
+ objectInstance.state.objectInstanceCrud.patch.mockReturnValueOnce(crudPatchPromise);
726
+ objectInstance.patch({
727
+ id: 1,
728
+ partialObject: {
729
+ id: 1,
730
+ name: "zxcv!",
731
+ },
732
+ fields,
733
+ });
734
+ await expect(() =>
735
+ objectInstance.patch({
736
+ id: 1,
737
+ partialObject: {
738
+ id: 1,
739
+ name: "zxcv!",
740
+ },
741
+ fields,
742
+ })
743
+ ).rejects.toThrow(ObjectError);
744
+ expect(objectInstance.state.objectInstanceCrud.patch).toHaveBeenCalledWith({
745
+ crudArgs: {
746
+ stream: "test_stream",
747
+ },
748
+ id: 1,
749
+ partialObject: {
750
+ id: 1,
751
+ name: "zxcv!",
752
+ },
753
+ retrieveArgs: { fields: ["id", "__str__", "name"] },
754
+ });
755
+ expect(objectInstance.state.objectInstanceCrud.patch).toHaveBeenCalledTimes(1);
756
+ });
757
+ });
758
+ describe("delete", function () {
759
+ it("success", async function () {
760
+ const objectInstance = useObjectInstance({
761
+ crudArgs: { stream: "test_stream" },
762
+ });
763
+ assignReactiveObject(objectInstance.state.object, crudRetrieveResolved);
764
+ let deleteResolve;
765
+ const deletePromise = new Promise((resolve) => {
766
+ deleteResolve = resolve;
767
+ });
768
+ objectInstance.state.objectInstanceCrud.delete = jest.fn();
769
+ objectInstance.state.objectInstanceCrud.delete.mockReturnValueOnce(deletePromise);
770
+
771
+ expectErrorToBeNull(objectInstance.state.error);
772
+ expect(objectInstance.state.errored).toBe(false);
773
+ expect(objectInstance.state.loading).toBeUndefined();
774
+ expect(objectInstance.state.deleted).toBe(false);
775
+ expect({ ...objectInstance.state.object }).toEqual(crudRetrieveResolved);
776
+
777
+ const returnsPromise = objectInstance.delete(1);
778
+
779
+ expectErrorToBeNull(objectInstance.state.error);
780
+ expect(objectInstance.state.errored).toBe(false);
781
+ expect(objectInstance.state.loading).toBe(true);
782
+ expect(objectInstance.state.deleted).toBe(false);
783
+ expect({ ...objectInstance.state.object }).toEqual(crudRetrieveResolved);
784
+ await nextTick();
785
+
786
+ deleteResolve(crudDeleteResolved);
787
+ await flushPromises();
788
+
789
+ expectErrorToBeNull(objectInstance.state.error);
790
+ expect(objectInstance.state.errored).toBe(false);
791
+ expect(objectInstance.state.loading).toBe(false);
792
+ expect(objectInstance.state.deleted).toBe(true);
793
+ expect({ ...objectInstance.state.object }).toEqual({});
794
+ await nextTick();
795
+
796
+ await expect(returnsPromise).resolves.toBe(true);
797
+ expect(objectInstance.state.objectInstanceCrud.delete).toHaveBeenCalledWith({
798
+ crudArgs: { stream: "test_stream" },
799
+ id: 1,
800
+ });
801
+ expect(objectInstance.state.objectInstanceCrud.delete).toHaveBeenCalledTimes(1);
802
+ });
803
+ it("errored", async function () {
804
+ const objectInstance = useObjectInstance({
805
+ crudArgs: { stream: "test_stream" },
806
+ });
807
+ assignReactiveObject(objectInstance.state.object, crudRetrieveResolved);
808
+ let deleteReject;
809
+ const deletePromise = new Promise((resolve, reject) => {
810
+ deleteReject = reject;
811
+ });
812
+ objectInstance.state.objectInstanceCrud.delete = jest.fn();
813
+ objectInstance.state.objectInstanceCrud.delete.mockReturnValueOnce(deletePromise);
814
+
815
+ expectErrorToBeNull(objectInstance.state.error);
816
+ expect(objectInstance.state.errored).toBe(false);
817
+ expect(objectInstance.state.loading).toBeUndefined();
818
+ expect(objectInstance.state.deleted).toBe(false);
819
+ expect({ ...objectInstance.state.object }).toEqual(crudRetrieveResolved);
820
+
821
+ const returnsPromise = objectInstance.delete(1);
822
+
823
+ expectErrorToBeNull(objectInstance.state.error);
824
+ expect(objectInstance.state.errored).toBe(false);
825
+ expect(objectInstance.state.loading).toBe(true);
826
+ expect(objectInstance.state.deleted).toBe(false);
827
+ expect({ ...objectInstance.state.object }).toEqual(crudRetrieveResolved);
828
+ await nextTick();
829
+
830
+ deleteReject(crudDeleteRejected);
831
+ await flushPromises();
832
+
833
+ expect(objectInstance.state.error).toEqual(crudDeleteRejected);
834
+ expect(objectInstance.state.errored).toBe(true);
835
+ expect(objectInstance.state.loading).toBe(false);
836
+ expect(objectInstance.state.deleted).toBe(false);
837
+ expect({ ...objectInstance.state.object }).toEqual(crudRetrieveResolved);
838
+ await nextTick();
839
+
840
+ await expect(returnsPromise).resolves.toBe(false);
841
+ expect(objectInstance.state.objectInstanceCrud.delete).toHaveBeenCalledWith({
842
+ crudArgs: { stream: "test_stream" },
843
+ id: 1,
844
+ });
845
+ expect(objectInstance.state.objectInstanceCrud.delete).toHaveBeenCalledTimes(1);
846
+ });
847
+ it("already loading", async function () {
848
+ const objectInstance = useObjectInstance({
849
+ crudArgs: { stream: "test_stream" },
850
+ });
851
+ const deletePromise = new Promise(() => {});
852
+ objectInstance.state.objectInstanceCrud.delete = jest.fn();
853
+ objectInstance.state.objectInstanceCrud.delete.mockReturnValueOnce(deletePromise);
854
+ objectInstance.delete(1);
855
+ await expect(() => objectInstance.delete(1)).rejects.toThrow(ObjectError);
856
+ expect(objectInstance.state.objectInstanceCrud.delete).toHaveBeenCalledWith({
857
+ crudArgs: { stream: "test_stream" },
858
+ id: 1,
859
+ });
860
+ expect(objectInstance.state.objectInstanceCrud.delete).toHaveBeenCalledTimes(1);
861
+ });
862
+ });
863
+ it("useObjectSubscriptions", async function () {
864
+ const objectInstanceA = useObjectInstance({
865
+ crudArgs: { stream: "test_streamA" },
866
+ id: 1,
867
+ retrieveArgs: {
868
+ fields,
869
+ },
870
+ });
871
+ const objectInstanceB = useObjectInstance({
872
+ crudArgs: { stream: "test_streamB" },
873
+ id: 2,
874
+ retrieveArgs: {
875
+ fields,
876
+ },
877
+ });
878
+ const objInstances = useObjectInstances({
879
+ A: {
880
+ crudArgs: { stream: "test_streamA" },
881
+ id: 1,
882
+ retrieveArgs: {
883
+ fields,
884
+ },
885
+ },
886
+ B: {
887
+ crudArgs: { stream: "test_streamB" },
888
+ id: 2,
889
+ retrieveArgs: {
890
+ fields,
891
+ },
892
+ },
893
+ });
894
+ expect(inspect(objInstances.A)).toEqual(inspect(objectInstanceA));
895
+ expect(inspect(objInstances.B)).toEqual(inspect(objectInstanceB));
896
+ });
897
+ });