mirror of
https://github.com/ferdikoomen/openapi-typescript-codegen.git
synced 2025-12-08 20:16:21 +00:00
- Working on e2e tests
This commit is contained in:
parent
d32b4c0d7a
commit
1785e3ed90
6
.gitignore
vendored
6
.gitignore
vendored
@ -10,8 +10,8 @@ junit.xml
|
||||
*.iml
|
||||
dist
|
||||
coverage
|
||||
samples/dist
|
||||
test/generated
|
||||
test/e2e/generated
|
||||
samples/generated
|
||||
samples/swagger-codegen-cli-v2.jar
|
||||
samples/swagger-codegen-cli-v3.jar
|
||||
test/generator/dist
|
||||
test/server/dist
|
||||
|
||||
@ -33,7 +33,7 @@ if (OpenAPI) {
|
||||
exportCore: JSON.parse(program.exportCore) === true,
|
||||
exportServices: JSON.parse(program.exportServices) === true,
|
||||
exportModels: JSON.parse(program.exportModels) === true,
|
||||
exportSchemas: JSON.parse(program.exportSchemas) === true,
|
||||
exportSchemas: JSON.parse(program.exportSchemas) === true
|
||||
})
|
||||
.then(() => {
|
||||
process.exit(0);
|
||||
|
||||
@ -1,17 +1,29 @@
|
||||
module.exports = {
|
||||
testRegex: '.*\\.spec\\.(js|js)$',
|
||||
testPathIgnorePatterns: [
|
||||
'/node_modules/',
|
||||
'<rootDir>/dist/',
|
||||
'<rootDir>/samples/',
|
||||
],
|
||||
testEnvironment: 'node',
|
||||
moduleNameMapper: {
|
||||
'\\.hbs$': '<rootDir>/src/templates/__mocks__/index.js',
|
||||
},
|
||||
collectCoverageFrom: [
|
||||
'src/**/*.ts',
|
||||
'!src/**/*.d.ts',
|
||||
'!**/node_modules/**',
|
||||
projects: [
|
||||
{
|
||||
displayName: 'UNIT',
|
||||
testEnvironment: 'node',
|
||||
testMatch: [
|
||||
'<rootDir>/src/**/*.spec.ts',
|
||||
'<rootDir>/test/**/*.spec.js',
|
||||
],
|
||||
moduleNameMapper: {
|
||||
'\\.hbs$': '<rootDir>/src/templates/__mocks__/index.js',
|
||||
},
|
||||
collectCoverageFrom: [
|
||||
'src/**/*.ts',
|
||||
'!src/**/*.d.ts',
|
||||
],
|
||||
},
|
||||
{
|
||||
displayName: 'E2E',
|
||||
testEnvironment: 'node',
|
||||
testMatch: [
|
||||
'<rootDir>/test/e2e/index.js',
|
||||
],
|
||||
globals: {
|
||||
URL: 'http://localhost:3000',
|
||||
},
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
23
package.json
23
package.json
@ -43,17 +43,18 @@
|
||||
"src/templates/**/*.ts"
|
||||
],
|
||||
"scripts": {
|
||||
"clean": "rimraf ./dist ./test/generator/dist ./test/server/dist ./coverage ./samples/dist ./node_modules/.cache",
|
||||
"clean": "rimraf ./dist ./test/generated ./test/e2e/generated ./samples/generated ./coverage ./node_modules/.cache",
|
||||
"build": "rollup --config --environment NODE_ENV:development",
|
||||
"build:watch": "rollup --config --environment NODE_ENV:development --watch",
|
||||
"release": "rollup --config --environment NODE_ENV:production",
|
||||
"start": "nest start --path ./test/server/tsconfig.json",
|
||||
"start:watch": "nest start --path ./test/server/tsconfig.json --watch",
|
||||
"run": "node ./test/index.js",
|
||||
"test": "jest",
|
||||
"test:update": "jest --updateSnapshot",
|
||||
"test:watch": "jest --watch",
|
||||
"test:coverage": "jest --coverage",
|
||||
"test": "jest --selectProjects UNIT",
|
||||
"test:update": "jest --selectProjects UNIT --updateSnapshot",
|
||||
"test:watch": "jest --selectProjects UNIT --watch",
|
||||
"test:coverage": "jest --selectProjects UNIT --coverage",
|
||||
"test:e2e": "jest --selectProjects E2E",
|
||||
"eslint": "eslint \"./src/**/*.ts\" \"./test/**/*.ts\" \"./bin/index.js\"",
|
||||
"eslint:fix": "eslint \"./src/**/*.ts\" \"./test/**/*.ts\" \"./bin/index.js\" --fix",
|
||||
"prettier": "prettier \"./src/**/*.ts\" \"./test/**/*.ts\" \"./bin/index.js\" --check",
|
||||
@ -74,13 +75,6 @@
|
||||
"@babel/core": "7.11.6",
|
||||
"@babel/preset-env": "7.11.5",
|
||||
"@babel/preset-typescript": "7.10.4",
|
||||
"@nestjs/cli": "7.5.1",
|
||||
"@nestjs/common": "7.4.4",
|
||||
"@nestjs/core": "7.4.4",
|
||||
"@nestjs/platform-express": "7.4.4",
|
||||
"@nestjs/schematics": "7.1.2",
|
||||
"@nestjs/swagger": "4.6.1",
|
||||
"@nestjs/testing": "7.4.4",
|
||||
"@rollup/plugin-commonjs": "15.1.0",
|
||||
"@rollup/plugin-node-resolve": "9.0.0",
|
||||
"@types/express": "4.17.8",
|
||||
@ -91,8 +85,6 @@
|
||||
"@types/rimraf": "3.0.0",
|
||||
"@typescript-eslint/eslint-plugin": "4.2.0",
|
||||
"@typescript-eslint/parser": "4.2.0",
|
||||
"class-transformer": "0.3.1",
|
||||
"class-validator": "0.12.2",
|
||||
"codecov": "3.7.2",
|
||||
"eslint": "7.9.0",
|
||||
"eslint-config-prettier": "6.11.0",
|
||||
@ -104,12 +96,9 @@
|
||||
"jest-cli": "26.4.2",
|
||||
"prettier": "2.1.2",
|
||||
"puppeteer": "5.3.1",
|
||||
"reflect-metadata": "0.1.13",
|
||||
"rollup": "2.28.2",
|
||||
"rollup-plugin-terser": "7.0.2",
|
||||
"rollup-plugin-typescript2": "0.27.2",
|
||||
"swagger-ui-express": "4.1.4",
|
||||
"testcafe": "1.9.3",
|
||||
"typescript": "4.0.3"
|
||||
}
|
||||
}
|
||||
|
||||
@ -11,7 +11,6 @@ const fs = require('fs');
|
||||
const pkg = require('./package.json');
|
||||
const external = Object.keys(pkg.dependencies);
|
||||
|
||||
|
||||
/**
|
||||
* Custom plugin to parse handlebar imports and precompile
|
||||
* the template on the fly. This reduces runtime by about
|
||||
@ -56,7 +55,7 @@ const getPlugins = () => {
|
||||
return [...plugins, terser()];
|
||||
}
|
||||
|
||||
export default {
|
||||
module.exports = {
|
||||
input: './src/index.ts',
|
||||
output: {
|
||||
file: './dist/index.js',
|
||||
|
||||
@ -4,18 +4,18 @@ rm -rf dist
|
||||
rm swagger-codegen-cli-v2.jar
|
||||
rm swagger-codegen-cli-v3.jar
|
||||
|
||||
#curl https://repo1.maven.org/maven2/io/swagger/swagger-codegen-cli/2.4.15/swagger-codegen-cli-2.4.15.jar -o swagger-codegen-cli-v2.jar
|
||||
#curl https://repo1.maven.org/maven2/io/swagger/codegen/v3/swagger-codegen-cli/3.0.21/swagger-codegen-cli-3.0.21.jar -o swagger-codegen-cli-v3.jar
|
||||
curl https://repo1.maven.org/maven2/io/swagger/swagger-codegen-cli/2.4.15/swagger-codegen-cli-2.4.15.jar -o swagger-codegen-cli-v2.jar
|
||||
curl https://repo1.maven.org/maven2/io/swagger/codegen/v3/swagger-codegen-cli/3.0.21/swagger-codegen-cli-3.0.21.jar -o swagger-codegen-cli-v3.jar
|
||||
|
||||
#java -jar ./swagger-codegen-cli-v2.jar generate -i spec/v2.json -l typescript-aurelia -o dist/v2/typescript-aurelia/
|
||||
#java -jar ./swagger-codegen-cli-v2.jar generate -i spec/v2.json -l typescript-angular -o dist/v2/typescript-angular/
|
||||
#java -jar ./swagger-codegen-cli-v2.jar generate -i spec/v2.json -l typescript-inversify -o dist/v2/typescript-inversify/
|
||||
#java -jar ./swagger-codegen-cli-v2.jar generate -i spec/v2.json -l typescript-fetch -o dist/v2/typescript-fetch/
|
||||
#java -jar ./swagger-codegen-cli-v2.jar generate -i spec/v2.json -l typescript-jquery -o dist/v2/typescript-jquery/
|
||||
#java -jar ./swagger-codegen-cli-v2.jar generate -i spec/v2.json -l typescript-node -o dist/v2/typescript-node/
|
||||
java -jar ./swagger-codegen-cli-v2.jar generate -i spec/v2.json -l typescript-aurelia -o generated/v2/typescript-aurelia/
|
||||
java -jar ./swagger-codegen-cli-v2.jar generate -i spec/v2.json -l typescript-angular -o generated/v2/typescript-angular/
|
||||
java -jar ./swagger-codegen-cli-v2.jar generate -i spec/v2.json -l typescript-inversify -o generated/v2/typescript-inversify/
|
||||
java -jar ./swagger-codegen-cli-v2.jar generate -i spec/v2.json -l typescript-fetch -o generated/v2/typescript-fetch/
|
||||
java -jar ./swagger-codegen-cli-v2.jar generate -i spec/v2.json -l typescript-jquery -o generated/v2/typescript-jquery/
|
||||
java -jar ./swagger-codegen-cli-v2.jar generate -i spec/v2.json -l typescript-node -o generated/v2/typescript-node/
|
||||
|
||||
#java -jar ./swagger-codegen-cli-v3.jar generate -i spec/v3.json -l typescript-angular -o dist/v3/typescript-angular/
|
||||
#java -jar ./swagger-codegen-cli-v3.jar generate -i spec/v3.json -l typescript-fetch -o dist/v3/typescript-fetch/
|
||||
java -jar ./swagger-codegen-cli-v3.jar generate -i spec/v3.json -l typescript-angular -o generated/v3/typescript-angular/
|
||||
java -jar ./swagger-codegen-cli-v3.jar generate -i spec/v3.json -l typescript-fetch -o generated/v3/typescript-fetch/
|
||||
|
||||
node ../bin/index.js --input spec/v2.json --output dist/v2/openapi-typescript-codegen/
|
||||
node ../bin/index.js --input spec/v3.json --output dist/v3/openapi-typescript-codegen/
|
||||
node ../bin/index.js --input spec/v2.json --output generated/v2/openapi-typescript-codegen/
|
||||
node ../bin/index.js --input spec/v3.json --output generated/v3/openapi-typescript-codegen/
|
||||
|
||||
@ -4,7 +4,7 @@ describe('index', () => {
|
||||
it('parses v2 without issues', async () => {
|
||||
await OpenAPI.generate({
|
||||
input: './test/spec/v3.json',
|
||||
output: './temp/v3/',
|
||||
output: './generated/v3/',
|
||||
write: false,
|
||||
});
|
||||
});
|
||||
@ -12,7 +12,7 @@ describe('index', () => {
|
||||
it('parses v3 without issues', async () => {
|
||||
await OpenAPI.generate({
|
||||
input: './test/spec/v3.json',
|
||||
output: './temp/v3/',
|
||||
output: './generated/v3/',
|
||||
write: false,
|
||||
});
|
||||
});
|
||||
@ -20,7 +20,7 @@ describe('index', () => {
|
||||
it('downloads and parses v2 without issues', async () => {
|
||||
await OpenAPI.generate({
|
||||
input: 'https://raw.githubusercontent.com/ferdikoomen/openapi-typescript-codegen/master/test/spec/v2.json',
|
||||
output: './temp/v2-downloaded/',
|
||||
output: './generated/v2-downloaded/',
|
||||
write: false,
|
||||
});
|
||||
});
|
||||
@ -28,7 +28,7 @@ describe('index', () => {
|
||||
it('downloads and parses v3 without issues', async () => {
|
||||
await OpenAPI.generate({
|
||||
input: 'https://raw.githubusercontent.com/ferdikoomen/openapi-typescript-codegen/master/test/spec/v3.json',
|
||||
output: './temp/v3-downloaded/',
|
||||
output: './generated/v3-downloaded/',
|
||||
write: false,
|
||||
});
|
||||
});
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
29
test/e2e/index.js
Normal file
29
test/e2e/index.js
Normal file
@ -0,0 +1,29 @@
|
||||
'use strict';
|
||||
|
||||
const generate = require('./scripts/generate');
|
||||
const compile = require('./scripts/compile');
|
||||
|
||||
describe('e2e', () => {
|
||||
|
||||
beforeAll(async () => {
|
||||
await generate('v2', 'fetch');
|
||||
await generate('v2', 'xhr');
|
||||
await generate('v2', 'node');
|
||||
await generate('v3', 'fetch');
|
||||
await generate('v3', 'xhr');
|
||||
await generate('v3', 'node');
|
||||
});
|
||||
|
||||
afterAll(async () => {
|
||||
//
|
||||
});
|
||||
|
||||
it('runs in chrome', async () => {
|
||||
expect(true).toBeTruthy();
|
||||
});
|
||||
|
||||
it('runs in node', async () => {
|
||||
expect(true).toBeTruthy();
|
||||
});
|
||||
|
||||
})
|
||||
69
test/e2e/index.txt
Normal file
69
test/e2e/index.txt
Normal file
@ -0,0 +1,69 @@
|
||||
'use strict';
|
||||
|
||||
const express = require('express');
|
||||
const puppeteer = require('puppeteer');
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
const http = require('http');
|
||||
const compile = require('./scripts/compiler');
|
||||
const browser = require('./scripts/browser');
|
||||
const server = require('./scripts/server');
|
||||
|
||||
describe('e2e', () => {
|
||||
|
||||
let app;
|
||||
let browser;
|
||||
let page;
|
||||
let server;
|
||||
|
||||
beforeAll(async () => {
|
||||
app = express();
|
||||
app.all('/api/*', (req, res) => {
|
||||
res.send({
|
||||
method: req.method,
|
||||
protocol: req.protocol,
|
||||
hostname: req.hostname,
|
||||
path: req.path,
|
||||
url: req.url,
|
||||
query: req.query,
|
||||
body: req.body,
|
||||
headers: req.headers,
|
||||
});
|
||||
});
|
||||
server = app.listen(3000);
|
||||
browser = await puppeteer.launch();
|
||||
page = await browser.newPage();
|
||||
});
|
||||
|
||||
afterAll(async () => {
|
||||
await page.close();
|
||||
await browser.close();
|
||||
await server.close();
|
||||
});
|
||||
|
||||
it('runs in chrome', async () => {
|
||||
await page.goto('http://localhost:3000/api/test', {
|
||||
waitUntil: 'networkidle0',
|
||||
});
|
||||
const content = await page.content();
|
||||
expect(content).toBeDefined();
|
||||
});
|
||||
|
||||
it('runs in node', async () => {
|
||||
return new Promise((resolve) => {
|
||||
http.get('http://localhost:3000/api/test', (res) => {
|
||||
const chunks = [];
|
||||
res.on('data', (chunk) => {
|
||||
chunks.push(chunk);
|
||||
});
|
||||
res.on('end', () => {
|
||||
const content = Buffer.concat(chunks).toString();
|
||||
console.log(content);
|
||||
expect(content).toBeDefined();
|
||||
resolve();
|
||||
});
|
||||
})
|
||||
});
|
||||
});
|
||||
|
||||
})
|
||||
7
test/e2e/scripts/browser.js
Normal file
7
test/e2e/scripts/browser.js
Normal file
@ -0,0 +1,7 @@
|
||||
function compile(dir) {
|
||||
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
compile,
|
||||
};
|
||||
22
test/e2e/scripts/compile.js
Normal file
22
test/e2e/scripts/compile.js
Normal file
@ -0,0 +1,22 @@
|
||||
'use strict';
|
||||
|
||||
const path = require('path');
|
||||
const ts = require('typescript');
|
||||
|
||||
function compile(dir) {
|
||||
const config = {
|
||||
compilerOptions: {
|
||||
target: 'esnext',
|
||||
module: 'commonjs',
|
||||
moduleResolution: 'node',
|
||||
},
|
||||
include: ['./index.ts'],
|
||||
};
|
||||
const configFile = ts.parseConfigFileTextToJson('tsconfig.json', JSON.stringify(config));
|
||||
const configFileResult = ts.parseJsonConfigFileContent(configFile.config, ts.sys, path.resolve(process.cwd(), dir), undefined, 'tsconfig.json');
|
||||
const compilerHost = ts.createCompilerHost(configFileResult.options);
|
||||
const compiler = ts.createProgram(configFileResult.fileNames, configFileResult.options, compilerHost);
|
||||
compiler.emit();
|
||||
}
|
||||
|
||||
module.exports = compile;
|
||||
19
test/e2e/scripts/generate.js
Normal file
19
test/e2e/scripts/generate.js
Normal file
@ -0,0 +1,19 @@
|
||||
'use strict';
|
||||
|
||||
const OpenAPI = require('../../../dist');
|
||||
|
||||
async function generate(version, client) {
|
||||
await OpenAPI.generate({
|
||||
input: `./test/spec/${version}.json`,
|
||||
output: `./test/e2e/generated/src/${version}/${client}`,
|
||||
httpClient: client,
|
||||
useOptions: false,
|
||||
useUnionTypes: false,
|
||||
exportCore: true,
|
||||
exportSchemas: true,
|
||||
exportModels: true,
|
||||
exportServices: true,
|
||||
});
|
||||
}
|
||||
|
||||
module.exports = generate;
|
||||
7
test/e2e/scripts/server.js
Normal file
7
test/e2e/scripts/server.js
Normal file
@ -0,0 +1,7 @@
|
||||
function compile(dir) {
|
||||
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
compile,
|
||||
};
|
||||
@ -1,62 +0,0 @@
|
||||
'use strict';
|
||||
|
||||
const path = require('path');
|
||||
const ts = require('typescript');
|
||||
const OpenAPI = require('../../dist');
|
||||
|
||||
function compile(dir) {
|
||||
const config = {
|
||||
compilerOptions: {
|
||||
target: 'esnext',
|
||||
module: 'commonjs',
|
||||
moduleResolution: 'node',
|
||||
},
|
||||
include: ['./index.ts'],
|
||||
};
|
||||
const configFile = ts.parseConfigFileTextToJson('tsconfig.json', JSON.stringify(config));
|
||||
const configFileResult = ts.parseJsonConfigFileContent(configFile.config, ts.sys, path.resolve(process.cwd(), dir), undefined, 'tsconfig.json');
|
||||
const compilerHost = ts.createCompilerHost(configFileResult.options);
|
||||
const compiler = ts.createProgram(configFileResult.fileNames, configFileResult.options, compilerHost);
|
||||
compiler.emit();
|
||||
}
|
||||
|
||||
async function generateV2() {
|
||||
console.time('generate v2');
|
||||
await OpenAPI.generate({
|
||||
input: './test/spec/v2.json',
|
||||
output: './test/generator/dist/v2/',
|
||||
httpClient: OpenAPI.HttpClient.FETCH,
|
||||
useOptions: false,
|
||||
useUnionTypes: false,
|
||||
exportCore: true,
|
||||
exportSchemas: true,
|
||||
exportModels: true,
|
||||
exportServices: true,
|
||||
});
|
||||
console.timeEnd('generate v2');
|
||||
compile('test/generator/dist/v2/');
|
||||
}
|
||||
|
||||
async function generateV3() {
|
||||
console.time('generate v3');
|
||||
await OpenAPI.generate({
|
||||
input: './test/spec/v3.json',
|
||||
output: './test/generator/dist/v3/',
|
||||
httpClient: OpenAPI.HttpClient.FETCH,
|
||||
useOptions: false,
|
||||
useUnionTypes: false,
|
||||
exportCore: true,
|
||||
exportSchemas: true,
|
||||
exportModels: true,
|
||||
exportServices: true,
|
||||
});
|
||||
console.timeEnd('generate v3');
|
||||
compile('test/generator/dist/v3/');
|
||||
}
|
||||
|
||||
async function generate() {
|
||||
await generateV2();
|
||||
await generateV3();
|
||||
}
|
||||
|
||||
generate();
|
||||
@ -1,51 +0,0 @@
|
||||
'use strict';
|
||||
|
||||
const OpenAPI = require('../../dist');
|
||||
const glob = require('glob');
|
||||
const fs = require('fs');
|
||||
|
||||
describe('v2', () => {
|
||||
it('should generate', async () => {
|
||||
await OpenAPI.generate({
|
||||
input: './test/spec/v2.json',
|
||||
output: './test/generator/dist/v2/',
|
||||
httpClient: OpenAPI.HttpClient.FETCH,
|
||||
useOptions: false,
|
||||
useUnionTypes: false,
|
||||
exportCore: true,
|
||||
exportSchemas: true,
|
||||
exportModels: true,
|
||||
exportServices: true,
|
||||
});
|
||||
|
||||
const files = glob.sync('./test/generator/dist/v2/**/*.ts');
|
||||
|
||||
files.forEach(file => {
|
||||
const content = fs.readFileSync(file, 'utf8').toString();
|
||||
expect(content).toMatchSnapshot(file);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('v3', () => {
|
||||
it('should generate', async () => {
|
||||
await OpenAPI.generate({
|
||||
input: './test/spec/v3.json',
|
||||
output: './test/generator/dist/v3/',
|
||||
httpClient: OpenAPI.HttpClient.FETCH,
|
||||
useOptions: false,
|
||||
useUnionTypes: false,
|
||||
exportCore: true,
|
||||
exportSchemas: true,
|
||||
exportModels: true,
|
||||
exportServices: true,
|
||||
});
|
||||
|
||||
const files = glob.sync('./test/generator/dist/v3/**/*.ts');
|
||||
|
||||
files.forEach(file => {
|
||||
const content = fs.readFileSync(file, 'utf8').toString();
|
||||
expect(content).toMatchSnapshot(file);
|
||||
});
|
||||
});
|
||||
});
|
||||
38
test/index.js
Normal file
38
test/index.js
Normal file
@ -0,0 +1,38 @@
|
||||
'use strict';
|
||||
|
||||
const OpenAPI = require('../dist');
|
||||
|
||||
async function generateV2() {
|
||||
await OpenAPI.generate({
|
||||
input: './test/spec/v2.json',
|
||||
output: './test/generated/v2/',
|
||||
httpClient: OpenAPI.HttpClient.FETCH,
|
||||
useOptions: false,
|
||||
useUnionTypes: false,
|
||||
exportCore: true,
|
||||
exportSchemas: true,
|
||||
exportModels: true,
|
||||
exportServices: true,
|
||||
});
|
||||
}
|
||||
|
||||
async function generateV3() {
|
||||
await OpenAPI.generate({
|
||||
input: './test/spec/v3.json',
|
||||
output: './test/generated/v3/',
|
||||
httpClient: OpenAPI.HttpClient.FETCH,
|
||||
useOptions: false,
|
||||
useUnionTypes: false,
|
||||
exportCore: true,
|
||||
exportSchemas: true,
|
||||
exportModels: true,
|
||||
exportServices: true,
|
||||
});
|
||||
}
|
||||
|
||||
async function generate() {
|
||||
await generateV2();
|
||||
await generateV3();
|
||||
}
|
||||
|
||||
generate();
|
||||
@ -1,66 +1,47 @@
|
||||
'use strict';
|
||||
|
||||
const express = require('express');
|
||||
const puppeteer = require('puppeteer');
|
||||
const OpenAPI = require('../dist');
|
||||
const glob = require('glob');
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
const http = require('http');
|
||||
|
||||
describe('e2e', () => {
|
||||
|
||||
let app;
|
||||
let browser;
|
||||
let page;
|
||||
let server;
|
||||
|
||||
beforeAll(async () => {
|
||||
app = express();
|
||||
app.all('/api/*', (req, res) => {
|
||||
res.send({
|
||||
method: req.method,
|
||||
protocol: req.protocol,
|
||||
hostname: req.hostname,
|
||||
path: req.path,
|
||||
url: req.url,
|
||||
query: req.query,
|
||||
body: req.body,
|
||||
headers: req.headers,
|
||||
});
|
||||
describe('v2', () => {
|
||||
it('should generate', async () => {
|
||||
await OpenAPI.generate({
|
||||
input: './test/spec/v2.json',
|
||||
output: './test/generated/v2/',
|
||||
httpClient: OpenAPI.HttpClient.FETCH,
|
||||
useOptions: false,
|
||||
useUnionTypes: false,
|
||||
exportCore: true,
|
||||
exportSchemas: true,
|
||||
exportModels: true,
|
||||
exportServices: true,
|
||||
});
|
||||
server = app.listen(3000);
|
||||
browser = await puppeteer.launch();
|
||||
page = await browser.newPage();
|
||||
});
|
||||
|
||||
afterAll(async () => {
|
||||
await page.close();
|
||||
await browser.close();
|
||||
await server.close();
|
||||
});
|
||||
|
||||
it('runs in chrome', async () => {
|
||||
await page.goto('http://localhost:3000/api/test', {
|
||||
waitUntil: 'networkidle0',
|
||||
});
|
||||
const content = await page.content();
|
||||
expect(content).toBeDefined();
|
||||
});
|
||||
|
||||
it('runs in node', async () => {
|
||||
return new Promise((resolve) => {
|
||||
http.get('http://localhost:3000/api/test', (res) => {
|
||||
const chunks = [];
|
||||
res.on('data', (chunk) => {
|
||||
chunks.push(chunk);
|
||||
});
|
||||
res.on('end', () => {
|
||||
const content = Buffer.concat(chunks).toString();
|
||||
console.log(content);
|
||||
expect(content).toBeDefined();
|
||||
resolve();
|
||||
});
|
||||
})
|
||||
glob.sync('./test/generated/v2/**/*.ts').forEach(file => {
|
||||
const content = fs.readFileSync(file, 'utf8').toString();
|
||||
expect(content).toMatchSnapshot(file);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
})
|
||||
describe('v3', () => {
|
||||
it('should generate', async () => {
|
||||
await OpenAPI.generate({
|
||||
input: './test/spec/v3.json',
|
||||
output: './test/generated/v3/',
|
||||
httpClient: OpenAPI.HttpClient.FETCH,
|
||||
useOptions: false,
|
||||
useUnionTypes: false,
|
||||
exportCore: true,
|
||||
exportSchemas: true,
|
||||
exportModels: true,
|
||||
exportServices: true,
|
||||
});
|
||||
|
||||
glob.sync('./test/generated/v3/**/*.ts').forEach(file => {
|
||||
const content = fs.readFileSync(file, 'utf8').toString();
|
||||
expect(content).toMatchSnapshot(file);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@ -1,12 +0,0 @@
|
||||
import { Module } from '@nestjs/common';
|
||||
|
||||
import { ParametersController } from './controllers/ParametersController';
|
||||
import { ResponseController } from './controllers/ResponseController';
|
||||
import { SimpleController } from './controllers/SimpleController';
|
||||
|
||||
@Module({
|
||||
controllers: [SimpleController, ParametersController, ResponseController],
|
||||
})
|
||||
export class AppModule {
|
||||
//
|
||||
}
|
||||
@ -1,78 +0,0 @@
|
||||
import { Body, Controller, Get, Param, Post } from '@nestjs/common';
|
||||
import { ApiResponse, ApiTags } from '@nestjs/swagger';
|
||||
|
||||
import { ModelWithString } from '../models/ModelWithString';
|
||||
|
||||
/* eslint-disable @typescript-eslint/no-unused-vars */
|
||||
@ApiTags('parameters')
|
||||
@Controller('parameters')
|
||||
export class ParametersController {
|
||||
@Get('callWithParameters')
|
||||
public callWithParameters(
|
||||
@Param('parameterString') parameterString: string,
|
||||
@Param('parameterNumber') parameterNumber: number,
|
||||
@Param('parameterBoolean') parameterBoolean: boolean,
|
||||
@Param('parameterDictionary') parameterDictionary: Record<string, string>
|
||||
): any {
|
||||
return {
|
||||
parameterString,
|
||||
parameterNumber,
|
||||
parameterBoolean,
|
||||
parameterDictionary,
|
||||
};
|
||||
}
|
||||
|
||||
@Get('callWithWeirdParameterNames')
|
||||
public callWithWeirdParameterNames(
|
||||
@Param('parameter.1') parameter1: string,
|
||||
@Param('parameter-2') parameter2: string,
|
||||
@Param('parameter_3') parameter3: string,
|
||||
@Param('PARAMETER.4') parameter4: string,
|
||||
@Param('PARAMETER+5') parameter5: string,
|
||||
@Param('PARAMETER&6') parameter6: string
|
||||
): any {
|
||||
return {
|
||||
parameter1,
|
||||
parameter2,
|
||||
parameter3,
|
||||
parameter4,
|
||||
parameter5,
|
||||
parameter6,
|
||||
};
|
||||
}
|
||||
|
||||
@Get('callWithDefaultParameters')
|
||||
@ApiResponse({
|
||||
status: 200,
|
||||
type: ModelWithString,
|
||||
})
|
||||
public callWithDefaultParameters(
|
||||
@Param('parameterNumberWithDefault') parameterNumberWithDefault: number = 123,
|
||||
@Param('parameterBooleanWithDefault') parameterBooleanWithDefault: boolean = true,
|
||||
@Param('parameterStringWithDefault') parameterStringWithDefault: string = 'Hello World!'
|
||||
): any {
|
||||
return {
|
||||
parameterNumberWithDefault,
|
||||
parameterBooleanWithDefault,
|
||||
parameterStringWithDefault,
|
||||
};
|
||||
}
|
||||
|
||||
@Get('getCallWithBody')
|
||||
@ApiResponse({
|
||||
status: 200,
|
||||
type: ModelWithString,
|
||||
})
|
||||
public getCallWithBody(@Body() body: ModelWithString): ModelWithString {
|
||||
return body;
|
||||
}
|
||||
|
||||
@Post('postCallWithBody')
|
||||
@ApiResponse({
|
||||
status: 200,
|
||||
type: ModelWithString,
|
||||
})
|
||||
public postCallWithBody(@Body() body: ModelWithString): ModelWithString {
|
||||
return body;
|
||||
}
|
||||
}
|
||||
@ -1,129 +0,0 @@
|
||||
import { Controller, Get } from '@nestjs/common';
|
||||
import { ApiResponse, ApiTags } from '@nestjs/swagger';
|
||||
|
||||
import { ModelThatExtends } from '../models/ModelThatExtends';
|
||||
import { ModelThatExtendsExtends } from '../models/ModelThatExtendsExtends';
|
||||
import { ModelWithArray } from '../models/ModelWithArray';
|
||||
import { ModelWithBoolean } from '../models/ModelWithBoolean';
|
||||
import { ModelWithDictionary } from '../models/ModelWithDictionary';
|
||||
import { ModelWithInteger } from '../models/ModelWithInteger';
|
||||
import { ModelWithProperties } from '../models/ModelWithProperties';
|
||||
import { ModelWithReference } from '../models/ModelWithReference';
|
||||
import { ModelWithString } from '../models/ModelWithString';
|
||||
|
||||
/* eslint-disable @typescript-eslint/no-unused-vars */
|
||||
@ApiTags('response')
|
||||
@Controller('response')
|
||||
export class ResponseController {
|
||||
@Get('getString')
|
||||
@ApiResponse({ status: 200, type: String })
|
||||
public getString(): string {
|
||||
return 'Hello World!';
|
||||
}
|
||||
|
||||
@Get('getNumber')
|
||||
@ApiResponse({ status: 200, type: Number })
|
||||
public getNumber(): number {
|
||||
return 123;
|
||||
}
|
||||
|
||||
@Get('getBoolean')
|
||||
@ApiResponse({ status: 200, type: Boolean })
|
||||
public getBoolean(): boolean {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Get('getModelWithString')
|
||||
@ApiResponse({ status: 200, type: ModelWithString })
|
||||
public getModelWithString(): ModelWithString {
|
||||
return {
|
||||
prop: 'Hello World!',
|
||||
};
|
||||
}
|
||||
|
||||
@Get('getModelWithInteger')
|
||||
@ApiResponse({ status: 200, type: ModelWithInteger })
|
||||
public getModelWithInteger(): ModelWithInteger {
|
||||
return {
|
||||
prop: 123,
|
||||
};
|
||||
}
|
||||
|
||||
@Get('getModelWithBoolean')
|
||||
@ApiResponse({ status: 200, type: ModelWithBoolean })
|
||||
public getModelWithBoolean(): ModelWithBoolean {
|
||||
return {
|
||||
prop: true,
|
||||
};
|
||||
}
|
||||
|
||||
@Get('getModelWithArray')
|
||||
@ApiResponse({ status: 200, type: ModelWithArray })
|
||||
public getModelWithArray(): ModelWithArray {
|
||||
return {
|
||||
prop: ['foo', 'bar'],
|
||||
};
|
||||
}
|
||||
|
||||
@Get('getModelWithDictionary')
|
||||
@ApiResponse({ status: 200, type: ModelWithDictionary })
|
||||
public getModelWithDictionary(): ModelWithDictionary {
|
||||
return {
|
||||
prop: {
|
||||
foo: 'bar',
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
@Get('getModelWithReference')
|
||||
@ApiResponse({ status: 200, type: ModelWithReference })
|
||||
public getModelWithReference(): ModelWithReference {
|
||||
return {
|
||||
prop: {
|
||||
prop: 'Hello World!',
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
@Get('getModelWithProperties')
|
||||
@ApiResponse({ status: 200, type: ModelWithProperties })
|
||||
public getModelWithProperties(): ModelWithProperties {
|
||||
return {
|
||||
string: 'Hello World!',
|
||||
number: 123,
|
||||
boolean: true,
|
||||
array: ['foo', 'bar'],
|
||||
dictionary: {
|
||||
foo: 'bar',
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
@Get('getModelThatExtends')
|
||||
@ApiResponse({ status: 200, type: ModelThatExtends })
|
||||
public getModelThatExtends(): ModelThatExtends {
|
||||
return {
|
||||
prop: 'prop',
|
||||
propertyA: 'propertyA',
|
||||
propertyB: {
|
||||
prop: 'propertyB',
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
@Get('getModelThatExtendsExtends')
|
||||
@ApiResponse({ status: 200, type: ModelThatExtendsExtends })
|
||||
public getModelThatExtendsExtends(): ModelThatExtendsExtends {
|
||||
return {
|
||||
prop: 'prop',
|
||||
propertyA: 'propertyA',
|
||||
propertyB: {
|
||||
prop: 'propertyB',
|
||||
},
|
||||
propertyC: 'propertyC',
|
||||
propertyD: {
|
||||
prop: 'propertyD',
|
||||
},
|
||||
};
|
||||
}
|
||||
}
|
||||
@ -1,42 +0,0 @@
|
||||
import { Controller, Delete, Get, Head, Options, Patch, Post, Put } from '@nestjs/common';
|
||||
import { ApiTags } from '@nestjs/swagger';
|
||||
|
||||
/* eslint-disable @typescript-eslint/no-unused-vars */
|
||||
@ApiTags('simple')
|
||||
@Controller('simple')
|
||||
export class SimpleController {
|
||||
@Get('getCallWithoutParametersAndResponse')
|
||||
public getCallWithoutParametersAndResponse(): void {
|
||||
//
|
||||
}
|
||||
|
||||
@Put('putCallWithoutParametersAndResponse')
|
||||
public putCallWithoutParametersAndResponse(): void {
|
||||
//
|
||||
}
|
||||
|
||||
@Post('postCallWithoutParametersAndResponse')
|
||||
public postCallWithoutParametersAndResponse(): void {
|
||||
//
|
||||
}
|
||||
|
||||
@Delete('deleteCallWithoutParametersAndResponse')
|
||||
public deleteCallWithoutParametersAndResponse(): void {
|
||||
//
|
||||
}
|
||||
|
||||
@Options('optionsCallWithoutParametersAndResponse')
|
||||
public optionsCallWithoutParametersAndResponse(): void {
|
||||
//
|
||||
}
|
||||
|
||||
@Head('headCallWithoutParametersAndResponse')
|
||||
public headCallWithoutParametersAndResponse(): void {
|
||||
//
|
||||
}
|
||||
|
||||
@Patch('patchCallWithoutParametersAndResponse')
|
||||
public patchCallWithoutParametersAndResponse(): void {
|
||||
//
|
||||
}
|
||||
}
|
||||
@ -1,25 +0,0 @@
|
||||
import { NestFactory } from '@nestjs/core';
|
||||
import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger';
|
||||
|
||||
import { AppModule } from './AppModule';
|
||||
|
||||
/**
|
||||
* This is a simple OpenAPI test server that we use to run e2e tests. You can find
|
||||
* more information inside the controllers and models of this server.
|
||||
* When you run this server the following urls are available:
|
||||
* - Swagger UI: http://localhost:3000/api
|
||||
* - Swagger Specification: http://localhost:3000/api-json
|
||||
*/
|
||||
async function bootstrap(): Promise<void> {
|
||||
const app = await NestFactory.create(AppModule);
|
||||
|
||||
const options = new DocumentBuilder().setTitle('OpenAPI').setVersion('1.0').build();
|
||||
|
||||
const document = SwaggerModule.createDocument(app, options);
|
||||
|
||||
SwaggerModule.setup('api', app, document);
|
||||
|
||||
await app.listen(3000);
|
||||
}
|
||||
|
||||
bootstrap();
|
||||
@ -1,11 +0,0 @@
|
||||
import { ApiProperty } from '@nestjs/swagger';
|
||||
|
||||
import { ModelWithString } from './ModelWithString';
|
||||
|
||||
export class ModelThatExtends extends ModelWithString {
|
||||
@ApiProperty()
|
||||
public readonly propertyA?: string;
|
||||
|
||||
@ApiProperty()
|
||||
public readonly propertyB?: ModelWithString;
|
||||
}
|
||||
@ -1,12 +0,0 @@
|
||||
import { ApiProperty } from '@nestjs/swagger';
|
||||
|
||||
import { ModelThatExtends } from './ModelThatExtends';
|
||||
import { ModelWithString } from './ModelWithString';
|
||||
|
||||
export class ModelThatExtendsExtends extends ModelThatExtends {
|
||||
@ApiProperty()
|
||||
public readonly propertyC?: string;
|
||||
|
||||
@ApiProperty()
|
||||
public readonly propertyD?: ModelWithString;
|
||||
}
|
||||
@ -1,6 +0,0 @@
|
||||
import { ApiProperty } from '@nestjs/swagger';
|
||||
|
||||
export class ModelWithArray {
|
||||
@ApiProperty()
|
||||
public readonly prop?: string[];
|
||||
}
|
||||
@ -1,6 +0,0 @@
|
||||
import { ApiProperty } from '@nestjs/swagger';
|
||||
|
||||
export class ModelWithBoolean {
|
||||
@ApiProperty()
|
||||
public readonly prop?: boolean;
|
||||
}
|
||||
@ -1,6 +0,0 @@
|
||||
import { ApiProperty } from '@nestjs/swagger';
|
||||
|
||||
export class ModelWithDictionary {
|
||||
@ApiProperty()
|
||||
public readonly prop?: Record<string, string>;
|
||||
}
|
||||
@ -1,6 +0,0 @@
|
||||
import { ApiProperty } from '@nestjs/swagger';
|
||||
|
||||
export class ModelWithInteger {
|
||||
@ApiProperty()
|
||||
public readonly prop?: number;
|
||||
}
|
||||
@ -1,18 +0,0 @@
|
||||
import { ApiProperty } from '@nestjs/swagger';
|
||||
|
||||
export class ModelWithProperties {
|
||||
@ApiProperty()
|
||||
public readonly number?: number;
|
||||
|
||||
@ApiProperty()
|
||||
public readonly string?: string;
|
||||
|
||||
@ApiProperty()
|
||||
public readonly boolean?: boolean;
|
||||
|
||||
@ApiProperty()
|
||||
public readonly array?: string[];
|
||||
|
||||
@ApiProperty()
|
||||
public readonly dictionary?: Record<string, string>;
|
||||
}
|
||||
@ -1,8 +0,0 @@
|
||||
import { ApiProperty } from '@nestjs/swagger';
|
||||
|
||||
import { ModelWithString } from './ModelWithString';
|
||||
|
||||
export class ModelWithReference {
|
||||
@ApiProperty()
|
||||
public readonly prop?: ModelWithString;
|
||||
}
|
||||
@ -1,6 +0,0 @@
|
||||
import { ApiProperty } from '@nestjs/swagger';
|
||||
|
||||
export class ModelWithString {
|
||||
@ApiProperty()
|
||||
public readonly prop?: string;
|
||||
}
|
||||
@ -1,13 +0,0 @@
|
||||
{
|
||||
"extends": "../../tsconfig.json",
|
||||
|
||||
"compilerOptions": {
|
||||
"outDir": "./dist",
|
||||
"module": "commonjs"
|
||||
},
|
||||
|
||||
"include": [
|
||||
"./src/**/*.ts"
|
||||
]
|
||||
}
|
||||
|
||||
@ -17,8 +17,6 @@
|
||||
"strictNullChecks": true,
|
||||
"strictFunctionTypes": true,
|
||||
"removeComments": true,
|
||||
"emitDecoratorMetadata": true,
|
||||
"experimentalDecorators": true,
|
||||
"allowSyntheticDefaultImports": true
|
||||
},
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user