@apideck/portman
Version:
Port OpenAPI Spec to Postman Collection, with contract & variation tests included
495 lines • 23.7 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
var tslib_1 = require("tslib");
var swagger_parser_1 = tslib_1.__importDefault(require("@apidevtools/swagger-parser"));
var fs_extra_1 = tslib_1.__importDefault(require("fs-extra"));
var Either = tslib_1.__importStar(require("fp-ts/lib/Either"));
var mockOAS = tslib_1.__importStar(require("../../__tests__/fixtures/mockOAS.json"));
var mockPostman = tslib_1.__importStar(require("../../__tests__/fixtures/mockPostman.json"));
var application_1 = require("../application");
var TestSuite_1 = require("../application/TestSuite");
var configLoader = tslib_1.__importStar(require("../lib/getConfig"));
var oas_1 = require("../oas");
var Portman_1 = require("../Portman");
var postman_1 = require("../postman");
var services_1 = require("../services");
var utils_1 = require("../utils");
var validateJsonSchema = tslib_1.__importStar(require("../utils/PortmanConfig.validator"));
var portmanResult = function (collection) {
return JSON.parse(JSON.stringify(collection));
};
var mockPostmanSync = jest.fn(function () {
return Promise.resolve(JSON.stringify({ status: 'success', data: {} }));
});
jest.mock('../services/PostmanSyncService', function () {
return {
PostmanSyncService: jest.fn().mockImplementation(function () {
return {
sync: mockPostmanSync
};
})
};
});
afterAll(function () {
jest.restoreAllMocks();
});
describe('Portman', function () {
var options = {};
beforeEach(function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
return tslib_1.__generator(this, function (_a) {
jest.spyOn(global.console, 'log').mockImplementation(function () { });
jest.spyOn(global.console, 'error').mockImplementation(function () { });
jest.spyOn(process, 'exit').mockImplementation(function () {
return undefined;
});
jest
.spyOn(swagger_parser_1.default.prototype, 'dereference')
.mockImplementation(function () { return Promise.resolve(mockOAS); });
jest
.spyOn(swagger_parser_1.default.prototype, 'bundle')
.mockImplementation(function () { return Promise.resolve(mockOAS); });
jest
.spyOn(services_1.OpenApiToPostmanService.prototype, 'convert')
.mockImplementation(function () { return Promise.resolve(mockPostman); });
options = {
postmanUid: 'eb1ffad6-eece-456b-ad32-3f2a3f605537',
oaLocal: './__tests__/fixtures/crm.yml',
postmanConfigFile: './__tests__/fixtures/postman-config.json',
portmanConfigFile: './__tests__/fixtures/portman.crm.json',
portmanConfigPath: './__tests__/fixtures/portman.crm.json',
envFile: './__tests__/fixtures/.crm.env',
baseUrl: 'http://localhost:3050',
syncPostman: false,
includeTests: true,
runNewman: false
};
return [2];
});
}); });
afterAll(function () {
jest.restoreAllMocks();
});
afterEach(function () {
jest.clearAllMocks();
});
it('should be a function', function () {
expect(Portman_1.Portman).toBeInstanceOf(Function);
});
it('should return a Portman instance', function () {
var portman = new Portman_1.Portman(options);
expect(portman).toBeInstanceOf(Portman_1.Portman);
});
it('should return a Portman instance with default options', function () {
var portman = new Portman_1.Portman({});
expect(portman).toBeInstanceOf(Portman_1.Portman);
});
describe('Portman.run()', function () {
it('should be a function', function () {
var portman = new Portman_1.Portman(options);
expect(portman.run).toBeInstanceOf(Function);
});
});
describe('Portman.before()', function () {
it('should be a function', function () {
var portman = new Portman_1.Portman(options);
expect(portman.before).toBeInstanceOf(Function);
});
it('should get called when calling run', function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
var portman, spy;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
portman = new Portman_1.Portman(options);
spy = jest.spyOn(portman, 'before');
return [4, portman.run()];
case 1:
_a.sent();
expect(spy).toHaveBeenCalled();
return [2];
}
});
}); });
it('should load config file with getConfig()', function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
var portman, spy;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
portman = new Portman_1.Portman(options);
spy = jest.spyOn(configLoader, 'getConfig');
return [4, portman.run()];
case 1:
_a.sent();
expect(spy).toHaveBeenCalled();
return [2];
}
});
}); });
it('should validate config file with validateJsonSchema()', function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
var portman, spy;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
portman = new Portman_1.Portman(options);
spy = jest.spyOn(validateJsonSchema, 'validate');
return [4, portman.run()];
case 1:
_a.sent();
expect(spy).toHaveBeenCalled();
return [2];
}
});
}); });
it('should exit with code 1 on invalid config', function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
var portman, getConfigSpy, validateSpy;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
portman = new Portman_1.Portman(options);
getConfigSpy = jest
.spyOn(configLoader, 'getConfig')
.mockReturnValueOnce(Promise.resolve(Either.right({})));
validateSpy = jest
.spyOn(validateJsonSchema, 'validate')
.mockReturnValueOnce(Either.left([]));
return [4, portman.run()];
case 1:
_a.sent();
expect(validateSpy).toHaveBeenCalled();
expect(process.exit).toHaveBeenCalledWith(1);
getConfigSpy.mockRestore();
validateSpy.mockRestore();
return [2];
}
});
}); });
});
describe('Portman.parseOpenApiSpec()', function () {
it('should be a function', function () {
var portman = new Portman_1.Portman(options);
expect(portman.parseOpenApiSpec).toBeInstanceOf(Function);
});
it('should throw an error when no spec is passed', function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
var portman;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
portman = new Portman_1.Portman({
portmanConfigFile: './__tests__/fixtures/portman.crm.json'
});
return [4, expect(portman.parseOpenApiSpec()).rejects.toThrow('Error initializing OpenApi Spec.')];
case 1:
_a.sent();
return [2];
}
});
}); });
it('should throw an error when spec path does not exist', function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
var portman;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
portman = new Portman_1.Portman({
oaLocal: './__tests__/fixtures/not_a_spec.yml'
});
return [4, expect(portman.parseOpenApiSpec()).rejects.toThrow('Error initializing OpenApi Spec.')];
case 1:
_a.sent();
return [2];
}
});
}); });
it('should parse OpenAPI spec and define an OpenApiParser', function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
var portman, spy;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
portman = new Portman_1.Portman(options);
spy = jest.spyOn(portman, 'parseOpenApiSpec');
return [4, portman.run()];
case 1:
_a.sent();
expect(spy).toHaveBeenCalled();
expect(portman.oasParser).toBeDefined();
expect(portman.oasParser).toBeInstanceOf(oas_1.OpenApiParser);
return [2];
}
});
}); });
});
describe('Portman.convertToPostmanCollection()', function () {
it('should be a function', function () {
var portman = new Portman_1.Portman(options);
expect(portman.convertToPostmanCollection).toBeInstanceOf(Function);
});
it('should convert OpenAPI spec to Postman collection', function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
var portman, spy;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
portman = new Portman_1.Portman(options);
spy = jest.spyOn(portman, 'convertToPostmanCollection');
return [4, portman.run()];
case 1:
_a.sent();
expect(spy).toHaveBeenCalled();
expect(portman.postmanParser).toBeDefined();
expect(portman.postmanParser).toBeInstanceOf(postman_1.PostmanParser);
return [2];
}
});
}); });
it('should call Portman.runPortmanOverrides', function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
var portman, spy;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
portman = new Portman_1.Portman(options);
spy = jest.spyOn(portman, 'runPortmanOverrides');
return [4, portman.run()];
case 1:
_a.sent();
expect(spy).toHaveBeenCalled();
expect(portman.portmanCollection).toBeDefined();
return [2];
}
});
}); });
});
describe('Portman.injectTestSuite()', function () {
it('should be a function', function () {
var portman = new Portman_1.Portman(options);
expect(portman.injectTestSuite).toBeInstanceOf(Function);
});
it('should inject test suite into Postman collection', function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
var portman, spy;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
portman = new Portman_1.Portman(options);
spy = jest.spyOn(portman, 'injectTestSuite');
return [4, portman.run()];
case 1:
_a.sent();
expect(spy).toHaveBeenCalled();
expect(portman.testSuite).toBeDefined();
expect(portman.testSuite).toBeInstanceOf(TestSuite_1.TestSuite);
expect((0, utils_1.omitKeys)(portman.testSuite.requestTestTypes, ['postmanItemId'])).toMatchSnapshot();
return [2];
}
});
}); });
});
describe('Portman.injectVariationTests()', function () {
it('should be a function', function () {
var portman = new Portman_1.Portman(options);
expect(portman.injectVariationTests).toBeInstanceOf(Function);
});
it('should inject variation tests into Postman collection', function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
var portman, spy;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
portman = new Portman_1.Portman(options);
spy = jest.spyOn(portman, 'injectVariationTests');
return [4, portman.run()];
case 1:
_a.sent();
expect(spy).toHaveBeenCalled();
expect(portman.variationWriter).toBeDefined();
expect(portman.variationWriter).toBeInstanceOf(application_1.VariationWriter);
expect(portman.variationWriter.variationFolder.name).toMatchSnapshot();
expect(portmanResult(portman.portmanCollection).item.find(function (item) { return item.name === 'Integration Tests'; })).toBeDefined();
return [2];
}
});
}); });
});
describe('Portman.injectVariationOverwrites()', function () {
it('should be a function', function () {
var portman = new Portman_1.Portman(options);
expect(portman.injectVariationOverwrites).toBeInstanceOf(Function);
});
it('should inject variation overwrites into Postman collection', function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
var portman, spy;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
portman = new Portman_1.Portman(options);
spy = jest.spyOn(portman, 'injectVariationOverwrites');
return [4, portman.run()];
case 1:
_a.sent();
expect(spy).toHaveBeenCalled();
expect(portman.integrationTestWriter).toBeDefined();
expect(portman.integrationTestWriter).toBeInstanceOf(application_1.IntegrationTestWriter);
expect(portman.integrationTestWriter.integrationTestFolder.name).toMatchSnapshot();
expect(portmanResult(portman.portmanCollection).item.find(function (item) { return item.name === 'Integration Tests'; })).toBeDefined();
return [2];
}
});
}); });
});
describe('Portman.runPortmanOverrides()', function () {
it('should be a function', function () {
var portman = new Portman_1.Portman(options);
expect(portman.runPortmanOverrides).toBeInstanceOf(Function);
});
it('should run portman overrides', function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
var portman, spy;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
portman = new Portman_1.Portman(options);
spy = jest.spyOn(portman, 'runPortmanOverrides');
return [4, portman.run()];
case 1:
_a.sent();
expect(spy).toHaveBeenCalled();
return [2];
}
});
}); });
});
describe('Portman.moveContractTestsToFolder()', function () {
it('should be a function', function () {
var portman = new Portman_1.Portman(options);
expect(portman.moveContractTestsToFolder).toBeInstanceOf(Function);
});
it('should be called when bundleContractTests true', function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
var portman, spy;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
portman = new Portman_1.Portman(tslib_1.__assign(tslib_1.__assign({}, options), { bundleContractTests: true }));
spy = jest.spyOn(portman, 'moveContractTestsToFolder');
return [4, portman.run()];
case 1:
_a.sent();
expect(spy).toHaveBeenCalled();
expect(portmanResult(portman.portmanCollection).item.find(function (item) { return item.name === 'Contract Tests'; })).toBeDefined();
return [2];
}
});
}); });
});
describe('Portman.writePortmanCollectionToFile()', function () {
var jestCollectionFile = './tmp/jest-collection.json';
it('should be a function', function () {
var portman = new Portman_1.Portman(options);
expect(portman.writePortmanCollectionToFile).toBeInstanceOf(Function);
});
it('should write portman collection to file', function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
var e_1, _a, portman, spy, _b;
return tslib_1.__generator(this, function (_c) {
switch (_c.label) {
case 0:
_c.trys.push([0, 2, , 3]);
return [4, fs_extra_1.default.rm(jestCollectionFile)];
case 1:
_c.sent();
return [3, 3];
case 2:
e_1 = _c.sent();
return [3, 3];
case 3:
_a = expect;
return [4, fs_extra_1.default.pathExists(jestCollectionFile)];
case 4:
_a.apply(void 0, [_c.sent()]).toBe(false);
portman = new Portman_1.Portman(tslib_1.__assign(tslib_1.__assign({}, options), { output: jestCollectionFile }));
spy = jest.spyOn(portman, 'writePortmanCollectionToFile');
return [4, portman.run()];
case 5:
_c.sent();
expect(spy).toHaveBeenCalled();
expect(portman.portmanCollection).toBeDefined();
expect(portman.collectionFile).toBe(jestCollectionFile);
_b = expect;
return [4, fs_extra_1.default.pathExists(jestCollectionFile)];
case 6:
_b.apply(void 0, [_c.sent()]).toBe(true);
return [2];
}
});
}); });
});
describe('Portman.runNewmanSuite()', function () {
it('should be a function', function () {
var portman = new Portman_1.Portman(options);
expect(portman.runNewmanSuite).toBeInstanceOf(Function);
});
it('should run newman suite', function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
var portman, spy;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
portman = new Portman_1.Portman(options);
spy = jest.spyOn(portman, 'runNewmanSuite');
return [4, portman.run()];
case 1:
_a.sent();
expect(spy).toHaveBeenCalled();
return [2];
}
});
}); });
});
describe('Portman.syncCollectionToPostman()', function () {
it('should be a function', function () {
var portman = new Portman_1.Portman(options);
expect(portman.syncCollectionToPostman).toBeInstanceOf(Function);
});
it('should sync collection to postman', function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
var portman, spy;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
portman = new Portman_1.Portman(options);
spy = jest.spyOn(portman, 'syncCollectionToPostman');
return [4, portman.run()];
case 1:
_a.sent();
expect(spy).toHaveBeenCalled();
return [2];
}
});
}); });
it('should call PostmanSyncService.sync when syncPostman is true', function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
var portman;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
portman = new Portman_1.Portman(tslib_1.__assign(tslib_1.__assign({}, options), { syncPostman: true }));
return [4, portman.run()];
case 1:
_a.sent();
expect(portman.postmanSyncService).toBeDefined();
expect(mockPostmanSync).toHaveBeenCalled();
return [2];
}
});
}); });
});
describe('Portman.after()', function () {
it('should be a function', function () {
var portman = new Portman_1.Portman(options);
expect(portman.after).toBeInstanceOf(Function);
});
it('should run after hook', function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
var portman, spy;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
portman = new Portman_1.Portman(options);
spy = jest.spyOn(portman, 'after');
return [4, portman.run()];
case 1:
_a.sent();
expect(spy).toHaveBeenCalled();
return [2];
}
});
}); });
});
});
//# sourceMappingURL=Portman.test.js.map