UNPKG

@pmouli/isy-matter-server

Version:

Service to expose an ISY device as a Matter Border router

608 lines (583 loc) 30.5 kB
// MOCHA TEST SUITE // Designed to work against a fake-isy-994i server (see github.com/rodtoll/fake-isy-994i). Will not run unmodified against a real server as test devices // won't be found on that server AND real servers can't have their state reset. // var restler = require('restler'); var assert = require('assert'); var ISY = require('../isy.js').ISY; var ISYLightDevice = require('../isydevice').ISYLightDevice; var ISYLockDevice = require('../isydevice').ISYLockDevice; var ISYOutletDevice = require('../isydevice').ISYOutletDevice; var ISYDoorWindowDevice = require('../isydevice').ISYDoorWindowDevice; var ISYFanDevice = require('../isydevice').ISYFanDevice; var ISYMotionSensorDevice = require('../isydevice').ISYMotionSensorDevice; var ISYScene = require('../isyscene').ISYScene; var ELKAlarmPanelDevice = require('../elkdevice').ELKAlarmPanelDevice; var ElkAlarmSensor = require('../elkdevice').ElkAlarmSensor; var ISYBaseDevice = require('../isydevice').ISYBaseDevice; var expectedDeviceCountWithElkWithScenes = 228; var expectedDeviceCountWithElkNoScenes = 179; var expectedDeviceCountWithoutElkWithScenes = 194; var expectedDeviceCountWithoutElkNoScenes = 145; var expectedDimmableLightCount = 78; var expectedLightCount = 102; var expectedLockCount = 3; var expectedDoorWindowCount = 7; var expectedMotionCount = 5; var expectedFanCount = 3; var expectedOutletCount = 4; var expectedSceneCount = 49; var expectedElkAlarmCount = 0; var expectedElkSensorCount = 34; var expectedGenericCount = 21; var expectedType1VariablesCount = 25; var expectedType2VariablesCount = 32; var sampleType1VariableId = '1'; var sampleType1VariableName = 'OfficeMotionEnabled'; var sampleType2VariableName = 'AlarmFrontDoorOpen'; var sampleType2VariableId = '1'; var sampleElkZone = 'ElkZone22'; var sampleSceneId = '12627'; var sampleDimmableLight = '33 9B DC 1'; var sampleKeypadDimmableButton = '2B 99 34 8'; var sampleZWaveLock = 'ZW002_1'; var sampleMotionSensorSensor = '21 62 43 1'; var sampleMorningLincLock = '29 3D E2 1'; var sampleIOLincSensor = '17 79 81 1'; var sampleFanLincFan = '14 A6 C5 2'; var sampleFanLincLight = '14 A7 12 1'; var sampleFanLincFanOffState = '14 A8 BC 2'; var sampleOutletLinc = '19 C0 E4 1'; var sampleDisabledDevice = '1F 42 F7 1'; var sampleApplianceLinc = '1F 46 F0 1'; var sampleOnOffLight = '18 36 B1 1'; var sampleLightFromMotionLightKit = '17 15 6A 1'; var sampleDoorWindowSensor = '14 47 41 1'; var sampleSceneWithAllLightsOff = '27346'; var sampleGenericDevice = '14 5C B2 2'; var sampleSceneWithAllLightsOffAllImpacted = ['18 12 18 1', '19 53 90 1', /* The Scene itself */ '27346']; var testServerAddress = '127.0.0.1:3000'; var testServerUserName = 'admin'; var testServerPassword = 'password'; var sampleBaseDeviceList = [ {address: sampleDimmableLight, type: 'DimmableLight'}, {address: sampleKeypadDimmableButton, type: 'DimmableLight'}, {address: sampleZWaveLock, type: 'SecureLock'}, {address: sampleMotionSensorSensor, type: 'MotionSensor'}, {address: sampleMorningLincLock, type: 'DoorLock'}, {address: sampleIOLincSensor, type: 'DoorWindowSensor'}, {address: sampleFanLincFan, type: 'Fan'}, {address: sampleFanLincLight, type: 'DimmableLight'}, {address: sampleOutletLinc, type: 'Light'}, {address: sampleOnOffLight, type: 'Light'}, {address: sampleApplianceLinc, type: 'Outlet'}, {address: sampleLightFromMotionLightKit, type: 'Light'}, {address: sampleDoorWindowSensor, type: 'DoorWindowSensor'}, {address: sampleGenericDevice, type: 'Unknown'} ]; function countDevices(done, elkEnabled, scenesEnabled) { var isy = new ISY(testServerAddress, testServerUserName, testServerPassword, true, function() {}, false, true); assert.doesNotThrow(function() { isy.initialize(function() { var deviceList = isy.getDeviceList(); var lightCount = 0; var lockCount = 0; var doorWindowCount = 0; var motionCount = 0; var fanCount = 0; var outletCount = 0; var sceneCount = 0; var elkAlarmCount = 0; var elkSensorCount = 0; var genericCount = 0; var dimmableLightCount = 0; for(var deviceIndex = 0; deviceIndex < deviceList.length; deviceIndex++) { var device = deviceList[deviceIndex]; assert(device.address != sampleDisabledDevice, 'Should not enumerate a disabled device'); if(device instanceof ISYLightDevice) { lightCount++; if(device.isDimmable) { dimmableLightCount++; } } else if(device instanceof ISYLockDevice) { lockCount++; } else if(device instanceof ISYOutletDevice) { outletCount++; } else if(device instanceof ISYDoorWindowDevice) { doorWindowCount++; } else if(device instanceof ISYFanDevice) { fanCount++; } else if(device instanceof ISYMotionSensorDevice) { motionCount++; } else if(device instanceof ISYScene) { sceneCount++; } else if(device instanceof ELKAlarmPanelDevice) { elkAlarmCount++; } else if(device instanceof ElkAlarmSensor) { elkSensorCount++; } else if(device instanceof ISYBaseDevice) { genericCount++; } } assert.equal(lightCount, expectedLightCount, "Light count is incorrect"); assert.equal(lockCount, expectedLockCount, "Lock count incorrect"); assert.equal(doorWindowCount, expectedDoorWindowCount, "Door window sensor count is incorrect"); assert.equal(motionCount, expectedMotionCount, "Motion sensor count is incorrect"); assert.equal(fanCount, expectedFanCount, "Fan count is incorrect"); assert.equal(outletCount, expectedOutletCount, "Outlet count is incorrect"); assert.equal(sceneCount, (scenesEnabled) ? expectedSceneCount : 0, "Scene count is incorrect"); assert.equal(elkAlarmCount, (elkEnabled) ? expectedElkAlarmCount : 0, "Elk alarm panel count is incorrect"); assert.equal(elkSensorCount, (elkEnabled) ? expectedElkSensorCount : 0, "Elk sensor count is incorrect"); assert.equal(genericCount, expectedGenericCount, 'Generic device count is incorrect'); assert.equal(dimmableLightCount, expectedDimmableLightCount, 'Dimmable light count is incorrect'); var panel = isy.getElkAlarmPanel(); if(elkEnabled) { assert(panel instanceof ELKAlarmPanelDevice, "Should have a panel"); } else { assert(panel == null, "Should have no panel when elk disabled"); } if(scenesEnabled) { assert.equal(isy.getSceneList().length, sceneCount, 'Should have scenes in the scene list'); } done(); }); }); } function checkDevice(testParam, device) { assert(device != null && device != undefined, 'Should have found the specified device for address '+testParam.address); assert.equal(device.address, testParam.address, 'Should have expected address for address '+testParam.address); assert.equal(device.deviceType, testParam.type, 'Should have expected type for address '+testParam.address); } function checkForExpectedDevices(done, elkEnabled, scenesEnabled) { var isy = new ISY(testServerAddress, testServerUserName, testServerPassword, true, function() {}, false, true); assert.doesNotThrow(function() { isy.initialize(function() { for(var addressIndex = 0; addressIndex < sampleBaseDeviceList.length; addressIndex++) { checkDevice(sampleBaseDeviceList[addressIndex], isy.getDevice(sampleBaseDeviceList[addressIndex].address)); } if(elkEnabled) { checkDevice({address: sampleElkZone, type: 'AlarmDoorWindowSensor'}, isy.getDevice(sampleElkZone)); } if(scenesEnabled) { checkDevice({address: sampleSceneId, type: 'Scene'}, isy.getDevice(sampleSceneId)); } if(!elkEnabled) { assert(isy.getDevice(sampleElkZone)==null, "Elk disabled, shouldn't have an elk device"); } if(!scenesEnabled) { assert(isy.getDevice(sampleSceneId)==null, 'Scenes disabled should not have scene in device list'); } done(); }); }); } function resetServerState(done) { restler.get('http://'+testServerAddress+'/config/reset').on('complete', function(result, response) { done(); }); } function setVariableFailureMode(shouldFail,done) { restler.get('http://'+testServerAddress+'/config/failVariableCalls/'+shouldFail.toString()).on('complete', function(result, response) { done(); }); } // Used to send set to on command for sensors. Doesn't work on real ISY. function sendServerOnCommand(isy, deviceAddress,done) { isy.sendRestCommand(deviceAddress, 'DON', null, function() { done(); }); } function sendServerZoneCommand(isy, zoneId, command, done) { isy.sendRestCommand(zoneId, command, null, function() { done(); }); } describe('ISY Device and scene Enumeration and Creation', function() { describe('Device enumeration (scenes=true,elk=true)', function() { it('Basic startup should work and right number of devices should be enumerated ', function(done) { var isy = new ISY(testServerAddress, testServerUserName, testServerPassword, true, function() {}, false, true); assert.doesNotThrow(function() { isy.initialize(function() { assert.equal(isy.getDeviceList().length, expectedDeviceCountWithElkWithScenes, 'Device count incorrect'); done(); }); }); }); it('Right device count and types are present', function(done) { countDevices(done,true,true); }); it('Device lookup works and expected variety of devices present', function(done) { checkForExpectedDevices(done,true,true); }); }); describe('Device enumeration(scenes=true,elk=false)', function() { it('Basic startup should work and right number of devices should be enumerated ', function(done) { var isy = new ISY(testServerAddress, testServerUserName, testServerPassword, false, function() {}, false, true); assert.doesNotThrow(function() { isy.initialize(function() { assert.equal(isy.getDeviceList().length, expectedDeviceCountWithoutElkWithScenes, 'Device count incorrect'); done(); }); }); }); it('Right device count and types are present', function(done) { countDevices(done,true,true); }); it('Device lookup works and expected variety of devices present', function(done) { checkForExpectedDevices(done,true,true); }); }); describe('Device enumeration (scenes=false,elk=false)', function() { it('Basic startup should work and right number of devices should be enumerated ', function(done) { var isy = new ISY(testServerAddress, testServerUserName, testServerPassword, false, function() {}, false, false); assert.doesNotThrow(function() { isy.initialize(function() { assert.equal(isy.getDeviceList().length, expectedDeviceCountWithoutElkNoScenes, 'Device count incorrect'); done(); }); }); }); it('Right device count and types are present', function(done) { countDevices(done,true,true); }); it('Device lookup works and expected variety of devices present', function(done) { checkForExpectedDevices(done,true,true); }); }); describe('Device enumeration (scenes=false,elk=true)', function() { it('Basic startup should work and right number of devices should be enumerated ', function(done) { var isy = new ISY(testServerAddress, testServerUserName, testServerPassword, true, function() {}, false, false); assert.doesNotThrow(function() { isy.initialize(function() { assert.equal(isy.getDeviceList().length, expectedDeviceCountWithElkNoScenes, 'Device count incorrect'); done(); }); }); }); it('Right device count and types are present', function(done) { countDevices(done,true,true); }); it('Device lookup works and expected variety of devices present', function(done) { checkForExpectedDevices(done,true,true); }); }); describe('#check scene indexing', function() { it('Basic scene lookup', function(done) { var isy = new ISY(testServerAddress, testServerUserName, testServerPassword, true, function() {}, false, false); assert.doesNotThrow(function() { isy.initialize(function() { assert.equal(isy.getSceneList().length, expectedSceneCount, 'Scene count incorrect'); assert(isy.getScene(sampleSceneId) instanceof ISYScene, 'Scene lookup working'); assert.equal(isy.getScene(sampleSceneId).address, sampleSceneId, 'The right scene object is returned' ) done(); }); }); }); }); }); function runTrueFalseTest(isy, deviceId, stateFunctionToTest, sendFunctionToTest, done) { var deviceToCheck = isy.getDevice(deviceId); var startingChangedTimestamp = deviceToCheck.lastChanged; var stateToExpect = !deviceToCheck[stateFunctionToTest](); var testRunIndex = 0; isy.changeCallback = function (isy, changedDevice) { if(changedDevice.address == deviceToCheck.address) { assert.equal(stateToExpect, deviceToCheck[stateFunctionToTest](), 'Should have expected state for device: '+deviceToCheck.address); assert(changedDevice.lastChanged > startingChangedTimestamp, 'lastChanged property should have changed.') if(testRunIndex == 0) { stateToExpect = !deviceToCheck[stateFunctionToTest](); deviceToCheck[sendFunctionToTest](stateToExpect, function() {}); testRunIndex++; } else { done(); } } } deviceToCheck[sendFunctionToTest](stateToExpect, function() {}); } function runFanTest(isy, deviceId, fanSpeed, done) { var deviceToCheck = isy.getDevice(deviceId); var startingChangedTimestamp = deviceToCheck.lastChanged; isy.changeCallback = function (isy, changedDevice) { if (deviceId == changedDevice.address) { assert.equal(fanSpeed, deviceToCheck.getCurrentFanState(), 'Should have expected fan speed for device: ' + deviceToCheck.address); assert(changedDevice.lastChanged > startingChangedTimestamp, 'lastChanged property should have changed.') done(); } } deviceToCheck.sendFanCommand(fanSpeed, function () {}); } function runSensorTest(isy, deviceId, stateFunctionToTest, done) { var deviceToCheck = isy.getDevice(deviceId); var startingChangedDate = deviceToCheck.lastChanged; isy.changeCallback = function (isy, changedDevice) { if(changedDevice.address == deviceToCheck.address) { assert(deviceToCheck[stateFunctionToTest](), 'Sensor should show true state: '+deviceToCheck.address); assert(deviceToCheck.lastChanged > startingChangedDate, 'Sesnor last changed data should have updated'); done(); } } sendServerOnCommand(isy, deviceId, function() {}); } function runSceneTest(isy, sceneId, lightStateToSet, impactedDeviceList, done) { var sceneToCheck = isy.getDevice(sceneId); var startingChangedDate = sceneToCheck.lastChanged; var devicesToCheck = []; var doneCalled = false; for(var index = 0; index < impactedDeviceList.length; index++) { devicesToCheck.push(impactedDeviceList[index]); } isy.changeCallback = function (isy,changedDevice) { for(var deviceIndex = 0; deviceIndex < devicesToCheck.length; deviceIndex++) { if(devicesToCheck[deviceIndex] == changedDevice.address) { if(sceneToCheck.address != devicesToCheck[deviceIndex]) { assert.equal(changedDevice.getCurrentLightState(), lightStateToSet, "Should be setting devices to the state we expect"); } devicesToCheck.splice(deviceIndex, 1); break; } } if(devicesToCheck.length == 0) { if(!doneCalled) { assert.equal(sceneToCheck.getCurrentLightState(), lightStateToSet, 'Scene should now be set to the desired state'); assert(sceneToCheck.getAreAllLightsInSpecifiedState(lightStateToSet), "Once all lights are accounted for getAreAllLightsInSpecifiedState() should be true" ); assert(sceneToCheck.lastChanged > startingChangedDate, 'Scene last changed data should have updated'); done(); doneCalled = true; } } else if (devicesToCheck.length > 1) { assert(!sceneToCheck.getAreAllLightsInSpecifiedState(lightStateToSet), "Until all lights are accounted for getAreAllLightsInSpecifiedState() should be false" ); } } sceneToCheck.sendLightCommand(lightStateToSet, function() {}); } function runElkZoneTest(isy, zoneId, command, expectedCount, expectedResult, stateFunctionToTest, done) { var callbackCount = 0; var deviceId = "ElkZone"+zoneId; var deviceToCheck = isy.getDevice(deviceId); var startingChangedTimestamp = new Date(); isy.changeCallback = function (isy, changedDevice) { if(changedDevice.address == deviceToCheck.address) { callbackCount++; if(callbackCount == expectedCount) { assert.equal(deviceToCheck[stateFunctionToTest](), expectedResult, 'Elk Sensor should show expected state: '+deviceToCheck.address); assert(deviceToCheck.lastChanged > startingChangedTimestamp, 'lastChanged property should have changed.') done(); } } } sendServerZoneCommand(isy, zoneId, command, function() {}); } describe('ISY Device change notifications', function() { var notifyFunc = null; function testChangeCallback(isy,device) { if(notifyFunc != null) { notifyFunc(device); } } var isy = null; beforeEach(function(done) { resetServerState(function() { isy = new ISY(testServerAddress, testServerUserName, testServerPassword, true, testChangeCallback, false, true); isy.initialize(done); }); }); describe('Dimmable light change notifications', function() { it('Light on and off state (non-dimmable)', function(done) { runTrueFalseTest(isy, sampleOnOffLight, 'getCurrentLightState', 'sendLightCommand', done); assert(!isy.getDevice(sampleOnOffLight).isDimmable, 'On off light should not be dimmable'); }); it('Light on and off state (dimmable)', function(done) { runTrueFalseTest(isy, sampleDimmableLight, 'getCurrentLightState', 'sendLightCommand', done); assert(isy.getDevice(sampleDimmableLight).isDimmable, 'On off light should not be dimmable'); }); it('Light on and off state (keybad dimmable button)', function(done) { runTrueFalseTest(isy, sampleKeypadDimmableButton, 'getCurrentLightState', 'sendLightCommand', done); }); it('Light on and off state (fanlinc light)', function(done) { runTrueFalseTest(isy, sampleKeypadDimmableButton, 'getCurrentLightState', 'sendLightCommand', done); }); it('Light on and off state (motion light)', function(done) { runTrueFalseTest(isy, sampleKeypadDimmableButton, 'getCurrentLightState', 'sendLightCommand', done); }); it('Light dim state change notification to 50%', function(done) { var deviceToCheck = isy.getDevice(sampleDimmableLight); var dimStateToExpect = 50; deviceToCheck.sendLightCommand(false, function() {}); notifyFunc = function (changedDevice) { if(changedDevice.address == deviceToCheck.address) { assert.equal(dimStateToExpect, deviceToCheck.getCurrentLightDimState(), 'Should have expected state for device: '+deviceToCheck.address); assert(deviceToCheck.getCurrentLightState(), 'Ensure light is on'); done(); } } deviceToCheck.sendLightDimCommand(dimStateToExpect, function() {}); }); it('Light dim state change notification to on has 100 dim level', function(done) { var deviceToCheck = isy.getDevice(sampleDimmableLight); notifyFunc = function (changedDevice) { if(changedDevice.address == deviceToCheck.address) { assert.equal(100, deviceToCheck.getCurrentLightDimState(), 'Should have expected state for device: '+deviceToCheck.address); assert(deviceToCheck.getCurrentLightState(), 'Ensure light is on'); done(); } } deviceToCheck.sendLightCommand(true, function() {}); }); it('Light dim state change notification to off has 0 dim level', function(done) { var deviceToCheck = isy.getDevice(sampleDimmableLight); var notifyCount = 0; notifyFunc = function (changedDevice) { if(changedDevice.address == deviceToCheck.address) { // Need to skip first notification as it is to turn the light on if(notifyCount > 0) { assert.equal(0, deviceToCheck.getCurrentLightDimState(), 'Should have expected state for device: '+deviceToCheck.address); assert(!deviceToCheck.getCurrentLightState(), 'Ensure light is on'); done(); } else { notifyCount++; } } } // Need to turn it on first as default state for this light is off deviceToCheck.sendLightCommand(true, function() {}); deviceToCheck.sendLightCommand(false, function() {}); }); }); describe('Locks', function() { it('Secure Lock locked and unlocked state', function(done) { runTrueFalseTest(isy, sampleZWaveLock, 'getCurrentLockState', 'sendLockCommand', done); }); it('MorningLinc Lock locked and unlocked state', function(done) { runTrueFalseTest(isy, sampleMorningLincLock, 'getCurrentLockState', 'sendLockCommand', done); }); }); describe('Sensors', function() { it('Insteon Motion Sensor Triggered', function(done) { runSensorTest(isy, sampleMotionSensorSensor, 'getCurrentMotionSensorState', done); }); it('Insteon Door Window Sensor from IOLinc', function(done) { runSensorTest(isy, sampleIOLincSensor, 'getCurrentDoorWindowState', done); }); it('Insteon Door Window Sensor', function(done) { runSensorTest(isy, sampleDoorWindowSensor, 'getCurrentDoorWindowState', done); }); }); describe('Outlets on and off2', function() { it('ApplianceLinc on and off', function(done) { assert.equal(isy.getDevice(sampleApplianceLinc).deviceType, 'Outlet', 'ApplianceLinc Should be an outlet'); runTrueFalseTest(isy, sampleApplianceLinc, 'getCurrentOutletState', 'sendOutletCommand', done); }); }); describe('Fan levels', function() { it('Set fan to low', function(done) { var deviceToCheck = isy.getDevice(sampleFanLincFan); runFanTest(isy, sampleFanLincFan, deviceToCheck.FAN_LEVEL_LOW, done); }); it('Set fan to med', function(done) { var deviceToCheck = isy.getDevice(sampleFanLincFan); runFanTest(isy, sampleFanLincFan, deviceToCheck.FAN_LEVEL_MEDIUM, done); }); it('Set fan to high', function(done) { var deviceToCheck = isy.getDevice(sampleFanLincFanOffState); runFanTest(isy, sampleFanLincFanOffState, deviceToCheck.FAN_LEVEL_HIGH, done); }); }); describe('Scenes', function() { it('Scene with all lights off turns them all on when scene is turned on and then turns them all off', function(done) { runSceneTest(isy, sampleSceneWithAllLightsOff, true, sampleSceneWithAllLightsOffAllImpacted, function() { runSceneTest(isy, sampleSceneWithAllLightsOff, false, sampleSceneWithAllLightsOffAllImpacted, done); }); }); }); describe('Elk Sensors', function() { it('Logical state change when you open then close', function(done) { runElkZoneTest(isy, "1", "OPEN", 1, 2, 'getLogicalState', function() { runElkZoneTest(isy, "1", "CLOSE", 1, 0,'getLogicalState', done); }); }); it('Physical state change when you open then close', function(done) { runElkZoneTest(isy, "1", "OPEN", 1, 1, 'getPhysicalState', function() { runElkZoneTest(isy, "1", "CLOSE", 1, 2, 'getPhysicalState', done); }); }); }); }); function runVariableTest(variableType, variableId, variableValue, done) { var initialTimeStamp = new Date(); function variableCheckCallback(isy, variable) { if(variable.id == variableId && variable.type == variableType) { assert.equal(variable.value, variableValue, "Variable should have been updated to expected value"); assert(variable.lastChanged > initialTimeStamp, "Variable last changed should have changed. Before: "+initialTimeStamp.toString()+" lastChanged: "+variable.lastChanged); done(); } } resetServerState(function() { var isy = new ISY(testServerAddress, testServerUserName, testServerPassword, true, function () { }, false, true, false, variableCheckCallback); isy.initialize(function() { var variable = isy.getVariable(variableType, variableId); assert(variable != null, "Should have found expected variable"); // Cheat and push back last changed date as this may run quick enough seconds haven't changed. variable.lastChanged.setFullYear(2012); initialTimeStamp = variable.lastChanged; setTimeout(function() { variable.sendSetValue(variableValue, function() {}); }, 2); }); }); } describe('ISY Variables', function() { describe('Variable enumeration', function () { it('Basic startup should work and right number of variables should be enumerated ', function (done) { var isy = new ISY(testServerAddress, testServerUserName, testServerPassword, true, function () { }, false, true); assert.doesNotThrow(function () { var type1Found = false; var type2Found = false; isy.initialize(function () { var type1Count = 0; var type2Count = 0; for(var index = 0; index < isy.getVariableList().length; index++) { var variable = isy.getVariableList()[index]; if(variable.type == '1' && sampleType1VariableId == variable.id) { assert.equal(variable.name, sampleType1VariableName, "Type 1 variable should have expected name"); type1Found = true; } if(variable.type == '2' && sampleType2VariableId == variable.id) { assert.equal(variable.name, sampleType2VariableName, "Type 2 variable name should have expected name"); type2Found = true; } if(variable.type == '1') { type1Count++; } else if(variable.type == '2') { type2Count++; } else { assert(false, "Should not have any non type 1 or type 2 variables" ); } } assert(type1Found, "Should have found expected type 1 variable"); assert(type2Found, "Should have found expected type 2 variable"); assert.equal(type1Count, expectedType1VariablesCount, "Variable type 1 count is not correct"); assert.equal(type2Count, expectedType2VariablesCount, "Variable type 2 count is not correct"); done(); }); }); }); }); describe('Handle no variables', function () { it('Basic startup should still work when no variables defined ', function (done) { setVariableFailureMode(true, function () { var isy = new ISY(testServerAddress, testServerUserName, testServerPassword, true, function () {}, false, true); assert.doesNotThrow(function () { isy.initialize(function () { assert(isy.getVariableList().length == 0, "Should have empty variable list"); setVariableFailureMode(false, function () { done(); }); }); }); }); }); }); describe('Variable roundtrip + notifications', function () { it('Type 1 variable roundtrip + notifications', function (done) { runVariableTest('1', sampleType1VariableId, 5, done); }); it('Type 2 variable roundtrip + notifications', function (done) { runVariableTest('2', sampleType1VariableId, 5, done); }); }); });