UNPKG

express-version-request

Version:

versions an incoming request to Express based on header or URL

188 lines (140 loc) 6.36 kB
'use strict' const test = require('ava') const versionRequest = require('../index') const sinon = require('sinon') test.beforeEach(t => { t.context.req = { headers: {} } }) test('we can set the version using the Accept header version field', t => { const versionNumber = '1.0.0' t.context.req.headers['accept'] = 'application/vnd.company+json;version=' + versionNumber const middleware = versionRequest.setVersionByAcceptHeader() middleware(t.context.req, {}, () => { t.deepEqual(t.context.req.version, versionNumber) }) }) test('we can set the version using the Accept header version field, even if we have multiple parameters', t => { const versionNumber = '1.0.0' t.context.req.headers['accept'] = 'application/vnd.company+json;param1=1,version=' + versionNumber + ', param3=3' const middleware = versionRequest.setVersionByAcceptHeader() middleware(t.context.req, {}, () => { t.deepEqual(t.context.req.version, versionNumber) }) }) test('we can set the version using the Accept header version field, even if it has funky whitespaces', t => { const versionNumber = '1.0.0' t.context.req.headers['accept'] = 'application/vnd.company+json; param1=1, version =' + versionNumber + ' , param3=3' const middleware = versionRequest.setVersionByAcceptHeader() middleware(t.context.req, {}, () => { t.deepEqual(t.context.req.version, versionNumber) }) }) test('we can set the version using the Accept header version field, even if it mixes lower- and uppercase characters', t => { const versionNumber = '1.0.0' t.context.req.headers['accept'] = 'application/vnd.company+json; param1=1, Version =' + versionNumber + ' , param3=3' const middleware = versionRequest.setVersionByAcceptHeader() middleware(t.context.req, {}, () => { t.deepEqual(t.context.req.version, versionNumber) }) }) test('dont set the version if the Accept header has no "version" parameter', t => { t.context.req.headers['accept'] = 'application/vnd.company+json;param1=1, param2=2' const middleware = versionRequest.setVersionByAcceptHeader() middleware(t.context.req, {}, () => { t.deepEqual(t.context.req.version, undefined) }) }) test('dont set the version if the Accept header has no parameters at all', t => { t.context.req.headers['accept'] = 'application/vnd.company+json;' const middleware = versionRequest.setVersionByAcceptHeader() middleware(t.context.req, {}, () => { t.deepEqual(t.context.req.version, undefined) }) }) test('dont set the version if the Accept header has no parameters at all (without ending ;)', t => { t.context.req.headers['accept'] = 'application/vnd.company+json' const middleware = versionRequest.setVersionByAcceptHeader() middleware(t.context.req, {}, () => { t.deepEqual(t.context.req.version, undefined) }) }) test('dont set the version if the Accept header if we cant parse it', t => { t.context.req.headers['accept'] = 'application/json;abd' const middleware = versionRequest.setVersionByAcceptHeader() middleware(t.context.req, {}, () => { t.deepEqual(t.context.req.version, undefined) }) }) test('dont set the version if the Accept header if we cant parse it', t => { t.context.req.headers['accept'] = 42 const middleware = versionRequest.setVersionByAcceptHeader() middleware(t.context.req, {}, () => { t.deepEqual(t.context.req.version, undefined) }) }) // Alternative format test('we can set the version using the Accept header alternative format 1', t => { const versionNumber = '1.0.0' t.context.req.headers['accept'] = 'application/vnd.company-v' + versionNumber + '+json' const middleware = versionRequest.setVersionByAcceptHeader() middleware(t.context.req, {}, () => { t.deepEqual(t.context.req.version, versionNumber) }) }) test('we can set the version using the Accept header alternative format 2', t => { const versionNumber = '1.0.0' t.context.req.headers['accept'] = 'application/vnd.company.v' + versionNumber + '+json' const middleware = versionRequest.setVersionByAcceptHeader() middleware(t.context.req, {}, () => { t.deepEqual(t.context.req.version, versionNumber) }) }) test('we can set the version using the Accept header alternative format, even if it has whitespaces', t => { const versionNumber = '1.0.0' const headers = { accept: 'application/ vnd.company -v' + versionNumber + ' + json' } const resultingVersion = versionRequest.setVersionByAcceptFormat(headers) t.deepEqual(resultingVersion, versionNumber) }) test('dont set the version, if the alternative format is incorrect', t => { const headers = { accept: 'application/ vnd.company -v1.0.0///json' } const resultingVersion = versionRequest.setVersionByAcceptFormat(headers) t.deepEqual(resultingVersion, undefined) }) // Custom function test('we can set the version using a custom function to parse the Accept header', t => { const versionNumber = '1.0.0' t.context.req.headers['accept'] = versionNumber const middleware = versionRequest.setVersionByAcceptHeader(v => v) middleware(t.context.req, {}, () => { t.deepEqual(t.context.req.version, versionNumber) }) }) test('we can handle, if the custom function returns a number', t => { const versionNumber = '1.1' const versionRequestSpy = sinon.spy(versionRequest, 'formatVersion') t.context.req.headers['accept'] = versionNumber const middleware = versionRequest.setVersionByAcceptHeader(v => parseFloat(v)) middleware(t.context.req, {}, () => { t.deepEqual(t.context.req.version, versionNumber + '.0') t.is(versionRequestSpy.called, true) }) versionRequestSpy.restore() }) test('we can handle, if the custom function returns a boolean', t => { const versionNumber = true t.context.req.headers['accept'] = versionNumber const middleware = versionRequest.setVersionByAcceptHeader(v => versionNumber) middleware(t.context.req, {}, () => { t.deepEqual(t.context.req.version, undefined) }) }) test('we can handle, if the custom function returns an object', t => { const versionNumber = {alpha: true} t.context.req.headers['accept'] = 1 const middleware = versionRequest.setVersionByAcceptHeader(v => { return versionNumber }) middleware(t.context.req, {}, () => { t.deepEqual(t.context.req.version, JSON.stringify(versionNumber)) }) })