@homebridge-plugins/homebridge-updater 3.1.9 → 3.1.10-beta.0

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 (62) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/README.md +1 -2
  3. package/dist/homebridge-ui/public/index.html +2 -3
  4. package/dist/ui-api.d.ts.map +1 -1
  5. package/dist/ui-api.js +15 -0
  6. package/dist/ui-api.js.map +1 -1
  7. package/dist/updateCheckCore.d.ts.map +1 -1
  8. package/dist/updateCheckCore.js +20 -0
  9. package/dist/updateCheckCore.js.map +1 -1
  10. package/dist/updateSensor.d.ts +3 -0
  11. package/dist/updateSensor.d.ts.map +1 -1
  12. package/dist/updateSensor.js +14 -1
  13. package/dist/updateSensor.js.map +1 -1
  14. package/package.json +4 -3
  15. package/dist/Platform.HAP.test.d.ts +0 -2
  16. package/dist/Platform.HAP.test.d.ts.map +0 -1
  17. package/dist/Platform.HAP.test.js +0 -197
  18. package/dist/Platform.HAP.test.js.map +0 -1
  19. package/dist/Platform.Matter.test.d.ts +0 -2
  20. package/dist/Platform.Matter.test.d.ts.map +0 -1
  21. package/dist/Platform.Matter.test.js +0 -124
  22. package/dist/Platform.Matter.test.js.map +0 -1
  23. package/dist/configMigration.test.d.ts +0 -2
  24. package/dist/configMigration.test.d.ts.map +0 -1
  25. package/dist/configMigration.test.js +0 -119
  26. package/dist/configMigration.test.js.map +0 -1
  27. package/dist/configTypes.test.d.ts +0 -2
  28. package/dist/configTypes.test.d.ts.map +0 -1
  29. package/dist/configTypes.test.js +0 -108
  30. package/dist/configTypes.test.js.map +0 -1
  31. package/dist/ignore-plugins.test.d.ts +0 -2
  32. package/dist/ignore-plugins.test.d.ts.map +0 -1
  33. package/dist/ignore-plugins.test.js +0 -121
  34. package/dist/ignore-plugins.test.js.map +0 -1
  35. package/dist/index.test.d.ts +0 -2
  36. package/dist/index.test.d.ts.map +0 -1
  37. package/dist/index.test.js +0 -8
  38. package/dist/index.test.js.map +0 -1
  39. package/dist/schema.test.d.ts +0 -2
  40. package/dist/schema.test.d.ts.map +0 -1
  41. package/dist/schema.test.js +0 -111
  42. package/dist/schema.test.js.map +0 -1
  43. package/dist/updateCheckCore.autoupdate.test.d.ts +0 -2
  44. package/dist/updateCheckCore.autoupdate.test.d.ts.map +0 -1
  45. package/dist/updateCheckCore.autoupdate.test.js +0 -55
  46. package/dist/updateCheckCore.autoupdate.test.js.map +0 -1
  47. package/dist/updateCheckCore.beta.test.d.ts +0 -2
  48. package/dist/updateCheckCore.beta.test.d.ts.map +0 -1
  49. package/dist/updateCheckCore.beta.test.js +0 -48
  50. package/dist/updateCheckCore.beta.test.js.map +0 -1
  51. package/dist/updateCheckCore.route.test.d.ts +0 -2
  52. package/dist/updateCheckCore.route.test.d.ts.map +0 -1
  53. package/dist/updateCheckCore.route.test.js +0 -71
  54. package/dist/updateCheckCore.route.test.js.map +0 -1
  55. package/dist/updateSensor.test.d.ts +0 -2
  56. package/dist/updateSensor.test.d.ts.map +0 -1
  57. package/dist/updateSensor.test.js +0 -179
  58. package/dist/updateSensor.test.js.map +0 -1
  59. package/dist/utils.test.d.ts +0 -2
  60. package/dist/utils.test.d.ts.map +0 -1
  61. package/dist/utils.test.js +0 -150
  62. package/dist/utils.test.js.map +0 -1
@@ -1,197 +0,0 @@
1
- import { describe, expect, it, vi } from 'vitest';
2
- import { FAILURE_SENSOR_UUID_KEY, LEGACY_UPDATE_SENSOR_UUID_KEY, PLATFORM_NAME, PLUGIN_NAME, UPDATE_SENSOR_UUID_KEY } from './settings.js';
3
- /**
4
- * Unit tests for the legacy UUID migration logic in PluginUpdatePlatform.
5
- *
6
- * These tests validate the three key scenarios handled by handleLegacyMigration:
7
- * 1. Only legacy UUID (v2.x) in cache — must restore without creating a duplicate.
8
- * 2. Both legacy and current UUID in cache — must unregister the stale legacy accessory.
9
- * 3. Normal v3 operation (no legacy) — must leave the current accessory untouched.
10
- */
11
- describe('pluginUpdatePlatform legacy UUID migration', () => {
12
- function buildMocks(options = {}) {
13
- // Map uuid key → deterministic UUID value
14
- const uuidMap = {
15
- [UPDATE_SENSOR_UUID_KEY]: 'uuid-v3-update',
16
- [FAILURE_SENSOR_UUID_KEY]: 'uuid-v3-failure',
17
- [LEGACY_UPDATE_SENSOR_UUID_KEY]: 'uuid-legacy-update',
18
- ...options.generateReturnsByKey,
19
- };
20
- const didFinishListeners = [];
21
- const mockLog = {
22
- info: vi.fn(),
23
- warn: vi.fn(),
24
- error: vi.fn(),
25
- debug: vi.fn(),
26
- };
27
- const mockApi = {
28
- hap: {
29
- uuid: {
30
- generate: vi.fn((key) => uuidMap[key] ?? `uuid-${key}`),
31
- },
32
- },
33
- on: vi.fn((event, cb) => {
34
- if (event === 'didFinishLaunching') {
35
- didFinishListeners.push(cb);
36
- }
37
- }),
38
- platformAccessory: vi.fn(),
39
- registerPlatformAccessories: vi.fn(),
40
- unregisterPlatformAccessories: vi.fn(),
41
- };
42
- const mockConfig = {
43
- sensorType: 'motion',
44
- failureSensorType: undefined,
45
- autoUpdateHomebridge: false,
46
- autoUpdateHomebridgeUI: false,
47
- autoUpdatePlugins: false,
48
- autoUpdateNode: false,
49
- name: 'PluginUpdate',
50
- };
51
- const mockUpdateSensor = {
52
- configureAccessory: vi.fn(),
53
- addUpdateSensor: vi.fn(),
54
- };
55
- const mockFailureSensor = {
56
- configure: vi.fn(),
57
- setState: vi.fn(),
58
- };
59
- function fireDidFinishLaunching() {
60
- for (const cb of didFinishListeners) {
61
- cb();
62
- }
63
- }
64
- return { mockLog, mockApi, mockConfig, mockUpdateSensor, mockFailureSensor, uuidMap, didFinishListeners, fireDidFinishLaunching };
65
- }
66
- /**
67
- * Simulate the Platform.HAP.ts logic directly using extracted functions so we can
68
- * test it without requiring a full Homebridge runtime import.
69
- */
70
- function runMigrationSimulation(mockApi, mockLog, mockUpdateSensor, uuidMap, cachedAccessories) {
71
- const updateSensorUuid = mockApi.hap.uuid.generate(UPDATE_SENSOR_UUID_KEY);
72
- const legacyUpdateSensorUuid = mockApi.hap.uuid.generate(LEGACY_UPDATE_SENSOR_UUID_KEY);
73
- let cachedLegacyUpdateAccessory;
74
- let cachedCurrentUpdateAccessory;
75
- let updateSensorCached = false;
76
- // Simulate configureAccessory for each cached accessory
77
- for (const accessory of cachedAccessories) {
78
- if (accessory.UUID === updateSensorUuid) {
79
- mockUpdateSensor.configureAccessory(accessory);
80
- updateSensorCached = true;
81
- cachedCurrentUpdateAccessory = accessory;
82
- continue;
83
- }
84
- if (accessory.UUID === legacyUpdateSensorUuid) {
85
- cachedLegacyUpdateAccessory = accessory;
86
- continue;
87
- }
88
- mockLog.warn(`Ignoring unknown cached accessory: ${accessory.displayName}`);
89
- }
90
- // handleLegacyMigration (fires first on didFinishLaunching)
91
- let registered = updateSensorCached;
92
- function handleLegacyMigration() {
93
- if (!cachedLegacyUpdateAccessory) {
94
- return;
95
- }
96
- if (updateSensorCached) {
97
- // Both UUIDs found — remove the newer empty accessory, promote the legacy one
98
- // so the user's HomeKit customisations are preserved.
99
- if (cachedCurrentUpdateAccessory) {
100
- mockApi.unregisterPlatformAccessories(PLUGIN_NAME, PLATFORM_NAME, [cachedCurrentUpdateAccessory]);
101
- cachedCurrentUpdateAccessory = undefined;
102
- }
103
- mockUpdateSensor.configureAccessory(cachedLegacyUpdateAccessory);
104
- cachedLegacyUpdateAccessory = undefined;
105
- mockLog.info('Migrated update sensor to legacy cached accessory (preserved HomeKit customisations)');
106
- return;
107
- }
108
- mockUpdateSensor.configureAccessory(cachedLegacyUpdateAccessory);
109
- registered = true;
110
- mockLog.info('Restored update sensor from legacy cached accessory');
111
- cachedLegacyUpdateAccessory = undefined;
112
- }
113
- // addUpdateSensor (fires after handleLegacyMigration)
114
- function addUpdateSensor() {
115
- if (!registered) {
116
- // would create a new accessory and register it
117
- mockApi.registerPlatformAccessories(PLUGIN_NAME, PLATFORM_NAME, [{ displayName: 'new-accessory' }]);
118
- registered = true;
119
- }
120
- }
121
- handleLegacyMigration();
122
- addUpdateSensor();
123
- return { registered, cachedLegacyUpdateAccessory };
124
- }
125
- it('scenario A: only legacy UUID in cache — must restore without creating a duplicate', () => {
126
- const { mockLog, mockApi, mockUpdateSensor, uuidMap } = buildMocks();
127
- const legacyAccessory = { UUID: uuidMap[LEGACY_UPDATE_SENSOR_UUID_KEY], displayName: 'Plugin Update Check' };
128
- const { registered } = runMigrationSimulation(mockApi, mockLog, mockUpdateSensor, uuidMap, [legacyAccessory]);
129
- // Legacy accessory used as update sensor
130
- expect(mockUpdateSensor.configureAccessory).toHaveBeenCalledWith(legacyAccessory);
131
- expect(mockUpdateSensor.configureAccessory).toHaveBeenCalledTimes(1);
132
- // registered was set to true so no new accessory was created
133
- expect(mockApi.registerPlatformAccessories).not.toHaveBeenCalled();
134
- // No stale unregister
135
- expect(mockApi.unregisterPlatformAccessories).not.toHaveBeenCalled();
136
- // Info log emitted
137
- expect(mockLog.info).toHaveBeenCalledWith(expect.stringContaining('Restored update sensor from legacy cached accessory'));
138
- // No unknown-accessory warning
139
- expect(mockLog.warn).not.toHaveBeenCalled();
140
- expect(registered).toBe(true);
141
- });
142
- it('scenario B: both legacy and current UUID in cache — must preserve legacy accessory and remove the newer empty duplicate', () => {
143
- const { mockLog, mockApi, mockUpdateSensor, uuidMap } = buildMocks();
144
- const v3Accessory = { UUID: uuidMap[UPDATE_SENSOR_UUID_KEY], displayName: 'PluginUpdate' };
145
- const legacyAccessory = { UUID: uuidMap[LEGACY_UPDATE_SENSOR_UUID_KEY], displayName: 'Plugin Update Check' };
146
- runMigrationSimulation(mockApi, mockLog, mockUpdateSensor, uuidMap, [v3Accessory, legacyAccessory]);
147
- // configureAccessory called exactly twice: once for the v3 (during restore) then
148
- // again for the legacy during migration — legacy must be the final (last) call.
149
- expect(mockUpdateSensor.configureAccessory).toHaveBeenCalledTimes(2);
150
- expect(mockUpdateSensor.configureAccessory).toHaveBeenNthCalledWith(1, v3Accessory);
151
- expect(mockUpdateSensor.configureAccessory).toHaveBeenLastCalledWith(legacyAccessory);
152
- // Current-UUID empty duplicate is removed
153
- expect(mockApi.unregisterPlatformAccessories).toHaveBeenCalledWith(PLUGIN_NAME, PLATFORM_NAME, [v3Accessory]);
154
- // No new accessory created
155
- expect(mockApi.registerPlatformAccessories).not.toHaveBeenCalled();
156
- expect(mockLog.info).toHaveBeenCalledWith(expect.stringContaining('Migrated update sensor to legacy cached accessory'));
157
- });
158
- it('scenario B (legacy processed first): same result regardless of configureAccessory order', () => {
159
- const { mockLog, mockApi, mockUpdateSensor, uuidMap } = buildMocks();
160
- const v3Accessory = { UUID: uuidMap[UPDATE_SENSOR_UUID_KEY], displayName: 'PluginUpdate' };
161
- const legacyAccessory = { UUID: uuidMap[LEGACY_UPDATE_SENSOR_UUID_KEY], displayName: 'Plugin Update Check' };
162
- // Legacy accessory arrives first in configureAccessory order
163
- runMigrationSimulation(mockApi, mockLog, mockUpdateSensor, uuidMap, [legacyAccessory, v3Accessory]);
164
- // Only the v3 accessory is processed during restore (legacy is held), then the
165
- // migration promotes the legacy one — so configureAccessory is still called twice
166
- // and the legacy accessory is always the last call.
167
- expect(mockUpdateSensor.configureAccessory).toHaveBeenCalledTimes(2);
168
- expect(mockUpdateSensor.configureAccessory).toHaveBeenLastCalledWith(legacyAccessory);
169
- expect(mockApi.unregisterPlatformAccessories).toHaveBeenCalledWith(PLUGIN_NAME, PLATFORM_NAME, [v3Accessory]);
170
- expect(mockApi.registerPlatformAccessories).not.toHaveBeenCalled();
171
- });
172
- it('scenario C: normal v3 operation — no legacy accessory, no side effects', () => {
173
- const { mockLog, mockApi, mockUpdateSensor, uuidMap } = buildMocks();
174
- const v3Accessory = { UUID: uuidMap[UPDATE_SENSOR_UUID_KEY], displayName: 'PluginUpdate' };
175
- runMigrationSimulation(mockApi, mockLog, mockUpdateSensor, uuidMap, [v3Accessory]);
176
- expect(mockUpdateSensor.configureAccessory).toHaveBeenCalledWith(v3Accessory);
177
- expect(mockApi.unregisterPlatformAccessories).not.toHaveBeenCalled();
178
- expect(mockApi.registerPlatformAccessories).not.toHaveBeenCalled();
179
- expect(mockLog.info).not.toHaveBeenCalled();
180
- expect(mockLog.warn).not.toHaveBeenCalled();
181
- });
182
- it('scenario D: no cached accessories at all — creates new accessory normally', () => {
183
- const { mockLog, mockApi, mockUpdateSensor, uuidMap } = buildMocks();
184
- const { registered } = runMigrationSimulation(mockApi, mockLog, mockUpdateSensor, uuidMap, []);
185
- expect(mockUpdateSensor.configureAccessory).not.toHaveBeenCalled();
186
- expect(mockApi.registerPlatformAccessories).toHaveBeenCalledTimes(1);
187
- expect(registered).toBe(true);
188
- expect(mockLog.warn).not.toHaveBeenCalled();
189
- });
190
- it('truly unknown accessories still emit a warning', () => {
191
- const { mockLog, mockApi, mockUpdateSensor, uuidMap } = buildMocks();
192
- const unknownAccessory = { UUID: 'some-other-uuid', displayName: 'Some Other Accessory' };
193
- runMigrationSimulation(mockApi, mockLog, mockUpdateSensor, uuidMap, [unknownAccessory]);
194
- expect(mockLog.warn).toHaveBeenCalledWith(expect.stringContaining('Ignoring unknown cached accessory: Some Other Accessory'));
195
- });
196
- });
197
- //# sourceMappingURL=Platform.HAP.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Platform.HAP.test.js","sourceRoot":"","sources":["../src/Platform.HAP.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=Platform.Matter.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Platform.Matter.test.d.ts","sourceRoot":"","sources":["../src/Platform.Matter.test.ts"],"names":[],"mappings":""}
@@ -1,124 +0,0 @@
1
- import { describe, expect, it, vi } from 'vitest';
2
- import { PLATFORM_NAME, PLUGIN_NAME } from './settings.js';
3
- /**
4
- * Unit tests for the stale HAP accessory cleanup in PluginUpdateMatterPlatform.
5
- *
6
- * When the platform runs in Matter mode, any cached HAP accessories from a previous
7
- * HAP-mode run (including legacy v2 accessories) are stale and must be unregistered
8
- * to prevent ghost/duplicate sensors in HomeKit.
9
- *
10
- * Removal is intentionally deferred to `didFinishLaunching` — calling
11
- * `unregisterPlatformAccessories` during the `configureAccessory` phase (before the
12
- * bridge is fully initialized) causes Homebridge to throw
13
- * "Cannot find the bridged Accessory to remove."
14
- */
15
- describe('pluginUpdateMatterPlatform stale HAP cleanup', () => {
16
- function buildMocks() {
17
- const unregisterCalls = [];
18
- const didFinishListeners = [];
19
- const mockLog = {
20
- info: vi.fn(),
21
- warn: vi.fn(),
22
- error: vi.fn(),
23
- debug: vi.fn(),
24
- };
25
- const mockApi = {
26
- matter: { registerPlatformAccessories: vi.fn(), uuid: { generate: vi.fn().mockReturnValue('matter-uuid') } },
27
- hap: { uuid: { generate: vi.fn().mockReturnValue('hap-uuid') } },
28
- on: vi.fn((event, cb) => {
29
- if (event === 'didFinishLaunching') {
30
- didFinishListeners.push(cb);
31
- }
32
- }),
33
- user: { storagePath: vi.fn().mockReturnValue('/tmp') },
34
- unregisterPlatformAccessories: vi.fn((...args) => {
35
- unregisterCalls.push({ pluginName: args[0], platformName: args[1], accessories: args[2] });
36
- }),
37
- };
38
- const mockConfig = {
39
- name: 'PluginUpdate',
40
- sensorType: 'motion',
41
- failureSensorType: undefined,
42
- autoUpdateHomebridge: false,
43
- autoUpdateHomebridgeUI: false,
44
- autoUpdatePlugins: false,
45
- autoUpdateNode: false,
46
- };
47
- function fireDidFinishLaunching() {
48
- for (const cb of didFinishListeners) {
49
- cb();
50
- }
51
- }
52
- return { mockLog, mockApi, mockConfig, unregisterCalls, fireDidFinishLaunching };
53
- }
54
- /**
55
- * Build a simulator that mirrors PluginUpdateMatterPlatform's stale-accessory
56
- * handling without importing the real class (which would pull in Homebridge modules).
57
- *
58
- * - configureAccessory: collects accessories into a stale list (no immediate removal)
59
- * - removeStaleAccessories: called on didFinishLaunching; batches all collected
60
- * accessories into a single unregisterPlatformAccessories call
61
- */
62
- function buildSimulator(api) {
63
- const staleAccessories = [];
64
- function configureAccessory(accessory) {
65
- staleAccessories.push(accessory);
66
- }
67
- function removeStaleAccessories() {
68
- if (staleAccessories.length === 0) {
69
- return;
70
- }
71
- api.unregisterPlatformAccessories(PLUGIN_NAME, PLATFORM_NAME, [...staleAccessories]);
72
- staleAccessories.length = 0;
73
- }
74
- return { configureAccessory, removeStaleAccessories };
75
- }
76
- it('does not unregister stale accessories immediately during configureAccessory', () => {
77
- const { mockApi, unregisterCalls } = buildMocks();
78
- const { configureAccessory } = buildSimulator(mockApi);
79
- const legacyAccessory = { UUID: mockApi.hap.uuid.generate('PluginUpdate'), displayName: 'Homebridge Plugin Update' };
80
- configureAccessory(legacyAccessory);
81
- // Must NOT be called yet — bridge is not fully initialized until didFinishLaunching
82
- expect(unregisterCalls).toHaveLength(0);
83
- });
84
- it('unregisters a stale legacy v2 HAP accessory (PluginUpdate UUID) after didFinishLaunching', () => {
85
- const { mockApi, unregisterCalls } = buildMocks();
86
- const { configureAccessory, removeStaleAccessories } = buildSimulator(mockApi);
87
- const legacyAccessory = { UUID: mockApi.hap.uuid.generate('PluginUpdate'), displayName: 'Homebridge Plugin Update' };
88
- configureAccessory(legacyAccessory);
89
- removeStaleAccessories();
90
- expect(unregisterCalls).toHaveLength(1);
91
- expect(unregisterCalls[0].pluginName).toBe(PLUGIN_NAME);
92
- expect(unregisterCalls[0].platformName).toBe(PLATFORM_NAME);
93
- expect(unregisterCalls[0].accessories).toContain(legacyAccessory);
94
- });
95
- it('unregisters a stale v3 HAP update-sensor accessory (PluginUpdateCheck-UpdateSensor UUID) after didFinishLaunching', () => {
96
- const { mockApi, unregisterCalls } = buildMocks();
97
- const { configureAccessory, removeStaleAccessories } = buildSimulator(mockApi);
98
- const v3Accessory = { UUID: mockApi.hap.uuid.generate('PluginUpdateCheck-UpdateSensor'), displayName: 'PluginUpdate' };
99
- configureAccessory(v3Accessory);
100
- removeStaleAccessories();
101
- expect(unregisterCalls).toHaveLength(1);
102
- expect(unregisterCalls[0].accessories).toContain(v3Accessory);
103
- });
104
- it('unregisters multiple stale accessories in a single batch after didFinishLaunching', () => {
105
- const { mockApi, unregisterCalls } = buildMocks();
106
- const { configureAccessory, removeStaleAccessories } = buildSimulator(mockApi);
107
- const accessory1 = { UUID: 'uuid-1', displayName: 'Accessory 1' };
108
- const accessory2 = { UUID: 'uuid-2', displayName: 'Accessory 2' };
109
- configureAccessory(accessory1);
110
- configureAccessory(accessory2);
111
- removeStaleAccessories();
112
- // All stale accessories are batched into a single unregister call
113
- expect(unregisterCalls).toHaveLength(1);
114
- expect(unregisterCalls[0].accessories).toContain(accessory1);
115
- expect(unregisterCalls[0].accessories).toContain(accessory2);
116
- });
117
- it('does not call unregisterPlatformAccessories when there are no cached accessories', () => {
118
- const { mockApi, unregisterCalls } = buildMocks();
119
- const { removeStaleAccessories } = buildSimulator(mockApi);
120
- removeStaleAccessories();
121
- expect(unregisterCalls).toHaveLength(0);
122
- });
123
- });
124
- //# sourceMappingURL=Platform.Matter.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Platform.Matter.test.js","sourceRoot":"","sources":["../src/Platform.Matter.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=configMigration.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"configMigration.test.d.ts","sourceRoot":"","sources":["../src/configMigration.test.ts"],"names":[],"mappings":""}
@@ -1,119 +0,0 @@
1
- import * as fs from 'node:fs';
2
- import path from 'node:path';
3
- import { beforeEach, describe, expect, it, vi } from 'vitest';
4
- import { migrateLegacyPlatformAlias, migratePlatformAliasInPluginConfigs } from './configMigration.js';
5
- // Mock node:fs before any imports that use it — vitest hoists vi.mock automatically.
6
- vi.mock('node:fs', () => ({
7
- readFileSync: vi.fn(),
8
- writeFileSync: vi.fn(),
9
- }));
10
- describe('config migration', () => {
11
- it('should migrate legacy platform alias in plugin config entries', () => {
12
- const pluginConfigs = [
13
- { platform: 'PluginUpdate', name: 'Legacy Updater' },
14
- { platform: 'OtherPlugin', name: 'Other' },
15
- ];
16
- const updated = migratePlatformAliasInPluginConfigs(pluginConfigs);
17
- expect(updated).toBe(1);
18
- expect(pluginConfigs[0].platform).toBe('HomebridgeUpdater');
19
- expect(pluginConfigs[1].platform).toBe('OtherPlugin');
20
- });
21
- it('should keep entries unchanged when no legacy alias exists', () => {
22
- const pluginConfigs = [
23
- { platform: 'HomebridgeUpdater', name: 'Updater' },
24
- ];
25
- const updated = migratePlatformAliasInPluginConfigs(pluginConfigs);
26
- expect(updated).toBe(0);
27
- expect(pluginConfigs[0].platform).toBe('HomebridgeUpdater');
28
- });
29
- it('should return 0 for a non-array input', () => {
30
- expect(migratePlatformAliasInPluginConfigs(null)).toBe(0);
31
- expect(migratePlatformAliasInPluginConfigs(undefined)).toBe(0);
32
- });
33
- });
34
- describe('migrateLegacyPlatformAlias (direct file migration)', () => {
35
- const FAKE_STORAGE = path.join(path.sep, 'fake', 'homebridge');
36
- const FAKE_CONFIG_PATH = path.resolve(FAKE_STORAGE, 'config.json');
37
- const readFileSyncMock = vi.mocked(fs.readFileSync);
38
- const writeFileSyncMock = vi.mocked(fs.writeFileSync);
39
- function makeApi(storagePath) {
40
- return {
41
- user: { storagePath: () => storagePath },
42
- };
43
- }
44
- beforeEach(() => {
45
- vi.clearAllMocks();
46
- });
47
- it('should do nothing when storagePath is missing', async () => {
48
- await migrateLegacyPlatformAlias(makeApi(undefined));
49
- expect(readFileSyncMock).not.toHaveBeenCalled();
50
- expect(writeFileSyncMock).not.toHaveBeenCalled();
51
- });
52
- it('should migrate PluginUpdate → HomebridgeUpdater entries directly in config.json', async () => {
53
- const originalConfig = {
54
- bridge: { name: 'Homebridge', username: 'AA:BB:CC:DD:EE:FF', port: 51826 },
55
- platforms: [
56
- { platform: 'PluginUpdate', name: 'Plugin Update', checkPluginUpdates: true },
57
- { platform: 'OtherPlugin', name: 'Other' },
58
- ],
59
- };
60
- readFileSyncMock.mockReturnValue(JSON.stringify(originalConfig));
61
- writeFileSyncMock.mockImplementation(() => { });
62
- await migrateLegacyPlatformAlias(makeApi(FAKE_STORAGE));
63
- expect(writeFileSyncMock).toHaveBeenCalledTimes(1);
64
- const [writtenPath, writtenData] = writeFileSyncMock.mock.calls[0];
65
- expect(writtenPath).toBe(FAKE_CONFIG_PATH);
66
- const written = JSON.parse(writtenData);
67
- expect(written.platforms[0].platform).toBe('HomebridgeUpdater');
68
- expect(written.platforms[0].name).toBe('Plugin Update');
69
- expect(written.platforms[0].checkPluginUpdates).toBe(true);
70
- // Unrelated platform entries must remain untouched
71
- expect(written.platforms[1].platform).toBe('OtherPlugin');
72
- });
73
- it('should not write config.json when no legacy entries exist', async () => {
74
- const currentConfig = {
75
- bridge: { name: 'Homebridge', username: 'AA:BB:CC:DD:EE:FF', port: 51826 },
76
- platforms: [
77
- { platform: 'HomebridgeUpdater', name: 'Updater' },
78
- ],
79
- };
80
- readFileSyncMock.mockReturnValue(JSON.stringify(currentConfig));
81
- writeFileSyncMock.mockImplementation(() => { });
82
- await migrateLegacyPlatformAlias(makeApi(FAKE_STORAGE));
83
- expect(writeFileSyncMock).not.toHaveBeenCalled();
84
- });
85
- it('should not throw when config.json cannot be read', async () => {
86
- readFileSyncMock.mockImplementation(() => {
87
- throw new Error('ENOENT: no such file');
88
- });
89
- writeFileSyncMock.mockImplementation(() => { });
90
- await expect(migrateLegacyPlatformAlias(makeApi(FAKE_STORAGE))).resolves.toBeUndefined();
91
- expect(writeFileSyncMock).not.toHaveBeenCalled();
92
- });
93
- it('should preserve all config fields (_bridge, etc.) when migrating', async () => {
94
- const configWithBridge = {
95
- bridge: { name: 'Homebridge', username: 'AA:BB:CC:DD:EE:FF', port: 51826 },
96
- platforms: [
97
- {
98
- platform: 'PluginUpdate',
99
- name: 'Plugin Update',
100
- _bridge: { username: '11:22:33:44:55:66', port: 51828, name: 'Plugin Update Child Bridge' },
101
- checkPluginUpdates: true,
102
- autoUpdatePlugins: false,
103
- },
104
- ],
105
- };
106
- readFileSyncMock.mockReturnValue(JSON.stringify(configWithBridge));
107
- writeFileSyncMock.mockImplementation(() => { });
108
- await migrateLegacyPlatformAlias(makeApi(FAKE_STORAGE));
109
- expect(writeFileSyncMock).toHaveBeenCalledTimes(1);
110
- const written = JSON.parse(writeFileSyncMock.mock.calls[0][1]);
111
- const migratedPlatform = written.platforms[0];
112
- expect(migratedPlatform.platform).toBe('HomebridgeUpdater');
113
- // Child bridge config must be preserved intact
114
- expect(migratedPlatform._bridge).toEqual(configWithBridge.platforms[0]._bridge);
115
- expect(migratedPlatform.checkPluginUpdates).toBe(true);
116
- expect(migratedPlatform.autoUpdatePlugins).toBe(false);
117
- });
118
- });
119
- //# sourceMappingURL=configMigration.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"configMigration.test.js","sourceRoot":"","sources":["../src/configMigration.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=configTypes.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"configTypes.test.d.ts","sourceRoot":"","sources":["../src/configTypes.test.ts"],"names":[],"mappings":""}
@@ -1,108 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
- describe('pluginUpdatePlatformConfig', () => {
3
- it('should allow valid platform name and identifier', () => {
4
- const config = {
5
- name: 'Example Platform',
6
- platform: 'ExamplePlatform',
7
- };
8
- expect(config.name).toBe('Example Platform');
9
- expect(config.platform).toBe('ExamplePlatform');
10
- });
11
- it('should allow optional sensorType property', () => {
12
- const config = {
13
- name: 'Example Platform',
14
- platform: 'ExamplePlatform',
15
- sensorType: 'temperature',
16
- };
17
- expect(config.sensorType).toBe('temperature');
18
- });
19
- it('should allow optional initialCheckDelay property', () => {
20
- const config = {
21
- name: 'Example Platform',
22
- platform: 'ExamplePlatform',
23
- initialCheckDelay: 30,
24
- };
25
- expect(config.initialCheckDelay).toBe(30);
26
- });
27
- it('should allow all properties to be set', () => {
28
- const config = {
29
- name: 'Example Platform',
30
- platform: 'ExamplePlatform',
31
- sensorType: 'humidity',
32
- checkHomebridgeUpdates: true,
33
- checkHomebridgeUIUpdates: true,
34
- checkPluginUpdates: true,
35
- checkDockerUpdates: true,
36
- checkNpmUpdates: true,
37
- initialCheckDelay: 15,
38
- autoUpdateNpm: false,
39
- autoUpdateHomebridge: true,
40
- autoUpdateHomebridgeUI: false,
41
- autoUpdatePlugins: true,
42
- allowDirectNpmUpdates: false,
43
- };
44
- expect(config.platform).toBe('ExamplePlatform');
45
- expect(config.sensorType).toBe('humidity');
46
- expect(config.checkHomebridgeUpdates).toBe(true);
47
- expect(config.checkHomebridgeUIUpdates).toBe(true);
48
- expect(config.checkPluginUpdates).toBe(true);
49
- expect(config.checkDockerUpdates).toBe(true);
50
- expect(config.checkNpmUpdates).toBe(true);
51
- expect(config.initialCheckDelay).toBe(15);
52
- expect(config.autoUpdateNpm).toBe(false);
53
- expect(config.autoUpdateHomebridge).toBe(true);
54
- expect(config.autoUpdateHomebridgeUI).toBe(false);
55
- expect(config.autoUpdatePlugins).toBe(true);
56
- expect(config.allowDirectNpmUpdates).toBe(false);
57
- });
58
- it('should allow auto-update properties to be set independently', () => {
59
- const config = {
60
- name: 'Example Platform',
61
- platform: 'ExamplePlatform',
62
- autoUpdateHomebridge: true,
63
- autoUpdateHomebridgeUI: false,
64
- autoUpdatePlugins: true,
65
- autoUpdateNpm: false,
66
- };
67
- expect(config.name).toBe('Example Platform');
68
- expect(config.autoUpdateHomebridge).toBe(true);
69
- expect(config.autoUpdateHomebridgeUI).toBe(false);
70
- expect(config.autoUpdatePlugins).toBe(true);
71
- expect(config.autoUpdateNpm).toBe(false);
72
- });
73
- it('should allow npm update properties to be set independently', () => {
74
- const config = {
75
- name: 'Example Platform',
76
- platform: 'ExamplePlatform',
77
- checkNpmUpdates: true,
78
- autoUpdateNpm: true,
79
- };
80
- expect(config.checkNpmUpdates).toBe(true);
81
- expect(config.autoUpdateNpm).toBe(true);
82
- });
83
- it('should allow allowDirectNpmUpdates property to be set', () => {
84
- const config = {
85
- name: 'Example Platform',
86
- platform: 'ExamplePlatform',
87
- allowDirectNpmUpdates: true,
88
- };
89
- expect(config.allowDirectNpmUpdates).toBe(true);
90
- });
91
- it('should allow autoRestartAfterUpdates property to be set', () => {
92
- const config = {
93
- name: 'Example Platform',
94
- platform: 'ExamplePlatform',
95
- autoRestartAfterUpdates: true,
96
- };
97
- expect(config.autoRestartAfterUpdates).toBe(true);
98
- });
99
- it('should allow enableMatter property to be set', () => {
100
- const config = {
101
- name: 'Example Platform',
102
- platform: 'ExamplePlatform',
103
- enableMatter: false,
104
- };
105
- expect(config.enableMatter).toBe(false);
106
- });
107
- });
108
- //# sourceMappingURL=configTypes.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"configTypes.test.js","sourceRoot":"","sources":["../src/configTypes.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=ignore-plugins.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ignore-plugins.test.d.ts","sourceRoot":"","sources":["../src/ignore-plugins.test.ts"],"names":[],"mappings":""}