@@ -4,6 +4,8 @@ import {mockMQTT, events as mockMQTTEvents} from '../mocks/mqtt';
4
4
import { flushPromises } from '../mocks/utils' ;
5
5
import { devices , mockController as mockZHController , returnDevices } from '../mocks/zigbeeHerdsman' ;
6
6
7
+ import type Device from '../../lib/model/device' ;
8
+
7
9
import fs from 'fs' ;
8
10
import path from 'path' ;
9
11
@@ -16,12 +18,8 @@ import * as settings from '../../lib/util/settings';
16
18
17
19
const BASE_DIR = 'external_converters' ;
18
20
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 ( ) ;
25
23
26
24
describe ( 'Extension: ExternalConverters' , ( ) => {
27
25
const mockBasePath = path . join ( data . mockDir , BASE_DIR ) ;
@@ -33,20 +31,23 @@ describe('Extension: ExternalConverters', () => {
33
31
const rmSyncSpy = jest . spyOn ( fs , 'rmSync' ) ;
34
32
const writeFileSyncSpy = jest . spyOn ( fs , 'writeFileSync' ) ;
35
33
34
+ const zhcAddDefinitionSpy = jest . spyOn ( zhc , 'addDefinition' ) ;
35
+ const zhcRemoveDefinitionSpy = jest . spyOn ( zhc , 'removeDefinition' ) ;
36
+
36
37
const mocksClear = [
37
38
mockMQTT . end ,
38
39
mockMQTT . publish ,
39
40
mockLogger . debug ,
40
41
mockLogger . error ,
41
42
mockZHController . stop ,
42
43
devices . bulb . save ,
43
- mockZHCAddDefinition ,
44
- mockZHCRemoveDefinition ,
45
44
existsSyncSpy ,
46
45
readdirSyncSpy ,
47
46
mkdirSyncSpy ,
48
47
rmSyncSpy ,
49
48
writeFileSyncSpy ,
49
+ zhcAddDefinitionSpy ,
50
+ zhcRemoveDefinitionSpy ,
50
51
] ;
51
52
52
53
const useAssets = ( ) : void => {
@@ -57,6 +58,11 @@ describe('Extension: ExternalConverters', () => {
57
58
return fs . readFileSync ( path . join ( __dirname , '..' , 'assets' , BASE_DIR , fileName ) , 'utf8' ) ;
58
59
} ;
59
60
61
+ const getZ2MDevice = ( zhDevice : unknown ) : Device => {
62
+ // @ts -expect-error private
63
+ return controller . zigbee . resolveEntity ( zhDevice ) ! as Device ;
64
+ } ;
65
+
60
66
beforeAll ( async ( ) => {
61
67
jest . useFakeTimers ( ) ;
62
68
} ) ;
@@ -70,7 +76,7 @@ describe('Extension: ExternalConverters', () => {
70
76
data . writeDefaultConfiguration ( ) ;
71
77
data . writeDefaultState ( ) ;
72
78
settings . reRead ( ) ;
73
- returnDevices . splice ( 0 ) ;
79
+ returnDevices . push ( devices . external_converter_device . ieeeAddr ) ;
74
80
75
81
controller = new Controller ( jest . fn ( ) , jest . fn ( ) ) ;
76
82
} ) ;
@@ -94,6 +100,12 @@ describe('Extension: ExternalConverters', () => {
94
100
await controller . start ( ) ;
95
101
await flushPromises ( ) ;
96
102
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
+ } ) ;
97
109
expect ( mockMQTT . publish ) . toHaveBeenCalledWith (
98
110
'zigbee2mqtt/bridge/converters' ,
99
111
stringify ( [
@@ -103,37 +115,37 @@ describe('Extension: ExternalConverters', () => {
103
115
{ retain : true , qos : 0 } ,
104
116
expect . any ( Function ) ,
105
117
) ;
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
+ ) ;
137
149
} ) ;
138
150
139
151
it ( 'saves and removes from MQTT' , async ( ) => {
@@ -145,23 +157,35 @@ describe('Extension: ExternalConverters', () => {
145
157
await flushPromises ( ) ;
146
158
mocksClear . forEach ( ( m ) => m . mockClear ( ) ) ;
147
159
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
+
148
167
//-- SAVE
149
168
mockMQTTEvents . message ( 'zigbee2mqtt/bridge/request/converter/save' , stringify ( { name : converterName , code : converterCode } ) ) ;
150
169
await flushPromises ( ) ;
151
170
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 ( {
160
172
description : 'external' ,
161
- fromZigbee : [ ] ,
162
- toZigbee : [ ] ,
163
- exposes : [ ] ,
173
+ model : 'external_converter_device' ,
174
+ vendor : 'external' ,
175
+ zigbeeModel : [ 'external_converter_device' ] ,
164
176
} ) ;
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
+ ) ;
165
189
expect ( mockMQTT . publish ) . toHaveBeenCalledWith (
166
190
'zigbee2mqtt/bridge/converters' ,
167
191
stringify ( [ { name : converterName , code : converterCode } ] ) ,
@@ -173,17 +197,22 @@ describe('Extension: ExternalConverters', () => {
173
197
mockMQTTEvents . message ( 'zigbee2mqtt/bridge/request/converter/remove' , stringify ( { name : converterName } ) ) ;
174
198
await flushPromises ( ) ;
175
199
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' ,
181
202
model : 'external_converter_device' ,
182
- description : 'external' ,
183
- fromZigbee : [ ] ,
184
- toZigbee : [ ] ,
185
- exposes : [ ] ,
203
+ vendor : '' ,
204
+ zigbeeModel : [ 'external_converter_device' ] ,
186
205
} ) ;
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
+ ) ;
187
216
expect ( mockMQTT . publish ) . toHaveBeenCalledWith ( 'zigbee2mqtt/bridge/converters' , stringify ( [ ] ) , { retain : true , qos : 0 } , expect . any ( Function ) ) ;
188
217
} ) ;
189
218
@@ -239,7 +268,7 @@ describe('Extension: ExternalConverters', () => {
239
268
240
269
const errorMsg = `Invalid definition` ;
241
270
242
- mockZHCAddDefinition . mockImplementationOnce ( ( ) => {
271
+ zhcAddDefinitionSpy . mockImplementationOnce ( ( ) => {
243
272
throw new Error ( errorMsg ) ;
244
273
} ) ;
245
274
@@ -270,7 +299,7 @@ describe('Extension: ExternalConverters', () => {
270
299
271
300
const errorMsg = `Failed to remove definition` ;
272
301
273
- mockZHCRemoveDefinition . mockImplementationOnce ( ( ) => {
302
+ zhcRemoveDefinitionSpy . mockImplementationOnce ( ( ) => {
274
303
throw new Error ( errorMsg ) ;
275
304
} ) ;
276
305
0 commit comments