UNPKG

apigee-edge-js

Version:

nodejs library for the administration API for Apigee (Edge and X and hybrid).

658 lines (580 loc) 26.4 kB
// resourcefile.js // ------------------------------------------------------------------ // // Tests for Resourcefile operations. // // Copyright 2019 Google LLC. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // /* global describe, faker, it, path, before */ function selectRandomValue (a) { var L1 = a.length, n = Math.floor(Math.random() * L1); return a[n]; } function selectRandomValidType() { return selectRandomValue(['.wsdl', '.jsc', '.xsd', '.xsl', '.java']); } function getRandomSubarray(arr, size) { var shuffled = arr.slice(0), i = arr.length, min = i - size, temp, index; while (i-- > min) { index = Math.floor((i + 1) * Math.random()); temp = shuffled[index]; shuffled[index] = shuffled[i]; shuffled[i] = temp; } return shuffled.slice(min); } describe('Resourcefile', function() { const common = require('./common'), num = faker.random.number(), resourceDir = "./test/resources/resourcefiles", word = faker.lorem.word(), sprintf = require('sprintf-js').sprintf, fs = require('fs'), specialPrefix = 'apigee-edgejs-test-'; const readContentFromFilesystem = ({name, type}, cb) => { let fqpath = path.resolve(resourceDir, type, name); fs.stat(fqpath, function(e, stats) { if (e) { return cb(null); } return cb((stats.isFile()) ? fs.readFileSync(fqpath, 'utf8') : null); }); }; this.timeout(common.testTimeout); this.slow(common.slowThreshold); common.connectApigee(function(org) { let environments = []; let resourcefileDirs = {}; // hash of arrays let rf = org.resourcefiles; //org.conn.verbosity = 1; before(function(done) { org.environments.get(function(e, result) { assert.isNull(e, "error listing: " + JSON.stringify(e)); environments = result.filter(e => e != 'portal'); let numDone = 0, L = 0; const tick = function() { if (++numDone >= L) { done(); } }; fs.readdir(path.resolve(resourceDir), function(e, items) { assert.isNull(e, "error getting resourcefile dirs: " + JSON.stringify(e)); items = items .map(item => { return {item, fq:path.resolve( path.join(resourceDir, item)) };}) .filter(d => fs.statSync(d.fq).isDirectory()); L = items.length; items.forEach(d => { fs.readdir(path.resolve(d.fq), function(e, items) { resourcefileDirs[d.item] = items .filter( item => !item.endsWith('~') ) .filter( item => fs.statSync(path.resolve( path.join(d.fq, item))).isFile()); tick(); }); }); }); }); }); describe('reset', function() { it('delete any pre-existing test resourcefiles in each env', function(done) { let numDone = 0; let tock = () => { if (++numDone == environments.length) { done(); } }; environments.forEach(function(environment) { rf.get({environment}, function(e, result) { assert.isNull(e, "error getting: " + JSON.stringify(e)); let numDone = 0, L = result.resourceFile.length; let tick = () => { if (++numDone == L) { tock(); } }; if (L == 0) { tock(); } else { result.resourceFile.forEach( item => { if (item.name.startsWith(specialPrefix)) { rf.del({...item, ...{environment}}, function(e, result) { assert.isNull(e, "error deleting: " + JSON.stringify(e)); tick(); }); } else { tick(); } }); } }); }); }); it('delete any pre-existing org-scoped test resourcefiles', function(done) { rf.get({}, function(e, result) { assert.isNull(e, "error getting: " + JSON.stringify(e)); let numDone = 0, L = result.resourceFile.length; let tick = () => { if (++numDone == L) { done(); } }; if (L == 0) { done(); } else { result.resourceFile.forEach( item => { if (item.name.startsWith(specialPrefix)) { rf.del(item, function(e, result) { assert.isNull(e, "error deleting: " + JSON.stringify(e)); tick(); }); } else { tick(); } }); } }); }); }); describe('create', function() { it('create some resourcefiles in each env', function(done) { let numDone = 0; let bong = () => { if (++numDone == environments.length) { done(); } }; environments.forEach(function(environment) { let keys = Object.keys(resourcefileDirs); let numDone = 0; let tock = () => { if (++numDone == keys.length) { bong(); } }; keys.forEach(function (shortdir) { let fqdirpath = path.resolve(resourceDir, shortdir); let L = resourcefileDirs[shortdir].length, numDone = 0; let tick = () => { if (++numDone == L) { tock(); } }; resourcefileDirs[shortdir].forEach( rsrcfile => { let filename = path.resolve(fqdirpath, rsrcfile); rf.create({filename, environment}, function(e, result) { assert.isNull(e, sprintf("error creating (%s): ", rsrcfile) + JSON.stringify(e)); tick(); }); }); }); }); }); it('create some org-scoped resourcefiles', function(done) { let keys = Object.keys(resourcefileDirs); let numDone = 0; let tock = () => { if (++numDone == keys.length) { done(); } }; keys.forEach(function (shortdir) { let fqdirpath = path.resolve(resourceDir, shortdir); let L = resourcefileDirs[shortdir].length, numDone = 0; let tick = () => { if (++numDone == L) { tock(); } }; resourcefileDirs[shortdir].forEach( rsrcfile => { let filename = path.resolve(fqdirpath, rsrcfile); rf.create({filename}, function(e, result) { assert.isNull(e, sprintf("error creating (%s): ", rsrcfile) + JSON.stringify(e)); tick(); }); }); }); }); it('fail to create some env-scoped resourcefiles b/c file not exist', function(done) { let numDone = 0; let bong = () => { if (++numDone == environments.length) { done(); } }; environments.forEach(function(environment) { let key = selectRandomValue(Object.keys(resourcefileDirs)); let filename = path.resolve(resourceDir, key, faker.lorem.word(), resourcefileDirs[key][0]); // NOEXIST rf.create({filename, environment}, function(e, result) { assert.isNotNull(e, sprintf("error creating (%s): ", filename) + JSON.stringify(e)); bong(); }); }); }); it('fail to create org-scoped resourcefiles b/c file not exist', function(done) { let keys = Object.keys(resourcefileDirs); let numDone = 0; let tock = () => { if (++numDone == keys.length) { done(); } }; keys.forEach(function (shortdir) { let fqdirpath = path.resolve(resourceDir, shortdir); let L = resourcefileDirs[shortdir].length, numDone = 0; let tick = () => { if (++numDone == L) { tock(); } }; resourcefileDirs[shortdir].forEach( rsrcfile => { let filename = path.resolve(fqdirpath, faker.lorem.word(), rsrcfile); // NOEXIST rf.create({filename}, function(e, result) { assert.isNotNull(e, sprintf("error creating (%s): ", filename) + JSON.stringify(e)); tick(); }); }); }); }); it('fail to create an env-scoped resourcefile with no filename', function(done) { let numDone = 0; let bong = () => { if (++numDone == environments.length) { done(); } }; let badName = faker.lorem.word() +'1' + selectRandomValidType(); //let typ = selectRandomValue(Object.keys(resourcefileDirs)); //let rsrc = selectRandomValue(resourcefileDirs[typ]); //let filename = path.resolve(resourceDir, typ, rsrc); environments.forEach(function(environment) { rf.create({environment, name:badName}, function(e, result){ assert.isNotNull(e, "the expected error did not occur"); bong(); }); }); }); it('fail to create an org-scoped resourcefile with no filename', function(done) { let badName = faker.lorem.word() +'1' + selectRandomValidType(); //let key = selectRandomValue(Object.keys(resourcefileDirs)); //let filename = path.resolve(resourceDir, key, resourcefileDirs[key][0]); rf.create({name:badName}, function(e, result){ assert.isNotNull(e, "the expected error did not occur"); done(); }); }); it('fail to create an env-scoped resourcefile b/c it already exists', function(done) { let numDone = 0; let tick = () => { if (++numDone == environments.length) { done(); } }; environments.forEach(function(environment) { rf.get({environment}, function(e, result) { assert.isNull(e, "error getting: " + JSON.stringify(e)); assert.isAbove(result.resourceFile.length, 0); let selected = selectRandomValue(result.resourceFile); // select one that already exists let typ = selectRandomValue(Object.keys(resourcefileDirs)); let rsrc = selectRandomValue(resourcefileDirs[typ]); let filename = path.resolve(resourceDir, typ, rsrc); rf.create({...selected, ...{filename}, ...{environment}}, function(e, result) { assert.isNotNull(e, "unexpected success while creating"); tick(); }); }); }); }); it('fail to create an org-scoped resourcefile b/c it already exists', function(done) { rf.get({}, function(e, result) { assert.isNull(e, "error getting: " + JSON.stringify(e)); assert.isAbove(result.resourceFile.length, 0); let selected = selectRandomValue(result.resourceFile); // select one that already exists let typ = selectRandomValue(Object.keys(resourcefileDirs)); let rsrc = selectRandomValue(resourcefileDirs[typ]); let filename = path.resolve(resourceDir, typ, rsrc); rf.create({...selected, ...{filename}}, function(e, result) { assert.isNotNull(e, "unexpected success while creating"); done(); }); }); }); // Apparently, there is no such thing as an invalid type of resource. // it('fail to create an env-scoped resourcefile of invalid type', function(done) { // let numDone = 0; // let bong = () => { if (++numDone == environments.length) { done(); } }; // let badType = faker.lorem.word() +'1'; // let key = selectRandomValue(Object.keys(resourcefileDirs)); // console.log('selected key: ' + key); // let filename = path.resolve(resourceDir, key, resourcefileDirs[key][0]); // environments.forEach(function(env) { // rf.create({environment:env, type:badType, filename}, function(e, result){ // console.log(e.stack); // assert.isNotNull(e, "the expected error did not occur"); // bong(); // }); // }); // }); // Apparently, there is no such thing as an invalid type of resource. // it('fail to create an org-scoped resourcefile of invalid type', function(done) { // let badType = faker.lorem.word() +'1'; // let key = selectRandomValue(Object.keys(resourcefileDirs)); // console.log('selected key: ' + key); // let filename = path.resolve(resourceDir, key, resourcefileDirs[key][0]); // rf.create({type:badType, filename}, function(e, result){ // console.log(e.stack); // assert.isNotNull(e, "the expected error did not occur"); // done(); // }); // }); }); describe('get', function() { it('list resourcefiles from each env', function(done) { var numDone = 0; let tick = () => { if (++numDone == environments.length) { done(); } }; environments.forEach(function(environment) { rf.get({environment}, function(e, result){ assert.isNull(e, "error getting: " + JSON.stringify(e)); assert.isAbove(result.resourceFile.length, -1); tick(); }); }); }); it('get some particular resourcefiles from each env', function(done) { let numDone = 0; let checked = 0; let tock = () => { if (++numDone == environments.length) { assert.isAbove(checked, 0); done(); } }; environments.forEach(function(environment) { rf.get({environment}, function(e, result){ assert.isNull(e, "error getting: " + JSON.stringify(e)); let numDone = 0, L = result.resourceFile.length; let selectedItems = []; if (L == 0) { return tock();} if (L > 10) { L = 6; // limit selectedItems = getRandomSubarray(result.resourceFile, L); } else { selectedItems = result.resourceFile; } let tick = () => { if (++numDone == L) { tock(); } }; selectedItems.forEach( item => { rf.get({...item, ...{environment}}, function(e, result) { assert.isNull(e, "error getting: " + JSON.stringify(e)); readContentFromFilesystem(item, function(content) { if (content) { assert.equal(result.trim(),content.trim(), 'resource content'); checked++; } tick(); }); }); }); }); }); }); it('list resourcefiles for the org', function(done) { rf.get({}, function(e, result){ assert.isNull(e, "error getting: " + JSON.stringify(e)); assert.isAbove(result.resourceFile.length, -1); done(); }); }); it('get some particular resourcefiles from the org', function(done) { rf.get({}, function(e, result){ assert.isNull(e, "error getting: " + JSON.stringify(e)); let numDone = 0, L = result.resourceFile.length; let selectedItems = []; if (L == 0) { return done(); } if (L > 10) { L = 6; // limit selectedItems = getRandomSubarray(result.resourceFile, L); } else { selectedItems = result.resourceFile; } let tick = () => { if (++numDone == L) { done(); } }; selectedItems.forEach( item => { rf.get(item, function(e, result) { assert.isNull(e, "error getting: " + JSON.stringify(e)); tick(); }); }); }); }); it('fail to get an environment-scoped resourcefile b/c not exist', function(done) { let environment = selectRandomValue(environments); let badName = faker.lorem.word() +'1' + selectRandomValidType(); rf.get({environment, name: badName}, function(e, result){ assert.isNotNull(e, "error getting: " + JSON.stringify(e)); done(); }); }); it('fail to get a org-scoped resourcefile b/c not exist', function(done) { let badName = faker.lorem.word() +'1' + selectRandomValidType(); rf.get({name:badName}, function(e, result){ assert.isNotNull(e, "error getting: " + JSON.stringify(e)); done(); }); }); it('fail to get a resourcefile from an environment that does not exist', function(done) { let env = faker.lorem.word() + faker.lorem.word(); let badName = faker.lorem.word() +'1' + selectRandomValidType(); rf.get({environment:env, name: badName}, function(e, result){ assert.isNotNull(e, "error getting: " + JSON.stringify(e)); done(); }); }); }); describe('update', function() { it('update some resourcefiles in each env', function(done) { let numDone = 0; let bong = () => { if (++numDone == environments.length) { done(); } }; environments.forEach(function(environment) { let keys = Object.keys(resourcefileDirs); let numDone = 0; let tock = () => { if (++numDone == keys.length) { bong(); } }; keys.forEach(function (shortdir) { let fqdirpath = path.resolve(resourceDir, shortdir); let L = resourcefileDirs[shortdir].length, numDone = 0; let tick = () => { if (++numDone == L) { tock(); } }; resourcefileDirs[shortdir].forEach( rsrcfile => { let filename = path.resolve(fqdirpath, rsrcfile); rf.update({filename, environment}, function(e, result) { assert.isNull(e, sprintf("error updating (%s): ", rsrcfile) + JSON.stringify(e)); tick(); }); }); }); }); }); it('update some org-scoped resourcefiles', function(done) { let keys = Object.keys(resourcefileDirs); let numDone = 0; let tock = () => { if (++numDone == keys.length) { done(); } }; keys.forEach(function (shortdir) { let fqdirpath = path.resolve(resourceDir, shortdir); let L = resourcefileDirs[shortdir].length, numDone = 0; let tick = () => { if (++numDone == L) { tock(); } }; resourcefileDirs[shortdir].forEach( rsrcfile => { let filename = path.resolve(fqdirpath, rsrcfile); rf.update({filename}, function(e, result) { assert.isNull(e, sprintf("error updating (%s): ", rsrcfile) + JSON.stringify(e)); tick(); }); }); }); }); it('fail to update a non-existent environment-scoped resourcefile', function(done) { let environment = selectRandomValue(environments); let typ = selectRandomValue(Object.keys(resourcefileDirs)); let rsrc = selectRandomValue(resourcefileDirs[typ]); let filename = path.resolve(resourceDir, typ, rsrc); // is valid rf.update({...{environment, name:faker.lorem.word(), type:selectRandomValidType()}, ...{filename}}, function(e, result) { assert.isNotNull(e, "unexpected success while updating: " + JSON.stringify(e)); done(); }); }); it('fail to update a non-existent org-scoped resourcefile', function(done) { let typ = selectRandomValue(Object.keys(resourcefileDirs)); let rsrc = selectRandomValue(resourcefileDirs[typ]); let filename = path.resolve(resourceDir, typ, rsrc); // is valid rf.update({...{name:faker.lorem.word(), type:selectRandomValidType()}, ...{filename}}, function(e, result) { assert.isNotNull(e, "unexpected success while updating"); done(); }); }); it('fail to update an env-scoped resourcefile with no filename', function(done) { let numDone = 0; let bong = () => { if (++numDone == environments.length) { done(); } }; let badName = faker.lorem.word() +'1' + selectRandomValidType(); let typ = selectRandomValue(Object.keys(resourcefileDirs)); let rsrc = selectRandomValue(resourcefileDirs[typ]); let filename = path.resolve(resourceDir, typ, rsrc); environments.forEach(function(environment) { rf.update({environment, name:badName}, function(e, result){ assert.isNotNull(e, "the expected error did not occur"); bong(); }); }); }); it('fail to update an org-scoped resourcefile with no filename', function(done) { let badName = faker.lorem.word() +'1' + selectRandomValidType(); let key = selectRandomValue(Object.keys(resourcefileDirs)); let filename = path.resolve(resourceDir, key, resourcefileDirs[key][0]); rf.update({name:badName}, function(e, result){ assert.isNotNull(e, "the expected error did not occur"); done(); }); }); it('fail to update some env-scoped resourcefiles b/c file not exist', function(done) { let numDone = 0; let bong = () => { if (++numDone == environments.length) { done(); } }; environments.forEach(function(environment) { let key = selectRandomValue(Object.keys(resourcefileDirs)); let filename = path.resolve(resourceDir, key, faker.lorem.word(), resourcefileDirs[key][0]); // NOEXIST rf.update({filename, environment}, function(e, result) { assert.isNotNull(e, sprintf("error updating (%s): ", filename) + JSON.stringify(e)); bong(); }); }); }); it('fail to update org-scoped resourcefile b/c file not exist', function(done) { let key = selectRandomValue(Object.keys(resourcefileDirs)); let filename = path.resolve(resourceDir, key, faker.lorem.word(), resourcefileDirs[key][0]); // NOEXIST rf.update({filename}, function(e, result) { assert.isNotNull(e, sprintf("error updating (%s): ", filename) + JSON.stringify(e)); done(); }); }); }); describe('delete', function() { it('delete test resourcefiles from each env', function(done) { let numDone = 0; let bong = () => { if (++numDone == environments.length) { done(); } }; environments.forEach(function(environment) { let keys = Object.keys(resourcefileDirs); let numDone = 0; let tock = () => { if (++numDone == keys.length) { bong(); } }; keys.forEach(function (shortdir) { let L = resourcefileDirs[shortdir].length, numDone = 0; let tick = () => { if (++numDone == L) { tock(); } }; resourcefileDirs[shortdir].forEach( rsrcfile => { rf.del({name:rsrcfile, environment}, function(e, result){ assert.isNull(e, sprintf("error deleting (%s): ", rsrcfile) + JSON.stringify(e)); tick(); }); }); }); }); }); it('delete org-scoped test resourcefiles', function(done) { rf.get({}, function(e, result){ assert.isNull(e, "error getting: " + JSON.stringify(e)); assert.isAbove(result.resourceFile.length, -1); let numDone = 0, L = result.resourceFile.length; if (L == 0) { return done(); } let tick = () => { if (++numDone == L) { done(); } }; result.resourceFile.forEach( item => { if (item.name.startsWith(specialPrefix)) { rf.del(item, function(e, result) { assert.isNull(e, "error deleting: " + JSON.stringify(e)); tick(); }); } else { tick(); } }); }); }); it('fail to delete non-existing resourcefiles from each env', function(done) { let numDone = 0; let bong = () => { if (++numDone == environments.length) { done(); } }; environments.forEach(function(environment) { let keys = Object.keys(resourcefileDirs); let numDone = 0; let tock = () => { if (++numDone == keys.length) { bong(); } }; keys.forEach(function (shortdir) { let L = resourcefileDirs[shortdir].length, numDone = 0; let tick = () => { if (++numDone == L) { tock(); } }; resourcefileDirs[shortdir].forEach( rsrcfile => { let name = faker.lorem.word() + selectRandomValidType(); rf.del({name, environment}, function(e, result){ assert.isNotNull(e, 'expected error deleting ' + name + ' ' + JSON.stringify(e)); tick(); }); }); }); }); }); it('fail to delete non-existing org-scoped resourcefiles', function(done) { let keys = Object.keys(resourcefileDirs); let numDone = 0; let tock = () => { if (++numDone == keys.length) { done(); } }; keys.forEach(function (shortdir) { let L = resourcefileDirs[shortdir].length, numDone = 0; let tick = () => { if (++numDone == L) { tock(); } }; resourcefileDirs[shortdir].forEach( rsrcfile => { let name = faker.lorem.word() + selectRandomValidType(); rf.del({name}, function(e, result){ assert.isNotNull(e, 'expected error deleting ' + name + ' ' + JSON.stringify(e)); tick(); }); }); }); }); it('fail to delete an env-scoped resourcefiles because no name was specified', function(done) { let numDone = 0; let bong = () => { if (++numDone == environments.length) { done(); } }; environments.forEach(function(environment) { rf.del({environment}, function(e, result){ assert.isNotNull(e, "the expected error did not occur"); bong(); }); }); }); it('fail to delete an org-scoped resourcefile because no name was specified', function(done) { rf.del({}, function(e, result){ assert.isNotNull(e, "the expected error did not occur"); done(); }); }); }); }); });