@awarevue/agent-tester-cli 2.0.86 → 2.0.87

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.
@@ -0,0 +1,559 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const uuid_1 = require("uuid");
4
+ const scenario_types_1 = require("../../scenario.types");
5
+ const _utils_1 = require("./_utils");
6
+ const refsEqual = (a, b) => [...a].sort().join(",") === [...b].sort().join(",");
7
+ const testPersonIdempotence = async (ctx) => {
8
+ const awareId = (0, uuid_1.v4)();
9
+ const props = (0, _utils_1.newPerson)([{ type: "card", value: "87654321" }]);
10
+ const r1 = await ctx.getReply({
11
+ kind: "apply-change",
12
+ provider: ctx.provider,
13
+ refMap: { person: { [awareId]: [] } },
14
+ devices: {},
15
+ mutations: [
16
+ {
17
+ kind: "merge",
18
+ objectId: awareId,
19
+ objectKind: "person",
20
+ original: props,
21
+ props,
22
+ },
23
+ ],
24
+ });
25
+ const refs = r1.refs.person?.[awareId] ?? [];
26
+ if (refs.length < 1) {
27
+ throw new Error(`testPersonIdempotence: expected ≥1 ref after create, got ${refs.length}`);
28
+ }
29
+ ctx.log(`Created person with ${refs.length} ref(s)`);
30
+ ctx.registerCleanup(`person ${awareId}`, async () => {
31
+ await ctx.getReply({
32
+ kind: "apply-change",
33
+ provider: ctx.provider,
34
+ refMap: { person: { [awareId]: refs } },
35
+ devices: {},
36
+ mutations: [
37
+ {
38
+ kind: "delete",
39
+ objectId: awareId,
40
+ objectKind: "person",
41
+ original: props,
42
+ },
43
+ ],
44
+ });
45
+ });
46
+ const r2 = await ctx.getReply({
47
+ kind: "apply-change",
48
+ provider: ctx.provider,
49
+ refMap: { person: { [awareId]: refs } },
50
+ devices: {},
51
+ mutations: [
52
+ {
53
+ kind: "merge",
54
+ objectId: awareId,
55
+ objectKind: "person",
56
+ original: props,
57
+ props,
58
+ },
59
+ ],
60
+ });
61
+ const refs2 = r2.refs.person?.[awareId] ?? [];
62
+ if (refs2.length > 0 && !refsEqual(refs, refs2)) {
63
+ throw new Error(`Re-merge with identical props created a duplicate: original [${refs}], got [${refs2}]`);
64
+ }
65
+ ctx.log(`Re-merge with identical props did not create a new ref — no duplicate created`);
66
+ const updatedProps = {
67
+ ...props,
68
+ firstName: (0, _utils_1.uniqueName)(),
69
+ };
70
+ const r3 = await ctx.getReply({
71
+ kind: "apply-change",
72
+ provider: ctx.provider,
73
+ refMap: { person: { [awareId]: refs } },
74
+ devices: {},
75
+ mutations: [
76
+ {
77
+ kind: "merge",
78
+ objectId: awareId,
79
+ objectKind: "person",
80
+ original: props,
81
+ props: updatedProps,
82
+ },
83
+ ],
84
+ });
85
+ const refs3 = r3.refs.person?.[awareId] ?? [];
86
+ if (refs3.length > 0 && !refsEqual(refs, refs3)) {
87
+ throw new Error(`PATCH merge created a new ref — expected [${refs}] or none, got [${refs3}]`);
88
+ }
89
+ ctx.log(`PATCH update did not create a new ref`);
90
+ if (ctx.tags.includes(scenario_types_1.TAG_ACCESS_PROPS)) {
91
+ const dr = await ctx.getReply({
92
+ kind: "describe-object",
93
+ provider: ctx.provider,
94
+ objectKind: "person",
95
+ objectAssignedRef: refs.join(","),
96
+ });
97
+ if (dr.object === null) {
98
+ throw new Error(`describe-object returned null after PATCH update`);
99
+ }
100
+ const got = dr.object.data;
101
+ if (got.firstName !== updatedProps.firstName) {
102
+ throw new Error(`PATCH did not update firstName: expected "${updatedProps.firstName}", got "${got.firstName}"`);
103
+ }
104
+ if (got.lastName !== props.lastName) {
105
+ throw new Error(`PATCH clobbered lastName: expected "${props.lastName}", got "${got.lastName}"`);
106
+ }
107
+ if (!(0, _utils_1.personsMatch)(got, updatedProps)) {
108
+ throw new Error(`Person PATCH mismatch. Expected: ${JSON.stringify(updatedProps)}, Got: ${JSON.stringify(got)}`);
109
+ }
110
+ ctx.log(`PATCH verified: firstName updated, lastName and credentials preserved`);
111
+ }
112
+ await ctx.getReply({
113
+ kind: "apply-change",
114
+ provider: ctx.provider,
115
+ refMap: { person: { [awareId]: refs } },
116
+ devices: {},
117
+ mutations: [
118
+ {
119
+ kind: "delete",
120
+ objectId: awareId,
121
+ objectKind: "person",
122
+ original: updatedProps,
123
+ },
124
+ ],
125
+ });
126
+ ctx.log(`Deleted person — now applying second delete with stale refs`);
127
+ await ctx.getReply({
128
+ kind: "apply-change",
129
+ provider: ctx.provider,
130
+ refMap: { person: { [awareId]: refs } },
131
+ devices: {},
132
+ mutations: [
133
+ {
134
+ kind: "delete",
135
+ objectId: awareId,
136
+ objectKind: "person",
137
+ original: updatedProps,
138
+ },
139
+ ],
140
+ });
141
+ ctx.log(`Stale delete succeeded — idempotent delete for person confirmed`);
142
+ };
143
+ const testScheduleIdempotence = async (ctx) => {
144
+ const awareId = (0, uuid_1.v4)();
145
+ const props = (0, _utils_1.newSchedule)();
146
+ const r1 = await ctx.getReply({
147
+ kind: "apply-change",
148
+ provider: ctx.provider,
149
+ refMap: { schedule: { [awareId]: [] } },
150
+ devices: {},
151
+ mutations: [
152
+ {
153
+ kind: "merge",
154
+ objectId: awareId,
155
+ objectKind: "schedule",
156
+ original: props,
157
+ props,
158
+ },
159
+ ],
160
+ });
161
+ const refs = r1.refs.schedule?.[awareId] ?? [];
162
+ if (refs.length < 1) {
163
+ throw new Error(`testScheduleIdempotence: expected ≥1 ref after create, got ${refs.length}`);
164
+ }
165
+ ctx.log(`Created schedule with ${refs.length} ref(s)`);
166
+ ctx.registerCleanup(`schedule ${awareId}`, async () => {
167
+ await ctx.getReply({
168
+ kind: "apply-change",
169
+ provider: ctx.provider,
170
+ refMap: { schedule: { [awareId]: refs } },
171
+ devices: {},
172
+ mutations: [
173
+ {
174
+ kind: "delete",
175
+ objectId: awareId,
176
+ objectKind: "schedule",
177
+ original: props,
178
+ },
179
+ ],
180
+ });
181
+ });
182
+ const r2 = await ctx.getReply({
183
+ kind: "apply-change",
184
+ provider: ctx.provider,
185
+ refMap: { schedule: { [awareId]: refs } },
186
+ devices: {},
187
+ mutations: [
188
+ {
189
+ kind: "merge",
190
+ objectId: awareId,
191
+ objectKind: "schedule",
192
+ original: props,
193
+ props,
194
+ },
195
+ ],
196
+ });
197
+ const refs2 = r2.refs.schedule?.[awareId] ?? [];
198
+ if (refs2.length > 0 && !refsEqual(refs, refs2)) {
199
+ throw new Error(`Re-merge with identical props created a duplicate: original [${refs}], got [${refs2}]`);
200
+ }
201
+ ctx.log(`Re-merge with identical props did not create a new ref — no duplicate created`);
202
+ const updatedProps = {
203
+ ...props,
204
+ displayName: (0, _utils_1.uniqueName)(),
205
+ };
206
+ const r3 = await ctx.getReply({
207
+ kind: "apply-change",
208
+ provider: ctx.provider,
209
+ refMap: { schedule: { [awareId]: refs } },
210
+ devices: {},
211
+ mutations: [
212
+ {
213
+ kind: "merge",
214
+ objectId: awareId,
215
+ objectKind: "schedule",
216
+ original: props,
217
+ props: updatedProps,
218
+ },
219
+ ],
220
+ });
221
+ const refs3 = r3.refs.schedule?.[awareId] ?? [];
222
+ if (refs3.length > 0 && !refsEqual(refs, refs3)) {
223
+ throw new Error(`PATCH merge created a new ref — expected [${refs}] or none, got [${refs3}]`);
224
+ }
225
+ ctx.log(`PATCH update did not create a new ref`);
226
+ if (ctx.tags.includes(scenario_types_1.TAG_ACCESS_PROPS)) {
227
+ const dr = await ctx.getReply({
228
+ kind: "describe-object",
229
+ provider: ctx.provider,
230
+ objectKind: "schedule",
231
+ objectAssignedRef: refs.join(","),
232
+ });
233
+ if (dr.object === null) {
234
+ throw new Error(`describe-object returned null after PATCH update`);
235
+ }
236
+ const got = dr.object.data;
237
+ if (got.displayName !== updatedProps.displayName) {
238
+ throw new Error(`PATCH did not update displayName: expected "${updatedProps.displayName}", got "${got.displayName}"`);
239
+ }
240
+ if (!(0, _utils_1.schedulesMatch)(got, updatedProps)) {
241
+ throw new Error(`Schedule PATCH mismatch. Expected: ${JSON.stringify(updatedProps)}, Got: ${JSON.stringify(got)}`);
242
+ }
243
+ ctx.log(`PATCH verified: displayName updated, timeIntervals preserved`);
244
+ }
245
+ await ctx.getReply({
246
+ kind: "apply-change",
247
+ provider: ctx.provider,
248
+ refMap: { schedule: { [awareId]: refs } },
249
+ devices: {},
250
+ mutations: [
251
+ {
252
+ kind: "delete",
253
+ objectId: awareId,
254
+ objectKind: "schedule",
255
+ original: updatedProps,
256
+ },
257
+ ],
258
+ });
259
+ ctx.log(`Deleted schedule — now applying second delete with stale refs`);
260
+ await ctx.getReply({
261
+ kind: "apply-change",
262
+ provider: ctx.provider,
263
+ refMap: { schedule: { [awareId]: refs } },
264
+ devices: {},
265
+ mutations: [
266
+ {
267
+ kind: "delete",
268
+ objectId: awareId,
269
+ objectKind: "schedule",
270
+ original: updatedProps,
271
+ },
272
+ ],
273
+ });
274
+ ctx.log(`Stale delete succeeded — idempotent delete for schedule confirmed`);
275
+ };
276
+ const testAccessRuleIdempotence = async (ctx) => {
277
+ const devicesResponse = await ctx.getReply({
278
+ kind: "get-available-devices",
279
+ provider: ctx.provider,
280
+ });
281
+ const readers = devicesResponse.devices.filter((d) => d.type === "reader");
282
+ if (readers.length < 2) {
283
+ ctx.log(`Less than 2 readers found — skipping access rule idempotence test`);
284
+ return;
285
+ }
286
+ const [reader1, reader2] = readers;
287
+ const createPerson = async () => {
288
+ const id = (0, uuid_1.v4)();
289
+ const p = (0, _utils_1.newPerson)([]);
290
+ const r = await ctx.getReply({
291
+ kind: "apply-change",
292
+ provider: ctx.provider,
293
+ refMap: { person: { [id]: [] } },
294
+ devices: {},
295
+ mutations: [
296
+ {
297
+ kind: "merge",
298
+ objectId: id,
299
+ objectKind: "person",
300
+ original: p,
301
+ props: p,
302
+ },
303
+ ],
304
+ });
305
+ const refs = r.refs.person?.[id] ?? [];
306
+ if (refs.length < 1) {
307
+ throw new Error(`createPerson: expected ≥1 ref, got ${refs.length}`);
308
+ }
309
+ ctx.registerCleanup(`person ${id}`, async () => {
310
+ await ctx.getReply({
311
+ kind: "apply-change",
312
+ provider: ctx.provider,
313
+ refMap: { person: { [id]: refs } },
314
+ devices: {},
315
+ mutations: [
316
+ { kind: "delete", objectId: id, objectKind: "person", original: p },
317
+ ],
318
+ });
319
+ });
320
+ return { awareId: id, refs, props: p };
321
+ };
322
+ const createSchedule = async () => {
323
+ const id = (0, uuid_1.v4)();
324
+ const p = (0, _utils_1.newSchedule)();
325
+ const r = await ctx.getReply({
326
+ kind: "apply-change",
327
+ provider: ctx.provider,
328
+ refMap: { schedule: { [id]: [] } },
329
+ devices: {},
330
+ mutations: [
331
+ {
332
+ kind: "merge",
333
+ objectId: id,
334
+ objectKind: "schedule",
335
+ original: p,
336
+ props: p,
337
+ },
338
+ ],
339
+ });
340
+ const refs = r.refs.schedule?.[id] ?? [];
341
+ if (refs.length < 1) {
342
+ throw new Error(`createSchedule: expected ≥1 ref, got ${refs.length}`);
343
+ }
344
+ ctx.registerCleanup(`schedule ${id}`, async () => {
345
+ await ctx.getReply({
346
+ kind: "apply-change",
347
+ provider: ctx.provider,
348
+ refMap: { schedule: { [id]: refs } },
349
+ devices: {},
350
+ mutations: [
351
+ { kind: "delete", objectId: id, objectKind: "schedule", original: p },
352
+ ],
353
+ });
354
+ });
355
+ return { awareId: id, refs, props: p };
356
+ };
357
+ const p1 = await createPerson();
358
+ const p2 = await createPerson();
359
+ const s1 = await createSchedule();
360
+ const s2 = await createSchedule();
361
+ const reader1Id = (0, uuid_1.v4)();
362
+ const reader2Id = (0, uuid_1.v4)();
363
+ const ruleId = (0, uuid_1.v4)();
364
+ const ruleProps = {
365
+ ...(0, _utils_1.newRule)(),
366
+ appliedTo: [p1.awareId, p2.awareId],
367
+ permissions: [
368
+ { deviceId: reader1Id, scheduleId: s1.awareId },
369
+ { deviceId: reader2Id, scheduleId: s2.awareId },
370
+ ],
371
+ groupPermissions: [],
372
+ };
373
+ const dependentRefMap = {
374
+ person: { [p1.awareId]: p1.refs, [p2.awareId]: p2.refs },
375
+ schedule: { [s1.awareId]: s1.refs, [s2.awareId]: s2.refs },
376
+ device: {
377
+ [reader1Id]: [reader1.foreignRef],
378
+ [reader2Id]: [reader2.foreignRef],
379
+ },
380
+ };
381
+ const devices = {
382
+ [reader1Id]: reader1,
383
+ [reader2Id]: reader2,
384
+ };
385
+ const r1 = await ctx.getReply({
386
+ kind: "apply-change",
387
+ provider: ctx.provider,
388
+ refMap: { accessRule: { [ruleId]: [] }, ...dependentRefMap },
389
+ devices,
390
+ mutations: [
391
+ {
392
+ kind: "merge",
393
+ objectId: ruleId,
394
+ objectKind: "accessRule",
395
+ original: ruleProps,
396
+ props: ruleProps,
397
+ },
398
+ ],
399
+ });
400
+ const ruleRefs = r1.refs.accessRule?.[ruleId] ?? [];
401
+ if (ruleRefs.length < 1) {
402
+ throw new Error(`testAccessRuleIdempotence: expected ≥1 ref after create, got ${ruleRefs.length}`);
403
+ }
404
+ ctx.log(`Created access rule with ${ruleRefs.length} ref(s)`);
405
+ ctx.registerCleanup(`accessRule ${ruleId}`, async () => {
406
+ await ctx.getReply({
407
+ kind: "apply-change",
408
+ provider: ctx.provider,
409
+ refMap: { accessRule: { [ruleId]: ruleRefs }, ...dependentRefMap },
410
+ devices,
411
+ mutations: [
412
+ {
413
+ kind: "delete",
414
+ objectId: ruleId,
415
+ objectKind: "accessRule",
416
+ original: ruleProps,
417
+ },
418
+ ],
419
+ });
420
+ });
421
+ const r2 = await ctx.getReply({
422
+ kind: "apply-change",
423
+ provider: ctx.provider,
424
+ refMap: { accessRule: { [ruleId]: ruleRefs }, ...dependentRefMap },
425
+ devices,
426
+ mutations: [
427
+ {
428
+ kind: "merge",
429
+ objectId: ruleId,
430
+ objectKind: "accessRule",
431
+ original: ruleProps,
432
+ props: ruleProps,
433
+ },
434
+ ],
435
+ });
436
+ const ruleRefs2 = r2.refs.accessRule?.[ruleId] ?? [];
437
+ if (ruleRefs2.length > 0 && !refsEqual(ruleRefs, ruleRefs2)) {
438
+ throw new Error(`Re-merge with identical props created a duplicate: original [${ruleRefs}], got [${ruleRefs2}]`);
439
+ }
440
+ ctx.log(`Re-merge with identical props did not create a new ref — no duplicate created`);
441
+ const updatedRuleProps = {
442
+ ...ruleProps,
443
+ displayName: (0, _utils_1.uniqueName)(),
444
+ };
445
+ const r3 = await ctx.getReply({
446
+ kind: "apply-change",
447
+ provider: ctx.provider,
448
+ refMap: { accessRule: { [ruleId]: ruleRefs }, ...dependentRefMap },
449
+ devices,
450
+ mutations: [
451
+ {
452
+ kind: "merge",
453
+ objectId: ruleId,
454
+ objectKind: "accessRule",
455
+ original: ruleProps,
456
+ props: updatedRuleProps,
457
+ },
458
+ ],
459
+ });
460
+ const ruleRefs3 = r3.refs.accessRule?.[ruleId] ?? [];
461
+ if (ruleRefs3.length > 0 && !refsEqual(ruleRefs, ruleRefs3)) {
462
+ throw new Error(`PATCH merge created a new ref — expected [${ruleRefs}] or none, got [${ruleRefs3}]`);
463
+ }
464
+ ctx.log(`PATCH update did not create a new ref`);
465
+ if (ctx.tags.includes(scenario_types_1.TAG_ACCESS_PROPS)) {
466
+ const dr = await ctx.getReply({
467
+ kind: "describe-object",
468
+ provider: ctx.provider,
469
+ objectKind: "accessRule",
470
+ objectAssignedRef: ruleRefs.join(","),
471
+ });
472
+ if (dr.object === null) {
473
+ throw new Error(`describe-object returned null after PATCH update`);
474
+ }
475
+ const normalizedRuleProps = {
476
+ ...updatedRuleProps,
477
+ appliedTo: [p1.refs.join(","), p2.refs.join(",")],
478
+ permissions: [
479
+ { deviceId: reader1.foreignRef, scheduleId: s1.refs.join(",") },
480
+ { deviceId: reader2.foreignRef, scheduleId: s2.refs.join(",") },
481
+ ],
482
+ };
483
+ const got = dr.object.data;
484
+ if (got.displayName !== updatedRuleProps.displayName) {
485
+ throw new Error(`PATCH did not update displayName: expected "${updatedRuleProps.displayName}", got "${got.displayName}"`);
486
+ }
487
+ if (!(0, _utils_1.rulesMatch)(got, normalizedRuleProps)) {
488
+ throw new Error(`AccessRule PATCH mismatch. Expected: ${JSON.stringify(normalizedRuleProps)}, Got: ${JSON.stringify(got)}`);
489
+ }
490
+ ctx.log(`PATCH verified: displayName updated, appliedTo and permissions preserved`);
491
+ }
492
+ await ctx.getReply({
493
+ kind: "apply-change",
494
+ provider: ctx.provider,
495
+ refMap: { accessRule: { [ruleId]: ruleRefs }, ...dependentRefMap },
496
+ devices,
497
+ mutations: [
498
+ {
499
+ kind: "delete",
500
+ objectId: ruleId,
501
+ objectKind: "accessRule",
502
+ original: updatedRuleProps,
503
+ },
504
+ ],
505
+ });
506
+ ctx.log(`Deleted access rule — now applying second delete with stale refs`);
507
+ await ctx.getReply({
508
+ kind: "apply-change",
509
+ provider: ctx.provider,
510
+ refMap: { accessRule: { [ruleId]: ruleRefs }, ...dependentRefMap },
511
+ devices,
512
+ mutations: [
513
+ {
514
+ kind: "delete",
515
+ objectId: ruleId,
516
+ objectKind: "accessRule",
517
+ original: updatedRuleProps,
518
+ },
519
+ ],
520
+ });
521
+ ctx.log(`Stale delete succeeded — idempotent delete for access rule confirmed`);
522
+ };
523
+ const s = {
524
+ tags: [scenario_types_1.TAG_ACCESS],
525
+ name: "Access Sync: Idempotence",
526
+ description: "Verifies that (1) deleting non-existing refs succeeds, (2) re-merging an object with identical props does not create duplicates, and (3) merges behave PATCH-like: only changed fields are updated and refs remain stable",
527
+ run: async (ctx) => {
528
+ await ctx.getReply({
529
+ kind: "start",
530
+ provider: ctx.provider,
531
+ config: ctx.config,
532
+ lastEventForeignRef: null,
533
+ lastEventTimestamp: null,
534
+ });
535
+ const accessObjects = ctx.registerPayload.accessControlProviders
536
+ ? ctx.registerPayload.accessControlProviders[ctx.provider].accessObjects
537
+ : [];
538
+ if (accessObjects.includes("person")) {
539
+ ctx.log(`Testing person idempotence...`);
540
+ await testPersonIdempotence(ctx);
541
+ }
542
+ if (accessObjects.includes("schedule")) {
543
+ ctx.log(`Testing schedule idempotence...`);
544
+ await testScheduleIdempotence(ctx);
545
+ }
546
+ if (accessObjects.includes("accessRule")) {
547
+ ctx.log(`Testing access rule idempotence...`);
548
+ await testAccessRuleIdempotence(ctx);
549
+ }
550
+ await ctx.runCleanups();
551
+ await ctx.getReply({
552
+ kind: "stop",
553
+ provider: ctx.provider,
554
+ });
555
+ return (0, scenario_types_1.scenarioPass)();
556
+ },
557
+ };
558
+ exports.default = s;
559
+ //# sourceMappingURL=idempotence.scenario.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idempotence.scenario.js","sourceRoot":"","sources":["../../../src/scenarios/access/idempotence.scenario.ts"],"names":[],"mappings":"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"}