Skip to content

Commit 57aac29

Browse files
committed
Dont mock zhc for basics, tests actual live loading
1 parent 5a2c69f commit 57aac29

File tree

1 file changed

+91
-62
lines changed

1 file changed

+91
-62
lines changed

test/extensions/externalConverters.test.ts

+91-62
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import {mockMQTT, events as mockMQTTEvents} from '../mocks/mqtt';
44
import {flushPromises} from '../mocks/utils';
55
import {devices, mockController as mockZHController, returnDevices} from '../mocks/zigbeeHerdsman';
66

7+
import type Device from '../../lib/model/device';
8+
79
import fs from 'fs';
810
import path from 'path';
911

@@ -16,12 +18,8 @@ import * as settings from '../../lib/util/settings';
1618

1719
const BASE_DIR = 'external_converters';
1820

19-
const mockZHCAddDefinition = jest.fn();
20-
const mockZHCRemoveDefinition = jest.fn();
21-
// @ts-expect-error mock
22-
zhc.addDefinition = mockZHCAddDefinition;
23-
// @ts-expect-error mock
24-
zhc.removeDefinition = mockZHCRemoveDefinition;
21+
// @ts-expect-error TODO: remove, tmp until implemented
22+
zhc.removeDefinition = jest.fn();
2523

2624
describe('Extension: ExternalConverters', () => {
2725
const mockBasePath = path.join(data.mockDir, BASE_DIR);
@@ -33,20 +31,23 @@ describe('Extension: ExternalConverters', () => {
3331
const rmSyncSpy = jest.spyOn(fs, 'rmSync');
3432
const writeFileSyncSpy = jest.spyOn(fs, 'writeFileSync');
3533

34+
const zhcAddDefinitionSpy = jest.spyOn(zhc, 'addDefinition');
35+
const zhcRemoveDefinitionSpy = jest.spyOn(zhc, 'removeDefinition');
36+
3637
const mocksClear = [
3738
mockMQTT.end,
3839
mockMQTT.publish,
3940
mockLogger.debug,
4041
mockLogger.error,
4142
mockZHController.stop,
4243
devices.bulb.save,
43-
mockZHCAddDefinition,
44-
mockZHCRemoveDefinition,
4544
existsSyncSpy,
4645
readdirSyncSpy,
4746
mkdirSyncSpy,
4847
rmSyncSpy,
4948
writeFileSyncSpy,
49+
zhcAddDefinitionSpy,
50+
zhcRemoveDefinitionSpy,
5051
];
5152

5253
const useAssets = (): void => {
@@ -57,6 +58,11 @@ describe('Extension: ExternalConverters', () => {
5758
return fs.readFileSync(path.join(__dirname, '..', 'assets', BASE_DIR, fileName), 'utf8');
5859
};
5960

61+
const getZ2MDevice = (zhDevice: unknown): Device => {
62+
// @ts-expect-error private
63+
return controller.zigbee.resolveEntity(zhDevice)! as Device;
64+
};
65+
6066
beforeAll(async () => {
6167
jest.useFakeTimers();
6268
});
@@ -70,7 +76,7 @@ describe('Extension: ExternalConverters', () => {
7076
data.writeDefaultConfiguration();
7177
data.writeDefaultState();
7278
settings.reRead();
73-
returnDevices.splice(0);
79+
returnDevices.push(devices.external_converter_device.ieeeAddr);
7480

7581
controller = new Controller(jest.fn(), jest.fn());
7682
});
@@ -94,6 +100,12 @@ describe('Extension: ExternalConverters', () => {
94100
await controller.start();
95101
await flushPromises();
96102

103+
expect(getZ2MDevice(devices.external_converter_device)!.definition).toMatchObject({
104+
description: 'external',
105+
model: 'external_converter_device',
106+
vendor: 'external',
107+
zigbeeModel: ['external_converter_device'],
108+
});
97109
expect(mockMQTT.publish).toHaveBeenCalledWith(
98110
'zigbee2mqtt/bridge/converters',
99111
stringify([
@@ -103,37 +115,37 @@ describe('Extension: ExternalConverters', () => {
103115
{retain: true, qos: 0},
104116
expect.any(Function),
105117
);
106-
expect(mockZHCRemoveDefinition).toHaveBeenCalledTimes(3);
107-
expect(mockZHCAddDefinition).toHaveBeenNthCalledWith(1, {
108-
mock: 1,
109-
model: 'external_converters_device_1',
110-
zigbeeModel: ['external_converter_device_1'],
111-
vendor: 'external_1',
112-
description: 'external_1',
113-
fromZigbee: [],
114-
toZigbee: [],
115-
exposes: [],
116-
});
117-
expect(mockZHCAddDefinition).toHaveBeenNthCalledWith(2, {
118-
mock: 2,
119-
model: 'external_converters_device_2',
120-
zigbeeModel: ['external_converter_device_2'],
121-
vendor: 'external_2',
122-
description: 'external_2',
123-
fromZigbee: [],
124-
toZigbee: [],
125-
exposes: [],
126-
});
127-
expect(mockZHCAddDefinition).toHaveBeenNthCalledWith(3, {
128-
mock: true,
129-
zigbeeModel: ['external_converter_device'],
130-
vendor: 'external',
131-
model: 'external_converter_device',
132-
description: 'external',
133-
fromZigbee: [],
134-
toZigbee: [],
135-
exposes: [],
136-
});
118+
expect(zhcRemoveDefinitionSpy).toHaveBeenCalledTimes(3);
119+
expect(zhcAddDefinitionSpy).toHaveBeenNthCalledWith(
120+
1,
121+
expect.objectContaining({
122+
mock: 1,
123+
model: 'external_converters_device_1',
124+
zigbeeModel: ['external_converter_device_1'],
125+
vendor: 'external_1',
126+
description: 'external_1',
127+
}),
128+
);
129+
expect(zhcAddDefinitionSpy).toHaveBeenNthCalledWith(
130+
2,
131+
expect.objectContaining({
132+
mock: 2,
133+
model: 'external_converters_device_2',
134+
zigbeeModel: ['external_converter_device_2'],
135+
vendor: 'external_2',
136+
description: 'external_2',
137+
}),
138+
);
139+
expect(zhcAddDefinitionSpy).toHaveBeenNthCalledWith(
140+
3,
141+
expect.objectContaining({
142+
mock: true,
143+
zigbeeModel: ['external_converter_device'],
144+
vendor: 'external',
145+
model: 'external_converter_device',
146+
description: 'external',
147+
}),
148+
);
137149
});
138150

139151
it('saves and removes from MQTT', async () => {
@@ -145,23 +157,35 @@ describe('Extension: ExternalConverters', () => {
145157
await flushPromises();
146158
mocksClear.forEach((m) => m.mockClear());
147159

160+
expect(getZ2MDevice(devices.external_converter_device)!.definition).toMatchObject({
161+
description: 'Automatically generated definition',
162+
model: 'external_converter_device',
163+
vendor: '',
164+
zigbeeModel: ['external_converter_device'],
165+
});
166+
148167
//-- SAVE
149168
mockMQTTEvents.message('zigbee2mqtt/bridge/request/converter/save', stringify({name: converterName, code: converterCode}));
150169
await flushPromises();
151170

152-
expect(mkdirSyncSpy).toHaveBeenCalledWith(mockBasePath, {recursive: true});
153-
expect(writeFileSyncSpy).toHaveBeenCalledWith(converterFilePath, converterCode, 'utf8');
154-
expect(mockZHCRemoveDefinition).toHaveBeenCalledTimes(1);
155-
expect(mockZHCAddDefinition).toHaveBeenCalledWith({
156-
mock: true,
157-
zigbeeModel: ['external_converter_device'],
158-
vendor: 'external',
159-
model: 'external_converter_device',
171+
expect(getZ2MDevice(devices.external_converter_device)!.definition).toMatchObject({
160172
description: 'external',
161-
fromZigbee: [],
162-
toZigbee: [],
163-
exposes: [],
173+
model: 'external_converter_device',
174+
vendor: 'external',
175+
zigbeeModel: ['external_converter_device'],
164176
});
177+
expect(mkdirSyncSpy).toHaveBeenCalledWith(mockBasePath, {recursive: true});
178+
expect(writeFileSyncSpy).toHaveBeenCalledWith(converterFilePath, converterCode, 'utf8');
179+
expect(zhcRemoveDefinitionSpy).toHaveBeenCalledTimes(1);
180+
expect(zhcAddDefinitionSpy).toHaveBeenCalledWith(
181+
expect.objectContaining({
182+
mock: true,
183+
zigbeeModel: ['external_converter_device'],
184+
vendor: 'external',
185+
model: 'external_converter_device',
186+
description: 'external',
187+
}),
188+
);
165189
expect(mockMQTT.publish).toHaveBeenCalledWith(
166190
'zigbee2mqtt/bridge/converters',
167191
stringify([{name: converterName, code: converterCode}]),
@@ -173,17 +197,22 @@ describe('Extension: ExternalConverters', () => {
173197
mockMQTTEvents.message('zigbee2mqtt/bridge/request/converter/remove', stringify({name: converterName}));
174198
await flushPromises();
175199

176-
expect(rmSyncSpy).toHaveBeenCalledWith(converterFilePath, {force: true});
177-
expect(mockZHCRemoveDefinition).toHaveBeenCalledWith({
178-
mock: true,
179-
zigbeeModel: ['external_converter_device'],
180-
vendor: 'external',
200+
expect(getZ2MDevice(devices.external_converter_device)!.definition).toMatchObject({
201+
description: 'Automatically generated definition',
181202
model: 'external_converter_device',
182-
description: 'external',
183-
fromZigbee: [],
184-
toZigbee: [],
185-
exposes: [],
203+
vendor: '',
204+
zigbeeModel: ['external_converter_device'],
186205
});
206+
expect(rmSyncSpy).toHaveBeenCalledWith(converterFilePath, {force: true});
207+
expect(zhcRemoveDefinitionSpy).toHaveBeenCalledWith(
208+
expect.objectContaining({
209+
mock: true,
210+
zigbeeModel: ['external_converter_device'],
211+
vendor: 'external',
212+
model: 'external_converter_device',
213+
description: 'external',
214+
}),
215+
);
187216
expect(mockMQTT.publish).toHaveBeenCalledWith('zigbee2mqtt/bridge/converters', stringify([]), {retain: true, qos: 0}, expect.any(Function));
188217
});
189218

@@ -239,7 +268,7 @@ describe('Extension: ExternalConverters', () => {
239268

240269
const errorMsg = `Invalid definition`;
241270

242-
mockZHCAddDefinition.mockImplementationOnce(() => {
271+
zhcAddDefinitionSpy.mockImplementationOnce(() => {
243272
throw new Error(errorMsg);
244273
});
245274

@@ -270,7 +299,7 @@ describe('Extension: ExternalConverters', () => {
270299

271300
const errorMsg = `Failed to remove definition`;
272301

273-
mockZHCRemoveDefinition.mockImplementationOnce(() => {
302+
zhcRemoveDefinitionSpy.mockImplementationOnce(() => {
274303
throw new Error(errorMsg);
275304
});
276305

0 commit comments

Comments
 (0)