@switchbot/homebridge-switchbot 5.0.0-beta.6 → 5.0.0-beta.60

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 (267) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/README.md +45 -3
  3. package/config.schema.json +866 -13754
  4. package/dist/devices-hap/airpurifier.d.ts.map +1 -1
  5. package/dist/devices-hap/airpurifier.js +12 -6
  6. package/dist/devices-hap/airpurifier.js.map +1 -1
  7. package/dist/devices-hap/blindtilt.js +3 -3
  8. package/dist/devices-hap/bot.d.ts.map +1 -1
  9. package/dist/devices-hap/bot.js +16 -5
  10. package/dist/devices-hap/bot.js.map +1 -1
  11. package/dist/devices-hap/ceilinglight.d.ts.map +1 -1
  12. package/dist/devices-hap/ceilinglight.js +13 -7
  13. package/dist/devices-hap/ceilinglight.js.map +1 -1
  14. package/dist/devices-hap/colorbulb.d.ts.map +1 -1
  15. package/dist/devices-hap/colorbulb.js +49 -9
  16. package/dist/devices-hap/colorbulb.js.map +1 -1
  17. package/dist/devices-hap/contact.js +3 -3
  18. package/dist/devices-hap/curtain.js +2 -2
  19. package/dist/devices-hap/curtain.js.map +1 -1
  20. package/dist/devices-hap/device.d.ts +18 -8
  21. package/dist/devices-hap/device.d.ts.map +1 -1
  22. package/dist/devices-hap/device.js +141 -69
  23. package/dist/devices-hap/device.js.map +1 -1
  24. package/dist/devices-hap/fan.d.ts.map +1 -1
  25. package/dist/devices-hap/fan.js +12 -6
  26. package/dist/devices-hap/fan.js.map +1 -1
  27. package/dist/devices-hap/hub.d.ts.map +1 -1
  28. package/dist/devices-hap/hub.js +6 -5
  29. package/dist/devices-hap/hub.js.map +1 -1
  30. package/dist/devices-hap/humidifier.d.ts +5 -0
  31. package/dist/devices-hap/humidifier.d.ts.map +1 -1
  32. package/dist/devices-hap/humidifier.js +92 -4
  33. package/dist/devices-hap/humidifier.js.map +1 -1
  34. package/dist/devices-hap/iosensor.d.ts.map +1 -1
  35. package/dist/devices-hap/iosensor.js +36 -21
  36. package/dist/devices-hap/iosensor.js.map +1 -1
  37. package/dist/devices-hap/lightstrip.d.ts.map +1 -1
  38. package/dist/devices-hap/lightstrip.js +38 -8
  39. package/dist/devices-hap/lightstrip.js.map +1 -1
  40. package/dist/devices-hap/lock.d.ts.map +1 -1
  41. package/dist/devices-hap/lock.js +14 -6
  42. package/dist/devices-hap/lock.js.map +1 -1
  43. package/dist/devices-hap/meter.d.ts.map +1 -1
  44. package/dist/devices-hap/meter.js +6 -5
  45. package/dist/devices-hap/meter.js.map +1 -1
  46. package/dist/devices-hap/meterplus.d.ts.map +1 -1
  47. package/dist/devices-hap/meterplus.js +6 -5
  48. package/dist/devices-hap/meterplus.js.map +1 -1
  49. package/dist/devices-hap/meterpro.d.ts.map +1 -1
  50. package/dist/devices-hap/meterpro.js +7 -6
  51. package/dist/devices-hap/meterpro.js.map +1 -1
  52. package/dist/devices-hap/motion.js +3 -3
  53. package/dist/devices-hap/plug.d.ts.map +1 -1
  54. package/dist/devices-hap/plug.js +11 -6
  55. package/dist/devices-hap/plug.js.map +1 -1
  56. package/dist/devices-hap/relayswitch.js +3 -3
  57. package/dist/devices-hap/robotvacuumcleaner.d.ts.map +1 -1
  58. package/dist/devices-hap/robotvacuumcleaner.js +13 -6
  59. package/dist/devices-hap/robotvacuumcleaner.js.map +1 -1
  60. package/dist/devices-hap/waterdetector.js +3 -3
  61. package/dist/devices-matter/BaseMatterAccessory.d.ts +27 -0
  62. package/dist/devices-matter/BaseMatterAccessory.d.ts.map +1 -1
  63. package/dist/devices-matter/BaseMatterAccessory.js +169 -5
  64. package/dist/devices-matter/BaseMatterAccessory.js.map +1 -1
  65. package/dist/devices-matter/ColorLightAccessory.d.ts.map +1 -1
  66. package/dist/devices-matter/ColorLightAccessory.js +12 -12
  67. package/dist/devices-matter/ColorLightAccessory.js.map +1 -1
  68. package/dist/devices-matter/ColorTemperatureLightAccessory.d.ts.map +1 -1
  69. package/dist/devices-matter/ColorTemperatureLightAccessory.js +5 -7
  70. package/dist/devices-matter/ColorTemperatureLightAccessory.js.map +1 -1
  71. package/dist/devices-matter/DimmableLightAccessory.js +9 -9
  72. package/dist/devices-matter/DimmableLightAccessory.js.map +1 -1
  73. package/dist/devices-matter/ExtendedColorLightAccessory.d.ts.map +1 -1
  74. package/dist/devices-matter/ExtendedColorLightAccessory.js +14 -15
  75. package/dist/devices-matter/ExtendedColorLightAccessory.js.map +1 -1
  76. package/dist/devices-matter/OnOffLightAccessory.d.ts.map +1 -1
  77. package/dist/devices-matter/OnOffLightAccessory.js +8 -16
  78. package/dist/devices-matter/OnOffLightAccessory.js.map +1 -1
  79. package/dist/devices-matter/OnOffOutletAccessory.d.ts +2 -0
  80. package/dist/devices-matter/OnOffOutletAccessory.d.ts.map +1 -1
  81. package/dist/devices-matter/OnOffOutletAccessory.js +10 -7
  82. package/dist/devices-matter/OnOffOutletAccessory.js.map +1 -1
  83. package/dist/devices-matter/OnOffSwitchAccessory.js +2 -2
  84. package/dist/devices-matter/OnOffSwitchAccessory.js.map +1 -1
  85. package/dist/devices-matter/RoboticVacuumAccessory.d.ts +29 -43
  86. package/dist/devices-matter/RoboticVacuumAccessory.d.ts.map +1 -1
  87. package/dist/devices-matter/RoboticVacuumAccessory.js +287 -262
  88. package/dist/devices-matter/RoboticVacuumAccessory.js.map +1 -1
  89. package/dist/homebridge-ui/public/index.html +200 -18
  90. package/dist/homebridge-ui/server.js +82 -9
  91. package/dist/homebridge-ui/server.js.map +1 -1
  92. package/dist/index.d.ts.map +1 -1
  93. package/dist/index.js +4 -7
  94. package/dist/index.js.map +1 -1
  95. package/dist/irdevice/irdevice.d.ts +11 -10
  96. package/dist/irdevice/irdevice.d.ts.map +1 -1
  97. package/dist/irdevice/irdevice.js +76 -35
  98. package/dist/irdevice/irdevice.js.map +1 -1
  99. package/dist/platform-hap.d.ts +26 -15
  100. package/dist/platform-hap.d.ts.map +1 -1
  101. package/dist/platform-hap.js +333 -153
  102. package/dist/platform-hap.js.map +1 -1
  103. package/dist/platform-matter.d.ts +93 -6
  104. package/dist/platform-matter.d.ts.map +1 -1
  105. package/dist/platform-matter.js +1822 -224
  106. package/dist/platform-matter.js.map +1 -1
  107. package/dist/settings.d.ts +58 -7
  108. package/dist/settings.d.ts.map +1 -1
  109. package/dist/settings.js.map +1 -1
  110. package/dist/test/apiRequestTracker.test.d.ts +2 -0
  111. package/dist/test/apiRequestTracker.test.d.ts.map +1 -0
  112. package/dist/test/apiRequestTracker.test.js +392 -0
  113. package/dist/test/apiRequestTracker.test.js.map +1 -0
  114. package/dist/test/hap/device-webhook-context.test.d.ts +2 -0
  115. package/dist/test/hap/device-webhook-context.test.d.ts.map +1 -0
  116. package/dist/test/hap/device-webhook-context.test.js +128 -0
  117. package/dist/test/hap/device-webhook-context.test.js.map +1 -0
  118. package/dist/test/hap/platform-hap.logging.test.d.ts +2 -0
  119. package/dist/test/hap/platform-hap.logging.test.d.ts.map +1 -0
  120. package/dist/test/hap/platform-hap.logging.test.js +33 -0
  121. package/dist/test/hap/platform-hap.logging.test.js.map +1 -0
  122. package/dist/test/hap/platform-hap.test.d.ts +2 -0
  123. package/dist/test/hap/platform-hap.test.d.ts.map +1 -0
  124. package/dist/test/hap/platform-hap.test.js +62 -0
  125. package/dist/test/hap/platform-hap.test.js.map +1 -0
  126. package/dist/test/helpers/platform-fixtures.d.ts +9 -0
  127. package/dist/test/helpers/platform-fixtures.d.ts.map +1 -0
  128. package/dist/test/helpers/platform-fixtures.js +30 -0
  129. package/dist/test/helpers/platform-fixtures.js.map +1 -0
  130. package/dist/test/homebridge-ui/server.test.d.ts +2 -0
  131. package/dist/test/homebridge-ui/server.test.d.ts.map +1 -0
  132. package/dist/test/homebridge-ui/server.test.js +445 -0
  133. package/dist/test/homebridge-ui/server.test.js.map +1 -0
  134. package/dist/{index.test.d.ts.map → test/index.test.d.ts.map} +1 -1
  135. package/dist/test/index.test.js +19 -0
  136. package/dist/test/index.test.js.map +1 -0
  137. package/dist/test/matter/devices-matter/baseMatterAccessory.test.d.ts +2 -0
  138. package/dist/test/matter/devices-matter/baseMatterAccessory.test.d.ts.map +1 -0
  139. package/dist/test/matter/devices-matter/baseMatterAccessory.test.js +71 -0
  140. package/dist/test/matter/devices-matter/baseMatterAccessory.test.js.map +1 -0
  141. package/dist/test/matter/devices-matter/roboticVacuumAccessory.test.d.ts +2 -0
  142. package/dist/test/matter/devices-matter/roboticVacuumAccessory.test.d.ts.map +1 -0
  143. package/dist/test/matter/devices-matter/roboticVacuumAccessory.test.js +366 -0
  144. package/dist/test/matter/devices-matter/roboticVacuumAccessory.test.js.map +1 -0
  145. package/dist/test/matter/platform-matter.additional.test.d.ts +2 -0
  146. package/dist/test/matter/platform-matter.additional.test.d.ts.map +1 -0
  147. package/dist/test/matter/platform-matter.additional.test.js +35 -0
  148. package/dist/test/matter/platform-matter.additional.test.js.map +1 -0
  149. package/dist/test/matter/platform-matter.bleparse.test.d.ts +2 -0
  150. package/dist/test/matter/platform-matter.bleparse.test.d.ts.map +1 -0
  151. package/dist/test/matter/platform-matter.bleparse.test.js +43 -0
  152. package/dist/test/matter/platform-matter.bleparse.test.js.map +1 -0
  153. package/dist/test/matter/platform-matter.cleanup.test.d.ts +2 -0
  154. package/dist/test/matter/platform-matter.cleanup.test.d.ts.map +1 -0
  155. package/dist/test/matter/platform-matter.cleanup.test.js +70 -0
  156. package/dist/test/matter/platform-matter.cleanup.test.js.map +1 -0
  157. package/dist/test/matter/platform-matter.keepstale.test.d.ts +2 -0
  158. package/dist/test/matter/platform-matter.keepstale.test.d.ts.map +1 -0
  159. package/dist/test/matter/platform-matter.keepstale.test.js +27 -0
  160. package/dist/test/matter/platform-matter.keepstale.test.js.map +1 -0
  161. package/dist/test/matter/platform-matter.logging.test.d.ts +2 -0
  162. package/dist/test/matter/platform-matter.logging.test.d.ts.map +1 -0
  163. package/dist/test/matter/platform-matter.logging.test.js +29 -0
  164. package/dist/test/matter/platform-matter.logging.test.js.map +1 -0
  165. package/dist/test/matter/platform-matter.mapping.test.d.ts +2 -0
  166. package/dist/test/matter/platform-matter.mapping.test.d.ts.map +1 -0
  167. package/dist/test/matter/platform-matter.mapping.test.js +43 -0
  168. package/dist/test/matter/platform-matter.mapping.test.js.map +1 -0
  169. package/dist/test/matter/platform-matter.openapi-mapping.test.d.ts +2 -0
  170. package/dist/test/matter/platform-matter.openapi-mapping.test.d.ts.map +1 -0
  171. package/dist/test/matter/platform-matter.openapi-mapping.test.js +84 -0
  172. package/dist/test/matter/platform-matter.openapi-mapping.test.js.map +1 -0
  173. package/dist/test/matter/platform-matter.test.d.ts +2 -0
  174. package/dist/test/matter/platform-matter.test.d.ts.map +1 -0
  175. package/dist/test/matter/platform-matter.test.js +117 -0
  176. package/dist/test/matter/platform-matter.test.js.map +1 -0
  177. package/dist/test/matter/platform-matter.unregister.test.d.ts +2 -0
  178. package/dist/test/matter/platform-matter.unregister.test.d.ts.map +1 -0
  179. package/dist/test/matter/platform-matter.unregister.test.js +30 -0
  180. package/dist/test/matter/platform-matter.unregister.test.js.map +1 -0
  181. package/dist/test/matter/platform-matter.webhook.test.d.ts +2 -0
  182. package/dist/test/matter/platform-matter.webhook.test.d.ts.map +1 -0
  183. package/dist/test/matter/platform-matter.webhook.test.js +46 -0
  184. package/dist/test/matter/platform-matter.webhook.test.js.map +1 -0
  185. package/dist/test/utils.test.d.ts +2 -0
  186. package/dist/test/utils.test.d.ts.map +1 -0
  187. package/dist/test/utils.test.js +95 -0
  188. package/dist/test/utils.test.js.map +1 -0
  189. package/dist/test/verifyconfig.test.d.ts.map +1 -0
  190. package/dist/{verifyconfig.test.js → test/verifyconfig.test.js} +2 -2
  191. package/dist/test/verifyconfig.test.js.map +1 -0
  192. package/dist/utils.d.ts +204 -3
  193. package/dist/utils.d.ts.map +1 -1
  194. package/dist/utils.js +713 -33
  195. package/dist/utils.js.map +1 -1
  196. package/docs/assets/highlight.css +14 -0
  197. package/docs/assets/main.js +2 -2
  198. package/docs/index.html +31 -2
  199. package/docs/variables/default.html +1 -1
  200. package/package.json +15 -15
  201. package/src/devices-hap/airpurifier.ts +11 -6
  202. package/src/devices-hap/blindtilt.ts +3 -3
  203. package/src/devices-hap/bot.ts +15 -5
  204. package/src/devices-hap/ceilinglight.ts +12 -7
  205. package/src/devices-hap/colorbulb.ts +46 -10
  206. package/src/devices-hap/contact.ts +3 -3
  207. package/src/devices-hap/curtain.ts +2 -2
  208. package/src/devices-hap/device.ts +149 -70
  209. package/src/devices-hap/fan.ts +11 -6
  210. package/src/devices-hap/hub.ts +6 -5
  211. package/src/devices-hap/humidifier.ts +97 -4
  212. package/src/devices-hap/iosensor.ts +36 -21
  213. package/src/devices-hap/lightstrip.ts +35 -8
  214. package/src/devices-hap/lock.ts +13 -6
  215. package/src/devices-hap/meter.ts +6 -5
  216. package/src/devices-hap/meterplus.ts +6 -5
  217. package/src/devices-hap/meterpro.ts +7 -6
  218. package/src/devices-hap/motion.ts +3 -3
  219. package/src/devices-hap/plug.ts +10 -6
  220. package/src/devices-hap/relayswitch.ts +3 -3
  221. package/src/devices-hap/robotvacuumcleaner.ts +12 -6
  222. package/src/devices-hap/waterdetector.ts +3 -3
  223. package/src/devices-matter/BaseMatterAccessory.ts +176 -5
  224. package/src/devices-matter/ColorLightAccessory.ts +12 -12
  225. package/src/devices-matter/ColorTemperatureLightAccessory.ts +5 -7
  226. package/src/devices-matter/DimmableLightAccessory.ts +9 -9
  227. package/src/devices-matter/ExtendedColorLightAccessory.ts +14 -15
  228. package/src/devices-matter/OnOffLightAccessory.ts +8 -16
  229. package/src/devices-matter/OnOffOutletAccessory.ts +12 -7
  230. package/src/devices-matter/OnOffSwitchAccessory.ts +2 -2
  231. package/src/devices-matter/RoboticVacuumAccessory.ts +340 -313
  232. package/src/homebridge-ui/public/index.html +200 -18
  233. package/src/homebridge-ui/server.ts +85 -9
  234. package/src/index.ts +4 -7
  235. package/src/irdevice/irdevice.ts +74 -35
  236. package/src/platform-hap.ts +365 -169
  237. package/src/platform-matter.ts +1872 -229
  238. package/src/settings.ts +62 -3
  239. package/src/test/apiRequestTracker.test.ts +417 -0
  240. package/src/test/hap/device-webhook-context.test.ts +136 -0
  241. package/src/test/hap/platform-hap.logging.test.ts +36 -0
  242. package/src/test/hap/platform-hap.test.ts +70 -0
  243. package/src/test/helpers/platform-fixtures.ts +33 -0
  244. package/src/test/homebridge-ui/server.test.ts +486 -0
  245. package/src/test/index.test.ts +24 -0
  246. package/src/test/matter/devices-matter/baseMatterAccessory.test.ts +88 -0
  247. package/src/test/matter/devices-matter/roboticVacuumAccessory.test.ts +453 -0
  248. package/src/test/matter/platform-matter.additional.test.ts +44 -0
  249. package/src/test/matter/platform-matter.bleparse.test.ts +47 -0
  250. package/src/test/matter/platform-matter.cleanup.test.ts +86 -0
  251. package/src/test/matter/platform-matter.keepstale.test.ts +37 -0
  252. package/src/test/matter/platform-matter.logging.test.ts +33 -0
  253. package/src/test/matter/platform-matter.mapping.test.ts +57 -0
  254. package/src/test/matter/platform-matter.openapi-mapping.test.ts +109 -0
  255. package/src/test/matter/platform-matter.test.ts +144 -0
  256. package/src/test/matter/platform-matter.unregister.test.ts +39 -0
  257. package/src/test/matter/platform-matter.webhook.test.ts +54 -0
  258. package/src/test/utils.test.ts +96 -0
  259. package/src/{verifyconfig.test.ts → test/verifyconfig.test.ts} +12 -11
  260. package/src/utils.ts +777 -36
  261. package/dist/index.test.js +0 -14
  262. package/dist/index.test.js.map +0 -1
  263. package/dist/verifyconfig.test.d.ts.map +0 -1
  264. package/dist/verifyconfig.test.js.map +0 -1
  265. package/src/index.test.ts +0 -19
  266. /package/dist/{index.test.d.ts → test/index.test.d.ts} +0 -0
  267. /package/dist/{verifyconfig.test.d.ts → test/verifyconfig.test.d.ts} +0 -0
@@ -0,0 +1,392 @@
1
+ import { existsSync, mkdirSync, readdirSync, readFileSync, rmdirSync, unlinkSync } from 'node:fs';
2
+ import { tmpdir } from 'node:os';
3
+ import { join } from 'node:path';
4
+ import { describe, expect, it, vi } from 'vitest';
5
+ import { ApiRequestTracker } from '../utils.js';
6
+ // Helper to create isolated test environment for each test
7
+ function createTestEnvironment(pluginName = 'SwitchBotTest') {
8
+ const testId = Math.random().toString(36).substring(7);
9
+ const testDir = join(tmpdir(), `switchbot-test-${testId}`);
10
+ // Create test directory
11
+ if (!existsSync(testDir)) {
12
+ mkdirSync(testDir, { recursive: true });
13
+ }
14
+ const testStatsFile = join(testDir, `${pluginName.toLowerCase()}-api-stats.json`);
15
+ // Mock API with a unique storage path per test
16
+ const mockApi = {
17
+ user: {
18
+ storagePath: () => testDir,
19
+ },
20
+ };
21
+ // Mock logger
22
+ const mockLog = {
23
+ info: vi.fn(),
24
+ warn: vi.fn(),
25
+ error: vi.fn(),
26
+ debug: vi.fn(),
27
+ };
28
+ return { mockApi, mockLog, testStatsFile, testDir };
29
+ }
30
+ // Cleanup helper
31
+ function cleanup(testDir) {
32
+ try {
33
+ if (existsSync(testDir)) {
34
+ const files = readdirSync(testDir);
35
+ for (const file of files) {
36
+ try {
37
+ unlinkSync(join(testDir, file));
38
+ }
39
+ catch {
40
+ // ignore
41
+ }
42
+ }
43
+ rmdirSync(testDir);
44
+ }
45
+ }
46
+ catch {
47
+ // ignore
48
+ }
49
+ }
50
+ describe('apiRequestTracker', () => {
51
+ describe('initialization', () => {
52
+ it('should create a new tracker with default limits', () => {
53
+ const { mockApi, mockLog, testDir } = createTestEnvironment();
54
+ try {
55
+ const tracker = new ApiRequestTracker(mockApi, mockLog, 'SwitchBotTest');
56
+ expect(tracker).toBeDefined();
57
+ expect(tracker.getCount()).toBe(0);
58
+ expect(tracker.getDate()).toBe(new Date().toISOString().split('T')[0]);
59
+ }
60
+ finally {
61
+ cleanup(testDir);
62
+ }
63
+ });
64
+ it('should respect custom daily limit', () => {
65
+ const { mockApi, mockLog, testDir } = createTestEnvironment();
66
+ try {
67
+ const tracker = new ApiRequestTracker(mockApi, mockLog, 'SwitchBotTest', {
68
+ dailyLimit: 5000,
69
+ reserveForCommands: 500,
70
+ });
71
+ expect(tracker).toBeDefined();
72
+ }
73
+ finally {
74
+ cleanup(testDir);
75
+ }
76
+ });
77
+ it('should load existing stats from file', () => {
78
+ const { mockApi, mockLog, testDir } = createTestEnvironment();
79
+ try {
80
+ // Create a tracker, increment, and verify persistence
81
+ const tracker1 = new ApiRequestTracker(mockApi, mockLog, 'SwitchBotTest');
82
+ tracker1.track();
83
+ tracker1.track();
84
+ expect(tracker1.getCount()).toBe(2);
85
+ // Create a new tracker instance and verify it loads the count
86
+ const tracker2 = new ApiRequestTracker(mockApi, mockLog, 'SwitchBotTest');
87
+ expect(tracker2.getCount()).toBe(2);
88
+ }
89
+ finally {
90
+ cleanup(testDir);
91
+ }
92
+ });
93
+ });
94
+ describe('track() - legacy method', () => {
95
+ it('should increment the counter', () => {
96
+ const { mockApi, mockLog, testDir } = createTestEnvironment();
97
+ try {
98
+ const tracker = new ApiRequestTracker(mockApi, mockLog, 'SwitchBotTest');
99
+ expect(tracker.getCount()).toBe(0);
100
+ tracker.track();
101
+ expect(tracker.getCount()).toBe(1);
102
+ tracker.track();
103
+ expect(tracker.getCount()).toBe(2);
104
+ }
105
+ finally {
106
+ cleanup(testDir);
107
+ }
108
+ });
109
+ it('should persist count to file', () => {
110
+ const { mockApi, mockLog, testStatsFile, testDir } = createTestEnvironment();
111
+ try {
112
+ const tracker = new ApiRequestTracker(mockApi, mockLog, 'SwitchBotTest');
113
+ tracker.track();
114
+ tracker.track();
115
+ tracker.track();
116
+ // Read the stats file directly
117
+ const statsContent = readFileSync(testStatsFile, 'utf8');
118
+ const stats = JSON.parse(statsContent);
119
+ expect(stats.count).toBe(3);
120
+ expect(stats.date).toBe(new Date().toISOString().split('T')[0]);
121
+ }
122
+ finally {
123
+ cleanup(testDir);
124
+ }
125
+ });
126
+ });
127
+ describe('trySpend() - budget enforcement', () => {
128
+ it('should allow commands when under soft cap', () => {
129
+ const { mockApi, mockLog, testDir } = createTestEnvironment();
130
+ try {
131
+ const tracker = new ApiRequestTracker(mockApi, mockLog, 'SwitchBotTest', {
132
+ dailyLimit: 100,
133
+ reserveForCommands: 20,
134
+ });
135
+ // Use 50 requests (well under soft cap of 80)
136
+ for (let i = 0; i < 50; i++) {
137
+ expect(tracker.trySpend('command')).toBe(true);
138
+ }
139
+ expect(tracker.getCount()).toBe(50);
140
+ }
141
+ finally {
142
+ cleanup(testDir);
143
+ }
144
+ });
145
+ it('should allow polling when under soft cap', () => {
146
+ const { mockApi, mockLog, testDir } = createTestEnvironment();
147
+ try {
148
+ const tracker = new ApiRequestTracker(mockApi, mockLog, 'SwitchBotTest', {
149
+ dailyLimit: 100,
150
+ reserveForCommands: 20,
151
+ });
152
+ // Use 50 requests
153
+ for (let i = 0; i < 50; i++) {
154
+ expect(tracker.trySpend('poll')).toBe(true);
155
+ }
156
+ expect(tracker.getCount()).toBe(50);
157
+ }
158
+ finally {
159
+ cleanup(testDir);
160
+ }
161
+ });
162
+ it('should block polling at soft cap when pausePollingAtReserve is true', () => {
163
+ const { mockApi, mockLog, testDir } = createTestEnvironment();
164
+ try {
165
+ const tracker = new ApiRequestTracker(mockApi, mockLog, 'SwitchBotTest', {
166
+ dailyLimit: 100,
167
+ reserveForCommands: 20,
168
+ pausePollingAtReserve: true, // Enable soft cap blocking
169
+ });
170
+ // Use up to soft cap (80 requests)
171
+ for (let i = 0; i < 80; i++) {
172
+ tracker.track();
173
+ }
174
+ expect(tracker.getCount()).toBe(80);
175
+ // Polling should be blocked at soft cap
176
+ expect(tracker.trySpend('poll')).toBe(false);
177
+ expect(tracker.trySpend('discovery')).toBe(false);
178
+ // Commands should still work
179
+ expect(tracker.trySpend('command')).toBe(true);
180
+ expect(tracker.getCount()).toBe(81);
181
+ }
182
+ finally {
183
+ cleanup(testDir);
184
+ }
185
+ });
186
+ it('should block all requests at hard cap', () => {
187
+ const { mockApi, mockLog, testDir } = createTestEnvironment();
188
+ try {
189
+ const tracker = new ApiRequestTracker(mockApi, mockLog, 'SwitchBotTest', {
190
+ dailyLimit: 100,
191
+ reserveForCommands: 20,
192
+ });
193
+ // Use up to hard cap
194
+ for (let i = 0; i < 100; i++) {
195
+ tracker.track();
196
+ }
197
+ expect(tracker.getCount()).toBe(100);
198
+ // All request types should be blocked
199
+ expect(tracker.trySpend('poll')).toBe(false);
200
+ expect(tracker.trySpend('discovery')).toBe(false);
201
+ expect(tracker.trySpend('command')).toBe(false);
202
+ expect(tracker.getCount()).toBe(100);
203
+ }
204
+ finally {
205
+ cleanup(testDir);
206
+ }
207
+ });
208
+ it('should support batch spending', () => {
209
+ const { mockApi, mockLog, testDir } = createTestEnvironment();
210
+ try {
211
+ const tracker = new ApiRequestTracker(mockApi, mockLog, 'SwitchBotTest', {
212
+ dailyLimit: 100,
213
+ reserveForCommands: 20,
214
+ });
215
+ expect(tracker.trySpend('poll', 10)).toBe(true);
216
+ expect(tracker.getCount()).toBe(10);
217
+ expect(tracker.trySpend('command', 5)).toBe(true);
218
+ expect(tracker.getCount()).toBe(15);
219
+ }
220
+ finally {
221
+ cleanup(testDir);
222
+ }
223
+ });
224
+ });
225
+ describe('webhookOnlyOnReserve mode', () => {
226
+ it('should continue polling beyond soft cap when pausePollingAtReserve is false', () => {
227
+ const { mockApi, mockLog, testDir } = createTestEnvironment();
228
+ try {
229
+ const tracker = new ApiRequestTracker(mockApi, mockLog, 'SwitchBotTest', {
230
+ dailyLimit: 100,
231
+ reserveForCommands: 20,
232
+ pausePollingAtReserve: false,
233
+ });
234
+ // Use 85 requests (past soft cap)
235
+ for (let i = 0; i < 85; i++) {
236
+ tracker.track();
237
+ }
238
+ expect(tracker.getCount()).toBe(85);
239
+ // Polling should still work (not paused at reserve)
240
+ expect(tracker.trySpend('poll')).toBe(true);
241
+ expect(tracker.getCount()).toBe(86);
242
+ }
243
+ finally {
244
+ cleanup(testDir);
245
+ }
246
+ });
247
+ it('should stop polling at soft cap when pausePollingAtReserve is true', () => {
248
+ const { mockApi, mockLog, testDir } = createTestEnvironment();
249
+ try {
250
+ const tracker = new ApiRequestTracker(mockApi, mockLog, 'SwitchBotTest', {
251
+ dailyLimit: 100,
252
+ reserveForCommands: 20,
253
+ pausePollingAtReserve: true,
254
+ });
255
+ // Use up to soft cap
256
+ for (let i = 0; i < 80; i++) {
257
+ tracker.track();
258
+ }
259
+ expect(tracker.getCount()).toBe(80);
260
+ // Polling should be blocked
261
+ expect(tracker.trySpend('poll')).toBe(false);
262
+ expect(tracker.getCount()).toBe(80);
263
+ // Commands should still work
264
+ expect(tracker.trySpend('command')).toBe(true);
265
+ expect(tracker.getCount()).toBe(81);
266
+ }
267
+ finally {
268
+ cleanup(testDir);
269
+ }
270
+ });
271
+ });
272
+ describe('warning logs', () => {
273
+ it('should log warning when reaching soft cap with pausePollingAtReserve enabled', () => {
274
+ const { mockApi, mockLog, testDir } = createTestEnvironment();
275
+ try {
276
+ const tracker = new ApiRequestTracker(mockApi, mockLog, 'SwitchBotTest', {
277
+ dailyLimit: 100,
278
+ reserveForCommands: 20,
279
+ pausePollingAtReserve: true, // Enable soft cap warning
280
+ });
281
+ // Use up to soft cap
282
+ for (let i = 0; i < 80; i++) {
283
+ tracker.track();
284
+ }
285
+ // Trigger soft cap warning by attempting poll (will be blocked)
286
+ tracker.trySpend('poll');
287
+ expect(mockLog.warn).toHaveBeenCalledWith(expect.stringContaining('Near daily limit'));
288
+ }
289
+ finally {
290
+ cleanup(testDir);
291
+ }
292
+ });
293
+ it('should log error when reaching hard cap', () => {
294
+ const { mockApi, mockLog, testDir } = createTestEnvironment();
295
+ try {
296
+ const tracker = new ApiRequestTracker(mockApi, mockLog, 'SwitchBotTest', {
297
+ dailyLimit: 100,
298
+ reserveForCommands: 20,
299
+ });
300
+ // Use up to hard cap
301
+ for (let i = 0; i < 100; i++) {
302
+ tracker.track();
303
+ }
304
+ // Trigger hard cap error
305
+ tracker.trySpend('command');
306
+ expect(mockLog.error).toHaveBeenCalledWith(expect.stringContaining('Daily limit'));
307
+ }
308
+ finally {
309
+ cleanup(testDir);
310
+ }
311
+ });
312
+ });
313
+ describe('hourly logging', () => {
314
+ it('should log immediately on startup', () => {
315
+ const { mockApi, mockLog, testDir } = createTestEnvironment();
316
+ try {
317
+ const tracker = new ApiRequestTracker(mockApi, mockLog, 'SwitchBotTest');
318
+ tracker.startHourlyLogging();
319
+ tracker.stopHourlyLogging();
320
+ expect(mockLog.info).toHaveBeenCalledWith(expect.stringContaining('[API Stats] Today'));
321
+ }
322
+ finally {
323
+ cleanup(testDir);
324
+ }
325
+ });
326
+ it('should stop logging when stopHourlyLogging is called', () => {
327
+ const { mockApi, mockLog, testDir } = createTestEnvironment();
328
+ try {
329
+ const tracker = new ApiRequestTracker(mockApi, mockLog, 'SwitchBotTest');
330
+ tracker.startHourlyLogging();
331
+ tracker.stopHourlyLogging();
332
+ // Should not throw
333
+ expect(true).toBe(true);
334
+ }
335
+ finally {
336
+ cleanup(testDir);
337
+ }
338
+ });
339
+ });
340
+ describe('edge cases', () => {
341
+ it('should handle zero daily limit', () => {
342
+ const { mockApi, mockLog, testDir } = createTestEnvironment();
343
+ try {
344
+ const tracker = new ApiRequestTracker(mockApi, mockLog, 'SwitchBotTest', {
345
+ dailyLimit: 0,
346
+ reserveForCommands: 0,
347
+ });
348
+ // All requests should be blocked immediately
349
+ expect(tracker.trySpend('poll')).toBe(false);
350
+ expect(tracker.trySpend('command')).toBe(false);
351
+ expect(tracker.getCount()).toBe(0);
352
+ }
353
+ finally {
354
+ cleanup(testDir);
355
+ }
356
+ });
357
+ it('should handle reserve larger than limit', () => {
358
+ const { mockApi, mockLog, testDir } = createTestEnvironment();
359
+ try {
360
+ const tracker = new ApiRequestTracker(mockApi, mockLog, 'SwitchBotTest', {
361
+ dailyLimit: 100,
362
+ reserveForCommands: 150,
363
+ pausePollingAtReserve: true, // Enable soft cap blocking
364
+ });
365
+ // Soft cap would be negative (100 - 150 = -50), clamped to 0
366
+ // With pausePollingAtReserve=true, polling should be blocked immediately
367
+ expect(tracker.trySpend('poll')).toBe(false);
368
+ // Commands up to hard cap should work
369
+ expect(tracker.trySpend('command')).toBe(true);
370
+ }
371
+ finally {
372
+ cleanup(testDir);
373
+ }
374
+ });
375
+ it('should handle negative values in config', () => {
376
+ const { mockApi, mockLog, testDir } = createTestEnvironment();
377
+ try {
378
+ const tracker = new ApiRequestTracker(mockApi, mockLog, 'SwitchBotTest', {
379
+ dailyLimit: -100,
380
+ reserveForCommands: -50,
381
+ });
382
+ // Should be treated as 0
383
+ expect(tracker.trySpend('poll')).toBe(false);
384
+ expect(tracker.trySpend('command')).toBe(false);
385
+ }
386
+ finally {
387
+ cleanup(testDir);
388
+ }
389
+ });
390
+ });
391
+ });
392
+ //# sourceMappingURL=apiRequestTracker.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apiRequestTracker.test.js","sourceRoot":"","sources":["../../src/test/apiRequestTracker.test.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACjG,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAEjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAE/C,2DAA2D;AAC3D,SAAS,qBAAqB,CAAC,UAAU,GAAG,eAAe;IACzD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;IACtD,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,kBAAkB,MAAM,EAAE,CAAC,CAAA;IAE1D,wBAAwB;IACxB,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACzB,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IACzC,CAAC;IAED,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,UAAU,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAA;IAEjF,+CAA+C;IAC/C,MAAM,OAAO,GAAG;QACd,IAAI,EAAE;YACJ,WAAW,EAAE,GAAG,EAAE,CAAC,OAAO;SAC3B;KACgB,CAAA;IAEnB,cAAc;IACd,MAAM,OAAO,GAAG;QACd,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE;QACb,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE;QACb,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE;QACd,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE;KACO,CAAA;IAEvB,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,CAAA;AACrD,CAAC;AAED,iBAAiB;AACjB,SAAS,OAAO,CAAC,OAAe;IAC9B,IAAI,CAAC;QACH,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACxB,MAAM,KAAK,GAAG,WAAW,CAAC,OAAO,CAAC,CAAA;YAClC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,CAAC;oBACH,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAA;gBACjC,CAAC;gBAAC,MAAM,CAAC;oBACP,SAAS;gBACX,CAAC;YACH,CAAC;YACD,SAAS,CAAC,OAAO,CAAC,CAAA;QACpB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,SAAS;IACX,CAAC;AACH,CAAC;AAED,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;YACzD,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,qBAAqB,EAAE,CAAA;YAC7D,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,IAAI,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,eAAe,CAAC,CAAA;gBACxE,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAA;gBAC7B,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;gBAClC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;YACxE,CAAC;oBAAS,CAAC;gBACT,OAAO,CAAC,OAAO,CAAC,CAAA;YAClB,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;YAC3C,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,qBAAqB,EAAE,CAAA;YAC7D,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,IAAI,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE;oBACvE,UAAU,EAAE,IAAI;oBAChB,kBAAkB,EAAE,GAAG;iBACxB,CAAC,CAAA;gBACF,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAA;YAC/B,CAAC;oBAAS,CAAC;gBACT,OAAO,CAAC,OAAO,CAAC,CAAA;YAClB,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;YAC9C,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,qBAAqB,EAAE,CAAA;YAC7D,IAAI,CAAC;gBACH,sDAAsD;gBACtD,MAAM,QAAQ,GAAG,IAAI,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,eAAe,CAAC,CAAA;gBACzE,QAAQ,CAAC,KAAK,EAAE,CAAA;gBAChB,QAAQ,CAAC,KAAK,EAAE,CAAA;gBAChB,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;gBAEnC,8DAA8D;gBAC9D,MAAM,QAAQ,GAAG,IAAI,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,eAAe,CAAC,CAAA;gBACzE,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACrC,CAAC;oBAAS,CAAC;gBACT,OAAO,CAAC,OAAO,CAAC,CAAA;YAClB,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACvC,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;YACtC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,qBAAqB,EAAE,CAAA;YAC7D,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,IAAI,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,eAAe,CAAC,CAAA;gBACxE,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;gBAClC,OAAO,CAAC,KAAK,EAAE,CAAA;gBACf,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;gBAClC,OAAO,CAAC,KAAK,EAAE,CAAA;gBACf,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACpC,CAAC;oBAAS,CAAC;gBACT,OAAO,CAAC,OAAO,CAAC,CAAA;YAClB,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;YACtC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,GAAG,qBAAqB,EAAE,CAAA;YAC5E,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,IAAI,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,eAAe,CAAC,CAAA;gBACxE,OAAO,CAAC,KAAK,EAAE,CAAA;gBACf,OAAO,CAAC,KAAK,EAAE,CAAA;gBACf,OAAO,CAAC,KAAK,EAAE,CAAA;gBAEf,+BAA+B;gBAC/B,MAAM,YAAY,GAAG,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC,CAAA;gBACxD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAA;gBACtC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;gBAC3B,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;YACjE,CAAC;oBAAS,CAAC;gBACT,OAAO,CAAC,OAAO,CAAC,CAAA;YAClB,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,iCAAiC,EAAE,GAAG,EAAE;QAC/C,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;YACnD,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,qBAAqB,EAAE,CAAA;YAC7D,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,IAAI,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE;oBACvE,UAAU,EAAE,GAAG;oBACf,kBAAkB,EAAE,EAAE;iBACvB,CAAC,CAAA;gBACF,8CAA8C;gBAC9C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC5B,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;gBAChD,CAAC;gBACD,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;YACrC,CAAC;oBAAS,CAAC;gBACT,OAAO,CAAC,OAAO,CAAC,CAAA;YAClB,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;YAClD,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,qBAAqB,EAAE,CAAA;YAC7D,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,IAAI,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE;oBACvE,UAAU,EAAE,GAAG;oBACf,kBAAkB,EAAE,EAAE;iBACvB,CAAC,CAAA;gBACF,kBAAkB;gBAClB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC5B,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;gBAC7C,CAAC;gBACD,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;YACrC,CAAC;oBAAS,CAAC;gBACT,OAAO,CAAC,OAAO,CAAC,CAAA;YAClB,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,qEAAqE,EAAE,GAAG,EAAE;YAC7E,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,qBAAqB,EAAE,CAAA;YAC7D,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,IAAI,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE;oBACvE,UAAU,EAAE,GAAG;oBACf,kBAAkB,EAAE,EAAE;oBACtB,qBAAqB,EAAE,IAAI,EAAE,2BAA2B;iBACzD,CAAC,CAAA;gBACF,mCAAmC;gBACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC5B,OAAO,CAAC,KAAK,EAAE,CAAA;gBACjB,CAAC;gBACD,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;gBAEnC,wCAAwC;gBACxC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;gBAC5C,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;gBAEjD,6BAA6B;gBAC7B,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;gBAC9C,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;YACrC,CAAC;oBAAS,CAAC;gBACT,OAAO,CAAC,OAAO,CAAC,CAAA;YAClB,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;YAC/C,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,qBAAqB,EAAE,CAAA;YAC7D,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,IAAI,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE;oBACvE,UAAU,EAAE,GAAG;oBACf,kBAAkB,EAAE,EAAE;iBACvB,CAAC,CAAA;gBACF,qBAAqB;gBACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC7B,OAAO,CAAC,KAAK,EAAE,CAAA;gBACjB,CAAC;gBACD,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;gBAEpC,sCAAsC;gBACtC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;gBAC5C,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;gBACjD,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;gBAC/C,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YACtC,CAAC;oBAAS,CAAC;gBACT,OAAO,CAAC,OAAO,CAAC,CAAA;YAClB,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;YACvC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,qBAAqB,EAAE,CAAA;YAC7D,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,IAAI,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE;oBACvE,UAAU,EAAE,GAAG;oBACf,kBAAkB,EAAE,EAAE;iBACvB,CAAC,CAAA;gBACF,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;gBAC/C,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;gBAEnC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;gBACjD,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;YACrC,CAAC;oBAAS,CAAC;gBACT,OAAO,CAAC,OAAO,CAAC,CAAA;YAClB,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACzC,EAAE,CAAC,6EAA6E,EAAE,GAAG,EAAE;YACrF,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,qBAAqB,EAAE,CAAA;YAC7D,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,IAAI,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE;oBACvE,UAAU,EAAE,GAAG;oBACf,kBAAkB,EAAE,EAAE;oBACtB,qBAAqB,EAAE,KAAK;iBAC7B,CAAC,CAAA;gBACF,kCAAkC;gBAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC5B,OAAO,CAAC,KAAK,EAAE,CAAA;gBACjB,CAAC;gBACD,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;gBAEnC,oDAAoD;gBACpD,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;gBAC3C,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;YACrC,CAAC;oBAAS,CAAC;gBACT,OAAO,CAAC,OAAO,CAAC,CAAA;YAClB,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,oEAAoE,EAAE,GAAG,EAAE;YAC5E,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,qBAAqB,EAAE,CAAA;YAC7D,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,IAAI,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE;oBACvE,UAAU,EAAE,GAAG;oBACf,kBAAkB,EAAE,EAAE;oBACtB,qBAAqB,EAAE,IAAI;iBAC5B,CAAC,CAAA;gBACF,qBAAqB;gBACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC5B,OAAO,CAAC,KAAK,EAAE,CAAA;gBACjB,CAAC;gBACD,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;gBAEnC,4BAA4B;gBAC5B,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;gBAC5C,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;gBAEnC,6BAA6B;gBAC7B,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;gBAC9C,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;YACrC,CAAC;oBAAS,CAAC;gBACT,OAAO,CAAC,OAAO,CAAC,CAAA;YAClB,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;QAC5B,EAAE,CAAC,8EAA8E,EAAE,GAAG,EAAE;YACtF,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,qBAAqB,EAAE,CAAA;YAC7D,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,IAAI,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE;oBACvE,UAAU,EAAE,GAAG;oBACf,kBAAkB,EAAE,EAAE;oBACtB,qBAAqB,EAAE,IAAI,EAAE,0BAA0B;iBACxD,CAAC,CAAA;gBACF,qBAAqB;gBACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC5B,OAAO,CAAC,KAAK,EAAE,CAAA;gBACjB,CAAC;gBAED,gEAAgE;gBAChE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;gBACxB,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,oBAAoB,CACvC,MAAM,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,CAC5C,CAAA;YACH,CAAC;oBAAS,CAAC;gBACT,OAAO,CAAC,OAAO,CAAC,CAAA;YAClB,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;YACjD,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,qBAAqB,EAAE,CAAA;YAC7D,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,IAAI,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE;oBACvE,UAAU,EAAE,GAAG;oBACf,kBAAkB,EAAE,EAAE;iBACvB,CAAC,CAAA;gBACF,qBAAqB;gBACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC7B,OAAO,CAAC,KAAK,EAAE,CAAA;gBACjB,CAAC;gBAED,yBAAyB;gBACzB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAA;gBAC3B,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,oBAAoB,CACxC,MAAM,CAAC,gBAAgB,CAAC,aAAa,CAAC,CACvC,CAAA;YACH,CAAC;oBAAS,CAAC;gBACT,OAAO,CAAC,OAAO,CAAC,CAAA;YAClB,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;YAC3C,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,qBAAqB,EAAE,CAAA;YAC7D,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,IAAI,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,eAAe,CAAC,CAAA;gBACxE,OAAO,CAAC,kBAAkB,EAAE,CAAA;gBAC5B,OAAO,CAAC,iBAAiB,EAAE,CAAA;gBAC3B,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,oBAAoB,CACvC,MAAM,CAAC,gBAAgB,CAAC,mBAAmB,CAAC,CAC7C,CAAA;YACH,CAAC;oBAAS,CAAC;gBACT,OAAO,CAAC,OAAO,CAAC,CAAA;YAClB,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;YAC9D,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,qBAAqB,EAAE,CAAA;YAC7D,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,IAAI,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,eAAe,CAAC,CAAA;gBACxE,OAAO,CAAC,kBAAkB,EAAE,CAAA;gBAC5B,OAAO,CAAC,iBAAiB,EAAE,CAAA;gBAC3B,mBAAmB;gBACnB,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACzB,CAAC;oBAAS,CAAC;gBACT,OAAO,CAAC,OAAO,CAAC,CAAA;YAClB,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;QAC1B,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;YACxC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,qBAAqB,EAAE,CAAA;YAC7D,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,IAAI,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE;oBACvE,UAAU,EAAE,CAAC;oBACb,kBAAkB,EAAE,CAAC;iBACtB,CAAC,CAAA;gBACF,6CAA6C;gBAC7C,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;gBAC5C,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;gBAC/C,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACpC,CAAC;oBAAS,CAAC;gBACT,OAAO,CAAC,OAAO,CAAC,CAAA;YAClB,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;YACjD,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,qBAAqB,EAAE,CAAA;YAC7D,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,IAAI,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE;oBACvE,UAAU,EAAE,GAAG;oBACf,kBAAkB,EAAE,GAAG;oBACvB,qBAAqB,EAAE,IAAI,EAAE,2BAA2B;iBACzD,CAAC,CAAA;gBACF,6DAA6D;gBAC7D,yEAAyE;gBACzE,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;gBAC5C,sCAAsC;gBACtC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAChD,CAAC;oBAAS,CAAC;gBACT,OAAO,CAAC,OAAO,CAAC,CAAA;YAClB,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;YACjD,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,qBAAqB,EAAE,CAAA;YAC7D,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,IAAI,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE;oBACvE,UAAU,EAAE,CAAC,GAAG;oBAChB,kBAAkB,EAAE,CAAC,EAAE;iBACxB,CAAC,CAAA;gBACF,yBAAyB;gBACzB,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;gBAC5C,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YACjD,CAAC;oBAAS,CAAC;gBACT,OAAO,CAAC,OAAO,CAAC,CAAA;YAClB,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=device-webhook-context.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"device-webhook-context.test.d.ts","sourceRoot":"","sources":["../../../src/test/hap/device-webhook-context.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,128 @@
1
+ /* eslint-disable import/first */
2
+ import { describe, expect, it, vi } from 'vitest';
3
+ // Mock modules used by HAP device base occasionally via platform
4
+ vi.mock('fakegato-history', () => ({ default: () => ({}) }));
5
+ vi.mock('homebridge-lib/EveHomeKitTypes', () => ({ EveHomeKitTypes: class {
6
+ constructor() { }
7
+ } }));
8
+ import { deviceBase } from '../../devices-hap/device.js';
9
+ // Minimal HAP stub to satisfy deviceBase constructor operations
10
+ function makeHapStub() {
11
+ class Service {
12
+ _chars = {};
13
+ setCharacteristic(k, v) {
14
+ this._chars[k] = v;
15
+ return this;
16
+ }
17
+ getCharacteristic(k) {
18
+ return {
19
+ updateValue: (v) => {
20
+ this._chars[k] = v;
21
+ return this;
22
+ },
23
+ };
24
+ }
25
+ }
26
+ const Characteristic = {
27
+ Manufacturer: 'Manufacturer',
28
+ AppMatchingIdentifier: 'AppMatchingIdentifier',
29
+ Name: 'Name',
30
+ ConfiguredName: 'ConfiguredName',
31
+ Model: 'Model',
32
+ ProductData: 'ProductData',
33
+ SerialNumber: 'SerialNumber',
34
+ HardwareRevision: 'HardwareRevision',
35
+ SoftwareRevision: 'SoftwareRevision',
36
+ FirmwareRevision: 'FirmwareRevision',
37
+ On: 'On',
38
+ };
39
+ Service.AccessoryInformation = class extends Service {
40
+ };
41
+ Service.Outlet = class extends Service {
42
+ };
43
+ return { Service, Characteristic, Categories: { OUTLET: 7 } };
44
+ }
45
+ // Minimal PlatformAccessory stub
46
+ function makeAccessoryStub(hap, name = 'Test Accessory') {
47
+ const services = [];
48
+ return {
49
+ displayName: name,
50
+ category: 0,
51
+ context: {},
52
+ getService(cls) {
53
+ // find existing or create
54
+ const svc = services.find(s => s instanceof cls);
55
+ if (svc) {
56
+ return svc;
57
+ }
58
+ const s = new cls();
59
+ services.push(s);
60
+ return s;
61
+ },
62
+ addService(cls) {
63
+ const s = new cls();
64
+ services.push(s);
65
+ return s;
66
+ },
67
+ };
68
+ }
69
+ // Minimal SwitchBotHAPPlatform-like stub with required surface
70
+ function makePlatformStub(options, hap) {
71
+ const log = { info: vi.fn(), warn: vi.fn(), debug: vi.fn(), error: vi.fn(), success: vi.fn() };
72
+ return {
73
+ api: { hap },
74
+ log,
75
+ config: { options, credentials: {} },
76
+ debugMode: false,
77
+ // logging helpers used by deviceBase
78
+ infoLog: () => { },
79
+ successLog: () => { },
80
+ debugSuccessLog: () => { },
81
+ warnLog: () => { },
82
+ debugWarnLog: () => { },
83
+ errorLog: () => { },
84
+ debugErrorLog: () => { },
85
+ debugLog: () => { },
86
+ loggingIsDebug: async () => false,
87
+ enablingPlatformLogging: async () => true,
88
+ connectBLE: vi.fn(),
89
+ bleEventHandler: {},
90
+ webhookEventHandler: {},
91
+ };
92
+ }
93
+ // Create a tiny concrete subclass to instantiate deviceBase
94
+ class TestHAPDevice extends deviceBase {
95
+ }
96
+ describe('hap device base webhook context', () => {
97
+ it('sets accessory.context.webhook=true when global webhook is enabled and device.webhook is undefined', async () => {
98
+ const hap = makeHapStub();
99
+ const accessory = makeAccessoryStub(hap, 'Plug Device');
100
+ const platform = makePlatformStub({ webhook: true, logging: 'debug' }, hap);
101
+ const dev = {
102
+ deviceId: 'DEV-HAP-1',
103
+ deviceType: 'Plug',
104
+ connectionType: 'OpenAPI',
105
+ // webhook intentionally undefined
106
+ };
107
+ const d = new TestHAPDevice(platform, accessory, dev);
108
+ // Assert context
109
+ expect(accessory.context.webhook).toBe(true);
110
+ // ensure no unused var warning
111
+ expect(d).toBeDefined();
112
+ });
113
+ it('keeps accessory.context.webhook=false when device.webhook=false even if global is true', async () => {
114
+ const hap = makeHapStub();
115
+ const accessory = makeAccessoryStub(hap, 'Plug Device 2');
116
+ const platform = makePlatformStub({ webhook: true, logging: 'debug' }, hap);
117
+ const dev = {
118
+ deviceId: 'DEV-HAP-2',
119
+ deviceType: 'Plug',
120
+ connectionType: 'OpenAPI',
121
+ webhook: false,
122
+ };
123
+ const d = new TestHAPDevice(platform, accessory, dev);
124
+ expect(accessory.context.webhook).toBe(false);
125
+ expect(d).toBeDefined();
126
+ });
127
+ });
128
+ //# sourceMappingURL=device-webhook-context.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"device-webhook-context.test.js","sourceRoot":"","sources":["../../../src/test/hap/device-webhook-context.test.ts"],"names":[],"mappings":"AAAA,iCAAiC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AACjD,iEAAiE;AACjE,EAAE,CAAC,IAAI,CAAC,kBAAkB,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;AAC5D,EAAE,CAAC,IAAI,CAAC,gCAAgC,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,eAAe,EAAE;QAAQ,gBAAe,CAAC;KAAE,EAAE,CAAC,CAAC,CAAA;AAElG,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAA;AAExD,gEAAgE;AAChE,SAAS,WAAW;IAClB,MAAM,OAAO;QACH,MAAM,GAAwB,EAAE,CAAA;QACxC,iBAAiB,CAAC,CAAM,EAAE,CAAM;YAC9B,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;YAClB,OAAO,IAAI,CAAA;QACb,CAAC;QAED,iBAAiB,CAAC,CAAM;YACtB,OAAO;gBACL,WAAW,EAAE,CAAC,CAAM,EAAE,EAAE;oBACtB,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;oBAClB,OAAO,IAAI,CAAA;gBACb,CAAC;aACK,CAAA;QACV,CAAC;KACF;IACD,MAAM,cAAc,GAAQ;QAC1B,YAAY,EAAE,cAAc;QAC5B,qBAAqB,EAAE,uBAAuB;QAC9C,IAAI,EAAE,MAAM;QACZ,cAAc,EAAE,gBAAgB;QAChC,KAAK,EAAE,OAAO;QACd,WAAW,EAAE,aAAa;QAC1B,YAAY,EAAE,cAAc;QAC5B,gBAAgB,EAAE,kBAAkB;QACpC,gBAAgB,EAAE,kBAAkB;QACpC,gBAAgB,EAAE,kBAAkB;QACpC,EAAE,EAAE,IAAI;KACT,CACA;IAAC,OAAe,CAAC,oBAAoB,GAAG,KAAM,SAAQ,OAAO;KAAG,CAChE;IAAC,OAAe,CAAC,MAAM,GAAG,KAAM,SAAQ,OAAO;KAAG,CAAA;IACnD,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,CAAA;AAC/D,CAAC;AAED,iCAAiC;AACjC,SAAS,iBAAiB,CAAC,GAAQ,EAAE,IAAI,GAAG,gBAAgB;IAC1D,MAAM,QAAQ,GAAU,EAAE,CAAA;IAC1B,OAAO;QACL,WAAW,EAAE,IAAI;QACjB,QAAQ,EAAE,CAAC;QACX,OAAO,EAAE,EAAE;QACX,UAAU,CAAC,GAAQ;YACjB,0BAA0B;YAC1B,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,YAAY,GAAG,CAAC,CAAA;YAChD,IAAI,GAAG,EAAE,CAAC;gBACR,OAAO,GAAG,CAAA;YACZ,CAAC;YACD,MAAM,CAAC,GAAG,IAAI,GAAG,EAAE,CAAA;YACnB,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YAChB,OAAO,CAAC,CAAA;QACV,CAAC;QACD,UAAU,CAAC,GAAQ;YACjB,MAAM,CAAC,GAAG,IAAI,GAAG,EAAE,CAAA;YACnB,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YAChB,OAAO,CAAC,CAAA;QACV,CAAC;KACF,CAAA;AACH,CAAC;AAED,+DAA+D;AAC/D,SAAS,gBAAgB,CAAC,OAAY,EAAE,GAAQ;IAC9C,MAAM,GAAG,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAA;IAC9F,OAAO;QACL,GAAG,EAAE,EAAE,GAAG,EAAE;QACZ,GAAG;QACH,MAAM,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE;QACpC,SAAS,EAAE,KAAK;QAChB,qCAAqC;QACrC,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC;QACjB,UAAU,EAAE,GAAG,EAAE,GAAE,CAAC;QACpB,eAAe,EAAE,GAAG,EAAE,GAAE,CAAC;QACzB,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC;QACjB,YAAY,EAAE,GAAG,EAAE,GAAE,CAAC;QACtB,QAAQ,EAAE,GAAG,EAAE,GAAE,CAAC;QAClB,aAAa,EAAE,GAAG,EAAE,GAAE,CAAC;QACvB,QAAQ,EAAE,GAAG,EAAE,GAAE,CAAC;QAClB,cAAc,EAAE,KAAK,IAAI,EAAE,CAAC,KAAK;QACjC,uBAAuB,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI;QACzC,UAAU,EAAE,EAAE,CAAC,EAAE,EAAE;QACnB,eAAe,EAAE,EAAE;QACnB,mBAAmB,EAAE,EAAE;KACxB,CAAA;AACH,CAAC;AAED,4DAA4D;AAC5D,MAAM,aAAc,SAAQ,UAAU;CAErC;AAED,QAAQ,CAAC,iCAAiC,EAAE,GAAG,EAAE;IAC/C,EAAE,CAAC,oGAAoG,EAAE,KAAK,IAAI,EAAE;QAClH,MAAM,GAAG,GAAG,WAAW,EAAE,CAAA;QACzB,MAAM,SAAS,GAAQ,iBAAiB,CAAC,GAAG,EAAE,aAAa,CAAC,CAAA;QAC5D,MAAM,QAAQ,GAAQ,gBAAgB,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,GAAG,CAAC,CAAA;QAEhF,MAAM,GAAG,GAAQ;YACf,QAAQ,EAAE,WAAW;YACrB,UAAU,EAAE,MAAM;YAClB,cAAc,EAAE,SAAS;YACzB,kCAAkC;SACnC,CAAA;QAED,MAAM,CAAC,GAAG,IAAI,aAAa,CAAC,QAAQ,EAAE,SAAS,EAAE,GAAG,CAAC,CAAA;QACrD,iBAAiB;QACjB,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC5C,+BAA+B;QAC/B,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAA;IACzB,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,wFAAwF,EAAE,KAAK,IAAI,EAAE;QACtG,MAAM,GAAG,GAAG,WAAW,EAAE,CAAA;QACzB,MAAM,SAAS,GAAQ,iBAAiB,CAAC,GAAG,EAAE,eAAe,CAAC,CAAA;QAC9D,MAAM,QAAQ,GAAQ,gBAAgB,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,GAAG,CAAC,CAAA;QAEhF,MAAM,GAAG,GAAQ;YACf,QAAQ,EAAE,WAAW;YACrB,UAAU,EAAE,MAAM;YAClB,cAAc,EAAE,SAAS;YACzB,OAAO,EAAE,KAAK;SACf,CAAA;QAED,MAAM,CAAC,GAAG,IAAI,aAAa,CAAC,QAAQ,EAAE,SAAS,EAAE,GAAG,CAAC,CAAA;QACrD,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAC7C,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAA;IACzB,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=platform-hap.logging.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform-hap.logging.test.d.ts","sourceRoot":"","sources":["../../../src/test/hap/platform-hap.logging.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,33 @@
1
+ /* eslint-disable import/first */
2
+ import { describe, expect, it, vi } from 'vitest';
3
+ // Mock modules used by the HAP platform constructor to avoid requiring a real Homebridge API
4
+ vi.mock('fakegato-history', () => ({ default: () => ({}) }));
5
+ vi.mock('homebridge-lib/EveHomeKitTypes', () => ({ EveHomeKitTypes: class {
6
+ constructor() { }
7
+ } }));
8
+ import { SwitchBotHAPPlatform } from '../../platform-hap.js';
9
+ import { makeLogStub } from '../helpers/platform-fixtures.js';
10
+ /**
11
+ * Verifies that HAP platform debug logger includes the accessory displayName
12
+ * when loading an accessory from the cache.
13
+ */
14
+ describe('platform-hap logging', () => {
15
+ it('prints accessory name when loading HAP cached accessory', async () => {
16
+ const api = { on: vi.fn() };
17
+ const log = makeLogStub();
18
+ const platform = new SwitchBotHAPPlatform(log, {
19
+ name: 'SwitchBot',
20
+ credentials: {},
21
+ options: { logging: 'debug' },
22
+ devices: [],
23
+ }, api);
24
+ const accessory = { displayName: 'Test HAP Device' };
25
+ await platform.configureAccessory(accessory);
26
+ // Allow async logger to flush
27
+ await new Promise(resolve => setTimeout(resolve, 0));
28
+ const calls = log.info.mock.calls;
29
+ const hasLine = calls.some(args => String(args[0]).includes('Loading accessory from cache: Test HAP Device'));
30
+ expect(hasLine).toBe(true);
31
+ });
32
+ });
33
+ //# sourceMappingURL=platform-hap.logging.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform-hap.logging.test.js","sourceRoot":"","sources":["../../../src/test/hap/platform-hap.logging.test.ts"],"names":[],"mappings":"AAAA,iCAAiC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AACjD,6FAA6F;AAC7F,EAAE,CAAC,IAAI,CAAC,kBAAkB,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;AAC5D,EAAE,CAAC,IAAI,CAAC,gCAAgC,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,eAAe,EAAE;QAAQ,gBAAe,CAAC;KAAE,EAAE,CAAC,CAAC,CAAA;AAElG,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAA;AAE7D;;;GAGG;AACH,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;QACvE,MAAM,GAAG,GAAQ,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAA;QAChC,MAAM,GAAG,GAAQ,WAAW,EAAE,CAAA;QAE9B,MAAM,QAAQ,GAAG,IAAI,oBAAoB,CAAC,GAAU,EAAE;YACpD,IAAI,EAAE,WAAW;YACjB,WAAW,EAAE,EAAE;YACf,OAAO,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE;YAC7B,OAAO,EAAE,EAAE;SACL,EAAE,GAAG,CAAC,CAAA;QAEd,MAAM,SAAS,GAAQ,EAAE,WAAW,EAAE,iBAAiB,EAAE,CAAA;QACzD,MAAO,QAAgB,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAA;QAErD,8BAA8B;QAC9B,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAA;QAEpD,MAAM,KAAK,GAAI,GAAG,CAAC,IAAY,CAAC,IAAI,CAAC,KAAwB,CAAA;QAC7D,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,+CAA+C,CAAC,CAAC,CAAA;QAC7G,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC5B,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=platform-hap.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform-hap.test.d.ts","sourceRoot":"","sources":["../../../src/test/hap/platform-hap.test.ts"],"names":[],"mappings":""}