Skip to content

Commit

Permalink
Converter definition runtime validation (Koenkk#2165)
Browse files Browse the repository at this point in the history
  • Loading branch information
nurikk authored Jan 27, 2021
1 parent 57d87bf commit 3033766
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 4 deletions.
20 changes: 20 additions & 0 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ const devices = require('./devices');
const exposes = require('./lib/exposes');
const toZigbee = require('./converters/toZigbee');
const fromZigbee = require('./converters/fromZigbee');
const assert = require('assert');

// key: zigbeeModel, value: array of definitions (most of the times 1)
const lookup = new Map();
Expand Down Expand Up @@ -36,7 +37,26 @@ function getFromLookup(zigbeeModel) {
return lookup.get(zigbeeModel);
}

const converterRequiredFields = {
model: 'String',
vendor: 'String',
description: 'String',
fromZigbee: 'Array',
toZigbee: 'Array',
exposes: 'Array',
};

function validateDefinition(definition) {
for (const [field, expectedType] of Object.entries(converterRequiredFields)) {
assert.notStrictEqual(null, definition[field], `Converter field ${field} is null`);
assert.notStrictEqual(undefined, definition[field], `Converter field ${field} is undefined`);
const msg = `Converter field ${field} expected type doenst match to ${definition[field]}`;
assert.strictEqual(definition[field].constructor.name, expectedType, msg);
}
}

function addDefinition(definition) {
validateDefinition(definition);
definitions.push(definition);

if (definition.hasOwnProperty('fingerprint')) {
Expand Down
17 changes: 13 additions & 4 deletions test/index.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -283,13 +283,22 @@ describe('index.js', () => {

it('Verify addDeviceDefinition', () => {
const mockZigbeeModel = 'my-mock-device';
const mockDevice = {
zigbeeModel: [mockZigbeeModel],
model: 'mock-model'
};
let mockDevice = {};
const undefinedDevice = index.findByZigbeeModel(mockDevice.model);
expect(undefinedDevice).toBeNull();
const beforeAdditionDeviceCount = index.devices.length;
expect(()=> index.addDeviceDefinition(mockDevice)).toThrow("Converter field model is undefined");
mockDevice.model = 'mock-model';
expect(()=> index.addDeviceDefinition(mockDevice)).toThrow("Converter field vendor is undefined");
mockDevice = {
model: 'mock-model',
vendor: 'dummy',
zigbeeModel: [mockZigbeeModel],
description: 'dummy',
fromZigbee: [],
toZigbee: [],
exposes: []
};
index.addDeviceDefinition(mockDevice);
expect(beforeAdditionDeviceCount + 1).toBe(index.devices.length);
const device = index.findByZigbeeModel(mockZigbeeModel);
Expand Down

0 comments on commit 3033766

Please sign in to comment.