- E2E test working, failing on node, but support will be build soon

This commit is contained in:
Ferdi Koomen 2020-09-25 16:49:35 +02:00
parent 75c9ef321e
commit a5cd62f3e9
23 changed files with 106 additions and 235 deletions

View File

@ -16,11 +16,11 @@ module.exports = {
testEnvironment: 'node',
testMatch: [
'<rootDir>/test/e2e/v2.fetch.spec.js',
// '<rootDir>/test/e2e/v2.xhr.spec.js',
// '<rootDir>/test/e2e/v2.node.spec.js',
// '<rootDir>/test/e2e/v3.fetch.spec.js',
// '<rootDir>/test/e2e/v3.xhr.spec.js',
// '<rootDir>/test/e2e/v3.node.spec.js',
'<rootDir>/test/e2e/v2.xhr.spec.js',
'<rootDir>/test/e2e/v2.node.spec.js',
'<rootDir>/test/e2e/v3.fetch.spec.js',
'<rootDir>/test/e2e/v3.xhr.spec.js',
'<rootDir>/test/e2e/v3.node.spec.js',
],
},
],

View File

@ -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",

View File

@ -1,3 +1,3 @@
import('./index.js').then(module => {
window.test = module;
window.api = module;
});

View File

@ -1,4 +0,0 @@
'use strict';
const server = require('./scripts/server');
server.start('v2', 'fetch');

View File

@ -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/`, {

View File

@ -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, {

View File

@ -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;

View File

@ -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,

View File

@ -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('<script src="public/script.js"></script>');
res.send('<script src="js/script.js"></script>');
});
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,

View File

@ -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
};

View File

@ -1,13 +0,0 @@
import { ComplexService } from './api';
export async function complexTypes() {
return await ComplexService.complexTypes({
first: {
second: {
third: 'Hello World!',
},
},
}, {
prop: 'Hello World!',
});
}

View File

@ -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'
);
}

View File

@ -1,5 +0,0 @@
import { HeaderService } from './api';
export async function callWithResultFromHeader() {
return await HeaderService.callWithResultFromHeader();
}

View File

@ -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'
);
}

View File

@ -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();
}

View File

@ -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();
}

View File

@ -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' }
);
}

View File

@ -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();
});
});

View File

@ -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();
});
});

View File

@ -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();
});
});

View File

@ -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();
});
});

View File

@ -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();
});
});

View File

@ -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();
});
});