UNPKG

@apideck/portman

Version:

Port OpenAPI Spec to Postman Collection, with contract & variation tests included

495 lines 23.7 kB
"use strict"; 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