@mp-consulting/homebridge-mcp-server 1.0.0 → 1.0.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 (41) hide show
  1. package/README.md +9 -3
  2. package/dist/homebridge-client.d.ts.map +1 -1
  3. package/dist/homebridge-client.js +40 -35
  4. package/dist/homebridge-client.js.map +1 -1
  5. package/dist/index.js +10 -10
  6. package/dist/tools/accessories.d.ts +2 -2
  7. package/dist/tools/accessories.js +23 -23
  8. package/dist/tools/config.d.ts +2 -2
  9. package/dist/tools/config.js +9 -9
  10. package/dist/tools/plugins.d.ts +2 -2
  11. package/dist/tools/plugins.js +20 -20
  12. package/dist/tools/server.d.ts +2 -2
  13. package/dist/tools/server.js +25 -25
  14. package/dist/tools/system.d.ts +2 -2
  15. package/dist/tools/system.js +3 -3
  16. package/dist/types.d.ts +2 -2
  17. package/package.json +17 -3
  18. package/dist/__tests__/homebridge-client.test.d.ts +0 -2
  19. package/dist/__tests__/homebridge-client.test.d.ts.map +0 -1
  20. package/dist/__tests__/homebridge-client.test.js +0 -262
  21. package/dist/__tests__/homebridge-client.test.js.map +0 -1
  22. package/dist/__tests__/tools/accessories.test.d.ts +0 -2
  23. package/dist/__tests__/tools/accessories.test.d.ts.map +0 -1
  24. package/dist/__tests__/tools/accessories.test.js +0 -252
  25. package/dist/__tests__/tools/accessories.test.js.map +0 -1
  26. package/dist/__tests__/tools/config.test.d.ts +0 -2
  27. package/dist/__tests__/tools/config.test.d.ts.map +0 -1
  28. package/dist/__tests__/tools/config.test.js +0 -85
  29. package/dist/__tests__/tools/config.test.js.map +0 -1
  30. package/dist/__tests__/tools/plugins.test.d.ts +0 -2
  31. package/dist/__tests__/tools/plugins.test.d.ts.map +0 -1
  32. package/dist/__tests__/tools/plugins.test.js +0 -119
  33. package/dist/__tests__/tools/plugins.test.js.map +0 -1
  34. package/dist/__tests__/tools/server.test.d.ts +0 -2
  35. package/dist/__tests__/tools/server.test.d.ts.map +0 -1
  36. package/dist/__tests__/tools/server.test.js +0 -126
  37. package/dist/__tests__/tools/server.test.js.map +0 -1
  38. package/dist/__tests__/tools/system.test.d.ts +0 -2
  39. package/dist/__tests__/tools/system.test.d.ts.map +0 -1
  40. package/dist/__tests__/tools/system.test.js +0 -62
  41. package/dist/__tests__/tools/system.test.js.map +0 -1
@@ -1,113 +1,113 @@
1
- import { z } from "zod";
1
+ import { z } from 'zod';
2
2
  export function register(server, client) {
3
- server.tool("get_homebridge_status", "Check if Homebridge is running and get its current status (up/down, version, plugins status).", {}, async () => {
3
+ server.tool('get_homebridge_status', 'Check if Homebridge is running and get its current status (up/down, version, plugins status).', {}, async () => {
4
4
  try {
5
5
  const status = await client.getHomebridgeStatus();
6
6
  return {
7
- content: [{ type: "text", text: JSON.stringify(status, null, 2) }],
7
+ content: [{ type: 'text', text: JSON.stringify(status, null, 2) }],
8
8
  };
9
9
  }
10
10
  catch (error) {
11
11
  return {
12
- content: [{ type: "text", text: `Error getting Homebridge status: ${error}` }],
12
+ content: [{ type: 'text', text: `Error getting Homebridge status: ${error}` }],
13
13
  isError: true,
14
14
  };
15
15
  }
16
16
  });
17
- server.tool("get_server_status", "Get Homebridge server information including version, Node.js version, uptime, OS details, and Homebridge instance ID.", {}, async () => {
17
+ server.tool('get_server_status', 'Get Homebridge server information including version, Node.js version, uptime, OS details, and Homebridge instance ID.', {}, async () => {
18
18
  try {
19
19
  const info = await client.getServerInformation();
20
20
  return {
21
- content: [{ type: "text", text: JSON.stringify(info, null, 2) }],
21
+ content: [{ type: 'text', text: JSON.stringify(info, null, 2) }],
22
22
  };
23
23
  }
24
24
  catch (error) {
25
25
  return {
26
- content: [{ type: "text", text: `Error getting server info: ${error}` }],
26
+ content: [{ type: 'text', text: `Error getting server info: ${error}` }],
27
27
  isError: true,
28
28
  };
29
29
  }
30
30
  });
31
- server.tool("restart_homebridge", "Restart the Homebridge service. This will temporarily make all accessories unavailable.", {}, async () => {
31
+ server.tool('restart_homebridge', 'Restart the Homebridge service. This will temporarily make all accessories unavailable.', {}, async () => {
32
32
  try {
33
33
  const result = await client.restartServer();
34
34
  return {
35
35
  content: [
36
36
  {
37
- type: "text",
37
+ type: 'text',
38
38
  text: result
39
39
  ? JSON.stringify(result, null, 2)
40
- : "Homebridge restart initiated successfully.",
40
+ : 'Homebridge restart initiated successfully.',
41
41
  },
42
42
  ],
43
43
  };
44
44
  }
45
45
  catch (error) {
46
46
  return {
47
- content: [{ type: "text", text: `Error restarting Homebridge: ${error}` }],
47
+ content: [{ type: 'text', text: `Error restarting Homebridge: ${error}` }],
48
48
  isError: true,
49
49
  };
50
50
  }
51
51
  });
52
- server.tool("get_pairing_info", "Get the HomeKit pairing information (setup code, QR code URL) for this Homebridge instance.", {}, async () => {
52
+ server.tool('get_pairing_info', 'Get the HomeKit pairing information (setup code, QR code URL) for this Homebridge instance.', {}, async () => {
53
53
  try {
54
54
  const pairing = await client.getPairingInfo();
55
55
  return {
56
- content: [{ type: "text", text: JSON.stringify(pairing, null, 2) }],
56
+ content: [{ type: 'text', text: JSON.stringify(pairing, null, 2) }],
57
57
  };
58
58
  }
59
59
  catch (error) {
60
60
  return {
61
- content: [{ type: "text", text: `Error getting pairing info: ${error}` }],
61
+ content: [{ type: 'text', text: `Error getting pairing info: ${error}` }],
62
62
  isError: true,
63
63
  };
64
64
  }
65
65
  });
66
- server.tool("get_cached_accessories", "List all cached accessories stored by Homebridge. These persist across restarts.", {}, async () => {
66
+ server.tool('get_cached_accessories', 'List all cached accessories stored by Homebridge. These persist across restarts.', {}, async () => {
67
67
  try {
68
68
  const cached = await client.getCachedAccessories();
69
69
  return {
70
- content: [{ type: "text", text: JSON.stringify(cached, null, 2) }],
70
+ content: [{ type: 'text', text: JSON.stringify(cached, null, 2) }],
71
71
  };
72
72
  }
73
73
  catch (error) {
74
74
  return {
75
- content: [{ type: "text", text: `Error getting cached accessories: ${error}` }],
75
+ content: [{ type: 'text', text: `Error getting cached accessories: ${error}` }],
76
76
  isError: true,
77
77
  };
78
78
  }
79
79
  });
80
- server.tool("remove_cached_accessory", "Remove a specific cached accessory by its UUID. Useful for cleaning up stale accessories.", {
81
- uuid: z.string().describe("The UUID of the cached accessory to remove"),
80
+ server.tool('remove_cached_accessory', 'Remove a specific cached accessory by its UUID. Useful for cleaning up stale accessories.', {
81
+ uuid: z.string().describe('The UUID of the cached accessory to remove'),
82
82
  }, async ({ uuid }) => {
83
83
  try {
84
84
  await client.removeCachedAccessory(uuid);
85
85
  return {
86
- content: [{ type: "text", text: `Cached accessory ${uuid} removed successfully.` }],
86
+ content: [{ type: 'text', text: `Cached accessory ${uuid} removed successfully.` }],
87
87
  };
88
88
  }
89
89
  catch (error) {
90
90
  return {
91
- content: [{ type: "text", text: `Error removing cached accessory: ${error}` }],
91
+ content: [{ type: 'text', text: `Error removing cached accessory: ${error}` }],
92
92
  isError: true,
93
93
  };
94
94
  }
95
95
  });
96
- server.tool("reset_cached_accessories", "Reset ALL cached accessories. WARNING: This removes all cached accessories and requires a Homebridge restart.", {}, async () => {
96
+ server.tool('reset_cached_accessories', 'Reset ALL cached accessories. WARNING: This removes all cached accessories and requires a Homebridge restart.', {}, async () => {
97
97
  try {
98
98
  await client.resetCachedAccessories();
99
99
  return {
100
100
  content: [
101
101
  {
102
- type: "text",
103
- text: "All cached accessories have been reset. A Homebridge restart may be required.",
102
+ type: 'text',
103
+ text: 'All cached accessories have been reset. A Homebridge restart may be required.',
104
104
  },
105
105
  ],
106
106
  };
107
107
  }
108
108
  catch (error) {
109
109
  return {
110
- content: [{ type: "text", text: `Error resetting cached accessories: ${error}` }],
110
+ content: [{ type: 'text', text: `Error resetting cached accessories: ${error}` }],
111
111
  isError: true,
112
112
  };
113
113
  }
@@ -1,4 +1,4 @@
1
- import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
- import type { HomebridgeClient } from "../homebridge-client.js";
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { HomebridgeClient } from '../homebridge-client.js';
3
3
  export declare function register(server: McpServer, client: HomebridgeClient): void;
4
4
  //# sourceMappingURL=system.d.ts.map
@@ -1,14 +1,14 @@
1
1
  export function register(server, client) {
2
- server.tool("get_system_info", "Get system information for the machine running Homebridge (CPU, memory, OS, network interfaces, uptime).", {}, async () => {
2
+ server.tool('get_system_info', 'Get system information for the machine running Homebridge (CPU, memory, OS, network interfaces, uptime).', {}, async () => {
3
3
  try {
4
4
  const info = await client.getSystemInfo();
5
5
  return {
6
- content: [{ type: "text", text: JSON.stringify(info, null, 2) }],
6
+ content: [{ type: 'text', text: JSON.stringify(info, null, 2) }],
7
7
  };
8
8
  }
9
9
  catch (error) {
10
10
  return {
11
- content: [{ type: "text", text: `Error getting system info: ${error}` }],
11
+ content: [{ type: 'text', text: `Error getting system info: ${error}` }],
12
12
  isError: true,
13
13
  };
14
14
  }
package/dist/types.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
- import type { HomebridgeClient } from "./homebridge-client.js";
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { HomebridgeClient } from './homebridge-client.js';
3
3
  /**
4
4
  * Signature for tool registration functions.
5
5
  * Each tools/*.ts file exports a `register` function matching this type.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mp-consulting/homebridge-mcp-server",
3
- "version": "1.0.0",
3
+ "version": "1.0.2",
4
4
  "description": "MCP (Model Context Protocol) server for Homebridge — control smart home accessories, manage plugins, and monitor your Homebridge server from AI assistants.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -12,6 +12,8 @@
12
12
  "dev": "tsx src/index.ts",
13
13
  "test": "vitest run",
14
14
  "test:watch": "vitest",
15
+ "test:coverage": "vitest run --coverage",
16
+ "lint": "eslint . --max-warnings=0",
15
17
  "prepublishOnly": "npm run build"
16
18
  },
17
19
  "keywords": [
@@ -26,6 +28,14 @@
26
28
  ],
27
29
  "author": "MP Consulting",
28
30
  "license": "MIT",
31
+ "repository": {
32
+ "type": "git",
33
+ "url": "https://github.com/mp-consulting/homebridge-mcp-server"
34
+ },
35
+ "funding": {
36
+ "type": "paypal",
37
+ "url": "https://paypal.me/mickaelpalma"
38
+ },
29
39
  "files": [
30
40
  "dist"
31
41
  ],
@@ -34,9 +44,13 @@
34
44
  "zod": "^3.24.2"
35
45
  },
36
46
  "devDependencies": {
37
- "@types/node": "^22.13.5",
47
+ "@eslint/js": "^9.39.2",
48
+ "@types/node": "^24.0.0",
49
+ "@vitest/coverage-v8": "^4.0.18",
50
+ "eslint": "^9.39.2",
38
51
  "tsx": "^4.19.3",
39
- "typescript": "^5.7.3",
52
+ "typescript": "^5.9.3",
53
+ "typescript-eslint": "^8.53.1",
40
54
  "vitest": "^4.0.18"
41
55
  },
42
56
  "engines": {
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=homebridge-client.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"homebridge-client.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/homebridge-client.test.ts"],"names":[],"mappings":""}
@@ -1,262 +0,0 @@
1
- import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
2
- // We need to set env vars before importing the client
3
- const ENV = {
4
- HOMEBRIDGE_URL: "http://localhost:8581",
5
- HOMEBRIDGE_USERNAME: "admin",
6
- HOMEBRIDGE_PASSWORD: "admin",
7
- };
8
- function mockFetch() {
9
- const fn = vi.fn();
10
- vi.stubGlobal("fetch", fn);
11
- return fn;
12
- }
13
- function jsonResponse(body, status = 200, headers) {
14
- return new Response(JSON.stringify(body), {
15
- status,
16
- headers: { "content-type": "application/json", ...headers },
17
- });
18
- }
19
- function textResponse(body, status = 200) {
20
- return new Response(body, { status, headers: { "content-type": "text/plain" } });
21
- }
22
- describe("HomebridgeClient", () => {
23
- let fetchMock;
24
- beforeEach(() => {
25
- Object.assign(process.env, ENV);
26
- fetchMock = mockFetch();
27
- });
28
- afterEach(() => {
29
- vi.restoreAllMocks();
30
- vi.unstubAllEnvs();
31
- vi.resetModules();
32
- });
33
- async function createClient() {
34
- // Dynamic import so each test gets a fresh module with current env
35
- const mod = await import("../homebridge-client.js");
36
- return new mod.HomebridgeClient();
37
- }
38
- // Helper: set up fetch to handle login + one API call
39
- function setupAuthAndApi(apiResponse) {
40
- fetchMock
41
- .mockResolvedValueOnce(jsonResponse({ access_token: "tok123" })) // login
42
- .mockResolvedValueOnce(apiResponse);
43
- }
44
- // ── Constructor ───────────────────────────────────────────────
45
- describe("constructor", () => {
46
- it("throws when HOMEBRIDGE_URL is missing", async () => {
47
- delete process.env.HOMEBRIDGE_URL;
48
- await expect(createClient()).rejects.toThrow("HOMEBRIDGE_URL");
49
- });
50
- it("throws when HOMEBRIDGE_USERNAME is missing", async () => {
51
- delete process.env.HOMEBRIDGE_USERNAME;
52
- await expect(createClient()).rejects.toThrow("HOMEBRIDGE_USERNAME");
53
- });
54
- it("throws when HOMEBRIDGE_PASSWORD is missing", async () => {
55
- delete process.env.HOMEBRIDGE_PASSWORD;
56
- await expect(createClient()).rejects.toThrow("HOMEBRIDGE_PASSWORD");
57
- });
58
- it("strips trailing slashes from URL", async () => {
59
- process.env.HOMEBRIDGE_URL = "http://localhost:8581///";
60
- const client = await createClient();
61
- setupAuthAndApi(jsonResponse([]));
62
- await client.getAccessories();
63
- expect(fetchMock).toHaveBeenCalledWith("http://localhost:8581/api/auth/login", expect.anything());
64
- });
65
- });
66
- // ── Authentication ────────────────────────────────────────────
67
- describe("authentication", () => {
68
- it("authenticates on first request", async () => {
69
- const client = await createClient();
70
- setupAuthAndApi(jsonResponse([{ id: 1 }]));
71
- const result = await client.getAccessories();
72
- expect(fetchMock).toHaveBeenCalledTimes(2);
73
- // First call: login
74
- expect(fetchMock.mock.calls[0][0]).toBe("http://localhost:8581/api/auth/login");
75
- expect(fetchMock.mock.calls[0][1]).toMatchObject({
76
- method: "POST",
77
- body: JSON.stringify({ username: "admin", password: "admin" }),
78
- });
79
- expect(result).toEqual([{ id: 1 }]);
80
- });
81
- it("throws on failed authentication", async () => {
82
- const client = await createClient();
83
- fetchMock.mockResolvedValueOnce(textResponse("Unauthorized", 401));
84
- await expect(client.getAccessories()).rejects.toThrow("Authentication failed (401)");
85
- });
86
- it("reuses token for subsequent requests", async () => {
87
- const client = await createClient();
88
- // First request: login + api
89
- setupAuthAndApi(jsonResponse({ status: "ok" }));
90
- await client.getHomebridgeStatus();
91
- // Second request: only api (no login)
92
- fetchMock.mockResolvedValueOnce(jsonResponse({ status: "ok" }));
93
- await client.getHomebridgeStatus();
94
- // 3 total calls: login + api + api
95
- expect(fetchMock).toHaveBeenCalledTimes(3);
96
- });
97
- });
98
- // ── Token refresh / retry on 401 ─────────────────────────────
99
- describe("401 retry logic", () => {
100
- it("refreshes token on 401 and retries", async () => {
101
- const client = await createClient();
102
- // Initial auth
103
- fetchMock.mockResolvedValueOnce(jsonResponse({ access_token: "tok1" }));
104
- // API returns 401
105
- fetchMock.mockResolvedValueOnce(textResponse("Unauthorized", 401));
106
- // Refresh succeeds
107
- fetchMock.mockResolvedValueOnce(jsonResponse({ access_token: "tok2" }));
108
- // Retry succeeds
109
- fetchMock.mockResolvedValueOnce(jsonResponse({ up: true }));
110
- const result = await client.getHomebridgeStatus();
111
- expect(result).toEqual({ up: true });
112
- expect(fetchMock).toHaveBeenCalledTimes(4);
113
- // Third call should be refresh
114
- expect(fetchMock.mock.calls[2][0]).toBe("http://localhost:8581/api/auth/refresh");
115
- });
116
- it("re-authenticates when refresh fails", async () => {
117
- const client = await createClient();
118
- // Initial auth
119
- fetchMock.mockResolvedValueOnce(jsonResponse({ access_token: "tok1" }));
120
- // API returns 401
121
- fetchMock.mockResolvedValueOnce(textResponse("Unauthorized", 401));
122
- // Refresh fails
123
- fetchMock.mockResolvedValueOnce(textResponse("Forbidden", 403));
124
- // Re-authenticate
125
- fetchMock.mockResolvedValueOnce(jsonResponse({ access_token: "tok3" }));
126
- // Retry succeeds
127
- fetchMock.mockResolvedValueOnce(jsonResponse({ up: true }));
128
- const result = await client.getHomebridgeStatus();
129
- expect(result).toEqual({ up: true });
130
- });
131
- });
132
- // ── API methods ───────────────────────────────────────────────
133
- describe("API methods", () => {
134
- async function clientWithAuth() {
135
- const client = await createClient();
136
- // Pre-authenticate
137
- fetchMock.mockResolvedValueOnce(jsonResponse({ access_token: "tok" }));
138
- return client;
139
- }
140
- it("getAccessories → GET /api/accessories", async () => {
141
- const client = await clientWithAuth();
142
- fetchMock.mockResolvedValueOnce(jsonResponse([{ uniqueId: "a1" }]));
143
- const result = await client.getAccessories();
144
- expect(result).toEqual([{ uniqueId: "a1" }]);
145
- expect(fetchMock.mock.calls[1][0]).toBe("http://localhost:8581/api/accessories");
146
- });
147
- it("getAccessoryLayout → GET /api/accessories/layout", async () => {
148
- const client = await clientWithAuth();
149
- fetchMock.mockResolvedValueOnce(jsonResponse([{ name: "Living Room" }]));
150
- const result = await client.getAccessoryLayout();
151
- expect(result).toEqual([{ name: "Living Room" }]);
152
- });
153
- it("setAccessoryCharacteristic → PUT /api/accessories/:id", async () => {
154
- const client = await clientWithAuth();
155
- fetchMock.mockResolvedValueOnce(jsonResponse({ ok: true }));
156
- await client.setAccessoryCharacteristic("acc1", "On", true);
157
- const [url, opts] = fetchMock.mock.calls[1];
158
- expect(url).toBe("http://localhost:8581/api/accessories/acc1");
159
- expect(opts?.method).toBe("PUT");
160
- expect(JSON.parse(opts?.body)).toEqual({ characteristicType: "On", value: true });
161
- });
162
- it("getConfig → GET /api/config-editor", async () => {
163
- const client = await clientWithAuth();
164
- fetchMock.mockResolvedValueOnce(jsonResponse({ bridge: {} }));
165
- const result = await client.getConfig();
166
- expect(result).toEqual({ bridge: {} });
167
- });
168
- it("updateConfig → POST /api/config-editor", async () => {
169
- const client = await clientWithAuth();
170
- fetchMock.mockResolvedValueOnce(jsonResponse({ ok: true }));
171
- await client.updateConfig({ bridge: { name: "Test" } });
172
- const [, opts] = fetchMock.mock.calls[1];
173
- expect(opts?.method).toBe("POST");
174
- });
175
- it("getPlugins → GET /api/plugins", async () => {
176
- const client = await clientWithAuth();
177
- fetchMock.mockResolvedValueOnce(jsonResponse([{ name: "homebridge-hue" }]));
178
- const result = await client.getPlugins();
179
- expect(result).toEqual([{ name: "homebridge-hue" }]);
180
- });
181
- it("searchPlugins → GET /api/plugins/search/:query", async () => {
182
- const client = await clientWithAuth();
183
- fetchMock.mockResolvedValueOnce(jsonResponse([]));
184
- await client.searchPlugins("camera");
185
- expect(fetchMock.mock.calls[1][0]).toBe("http://localhost:8581/api/plugins/search/camera");
186
- });
187
- it("lookupPlugin → GET /api/plugins/lookup/:name", async () => {
188
- const client = await clientWithAuth();
189
- fetchMock.mockResolvedValueOnce(jsonResponse({ name: "homebridge-hue" }));
190
- await client.lookupPlugin("homebridge-hue");
191
- expect(fetchMock.mock.calls[1][0]).toBe("http://localhost:8581/api/plugins/lookup/homebridge-hue");
192
- });
193
- it("getPluginVersions → GET /api/plugins/lookup/:name/versions", async () => {
194
- const client = await clientWithAuth();
195
- fetchMock.mockResolvedValueOnce(jsonResponse({ tags: {} }));
196
- await client.getPluginVersions("homebridge-hue");
197
- expect(fetchMock.mock.calls[1][0]).toContain("/versions");
198
- });
199
- it("getPluginConfigSchema → GET /api/plugins/config-schema/:name", async () => {
200
- const client = await clientWithAuth();
201
- fetchMock.mockResolvedValueOnce(jsonResponse({ schema: {} }));
202
- await client.getPluginConfigSchema("homebridge-hue");
203
- expect(fetchMock.mock.calls[1][0]).toContain("/config-schema/homebridge-hue");
204
- });
205
- it("getPluginChangelog → GET /api/plugins/changelog/:name", async () => {
206
- const client = await clientWithAuth();
207
- fetchMock.mockResolvedValueOnce(textResponse("# Changelog"));
208
- const result = await client.getPluginChangelog("homebridge-hue");
209
- expect(result).toBe("# Changelog");
210
- });
211
- it("restartServer → PUT /api/server/restart", async () => {
212
- const client = await clientWithAuth();
213
- fetchMock.mockResolvedValueOnce(jsonResponse({ ok: true }));
214
- await client.restartServer();
215
- expect(fetchMock.mock.calls[1][1]?.method).toBe("PUT");
216
- });
217
- it("getPairingInfo → GET /api/server/pairing", async () => {
218
- const client = await clientWithAuth();
219
- fetchMock.mockResolvedValueOnce(jsonResponse({ setupCode: "123-45-678" }));
220
- const result = await client.getPairingInfo();
221
- expect(result).toEqual({ setupCode: "123-45-678" });
222
- });
223
- it("getCachedAccessories → GET /api/server/cached-accessories", async () => {
224
- const client = await clientWithAuth();
225
- fetchMock.mockResolvedValueOnce(jsonResponse([]));
226
- const result = await client.getCachedAccessories();
227
- expect(result).toEqual([]);
228
- });
229
- it("removeCachedAccessory → DELETE /api/server/cached-accessories/:uuid", async () => {
230
- const client = await clientWithAuth();
231
- fetchMock.mockResolvedValueOnce(jsonResponse({ ok: true }));
232
- await client.removeCachedAccessory("uuid-123");
233
- const [url, opts] = fetchMock.mock.calls[1];
234
- expect(url).toContain("/cached-accessories/uuid-123");
235
- expect(opts?.method).toBe("DELETE");
236
- });
237
- it("resetCachedAccessories → PUT /api/server/reset-cached-accessories", async () => {
238
- const client = await clientWithAuth();
239
- fetchMock.mockResolvedValueOnce(jsonResponse({ ok: true }));
240
- await client.resetCachedAccessories();
241
- expect(fetchMock.mock.calls[1][0]).toContain("/reset-cached-accessories");
242
- });
243
- it("getSystemInfo → GET /api/platform-tools/system-information", async () => {
244
- const client = await clientWithAuth();
245
- fetchMock.mockResolvedValueOnce(jsonResponse({ cpu: {} }));
246
- const result = await client.getSystemInfo();
247
- expect(result).toEqual({ cpu: {} });
248
- });
249
- it("throws on non-ok API response", async () => {
250
- const client = await clientWithAuth();
251
- fetchMock.mockResolvedValueOnce(textResponse("Not Found", 404));
252
- await expect(client.getAccessories()).rejects.toThrow("Homebridge API error 404");
253
- });
254
- it("URL-encodes special characters in path params", async () => {
255
- const client = await clientWithAuth();
256
- fetchMock.mockResolvedValueOnce(jsonResponse({}));
257
- await client.lookupPlugin("@scope/plugin");
258
- expect(fetchMock.mock.calls[1][0]).toBe("http://localhost:8581/api/plugins/lookup/%40scope%2Fplugin");
259
- });
260
- });
261
- });
262
- //# sourceMappingURL=homebridge-client.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"homebridge-client.test.js","sourceRoot":"","sources":["../../src/__tests__/homebridge-client.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=accessories.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"accessories.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/tools/accessories.test.ts"],"names":[],"mappings":""}