diff --git a/legacy/app.js b/legacy/app.js index 9580e040..abf6b29e 100644 --- a/legacy/app.js +++ b/legacy/app.js @@ -31,6 +31,7 @@ var formData = require('./routes/formData'); var lros = require('./routes/lros'); var lroParameterizedEndpoints = require('./routes/lroParameterizedEndpoints.js'); var paging = require('./routes/paging'); +var pagingSpecial = require('./routes/pagingSpecial'); var modelFlatten = require('./routes/model-flatten'); var azureUrl = require('./routes/azureUrl'); var azureSpecial = require('./routes/azureSpecials'); @@ -548,6 +549,7 @@ app.use('/model-flatten', new modelFlatten(coverage).router); app.use('/lro', new lros(azurecoverage).router); app.use('/lroParameterizedEndpoints', new lroParameterizedEndpoints(azurecoverage).router); app.use('/paging', new paging(azurecoverage).router); +app.use('/pagingSpecial', new pagingSpecial(optionalCoverage).router) app.use('/azurespecials', new azureSpecial(azurecoverage).router); app.use('/report', new report(coverage, azurecoverage, optionalCoverage).router); app.use('/subscriptions', new azureUrl(azurecoverage).router); diff --git a/legacy/routes/pagingSpecial.js b/legacy/routes/pagingSpecial.js new file mode 100644 index 00000000..76f03552 --- /dev/null +++ b/legacy/routes/pagingSpecial.js @@ -0,0 +1,92 @@ +var express = require('express'); +var router = express.Router(); +var util = require('util'); +var utils = require('../util/utils'); + +var pagingSpecial = function(optionalCoverage) { + optionalCoverage['PagingSpecialNextLinkInResponseHeaders'] = 0; + optionalCoverage['PagingSpecialContinuationToken'] = 0; + optionalCoverage["PagingSpecialContinuationTokenInResponseHeaders"] = 0; + optionalCoverage["PagingSpecialContinuationTokenWithMetadata"] = 0; + + + router.get('/nextLinkInResponseHeaders', function(req, res, next) { + var headers = { + 'x-ms-nextLink': '/pagingSpecial/nextLinkInResponseHeaders/page/2', + }; + res.set(headers).status(200).json({ "value" : [ {"properties":{"name": "Product" }}] }); + }); + + + router.get('/nextLinkInResponseHeaders/page/:pagenumber', function(req, res, next) { + if (req.params.pagenumber < 10) { + var headers = { + 'x-ms-nextLink': '/pagingSpecial/nextLinkInResponseHeaders/page/' + (++req.params.pagenumber), + }; + res.set(headers).status(200).json({"value": [ {"properties":{"name": "product"}} ]}); + } else { + optionalCoverage['PagingSpecialNextLinkInResponseHeaders']++; + res.status(200).json({"value": [ {"properties":{"name": "product"}} ]}); + } + }); + + router.get('/continuationToken', function(req, res, next) { + + if (req.headers["x-ms-token"]) { + contToken = req.headers["x-ms-token"] + if (contToken < 10) { + res.status(200).json({ "value": [ {"properties":{"name": "product"}} ], "token": ++contToken}); + } else { + res.status(200).json({"value": [ {"properties":{"name": "product"}} ]}); + } + + } else { + optionalCoverage['PagingSpecialContinuationToken']++; + res.status(200).json({ "value": [ {"properties":{"name": "product"}} ], "token": 2}); + } + + }); + + router.get('/continuationTokenInResponseHeaders', function(req, res, next) { + + if (req.headers["x-ms-token"]) { + contToken = req.headers["x-ms-token"] + if (contToken < 10) { + var headers = { + "x-ms-token": ++contToken, + }; + res.set(headers).status(200).json({ "value" : [ {"properties":{"name": "Product" }}] }); + } else { + optionalCoverage["PagingSpecialContinuationTokenInResponseHeaders"]++; + res.status(200).json({"value": [ {"properties":{"name": "product"}} ]}); + } + + } else { + var headers = { + "x-ms-token": 2, + }; + res.set(headers).status(200).json({ "value" : [ {"properties":{"name": "Product" }}] }); + } + + }); + + router.get('/tokenWithMetadata', function(req, res, next) { + if (req.headers["x-ms-token"]) { + contToken = req.headers["x-ms-token"] + if (contToken < 10) { + res.status(200).json({ "value": [ {"properties":{"name": "product"}} ], "token": ++contToken + ";10"}); + } else { + optionalCoverage['PagingSpecialContinuationTokenWithMetadata']++; + res.status(200).json({"value": [ {"properties":{"name": "product"}} ]}); + } + + } else { + res.status(200).json({ "value": [ {"properties":{"name": "product"}} ], "token": "2;10"}); + } + }); + +}; + +pagingSpecial.prototype.router = router; + +module.exports = pagingSpecial; diff --git a/package.json b/package.json index 0cf6d4b3..8f92aa0d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@microsoft.azure/autorest.testserver", - "version": "2.10.65", + "version": "2.10.66", "main": "./legacy/startup/www.js", "bin": { "start-autorest-express": "./.scripts/start-autorest-express.js", diff --git a/swagger/paging-special.json b/swagger/paging-special.json new file mode 100644 index 00000000..76da16f2 --- /dev/null +++ b/swagger/paging-special.json @@ -0,0 +1,155 @@ +{ + "swagger": "2.0", + "info": { + "title": "AutoRest Special Paging Test Service", + "description": "Long-running Operation for AutoRest", + "version": "1.0.0" + }, + "host": "localhost:3000", + "schemes": [ + "http" + ], + "produces": [ + "application/json" + ], + "consumes": [ + "application/json" + ], + "paths": { + "/pagingSpecial/nextLinkInResponseHeaders": { + "get": { + "x-ms-pageable": { "nextLinkName": null}, + "operationId": "nextLinkInResponseHeaders", + "description": "A paging operation where the next link is found in the response headers, not in the response body", + "responses": { + "200": { + "headers": { + "x-ms-nextLink": { + "description": "Next link for subsequent calls", + "type": "string" + } + }, + "description": "Returns a list of products, where the next link for continued paging is located in response header x-ms-nextLink.", + "schema": { + "$ref": "#/definitions/ProductResultValue" + } + }, + "default": { + "description": "Unexpected error" + } + } + } + }, + "/pagingSpecial/continuationToken": { + "get": { + "x-ms-pageable": { "nextLinkName": "token"}, + "operationId": "continuationToken", + "description": "A paging operation where the token in the response body needs to be passed into subsequent calls.", + "responses": { + "200": { + "description": "Returns a list of products", + "schema": { + "$ref": "#/definitions/ProductResultValueWithToken" + } + }, + "default": { + "description": "Unexpected error" + } + } + } + }, + "/pagingSpecial/continuationTokenInResponseHeaders": { + "get": { + "x-ms-pageable": { "nextLinkName": null}, + "operationId": "continuationTokenInResponseHeaders", + "description": "A paging operation where the continuation is found in the response headers, and needs to be passed into subsequent calls.", + "parameters": [ + { + "name": "continuationToken", + "in": "header", + "type": "string", + "description": "Continuation token for subsequent paging." + } + ], + "responses": { + "200": { + "headers": { + "x-ms-continuationToken": { + "description": "Next link for subsequent calls", + "type": "string" + } + }, + "description": "Returns a list of products, where the next link for continued paging is located in response header x-ms-nextLink.", + "schema": { + "$ref": "#/definitions/ProductResultValueWithToken" + } + }, + "default": { + "description": "Unexpected error" + } + } + } + }, + "/pagingSpecial/tokenWithMetadata": { + "get": { + "x-ms-pageable": { "nextLinkName": "token"}, + "operationId": "tokenWithMetadata", + "description": "A paging operation that returns a continuation token, and metadata about the number of total results. Should be able to access metadata from pager.", + "responses": { + "200": { + "description": "Returns a list of products. Should be able to access the metadata from the pager returned by this operation, which is just the number 10 (the number of items)", + "schema": { + "$ref": "#/definitions/ProductResultValueWithToken" + } + }, + "default": { + "description": "Unexpected error" + } + } + } + } + }, + "definitions": { + "ProductResultValue": { + "type": "object", + "properties": { + "value": { + "type": "array", + "items": { + "$ref": "#/definitions/Product" + } + }, + "nextLink": { + "type": "string" + } + } + }, + "ProductResultValueWithToken": { + "type": "object", + "properties": { + "value": { + "type": "array", + "items": { + "$ref": "#/definitions/Product" + } + }, + "token": { + "type": "string" + } + } + }, + "Product": { + "type": "object", + "properties": { + "properties": { + "type": "object", + "properties": { + "name": { + "type": "string" + } + } + } + } + } + } + }