@mp-consulting/homebridge-mcp-server 1.0.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.
- package/README.md +142 -0
- package/dist/__tests__/homebridge-client.test.d.ts +2 -0
- package/dist/__tests__/homebridge-client.test.d.ts.map +1 -0
- package/dist/__tests__/homebridge-client.test.js +262 -0
- package/dist/__tests__/homebridge-client.test.js.map +1 -0
- package/dist/__tests__/tools/accessories.test.d.ts +2 -0
- package/dist/__tests__/tools/accessories.test.d.ts.map +1 -0
- package/dist/__tests__/tools/accessories.test.js +252 -0
- package/dist/__tests__/tools/accessories.test.js.map +1 -0
- package/dist/__tests__/tools/config.test.d.ts +2 -0
- package/dist/__tests__/tools/config.test.d.ts.map +1 -0
- package/dist/__tests__/tools/config.test.js +85 -0
- package/dist/__tests__/tools/config.test.js.map +1 -0
- package/dist/__tests__/tools/plugins.test.d.ts +2 -0
- package/dist/__tests__/tools/plugins.test.d.ts.map +1 -0
- package/dist/__tests__/tools/plugins.test.js +119 -0
- package/dist/__tests__/tools/plugins.test.js.map +1 -0
- package/dist/__tests__/tools/server.test.d.ts +2 -0
- package/dist/__tests__/tools/server.test.d.ts.map +1 -0
- package/dist/__tests__/tools/server.test.js +126 -0
- package/dist/__tests__/tools/server.test.js.map +1 -0
- package/dist/__tests__/tools/system.test.d.ts +2 -0
- package/dist/__tests__/tools/system.test.d.ts.map +1 -0
- package/dist/__tests__/tools/system.test.js +62 -0
- package/dist/__tests__/tools/system.test.js.map +1 -0
- package/dist/homebridge-client.d.ts +35 -0
- package/dist/homebridge-client.d.ts.map +1 -0
- package/dist/homebridge-client.js +165 -0
- package/dist/homebridge-client.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/accessories.d.ts +4 -0
- package/dist/tools/accessories.d.ts.map +1 -0
- package/dist/tools/accessories.js +139 -0
- package/dist/tools/accessories.js.map +1 -0
- package/dist/tools/config.d.ts +4 -0
- package/dist/tools/config.d.ts.map +1 -0
- package/dist/tools/config.js +43 -0
- package/dist/tools/config.js.map +1 -0
- package/dist/tools/plugins.d.ts +4 -0
- package/dist/tools/plugins.d.ts.map +1 -0
- package/dist/tools/plugins.js +111 -0
- package/dist/tools/plugins.js.map +1 -0
- package/dist/tools/server.d.ts +4 -0
- package/dist/tools/server.d.ts.map +1 -0
- package/dist/tools/server.js +116 -0
- package/dist/tools/server.js.map +1 -0
- package/dist/tools/system.d.ts +4 -0
- package/dist/tools/system.d.ts.map +1 -0
- package/dist/tools/system.js +17 -0
- package/dist/tools/system.js.map +1 -0
- package/dist/types.d.ts +8 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +45 -0
package/README.md
ADDED
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
# @mp-consulting/homebridge-mcp-server
|
|
2
|
+
|
|
3
|
+
MCP (Model Context Protocol) server for [Homebridge](https://homebridge.io) — control your smart home accessories, manage plugins, edit configuration, and monitor your Homebridge server from AI assistants like Claude.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- **Accessories** — List, inspect, and control all your Homebridge accessories (lights, switches, thermostats, sensors, etc.)
|
|
8
|
+
- **Server Management** — Check status, restart Homebridge, view pairing info, manage cached accessories
|
|
9
|
+
- **Configuration** — Read and update your `config.json`
|
|
10
|
+
- **Plugins** — List installed plugins, search npm, view config schemas and changelogs
|
|
11
|
+
- **System Info** — CPU, memory, OS, and network details of the host machine
|
|
12
|
+
|
|
13
|
+
## Prerequisites
|
|
14
|
+
|
|
15
|
+
- [Homebridge](https://homebridge.io) with [homebridge-config-ui-x](https://github.com/homebridge/homebridge-config-ui-x) installed (provides the REST API)
|
|
16
|
+
- Node.js 18+
|
|
17
|
+
|
|
18
|
+
## Installation
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
npm install -g @mp-consulting/homebridge-mcp-server
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Configuration
|
|
25
|
+
|
|
26
|
+
The server requires three environment variables:
|
|
27
|
+
|
|
28
|
+
| Variable | Description | Example |
|
|
29
|
+
|----------|-------------|---------|
|
|
30
|
+
| `HOMEBRIDGE_URL` | URL of your Homebridge UI | `http://192.168.1.100:8581` |
|
|
31
|
+
| `HOMEBRIDGE_USERNAME` | Homebridge UI login username | `admin` |
|
|
32
|
+
| `HOMEBRIDGE_PASSWORD` | Homebridge UI login password | `admin` |
|
|
33
|
+
|
|
34
|
+
## Usage
|
|
35
|
+
|
|
36
|
+
### Claude Desktop
|
|
37
|
+
|
|
38
|
+
Add to your Claude Desktop configuration (`~/Library/Application Support/Claude/claude_desktop_config.json` on macOS):
|
|
39
|
+
|
|
40
|
+
```json
|
|
41
|
+
{
|
|
42
|
+
"mcpServers": {
|
|
43
|
+
"homebridge": {
|
|
44
|
+
"command": "homebridge-mcp-server",
|
|
45
|
+
"env": {
|
|
46
|
+
"HOMEBRIDGE_URL": "http://192.168.1.100:8581",
|
|
47
|
+
"HOMEBRIDGE_USERNAME": "admin",
|
|
48
|
+
"HOMEBRIDGE_PASSWORD": "your-password"
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### Claude Code
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
claude mcp add homebridge -- homebridge-mcp-server
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
Then set the environment variables in your shell or `.env` file.
|
|
62
|
+
|
|
63
|
+
### MCP Inspector (for testing)
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
HOMEBRIDGE_URL=http://192.168.1.100:8581 \
|
|
67
|
+
HOMEBRIDGE_USERNAME=admin \
|
|
68
|
+
HOMEBRIDGE_PASSWORD=your-password \
|
|
69
|
+
npx @modelcontextprotocol/inspector homebridge-mcp-server
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## Available Tools
|
|
73
|
+
|
|
74
|
+
### Accessories
|
|
75
|
+
|
|
76
|
+
| Tool | Description |
|
|
77
|
+
|------|-------------|
|
|
78
|
+
| `list_accessories` | List all accessories with current state |
|
|
79
|
+
| `get_accessory` | Get detailed info for a specific accessory |
|
|
80
|
+
| `set_accessory` | Control an accessory (on/off, brightness, temperature, etc.) |
|
|
81
|
+
| `get_accessory_layout` | Get the room layout from the Homebridge UI |
|
|
82
|
+
|
|
83
|
+
### Server
|
|
84
|
+
|
|
85
|
+
| Tool | Description |
|
|
86
|
+
|------|-------------|
|
|
87
|
+
| `get_homebridge_status` | Check if Homebridge is running |
|
|
88
|
+
| `get_server_status` | Get server version, uptime, Node.js version |
|
|
89
|
+
| `restart_homebridge` | Restart the Homebridge service |
|
|
90
|
+
| `get_pairing_info` | Get HomeKit pairing code / QR info |
|
|
91
|
+
| `get_cached_accessories` | List cached accessories |
|
|
92
|
+
| `remove_cached_accessory` | Remove a specific cached accessory |
|
|
93
|
+
| `reset_cached_accessories` | Reset all cached accessories |
|
|
94
|
+
|
|
95
|
+
### Configuration
|
|
96
|
+
|
|
97
|
+
| Tool | Description |
|
|
98
|
+
|------|-------------|
|
|
99
|
+
| `get_config` | Read the current config.json |
|
|
100
|
+
| `update_config` | Update config.json (full replacement) |
|
|
101
|
+
|
|
102
|
+
### Plugins
|
|
103
|
+
|
|
104
|
+
| Tool | Description |
|
|
105
|
+
|------|-------------|
|
|
106
|
+
| `list_plugins` | List installed plugins |
|
|
107
|
+
| `search_plugins` | Search npm for Homebridge plugins |
|
|
108
|
+
| `lookup_plugin` | Get details about a specific plugin |
|
|
109
|
+
| `get_plugin_versions` | Get available versions for a plugin |
|
|
110
|
+
| `get_plugin_config_schema` | Get the configuration schema for a plugin |
|
|
111
|
+
| `get_plugin_changelog` | Get the changelog for a plugin |
|
|
112
|
+
|
|
113
|
+
### System
|
|
114
|
+
|
|
115
|
+
| Tool | Description |
|
|
116
|
+
|------|-------------|
|
|
117
|
+
| `get_system_info` | Get host system information (CPU, memory, OS) |
|
|
118
|
+
|
|
119
|
+
## Example Prompts
|
|
120
|
+
|
|
121
|
+
Once configured, you can ask Claude things like:
|
|
122
|
+
|
|
123
|
+
- "List all my smart home accessories and their current status"
|
|
124
|
+
- "Turn off the living room lights"
|
|
125
|
+
- "Set the bedroom thermostat to 21 degrees"
|
|
126
|
+
- "What plugins are installed on my Homebridge?"
|
|
127
|
+
- "Show me the Homebridge config"
|
|
128
|
+
- "Is Homebridge running? What version?"
|
|
129
|
+
- "Search for a Homebridge plugin for Philips Hue"
|
|
130
|
+
|
|
131
|
+
## Development
|
|
132
|
+
|
|
133
|
+
```bash
|
|
134
|
+
git clone https://github.com/your-org/homebridge-mcp-server.git
|
|
135
|
+
cd homebridge-mcp-server
|
|
136
|
+
npm install
|
|
137
|
+
npm run build
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
## License
|
|
141
|
+
|
|
142
|
+
MIT
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"homebridge-client.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/homebridge-client.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,262 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"homebridge-client.test.js","sourceRoot":"","sources":["../../src/__tests__/homebridge-client.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accessories.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/tools/accessories.test.ts"],"names":[],"mappings":""}
|