legacy/routes/queries.js (315 lines of code) (raw):

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;