mirror of
https://github.com/OpenAPITools/openapi-generator.git
synced 2025-05-13 21:20:56 +00:00
* create nodejs express esrver * 1st commit of the express.js module. Express server working, api-docs loads properly. No real paths yet * 1st commit of the express.js module. Express server working, api-docs loads properly. No real paths yet (#2839) * Working Express server with successful routing to controllers. * rewrote controllers and services. Haven't tested yet * controllers and services have passed tests successfully * Added documentation * Added documentation * Support for openApi v3, using 'express-openapi-validator' for parsing and validation, and an internal router to pass arguments to controllers and services. /controllers/Pet.js and /services/PetService.js should be used for reverse engineering for future codegen script * update generator and template * update samples * more update * update service, controller * add vendor extensions * some updates to adapt to changes in the generator (removing references to swager); some work on handling file uploads; some work on tests * Update NodeJS server generator and templates based on new output (#3261) * update generator and template * update samples * more update * update service, controller * add vendor extensions * update doc * Changed routing code to follow the following convention: Each path operation has a 'x-openapi-router-controller' and 'x-openapi-router-service'. Automated files will be placed under /controllers and /services respectively. Controller file names will end with 'Controller.js'. Removed swaggerRouter, replaced it with openapiRouter Routing works and simple tests show a return of 200 to requests. * [nodejs-express-server] various updates, fixes (#3319) * various fix * remove dot from service * add space * better method empty argument * remove test service (#3379) * add new doc * 1. routingTests.js runs through all operations described in openapi.yaml and tries calling them, expecting 200 in return. Currently not all tests pass - not supporting xml, and problems with formData 2. Removed old testing files. 3. Added model files - contain data and structure as defined in openapi.yaml. Model.js has static methods relevant to all model files. 4. Changed openapi.yaml to allow running tests easily. * 1. routingTests.js runs through all operations described in openapi.yaml and tries calling them, expecting 200 in return. Currently not all tests pass - not supporting xml, and problems with formData (#3442) 2. Removed old testing files. 3. Added model files - contain data and structure as defined in openapi.yaml. Model.js has static methods relevant to all model files. 4. Changed openapi.yaml to allow running tests easily. * added model classes. Currently as a concept only. Seems like won't be in use * Updated README.md to be a detailed description of the project. Removed test files that are not needed. Removed utils/writer.js which is not needed, and the references to it in the codegen files * Removed redundant file app.js - this file has no benefit at this point. index.js now calls ExpressServer.js directly. Updated files that used to call app.js. Updated README.md accordingly Added a path to call the openapi.yaml, and a test file for all endpoints that are not in the openapi.yaml, ensuring that they return 200. Updated README.md accordingly * Remove test controller (#3575) * remove test controller * add back changes to templates * remove app.js * update wording
148 lines
4.7 KiB
JavaScript
148 lines
4.7 KiB
JavaScript
/**
|
|
* The purpose of these tests is to confirm that every path in the openapi spec, if built properly,
|
|
* returns a valid 200, with a simple text response.
|
|
* The codeGen will generate a response string including the name of the operation that was called.
|
|
* These tests confirm that the codeGen worked as expected.
|
|
* Once we start adding our own business logic, these
|
|
* tests will fail. It is recommended to keep these tests updated with the code changes.
|
|
*/
|
|
const {
|
|
describe, before, after, it,
|
|
} = require('mocha');
|
|
const assert = require('assert').strict;
|
|
const chai = require('chai');
|
|
const chaiAsPromised = require('chai-as-promised');
|
|
const axios = require('axios');
|
|
const yamljs = require('yamljs');
|
|
const openApiSampler = require('openapi-sampler');
|
|
const jstoxml = require('jstoxml');
|
|
const logger = require('./logger');
|
|
const config = require('./config');
|
|
const ExpressServer = require('../expressServer');
|
|
|
|
const app = new ExpressServer(config.URL_PORT, config.OPENAPI_YAML);
|
|
chai.use(chaiAsPromised);
|
|
chai.should();
|
|
|
|
|
|
const pathPrefix = `${config.URL_PATH}:${config.URL_PORT}/api/v2`;
|
|
const spec = yamljs.load(config.OPENAPI_YAML);
|
|
|
|
const parseParameters = (originalPath, schemaParameters) => {
|
|
let path = originalPath;
|
|
const headers = {};
|
|
const queryParams = [];
|
|
schemaParameters.forEach((parameter) => {
|
|
const parameterValue = parameter.example || openApiSampler.sample(parameter.schema);
|
|
switch (parameter.in) {
|
|
case 'header':
|
|
headers[parameter.name] = parameterValue;
|
|
break;
|
|
case 'path':
|
|
path = path.replace(`{${parameter.name}}`, parameterValue);
|
|
break;
|
|
case 'query':
|
|
queryParams.push(`${parameter.name}=${parameterValue}`);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
});
|
|
return { path, headers, queryString: queryParams.join('&') };
|
|
};
|
|
|
|
const buildRequestObject = (pathEndpoint, method, operationObject, requestsArray) => {
|
|
logger.info(`method: ${method}`);
|
|
let headers = {};
|
|
let requestBody = {};
|
|
let queryString = '';
|
|
let path = pathEndpoint;
|
|
if (operationObject.parameters !== undefined) {
|
|
logger.info('this is a request with parameters');
|
|
({ path, headers, queryString } = parseParameters(pathEndpoint, operationObject.parameters));
|
|
if (queryString.length > 0) {
|
|
path += `?${queryString}`;
|
|
}
|
|
Object.entries(headers).forEach(([headerName, headerValue]) => {
|
|
headers[headerName] = headerValue;
|
|
});
|
|
}
|
|
if (operationObject.requestBody !== undefined) {
|
|
logger.info('This is a request with a body');
|
|
const content = Object.entries(operationObject.requestBody.content);
|
|
content.forEach(([contentType, contentObject]) => {
|
|
requestBody = openApiSampler.sample(contentObject.schema, {}, spec);
|
|
let requestXML;
|
|
if (contentType === 'application/xml') {
|
|
requestXML = jstoxml.toXML(requestBody);
|
|
}
|
|
headers['Content-Type'] = contentType;
|
|
requestsArray.push({
|
|
method,
|
|
path,
|
|
body: requestXML || requestBody,
|
|
headers,
|
|
});
|
|
});
|
|
} else {
|
|
requestsArray.push({
|
|
method,
|
|
path,
|
|
headers,
|
|
});
|
|
}
|
|
};
|
|
|
|
const getApiRequestsData = (apiSchema) => {
|
|
const requestsArray = [];
|
|
Object.entries(apiSchema.paths).forEach(([pathEndpoint, pathObject]) => {
|
|
logger.info(`adding path: ${pathPrefix}${pathEndpoint} to testing array`);
|
|
Object.entries(pathObject).forEach(([operationMethod, operationObject]) => {
|
|
buildRequestObject(pathEndpoint, operationMethod, operationObject, requestsArray);
|
|
});
|
|
});
|
|
return requestsArray;
|
|
};
|
|
|
|
describe('API tests, checking that the codegen generated code that allows all paths specified in schema to work', () => {
|
|
before(async () => {
|
|
try {
|
|
await app.launch();
|
|
logger.info('express server launched\n');
|
|
} catch (error) {
|
|
logger.info(error);
|
|
await app.close();
|
|
throw (error);
|
|
}
|
|
});
|
|
|
|
after(async () => {
|
|
await app.close()
|
|
.catch(error => logger.error(error));
|
|
logger.error('express server closed');
|
|
});
|
|
|
|
const requestsArray = getApiRequestsData(spec);
|
|
requestsArray.forEach((requestObject) => {
|
|
it(`should run ${requestObject.method.toUpperCase()} request to ${requestObject.path} and return healthy 200`, async () => {
|
|
try {
|
|
const {
|
|
method, path, body, headers,
|
|
} = requestObject;
|
|
const url = `${pathPrefix}${path}`;
|
|
logger.info(`testing ${method.toUpperCase()} call to ${url}. encoding: ${headers['Content-Type']}`);
|
|
const response = await axios({
|
|
method,
|
|
url,
|
|
data: body,
|
|
headers,
|
|
});
|
|
response.should.have.property('status');
|
|
response.status.should.equal(200);
|
|
} catch (e) {
|
|
assert.fail(e.message);
|
|
}
|
|
});
|
|
});
|
|
});
|