365 lines
13 KiB
JavaScript
365 lines
13 KiB
JavaScript
/* jshint -W097 */// jshint strict:false
|
|
/*jslint node: true */
|
|
'use strict';
|
|
const expect = require('chai').expect;
|
|
const setup = require(__dirname + '/lib/setup');
|
|
const request = require('request');
|
|
const http = require('http');
|
|
const fs = require('fs');
|
|
|
|
let objects = null;
|
|
let states = null;
|
|
let onStateChanged = null;
|
|
let onObjectChanged = null;
|
|
let sendToID = 1;
|
|
|
|
const adapterShortName = setup.adapterName.substring(setup.adapterName.indexOf('.')+1);
|
|
|
|
let httpServer;
|
|
let lastHTTPRequest = null;
|
|
|
|
function setupHTTPServer(port, callback) {
|
|
httpServer = http.createServer((req, res) => {
|
|
lastHTTPRequest = req.url;
|
|
console.log('HTTP Received: ' + lastHTTPRequest);
|
|
res.writeHead(200, {'Content-Type': 'text/plain'});
|
|
res.end('OK');
|
|
}).listen(port);
|
|
setTimeout(() => callback(), 5000);
|
|
}
|
|
|
|
function checkConnectionOfAdapter(cb, counter) {
|
|
counter = counter || 0;
|
|
console.log('Try check #' + counter);
|
|
if (counter > 30) {
|
|
if (cb) cb('Cannot check connection');
|
|
return;
|
|
}
|
|
|
|
states.getState('system.adapter.' + adapterShortName + '.0.alive', (err, state) => {
|
|
if (err) console.error(err);
|
|
if (state && state.val) {
|
|
if (cb) cb();
|
|
} else {
|
|
setTimeout(() => checkConnectionOfAdapter(cb, counter + 1), 1000);
|
|
}
|
|
});
|
|
}
|
|
|
|
function checkValueOfState(id, value, cb, counter) {
|
|
counter = counter || 0;
|
|
if (counter > 20) {
|
|
if (cb) cb('Cannot check value Of State ' + id);
|
|
return;
|
|
}
|
|
|
|
states.getState(id, (err, state) => {
|
|
if (err) console.error(err);
|
|
if (value === null && !state) {
|
|
if (cb) cb();
|
|
} else
|
|
if (state && (value === undefined || state.val === value)) {
|
|
if (cb) cb();
|
|
} else {
|
|
setTimeout(function () {
|
|
checkValueOfState(id, value, cb, counter + 1);
|
|
}, 500);
|
|
}
|
|
});
|
|
}
|
|
|
|
function sendTo(target, command, message, callback) {
|
|
onStateChanged = (id, state) => (id === 'messagebox.system.adapter.test.0') && callback(state.message);
|
|
|
|
states.pushMessage('system.adapter.' + target, {
|
|
command: command,
|
|
message: message,
|
|
from: 'system.adapter.test.0',
|
|
callback: {
|
|
message: message,
|
|
id: sendToID++,
|
|
ack: false,
|
|
time: Date.now()
|
|
}
|
|
});
|
|
}
|
|
|
|
describe('Test ' + adapterShortName + ' Wrapper adapter With-AccessoryInfo', () => {
|
|
before('Test ' + adapterShortName + ' Wrapper adapter With-AccessoryInfo: Start js-controller', function (_done) {
|
|
this.timeout(600000); // because of first install from npm
|
|
|
|
setup.setupController(() => {
|
|
const config = setup.getAdapterConfig();
|
|
// enable adapter
|
|
config.common.enabled = true;
|
|
config.common.loglevel = 'debug';
|
|
|
|
config.native.useGlobalHomebridge = false;
|
|
config.native.globalHomebridgeConfigPath = __dirname + "/homebridge/";
|
|
config.native.libraries = "homebridge-http-webhooks homebridge-sun-position";
|
|
config.native.ignoreInfoAccessoryServices = false;
|
|
config.native.wrapperConfig = {
|
|
"accessories": [
|
|
{
|
|
"accessory" : "SunPosition",
|
|
"name" : "Sun",
|
|
"location" : {
|
|
"lat" : 49.035924,
|
|
"long" : 8.345736
|
|
}
|
|
}
|
|
],
|
|
|
|
"platforms": [
|
|
{
|
|
"platform": "HttpWebHooks",
|
|
"webhook_port": "61828",
|
|
"cache_directory": "./.node-persist/storage",
|
|
"sensors": [
|
|
{
|
|
"id": "sensor1",
|
|
"name": "Sensor name 1",
|
|
"type": "contact"
|
|
},
|
|
{
|
|
"id": "sensor2",
|
|
"name": "Sensor name 2",
|
|
"type": "motion"
|
|
},
|
|
{
|
|
"id": "sensor3",
|
|
"name": "Sensor name 3",
|
|
"type": "occupancy"
|
|
},
|
|
{
|
|
"id": "sensor4",
|
|
"name": "Sensor name 4",
|
|
"type": "smoke"
|
|
},
|
|
{
|
|
"id": "sensor5",
|
|
"name": "Sensor name 5",
|
|
"type": "temperature"
|
|
},
|
|
{
|
|
"id": "sensor6",
|
|
"name": "Sensor name 6",
|
|
"type": "humidity"
|
|
},
|
|
{
|
|
"id": "sensor7",
|
|
"name": "Sensor name 7",
|
|
"type": "airquality"
|
|
},
|
|
{
|
|
"id": "sensor8",
|
|
"name": "Sensor name 8",
|
|
"type": "airquality"
|
|
}
|
|
],
|
|
"switches": [
|
|
{
|
|
"id": "switch1",
|
|
"name": "Switch name 1",
|
|
"on_url": "http://localhost:9080/switch1?on",
|
|
"on_method": "GET",
|
|
"off_url": "http://localhost:9080/switch1?off",
|
|
"off_method": "GET"
|
|
},
|
|
{
|
|
"id": "switch2",
|
|
"name": "Switch name 2",
|
|
"on_url": "http://localhost:9080/switch2?on",
|
|
"on_method": "GET",
|
|
"off_url": "http://localhost:9080/switch2?off",
|
|
"off_method": "GET"
|
|
},
|
|
{
|
|
"id": "switch3",
|
|
"name": "Switch name 3",
|
|
"on_url": "http://localhost:9080/switch3?on",
|
|
"on_method": "GET",
|
|
"off_url": "http://localhost:9080/switch3?off",
|
|
"off_method": "GET"
|
|
},
|
|
{
|
|
"id": "switch4",
|
|
"name": "Switch name*3",
|
|
"on_url": "http://localhost:9080/switch3-2?on",
|
|
"on_method": "GET",
|
|
"off_url": "http://localhost:9080/switch3-2?off",
|
|
"off_method": "GET"
|
|
}
|
|
],
|
|
"pushbuttons": [
|
|
{
|
|
"id": "pushbutton1",
|
|
"name": "Push button name 1",
|
|
"push_url": "http://localhost:9080/pushbutton1?push",
|
|
"push_method": "GET"
|
|
}
|
|
],
|
|
"lights": [
|
|
{
|
|
"id": "light1",
|
|
"name": "Light name 1",
|
|
"on_url": "http://localhost:9080/light1?on",
|
|
"on_method": "GET",
|
|
"off_url": "http://localhost:9080/light1?off",
|
|
"off_method": "GET"
|
|
}
|
|
],
|
|
"thermostats": [
|
|
{
|
|
"id": "thermostat1",
|
|
"name": "Thermostat name 1",
|
|
"set_target_temperature_url": "http://localhost:9080/thermostat1?targettemperature=%f",
|
|
"set_target_heating_cooling_state_url": "http://localhost:9080/thermostat1??targetstate=%b"
|
|
}
|
|
],
|
|
"outlets": [
|
|
{
|
|
"id": "outlet1",
|
|
"name": "Outlet name 1",
|
|
"on_url": "http://localhost:9080/outlet1?on",
|
|
"on_method": "GET",
|
|
"off_url": "http://localhost:9080/outlet1?off",
|
|
"off_method": "GET"
|
|
}
|
|
]
|
|
}
|
|
]
|
|
};
|
|
|
|
setup.setAdapterConfig(config.common, config.native);
|
|
|
|
setupHTTPServer(9080, () => {
|
|
setup.startController(
|
|
true,
|
|
(id, obj) => {},
|
|
(id, state) => {
|
|
if (onStateChanged) onStateChanged(id, state);
|
|
},
|
|
(_objects, _states) => {
|
|
objects = _objects;
|
|
states = _states;
|
|
_done();
|
|
});
|
|
});
|
|
});
|
|
});
|
|
|
|
it('Test ' + adapterShortName + ' Wrapper adapter With-AccessoryInfo: Check if adapter started', done => {
|
|
checkConnectionOfAdapter(res => {
|
|
if (res) console.log(res);
|
|
expect(res).not.to.be.equal('Cannot check connection');
|
|
objects.setObject('system.adapter.test.0', {
|
|
common: {
|
|
|
|
},
|
|
type: 'instance'
|
|
},
|
|
() => {
|
|
states.subscribeMessage('system.adapter.test.0');
|
|
done();
|
|
});
|
|
});
|
|
}).timeout(60000);
|
|
|
|
it('Test ' + adapterShortName + ' Wrapper adapter With-AccessoryInfo: Wait for npm installs', done => {
|
|
setTimeout(() => done(), 30000);
|
|
}).timeout(60000);
|
|
|
|
it('Test ' + adapterShortName + ' Wrapper: Verify Init', done => {
|
|
expect(fs.existsSync(__dirname + '/homebridge/config.json')).to.be.true;
|
|
states.getState(adapterShortName + '.0.Switch-name-1.Switch-name-1.On', (err, state) => {
|
|
expect(err).to.not.exist;
|
|
expect(state.val).to.be.false;
|
|
|
|
states.getState(adapterShortName + '.0.Sun.Accessory-Information.Model', (err, state) => {
|
|
expect(err).to.not.exist;
|
|
expect(state.val).to.be.equal('Sun Position');
|
|
|
|
states.getState(adapterShortName + '.0.Sun.Sun.Altitude', (err, state) => {
|
|
expect(err).to.not.exist;
|
|
expect(state.val).to.exist;
|
|
done();
|
|
});
|
|
});
|
|
});
|
|
}).timeout(10000);
|
|
|
|
it('Test ' + adapterShortName + ' Wrapper: Test Change from inside', done => {
|
|
request('http://localhost:61828/?accessoryId=switch1&state=true', (error, response, body) => {
|
|
expect(error).to.be.null;
|
|
expect(response && response.statusCode).to.be.equal(200);
|
|
|
|
setTimeout(function() {
|
|
expect(lastHTTPRequest).to.be.null;
|
|
states.getState(adapterShortName + '.0.Switch-name-1.Switch-name-1.On', (err, state) => {
|
|
expect(err).to.not.exist;
|
|
expect(state.val).to.be.true;
|
|
done();
|
|
});
|
|
}, 2000);
|
|
});
|
|
}).timeout(10000);
|
|
|
|
it('Test ' + adapterShortName + ' Wrapper: Test change via characteristic', done => {
|
|
states.setState(adapterShortName + '.0.Switch-name-1.Switch-name-1.On', {val: false, ack:false}, function (err) {
|
|
expect(err).to.not.exist;
|
|
|
|
setTimeout(function() {
|
|
expect(lastHTTPRequest).to.be.equal('/switch1?off');
|
|
states.getState(adapterShortName + '.0.Switch-name-1.Switch-name-1.On', (err, state) => {
|
|
expect(err).to.not.exist;
|
|
expect(state.val).to.be.false;
|
|
done();
|
|
});
|
|
}, 2000);
|
|
});
|
|
}).timeout(10000);
|
|
|
|
it('Test ' + adapterShortName + ' Wrapper: Test change via characteristic 2', done => {
|
|
states.setState(adapterShortName + '.0.Switch-name-1.Switch-name-1.On', {val: true, ack:false}, function (err) {
|
|
expect(err).to.not.exist;
|
|
|
|
setTimeout(function() {
|
|
expect(lastHTTPRequest).to.be.equal('/switch1?on');
|
|
states.getState(adapterShortName + '.0.Switch-name-1.Switch-name-1.On', (err, state) => {
|
|
expect(err).to.not.exist;
|
|
expect(state.val).to.be.true;
|
|
done();
|
|
});
|
|
}, 2000);
|
|
});
|
|
}).timeout(10000);
|
|
|
|
it('Test ' + adapterShortName + ' Wrapper: Test Change from inside 2', done => {
|
|
lastHTTPRequest = null;
|
|
request('http://localhost:61828/?accessoryId=switch1&state=false', (error, response, body) => {
|
|
expect(error).to.be.null;
|
|
expect(response && response.statusCode).to.be.equal(200);
|
|
|
|
setTimeout(function() {
|
|
expect(lastHTTPRequest).to.be.null;
|
|
states.getState(adapterShortName + '.0.Switch-name-1.Switch-name-1.On', (err, state) => {
|
|
expect(err).to.not.exist;
|
|
expect(state.val).to.be.false;
|
|
done();
|
|
});
|
|
}, 2000);
|
|
});
|
|
}).timeout(10000);
|
|
|
|
after('Test ' + adapterShortName + ' Wrapper adapter With-AccessoryInfo: Stop js-controller', function (done) {
|
|
this.timeout(10000);
|
|
|
|
setup.stopController(function (normalTerminated) {
|
|
console.log('Adapter normal terminated: ' + normalTerminated);
|
|
httpServer.close();
|
|
done();
|
|
});
|
|
});
|
|
});
|