UNPKG

@itentialopensource/adapter-cisco_prime

Version:

This adapter integrates with system described as: cisco prime

963 lines (918 loc) 416 kB
/* @copyright Itential, LLC 2019 (pre-modifications) */ // Set globals /* global describe it log pronghornProps */ /* eslint global-require: warn */ /* eslint no-unused-vars: warn */ /* eslint import/no-dynamic-require:warn */ // include required items for testing & logging const assert = require('assert'); const path = require('path'); const util = require('util'); const execute = require('child_process').execSync; const fs = require('fs-extra'); const mocha = require('mocha'); const winston = require('winston'); const { expect } = require('chai'); const { use } = require('chai'); const td = require('testdouble'); const Ajv = require('ajv'); const ajv = new Ajv({ strictSchema: false, allErrors: true, allowUnionTypes: true }); const anything = td.matchers.anything(); let logLevel = 'none'; const isRapidFail = false; // read in the properties from the sampleProperties files let adaptdir = __dirname; if (adaptdir.endsWith('/test/integration')) { adaptdir = adaptdir.substring(0, adaptdir.length - 17); } else if (adaptdir.endsWith('/test/unit')) { adaptdir = adaptdir.substring(0, adaptdir.length - 10); } const samProps = require(`${adaptdir}/sampleProperties.json`).properties; // these variables can be changed to run in integrated mode so easier to set them here // always check these in with bogus data!!! samProps.stub = true; samProps.host = 'replace.hostorip.here'; samProps.authentication.username = 'username'; samProps.authentication.password = 'password'; samProps.protocol = 'http'; samProps.port = 80; samProps.ssl.enabled = false; samProps.ssl.accept_invalid_cert = false; samProps.request.attempt_timeout = 1200000; const attemptTimeout = samProps.request.attempt_timeout; const { stub } = samProps; // these are the adapter properties. You generally should not need to alter // any of these after they are initially set up global.pronghornProps = { pathProps: { encrypted: false }, adapterProps: { adapters: [{ id: 'Test-cisco_prime', type: 'CiscoPrime', properties: samProps }] } }; global.$HOME = `${__dirname}/../..`; // set the log levels that Pronghorn uses, spam and trace are not defaulted in so without // this you may error on log.trace calls. const myCustomLevels = { levels: { spam: 6, trace: 5, debug: 4, info: 3, warn: 2, error: 1, none: 0 } }; // need to see if there is a log level passed in process.argv.forEach((val) => { // is there a log level defined to be passed in? if (val.indexOf('--LOG') === 0) { // get the desired log level const inputVal = val.split('=')[1]; // validate the log level is supported, if so set it if (Object.hasOwnProperty.call(myCustomLevels.levels, inputVal)) { logLevel = inputVal; } } }); // need to set global logging global.log = winston.createLogger({ level: logLevel, levels: myCustomLevels.levels, transports: [ new winston.transports.Console() ] }); /** * Runs the error asserts for the test */ function runErrorAsserts(data, error, code, origin, displayStr) { assert.equal(null, data); assert.notEqual(undefined, error); assert.notEqual(null, error); assert.notEqual(undefined, error.IAPerror); assert.notEqual(null, error.IAPerror); assert.notEqual(undefined, error.IAPerror.displayString); assert.notEqual(null, error.IAPerror.displayString); assert.equal(code, error.icode); assert.equal(origin, error.IAPerror.origin); assert.equal(displayStr, error.IAPerror.displayString); } // require the adapter that we are going to be using const CiscoPrime = require('../../adapter'); // delete the .DS_Store directory in entities -- otherwise this will cause errors const dirPath = path.join(__dirname, '../../entities/.DS_Store'); if (fs.existsSync(dirPath)) { try { fs.removeSync(dirPath); console.log('.DS_Store deleted'); } catch (e) { console.log('Error when deleting .DS_Store:', e); } } // begin the testing - these should be pretty well defined between the describe and the it! describe('[unit] Cisco_prime Adapter Test', () => { describe('CiscoPrime Class Tests', () => { const a = new CiscoPrime( pronghornProps.adapterProps.adapters[0].id, pronghornProps.adapterProps.adapters[0].properties ); if (isRapidFail) { const state = {}; state.passed = true; mocha.afterEach(function x() { state.passed = state.passed && (this.currentTest.state === 'passed'); }); mocha.beforeEach(function x() { if (!state.passed) { return this.currentTest.skip(); } return true; }); } describe('#class instance created', () => { it('should be a class with properties', (done) => { try { assert.notEqual(null, a); assert.notEqual(undefined, a); const checkId = global.pronghornProps.adapterProps.adapters[0].id; assert.equal(checkId, a.id); assert.notEqual(null, a.allProps); const check = global.pronghornProps.adapterProps.adapters[0].properties.healthcheck.type; assert.equal(check, a.healthcheckType); done(); } catch (error) { log.error(`Test Failure: ${error}`); done(error); } }).timeout(attemptTimeout); }); describe('adapterBase.js', () => { it('should have an adapterBase.js', (done) => { try { fs.exists('adapterBase.js', (val) => { assert.equal(true, val); done(); }); } catch (error) { log.error(`Test Failure: ${error}`); done(error); } }); }); let wffunctions = []; describe('#iapGetAdapterWorkflowFunctions', () => { it('should retrieve workflow functions', (done) => { try { wffunctions = a.iapGetAdapterWorkflowFunctions([]); try { assert.notEqual(0, wffunctions.length); done(); } catch (err) { log.error(`Test Failure: ${err}`); done(err); } } catch (error) { log.error(`Adapter Exception: ${error}`); done(error); } }).timeout(attemptTimeout); }); describe('package.json', () => { it('should have a package.json', (done) => { try { fs.exists('package.json', (val) => { assert.equal(true, val); done(); }); } catch (error) { log.error(`Test Failure: ${error}`); done(error); } }); it('package.json should be validated', (done) => { try { const packageDotJson = require('../../package.json'); // Define the JSON schema for package.json const packageJsonSchema = { type: 'object', properties: { name: { type: 'string' }, version: { type: 'string' } // May need to add more properties as needed }, required: ['name', 'version'] }; const validate = ajv.compile(packageJsonSchema); const isValid = validate(packageDotJson); if (isValid === false) { log.error('The package.json contains errors'); assert.equal(true, isValid); } else { assert.equal(true, isValid); } done(); } catch (error) { log.error(`Test Failure: ${error}`); done(error); } }); it('package.json standard fields should be customized', (done) => { try { const packageDotJson = require('../../package.json'); assert.notEqual(-1, packageDotJson.name.indexOf('cisco_prime')); assert.notEqual(undefined, packageDotJson.version); assert.notEqual(null, packageDotJson.version); assert.notEqual('', packageDotJson.version); assert.notEqual(undefined, packageDotJson.description); assert.notEqual(null, packageDotJson.description); assert.notEqual('', packageDotJson.description); assert.equal('adapter.js', packageDotJson.main); assert.notEqual(undefined, packageDotJson.wizardVersion); assert.notEqual(null, packageDotJson.wizardVersion); assert.notEqual('', packageDotJson.wizardVersion); assert.notEqual(undefined, packageDotJson.engineVersion); assert.notEqual(null, packageDotJson.engineVersion); assert.notEqual('', packageDotJson.engineVersion); assert.equal('http', packageDotJson.adapterType); done(); } catch (error) { log.error(`Test Failure: ${error}`); done(error); } }); it('package.json proper scripts should be provided', (done) => { try { const packageDotJson = require('../../package.json'); assert.notEqual(undefined, packageDotJson.scripts); assert.notEqual(null, packageDotJson.scripts); assert.notEqual('', packageDotJson.scripts); assert.equal('node utils/setup.js', packageDotJson.scripts.preinstall); assert.equal('node --max_old_space_size=4096 ./node_modules/eslint/bin/eslint.js . --ext .json --ext .js', packageDotJson.scripts.lint); assert.equal('node --max_old_space_size=4096 ./node_modules/eslint/bin/eslint.js . --ext .json --ext .js --quiet', packageDotJson.scripts['lint:errors']); assert.equal('mocha test/unit/adapterBaseTestUnit.js --LOG=error', packageDotJson.scripts['test:baseunit']); assert.equal('mocha test/unit/adapterTestUnit.js --LOG=error', packageDotJson.scripts['test:unit']); assert.equal('mocha test/integration/adapterTestIntegration.js --LOG=error', packageDotJson.scripts['test:integration']); assert.equal('npm run test:baseunit && npm run test:unit && npm run test:integration', packageDotJson.scripts.test); assert.equal('npm publish --registry=https://registry.npmjs.org --access=public', packageDotJson.scripts.deploy); assert.equal('npm run deploy', packageDotJson.scripts.build); done(); } catch (error) { log.error(`Test Failure: ${error}`); done(error); } }); it('package.json proper directories should be provided', (done) => { try { const packageDotJson = require('../../package.json'); assert.notEqual(undefined, packageDotJson.repository); assert.notEqual(null, packageDotJson.repository); assert.notEqual('', packageDotJson.repository); assert.equal('git', packageDotJson.repository.type); assert.equal('git@gitlab.com:itentialopensource/adapters/', packageDotJson.repository.url.substring(0, 43)); assert.equal('https://gitlab.com/itentialopensource/adapters/', packageDotJson.homepage.substring(0, 47)); done(); } catch (error) { log.error(`Test Failure: ${error}`); done(error); } }); it('package.json proper dependencies should be provided', (done) => { try { const packageDotJson = require('../../package.json'); assert.notEqual(undefined, packageDotJson.dependencies); assert.notEqual(null, packageDotJson.dependencies); assert.notEqual('', packageDotJson.dependencies); assert.equal('^8.17.1', packageDotJson.dependencies.ajv); assert.equal('^1.8.2', packageDotJson.dependencies.axios); assert.equal('^11.0.0', packageDotJson.dependencies.commander); assert.equal('^11.2.0', packageDotJson.dependencies['fs-extra']); assert.equal('^10.8.2', packageDotJson.dependencies.mocha); assert.equal('^2.0.1', packageDotJson.dependencies['mocha-param']); assert.equal('^0.4.4', packageDotJson.dependencies.ping); assert.equal('^1.4.10', packageDotJson.dependencies['readline-sync']); assert.equal('^7.6.3', packageDotJson.dependencies.semver); assert.equal('^3.17.0', packageDotJson.dependencies.winston); done(); } catch (error) { log.error(`Test Failure: ${error}`); done(error); } }); it('package.json proper dev dependencies should be provided', (done) => { try { const packageDotJson = require('../../package.json'); assert.notEqual(undefined, packageDotJson.devDependencies); assert.notEqual(null, packageDotJson.devDependencies); assert.notEqual('', packageDotJson.devDependencies); assert.equal('^4.3.7', packageDotJson.devDependencies.chai); assert.equal('^8.44.0', packageDotJson.devDependencies.eslint); assert.equal('^15.0.0', packageDotJson.devDependencies['eslint-config-airbnb-base']); assert.equal('^2.27.5', packageDotJson.devDependencies['eslint-plugin-import']); assert.equal('^3.1.0', packageDotJson.devDependencies['eslint-plugin-json']); assert.equal('^3.18.0', packageDotJson.devDependencies.testdouble); done(); } catch (error) { log.error(`Test Failure: ${error}`); done(error); } }); }); describe('pronghorn.json', () => { it('should have a pronghorn.json', (done) => { try { fs.exists('pronghorn.json', (val) => { assert.equal(true, val); done(); }); } catch (error) { log.error(`Test Failure: ${error}`); done(error); } }); it('pronghorn.json should be customized', (done) => { try { const pronghornDotJson = require('../../pronghorn.json'); assert.notEqual(-1, pronghornDotJson.id.indexOf('cisco_prime')); assert.equal('Adapter', pronghornDotJson.type); assert.equal('CiscoPrime', pronghornDotJson.export); assert.equal('Cisco_prime', pronghornDotJson.title); assert.equal('adapter.js', pronghornDotJson.src); done(); } catch (error) { log.error(`Test Failure: ${error}`); done(error); } }); it('pronghorn.json should contain generic adapter methods', (done) => { try { const pronghornDotJson = require('../../pronghorn.json'); assert.notEqual(undefined, pronghornDotJson.methods); assert.notEqual(null, pronghornDotJson.methods); assert.notEqual('', pronghornDotJson.methods); assert.equal(true, Array.isArray(pronghornDotJson.methods)); assert.notEqual(0, pronghornDotJson.methods.length); assert.notEqual(undefined, pronghornDotJson.methods.find((e) => e.name === 'iapUpdateAdapterConfiguration')); assert.notEqual(undefined, pronghornDotJson.methods.find((e) => e.name === 'iapSuspendAdapter')); assert.notEqual(undefined, pronghornDotJson.methods.find((e) => e.name === 'iapUnsuspendAdapter')); assert.notEqual(undefined, pronghornDotJson.methods.find((e) => e.name === 'iapGetAdapterQueue')); assert.notEqual(undefined, pronghornDotJson.methods.find((e) => e.name === 'iapFindAdapterPath')); assert.notEqual(undefined, pronghornDotJson.methods.find((e) => e.name === 'iapTroubleshootAdapter')); assert.notEqual(undefined, pronghornDotJson.methods.find((e) => e.name === 'iapRunAdapterHealthcheck')); assert.notEqual(undefined, pronghornDotJson.methods.find((e) => e.name === 'iapRunAdapterConnectivity')); assert.notEqual(undefined, pronghornDotJson.methods.find((e) => e.name === 'iapRunAdapterBasicGet')); assert.notEqual(undefined, pronghornDotJson.methods.find((e) => e.name === 'iapMoveAdapterEntitiesToDB')); assert.notEqual(undefined, pronghornDotJson.methods.find((e) => e.name === 'iapDeactivateTasks')); assert.notEqual(undefined, pronghornDotJson.methods.find((e) => e.name === 'iapActivateTasks')); assert.notEqual(undefined, pronghornDotJson.methods.find((e) => e.name === 'iapPopulateEntityCache')); assert.notEqual(undefined, pronghornDotJson.methods.find((e) => e.name === 'iapRetrieveEntitiesCache')); assert.notEqual(undefined, pronghornDotJson.methods.find((e) => e.name === 'getDevice')); assert.notEqual(undefined, pronghornDotJson.methods.find((e) => e.name === 'getDevicesFiltered')); assert.notEqual(undefined, pronghornDotJson.methods.find((e) => e.name === 'isAlive')); assert.notEqual(undefined, pronghornDotJson.methods.find((e) => e.name === 'getConfig')); assert.notEqual(undefined, pronghornDotJson.methods.find((e) => e.name === 'iapGetDeviceCount')); assert.notEqual(undefined, pronghornDotJson.methods.find((e) => e.name === 'iapExpandedGenericAdapterRequest')); assert.notEqual(undefined, pronghornDotJson.methods.find((e) => e.name === 'genericAdapterRequest')); assert.notEqual(undefined, pronghornDotJson.methods.find((e) => e.name === 'genericAdapterRequestNoBasePath')); assert.notEqual(undefined, pronghornDotJson.methods.find((e) => e.name === 'iapRunAdapterLint')); assert.notEqual(undefined, pronghornDotJson.methods.find((e) => e.name === 'iapRunAdapterTests')); assert.notEqual(undefined, pronghornDotJson.methods.find((e) => e.name === 'iapGetAdapterInventory')); done(); } catch (error) { log.error(`Test Failure: ${error}`); done(error); } }); it('pronghorn.json should only expose workflow functions', (done) => { try { const pronghornDotJson = require('../../pronghorn.json'); for (let m = 0; m < pronghornDotJson.methods.length; m += 1) { let found = false; let paramissue = false; for (let w = 0; w < wffunctions.length; w += 1) { if (pronghornDotJson.methods[m].name === wffunctions[w]) { found = true; const methLine = execute(`grep " ${wffunctions[w]}(" adapter.js | grep "callback) {"`).toString(); let wfparams = []; if (methLine && methLine.indexOf('(') >= 0 && methLine.indexOf(')') >= 0) { const temp = methLine.substring(methLine.indexOf('(') + 1, methLine.lastIndexOf(')')); wfparams = temp.split(','); for (let t = 0; t < wfparams.length; t += 1) { // remove default value from the parameter name wfparams[t] = wfparams[t].substring(0, wfparams[t].search(/=/) > 0 ? wfparams[t].search(/#|\?|=/) : wfparams[t].length); // remove spaces wfparams[t] = wfparams[t].trim(); if (wfparams[t] === 'callback') { wfparams.splice(t, 1); } } } // if there are inputs defined but not on the method line if (wfparams.length === 0 && (pronghornDotJson.methods[m].input && pronghornDotJson.methods[m].input.length > 0)) { paramissue = true; } else if (wfparams.length > 0 && (!pronghornDotJson.methods[m].input || pronghornDotJson.methods[m].input.length === 0)) { // if there are no inputs defined but there are on the method line paramissue = true; } else { for (let p = 0; p < pronghornDotJson.methods[m].input.length; p += 1) { let pfound = false; for (let wfp = 0; wfp < wfparams.length; wfp += 1) { if (pronghornDotJson.methods[m].input[p].name.toUpperCase() === wfparams[wfp].toUpperCase()) { pfound = true; } } if (!pfound) { paramissue = true; } } for (let wfp = 0; wfp < wfparams.length; wfp += 1) { let pfound = false; for (let p = 0; p < pronghornDotJson.methods[m].input.length; p += 1) { if (pronghornDotJson.methods[m].input[p].name.toUpperCase() === wfparams[wfp].toUpperCase()) { pfound = true; } } if (!pfound) { paramissue = true; } } } break; } } if (!found) { // this is the reason to go through both loops - log which ones are not found so // they can be worked log.error(`${pronghornDotJson.methods[m].name} not found in workflow functions`); } if (paramissue) { // this is the reason to go through both loops - log which ones are not found so // they can be worked log.error(`${pronghornDotJson.methods[m].name} has a parameter mismatch`); } assert.equal(true, found); assert.equal(false, paramissue); } done(); } catch (error) { log.error(`Adapter Exception: ${error}`); done(error); } }).timeout(attemptTimeout); it('pronghorn.json should expose all workflow functions', (done) => { try { const pronghornDotJson = require('../../pronghorn.json'); for (let w = 0; w < wffunctions.length; w += 1) { let found = false; for (let m = 0; m < pronghornDotJson.methods.length; m += 1) { if (pronghornDotJson.methods[m].name === wffunctions[w]) { found = true; break; } } if (!found) { // this is the reason to go through both loops - log which ones are not found so // they can be worked log.error(`${wffunctions[w]} not found in pronghorn.json`); } assert.equal(true, found); } done(); } catch (error) { log.error(`Adapter Exception: ${error}`); done(error); } }); it('pronghorn.json verify input/output schema objects', (done) => { const verifySchema = (methodName, schema) => { try { ajv.compile(schema); } catch (error) { const errorMessage = `Invalid schema found in '${methodName}' method. Schema => ${JSON.stringify(schema)}. Details => ${error.message}`; throw new Error(errorMessage); } }; try { const pronghornDotJson = require('../../pronghorn.json'); const { methods } = pronghornDotJson; for (let i = 0; i < methods.length; i += 1) { for (let j = 0; j < methods[i].input.length; j += 1) { const inputSchema = methods[i].input[j].schema; if (inputSchema) { verifySchema(methods[i].name, inputSchema); } } const outputSchema = methods[i].output.schema; if (outputSchema) { verifySchema(methods[i].name, outputSchema); } } done(); } catch (error) { log.error(`Adapter Exception: ${error}`); done(error); } }).timeout(attemptTimeout); }); describe('propertiesSchema.json', () => { it('should have a propertiesSchema.json', (done) => { try { fs.exists('propertiesSchema.json', (val) => { assert.equal(true, val); done(); }); } catch (error) { log.error(`Test Failure: ${error}`); done(error); } }); it('propertiesSchema.json should be customized', (done) => { try { const propertiesDotJson = require('../../propertiesSchema.json'); assert.equal('adapter-cisco_prime', propertiesDotJson.$id); assert.equal('object', propertiesDotJson.type); assert.equal('http://json-schema.org/draft-07/schema#', propertiesDotJson.$schema); done(); } catch (error) { log.error(`Test Failure: ${error}`); done(error); } }); it('propertiesSchema.json should contain generic adapter properties', (done) => { try { const propertiesDotJson = require('../../propertiesSchema.json'); assert.notEqual(undefined, propertiesDotJson.properties); assert.notEqual(null, propertiesDotJson.properties); assert.notEqual('', propertiesDotJson.properties); assert.equal('string', propertiesDotJson.properties.host.type); assert.equal('integer', propertiesDotJson.properties.port.type); assert.equal('boolean', propertiesDotJson.properties.stub.type); assert.equal('string', propertiesDotJson.properties.protocol.type); assert.notEqual(undefined, propertiesDotJson.definitions.authentication); assert.notEqual(null, propertiesDotJson.definitions.authentication); assert.notEqual('', propertiesDotJson.definitions.authentication); assert.equal('string', propertiesDotJson.definitions.authentication.properties.auth_method.type); assert.equal('string', propertiesDotJson.definitions.authentication.properties.username.type); assert.equal('string', propertiesDotJson.definitions.authentication.properties.password.type); assert.equal('string', propertiesDotJson.definitions.authentication.properties.token.type); assert.equal('integer', propertiesDotJson.definitions.authentication.properties.invalid_token_error.type); assert.equal('integer', propertiesDotJson.definitions.authentication.properties.token_timeout.type); assert.equal('string', propertiesDotJson.definitions.authentication.properties.token_cache.type); assert.equal(true, Array.isArray(propertiesDotJson.definitions.authentication.properties.auth_field.type)); assert.equal(true, Array.isArray(propertiesDotJson.definitions.authentication.properties.auth_field_format.type)); assert.equal('boolean', propertiesDotJson.definitions.authentication.properties.auth_logging.type); assert.equal('string', propertiesDotJson.definitions.authentication.properties.client_id.type); assert.equal('string', propertiesDotJson.definitions.authentication.properties.client_secret.type); assert.equal('string', propertiesDotJson.definitions.authentication.properties.grant_type.type); assert.notEqual(undefined, propertiesDotJson.definitions.ssl); assert.notEqual(null, propertiesDotJson.definitions.ssl); assert.notEqual('', propertiesDotJson.definitions.ssl); assert.equal('string', propertiesDotJson.definitions.ssl.properties.ecdhCurve.type); assert.equal('boolean', propertiesDotJson.definitions.ssl.properties.enabled.type); assert.equal('boolean', propertiesDotJson.definitions.ssl.properties.accept_invalid_cert.type); assert.equal('string', propertiesDotJson.definitions.ssl.properties.ca_file.type); assert.equal('string', propertiesDotJson.definitions.ssl.properties.key_file.type); assert.equal('string', propertiesDotJson.definitions.ssl.properties.cert_file.type); assert.equal('string', propertiesDotJson.definitions.ssl.properties.secure_protocol.type); assert.equal('string', propertiesDotJson.definitions.ssl.properties.ciphers.type); assert.equal('string', propertiesDotJson.properties.base_path.type); assert.equal('string', propertiesDotJson.properties.version.type); assert.equal('string', propertiesDotJson.properties.cache_location.type); assert.equal('boolean', propertiesDotJson.properties.encode_pathvars.type); assert.equal('boolean', propertiesDotJson.properties.encode_queryvars.type); assert.equal(true, Array.isArray(propertiesDotJson.properties.save_metric.type)); assert.notEqual(undefined, propertiesDotJson.definitions); assert.notEqual(null, propertiesDotJson.definitions); assert.notEqual('', propertiesDotJson.definitions); assert.notEqual(undefined, propertiesDotJson.definitions.healthcheck); assert.notEqual(null, propertiesDotJson.definitions.healthcheck); assert.notEqual('', propertiesDotJson.definitions.healthcheck); assert.equal('string', propertiesDotJson.definitions.healthcheck.properties.type.type); assert.equal('integer', propertiesDotJson.definitions.healthcheck.properties.frequency.type); assert.equal('object', propertiesDotJson.definitions.healthcheck.properties.query_object.type); assert.notEqual(undefined, propertiesDotJson.definitions.throttle); assert.notEqual(null, propertiesDotJson.definitions.throttle); assert.notEqual('', propertiesDotJson.definitions.throttle); assert.equal('boolean', propertiesDotJson.definitions.throttle.properties.throttle_enabled.type); assert.equal('integer', propertiesDotJson.definitions.throttle.properties.number_pronghorns.type); assert.equal('string', propertiesDotJson.definitions.throttle.properties.sync_async.type); assert.equal('integer', propertiesDotJson.definitions.throttle.properties.max_in_queue.type); assert.equal('integer', propertiesDotJson.definitions.throttle.properties.concurrent_max.type); assert.equal('integer', propertiesDotJson.definitions.throttle.properties.expire_timeout.type); assert.equal('integer', propertiesDotJson.definitions.throttle.properties.avg_runtime.type); assert.equal('array', propertiesDotJson.definitions.throttle.properties.priorities.type); assert.notEqual(undefined, propertiesDotJson.definitions.request); assert.notEqual(null, propertiesDotJson.definitions.request); assert.notEqual('', propertiesDotJson.definitions.request); assert.equal('integer', propertiesDotJson.definitions.request.properties.number_redirects.type); assert.equal('integer', propertiesDotJson.definitions.request.properties.number_retries.type); assert.equal(true, Array.isArray(propertiesDotJson.definitions.request.properties.limit_retry_error.type)); assert.equal('array', propertiesDotJson.definitions.request.properties.failover_codes.type); assert.equal('integer', propertiesDotJson.definitions.request.properties.attempt_timeout.type); assert.equal('object', propertiesDotJson.definitions.request.properties.global_request.type); assert.equal('object', propertiesDotJson.definitions.request.properties.global_request.properties.payload.type); assert.equal('object', propertiesDotJson.definitions.request.properties.global_request.properties.uriOptions.type); assert.equal('object', propertiesDotJson.definitions.request.properties.global_request.properties.addlHeaders.type); assert.equal('object', propertiesDotJson.definitions.request.properties.global_request.properties.authData.type); assert.equal('boolean', propertiesDotJson.definitions.request.properties.healthcheck_on_timeout.type); assert.equal('boolean', propertiesDotJson.definitions.request.properties.return_raw.type); assert.equal('boolean', propertiesDotJson.definitions.request.properties.archiving.type); assert.equal('boolean', propertiesDotJson.definitions.request.properties.return_request.type); assert.notEqual(undefined, propertiesDotJson.definitions.proxy); assert.notEqual(null, propertiesDotJson.definitions.proxy); assert.notEqual('', propertiesDotJson.definitions.proxy); assert.equal('boolean', propertiesDotJson.definitions.proxy.properties.enabled.type); assert.equal('string', propertiesDotJson.definitions.proxy.properties.host.type); assert.equal('integer', propertiesDotJson.definitions.proxy.properties.port.type); assert.equal('string', propertiesDotJson.definitions.proxy.properties.protocol.type); assert.equal('string', propertiesDotJson.definitions.proxy.properties.username.type); assert.equal('string', propertiesDotJson.definitions.proxy.properties.password.type); assert.notEqual(undefined, propertiesDotJson.definitions.mongo); assert.notEqual(null, propertiesDotJson.definitions.mongo); assert.notEqual('', propertiesDotJson.definitions.mongo); assert.equal('string', propertiesDotJson.definitions.mongo.properties.host.type); assert.equal('integer', propertiesDotJson.definitions.mongo.properties.port.type); assert.equal('string', propertiesDotJson.definitions.mongo.properties.database.type); assert.equal('string', propertiesDotJson.definitions.mongo.properties.username.type); assert.equal('string', propertiesDotJson.definitions.mongo.properties.password.type); assert.equal('string', propertiesDotJson.definitions.mongo.properties.replSet.type); assert.equal('object', propertiesDotJson.definitions.mongo.properties.db_ssl.type); assert.equal('boolean', propertiesDotJson.definitions.mongo.properties.db_ssl.properties.enabled.type); assert.equal('boolean', propertiesDotJson.definitions.mongo.properties.db_ssl.properties.accept_invalid_cert.type); assert.equal('string', propertiesDotJson.definitions.mongo.properties.db_ssl.properties.ca_file.type); assert.equal('string', propertiesDotJson.definitions.mongo.properties.db_ssl.properties.key_file.type); assert.equal('string', propertiesDotJson.definitions.mongo.properties.db_ssl.properties.cert_file.type); assert.notEqual('', propertiesDotJson.definitions.devicebroker); assert.equal('array', propertiesDotJson.definitions.devicebroker.properties.getDevice.type); assert.equal('array', propertiesDotJson.definitions.devicebroker.properties.getDevicesFiltered.type); assert.equal('array', propertiesDotJson.definitions.devicebroker.properties.isAlive.type); assert.equal('array', propertiesDotJson.definitions.devicebroker.properties.getConfig.type); assert.equal('array', propertiesDotJson.definitions.devicebroker.properties.getCount.type); done(); } catch (error) { log.error(`Test Failure: ${error}`); done(error); } }); }); describe('error.json', () => { it('should have an error.json', (done) => { try { fs.exists('error.json', (val) => { assert.equal(true, val); done(); }); } catch (error) { log.error(`Test Failure: ${error}`); done(error); } }); it('error.json should have standard adapter errors', (done) => { try { const errorDotJson = require('../../error.json'); assert.notEqual(undefined, errorDotJson.errors); assert.notEqual(null, errorDotJson.errors); assert.notEqual('', errorDotJson.errors); assert.equal(true, Array.isArray(errorDotJson.errors)); assert.notEqual(0, errorDotJson.errors.length); assert.notEqual(undefined, errorDotJson.errors.find((e) => e.icode === 'AD.100')); assert.notEqual(undefined, errorDotJson.errors.find((e) => e.icode === 'AD.101')); assert.notEqual(undefined, errorDotJson.errors.find((e) => e.icode === 'AD.102')); assert.notEqual(undefined, errorDotJson.errors.find((e) => e.icode === 'AD.110')); assert.notEqual(undefined, errorDotJson.errors.find((e) => e.icode === 'AD.111')); assert.notEqual(undefined, errorDotJson.errors.find((e) => e.icode === 'AD.112')); assert.notEqual(undefined, errorDotJson.errors.find((e) => e.icode === 'AD.113')); assert.notEqual(undefined, errorDotJson.errors.find((e) => e.icode === 'AD.114')); assert.notEqual(undefined, errorDotJson.errors.find((e) => e.icode === 'AD.115')); assert.notEqual(undefined, errorDotJson.errors.find((e) => e.icode === 'AD.116')); assert.notEqual(undefined, errorDotJson.errors.find((e) => e.icode === 'AD.300')); assert.notEqual(undefined, errorDotJson.errors.find((e) => e.icode === 'AD.301')); assert.notEqual(undefined, errorDotJson.errors.find((e) => e.icode === 'AD.302')); assert.notEqual(undefined, errorDotJson.errors.find((e) => e.icode === 'AD.303')); assert.notEqual(undefined, errorDotJson.errors.find((e) => e.icode === 'AD.304')); assert.notEqual(undefined, errorDotJson.errors.find((e) => e.icode === 'AD.305')); assert.notEqual(undefined, errorDotJson.errors.find((e) => e.icode === 'AD.310')); assert.notEqual(undefined, errorDotJson.errors.find((e) => e.icode === 'AD.311')); assert.notEqual(undefined, errorDotJson.errors.find((e) => e.icode === 'AD.312')); assert.notEqual(undefined, errorDotJson.errors.find((e) => e.icode === 'AD.320')); assert.notEqual(undefined, errorDotJson.errors.find((e) => e.icode === 'AD.321')); assert.notEqual(undefined, errorDotJson.errors.find((e) => e.icode === 'AD.400')); assert.notEqual(undefined, errorDotJson.errors.find((e) => e.icode === 'AD.401')); assert.notEqual(undefined, errorDotJson.errors.find((e) => e.icode === 'AD.402')); assert.notEqual(undefined, errorDotJson.errors.find((e) => e.icode === 'AD.500')); assert.notEqual(undefined, errorDotJson.errors.find((e) => e.icode === 'AD.501')); assert.notEqual(undefined, errorDotJson.errors.find((e) => e.icode === 'AD.502')); assert.notEqual(undefined, errorDotJson.errors.find((e) => e.icode === 'AD.503')); assert.notEqual(undefined, errorDotJson.errors.find((e) => e.icode === 'AD.600')); assert.notEqual(undefined, errorDotJson.errors.find((e) => e.icode === 'AD.900')); done(); } catch (error) { log.error(`Test Failure: ${error}`); done(error); } }); }); describe('sampleProperties.json', () => { it('should have a sampleProperties.json', (done) => { try { fs.exists('sampleProperties.json', (val) => { assert.equal(true, val); done(); }); } catch (error) { log.error(`Test Failure: ${error}`); done(error); } }); it('sampleProperties.json should contain generic adapter properties', (done) => { try { const sampleDotJson = require('../../sampleProperties.json'); assert.notEqual(-1, sampleDotJson.id.indexOf('cisco_prime')); assert.equal('CiscoPrime', sampleDotJson.type); assert.notEqual(undefined, sampleDotJson.properties); assert.notEqual(null, sampleDotJson.properties); assert.notEqual('', sampleDotJson.properties); assert.notEqual(undefined, sampleDotJson.properties.host); assert.notEqual(undefined, sampleDotJson.properties.port); assert.notEqual(undefined, sampleDotJson.properties.stub); assert.notEqual(undefined, sampleDotJson.properties.protocol); assert.notEqual(undefined, sampleDotJson.properties.authentication); assert.notEqual(null, sampleDotJson.properties.authentication); assert.notEqual('', sampleDotJson.properties.authentication); assert.notEqual(undefined, sampleDotJson.properties.authentication.auth_method); assert.notEqual(undefined, sampleDotJson.properties.authentication.username); assert.notEqual(undefined, sampleDotJson.properties.authentication.password); assert.notEqual(undefined, sampleDotJson.properties.authentication.token); assert.notEqual(undefined, sampleDotJson.properties.authentication.invalid_token_error); assert.notEqual(undefined, sampleDotJson.properties.authentication.token_timeout); assert.notEqual(undefined, sampleDotJson.properties.authentication.token_cache); assert.notEqual(undefined, sampleDotJson.properties.authentication.auth_field); assert.notEqual(undefined, sampleDotJson.properties.authentication.auth_field_format); assert.notEqual(undefined, sampleDotJson.properties.authentication.auth_logging); assert.notEqual(undefined, sampleDotJson.properties.authentication.client_id); assert.notEqual(undefined, sampleDotJson.properties.authentication.client_secret); assert.notEqual(undefined, sampleDotJson.properties.authentication.grant_type); assert.notEqual(undefined, sampleDotJson.properties.ssl); assert.notEqual(null, sampleDotJson.properties.ssl); assert.notEqual('', sampleDotJson.properties.ssl); assert.notEqual(undefined, sampleDotJson.properties.ssl.ecdhCurve); assert.notEqual(undefined, sampleDotJson.properties.ssl.enabled); assert.notEqual(undefined, sampleDotJson.properties.ssl.accept_invalid_cert); assert.notEqual(undefined, sampleDotJson.properties.ssl.ca_file); assert.notEqual(undefined, sampleDotJson.properties.ssl.key_file); assert.notEqual(undefined, sampleDotJson.properties.ssl.cert_file); assert.notEqual(undefined, sampleDotJson.properties.ssl.secure_protocol); assert.notEqual(undefined, sampleDotJson.properties.ssl.ciphers); assert.notEqual(undefined, sampleDotJson.properties.base_path); assert.notEqual(undefined, sampleDotJson.properties.version); assert.notEqual(undefined, sampleDotJson.properties.cache_location); assert.notEqual(undefined, sampleDotJson.properties.encode_pathvars); assert.notEqual(undefined, sampleDotJson.properties.encode_queryvars); assert.notEqual(undefined, sampleDotJson.properties.save_metric); assert.notEqual(undefined, sampleDotJson.properties.healthcheck); assert.notEqual(null, sampleDotJson.properties.healthcheck); assert.notEqual('', sampleDotJson.properties.healthcheck); assert.notEqual(undefined, sampleDotJson.properties.healthcheck.type); assert.notEqual(undefined, sampleDotJson.properties.healthcheck.frequency); assert.notEqual(undefined, sampleDotJson.properties.healthcheck.query_object); assert.notEqual(undefined, sampleDotJson.properties.throttle); assert.notEqual(null, sampleDotJson.properties.throttle); assert.notEqual('', sampleDotJson.properties.throttle); assert.notEqual(undefined, sampleDotJson.properties.throttle.throttle_enabled); assert.notEqual(undefined, sampleDotJson.properties.throttle.number_pronghorns); assert.notEqual(undefined, sampleDotJson.properties.throttle.sync_async); assert.notEqual(undefined, sampleDotJson.properties.throttle.max_in_queue); assert.notEqual(undefined, sampleDotJson.properties.throttle.concurrent_max); assert.notEqual(undefined, sampleDotJson.properties.throttle.expire_timeout); assert.notEqual(undefined, sampleDotJson.properties.throttle.avg_runtime); assert.notEqual(undefined, sampleDotJson.properties.throttle.priorities); assert.notEqual(undefined, sampleDotJson.properties.request); assert.notEqual(null, sampleDotJson.properties.request); assert.notEqual('', sampleDotJson.properties.request); assert.notEqual(undefined, sampleDotJson.properties.request.number_redirects); assert.notEqual(undefined, sampleDotJson.properties.request.number_retries); assert.notEqual(undefined, sampleDotJson.properties.request.limit_retry_error); assert.notEqual(undefined, sampleDotJson.properties.request.failover_codes); assert.notEqual(undefined, sampleDotJson.properties.request.attempt_timeout); assert.notEqual(undefined, sampleDotJson.properties.request.global_request); assert.notEqual(undefined, sampleDotJson.properties.request.global_request.payload); assert.notEqual(undefined, sampleDotJson.properties.request.global_request.uriOptions); assert.notEqual(undefined, sampleDotJson.properties.request.global_request.addlHeaders); assert.notEqual(undefined, sampleDotJson.properties.request.global_request.authData); assert.notEqual(undefined, sampleDotJson.properties.request.healthcheck_on_timeout); assert.notEqual(undefined, sampleDotJson.properties.request.return_raw); assert.notEqual(undefined, sampleDotJson.properties.request.archiving); assert.notEqual(undefined, sampleDotJson.properties.request.return_request); assert.notEqual(undefined, sampleDotJson.properties.proxy); assert.notEqual(null, sampleDotJson.properties.proxy); assert.notEqual('', sampleDotJson.properties.proxy); assert.notEqual(undefined, sampleDotJson.properties.proxy.enabled); assert.notEqual(undefined, sampleDotJson.properties.proxy.host); assert.notEqual(undefined, sampleDotJson.properties.proxy.port); assert.notEqual(undefined, sampleDotJson.properties.proxy.protocol); assert.notEqual(undefined, sampleDotJson.properties.proxy.username); assert.notEqual(undefined, sampleDotJson.properties.proxy.password); assert.notEqual(undefined, sampleDotJson.properties.mongo); assert.notEqual(null, sampleDotJson.properties.mongo); assert.notEqual('', sampleDotJson.properties.mongo); assert.notEqual(undefined, sampleDotJson.properties.mongo.host); assert.notEqual(undefined, sampleDotJson.properties.mongo.port); assert.notEqual(undefined, sampleDotJson.properties.mongo.database); assert.notEqual(undefined, sampleDotJson.properties.mongo.username); assert.notEqual(undefined, sampleDotJson.properties.mongo.password); assert.notEqual(undefined, sampleDotJson.properties.mongo.replSet); assert.notEqual(undefined, sampleDotJson.properties.mongo.db_ssl); assert.notEqual(undefined, sampleDotJson.properties.mongo.db_ssl.enabled); assert.notEqual(undefined, sampleDotJson.properties.mongo.db_ssl.accept_invalid_cert); assert.notEqual(undefined, sampleDotJson.properties.mongo.db_ssl.ca_file); assert.notEqual(undefined, sampleDotJson.properties.mongo.db_ssl.key_file); assert.notEqual(undefined, sampleDotJson.properties.mongo.db_ssl.cert_file); assert.notEqual(undefined, sampleDotJson.properties.devicebroker); assert.notEqual(undefined, sampleDotJson.properties.devicebroker.getDevice); assert.notEqual(undefined, sampleDotJson.properties.devicebroker.getDevicesFiltered); assert.notEqual(undefined, sampleDotJson.properties.devicebroker.isAlive); assert.notEqual(undefined, sampleDotJson.properties.devicebroker.getConfig); assert.notEqual(undefined, sampleDotJson.properties.devicebroker.getCount); assert.notEqual(undefined, sampleDotJson.properties.cache); assert.notEqual(undefined, sampleDotJson.properties.cache.entities); done(); } catch (error) { log.error(`Test Failure: ${error}`); done(error); } }); }); describe('#checkProperties', () => { it('should have a checkProperties function', (done) => { try { assert.equal(true, typeof a.checkProperties === 'function'); done(); } catch (error) { log.error(`Test Failure: ${error}`); done(error); } }); it('the sample properties should be good - if failure change the log level', (done) => { try { const samplePropsJson = require('../../sampleProperties.json'); const clean = a.checkProperties(samplePropsJson.properties); try { assert.notEqual(0, Object.keys(clean)); assert.equal(undefined, clean.exception); assert.notEqual(undefined, clean.host); assert.notEqual(null, clean.host); assert.notEqual('', clean.host); done(); } catch (err) { log.error(`Test Failure: ${err}`); done(err); } } catch (error) { log.error(`Adapter Exception: ${error}`); done(error); } }).timeout(attemptTimeout); }); describe('README.md', () => { it('should have a README', (done) => { try { fs.exists('README.md', (val) => { assert.equal(true, val); done(); }); } catch (error) { log.error(`Test Failure: ${error}`); done(error); } }); it('README.md should be customized', (done) => { try { fs.readFile('README.md', 'utf8', (err, data) => { assert.equal(-1, data.indexOf('[System]')); assert.equal(-1, data.indexOf('[system]')); assert.equal(-1, data.indexOf('[version]')); assert.equal(-1, data.indexOf('[namespace]')); done(); }); } catch (error) { log.error(`Test Failure: ${error}`); done(error); } }); }); describe('#connect', () => { it('should have a connect function', (done) => { try { assert.equal(true, typeof a.connect === 'function'); don