From 352fa2db503355436c5b5714ee1e739941d089c1 Mon Sep 17 00:00:00 2001 From: Koenkk Date: Mon, 26 Nov 2018 17:47:44 +0100 Subject: [PATCH] More tests. --- test/devicePublish.test.js | 61 +++++++++++++++++++++++++++++++++++++- test/deviceReceive.test.js | 40 +++++++++++++++++++++++++ 2 files changed, 100 insertions(+), 1 deletion(-) create mode 100644 test/deviceReceive.test.js diff --git a/test/devicePublish.test.js b/test/devicePublish.test.js index 1c771ca5f..2ad89eb59 100644 --- a/test/devicePublish.test.js +++ b/test/devicePublish.test.js @@ -7,11 +7,70 @@ const mqtt = { subscribe: (topic) => {}, }; +const zigbee = { + getDevice: null, + publish: sinon.spy(), +}; + +const cfg = { + default: { + manufSpec: 0, + disDefaultRsp: 0, + }, +}; + describe('DevicePublish', () => { let devicePublish; beforeEach(() => { - devicePublish = new DevicePublish(null, mqtt, null, null); + devicePublish = new DevicePublish(zigbee, mqtt, null, null); + }); + + describe('Parse topic', () => { + it('Should publish messages to zigbee devices', () => { + zigbee.publish.resetHistory(); + zigbee.getDevice = sinon.fake.returns({modelId: 'TRADFRI bulb E27 CWS opal 600lm'}); + devicePublish = new DevicePublish(zigbee, mqtt, null, null); + devicePublish.onMQTTMessage('zigbee2mqtt/0x12345678/set', JSON.stringify({brightness: '200'})); + chai.assert.isTrue(zigbee.publish.calledOnce); + chai.assert.strictEqual(zigbee.publish.getCall(0).args[0], '0x12345678'); + chai.assert.strictEqual(zigbee.publish.getCall(0).args[1], 'genLevelCtrl'); + chai.assert.strictEqual(zigbee.publish.getCall(0).args[2], 'moveToLevelWithOnOff'); + chai.assert.strictEqual(zigbee.publish.getCall(0).args[3], 'functional'); + chai.assert.deepEqual(zigbee.publish.getCall(0).args[4], {level: '200', transtime: 0}); + chai.assert.deepEqual(zigbee.publish.getCall(0).args[5], cfg.default); + chai.assert.deepEqual(zigbee.publish.getCall(0).args[6], null); + }); + + it('Should publish messages to zigbee devices with non-default ep', () => { + zigbee.publish.resetHistory(); + zigbee.getDevice = sinon.fake.returns({modelId: 'lumi.ctrl_neutral1'}); + devicePublish = new DevicePublish(zigbee, mqtt, null, null); + devicePublish.onMQTTMessage('zigbee2mqtt/0x12345678/set', JSON.stringify({state: 'OFF'})); + chai.assert.isTrue(zigbee.publish.calledOnce); + chai.assert.strictEqual(zigbee.publish.getCall(0).args[0], '0x12345678'); + chai.assert.strictEqual(zigbee.publish.getCall(0).args[1], 'genOnOff'); + chai.assert.strictEqual(zigbee.publish.getCall(0).args[2], 'off'); + chai.assert.strictEqual(zigbee.publish.getCall(0).args[3], 'functional'); + chai.assert.deepEqual(zigbee.publish.getCall(0).args[4], {}); + chai.assert.deepEqual(zigbee.publish.getCall(0).args[5], cfg.default); + chai.assert.strictEqual(zigbee.publish.getCall(0).args[6], 2); + }); + + it('Should publish messages to zigbee devices with non-default ep and postfix', () => { + zigbee.publish.resetHistory(); + zigbee.getDevice = sinon.fake.returns({modelId: 'lumi.ctrl_neutral2'}); + devicePublish = new DevicePublish(zigbee, mqtt, null, null); + devicePublish.onMQTTMessage('zigbee2mqtt/0x12345678/right/set', JSON.stringify({state: 'OFF'})); + chai.assert.isTrue(zigbee.publish.calledOnce); + chai.assert.strictEqual(zigbee.publish.getCall(0).args[0], '0x12345678'); + chai.assert.strictEqual(zigbee.publish.getCall(0).args[1], 'genOnOff'); + chai.assert.strictEqual(zigbee.publish.getCall(0).args[2], 'off'); + chai.assert.strictEqual(zigbee.publish.getCall(0).args[3], 'functional'); + chai.assert.deepEqual(zigbee.publish.getCall(0).args[4], {}); + chai.assert.deepEqual(zigbee.publish.getCall(0).args[5], cfg.default); + chai.assert.strictEqual(zigbee.publish.getCall(0).args[6], 3); + }); }); describe('Parse topic', () => { diff --git a/test/deviceReceive.test.js b/test/deviceReceive.test.js new file mode 100644 index 000000000..9f4adb409 --- /dev/null +++ b/test/deviceReceive.test.js @@ -0,0 +1,40 @@ +const chai = require('chai'); +const sinon = require('sinon'); +const DeviceReceive = require('../lib/extension/deviceReceive'); +const settings = require('../lib/util/settings'); +const logger = require('../lib/util/logger'); +const devices = require('zigbee-shepherd-converters').devices; + +// Devices +const WXKG11LM = devices.find((d) => d.model === 'WXKG11LM'); + +const mqtt = { + log: () => {}, +}; + +const msg = (device, cid, type, data) => { + return {data: {cid: cid, data: data}, type: type, endpoints: [device]}; +}; + +describe('DeviceReceive', () => { + let deviceReceive; + let publishDeviceState; + + beforeEach(() => { + publishDeviceState = sinon.spy(); + deviceReceive = new DeviceReceive(null, mqtt, null, publishDeviceState); + sinon.stub(settings, 'addDevice').callsFake(() => {}); + sinon.stub(logger, 'info').callsFake(() => {}); + sinon.stub(logger, 'warn').callsFake(() => {}); + }); + + describe('Handling zigbee messages', () => { + it('Should handle a zigbee message', () => { + const device = {ieeeAddr: '0x12345678'}; + const message = msg(device, 'genOnOff', 'attReport', {onOff: 1}); + deviceReceive.onZigbeeMessage(message, device, WXKG11LM); + chai.assert.isTrue(publishDeviceState.calledOnce); + chai.assert.deepEqual(publishDeviceState.getCall(0).args[1], {click: 'single'}); + }); + }); +});