UNPKG

postman-runtime

Version:

Underlying library of executing Postman Collections (used by Newman)

226 lines (201 loc) 9.07 kB
var _ = require('lodash'), sinon = require('sinon'), expect = require('chai').expect, Header = require('postman-collection').Header, server = require('../../fixtures/server'); describe('request headers', function () { var httpServer, testrun, PORT = 5050, HOST = 'http://localhost:' + PORT; /** * Converts raw request headers to array of key-value object. * * [ 'User-Agent', 'PostmanRuntime' ] -> [{key: 'User-Agent', value: 'PostmanRuntime'}] * * @param {String[]} rawHeaders - raw request headers * @returns {Object[]} */ function parseRawHeaders (rawHeaders) { return _(rawHeaders).chunk(2).map(([key, value]) => { return {key, value}; }).value(); } before(function (done) { httpServer = server.createHTTPServer(); httpServer.on('/', function (req, res) { res.writeHead(200, {'content-type': 'application/json'}); res.end(JSON.stringify(parseRawHeaders(req.rawHeaders))); }); httpServer.listen(PORT, function (err) { if (err) { return done(err); } this.run({ collection: { item: [{ name: 'Duplicate headers', request: { url: HOST, header: [{ key: 'Header-Name', value: 'value1' }, { key: 'Header-Name', value: 'value2' }] } }, { name: 'Disabled & Falsy headers', request: { url: HOST, header: [{ key: 'Header-Name-1', value: 'value1' }, { key: 'Header-Name-2', value: 'value2', disabled: true }, { key: '', value: 'value3' }] } }, { name: 'Case Insensitive', request: { url: HOST, header: [{ key: 'Header-Name-0', value: 'value0' }, { key: 'Header-Name-1', value: 'value1' }, { key: 'header-name-1', value: 'value2' }, { key: 'HEADER-NAME-2', value: 'value3' }] } }, { name: 'System headers', request: { url: HOST, header: [{ key: 'Header-Name-0', value: 'value0' }, { key: 'accept-encoding', value: 'disabled-system-header', disabled: true }, { key: 'User-Agent', value: 'PostmanRuntime/test' }, { key: 'Postman-Token', value: 'someCustomToken' }, { key: 'referer', value: HOST }] } }] } }, function (err, results) { testrun = results; done(err); }); }.bind(this)); }); after(function (done) { httpServer.destroy(done); }); it('should complete the run', function () { expect(testrun).to.be.ok; sinon.assert.calledOnce(testrun.start); sinon.assert.calledOnce(testrun.done); sinon.assert.calledWith(testrun.done.getCall(0), null); sinon.assert.callCount(testrun.request, 4); sinon.assert.callCount(testrun.response, 4); }); it('should handle duplicate headers correctly', function () { sinon.assert.calledWith(testrun.request.getCall(0), null); sinon.assert.calledWith(testrun.response.getCall(0), null); var response = testrun.response.getCall(0).args[2], requestHeaders = JSON.parse(response.stream); expect(requestHeaders).to.deep.include.members([ {key: 'Header-Name', value: 'value1'}, {key: 'Header-Name', value: 'value2'} ]); }); it('should handle disabled and falsy header keys correctly', function () { sinon.assert.calledWith(testrun.request.getCall(1), null); sinon.assert.calledWith(testrun.response.getCall(1), null); var response = testrun.response.getCall(1).args[2], requestHeaders = JSON.parse(response.stream), headerKeys = requestHeaders.map(function (header) { return header.key; }); expect(requestHeaders).to.deep.include({ key: 'Header-Name-1', value: 'value1' }); expect(headerKeys).to.not.include('Header-Name-2'); expect(headerKeys).to.not.include(''); }); it('should handle headers with different cases correctly', function () { sinon.assert.calledWith(testrun.request.getCall(2), null); sinon.assert.calledWith(testrun.response.getCall(2), null); var response = testrun.response.getCall(2).args[2], requestHeaders = JSON.parse(response.stream); expect(requestHeaders).to.deep.include.members([ {key: 'Header-Name-0', value: 'value0'}, {key: 'header-name-1', value: 'value2'}, {key: 'HEADER-NAME-2', value: 'value3'} ]); // @todo: handle multiple headers with different capitalization // https://github.com/postmanlabs/postman-app-support/issues/5372 expect(requestHeaders).to.not.deep.include({ key: 'Header-Name-1', value: 'value1' }); }); it('should handle system headers correctly', function () { sinon.assert.calledWith(testrun.request.getCall(3), null); sinon.assert.calledWith(testrun.response.getCall(3), null); var request = testrun.response.getCall(3).args[3], response = testrun.response.getCall(3).args[2], requestHeaders = JSON.parse(response.stream); // @note this will fail on updating system headers to track those changes expect(requestHeaders).to.have.deep.members([ {key: 'Header-Name-0', value: 'value0'}, {key: 'User-Agent', value: 'PostmanRuntime/test'}, {key: 'Postman-Token', value: 'someCustomToken'}, {key: 'referer', value: HOST}, {key: 'Accept', value: '*/*'}, {key: 'Cache-Control', value: 'no-cache'}, {key: 'Host', value: 'localhost:5050'}, {key: 'Accept-Encoding', value: 'gzip, deflate'}, {key: 'Connection', value: 'keep-alive'} ]); // system headers should be added correctly // @note currently, only `Connection` header is added by NodeJS which // is handled by the requester. This test will fail if any other // header will be added by NodeJS. expect(request.headers.members).to.have.deep.members([ // user-defined headers new Header({key: 'Header-Name-0', value: 'value0'}), // user-defined, not overwritten by system new Header({key: 'User-Agent', value: 'PostmanRuntime/test'}), new Header({key: 'Postman-Token', value: 'someCustomToken'}), // requester header(overwritten) not added as system if value is unchanged new Header({key: 'referer', value: HOST}), // user-defined, disabled header same as one-of system header new Header({key: 'accept-encoding', value: 'disabled-system-header', disabled: true}), // system headers new Header({key: 'Accept', value: '*/*', system: true}), new Header({key: 'Cache-Control', value: 'no-cache', system: true}), new Header({key: 'Host', value: 'localhost:5050', system: true}), new Header({key: 'Accept-Encoding', value: 'gzip, deflate', system: true}), new Header({key: 'Connection', value: 'keep-alive', system: true}) ]); }); });