@axway/amplify-central-github-extension
Version:
Create Amplify Central resources from Github API Management APIs
358 lines (324 loc) • 11.3 kB
text/typescript
const proxyquire = require('proxyquire').noCallThru();
const fs = require('fs');
const yaml = require('js-yaml');
const path = require('path');
const testSwagger = require('../testHelpers/testSwagger.json');
const testOas3 = require('../testHelpers/testOas3.json');
const testOas3MultipleServers = require('../testHelpers/testOas3MultipleServers.json');
const testOas3NoServers = require('../testHelpers/testOas3NoServers.json');
describe('service', () => {
let sandbox: SinonSandbox = sinon.createSandbox();
let requestPromise: SinonStub = sandbox.stub();
let commitToFs: SinonStub = sandbox.stub();
let getContent: SinonStub = sandbox.stub();
let getBlob: SinonStub = sandbox.stub();
let processStub: SinonStub;
let consoleStub: SinonStub;
let processRepo: SinonStub;
let writeAPI4Central: SinonStub;
let serviceGetContents: SinonStub;
class Octokit {
// @ts-ignore
private config: any;
constructor(config: any) {
this.config = config;
}
public get rateLimit() : object {
return {
get: () => {}
}
}
public get repos() : object {
return {
getContent
}
}
public get git() : object {
return {
getBlob
}
}
}
let proxyConfig:any = {};
let Service = proxyquire('./service', {
'./utils': {
requestPromise,
commitToFs,
getIconData: () => ({})
},
'@octokit/rest': {
Octokit
},
'@apidevtools/swagger-parser': {
bundle: () => (testSwagger)
},
'@axway/amplify-cli-utils': {
loadConfig: () => ({
get: () => (proxyConfig)
})
}
});
const okConfig = {
gitToken: 'token',
gitUserName: 'user',
repo: 'repo',
branch: 'branch',
environmentName: 'test'
}
afterEach(() => {
sandbox.restore();
getContent.reset();
getBlob.reset();
proxyConfig = {};
commitToFs.reset();
});
it('init: construct class ok & sets properties', () => {
processStub = sandbox.stub(process, 'exit');
const extension = new Service(okConfig);
expect(processStub.callCount).to.equal(0);
expect(extension).to.haveOwnProperty('config');
expect(extension).to.haveOwnProperty('octokit');
});
it('init: error if missing required params', () => {
processStub = sandbox.stub(process, 'exit');
consoleStub = sandbox.stub(console, 'log');
new Service();
expect(processStub.callCount).to.equal(1);
expect(consoleStub.firstCall.args[0].startsWith('Missing required config')).to.be.true;
});
it('init: construct class ok & sets proxy properties', () => {
processStub = sandbox.stub(process, 'exit');
consoleStub = sandbox.stub(console, 'log');
proxyConfig = {
httpProxy: "http://127.0.0.1"
}
new Service(okConfig);
expect(consoleStub.firstCall.args[0].startsWith('Connecting using proxy settings')).to.be.true;
});
it('init: construct class ok & sets https proxy properties', () => {
processStub = sandbox.stub(process, 'exit');
consoleStub = sandbox.stub(console, 'log');
proxyConfig = {
httpsProxy: "https://test:as@127.0.0.1",
}
new Service(okConfig);
expect(consoleStub.firstCall.args[0].startsWith('Connecting using proxy settings')).to.be.true;
});
it('init: construct class ok & sets rejectUnauthorized', () => {
processStub = sandbox.stub(process, 'exit');
consoleStub = sandbox.stub(console, 'log');
proxyConfig = {
strictSSL: true
}
new Service(okConfig);
expect(consoleStub.firstCall.args[0].startsWith('Connecting using rejectUnauthorized')).to.be.true;
});
it('generateResources: calls processRepo', async () => {
processRepo = sandbox.stub(Service.prototype, 'processRepo');
processRepo.resolves();
const service = new Service(okConfig);
await service.generateResources();
expect(processRepo.callCount).to.equal(1);
expect(processRepo.lastCall.args).to.deep.equal([
"user",
"repo",
"branch",
"",
""
]);
});
it('processRepo: processes root oas files, calls writeAPI4Central', async () => {
const service = new Service(okConfig);
const file = {
type: 'file',
name: 'petstore.json',
download_url: 'https://petstore.swagger.io/v2/swagger.json'
};
getContent.resolves({
data: [
file
]
});
serviceGetContents = sandbox.stub(Service.prototype, 'getContents')
serviceGetContents.resolves(JSON.stringify(testSwagger));
writeAPI4Central = sandbox.stub(Service.prototype, 'writeAPI4Central');
writeAPI4Central.resolves();
await service.generateResources();
expect(writeAPI4Central.callCount).to.equal(1);
expect(writeAPI4Central.lastCall.args[0]).to.equal('repo');
expect(writeAPI4Central.lastCall.args[1]).to.deep.equal(file);
expect(writeAPI4Central.lastCall.args[2]).to.deep.equal(testSwagger);
});
it('processRepo: handle dirs', async () => {
const service = new Service(okConfig);
const file = {
type: 'dir',
name: 'mydir',
path: 'mydir'
};
getContent.onCall(0).resolves({
data: [
file
]
});
getContent.onCall(1).resolves({
data: [
]
});
writeAPI4Central = sandbox.stub(Service.prototype, 'writeAPI4Central');
await service.generateResources();
expect(writeAPI4Central.callCount).to.equal(0);
});
it('processRepo: only handle OAS', async () => {
const service = new Service(okConfig);
const file = {
type: 'file',
name: 'package.json',
download_url: 'https://petstore.swagger.io/v2/swagger.json'
};
getContent.resolves({
data: [
file
]
});
writeAPI4Central = sandbox.stub(Service.prototype, 'writeAPI4Central');
await service.generateResources();
expect(writeAPI4Central.callCount).to.equal(0);
});
it('processRepo: exit on githut fetch error', async () => {
processStub = sandbox.stub(process, 'exit');
getContent.rejects('error');
consoleStub = sandbox.stub(console, 'error');
const service = new Service(okConfig);
await service.generateResources();
expect(processStub.callCount).to.equal(1);
expect(consoleStub.callCount).to.equal(1);
});
it('processRepo: works with yaml', async () => {
const service = new Service(okConfig);
const yamlBody = fs.readFileSync(path.resolve(__dirname, '../testHelpers/testYaml.yaml'), 'utf8');
const file = {
type: 'file',
name: 'petstore.yaml',
download_url: 'https://petstore.swagger.io/v2/swagger.json'
};
getContent.resolves({
data: [
file
]
});
serviceGetContents = sandbox.stub(Service.prototype, 'getContents');
serviceGetContents.resolves(yamlBody);
writeAPI4Central = sandbox.stub(Service.prototype, 'writeAPI4Central');
writeAPI4Central.resolves();
await service.generateResources();
expect(writeAPI4Central.callCount).to.equal(1);
expect(writeAPI4Central.lastCall.args[0]).to.equal('repo');
expect(writeAPI4Central.lastCall.args[1]).to.deep.equal(file);
});
it('processRepo: works with yaml oas3', async () => {
const service = new Service(okConfig);
const yamlBody = fs.readFileSync(path.resolve(__dirname, '../testHelpers/testOas3.yaml'), 'utf8');
const file = {
type: 'file',
name: 'petstore.yaml',
download_url: 'https://petstore.swagger.io/v2/swagger.json'
};
getContent.resolves({
data: [
file
]
});
serviceGetContents = sandbox.stub(Service.prototype, 'getContents');
serviceGetContents.resolves(yamlBody);
writeAPI4Central = sandbox.stub(Service.prototype, 'writeAPI4Central');
writeAPI4Central.resolves();
await service.generateResources();
expect(writeAPI4Central.callCount).to.equal(1);
expect(writeAPI4Central.lastCall.args[0]).to.equal('repo');
expect(writeAPI4Central.lastCall.args[1]).to.deep.equal(file);
});
it('getContents', async () => {
const service = new Service(okConfig);
getBlob.resolves({
data: {
content: "test"
}
});
const item = {path:"any"};
const response = await service.getContents(
"foo",
'httpe://example.com',
item
);
expect(getBlob.callCount).to.equal(1);
expect(response).to.equal(Buffer.from("test", 'base64').toString('utf8'));
});
it('writeAPI4Central', async () => {
const service = new Service(okConfig);
const item = {
download_url: 'http://example.com',
sha: 'slkfjslkj33fds',
html_url: 'example.com'
}
await service.writeAPI4Central('repo', item, testSwagger);
expect(commitToFs.callCount).to.equal(1);
expect(commitToFs.lastCall.args[0].kind).to.equal('ConsumerInstance');
expect(commitToFs.lastCall.args[1]).to.equal(undefined);
expect(commitToFs.lastCall.args[2].length).to.equal(4);
});
it('writeAPI4Central: oas3', async () => {
const service = new Service(okConfig);
const item = {
download_url: 'http://example.com',
sha: 'slkfjslkj33fds',
html_url: 'example.com'
}
await service.writeAPI4Central('repo', item, testOas3);
expect(commitToFs.callCount).to.equal(1);
expect(commitToFs.lastCall.args[0].kind).to.equal('ConsumerInstance');
expect(commitToFs.lastCall.args[1]).to.equal(undefined);
expect(commitToFs.lastCall.args[2].length).to.equal(4);
expect(commitToFs.lastCall.args[2][2].spec.endpoint[0].host).to.equal("apicentral.axway.com");
expect(commitToFs.lastCall.args[2][2].spec.endpoint[0].protocol).to.equal("https");
expect(commitToFs.lastCall.args[2][2].spec.endpoint[0].routing.basePath).to.equal("/apis");
});
it('writeAPI4Central: oas3 with multiple servers', async () => {
const service = new Service(okConfig);
const item = {
download_url: 'http://example.com',
sha: 'slkfjslkj33fds',
html_url: 'example.com'
}
await service.writeAPI4Central('repo', item, testOas3MultipleServers);
expect(commitToFs.callCount).to.equal(1);
expect(commitToFs.lastCall.args[0].kind).to.equal('ConsumerInstance');
expect(commitToFs.lastCall.args[1]).to.equal(undefined);
expect(commitToFs.lastCall.args[2].length).to.equal(4);
expect(commitToFs.lastCall.args[2][2].spec.endpoint[0].host).to.equal("apicentral.axway.com");
expect(commitToFs.lastCall.args[2][2].spec.endpoint[0].protocol).to.equal("https");
expect(commitToFs.lastCall.args[2][2].spec.endpoint[0].routing.basePath).to.equal("/apis");
expect(commitToFs.lastCall.args[2][2].spec.endpoint[1].host).to.equal("apicentraltest.axway.com");
expect(commitToFs.lastCall.args[2][2].spec.endpoint[1].protocol).to.equal("http");
expect(commitToFs.lastCall.args[2][2].spec.endpoint[1].port).to.equal(8080);
expect(commitToFs.lastCall.args[2][2].spec.endpoint[1].routing.basePath).to.equal("/no-apis");
expect(commitToFs.lastCall.args[2][2].spec.endpoint[2].host).to.equal("nopath.axway.com");
expect(commitToFs.lastCall.args[2][2].spec.endpoint[2].protocol).to.equal("http");
expect(commitToFs.lastCall.args[2][2].spec.endpoint[2].port).to.not.exist;
expect(commitToFs.lastCall.args[2][2].spec.endpoint[2].routing.basePath).to.eq("/");
});
it('writeAPI4Central: oas3 with no servers', async () => {
const service = new Service(okConfig);
const item = {
download_url: 'http://example.com',
sha: 'slkfjslkj33fds',
html_url: 'example.com'
}
await service.writeAPI4Central('repo', item, testOas3NoServers);
expect(commitToFs.callCount).to.equal(1);
expect(commitToFs.lastCall.args[0].kind).to.equal('ConsumerInstance');
expect(commitToFs.lastCall.args[1]).to.equal(undefined);
expect(commitToFs.lastCall.args[2].length).to.equal(4);
expect(commitToFs.lastCall.args[2][2].spec.endpoint.length).to.equal(0);
});
})