@arrai-innovations/reactive-helpers 13.1.0 → 14.0.2

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 (51) hide show
  1. package/README.md +11 -1
  2. package/config/listCrud.js +4 -1
  3. package/config/objectCrud.js +10 -4
  4. package/docs/README.md +1 -1
  5. package/docs/config/listCrud.md +20 -2
  6. package/docs/config/objectCrud.md +51 -15
  7. package/docs/use/list.md +6 -0
  8. package/docs/use/listCalculated.md +58 -39
  9. package/docs/use/listFilter.md +57 -39
  10. package/docs/use/listInstance.md +29 -11
  11. package/docs/use/listRelated.md +47 -28
  12. package/docs/use/listSearch.md +40 -28
  13. package/docs/use/listSort.md +58 -39
  14. package/docs/use/listSubscription.md +8 -2
  15. package/docs/use/object.md +28 -14
  16. package/docs/use/objectCalculated.md +26 -13
  17. package/docs/use/objectInstance.md +49 -24
  18. package/docs/use/objectRelated.md +27 -14
  19. package/docs/use/objectSubscription.md +18 -9
  20. package/docs/use/paginatedListInstance.md +8 -2
  21. package/docs/use/search.md +8 -2
  22. package/docs/utils/{getFakeId.md → getFakePk.md} +7 -7
  23. package/index.js +1 -1
  24. package/package.json +1 -1
  25. package/tests/unit/use/listCalculated.spec.js +4 -4
  26. package/tests/unit/use/listFilter.spec.js +10 -9
  27. package/tests/unit/use/listInstance.spec.js +147 -23
  28. package/tests/unit/use/listRelated.spec.js +5 -5
  29. package/tests/unit/use/listSearch.spec.js +14 -12
  30. package/tests/unit/use/listSort.spec.js +8 -1
  31. package/tests/unit/use/listSubscription.spec.js +119 -10
  32. package/tests/unit/use/objectInstance.spec.js +575 -46
  33. package/tests/unit/use/objectSubscription.spec.js +152 -23
  34. package/tests/unit/use/search.spec.js +11 -11
  35. package/use/list.js +1 -0
  36. package/use/listCalculated.js +3 -2
  37. package/use/listFilter.js +9 -9
  38. package/use/listInstance.js +39 -28
  39. package/use/listKeys.js +4 -3
  40. package/use/listRelated.js +23 -22
  41. package/use/listSearch.js +37 -33
  42. package/use/listSort.js +1 -0
  43. package/use/listSubscription.js +25 -15
  44. package/use/object.js +8 -13
  45. package/use/objectCalculated.js +2 -1
  46. package/use/objectInstance.js +29 -14
  47. package/use/objectRelated.js +3 -2
  48. package/use/objectSubscription.js +31 -11
  49. package/use/paginatedListInstance.js +1 -1
  50. package/use/search.js +13 -4
  51. package/utils/{getFakeId.js → getFakePk.js} +4 -4
@@ -24,6 +24,11 @@ describe("use/objectInstance.js", function () {
24
24
  __str__: "asdf",
25
25
  name: "zxcv",
26
26
  };
27
+ const crudRetrieveResolvedNonStandardPrimaryKey = {
28
+ unique: 1,
29
+ __str__: "test",
30
+ name: "test",
31
+ };
27
32
  const crudRetrieveRejected = {
28
33
  errors: ["Not found"],
29
34
  data: null,
@@ -33,8 +38,13 @@ describe("use/objectInstance.js", function () {
33
38
  };
34
39
  const crudCreateResolved = {
35
40
  id: 1,
36
- __str__: "qwer",
37
- name: "qwer",
41
+ __str__: "tset",
42
+ name: "tset",
43
+ };
44
+ const crudCreateResolvedNonStandardPK = {
45
+ unique: 1,
46
+ __str__: "tset",
47
+ name: "tset",
38
48
  };
39
49
  const crudCreateRejected = {
40
50
  errors: [
@@ -52,6 +62,11 @@ describe("use/objectInstance.js", function () {
52
62
  __str__: "asdf!",
53
63
  name: "zxcv!",
54
64
  };
65
+ const crudUpdateResolvedWithNonStandardPk = {
66
+ unique: 1,
67
+ __str__: "asdf!",
68
+ name: "zxcv!",
69
+ };
55
70
  const crudUpdateRejected = {
56
71
  errors: [
57
72
  {
@@ -68,6 +83,11 @@ describe("use/objectInstance.js", function () {
68
83
  __str__: "asdf!",
69
84
  name: "zxcv!",
70
85
  };
86
+ const crudPatchResolvedWithNonStandardPk = {
87
+ unique: 1,
88
+ __str__: "asdf!",
89
+ name: "zxcv!",
90
+ };
71
91
  const crudPatchRejected = {
72
92
  errors: [
73
93
  {
@@ -101,7 +121,8 @@ describe("use/objectInstance.js", function () {
101
121
  const objectInstance = useObjectInstance({
102
122
  props: {
103
123
  crudArgs: { stream: "test_stream" },
104
- id,
124
+ pk: id,
125
+ pkKey: "id",
105
126
  retrieveArgs,
106
127
  },
107
128
  });
@@ -131,20 +152,67 @@ describe("use/objectInstance.js", function () {
131
152
  expect({ ...objectInstance.state.object }).toEqual(crudRetrieveResolved);
132
153
  expect(objectInstance.state.crud.retrieve).toHaveBeenCalledWith({
133
154
  crudArgs: { stream: "test_stream" },
134
- id: 1,
155
+ pk: 1,
156
+ pkKey: "id",
135
157
  retrieveArgs: { fields: ["id", "__str__", "name"] },
136
158
  });
137
159
  expect(objectInstance.state.crud.retrieve).toHaveBeenCalledTimes(1);
138
160
  await nextTick();
139
161
  await expect(oiRetrieveResolve).resolves.toBe(true);
140
162
  });
141
- it("success (retrieveArgs)", async function () {
163
+ it("success with non-standard pk", async function () {
142
164
  const id = ref(1);
143
165
  const retrieveArgs = reactive({ fields });
144
166
  const objectInstance = useObjectInstance({
145
167
  props: {
146
168
  crudArgs: { stream: "test_stream" },
147
- id,
169
+ pk: id,
170
+ pkKey: "unique",
171
+ retrieveArgs,
172
+ },
173
+ });
174
+ objectInstance.state.crud.retrieve = vi.fn();
175
+ let crudRetrieveResolve;
176
+ const crudRetrievePromise = new Promise((resolve) => {
177
+ crudRetrieveResolve = resolve;
178
+ });
179
+ objectInstance.state.crud.retrieve.mockReturnValueOnce(crudRetrievePromise);
180
+
181
+ expectErrorToBeNull(objectInstance.state.error);
182
+ expect(objectInstance.state.errored).toBe(false);
183
+ expect(objectInstance.state.loading).toBeUndefined();
184
+ expect({ ...objectInstance.state.object }).toEqual({});
185
+ const oiRetrieveResolve = objectInstance.retrieve();
186
+ expectErrorToBeNull(objectInstance.state.error);
187
+ expect(objectInstance.state.errored).toBe(false);
188
+ expect(objectInstance.state.loading).toBe(true);
189
+ expect({ ...objectInstance.state.object }).toEqual({});
190
+ await nextTick();
191
+ // @ts-ignore - crudRetrieveResolve is set in the promise, so it will be defined
192
+ crudRetrieveResolve(crudRetrieveResolvedNonStandardPrimaryKey);
193
+ await flushPromises();
194
+ expectErrorToBeNull(objectInstance.state.error);
195
+ expect(objectInstance.state.errored).toBe(false);
196
+ expect(objectInstance.state.loading).toBe(false);
197
+ expect({ ...objectInstance.state.object }).toEqual(crudRetrieveResolvedNonStandardPrimaryKey);
198
+ expect(objectInstance.state.crud.retrieve).toHaveBeenCalledWith({
199
+ crudArgs: { stream: "test_stream" },
200
+ pk: 1,
201
+ pkKey: "unique",
202
+ retrieveArgs: { fields: ["id", "__str__", "name"] },
203
+ });
204
+ expect(objectInstance.state.crud.retrieve).toHaveBeenCalledTimes(1);
205
+ await nextTick();
206
+ await expect(oiRetrieveResolve).resolves.toBe(true);
207
+ });
208
+ it("success (retrieveArgs)", async function () {
209
+ const pk = ref(1);
210
+ const retrieveArgs = reactive({ fields });
211
+ const objectInstance = useObjectInstance({
212
+ props: {
213
+ crudArgs: { stream: "test_stream" },
214
+ pk,
215
+ pkKey: "id",
148
216
  retrieveArgs,
149
217
  },
150
218
  });
@@ -172,7 +240,8 @@ describe("use/objectInstance.js", function () {
172
240
  expect({ ...objectInstance.state.object }).toEqual(crudRetrieveResolved);
173
241
  expect(objectInstance.state.crud.retrieve).toHaveBeenCalledWith({
174
242
  crudArgs: { stream: "test_stream" },
175
- id: 1,
243
+ pk: 1,
244
+ pkKey: "id",
176
245
  retrieveArgs: { fields: ["id", "__str__", "name"] },
177
246
  });
178
247
  expect(objectInstance.state.crud.retrieve).toHaveBeenCalledTimes(1);
@@ -180,12 +249,13 @@ describe("use/objectInstance.js", function () {
180
249
  expect(returnValue).toBe(true);
181
250
  });
182
251
  it("errored", async function () {
183
- const id = ref(1);
252
+ const pk = ref(1);
184
253
  const retrieveArgs = reactive({ fields });
185
254
  const objectInstance = useObjectInstance({
186
255
  props: {
187
256
  crudArgs: { stream: "test_stream" },
188
- id,
257
+ pk,
258
+ pkKey: "id",
189
259
  retrieveArgs,
190
260
  },
191
261
  });
@@ -213,7 +283,51 @@ describe("use/objectInstance.js", function () {
213
283
  expect({ ...objectInstance.state.object }).toEqual({});
214
284
  expect(objectInstance.state.crud.retrieve).toHaveBeenCalledWith({
215
285
  crudArgs: { stream: "test_stream" },
216
- id: 1,
286
+ pk: 1,
287
+ pkKey: "id",
288
+ retrieveArgs: { fields: ["id", "__str__", "name"] },
289
+ });
290
+ expect(objectInstance.state.crud.retrieve).toHaveBeenCalledTimes(1);
291
+ const returnValue = await oiRetrieveResolve;
292
+ expect(returnValue).toBe(false);
293
+ });
294
+ it("errored with non-matching pkKey", async function () {
295
+ const pk = ref(1);
296
+ const retrieveArgs = reactive({ fields });
297
+ const objectInstance = useObjectInstance({
298
+ props: {
299
+ crudArgs: { stream: "test_stream" },
300
+ pk,
301
+ pkKey: "pk",
302
+ retrieveArgs,
303
+ },
304
+ });
305
+ objectInstance.state.crud.retrieve = vi.fn();
306
+ let crudRetrieveReject;
307
+ const crudRetrievePromise = new Promise((resolve, reject) => {
308
+ crudRetrieveReject = reject;
309
+ });
310
+ objectInstance.state.crud.retrieve.mockReturnValueOnce(crudRetrievePromise);
311
+ expectErrorToBeNull(objectInstance.state.error);
312
+ expect(objectInstance.state.errored).toBe(false);
313
+ expect(objectInstance.state.loading).toBeUndefined();
314
+ expect({ ...objectInstance.state.object }).toEqual({});
315
+ const oiRetrieveResolve = objectInstance.retrieve();
316
+ expectErrorToBeNull(objectInstance.state.error);
317
+ expect(objectInstance.state.errored).toBe(false);
318
+ expect(objectInstance.state.loading).toBe(true);
319
+ expect({ ...objectInstance.state.object }).toEqual({});
320
+ // @ts-ignore - crudRetrieveReject is set in the promise, so it will be defined
321
+ crudRetrieveReject(crudRetrieveRejected);
322
+ await flushPromises();
323
+ expect(objectInstance.state.error).toEqual(crudRetrieveRejected);
324
+ expect(objectInstance.state.errored).toBe(true);
325
+ expect(objectInstance.state.loading).toBe(false);
326
+ expect({ ...objectInstance.state.object }).toEqual({});
327
+ expect(objectInstance.state.crud.retrieve).toHaveBeenCalledWith({
328
+ crudArgs: { stream: "test_stream" },
329
+ pk: 1,
330
+ pkKey: "pk",
217
331
  retrieveArgs: { fields: ["id", "__str__", "name"] },
218
332
  });
219
333
  expect(objectInstance.state.crud.retrieve).toHaveBeenCalledTimes(1);
@@ -221,12 +335,13 @@ describe("use/objectInstance.js", function () {
221
335
  expect(returnValue).toBe(false);
222
336
  });
223
337
  it("already loading", async function () {
224
- const id = ref(1);
338
+ const pk = ref(1);
225
339
  const retrieveArgs = reactive({ fields });
226
340
  const objectInstance = useObjectInstance({
227
341
  props: {
228
342
  crudArgs: { stream: "test_stream" },
229
- id,
343
+ pk,
344
+ pkKey: "id",
230
345
  retrieveArgs,
231
346
  },
232
347
  });
@@ -252,12 +367,13 @@ describe("use/objectInstance.js", function () {
252
367
  expect({ ...objectInstance.state.object }).toEqual({});
253
368
  });
254
369
  it("double retrieve gets the same promise", async function () {
255
- const id = ref(1);
370
+ const pk = ref(1);
256
371
  const retrieveArgs = reactive({ fields });
257
372
  const objectInstance = useObjectInstance({
258
373
  props: {
259
374
  crudArgs: { stream: "test_stream" },
260
- id,
375
+ pk,
376
+ pkKey: "id",
261
377
  retrieveArgs,
262
378
  },
263
379
  });
@@ -273,7 +389,8 @@ describe("use/objectInstance.js", function () {
273
389
  expect(firstPromise).toBe(secondPromise);
274
390
  expect(objectInstance.state.crud.retrieve).toHaveBeenCalledWith({
275
391
  crudArgs: { stream: "test_stream" },
276
- id: 1,
392
+ pk: 1,
393
+ pkKey: "id",
277
394
  retrieveArgs: { fields: ["id", "__str__", "name"] },
278
395
  });
279
396
  expect(objectInstance.state.crud.retrieve).toHaveBeenCalledTimes(1);
@@ -290,7 +407,8 @@ describe("use/objectInstance.js", function () {
290
407
  const objectInstance = useObjectInstance({
291
408
  props: {
292
409
  crudArgs: { stream: "test_stream" },
293
- id,
410
+ pk: id,
411
+ pkKey: "id",
294
412
  retrieveArgs,
295
413
  },
296
414
  });
@@ -329,6 +447,7 @@ describe("use/objectInstance.js", function () {
329
447
  object: {
330
448
  name: "qwer",
331
449
  },
450
+ pkKey: "id",
332
451
  retrieveArgs: { fields: ["id", "__str__", "name"] },
333
452
  });
334
453
  expect(objectInstance.state.crud.create).toHaveBeenCalledTimes(1);
@@ -341,7 +460,8 @@ describe("use/objectInstance.js", function () {
341
460
  const objectInstance = useObjectInstance({
342
461
  props: {
343
462
  crudArgs: { stream: "test_stream" },
344
- id,
463
+ pk: id,
464
+ pkKey: "id",
345
465
  retrieveArgs,
346
466
  },
347
467
  });
@@ -375,6 +495,7 @@ describe("use/objectInstance.js", function () {
375
495
  crudArgs: {
376
496
  stream: "test_stream",
377
497
  },
498
+ pkKey: "id",
378
499
  object: {
379
500
  name: "qwer",
380
501
  },
@@ -384,13 +505,119 @@ describe("use/objectInstance.js", function () {
384
505
  const returnValue = await oiCreateResolve;
385
506
  expect(returnValue).toBe(true);
386
507
  });
508
+ it("success with non-standard pk", async function () {
509
+ const id = ref(1);
510
+ const retrieveArgs = reactive({ fields });
511
+ const objectInstance = useObjectInstance({
512
+ props: {
513
+ crudArgs: { stream: "test_stream" },
514
+ pk: id,
515
+ pkKey: "unique",
516
+ retrieveArgs,
517
+ },
518
+ });
519
+ objectInstance.state.crud.create = vi.fn();
520
+ let crudCreateResolve;
521
+ const crudCreatePromise = new Promise((resolve) => {
522
+ crudCreateResolve = resolve;
523
+ });
524
+ objectInstance.state.crud.create.mockReturnValueOnce(crudCreatePromise);
525
+ expectErrorToBeNull(objectInstance.state.error);
526
+ expect(objectInstance.state.errored).toBe(false);
527
+ expect(objectInstance.state.loading).toBeUndefined();
528
+ expect({ ...objectInstance.state.object }).toEqual({});
529
+ const oiCreateResolve = objectInstance.create({
530
+ object: {
531
+ name: "qwer",
532
+ },
533
+ fields,
534
+ });
535
+ expectErrorToBeNull(objectInstance.state.error);
536
+ expect(objectInstance.state.errored).toBe(false);
537
+ expect(objectInstance.state.loading).toBe(true);
538
+ expect({ ...objectInstance.state.object }).toEqual({});
539
+ await nextTick();
540
+ // @ts-ignore - crudCreateResolve is set in the promise, so it will be defined
541
+ crudCreateResolve(crudCreateResolvedNonStandardPK);
542
+ await flushPromises();
543
+ expectErrorToBeNull(objectInstance.state.error);
544
+ expect(objectInstance.state.errored).toBe(false);
545
+ expect(objectInstance.state.loading).toBe(false);
546
+ expect({ ...objectInstance.state.object }).toEqual(crudCreateResolvedNonStandardPK);
547
+ expect(objectInstance.state.crud.create).toHaveBeenCalledWith({
548
+ crudArgs: {
549
+ stream: "test_stream",
550
+ },
551
+ object: {
552
+ name: "qwer",
553
+ },
554
+ pkKey: "unique",
555
+ retrieveArgs: { fields: ["id", "__str__", "name"] },
556
+ });
557
+ expect(objectInstance.state.crud.create).toHaveBeenCalledTimes(1);
558
+ await nextTick();
559
+ await expect(oiCreateResolve).resolves.toBe(true);
560
+ });
387
561
  it("errored", async function () {
388
562
  const id = ref(undefined);
389
563
  const retrieveArgs = reactive({ fields });
390
564
  const objectInstance = useObjectInstance({
391
565
  props: {
392
566
  crudArgs: { stream: "test_stream" },
393
- id,
567
+ pk: id,
568
+ pkKey: "id",
569
+ retrieveArgs,
570
+ },
571
+ });
572
+ objectInstance.state.crud.create = vi.fn();
573
+ let crudCreateReject;
574
+ const crudCreatePromise = new Promise((resolve, reject) => {
575
+ crudCreateReject = reject;
576
+ });
577
+ objectInstance.state.crud.create.mockReturnValueOnce(crudCreatePromise);
578
+ expectErrorToBeNull(objectInstance.state.error);
579
+ expect(objectInstance.state.errored).toBe(false);
580
+ expect(objectInstance.state.loading).toBeUndefined();
581
+ expect({ ...objectInstance.state.object }).toEqual({});
582
+ const oiCreateResolve = objectInstance.create({
583
+ object: {
584
+ name: "qwer",
585
+ },
586
+ fields,
587
+ });
588
+ expectErrorToBeNull(objectInstance.state.error);
589
+ expect(objectInstance.state.errored).toBe(false);
590
+ expect(objectInstance.state.loading).toBe(true);
591
+ expect({ ...objectInstance.state.object }).toEqual({});
592
+ // @ts-ignore - crudCreateReject is set in the promise, so it will be defined
593
+ crudCreateReject(crudCreateRejected);
594
+ await flushPromises();
595
+ expect(objectInstance.state.error).toEqual(crudCreateRejected);
596
+ expect(objectInstance.state.errored).toBe(true);
597
+ expect(objectInstance.state.loading).toBe(false);
598
+ expect({ ...objectInstance.state.object }).toEqual({});
599
+ expect(objectInstance.state.crud.create).toHaveBeenCalledWith({
600
+ crudArgs: {
601
+ stream: "test_stream",
602
+ },
603
+ pkKey: "id",
604
+ object: {
605
+ name: "qwer",
606
+ },
607
+ retrieveArgs: { fields: ["id", "__str__", "name"] },
608
+ });
609
+ expect(objectInstance.state.crud.create).toHaveBeenCalledTimes(1);
610
+ const returnValue = await oiCreateResolve;
611
+ expect(returnValue).toBe(false);
612
+ });
613
+ it("errored with non-matching pkKey", async function () {
614
+ const id = ref(undefined);
615
+ const retrieveArgs = reactive({ fields });
616
+ const objectInstance = useObjectInstance({
617
+ props: {
618
+ crudArgs: { stream: "test_stream" },
619
+ pk: id,
620
+ pkKey: "pk",
394
621
  retrieveArgs,
395
622
  },
396
623
  });
@@ -425,6 +652,7 @@ describe("use/objectInstance.js", function () {
425
652
  crudArgs: {
426
653
  stream: "test_stream",
427
654
  },
655
+ pkKey: "pk",
428
656
  object: {
429
657
  name: "qwer",
430
658
  },
@@ -440,7 +668,8 @@ describe("use/objectInstance.js", function () {
440
668
  const objectInstance = useObjectInstance({
441
669
  props: {
442
670
  crudArgs: { stream: "test_stream" },
443
- id,
671
+ pk: id,
672
+ pkKey: "id",
444
673
  retrieveArgs,
445
674
  },
446
675
  });
@@ -467,6 +696,7 @@ describe("use/objectInstance.js", function () {
467
696
  crudArgs: {
468
697
  stream: "test_stream",
469
698
  },
699
+ pkKey: "id",
470
700
  object: {
471
701
  name: "qwer",
472
702
  },
@@ -486,7 +716,8 @@ describe("use/objectInstance.js", function () {
486
716
  const objectInstance = useObjectInstance({
487
717
  props: {
488
718
  crudArgs: { stream: "test_stream" },
489
- id,
719
+ pk: id,
720
+ pkKey: "id",
490
721
  retrieveArgs,
491
722
  },
492
723
  });
@@ -524,6 +755,7 @@ describe("use/objectInstance.js", function () {
524
755
  crudArgs: {
525
756
  stream: "test_stream",
526
757
  },
758
+ pkKey: "id",
527
759
  object: {
528
760
  id: 1,
529
761
  name: "zxcv!",
@@ -538,7 +770,8 @@ describe("use/objectInstance.js", function () {
538
770
  const objectInstance = useObjectInstance({
539
771
  props: {
540
772
  crudArgs: { stream: "test_stream" },
541
- id,
773
+ pk: id,
774
+ pkKey: "id",
542
775
  retrieveArgs,
543
776
  },
544
777
  });
@@ -574,6 +807,7 @@ describe("use/objectInstance.js", function () {
574
807
  crudArgs: {
575
808
  stream: "test_stream",
576
809
  },
810
+ pkKey: "id",
577
811
  object: {
578
812
  id: 1,
579
813
  name: "zxcv!",
@@ -582,13 +816,66 @@ describe("use/objectInstance.js", function () {
582
816
  });
583
817
  expect(objectInstance.state.crud.update).toHaveBeenCalledTimes(1);
584
818
  });
819
+ it("success with non-standard pk", async function () {
820
+ const id = ref(1);
821
+ const retrieveArgs = reactive({ fields });
822
+ const objectInstance = useObjectInstance({
823
+ props: {
824
+ crudArgs: { stream: "test_stream" },
825
+ pk: id,
826
+ pkKey: "unique",
827
+ retrieveArgs,
828
+ },
829
+ });
830
+ let crudUpdateResolve;
831
+ const crudUpdatePromise = new Promise((resolve) => {
832
+ crudUpdateResolve = resolve;
833
+ });
834
+ objectInstance.state.crud.update = vi.fn();
835
+ objectInstance.state.crud.update.mockReturnValueOnce(crudUpdatePromise);
836
+ expectErrorToBeNull(objectInstance.state.error);
837
+ expect(objectInstance.state.errored).toBe(false);
838
+ expect(objectInstance.state.loading).toBeUndefined();
839
+ expect({ ...objectInstance.state.object }).toEqual({});
840
+ const oiUpdatePromise = objectInstance.update({
841
+ object: {
842
+ unique: 1,
843
+ name: "zxcv!",
844
+ },
845
+ });
846
+ expectErrorToBeNull(objectInstance.state.error);
847
+ expect(objectInstance.state.errored).toBe(false);
848
+ expect(objectInstance.state.loading).toBe(true);
849
+ expect({ ...objectInstance.state.object }).toEqual({});
850
+ // @ts-ignore - crudUpdateResolve is set in the promise, so it will be defined
851
+ crudUpdateResolve(crudUpdateResolvedWithNonStandardPk);
852
+ await flushPromises();
853
+ expectErrorToBeNull(objectInstance.state.error);
854
+ expect(objectInstance.state.errored).toBe(false);
855
+ expect(objectInstance.state.loading).toBe(false);
856
+ expect({ ...objectInstance.state.object }).toEqual(crudUpdateResolvedWithNonStandardPk);
857
+ await expect(oiUpdatePromise).resolves.toBe(true);
858
+ expect(objectInstance.state.crud.update).toHaveBeenCalledWith({
859
+ crudArgs: {
860
+ stream: "test_stream",
861
+ },
862
+ pkKey: "unique",
863
+ object: {
864
+ unique: 1,
865
+ name: "zxcv!",
866
+ },
867
+ retrieveArgs: { fields: ["id", "__str__", "name"] },
868
+ });
869
+ expect(objectInstance.state.crud.update).toHaveBeenCalledTimes(1);
870
+ });
585
871
  it("errored", async function () {
586
872
  const id = ref(1);
587
873
  const retrieveArgs = reactive({ fields });
588
874
  const objectInstance = useObjectInstance({
589
875
  props: {
590
876
  crudArgs: { stream: "test_stream" },
591
- id,
877
+ pk: id,
878
+ pkKey: "id",
592
879
  retrieveArgs,
593
880
  },
594
881
  });
@@ -624,6 +911,59 @@ describe("use/objectInstance.js", function () {
624
911
  crudArgs: {
625
912
  stream: "test_stream",
626
913
  },
914
+ pkKey: "id",
915
+ object: {
916
+ id: 1,
917
+ name: "zxcv!",
918
+ },
919
+ retrieveArgs: { fields: ["id", "__str__", "name"] },
920
+ });
921
+ expect(objectInstance.state.crud.update).toHaveBeenCalledTimes(1);
922
+ });
923
+ it("errored with non-matching pkKey", async function () {
924
+ const id = ref(1);
925
+ const retrieveArgs = reactive({ fields });
926
+ const objectInstance = useObjectInstance({
927
+ props: {
928
+ crudArgs: { stream: "test_stream" },
929
+ pk: id,
930
+ pkKey: "id",
931
+ retrieveArgs,
932
+ },
933
+ });
934
+ let crudUpdateReject;
935
+ const crudUpdatePromise = new Promise((resolve, reject) => {
936
+ crudUpdateReject = reject;
937
+ });
938
+ objectInstance.state.crud.update = vi.fn();
939
+ objectInstance.state.crud.update.mockReturnValueOnce(crudUpdatePromise);
940
+ expectErrorToBeNull(objectInstance.state.error);
941
+ expect(objectInstance.state.errored).toBe(false);
942
+ expect(objectInstance.state.loading).toBeUndefined();
943
+ expect({ ...objectInstance.state.object }).toEqual({});
944
+ const oiUpdatePromise = objectInstance.update({
945
+ object: {
946
+ id: 1,
947
+ name: "zxcv!",
948
+ },
949
+ });
950
+ expectErrorToBeNull(objectInstance.state.error);
951
+ expect(objectInstance.state.errored).toBe(false);
952
+ expect(objectInstance.state.loading).toBe(true);
953
+ expect({ ...objectInstance.state.object }).toEqual({});
954
+ // @ts-ignore - crudUpdateReject is set in the promise, so it will be defined
955
+ crudUpdateReject(crudUpdateRejected);
956
+ await flushPromises();
957
+ expect(objectInstance.state.error).toEqual(crudUpdateRejected);
958
+ expect(objectInstance.state.errored).toBe(true);
959
+ expect(objectInstance.state.loading).toBe(false);
960
+ expect({ ...objectInstance.state.object }).toEqual({});
961
+ await expect(oiUpdatePromise).resolves.toBe(false);
962
+ expect(objectInstance.state.crud.update).toHaveBeenCalledWith({
963
+ crudArgs: {
964
+ stream: "test_stream",
965
+ },
966
+ pkKey: "id",
627
967
  object: {
628
968
  id: 1,
629
969
  name: "zxcv!",
@@ -638,7 +978,8 @@ describe("use/objectInstance.js", function () {
638
978
  const objectInstance = useObjectInstance({
639
979
  props: {
640
980
  crudArgs: { stream: "test_stream" },
641
- id,
981
+ pk: id,
982
+ pkKey: "id",
642
983
  retrieveArgs,
643
984
  },
644
985
  });
@@ -671,6 +1012,7 @@ describe("use/objectInstance.js", function () {
671
1012
  crudArgs: {
672
1013
  stream: "test_stream",
673
1014
  },
1015
+ pkKey: "id",
674
1016
  object: {
675
1017
  id: 1,
676
1018
  name: "zxcv!",
@@ -687,7 +1029,8 @@ describe("use/objectInstance.js", function () {
687
1029
  const objectInstance = useObjectInstance({
688
1030
  props: {
689
1031
  crudArgs: { stream: "test_stream" },
690
- id,
1032
+ pk: id,
1033
+ pkKey: "id",
691
1034
  retrieveArgs,
692
1035
  },
693
1036
  });
@@ -725,7 +1068,8 @@ describe("use/objectInstance.js", function () {
725
1068
  crudArgs: {
726
1069
  stream: "test_stream",
727
1070
  },
728
- id: 1,
1071
+ pk: 1,
1072
+ pkKey: "id",
729
1073
  partialObject: {
730
1074
  id: 1,
731
1075
  name: "zxcv!",
@@ -734,13 +1078,69 @@ describe("use/objectInstance.js", function () {
734
1078
  });
735
1079
  expect(objectInstance.state.crud.patch).toHaveBeenCalledTimes(1);
736
1080
  });
1081
+ it("success with non-standard pk", async function () {
1082
+ const id = ref(1);
1083
+ const retrieveArgs = reactive({ fields });
1084
+ const objectInstance = useObjectInstance({
1085
+ props: {
1086
+ crudArgs: { stream: "test_stream" },
1087
+ pk: id,
1088
+ pkKey: "unique",
1089
+ retrieveArgs,
1090
+ },
1091
+ });
1092
+ let crudPatchResolve;
1093
+ const crudPatchPromise = new Promise((resolve) => {
1094
+ crudPatchResolve = resolve;
1095
+ });
1096
+ objectInstance.state.crud.patch = vi.fn();
1097
+ objectInstance.state.crud.patch.mockReturnValueOnce(crudPatchPromise);
1098
+ expectErrorToBeNull(objectInstance.state.error);
1099
+ expect(objectInstance.state.errored).toBe(false);
1100
+ expect(objectInstance.state.loading).toBeUndefined();
1101
+ expect({ ...objectInstance.state.object }).toEqual({});
1102
+ const oiPatchPromise = objectInstance.patch({
1103
+ partialObject: {
1104
+ unique: 1,
1105
+ name: "zxcv!",
1106
+ },
1107
+ });
1108
+ expectErrorToBeNull(objectInstance.state.error);
1109
+ expect(objectInstance.state.errored).toBe(false);
1110
+ expect(objectInstance.state.loading).toBe(true);
1111
+ expect({ ...objectInstance.state.object }).toEqual({});
1112
+ await nextTick();
1113
+ // @ts-ignore - crudPatchResolve is set in the promise, so it will be defined
1114
+ crudPatchResolve(crudPatchResolvedWithNonStandardPk);
1115
+ await flushPromises();
1116
+ expectErrorToBeNull(objectInstance.state.error);
1117
+ expect(objectInstance.state.errored).toBe(false);
1118
+ expect(objectInstance.state.loading).toBe(false);
1119
+ expect({ ...objectInstance.state.object }).toEqual(crudPatchResolvedWithNonStandardPk);
1120
+ await nextTick();
1121
+ await expect(oiPatchPromise).resolves.toBe(true);
1122
+ expect(objectInstance.state.crud.patch).toHaveBeenCalledWith({
1123
+ crudArgs: {
1124
+ stream: "test_stream",
1125
+ },
1126
+ pk: 1,
1127
+ pkKey: "unique",
1128
+ partialObject: {
1129
+ unique: 1,
1130
+ name: "zxcv!",
1131
+ },
1132
+ retrieveArgs: { fields: ["id", "__str__", "name"] },
1133
+ });
1134
+ expect(objectInstance.state.crud.patch).toHaveBeenCalledTimes(1);
1135
+ });
737
1136
  it("errored", async function () {
738
1137
  const id = ref(1);
739
1138
  const retrieveArgs = reactive({ fields });
740
1139
  const objectInstance = useObjectInstance({
741
1140
  props: {
742
1141
  crudArgs: { stream: "test_stream" },
743
- id,
1142
+ pk: id,
1143
+ pkKey: "id",
744
1144
  retrieveArgs,
745
1145
  },
746
1146
  });
@@ -776,7 +1176,8 @@ describe("use/objectInstance.js", function () {
776
1176
  crudArgs: {
777
1177
  stream: "test_stream",
778
1178
  },
779
- id: 1,
1179
+ pk: 1,
1180
+ pkKey: "id",
780
1181
  partialObject: {
781
1182
  id: 1,
782
1183
  name: "zxcv!",
@@ -785,13 +1186,67 @@ describe("use/objectInstance.js", function () {
785
1186
  });
786
1187
  expect(objectInstance.state.crud.patch).toHaveBeenCalledTimes(1);
787
1188
  });
788
- it("already loading", async function () {
1189
+ it("errored with non-matching pkKey", async function () {
789
1190
  const id = ref(1);
790
1191
  const retrieveArgs = reactive({ fields });
791
1192
  const objectInstance = useObjectInstance({
792
1193
  props: {
793
1194
  crudArgs: { stream: "test_stream" },
794
- id,
1195
+ pk: id,
1196
+ pkKey: "pk",
1197
+ retrieveArgs,
1198
+ },
1199
+ });
1200
+ let crudPatchReject;
1201
+ const crudPatchPromise = new Promise((resolve, reject) => {
1202
+ crudPatchReject = reject;
1203
+ });
1204
+ objectInstance.state.crud.patch = vi.fn();
1205
+ objectInstance.state.crud.patch.mockReturnValueOnce(crudPatchPromise);
1206
+ expectErrorToBeNull(objectInstance.state.error);
1207
+ expect(objectInstance.state.errored).toBe(false);
1208
+ expect(objectInstance.state.loading).toBeUndefined();
1209
+ expect({ ...objectInstance.state.object }).toEqual({});
1210
+ const oiPatchPromise = objectInstance.patch({
1211
+ partialObject: {
1212
+ id: 1,
1213
+ name: "zxcv!",
1214
+ },
1215
+ });
1216
+ expectErrorToBeNull(objectInstance.state.error);
1217
+ expect(objectInstance.state.errored).toBe(false);
1218
+ expect(objectInstance.state.loading).toBe(true);
1219
+ expect({ ...objectInstance.state.object }).toEqual({});
1220
+ // @ts-ignore - crudPatchReject is set in the promise, so it will be defined
1221
+ crudPatchReject(crudPatchRejected);
1222
+ await flushPromises();
1223
+ expect(objectInstance.state.error).toEqual(crudPatchRejected);
1224
+ expect(objectInstance.state.errored).toBe(true);
1225
+ expect(objectInstance.state.loading).toBe(false);
1226
+ expect({ ...objectInstance.state.object }).toEqual({});
1227
+ await expect(oiPatchPromise).resolves.toBe(false);
1228
+ expect(objectInstance.state.crud.patch).toHaveBeenCalledWith({
1229
+ crudArgs: {
1230
+ stream: "test_stream",
1231
+ },
1232
+ pk: 1,
1233
+ pkKey: "pk",
1234
+ partialObject: {
1235
+ id: 1,
1236
+ name: "zxcv!",
1237
+ },
1238
+ retrieveArgs: { fields: ["id", "__str__", "name"] },
1239
+ });
1240
+ expect(objectInstance.state.crud.patch).toHaveBeenCalledTimes(1);
1241
+ });
1242
+ it("already loading", async function () {
1243
+ const pk = ref(1);
1244
+ const retrieveArgs = reactive({ fields });
1245
+ const objectInstance = useObjectInstance({
1246
+ props: {
1247
+ crudArgs: { stream: "test_stream" },
1248
+ pk,
1249
+ pkKey: "id",
795
1250
  retrieveArgs,
796
1251
  },
797
1252
  });
@@ -816,7 +1271,8 @@ describe("use/objectInstance.js", function () {
816
1271
  crudArgs: {
817
1272
  stream: "test_stream",
818
1273
  },
819
- id: 1,
1274
+ pk: 1,
1275
+ pkKey: "id",
820
1276
  partialObject: {
821
1277
  id: 1,
822
1278
  name: "zxcv!",
@@ -828,16 +1284,17 @@ describe("use/objectInstance.js", function () {
828
1284
  });
829
1285
  describe("delete", function () {
830
1286
  it("success", async function () {
831
- const id = ref(1);
1287
+ const pk = ref(1);
832
1288
  const retrieveArgs = reactive({ fields });
833
1289
  const objectInstance = useObjectInstance({
834
1290
  props: {
835
1291
  crudArgs: { stream: "test_stream" },
836
- id,
1292
+ pk,
1293
+ pkKey: "unique",
837
1294
  retrieveArgs,
838
1295
  },
839
1296
  });
840
- assignReactiveObject(objectInstance.state.object, crudRetrieveResolved);
1297
+ assignReactiveObject(objectInstance.state.object, crudRetrieveResolvedNonStandardPrimaryKey);
841
1298
  let deleteResolve;
842
1299
  const deletePromise = new Promise((resolve) => {
843
1300
  deleteResolve = resolve;
@@ -849,7 +1306,7 @@ describe("use/objectInstance.js", function () {
849
1306
  expect(objectInstance.state.errored).toBe(false);
850
1307
  expect(objectInstance.state.loading).toBeUndefined();
851
1308
  expect(objectInstance.state.deleted).toBe(false);
852
- expect({ ...objectInstance.state.object }).toEqual(crudRetrieveResolved);
1309
+ expect({ ...objectInstance.state.object }).toEqual(crudRetrieveResolvedNonStandardPrimaryKey);
853
1310
 
854
1311
  const returnsPromise = objectInstance.delete();
855
1312
 
@@ -857,7 +1314,7 @@ describe("use/objectInstance.js", function () {
857
1314
  expect(objectInstance.state.errored).toBe(false);
858
1315
  expect(objectInstance.state.loading).toBe(true);
859
1316
  expect(objectInstance.state.deleted).toBe(false);
860
- expect({ ...objectInstance.state.object }).toEqual(crudRetrieveResolved);
1317
+ expect({ ...objectInstance.state.object }).toEqual(crudRetrieveResolvedNonStandardPrimaryKey);
861
1318
  await nextTick();
862
1319
 
863
1320
  // @ts-ignore - deleteResolve is set in the promise, so it will be defined
@@ -874,17 +1331,19 @@ describe("use/objectInstance.js", function () {
874
1331
  await expect(returnsPromise).resolves.toBe(true);
875
1332
  expect(objectInstance.state.crud.delete).toHaveBeenCalledWith({
876
1333
  crudArgs: { stream: "test_stream" },
877
- id: 1,
1334
+ pk: 1,
1335
+ pkKey: "unique",
878
1336
  });
879
1337
  expect(objectInstance.state.crud.delete).toHaveBeenCalledTimes(1);
880
1338
  });
881
1339
  it("errored", async function () {
882
- const id = ref(1);
1340
+ const pk = ref(1);
883
1341
  const retrieveArgs = reactive({ fields });
884
1342
  const objectInstance = useObjectInstance({
885
1343
  props: {
886
1344
  crudArgs: { stream: "test_stream" },
887
- id,
1345
+ pk,
1346
+ pkKey: "id",
888
1347
  retrieveArgs,
889
1348
  },
890
1349
  });
@@ -925,17 +1384,72 @@ describe("use/objectInstance.js", function () {
925
1384
  await expect(returnsPromise).resolves.toBe(false);
926
1385
  expect(objectInstance.state.crud.delete).toHaveBeenCalledWith({
927
1386
  crudArgs: { stream: "test_stream" },
928
- id: 1,
1387
+ pk: 1,
1388
+ pkKey: "id",
1389
+ });
1390
+ expect(objectInstance.state.crud.delete).toHaveBeenCalledTimes(1);
1391
+ });
1392
+ it("errored with non-matching pkKey", async function () {
1393
+ const pk = ref(1);
1394
+ const retrieveArgs = reactive({ fields });
1395
+ const objectInstance = useObjectInstance({
1396
+ props: {
1397
+ crudArgs: { stream: "test_stream" },
1398
+ pk,
1399
+ pkKey: "unique",
1400
+ retrieveArgs,
1401
+ },
1402
+ });
1403
+ assignReactiveObject(objectInstance.state.object, crudRetrieveResolved);
1404
+ let deleteReject;
1405
+ const deletePromise = new Promise((resolve, reject) => {
1406
+ deleteReject = reject;
1407
+ });
1408
+ objectInstance.state.crud.delete = vi.fn();
1409
+ objectInstance.state.crud.delete.mockReturnValueOnce(deletePromise);
1410
+
1411
+ expectErrorToBeNull(objectInstance.state.error);
1412
+ expect(objectInstance.state.errored).toBe(false);
1413
+ expect(objectInstance.state.loading).toBeUndefined();
1414
+ expect(objectInstance.state.deleted).toBe(false);
1415
+ expect({ ...objectInstance.state.object }).toEqual(crudRetrieveResolved);
1416
+
1417
+ const returnsPromise = objectInstance.delete();
1418
+
1419
+ expectErrorToBeNull(objectInstance.state.error);
1420
+ expect(objectInstance.state.errored).toBe(false);
1421
+ expect(objectInstance.state.loading).toBe(true);
1422
+ expect(objectInstance.state.deleted).toBe(false);
1423
+ expect({ ...objectInstance.state.object }).toEqual(crudRetrieveResolved);
1424
+ await nextTick();
1425
+
1426
+ // @ts-ignore - deleteReject is set in the promise, so it will be defined
1427
+ deleteReject(crudDeleteRejected);
1428
+ await flushPromises();
1429
+
1430
+ expect(objectInstance.state.error).toEqual(crudDeleteRejected);
1431
+ expect(objectInstance.state.errored).toBe(true);
1432
+ expect(objectInstance.state.loading).toBe(false);
1433
+ expect(objectInstance.state.deleted).toBe(false);
1434
+ expect({ ...objectInstance.state.object }).toEqual(crudRetrieveResolved);
1435
+ await nextTick();
1436
+
1437
+ await expect(returnsPromise).resolves.toBe(false);
1438
+ expect(objectInstance.state.crud.delete).toHaveBeenCalledWith({
1439
+ crudArgs: { stream: "test_stream" },
1440
+ pk: 1,
1441
+ pkKey: "unique",
929
1442
  });
930
1443
  expect(objectInstance.state.crud.delete).toHaveBeenCalledTimes(1);
931
1444
  });
932
1445
  it("already loading", async function () {
933
- const id = ref(1);
1446
+ const pk = ref(1);
934
1447
  const retrieveArgs = reactive({ fields });
935
1448
  const objectInstance = useObjectInstance({
936
1449
  props: {
937
1450
  crudArgs: { stream: "test_stream" },
938
- id,
1451
+ pk,
1452
+ pkKey: "id",
939
1453
  retrieveArgs,
940
1454
  },
941
1455
  });
@@ -946,7 +1460,8 @@ describe("use/objectInstance.js", function () {
946
1460
  await expect(() => objectInstance.delete()).rejects.toThrow(ObjectError);
947
1461
  expect(objectInstance.state.crud.delete).toHaveBeenCalledWith({
948
1462
  crudArgs: { stream: "test_stream" },
949
- id: 1,
1463
+ pk: 1,
1464
+ pkKey: "id",
950
1465
  });
951
1466
  expect(objectInstance.state.crud.delete).toHaveBeenCalledTimes(1);
952
1467
  });
@@ -955,7 +1470,8 @@ describe("use/objectInstance.js", function () {
955
1470
  const objectInstanceA = useObjectInstance({
956
1471
  props: {
957
1472
  crudArgs: { stream: "test_streamA" },
958
- id: 1,
1473
+ pk: 1,
1474
+ pkKey: "id",
959
1475
  retrieveArgs: {
960
1476
  fields,
961
1477
  },
@@ -964,7 +1480,8 @@ describe("use/objectInstance.js", function () {
964
1480
  const objectInstanceB = useObjectInstance({
965
1481
  props: {
966
1482
  crudArgs: { stream: "test_streamB" },
967
- id: 2,
1483
+ pk: 2,
1484
+ pkKey: "id",
968
1485
  retrieveArgs: {
969
1486
  fields,
970
1487
  },
@@ -974,7 +1491,8 @@ describe("use/objectInstance.js", function () {
974
1491
  A: {
975
1492
  props: {
976
1493
  crudArgs: { stream: "test_streamA" },
977
- id: 1,
1494
+ pk: 1,
1495
+ pkKey: "id",
978
1496
  retrieveArgs: {
979
1497
  fields,
980
1498
  },
@@ -983,7 +1501,8 @@ describe("use/objectInstance.js", function () {
983
1501
  B: {
984
1502
  props: {
985
1503
  crudArgs: { stream: "test_streamB" },
986
- id: 2,
1504
+ pk: 2,
1505
+ pkKey: "id",
987
1506
  retrieveArgs: {
988
1507
  fields,
989
1508
  },
@@ -993,4 +1512,14 @@ describe("use/objectInstance.js", function () {
993
1512
  expect(inspect(objInstances.A)).toEqual(inspect(objectInstanceA));
994
1513
  expect(inspect(objInstances.B)).toEqual(inspect(objectInstanceB));
995
1514
  });
1515
+ it("useObjectInstance missing pkKey", async function () {
1516
+ const objectInstanceProps = {
1517
+ crudArgs: { stream: "test_streamA" },
1518
+ pk: 1,
1519
+ retrieveArgs: {
1520
+ fields,
1521
+ },
1522
+ };
1523
+ expect(() => useObjectInstance({ props: objectInstanceProps })).toThrow(ObjectError);
1524
+ });
996
1525
  });