@microsoft.azure/autorest.testserver
Version:
This project contains a set of OpenAPI definitions and a server implementing the corresponding API. Use this to test compliance of AutoRest generators.
276 lines (255 loc) • 11.3 kB
JavaScript
var express = require('express');
var router = express.Router();
var util = require('util');
var constants = require('../util/constants');
var utils = require('../util/utils')
var scenarioMap = {
"true": "True",
"false": "False",
"1000000": "Positive",
"-1000000": "Negative",
"10000000000": "Positive",
"-10000000000": "Negative",
"1.034E+20": "Positive",
"-1.034E-20": "Negative",
"9999999.999": "Positive",
"-9999999.999": "Negative",
"begin!*'();:@ &=+$,/?#[]end": "UrlEncoded",
"multibyte": "MultiByte",
"empty": "Empty",
"null": "Null",
"2012-01-01": "Valid",
"2012-01-01T01:01:01Z": "Valid",
"green color": "Valid",
"unicode": "Unicode"
};
var typeMap = {
"bool": "Bool",
"int": "Int",
"long": "Long",
"float": "Float",
"double": "Double",
"string": "String",
"byte": "Byte",
"date": "Date",
"datetime": "DateTime",
"enum" : "Enum"
};
var queryParameterMap = {
"bool": "boolQuery",
"int": "intQuery",
"long": "longQuery",
"float": "floatQuery",
"double": "doubleQuery",
"string": "stringQuery",
"byte": "byteQuery",
"date": "dateQuery",
"datetime": "dateTimeQuery",
"enum": "enumQuery"
};
var getScenarioName = function (type, scenario) {
console.log('received type "' + type + '" and scenario "' + scenario + '"\n');
var parsedType = typeMap[type];
var parsedScenario = scenarioMap[scenario];
if (!parsedScenario || !parsedType) {
return null;
}
console.log('Got parsed type "' + parsedType + '" and parsed scenario "' + parsedScenario + '"\n');
return '' + parsedType + parsedScenario;
}
var getQueryParameterName = function (type) {
console.log('received type "' + type + '"\n');
var queryParam = queryParameterMap[type];
if (!queryParam) {
return null;
}
console.log('Got parsed query parameter name "' + queryParam + '\n');
return '' + queryParam;
}
var validateArrayQuery = function (arrayValue, separator) {
var testValue = arrayValue;
if (Array.isArray(arrayValue))
{
if (arrayValue.length != 4)
{
return false;
}
testValue = arrayValue.toString()
}
console.log('received array value "' + testValue + '" separator "' + separator + '"');
return (testValue === "ArrayQuery1" + separator + "begin!*'();:@ &=+$,/?#[]end" + separator + separator);
}
var queries = function (coverage) {
router.get('/:type/empty', function (req, res, next) {
console.log("inside router\n");
var type = req.params.type;
var scenario = "empty";
var queryName = getQueryParameterName(type);
var test = getScenarioName(type, scenario);
var queryParamCount = Object.keys(req.query).length;
if (test === null) {
console.log("test was null\n");
utils.send400(res, next, 'Unable to parse scenario \"\/paths\/' + type + '\/' + scenario + '\"');
} else if (scenario === "empty" && queryParamCount == 1 && req.query[queryName] === '') {
console.log("in empty test\n");
coverage['UrlQueries' + test]++;
res.status(200).end();
} else {
console.log('Null Failure!\n');
utils.send400(res, next, 'Failed null test for type "' + type + '" received query parameter "' + util.inspect(req.query) + '"');
}
});
router.get('/:type/null', function (req, res, next) {
console.log("inside router\n");
var type = req.params.type;
var scenario = "null";
var queryName = getQueryParameterName(type);
var test = getScenarioName(type, scenario);
if (test === null) {
console.log("test was null\n");
utils.send400(res, next, 'Unable to parse scenario \"\/paths\/' + type + '\/' + scenario + '\"');
} else if (scenario === "null" && Object.keys(req.query).length == 0) {
console.log("in null test\n");
coverage['UrlQueries' + test]++;
res.status(200).end();
} else {
console.log('Null Failure!\n');
utils.send400(res, next, 'Failed null test for type "' + type + '" received query parameter "' + util.inspect(req.query) + '"');
}
});
router.get('/array/:format/string/:scenario', function (req, res, next) {
console.log("inside router\n");
var type = req.params.type;
var scenario = req.params.scenario;
var format = req.params.format;
var test = getScenarioName(type, scenario);
if (format === 'csv') {
console.log("In csv test\n");
if (scenario === 'null' && Object.keys(req.query).length == 0) {
coverage['UrlQueriesArrayCsvNull']++;
res.status(200).end();
} else if (scenario === 'empty' && Object.keys(req.query).length == 1 && req.query.arrayQuery === '') {
coverage['UrlQueriesArrayCsvEmpty']++;
res.status(200).end();
} else if ((scenario === 'valid') && Object.keys(req.query).length == 1 && validateArrayQuery(req.query.arrayQuery, ',')) {
coverage['UrlQueriesArrayCsvValid']++;
res.status(200).end();
} else {
utils.send400(res, next, 'Failed csv array scenario format "' + format + '", scenario "' + scenario + '"');
}
} else if (format === 'multi') {
console.log("In multi test\n");
if (scenario === 'null' && Object.keys(req.query).length == 0) {
coverage['UrlQueriesArrayMultiNull']++;
res.status(200).end();
} else if (scenario === 'empty' && Object.keys(req.query).length == 0) {
coverage['UrlQueriesArrayMultiEmpty']++;
res.status(200).end();
} else if ((scenario === 'valid') && Object.keys(req.query).length == 1 && validateArrayQuery(req.query.arrayQuery, ',')) {
//Note: comma is used as a seperator to test multi format with becuase Array.toString returns comma seperated list
coverage['UrlQueriesArrayMultiValid']++;
res.status(200).end();
} else {
utils.send400(res, next, 'Failed csv array scenario format "' + format + '", scenario "' + scenario + '"');
}
} else if (format === 'ssv' && scenario === 'valid') {
console.log("in ssv test\n");
if ((scenario === 'valid') && Object.keys(req.query).length == 1 && validateArrayQuery(req.query.arrayQuery, ' ')) {
coverage['UrlQueriesArraySsvValid']++;
res.status(200).end();
} else {
utils.send400(res, next, 'Failed ssv array scenario format "' + format + '", scenario "' + scenario + '"');
}
} else if (format === 'tsv' && scenario === 'valid') {
console.log("in tsv test\n");
if ((scenario === 'valid') && Object.keys(req.query).length == 1 && validateArrayQuery(req.query.arrayQuery, '\t')) {
coverage['UrlQueriesArrayTsvValid']++;
res.status(200).end();
} else {
utils.send400(res, next, 'Failed tsv array scenario format "' + format + '", scenario "' + scenario + '"');
}
} else if (format === 'pipes' && scenario === 'valid') {
console.log("in pipes test\n");
if ((scenario === 'valid') && Object.keys(req.query).length == 1 && validateArrayQuery(req.query.arrayQuery, '|')) {
coverage['UrlQueriesArrayPipesValid']++;
res.status(200).end();
} else {
utils.send400(res, next, 'Failed pipes array scenario format "' + format + '", scenario "' + scenario + '"');
}
} else if (format == "none") {
if (req.query.arrayQuery == 'hello,nihao,bonjour') {
coverage['UrlQueriesArrayNoCollectionFormatValid']++;
res.status(200).end();
} else {
utils.send400(res, next, "'arrayQuery' parameter must be of value 'hello,nihao,bonjour', not '" + req.query["arrayQuery"] + "'");
}
} else {
console.log('Array Failure!\n');
utils.send400(res, next, 'Unable to find matching Array scenario for format "' + format + '" scenario "' + scenario + '"');
}
});
router.get('/:type/:scenario', function (req, res, next) {
var type = req.params.type;
var scenario = req.params.scenario;
var queryName = getQueryParameterName(type);
var wireParameter = req.query[queryName];
var test = getScenarioName(type, scenario);
console.log('inside main function with values type "' + type + '" scenario "' + scenario +
'" queryName "' + queryName + '" wireParameter "' + wireParameter + '"\n');
var bytes = new Buffer(constants.MULTIBYTE_BUFFER);
if (type === 'enum' || type === 'date' ||
type === 'datetime' ||
scenario === 'multibyte' ||
(type === 'string' &&
scenario.indexOf('begin') === 0) ||
scenario == 'unicode') {
scenario = '"' + scenario + '"';
wireParameter = '"' + wireParameter + '"';
}
scenario = JSON.parse(scenario);
wireParameter = JSON.parse(wireParameter);
if (test === null) {
console.log("test was null\n");
utils.send400(res, next, 'Unable to parse scenario \"\/paths\/' + type + '\/' + scenario + '\"');
} else if (scenario === "null" && (wireParameter)) {
console.log("in null test\n");
utils.send400(res, next, 'Null scenario must have empty query parameter instead of \"' + wireParameter + '\"');
} else if (scenario === "empty" && (wireParameter !== '' && wireParameter !== null)) {
console.log("in empty test\n");
utils.send400(res, next, 'Empty scenario must have empty parameter instead of \"' + wireParameter + '\"');
} else if (type === 'string' || type === 'date' || type === 'enum') {
if (scenario === wireParameter || (scenario === 'unicode' && wireParameter === '啊齄丂狛狜隣郎隣兀﨩')) {
console.log("Success!\n");
coverage['UrlQueries' + test]++;
res.status(200).end();
} else {
utils.send400(res, next, 'Failed ' + type + ' scenario \"' + scenario + '\" does not match wire parameter \"' + wireParameter + '\"');
}
} else if (type === 'byte') {
if (scenario === 'multibyte' && wireParameter === bytes.toString("base64")) {
console.log("Success!\n");
coverage['UrlQueries' + test]++;
res.status(200).end();
} else {
utils.send400(res, next, 'Failed byte scenario \"' + wireParameter + '\" does not match expected encoded string \"' + bytes.toString("base64") + '\"');
}
} else if (type === 'datetime') {
if (utils.coerceDate(wireParameter) === scenario) {
console.log("Success!\n");
coverage['UrlQueries' + test]++;
res.status(200).end();
} else {
utils.send400(res, next, 'Failed date-time scenario \"' + utils.coerceDate(wireParameter) + '\" does not match expected date string \"' + scenario +'\"');
}
} else if (scenario === wireParameter) {
console.log("Success!\n");
coverage['UrlQueries' + test]++;
res.status(200).end();
} else {
console.log("mismatched parameters\n");
utils.send400(res, next, 'Expected query parameter \"' + scenario + '\" does not match wire parameter \"' + wireParameter + '\"');
}
});
}
queries.prototype.router = router;
module.exports = queries;