diff --git a/jest.config.js b/jest.config.js index c982228b..b2f5c0c2 100644 --- a/jest.config.js +++ b/jest.config.js @@ -16,11 +16,11 @@ module.exports = { testEnvironment: 'node', testMatch: [ '/test/e2e/v2.fetch.spec.js', - // '/test/e2e/v2.xhr.spec.js', - // '/test/e2e/v2.node.spec.js', - // '/test/e2e/v3.fetch.spec.js', - // '/test/e2e/v3.xhr.spec.js', - // '/test/e2e/v3.node.spec.js', + '/test/e2e/v2.xhr.spec.js', + '/test/e2e/v2.node.spec.js', + '/test/e2e/v3.fetch.spec.js', + '/test/e2e/v3.xhr.spec.js', + '/test/e2e/v3.node.spec.js', ], }, ], diff --git a/package.json b/package.json index bee67a18..08417c39 100644 --- a/package.json +++ b/package.json @@ -39,8 +39,7 @@ }, "files": [ "bin/index.js", - "dist/index.js", - "src/templates/**/*.ts" + "dist/index.js" ], "scripts": { "clean": "rimraf ./dist ./test/generated ./test/e2e/generated ./samples/generated ./coverage ./node_modules/.cache", @@ -61,7 +60,7 @@ "prettier:fix": "prettier \"./src/**/*.ts\" \"./bin/index.js\" --write", "prepublish": "yarn run clean && yarn run release", "codecov": "codecov --token=66c30c23-8954-4892-bef9-fbaed0a2e42b", - "aap": "node ./test/e2e/index.js" + "aap": "node test/e2e/index.js" }, "dependencies": { "camelcase": "6.0.0", diff --git a/test/e2e/test/script.js b/test/e2e/assets/script.js similarity index 61% rename from test/e2e/test/script.js rename to test/e2e/assets/script.js index 8d5396ca..743714a1 100644 --- a/test/e2e/test/script.js +++ b/test/e2e/assets/script.js @@ -1,3 +1,3 @@ import('./index.js').then(module => { - window.test = module; + window.api = module; }); diff --git a/test/e2e/index.js b/test/e2e/index.js deleted file mode 100644 index 824dffa5..00000000 --- a/test/e2e/index.js +++ /dev/null @@ -1,4 +0,0 @@ -'use strict'; - -const server = require('./scripts/server'); -server.start('v2', 'fetch'); diff --git a/test/e2e/scripts/browser.js b/test/e2e/scripts/browser.js index 18f52d23..bc7eff60 100644 --- a/test/e2e/scripts/browser.js +++ b/test/e2e/scripts/browser.js @@ -6,6 +6,9 @@ let browser; let page async function start() { + // This starts the a new puppeteer browser (Chrome) + // and load the localhost page, this page will load the + // javascript modules (see server.js for more info) browser = await puppeteer.launch(); page = await browser.newPage(); await page.goto(`http://localhost:3000/`, { diff --git a/test/e2e/scripts/compile.js b/test/e2e/scripts/compile.js index b03b283a..dfb1f08d 100644 --- a/test/e2e/scripts/compile.js +++ b/test/e2e/scripts/compile.js @@ -5,7 +5,7 @@ const path = require('path'); const os = require('os'); function compile(version, client) { - const baseDir = `./test/e2e/generated/${version}/${client}/js/api/`; + const baseDir = `./test/e2e/generated/${version}/${client}/`; const tsconfig = { compilerOptions: { target: 'es6', @@ -14,11 +14,15 @@ function compile(version, client) { }, include: ['./index.ts'], }; + + // Compile files to JavaScript (ES6 modules) const configFile = ts.parseConfigFileTextToJson('tsconfig.json', JSON.stringify(tsconfig)); const configFileResult = ts.parseJsonConfigFileContent(configFile.config, ts.sys, path.resolve(process.cwd(), baseDir), undefined, 'tsconfig.json'); const compilerHost = ts.createCompilerHost(configFileResult.options); const compiler = ts.createProgram(configFileResult.fileNames, configFileResult.options, compilerHost); const result = compiler.emit(); + + // Show errors or warnings (if any) const diagnostics = ts.getPreEmitDiagnostics(compiler).concat(result.diagnostics); if (diagnostics.length) { console.log(ts.formatDiagnosticsWithColorAndContext(diagnostics, { diff --git a/test/e2e/scripts/copy.js b/test/e2e/scripts/copy.js index 9cce0b73..733d686a 100644 --- a/test/e2e/scripts/copy.js +++ b/test/e2e/scripts/copy.js @@ -1,19 +1,12 @@ 'use strict'; const fs = require('fs'); -const path = require('path'); -const glob = require('glob'); async function copy(version, client) { - const input = path.resolve('./test/e2e/test/'); - const output = path.resolve(`./test/e2e/generated/${version}/${client}/js`); - const files = glob.sync('*.js', { cwd: input }); - for (let file of files) { - fs.copyFileSync( - path.resolve(input, file), - path.resolve(output, file) - ); - } + fs.copyFileSync( + './test/e2e/assets/script.js', + `./test/e2e/generated/${version}/${client}/script.js`, + ); } module.exports = copy; diff --git a/test/e2e/scripts/generate.js b/test/e2e/scripts/generate.js index c71d12d3..da5c302a 100644 --- a/test/e2e/scripts/generate.js +++ b/test/e2e/scripts/generate.js @@ -5,7 +5,7 @@ const OpenAPI = require('../../../dist'); async function generate(version, client) { await OpenAPI.generate({ input: `./test/spec/${version}.json`, - output: `./test/e2e/generated/${version}/${client}/js/api/`, + output: `./test/e2e/generated/${version}/${client}/`, httpClient: client, useOptions: false, useUnionTypes: false, diff --git a/test/e2e/scripts/server.js b/test/e2e/scripts/server.js index ee01b090..2f8dd190 100644 --- a/test/e2e/scripts/server.js +++ b/test/e2e/scripts/server.js @@ -9,17 +9,34 @@ async function start(version, client) { return new Promise(resolve => { app = express(); - app.use(express.static(`./test/e2e/generated/${version}/${client}`, { + // Serve the JavaScript files from the specific folder, since we are using browser + // based ES6 modules, this also means that we can just request the js/index.js file + // and all other relative paths are resolved from that file. + app.use('/js', express.static(`./test/e2e/generated/${version}/${client}/`, { extensions: ['', 'js'], index: 'index.js' })); + // When we request the index then we can just return the script loader. + // This file is copied from test/e2e/assets/script.js to the output directory + // of the specific version and client. app.get('/', (req, res) => { - res.send(''); + res.send(''); }); + const aap = (obj) => { + const a = {}; + for (const key in obj) { + a[key] = obj[key]; + } + return a; + } + + // Register an 'echo' server that just returns all data from the API calls. + // Although this might not be a 'correct' response, we can use this to test + // the majority of API calls. app.all('/base/api/*', (req, res) => { - res.send({ + res.json({ method: req.method, protocol: req.protocol, hostname: req.hostname, diff --git a/test/e2e/test/index.js b/test/e2e/test/index.js deleted file mode 100644 index 52f8fd26..00000000 --- a/test/e2e/test/index.js +++ /dev/null @@ -1,17 +0,0 @@ -import * as complexService from './testComplexService'; -import * as defaultsService from './testDefaultsService'; -import * as headerService from './testHeaderService'; -import * as parametersService from './testParametersService'; -import * as responseService from './testResponseService'; -import * as simpleService from './testSimpleService'; -import * as typesService from './testTypesService'; - -export { - complexService, - defaultsService, - headerService, - parametersService, - responseService, - simpleService, - typesService -}; diff --git a/test/e2e/test/testComplexService.js b/test/e2e/test/testComplexService.js deleted file mode 100644 index 7bd73292..00000000 --- a/test/e2e/test/testComplexService.js +++ /dev/null @@ -1,13 +0,0 @@ -import { ComplexService } from './api'; - -export async function complexTypes() { - return await ComplexService.complexTypes({ - first: { - second: { - third: 'Hello World!', - }, - }, - }, { - prop: 'Hello World!', - }); -} diff --git a/test/e2e/test/testDefaultsService.js b/test/e2e/test/testDefaultsService.js deleted file mode 100644 index f1d8db89..00000000 --- a/test/e2e/test/testDefaultsService.js +++ /dev/null @@ -1,20 +0,0 @@ -import { DefaultsService } from './api'; - -export async function callWithDefaultParameters() { - return await DefaultsService.callWithDefaultParameters(); -} - -export async function callWithDefaultOptionalParameters() { - return await DefaultsService.callWithDefaultOptionalParameters(); -} - -export async function callToTestOrderOfParams() { - return await DefaultsService.callToTestOrderOfParams( - 'parameterStringWithNoDefault', - 'parameterOptionalStringWithDefault', - 'parameterOptionalStringWithEmptyDefault', - 'parameterOptionalStringWithNoDefault', - 'parameterStringWithDefault', - 'parameterStringWithEmptyDefault' - ); -} diff --git a/test/e2e/test/testHeaderService.js b/test/e2e/test/testHeaderService.js deleted file mode 100644 index c13338cb..00000000 --- a/test/e2e/test/testHeaderService.js +++ /dev/null @@ -1,5 +0,0 @@ -import { HeaderService } from './api'; - -export async function callWithResultFromHeader() { - return await HeaderService.callWithResultFromHeader(); -} diff --git a/test/e2e/test/testParametersService.js b/test/e2e/test/testParametersService.js deleted file mode 100644 index 44d58d26..00000000 --- a/test/e2e/test/testParametersService.js +++ /dev/null @@ -1,23 +0,0 @@ -import { ParametersService } from './api'; - -export async function callWithParameters() { - return await ParametersService.callWithParameters( - 'parameterHeader', - 'parameterQuery', - 'parameterForm', - 'parameterBody', - 'parameterPath' - ); -} - -export async function callWithWeirdParameterNames() { - return await ParametersService.callWithWeirdParameterNames( - 'parameterHeader', - 'parameterQuery', - 'parameterForm', - 'parameterBody', - 'parameterPath1', - 'parameterPath2', - 'parameterPath3' - ); -} diff --git a/test/e2e/test/testResponseService.js b/test/e2e/test/testResponseService.js deleted file mode 100644 index 435f3329..00000000 --- a/test/e2e/test/testResponseService.js +++ /dev/null @@ -1,13 +0,0 @@ -import { ResponseService } from './api'; - -export async function callWithResponse() { - return await ResponseService.callWithResponse(); -} - -export async function callWithResponses() { - return await ResponseService.callWithResponses(); -} - -export async function callWithDuplicateResponses() { - return await ResponseService.callWithDuplicateResponses(); -} diff --git a/test/e2e/test/testSimpleService.js b/test/e2e/test/testSimpleService.js deleted file mode 100644 index 8799e64d..00000000 --- a/test/e2e/test/testSimpleService.js +++ /dev/null @@ -1,29 +0,0 @@ -import { SimpleService } from './api'; - -export async function getCallWithoutParametersAndResponse() { - return await SimpleService.getCallWithoutParametersAndResponse(); -} - -export async function putCallWithoutParametersAndResponse() { - return await SimpleService.putCallWithoutParametersAndResponse(); -} - -export async function postCallWithoutParametersAndResponse() { - return await SimpleService.postCallWithoutParametersAndResponse(); -} - -export async function deleteCallWithoutParametersAndResponse() { - return await SimpleService.deleteCallWithoutParametersAndResponse(); -} - -export async function optionsCallWithoutParametersAndResponse() { - return await SimpleService.optionsCallWithoutParametersAndResponse(); -} - -export async function headCallWithoutParametersAndResponse() { - return await SimpleService.headCallWithoutParametersAndResponse(); -} - -export async function patchCallWithoutParametersAndResponse() { - return await SimpleService.patchCallWithoutParametersAndResponse(); -} diff --git a/test/e2e/test/testTypesService.js b/test/e2e/test/testTypesService.js deleted file mode 100644 index 81c6a7bb..00000000 --- a/test/e2e/test/testTypesService.js +++ /dev/null @@ -1,13 +0,0 @@ -import { TypesService } from './api'; - -export async function types() { - return await TypesService.types( - ['foo', 'bar'], - { foo: 'bar' }, - 'Success', - 123, - 'Hello World!', - true, - { foo: 'bar' } - ); -} diff --git a/test/e2e/v2.fetch.spec.js b/test/e2e/v2.fetch.spec.js index 5b3575d0..859feb4d 100644 --- a/test/e2e/v2.fetch.spec.js +++ b/test/e2e/v2.fetch.spec.js @@ -22,7 +22,15 @@ describe('v2.fetch', () => { }); it('complexService', async () => { - const result = await browser.evaluate(async () => await window.test.complexService.complexTypes()); - expect(result).toBe(''); + const result = await browser.evaluate(async () => { + return await window.api.ComplexService.complexTypes({ + first: { + second: { + third: 'Hello World!' + } + } + }); + }); + expect(result.url).toBeDefined(); }); }); diff --git a/test/e2e/v2.node.spec.js b/test/e2e/v2.node.spec.js index 496f295f..9eb2d5bb 100644 --- a/test/e2e/v2.node.spec.js +++ b/test/e2e/v2.node.spec.js @@ -5,78 +5,29 @@ const copy = require('./scripts/copy'); const compile = require('./scripts/compile'); const server = require('./scripts/server'); -let tests; - describe('v2.node', () => { beforeAll(async () => { await generate('v2', 'node'); await copy('v2', 'node'); - await compile('v2', 'fetch'); - await server.start('v2', 'fetch'); - tests = require('./generated/v2/node/js/index.js'); + await compile('v2', 'node'); + await server.start('v2', 'node'); }, 30000); afterAll(async () => { await server.stop(); - tests = null; }); it('complexService', async () => { - const result = await tests.complexService.complexTypes(); - expect(result).toBeTruthy(); - }); - - it('defaultsService', async () => { - const result1 = await tests.defaultsService.callWithDefaultParameters(); - const result2 = await tests.defaultsService.callWithDefaultOptionalParameters(); - const result3 = await tests.defaultsService.callToTestOrderOfParams(); - expect(result1).toBeTruthy(); - expect(result2).toBeTruthy(); - expect(result3).toBeTruthy(); - }); - - it('headerService', async () => { - const result = await tests.headerService.callWithResultFromHeader(); - expect(result).toBeTruthy(); - }); - - it('parametersService', async () => { - const result1 = await tests.parametersService.callWithParameters(); - const result2 = await tests.parametersService.callWithWeirdParameterNames(); - expect(result1).toBeTruthy(); - expect(result2).toBeTruthy(); - }); - - it('responseService', async () => { - const result1 = await tests.responseService.callWithResponse(); - const result2 = await tests.responseService.callWithResponses(); - const result3 = await tests.responseService.callWithDuplicateResponses(); - expect(result1).toBeTruthy(); - expect(result2).toBeTruthy(); - expect(result3).toBeTruthy(); - }); - - it('simpleService', async () => { - const result1 = await tests.simpleService.getCallWithoutParametersAndResponse(); - const result2 = await tests.simpleService.putCallWithoutParametersAndResponse(); - const result3 = await tests.simpleService.postCallWithoutParametersAndResponse(); - const result4 = await tests.simpleService.deleteCallWithoutParametersAndResponse(); - const result5 = await tests.simpleService.optionsCallWithoutParametersAndResponse(); - const result6 = await tests.simpleService.headCallWithoutParametersAndResponse(); - const result7 = await tests.simpleService.patchCallWithoutParametersAndResponse(); - expect(result1).toBeTruthy(); - expect(result2).toBeTruthy(); - expect(result3).toBeTruthy(); - expect(result4).toBeTruthy(); - expect(result5).toBeTruthy(); - expect(result6).toBeTruthy(); - expect(result7).toBeTruthy(); - }); - - it('typesService', async () => { - const result = await tests.typesService.types(); - expect(result).toBeTruthy(); + const { ComplexService } = require('./generated/v2/node/index.js'); + const result = await ComplexService.complexTypes({ + first: { + second: { + third: 'Hello World!' + } + } + }); + expect(result).toBeDefined(); }); }); diff --git a/test/e2e/v2.xhr.spec.js b/test/e2e/v2.xhr.spec.js index 711e077d..871fa011 100644 --- a/test/e2e/v2.xhr.spec.js +++ b/test/e2e/v2.xhr.spec.js @@ -21,7 +21,16 @@ describe('v2.xhr', () => { await browser.stop(); }); - it('runs', async () => { - expect(true).toBeTruthy(); + it('complexService', async () => { + const result = await browser.evaluate(async () => { + return await window.api.ComplexService.complexTypes({ + first: { + second: { + third: 'Hello World!' + } + } + }); + }); + expect(result).toBeDefined(); }); }); diff --git a/test/e2e/v3.fetch.spec.js b/test/e2e/v3.fetch.spec.js index 4be27f1e..27db633f 100644 --- a/test/e2e/v3.fetch.spec.js +++ b/test/e2e/v3.fetch.spec.js @@ -25,4 +25,16 @@ describe('v3.fetch', () => { expect(true).toBeTruthy(); }); + it('complexService', async () => { + const result = await browser.evaluate(async () => { + return await window.api.ComplexService.complexTypes({ + first: { + second: { + third: 'Hello World!' + } + } + }); + }); + expect(result).toBeDefined(); + }); }); diff --git a/test/e2e/v3.node.spec.js b/test/e2e/v3.node.spec.js index 323b8c39..ea42a79b 100644 --- a/test/e2e/v3.node.spec.js +++ b/test/e2e/v3.node.spec.js @@ -5,8 +5,6 @@ const copy = require('./scripts/copy'); const compile = require('./scripts/compile'); const server = require('./scripts/server'); -let tests; - describe('v3.node', () => { beforeAll(async () => { @@ -14,17 +12,22 @@ describe('v3.node', () => { await copy('v3', 'node'); await compile('v3', 'node'); await server.start('v3', 'node'); - tests = require('./generated/v3/node/index.js'); }, 30000); afterAll(async () => { await server.stop(); - tests = null; }); - it('runs', async () => { - console.log(app); - expect(true).toBeTruthy(); + it('complexService', async () => { + const { ComplexService } = require('./generated/v3/node/index.js'); + const result = await ComplexService.complexTypes({ + first: { + second: { + third: 'Hello World!' + } + } + }); + expect(result).toBeDefined(); }); }); diff --git a/test/e2e/v3.xhr.spec.js b/test/e2e/v3.xhr.spec.js index e15c2b88..0fc896da 100644 --- a/test/e2e/v3.xhr.spec.js +++ b/test/e2e/v3.xhr.spec.js @@ -21,7 +21,16 @@ describe('v3.xhr', () => { await browser.stop(); }); - it('runs', async () => { - expect(true).toBeTruthy(); + it('complexService', async () => { + const result = await browser.evaluate(async () => { + return await window.api.ComplexService.complexTypes({ + first: { + second: { + third: 'Hello World!' + } + } + }); + }); + expect(result).toBeDefined(); }); });