@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.
- package/README.md +9 -3
- package/dist/homebridge-client.d.ts.map +1 -1
- package/dist/homebridge-client.js +40 -35
- package/dist/homebridge-client.js.map +1 -1
- package/dist/index.js +10 -10
- package/dist/tools/accessories.d.ts +2 -2
- package/dist/tools/accessories.js +23 -23
- package/dist/tools/config.d.ts +2 -2
- package/dist/tools/config.js +9 -9
- package/dist/tools/plugins.d.ts +2 -2
- package/dist/tools/plugins.js +20 -20
- package/dist/tools/server.d.ts +2 -2
- package/dist/tools/server.js +25 -25
- package/dist/tools/system.d.ts +2 -2
- package/dist/tools/system.js +3 -3
- package/dist/types.d.ts +2 -2
- package/package.json +17 -3
- package/dist/__tests__/homebridge-client.test.d.ts +0 -2
- package/dist/__tests__/homebridge-client.test.d.ts.map +0 -1
- package/dist/__tests__/homebridge-client.test.js +0 -262
- package/dist/__tests__/homebridge-client.test.js.map +0 -1
- package/dist/__tests__/tools/accessories.test.d.ts +0 -2
- package/dist/__tests__/tools/accessories.test.d.ts.map +0 -1
- package/dist/__tests__/tools/accessories.test.js +0 -252
- package/dist/__tests__/tools/accessories.test.js.map +0 -1
- package/dist/__tests__/tools/config.test.d.ts +0 -2
- package/dist/__tests__/tools/config.test.d.ts.map +0 -1
- package/dist/__tests__/tools/config.test.js +0 -85
- package/dist/__tests__/tools/config.test.js.map +0 -1
- package/dist/__tests__/tools/plugins.test.d.ts +0 -2
- package/dist/__tests__/tools/plugins.test.d.ts.map +0 -1
- package/dist/__tests__/tools/plugins.test.js +0 -119
- package/dist/__tests__/tools/plugins.test.js.map +0 -1
- package/dist/__tests__/tools/server.test.d.ts +0 -2
- package/dist/__tests__/tools/server.test.d.ts.map +0 -1
- package/dist/__tests__/tools/server.test.js +0 -126
- package/dist/__tests__/tools/server.test.js.map +0 -1
- package/dist/__tests__/tools/system.test.d.ts +0 -2
- package/dist/__tests__/tools/system.test.d.ts.map +0 -1
- package/dist/__tests__/tools/system.test.js +0 -62
- package/dist/__tests__/tools/system.test.js.map +0 -1
package/dist/tools/server.js
CHANGED
|
@@ -1,113 +1,113 @@
|
|
|
1
|
-
import { z } from
|
|
1
|
+
import { z } from 'zod';
|
|
2
2
|
export function register(server, client) {
|
|
3
|
-
server.tool(
|
|
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:
|
|
7
|
+
content: [{ type: 'text', text: JSON.stringify(status, null, 2) }],
|
|
8
8
|
};
|
|
9
9
|
}
|
|
10
10
|
catch (error) {
|
|
11
11
|
return {
|
|
12
|
-
content: [{ type:
|
|
12
|
+
content: [{ type: 'text', text: `Error getting Homebridge status: ${error}` }],
|
|
13
13
|
isError: true,
|
|
14
14
|
};
|
|
15
15
|
}
|
|
16
16
|
});
|
|
17
|
-
server.tool(
|
|
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:
|
|
21
|
+
content: [{ type: 'text', text: JSON.stringify(info, null, 2) }],
|
|
22
22
|
};
|
|
23
23
|
}
|
|
24
24
|
catch (error) {
|
|
25
25
|
return {
|
|
26
|
-
content: [{ type:
|
|
26
|
+
content: [{ type: 'text', text: `Error getting server info: ${error}` }],
|
|
27
27
|
isError: true,
|
|
28
28
|
};
|
|
29
29
|
}
|
|
30
30
|
});
|
|
31
|
-
server.tool(
|
|
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:
|
|
37
|
+
type: 'text',
|
|
38
38
|
text: result
|
|
39
39
|
? JSON.stringify(result, null, 2)
|
|
40
|
-
:
|
|
40
|
+
: 'Homebridge restart initiated successfully.',
|
|
41
41
|
},
|
|
42
42
|
],
|
|
43
43
|
};
|
|
44
44
|
}
|
|
45
45
|
catch (error) {
|
|
46
46
|
return {
|
|
47
|
-
content: [{ type:
|
|
47
|
+
content: [{ type: 'text', text: `Error restarting Homebridge: ${error}` }],
|
|
48
48
|
isError: true,
|
|
49
49
|
};
|
|
50
50
|
}
|
|
51
51
|
});
|
|
52
|
-
server.tool(
|
|
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:
|
|
56
|
+
content: [{ type: 'text', text: JSON.stringify(pairing, null, 2) }],
|
|
57
57
|
};
|
|
58
58
|
}
|
|
59
59
|
catch (error) {
|
|
60
60
|
return {
|
|
61
|
-
content: [{ type:
|
|
61
|
+
content: [{ type: 'text', text: `Error getting pairing info: ${error}` }],
|
|
62
62
|
isError: true,
|
|
63
63
|
};
|
|
64
64
|
}
|
|
65
65
|
});
|
|
66
|
-
server.tool(
|
|
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:
|
|
70
|
+
content: [{ type: 'text', text: JSON.stringify(cached, null, 2) }],
|
|
71
71
|
};
|
|
72
72
|
}
|
|
73
73
|
catch (error) {
|
|
74
74
|
return {
|
|
75
|
-
content: [{ type:
|
|
75
|
+
content: [{ type: 'text', text: `Error getting cached accessories: ${error}` }],
|
|
76
76
|
isError: true,
|
|
77
77
|
};
|
|
78
78
|
}
|
|
79
79
|
});
|
|
80
|
-
server.tool(
|
|
81
|
-
uuid: z.string().describe(
|
|
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:
|
|
86
|
+
content: [{ type: 'text', text: `Cached accessory ${uuid} removed successfully.` }],
|
|
87
87
|
};
|
|
88
88
|
}
|
|
89
89
|
catch (error) {
|
|
90
90
|
return {
|
|
91
|
-
content: [{ type:
|
|
91
|
+
content: [{ type: 'text', text: `Error removing cached accessory: ${error}` }],
|
|
92
92
|
isError: true,
|
|
93
93
|
};
|
|
94
94
|
}
|
|
95
95
|
});
|
|
96
|
-
server.tool(
|
|
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:
|
|
103
|
-
text:
|
|
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:
|
|
110
|
+
content: [{ type: 'text', text: `Error resetting cached accessories: ${error}` }],
|
|
111
111
|
isError: true,
|
|
112
112
|
};
|
|
113
113
|
}
|
package/dist/tools/system.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { McpServer } from
|
|
2
|
-
import type { HomebridgeClient } from
|
|
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
|
package/dist/tools/system.js
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
export function register(server, client) {
|
|
2
|
-
server.tool(
|
|
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:
|
|
6
|
+
content: [{ type: 'text', text: JSON.stringify(info, null, 2) }],
|
|
7
7
|
};
|
|
8
8
|
}
|
|
9
9
|
catch (error) {
|
|
10
10
|
return {
|
|
11
|
-
content: [{ type:
|
|
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
|
|
2
|
-
import type { HomebridgeClient } from
|
|
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.
|
|
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
|
-
"@
|
|
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.
|
|
52
|
+
"typescript": "^5.9.3",
|
|
53
|
+
"typescript-eslint": "^8.53.1",
|
|
40
54
|
"vitest": "^4.0.18"
|
|
41
55
|
},
|
|
42
56
|
"engines": {
|
|
@@ -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 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"accessories.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/tools/accessories.test.ts"],"names":[],"mappings":""}
|