@awarevue/agent-tester-cli 2.0.54

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 (69) hide show
  1. package/bin/agent-tester.js +3 -0
  2. package/dist/.tsbuildinfo +1 -0
  3. package/dist/app.module.d.ts +5 -0
  4. package/dist/app.module.js +36 -0
  5. package/dist/app.module.js.map +1 -0
  6. package/dist/cli-options.d.ts +12 -0
  7. package/dist/cli-options.js +5 -0
  8. package/dist/cli-options.js.map +1 -0
  9. package/dist/helpers/device-state-store.d.ts +19 -0
  10. package/dist/helpers/device-state-store.js +79 -0
  11. package/dist/helpers/device-state-store.js.map +1 -0
  12. package/dist/hub.service.d.ts +24 -0
  13. package/dist/hub.service.js +111 -0
  14. package/dist/hub.service.js.map +1 -0
  15. package/dist/index.d.ts +3 -0
  16. package/dist/index.js +12 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/loader.d.ts +3 -0
  19. package/dist/loader.js +43 -0
  20. package/dist/loader.js.map +1 -0
  21. package/dist/main.d.ts +1 -0
  22. package/dist/main.js +230 -0
  23. package/dist/main.js.map +1 -0
  24. package/dist/reporter.d.ts +11 -0
  25. package/dist/reporter.js +94 -0
  26. package/dist/reporter.js.map +1 -0
  27. package/dist/runner.service.d.ts +11 -0
  28. package/dist/runner.service.js +180 -0
  29. package/dist/runner.service.js.map +1 -0
  30. package/dist/scenario.types.d.ts +42 -0
  31. package/dist/scenario.types.js +14 -0
  32. package/dist/scenario.types.js.map +1 -0
  33. package/dist/scenarios/access/_utils.d.ts +6 -0
  34. package/dist/scenarios/access/_utils.js +52 -0
  35. package/dist/scenarios/access/_utils.js.map +1 -0
  36. package/dist/scenarios/access/communicates-bad-references.scenario.d.ts +3 -0
  37. package/dist/scenarios/access/communicates-bad-references.scenario.js +81 -0
  38. package/dist/scenarios/access/communicates-bad-references.scenario.js.map +1 -0
  39. package/dist/scenarios/access/communicates-not-found.scenario.d.ts +3 -0
  40. package/dist/scenarios/access/communicates-not-found.scenario.js +76 -0
  41. package/dist/scenarios/access/communicates-not-found.scenario.js.map +1 -0
  42. package/dist/scenarios/access/merges-access-objects.scenario.d.ts +3 -0
  43. package/dist/scenarios/access/merges-access-objects.scenario.js +187 -0
  44. package/dist/scenarios/access/merges-access-objects.scenario.js.map +1 -0
  45. package/dist/scenarios/access/people.scenario.d.ts +3 -0
  46. package/dist/scenarios/access/people.scenario.js +140 -0
  47. package/dist/scenarios/access/people.scenario.js.map +1 -0
  48. package/dist/scenarios/device-discovery.scenario.d.ts +3 -0
  49. package/dist/scenarios/device-discovery.scenario.js +43 -0
  50. package/dist/scenarios/device-discovery.scenario.js.map +1 -0
  51. package/dist/scenarios/doors/communicates-init-door-states.scenario.d.ts +3 -0
  52. package/dist/scenarios/doors/communicates-init-door-states.scenario.js +31 -0
  53. package/dist/scenarios/doors/communicates-init-door-states.scenario.js.map +1 -0
  54. package/dist/scenarios/doors/door-lock-unlock.scenario.d.ts +3 -0
  55. package/dist/scenarios/doors/door-lock-unlock.scenario.js +59 -0
  56. package/dist/scenarios/doors/door-lock-unlock.scenario.js.map +1 -0
  57. package/dist/scenarios/doors/door-release.scenario.d.ts +3 -0
  58. package/dist/scenarios/doors/door-release.scenario.js +52 -0
  59. package/dist/scenarios/doors/door-release.scenario.js.map +1 -0
  60. package/dist/scenarios/register.scenario.d.ts +3 -0
  61. package/dist/scenarios/register.scenario.js +32 -0
  62. package/dist/scenarios/register.scenario.js.map +1 -0
  63. package/dist/scenarios/start-stop.scenario.d.ts +3 -0
  64. package/dist/scenarios/start-stop.scenario.js +39 -0
  65. package/dist/scenarios/start-stop.scenario.js.map +1 -0
  66. package/dist/ws-server-transport.d.ts +17 -0
  67. package/dist/ws-server-transport.js +73 -0
  68. package/dist/ws-server-transport.js.map +1 -0
  69. package/package.json +60 -0
@@ -0,0 +1,187 @@
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 mergePerson = async (ctx) => {
7
+ const awareId = (0, uuid_1.v4)();
8
+ const personProps = (0, _utils_1.newPerson)();
9
+ const validateResult = await ctx.getReply({
10
+ kind: "validate-change",
11
+ provider: ctx.provider,
12
+ refMap: {
13
+ person: {
14
+ [awareId]: [],
15
+ },
16
+ },
17
+ devices: {},
18
+ mutations: [
19
+ {
20
+ kind: "merge",
21
+ objectId: awareId,
22
+ objectKind: "person",
23
+ original: null,
24
+ props: personProps,
25
+ },
26
+ ],
27
+ });
28
+ if (validateResult.issues.length > 0) {
29
+ return (0, scenario_types_1.scenarioFail)(`Expected 0 issues, got ${validateResult.issues.length}`);
30
+ }
31
+ ctx.log(`Validation passed with 0 issues as expected`);
32
+ const applyResult = await ctx.getReply({
33
+ kind: "apply-change",
34
+ provider: ctx.provider,
35
+ refMap: {
36
+ person: {
37
+ [awareId]: [],
38
+ },
39
+ },
40
+ devices: {},
41
+ mutations: [
42
+ {
43
+ kind: "merge",
44
+ objectId: awareId,
45
+ objectKind: "person",
46
+ original: null,
47
+ props: personProps,
48
+ },
49
+ ],
50
+ });
51
+ const references = applyResult.refs.person?.[awareId] || [];
52
+ if (references.length < 1) {
53
+ return (0, scenario_types_1.scenarioFail)(`Expected 1 reference, got ${references.length}`);
54
+ }
55
+ ctx.log(`Apply succeeded with ${references.length} reference(s) as expected`);
56
+ await ctx.getReply({
57
+ kind: "apply-change",
58
+ provider: ctx.provider,
59
+ refMap: {
60
+ person: {
61
+ [awareId]: references,
62
+ },
63
+ },
64
+ devices: {},
65
+ mutations: [
66
+ {
67
+ kind: "delete",
68
+ objectId: awareId,
69
+ objectKind: "person",
70
+ original: {
71
+ ...personProps,
72
+ },
73
+ },
74
+ ],
75
+ });
76
+ ctx.log(`Deleted person to clean up after test`);
77
+ };
78
+ const mergeSchedule = async (ctx) => {
79
+ const awareId = (0, uuid_1.v4)();
80
+ const scheduleProps = (0, _utils_1.newSchedule)();
81
+ const validateResult = await ctx.getReply({
82
+ kind: "validate-change",
83
+ provider: ctx.provider,
84
+ refMap: {
85
+ schedule: {
86
+ [awareId]: [],
87
+ },
88
+ },
89
+ devices: {},
90
+ mutations: [
91
+ {
92
+ kind: "merge",
93
+ objectId: awareId,
94
+ objectKind: "schedule",
95
+ original: null,
96
+ props: scheduleProps,
97
+ },
98
+ ],
99
+ });
100
+ if (validateResult.issues.length > 0) {
101
+ return (0, scenario_types_1.scenarioFail)(`Expected 0 issues, got ${validateResult.issues.length}`);
102
+ }
103
+ ctx.log(`Validation passed with 0 issues as expected`);
104
+ const applyResult = await ctx.getReply({
105
+ kind: "apply-change",
106
+ provider: ctx.provider,
107
+ refMap: {
108
+ schedule: {
109
+ [awareId]: [],
110
+ },
111
+ },
112
+ devices: {},
113
+ mutations: [
114
+ {
115
+ kind: "merge",
116
+ objectId: awareId,
117
+ objectKind: "schedule",
118
+ original: null,
119
+ props: scheduleProps,
120
+ },
121
+ ],
122
+ });
123
+ const references = applyResult.refs.schedule?.[awareId] || [];
124
+ if (references.length < 1) {
125
+ return (0, scenario_types_1.scenarioFail)(`Expected 1 reference, got ${references.length}`);
126
+ }
127
+ ctx.log(`Apply succeeded with ${references.length} reference(s) as expected`);
128
+ await ctx.getReply({
129
+ kind: "apply-change",
130
+ provider: ctx.provider,
131
+ refMap: {
132
+ schedule: {
133
+ [awareId]: references,
134
+ },
135
+ },
136
+ devices: {},
137
+ mutations: [
138
+ {
139
+ kind: "delete",
140
+ objectId: awareId,
141
+ objectKind: "schedule",
142
+ original: {
143
+ ...scheduleProps,
144
+ },
145
+ },
146
+ ],
147
+ });
148
+ ctx.log(`Deleted schedule to clean up after test`);
149
+ };
150
+ const mergeZone = async () => {
151
+ };
152
+ const s = {
153
+ tags: ["access"],
154
+ name: "Access Sync: Merges Access Objects it supports",
155
+ description: "Access Sync: Merges Access Objects it supports",
156
+ run: async (ctx) => {
157
+ await ctx.getReply({
158
+ kind: "start",
159
+ provider: ctx.provider,
160
+ config: ctx.config,
161
+ lastEventForeignRef: null,
162
+ lastEventTimestamp: null,
163
+ });
164
+ const accessObjects = ctx.registerPayload.accessControlProviders
165
+ ? ctx.registerPayload.accessControlProviders[ctx.provider].accessObjects
166
+ : [];
167
+ if (accessObjects.includes("person")) {
168
+ ctx.log(`Provider supports 'person' access object, testing merge...`);
169
+ await mergePerson(ctx);
170
+ }
171
+ if (accessObjects.includes("schedule")) {
172
+ ctx.log(`Provider supports 'schedule' access object, testing merge...`);
173
+ await mergeSchedule(ctx);
174
+ }
175
+ if (accessObjects.includes("zone")) {
176
+ ctx.log(`Provider supports 'zone' access object, testing merge...`);
177
+ await mergeZone();
178
+ }
179
+ await ctx.getReply({
180
+ kind: "stop",
181
+ provider: ctx.provider,
182
+ });
183
+ return (0, scenario_types_1.scenarioPass)();
184
+ },
185
+ };
186
+ exports.default = s;
187
+ //# sourceMappingURL=merges-access-objects.scenario.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merges-access-objects.scenario.js","sourceRoot":"","sources":["../../../src/scenarios/access/merges-access-objects.scenario.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Scenario } from "../../scenario.types";
2
+ declare const s: Scenario;
3
+ export default s;
@@ -0,0 +1,140 @@
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 isScenarioFailResult = (v) => typeof v === "object" && v !== null && "passed" in v;
7
+ const createPerson = async (ctx, person) => {
8
+ const validateResult = await ctx.getReply({
9
+ kind: "validate-change",
10
+ provider: ctx.provider,
11
+ refMap: {
12
+ person: {
13
+ [person.awareId]: [],
14
+ },
15
+ },
16
+ devices: {},
17
+ mutations: [
18
+ {
19
+ kind: "merge",
20
+ objectId: person.awareId,
21
+ objectKind: "person",
22
+ original: null,
23
+ props: person.person,
24
+ },
25
+ ],
26
+ });
27
+ if (validateResult.issues.length > 0) {
28
+ return (0, scenario_types_1.scenarioFail)(`Expected 0 issues, got ${validateResult.issues.length}`);
29
+ }
30
+ ctx.log(`Validation passed with 0 issues as expected`);
31
+ const applyResult = await ctx.getReply({
32
+ kind: "apply-change",
33
+ provider: ctx.provider,
34
+ refMap: {
35
+ person: {
36
+ [person.awareId]: [],
37
+ },
38
+ },
39
+ devices: {},
40
+ mutations: [
41
+ {
42
+ kind: "merge",
43
+ objectId: person.awareId,
44
+ objectKind: "person",
45
+ original: null,
46
+ props: person.person,
47
+ },
48
+ ],
49
+ });
50
+ const references = applyResult.refs.person?.[person.awareId] || [];
51
+ if (references.length < 1) {
52
+ return (0, scenario_types_1.scenarioFail)(`Expected 1 reference, got ${references.length}`);
53
+ }
54
+ ctx.log(`Apply succeeded with ${references.length} reference(s) as expected`);
55
+ return references;
56
+ };
57
+ const createPeople = async (ctx) => {
58
+ const person1 = { awareId: (0, uuid_1.v4)(), person: (0, _utils_1.newPerson)() };
59
+ const person2 = { awareId: (0, uuid_1.v4)(), person: (0, _utils_1.newPerson)() };
60
+ const person3 = { awareId: (0, uuid_1.v4)(), person: (0, _utils_1.newPerson)() };
61
+ const person4 = { awareId: (0, uuid_1.v4)(), person: (0, _utils_1.newPerson)() };
62
+ ctx.log(`Creating four people`);
63
+ const ref1 = await createPerson(ctx, person1);
64
+ const ref2 = await createPerson(ctx, person2);
65
+ const ref3 = await createPerson(ctx, person3);
66
+ const ref4 = await createPerson(ctx, person4);
67
+ if (isScenarioFailResult(ref1))
68
+ return ref1;
69
+ if (isScenarioFailResult(ref2))
70
+ return ref2;
71
+ if (isScenarioFailResult(ref3))
72
+ return ref3;
73
+ if (isScenarioFailResult(ref4))
74
+ return ref4;
75
+ const flatRefs = [ref1, ref2, ref3, ref4].flat();
76
+ const uniqueRefs = new Set(flatRefs);
77
+ if (uniqueRefs.size !== flatRefs.length) {
78
+ return (0, scenario_types_1.scenarioFail)(`Expected all references to be unique, but found duplicates`);
79
+ }
80
+ ctx.log(`All created people have unique references as expected`);
81
+ return [
82
+ { person: person1, refs: ref1 },
83
+ { person: person2, refs: ref2 },
84
+ { person: person3, refs: ref3 },
85
+ { person: person4, refs: ref4 },
86
+ ];
87
+ };
88
+ const deletePeople = async (ctx, people) => {
89
+ await Promise.all(people.map(({ refs, person }) => ctx.getReply({
90
+ kind: "apply-change",
91
+ provider: ctx.provider,
92
+ refMap: {
93
+ person: {
94
+ [person.awareId]: refs,
95
+ },
96
+ },
97
+ devices: {},
98
+ mutations: [
99
+ {
100
+ kind: "delete",
101
+ objectId: person.awareId,
102
+ objectKind: "person",
103
+ original: person.person,
104
+ },
105
+ ],
106
+ })));
107
+ ctx.log(`Deleted all created people`);
108
+ };
109
+ const s = {
110
+ tags: ["access"],
111
+ name: "Access Sync: Person CRUD operations work correctly",
112
+ description: "Access Sync: Person CRUD operations work correctly",
113
+ run: async (ctx) => {
114
+ await ctx.getReply({
115
+ kind: "start",
116
+ provider: ctx.provider,
117
+ config: ctx.config,
118
+ lastEventForeignRef: null,
119
+ lastEventTimestamp: null,
120
+ });
121
+ const accessObjects = ctx.registerPayload.accessControlProviders
122
+ ? ctx.registerPayload.accessControlProviders[ctx.provider].accessObjects
123
+ : [];
124
+ if (accessObjects.includes("person")) {
125
+ ctx.log(`Provider supports 'person' access object, testing ...`);
126
+ const people = await createPeople(ctx);
127
+ if (isScenarioFailResult(people)) {
128
+ return people;
129
+ }
130
+ await deletePeople(ctx, people);
131
+ }
132
+ await ctx.getReply({
133
+ kind: "stop",
134
+ provider: ctx.provider,
135
+ });
136
+ return (0, scenario_types_1.scenarioPass)();
137
+ },
138
+ };
139
+ exports.default = s;
140
+ //# sourceMappingURL=people.scenario.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"people.scenario.js","sourceRoot":"","sources":["../../../src/scenarios/access/people.scenario.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Scenario } from "../scenario.types";
2
+ declare const scenario: Scenario;
3
+ export default scenario;
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const scenario_types_1 = require("../scenario.types");
4
+ const scenario = {
5
+ name: "device-discovery",
6
+ description: "Starts the agent and requests available devices, validates the response",
7
+ tags: ["core", "devices"],
8
+ async run(ctx) {
9
+ const { provider, config } = ctx;
10
+ await ctx.getReply({
11
+ kind: "start",
12
+ provider,
13
+ config,
14
+ lastEventForeignRef: null,
15
+ lastEventTimestamp: null,
16
+ });
17
+ ctx.log("Provider started");
18
+ const devicesResponse = await ctx.getReply({
19
+ kind: "get-available-devices",
20
+ provider,
21
+ });
22
+ ctx.log(`Received device discovery response (kind: ${devicesResponse.kind})`);
23
+ const errors = [];
24
+ if (devicesResponse.kind !== "get-available-devices-rs") {
25
+ errors.push(`Expected kind 'get-available-devices-rs', got '${devicesResponse.kind}'`);
26
+ }
27
+ try {
28
+ await ctx.getReply({
29
+ kind: "stop",
30
+ provider,
31
+ });
32
+ }
33
+ catch {
34
+ ctx.log("Warning: failed to stop provider after test");
35
+ }
36
+ if (errors.length > 0) {
37
+ return (0, scenario_types_1.scenarioFail)(...errors);
38
+ }
39
+ return (0, scenario_types_1.scenarioPass)();
40
+ },
41
+ };
42
+ exports.default = scenario;
43
+ //# sourceMappingURL=device-discovery.scenario.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"device-discovery.scenario.js","sourceRoot":"","sources":["../../src/scenarios/device-discovery.scenario.ts"],"names":[],"mappings":";;AAAA,sDAAyE;AAMzE,MAAM,QAAQ,GAAa;IACzB,IAAI,EAAE,kBAAkB;IACxB,WAAW,EACT,yEAAyE;IAC3E,IAAI,EAAE,CAAC,MAAM,EAAE,SAAS,CAAC;IAEzB,KAAK,CAAC,GAAG,CAAC,GAAG;QACX,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC;QAIjC,MAAM,GAAG,CAAC,QAAQ,CAAC;YACjB,IAAI,EAAE,OAAO;YACb,QAAQ;YACR,MAAM;YACN,mBAAmB,EAAE,IAAI;YACzB,kBAAkB,EAAE,IAAI;SACzB,CAAC,CAAC;QAEH,GAAG,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;QAG5B,MAAM,eAAe,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC;YACzC,IAAI,EAAE,uBAAuB;YAC7B,QAAQ;SACT,CAAC,CAAC;QAEH,GAAG,CAAC,GAAG,CACL,6CAA6C,eAAe,CAAC,IAAI,GAAG,CACrE,CAAC;QAGF,MAAM,MAAM,GAAa,EAAE,CAAC;QAE5B,IAAI,eAAe,CAAC,IAAI,KAAK,0BAA0B,EAAE,CAAC;YACxD,MAAM,CAAC,IAAI,CACT,kDAAkD,eAAe,CAAC,IAAI,GAAG,CAC1E,CAAC;QACJ,CAAC;QAGD,IAAI,CAAC;YACH,MAAM,GAAG,CAAC,QAAQ,CAAC;gBACjB,IAAI,EAAE,MAAM;gBACZ,QAAQ;aACT,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YAEP,GAAG,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;QACzD,CAAC;QAED,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,OAAO,IAAA,6BAAY,EAAC,GAAG,MAAM,CAAC,CAAC;QACjC,CAAC;QAED,OAAO,IAAA,6BAAY,GAAE,CAAC;IACxB,CAAC;CACF,CAAC;AAEF,kBAAe,QAAQ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Scenario } from "../../scenario.types";
2
+ declare const s: Scenario;
3
+ export default s;
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const scenario_types_1 = require("../../scenario.types");
4
+ const s = {
5
+ tags: ["doors"],
6
+ name: "Doors: Communicates initial states upon start",
7
+ description: "Doors: Communicates initial states upon start",
8
+ run: async (ctx) => {
9
+ await ctx.getReply({
10
+ kind: "start",
11
+ provider: ctx.provider,
12
+ config: ctx.config,
13
+ lastEventForeignRef: null,
14
+ lastEventTimestamp: null,
15
+ });
16
+ const devicesResponse = await ctx.getReply({
17
+ kind: "get-available-devices",
18
+ provider: ctx.provider,
19
+ });
20
+ const doors = devicesResponse.devices.filter((d) => d.type === "door");
21
+ const doorRefs = doors.map((d) => d.foreignRef);
22
+ await ctx.deviceState.waitForDevices(doorRefs, (state) => "connected" in state, 30000);
23
+ await ctx.getReply({
24
+ kind: "stop",
25
+ provider: ctx.provider,
26
+ });
27
+ return (0, scenario_types_1.scenarioPass)();
28
+ },
29
+ };
30
+ exports.default = s;
31
+ //# sourceMappingURL=communicates-init-door-states.scenario.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"communicates-init-door-states.scenario.js","sourceRoot":"","sources":["../../../src/scenarios/doors/communicates-init-door-states.scenario.ts"],"names":[],"mappings":";;AAAA,yDAA8D;AAE9D,MAAM,CAAC,GAAa;IAClB,IAAI,EAAE,CAAC,OAAO,CAAC;IACf,IAAI,EAAE,+CAA+C;IACrD,WAAW,EAAE,+CAA+C;IAC5D,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QAEjB,MAAM,GAAG,CAAC,QAAQ,CAAC;YACjB,IAAI,EAAE,OAAO;YACb,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,mBAAmB,EAAE,IAAI;YACzB,kBAAkB,EAAE,IAAI;SACzB,CAAC,CAAC;QAGH,MAAM,eAAe,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC;YACzC,IAAI,EAAE,uBAAuB;YAC7B,QAAQ,EAAE,GAAG,CAAC,QAAQ;SACvB,CAAC,CAAC;QAGH,MAAM,KAAK,GAAG,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;QACvE,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;QAGhD,MAAM,GAAG,CAAC,WAAW,CAAC,cAAc,CAClC,QAAQ,EACR,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,IAAI,KAAK,EAC/B,KAAK,CACN,CAAC;QAGF,MAAM,GAAG,CAAC,QAAQ,CAAC;YACjB,IAAI,EAAE,MAAM;YACZ,QAAQ,EAAE,GAAG,CAAC,QAAQ;SACvB,CAAC,CAAC;QAEH,OAAO,IAAA,6BAAY,GAAE,CAAC;IACxB,CAAC;CACF,CAAC;AAEF,kBAAe,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Scenario } from "../../scenario.types";
2
+ declare const s: Scenario;
3
+ export default s;
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const scenario_types_1 = require("../../scenario.types");
4
+ const s = {
5
+ tags: ["doors"],
6
+ name: "Doors: Doors lock and unlock correctly",
7
+ description: "Doors: Doors lock and unlock correctly",
8
+ run: async (ctx) => {
9
+ await ctx.getReply({
10
+ kind: "start",
11
+ provider: ctx.provider,
12
+ config: ctx.config,
13
+ lastEventForeignRef: null,
14
+ lastEventTimestamp: null,
15
+ });
16
+ const devicesResponse = await ctx.getReply({
17
+ kind: "get-available-devices",
18
+ provider: ctx.provider,
19
+ });
20
+ const doors = devicesResponse.devices.filter((d) => d.type === "door");
21
+ const doorRefs = doors.map((d) => d.foreignRef);
22
+ ctx.log(`Found ${doors.length} doors`);
23
+ const states = await ctx.deviceState.waitForDevices(doorRefs, (state) => "connected" in state, 30000);
24
+ const connectedDoors = doors.filter((door) => {
25
+ const state = states.get(door.foreignRef);
26
+ return state && state.connected === true;
27
+ });
28
+ ctx.log(`Found ${connectedDoors.length} connected doors`);
29
+ if (connectedDoors.length === 0) {
30
+ throw new Error("No connected doors found, cannot proceed with test");
31
+ }
32
+ await Promise.all(connectedDoors.map((door) => ctx.getReply({
33
+ kind: "command",
34
+ device: { ...door, presets: [] },
35
+ command: "door.unlock",
36
+ params: {},
37
+ })));
38
+ ctx.log(`Sent unlock command to ${connectedDoors.length} connected doors`);
39
+ const connectedRefs = connectedDoors.map((d) => d.foreignRef);
40
+ await ctx.deviceState.waitForDevices(connectedRefs, (state) => state.locked === false, 30000);
41
+ ctx.log(`All ${connectedDoors.length} doors are now unlocked`);
42
+ await Promise.all(connectedDoors.map((door) => ctx.getReply({
43
+ kind: "command",
44
+ device: { ...door, presets: [] },
45
+ command: "door.lock",
46
+ params: {},
47
+ })));
48
+ ctx.log(`Sent lock command to ${connectedDoors.length} connected doors`);
49
+ await ctx.deviceState.waitForDevices(connectedRefs, (state) => state.locked === true, 30000);
50
+ ctx.log(`All ${connectedDoors.length} doors are now locked`);
51
+ await ctx.getReply({
52
+ kind: "stop",
53
+ provider: ctx.provider,
54
+ });
55
+ return (0, scenario_types_1.scenarioPass)();
56
+ },
57
+ };
58
+ exports.default = s;
59
+ //# sourceMappingURL=door-lock-unlock.scenario.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"door-lock-unlock.scenario.js","sourceRoot":"","sources":["../../../src/scenarios/doors/door-lock-unlock.scenario.ts"],"names":[],"mappings":";;AAAA,yDAA8D;AAE9D,MAAM,CAAC,GAAa;IAClB,IAAI,EAAE,CAAC,OAAO,CAAC;IACf,IAAI,EAAE,wCAAwC;IAC9C,WAAW,EAAE,wCAAwC;IACrD,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QAEjB,MAAM,GAAG,CAAC,QAAQ,CAAC;YACjB,IAAI,EAAE,OAAO;YACb,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,mBAAmB,EAAE,IAAI;YACzB,kBAAkB,EAAE,IAAI;SACzB,CAAC,CAAC;QAGH,MAAM,eAAe,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC;YACzC,IAAI,EAAE,uBAAuB;YAC7B,QAAQ,EAAE,GAAG,CAAC,QAAQ;SACvB,CAAC,CAAC;QAGH,MAAM,KAAK,GAAG,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;QACvE,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;QAEhD,GAAG,CAAC,GAAG,CAAC,SAAS,KAAK,CAAC,MAAM,QAAQ,CAAC,CAAC;QAGvC,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,WAAW,CAAC,cAAc,CACjD,QAAQ,EACR,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,IAAI,KAAK,EAC/B,KAAK,CACN,CAAC;QAGF,MAAM,cAAc,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;YAC3C,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC1C,OAAO,KAAK,IAAI,KAAK,CAAC,SAAS,KAAK,IAAI,CAAC;QAC3C,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,GAAG,CAAC,SAAS,cAAc,CAAC,MAAM,kBAAkB,CAAC,CAAC;QAE1D,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;QACxE,CAAC;QAGD,MAAM,OAAO,CAAC,GAAG,CACf,cAAc,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAC1B,GAAG,CAAC,QAAQ,CAAC;YACX,IAAI,EAAE,SAAS;YACf,MAAM,EAAE,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE;YAChC,OAAO,EAAE,aAAa;YACtB,MAAM,EAAE,EAAE;SACX,CAAC,CACH,CACF,CAAC;QAEF,GAAG,CAAC,GAAG,CAAC,0BAA0B,cAAc,CAAC,MAAM,kBAAkB,CAAC,CAAC;QAE3E,MAAM,aAAa,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;QAC9D,MAAM,GAAG,CAAC,WAAW,CAAC,cAAc,CAClC,aAAa,EACb,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,KAAK,EACjC,KAAK,CACN,CAAC;QAEF,GAAG,CAAC,GAAG,CAAC,OAAO,cAAc,CAAC,MAAM,yBAAyB,CAAC,CAAC;QAI/D,MAAM,OAAO,CAAC,GAAG,CACf,cAAc,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAC1B,GAAG,CAAC,QAAQ,CAAC;YACX,IAAI,EAAE,SAAS;YACf,MAAM,EAAE,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE;YAChC,OAAO,EAAE,WAAW;YACpB,MAAM,EAAE,EAAE;SACX,CAAC,CACH,CACF,CAAC;QAEF,GAAG,CAAC,GAAG,CAAC,wBAAwB,cAAc,CAAC,MAAM,kBAAkB,CAAC,CAAC;QAEzE,MAAM,GAAG,CAAC,WAAW,CAAC,cAAc,CAClC,aAAa,EACb,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,IAAI,EAChC,KAAK,CACN,CAAC;QAEF,GAAG,CAAC,GAAG,CAAC,OAAO,cAAc,CAAC,MAAM,uBAAuB,CAAC,CAAC;QAG7D,MAAM,GAAG,CAAC,QAAQ,CAAC;YACjB,IAAI,EAAE,MAAM;YACZ,QAAQ,EAAE,GAAG,CAAC,QAAQ;SACvB,CAAC,CAAC;QAEH,OAAO,IAAA,6BAAY,GAAE,CAAC;IACxB,CAAC;CACF,CAAC;AAEF,kBAAe,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Scenario } from "../../scenario.types";
2
+ declare const s: Scenario;
3
+ export default s;
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const scenario_types_1 = require("../../scenario.types");
4
+ const s = {
5
+ tags: ["doors"],
6
+ name: "Doors: Doors release correctly",
7
+ description: "Doors: Doors release correctly",
8
+ run: async (ctx) => {
9
+ await ctx.getReply({
10
+ kind: "start",
11
+ provider: ctx.provider,
12
+ config: ctx.config,
13
+ lastEventForeignRef: null,
14
+ lastEventTimestamp: null,
15
+ });
16
+ const devicesResponse = await ctx.getReply({
17
+ kind: "get-available-devices",
18
+ provider: ctx.provider,
19
+ });
20
+ const doors = devicesResponse.devices.filter((d) => d.type === "door");
21
+ const doorRefs = doors.map((d) => d.foreignRef);
22
+ ctx.log(`Found ${doors.length} doors`);
23
+ const states = await ctx.deviceState.waitForDevices(doorRefs, (state) => "connected" in state, 30000);
24
+ const connectedDoors = doors.filter((door) => {
25
+ const state = states.get(door.foreignRef);
26
+ return state && state.connected === true;
27
+ });
28
+ ctx.log(`Found ${connectedDoors.length} connected doors`);
29
+ if (connectedDoors.length === 0) {
30
+ throw new Error("No connected doors found, cannot proceed with test");
31
+ }
32
+ await Promise.all(connectedDoors.map((door) => ctx.getReply({
33
+ kind: "command",
34
+ device: { ...door, presets: [] },
35
+ command: "door.release",
36
+ params: {},
37
+ })));
38
+ ctx.log(`Sent release command to ${connectedDoors.length} connected doors`);
39
+ const connectedRefs = connectedDoors.map((d) => d.foreignRef);
40
+ await ctx.deviceState.waitForDevices(connectedRefs, (state) => state.locked === false, 30000);
41
+ ctx.log(`All ${connectedDoors.length} doors are now unlocked, waiting for relock`);
42
+ await ctx.deviceState.waitForDevices(connectedRefs, (state) => state.locked === true, 30000);
43
+ ctx.log(`All ${connectedDoors.length} doors are now locked`);
44
+ await ctx.getReply({
45
+ kind: "stop",
46
+ provider: ctx.provider,
47
+ });
48
+ return (0, scenario_types_1.scenarioPass)();
49
+ },
50
+ };
51
+ exports.default = s;
52
+ //# sourceMappingURL=door-release.scenario.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"door-release.scenario.js","sourceRoot":"","sources":["../../../src/scenarios/doors/door-release.scenario.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Scenario } from "../scenario.types";
2
+ declare const scenario: Scenario;
3
+ export default scenario;
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const scenario_types_1 = require("../scenario.types");
4
+ const scenario = {
5
+ name: "register",
6
+ description: "Validates that the agent sends a valid register message with at least one provider",
7
+ tags: ["core"],
8
+ async run(ctx) {
9
+ const { registerPayload } = ctx;
10
+ const providerNames = Object.keys(registerPayload.providers);
11
+ if (providerNames.length === 0) {
12
+ return (0, scenario_types_1.scenarioFail)("Agent registered with zero providers");
13
+ }
14
+ ctx.log(`Providers: ${providerNames.join(", ")}`);
15
+ const errors = [];
16
+ for (const name of providerNames) {
17
+ const spec = registerPayload.providers[name];
18
+ if (!spec.title || spec.title.trim().length === 0) {
19
+ errors.push(`Provider '${name}' is missing a title`);
20
+ }
21
+ if (!spec.configSchema || typeof spec.configSchema !== "object") {
22
+ errors.push(`Provider '${name}' is missing a configSchema`);
23
+ }
24
+ }
25
+ if (errors.length > 0) {
26
+ return (0, scenario_types_1.scenarioFail)(...errors);
27
+ }
28
+ return (0, scenario_types_1.scenarioPass)();
29
+ },
30
+ };
31
+ exports.default = scenario;
32
+ //# sourceMappingURL=register.scenario.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register.scenario.js","sourceRoot":"","sources":["../../src/scenarios/register.scenario.ts"],"names":[],"mappings":";;AAAA,sDAAyE;AAMzE,MAAM,QAAQ,GAAa;IACzB,IAAI,EAAE,UAAU;IAChB,WAAW,EACT,oFAAoF;IACtF,IAAI,EAAE,CAAC,MAAM,CAAC;IAEd,KAAK,CAAC,GAAG,CAAC,GAAG;QACX,MAAM,EAAE,eAAe,EAAE,GAAG,GAAG,CAAC;QAGhC,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;QAC7D,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,OAAO,IAAA,6BAAY,EAAC,sCAAsC,CAAC,CAAC;QAC9D,CAAC;QAED,GAAG,CAAC,GAAG,CAAC,cAAc,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAGlD,MAAM,MAAM,GAAa,EAAE,CAAC;QAE5B,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;YACjC,MAAM,IAAI,GAAG,eAAe,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAE7C,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAClD,MAAM,CAAC,IAAI,CAAC,aAAa,IAAI,sBAAsB,CAAC,CAAC;YACvD,CAAC;YAED,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,OAAO,IAAI,CAAC,YAAY,KAAK,QAAQ,EAAE,CAAC;gBAChE,MAAM,CAAC,IAAI,CAAC,aAAa,IAAI,6BAA6B,CAAC,CAAC;YAC9D,CAAC;QACH,CAAC;QAED,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,OAAO,IAAA,6BAAY,EAAC,GAAG,MAAM,CAAC,CAAC;QACjC,CAAC;QAED,OAAO,IAAA,6BAAY,GAAE,CAAC;IACxB,CAAC;CACF,CAAC;AAEF,kBAAe,QAAQ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Scenario } from "../scenario.types";
2
+ declare const scenario: Scenario;
3
+ export default scenario;