@digital-alchemy/hass 25.3.2 → 25.5.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 (89) hide show
  1. package/dist/hass.module.d.mts +23 -1
  2. package/dist/hass.module.mjs +26 -1
  3. package/dist/hass.module.mjs.map +1 -1
  4. package/dist/helpers/fetch.mjs +0 -1
  5. package/dist/helpers/fetch.mjs.map +1 -1
  6. package/dist/helpers/utility.d.mts +1 -0
  7. package/dist/helpers/utility.mjs +4 -0
  8. package/dist/helpers/utility.mjs.map +1 -1
  9. package/dist/mock_assistant/mock-assistant.module.d.mts +22 -0
  10. package/dist/services/area.service.mjs +9 -1
  11. package/dist/services/area.service.mjs.map +1 -1
  12. package/dist/services/call-proxy.service.mjs +10 -2
  13. package/dist/services/call-proxy.service.mjs.map +1 -1
  14. package/dist/services/config.service.mjs +15 -13
  15. package/dist/services/config.service.mjs.map +1 -1
  16. package/dist/services/device.service.mjs +3 -1
  17. package/dist/services/device.service.mjs.map +1 -1
  18. package/dist/services/diagnostics.service.d.mts +26 -0
  19. package/dist/services/diagnostics.service.mjs +41 -0
  20. package/dist/services/diagnostics.service.mjs.map +1 -0
  21. package/dist/services/entity.service.mjs +12 -1
  22. package/dist/services/entity.service.mjs.map +1 -1
  23. package/dist/services/fetch-api.service.mjs +8 -2
  24. package/dist/services/fetch-api.service.mjs.map +1 -1
  25. package/dist/services/floor.service.mjs +3 -1
  26. package/dist/services/floor.service.mjs.map +1 -1
  27. package/dist/services/id-by.service.d.mts +1 -1
  28. package/dist/services/id-by.service.mjs +20 -13
  29. package/dist/services/id-by.service.mjs.map +1 -1
  30. package/dist/services/index.d.mts +1 -0
  31. package/dist/services/index.mjs +1 -0
  32. package/dist/services/index.mjs.map +1 -1
  33. package/dist/services/label.service.mjs +3 -1
  34. package/dist/services/label.service.mjs.map +1 -1
  35. package/dist/services/reference.service.mjs +15 -4
  36. package/dist/services/reference.service.mjs.map +1 -1
  37. package/dist/services/registry.service.mjs +8 -8
  38. package/dist/services/registry.service.mjs.map +1 -1
  39. package/dist/services/websocket-api.service.mjs +10 -2
  40. package/dist/services/websocket-api.service.mjs.map +1 -1
  41. package/dist/services/zone.service.mjs +3 -1
  42. package/dist/services/zone.service.mjs.map +1 -1
  43. package/dist/testing/area.spec.mjs +141 -132
  44. package/dist/testing/area.spec.mjs.map +1 -1
  45. package/dist/testing/device.spec.mjs +17 -0
  46. package/dist/testing/device.spec.mjs.map +1 -1
  47. package/dist/testing/entity.spec.mjs +167 -0
  48. package/dist/testing/entity.spec.mjs.map +1 -1
  49. package/dist/testing/fetch.spec.d.mts +1 -0
  50. package/dist/testing/fetch.spec.mjs +45 -0
  51. package/dist/testing/fetch.spec.mjs.map +1 -0
  52. package/dist/testing/floor.spec.mjs +17 -0
  53. package/dist/testing/floor.spec.mjs.map +1 -1
  54. package/dist/testing/id-by.spec.mjs +93 -5
  55. package/dist/testing/id-by.spec.mjs.map +1 -1
  56. package/dist/testing/label.spec.mjs +17 -0
  57. package/dist/testing/label.spec.mjs.map +1 -1
  58. package/dist/testing/ref-by.spec.mjs +1 -1
  59. package/dist/testing/ref-by.spec.mjs.map +1 -1
  60. package/dist/testing/zone.spec.mjs +24 -5
  61. package/dist/testing/zone.spec.mjs.map +1 -1
  62. package/package.json +35 -31
  63. package/src/hass.module.mts +29 -0
  64. package/src/helpers/fetch.mts +1 -1
  65. package/src/helpers/utility.mts +5 -0
  66. package/src/services/area.service.mts +9 -0
  67. package/src/services/call-proxy.service.mts +16 -9
  68. package/src/services/config.service.mts +21 -16
  69. package/src/services/device.service.mts +3 -0
  70. package/src/services/diagnostics.service.mts +45 -0
  71. package/src/services/entity.service.mts +12 -0
  72. package/src/services/fetch-api.service.mts +11 -2
  73. package/src/services/floor.service.mts +3 -0
  74. package/src/services/id-by.service.mts +25 -15
  75. package/src/services/index.mts +1 -0
  76. package/src/services/label.service.mts +3 -0
  77. package/src/services/reference.service.mts +15 -3
  78. package/src/services/registry.service.mts +8 -8
  79. package/src/services/websocket-api.service.mts +10 -2
  80. package/src/services/zone.service.mts +3 -0
  81. package/src/testing/area.spec.mts +153 -140
  82. package/src/testing/device.spec.mts +22 -0
  83. package/src/testing/entity.spec.mts +201 -0
  84. package/src/testing/fetch.spec.mts +54 -0
  85. package/src/testing/floor.spec.mts +22 -0
  86. package/src/testing/id-by.spec.mts +100 -5
  87. package/src/testing/label.spec.mts +22 -0
  88. package/src/testing/ref-by.spec.mts +1 -1
  89. package/src/testing/zone.spec.mts +29 -5
@@ -1,12 +1,12 @@
1
1
  import { hassTestRunner } from "../mock_assistant/index.mts";
2
2
  import { PICK_ENTITY } from "../user.mts";
3
3
 
4
- describe("ID By", () => {
5
- afterEach(async () => {
6
- await hassTestRunner.teardown();
7
- vi.restoreAllMocks();
8
- });
4
+ afterEach(async () => {
5
+ await hassTestRunner.teardown();
6
+ vi.restoreAllMocks();
7
+ });
9
8
 
9
+ describe("enabled entities", () => {
10
10
  describe("area", () => {
11
11
  it("find entities by area", async () => {
12
12
  expect.assertions(2);
@@ -138,3 +138,98 @@ describe("ID By", () => {
138
138
  });
139
139
  });
140
140
  });
141
+
142
+ describe("disabled entities", () => {
143
+ beforeAll(() => {
144
+ hassTestRunner
145
+ // .emitLogs()
146
+ .configure({
147
+ hass: {
148
+ FILTER_DISABLED_ENTITIES_ID_BY: false,
149
+ },
150
+ });
151
+ });
152
+ describe("area", () => {
153
+ it("find entities by area", async () => {
154
+ expect.assertions(2);
155
+ await hassTestRunner.run(({ lifecycle, hass }) => {
156
+ lifecycle.onReady(() => {
157
+ const bedroom = hass.idBy.area("bedroom");
158
+ const kitchen = hass.idBy.area("kitchen");
159
+ expect(bedroom.length).toBe(4);
160
+ expect(kitchen.length).toBe(3);
161
+ });
162
+ });
163
+ });
164
+
165
+ it("find entities by area limiting by domain", async () => {
166
+ expect.assertions(2);
167
+ await hassTestRunner.run(({ lifecycle, hass }) => {
168
+ lifecycle.onReady(() => {
169
+ const bedroom = hass.idBy.area("bedroom", "light");
170
+ const kitchen = hass.idBy.area("kitchen", "light");
171
+ expect(bedroom.length).toBe(1);
172
+ expect(kitchen.length).toBe(1);
173
+ });
174
+ });
175
+ });
176
+ });
177
+
178
+ describe("label", () => {
179
+ it("find entities by label", async () => {
180
+ expect.assertions(1);
181
+ await hassTestRunner.run(({ lifecycle, hass }) => {
182
+ lifecycle.onReady(() => {
183
+ const synapse = hass.idBy.label("synapse");
184
+ expect(synapse.length).toBe(9);
185
+ });
186
+ });
187
+ });
188
+ });
189
+
190
+ describe("device", () => {
191
+ it("find entities by device", async () => {
192
+ expect.assertions(1);
193
+ await hassTestRunner.run(({ lifecycle, hass }) => {
194
+ lifecycle.onReady(() => {
195
+ const synapse = hass.idBy.device("308e39cf50a9fc6c30b4110724ed1f2e");
196
+ expect(synapse.length).toBe(12);
197
+ });
198
+ });
199
+ });
200
+ });
201
+
202
+ describe("platform", () => {
203
+ it("find entities by platform", async () => {
204
+ expect.assertions(1);
205
+ await hassTestRunner.run(({ lifecycle, hass }) => {
206
+ lifecycle.onReady(() => {
207
+ const synapse = hass.idBy.platform("synapse");
208
+ expect(synapse.length).toBe(8);
209
+ });
210
+ });
211
+ });
212
+ });
213
+
214
+ describe("floor", () => {
215
+ it("find entities by floor", async () => {
216
+ expect.assertions(1);
217
+ await hassTestRunner.run(({ lifecycle, hass }) => {
218
+ lifecycle.onReady(() => {
219
+ const synapse = hass.idBy.floor("downstairs");
220
+ expect(synapse.length).toBe(6);
221
+ });
222
+ });
223
+ });
224
+
225
+ it("find entities by floor limiting by domain", async () => {
226
+ expect.assertions(1);
227
+ await hassTestRunner.run(({ lifecycle, hass }) => {
228
+ lifecycle.onReady(() => {
229
+ const synapse = hass.idBy.floor("downstairs", "light");
230
+ expect(synapse.length).toBe(1);
231
+ });
232
+ });
233
+ });
234
+ });
235
+ });
@@ -1,3 +1,5 @@
1
+ import { subscribe } from "node:diagnostics_channel";
2
+
1
3
  import { sleep } from "@digital-alchemy/core";
2
4
 
3
5
  import { LABEL_REGISTRY_UPDATED, LabelDefinition } from "../helpers/index.mts";
@@ -103,6 +105,26 @@ describe("Label", () => {
103
105
  });
104
106
  });
105
107
  });
108
+
109
+ it("should publish diagnostics on label registry update", async () => {
110
+ expect.assertions(1);
111
+ hassTestRunner.configure({ hass: { EMIT_DIAGNOSTICS: true } });
112
+ await hassTestRunner.run(({ lifecycle, hass }) => {
113
+ vi.spyOn(hass.socket, "sendMessage").mockImplementation(async () => undefined);
114
+ const spy = vi.fn();
115
+ subscribe(hass.diagnostics.label.registry_update.name, spy);
116
+ lifecycle.onReady(async () => {
117
+ setImmediate(async () => {
118
+ hass.socket.socketEvents.emit("label_registry_updated");
119
+ });
120
+ await sleep(100);
121
+ expect(spy).toHaveBeenCalledWith(
122
+ expect.objectContaining({ ms: expect.any(Number) }),
123
+ hass.diagnostics.label.registry_update.name,
124
+ );
125
+ });
126
+ });
127
+ });
106
128
  });
107
129
 
108
130
  describe("Order of operations", () => {
@@ -30,7 +30,7 @@ describe("References", () => {
30
30
  await hassTestRunner.run(({ lifecycle, hass }) => {
31
31
  lifecycle.onReady(() => {
32
32
  const sensor = hass.refBy.domain("sensor");
33
- expect(sensor.length).toBe(8);
33
+ expect(sensor.length).toBe(11);
34
34
  });
35
35
  });
36
36
  });
@@ -1,3 +1,5 @@
1
+ import { subscribe } from "node:diagnostics_channel";
2
+
1
3
  import { sleep } from "@digital-alchemy/core";
2
4
 
3
5
  import { ZONE_REGISTRY_UPDATED, ZoneDetails } from "../helpers/index.mts";
@@ -10,11 +12,13 @@ describe("Zone", () => {
10
12
  });
11
13
 
12
14
  const EXAMPLE_ZONE = {
13
- icon: "",
14
- latitude: 0,
15
- longitude: 0,
16
- name: "Test",
17
- passive: true,
15
+ icon: "mdi:map-marker",
16
+ id: "test",
17
+ latitude: 37.7749,
18
+ longitude: -122.4194,
19
+ name: "Example Zone",
20
+ passive: false,
21
+ radius: 100,
18
22
  } as ZoneDetails;
19
23
 
20
24
  describe("Lifecycle", () => {
@@ -62,6 +66,26 @@ describe("Zone", () => {
62
66
  });
63
67
  });
64
68
  });
69
+
70
+ it("should publish diagnostics on zone registry update", async () => {
71
+ expect.assertions(1);
72
+ hassTestRunner.configure({ hass: { EMIT_DIAGNOSTICS: true } });
73
+ await hassTestRunner.run(({ lifecycle, hass }) => {
74
+ vi.spyOn(hass.socket, "sendMessage").mockImplementation(async () => undefined);
75
+ const spy = vi.fn();
76
+ subscribe(hass.diagnostics.zone.registry_update.name, spy);
77
+ lifecycle.onReady(async () => {
78
+ setImmediate(async () => {
79
+ hass.socket.socketEvents.emit("zone_registry_updated");
80
+ });
81
+ await sleep(100);
82
+ expect(spy).toHaveBeenCalledWith(
83
+ expect.objectContaining({ ms: expect.any(Number) }),
84
+ hass.diagnostics.zone.registry_update.name,
85
+ );
86
+ });
87
+ });
88
+ });
65
89
  });
66
90
 
67
91
  describe("Order of operations", () => {