| | 'use strict'; |
| |
|
| | var assert = require('assert'); |
| | var ScopeContainer = require('../lib/scopeContainer'); |
| | var resolveProxyReqPath = require('../app/steps/resolveProxyReqPath'); |
| | var expect = require('chai').expect; |
| | var express = require('express'); |
| | var request = require('supertest'); |
| | var proxy = require('../'); |
| |
|
| |
|
| | describe('resolveProxyReqPath', function () { |
| | var container; |
| |
|
| | beforeEach(function () { |
| | container = new ScopeContainer(); |
| | }); |
| |
|
| | var tests = [ |
| | { |
| | resolverType: 'undefined', |
| | resolverFn: undefined, |
| | data: [ |
| | { url: 'http://localhost:12345', parsed: '/' }, |
| | { url: 'http://g.com/123?45=67', parsed: '/123?45=67' } |
| | ] |
| | }, |
| | { |
| | resolverType: 'a syncronous function', |
| | resolverFn: function () { return 'the craziest thing'; }, |
| | data: [ |
| | { url: 'http://localhost:12345', parsed: 'the craziest thing' }, |
| | { url: 'http://g.com/123?45=67', parsed: 'the craziest thing' } |
| | ] |
| | }, |
| | { |
| | resolverType: 'a Promise', |
| | resolverFn: function () { |
| | return new Promise(function (resolve) { |
| | resolve('the craziest think'); |
| | }); |
| | }, |
| | data: [ |
| | { url: 'http://localhost:12345', parsed: 'the craziest think' }, |
| | { url: 'http://g.com/123?45=67', parsed: 'the craziest think' } |
| | ] |
| | } |
| | ]; |
| |
|
| | describe('when proxyReqPathResolver', function () { |
| |
|
| | tests.forEach(function (test) { |
| | describe('is ' + test.resolverType, function () { |
| | describe('it returns a promise which resolves a container with expected url', function () { |
| | test.data.forEach(function (data) { |
| | it(data.url, function (done) { |
| | container.user.req = { url: data.url }; |
| | container.options.proxyReqPathResolver = test.resolverFn; |
| | var r = resolveProxyReqPath(container); |
| |
|
| | assert(r instanceof Promise, 'Expect resolver to return a thennable'); |
| |
|
| | r.then(function (container) { |
| | var response; |
| | try { |
| | response = container.proxy.reqBuilder.path; |
| | if (!response) { |
| | throw new Error('reqBuilder.url is undefined'); |
| | } |
| | } catch (e) { |
| | done(e); |
| | } |
| | expect(response).to.equal(data.parsed); |
| | done(); |
| | }); |
| | }); |
| | }); |
| | }); |
| | }); |
| | }); |
| |
|
| | }); |
| |
|
| | describe('testing example code in docs', function () { |
| | it('works as advertised', function (done) { |
| | var proxyTarget = require('../test/support/proxyTarget'); |
| | var proxyRouteFn = [{ |
| | method: 'get', |
| | path: '/tent', |
| | fn: function (req, res) { |
| | res.send(req.url); |
| | } |
| | }]; |
| |
|
| | var proxyServer = proxyTarget(12345, 100, proxyRouteFn); |
| | var app = express(); |
| | app.use(proxy('localhost:12345', { |
| | proxyReqPathResolver: function (req) { |
| | var parts = req.url.split('?'); |
| | var queryString = parts[1]; |
| | var updatedPath = parts[0].replace(/test/, 'tent'); |
| | return updatedPath + (queryString ? '?' + queryString : ''); |
| | } |
| | })); |
| |
|
| | request(app) |
| | .get('/test?a=1&b=2&c=3') |
| | .end(function (err, res) { |
| | assert.equal(res.text, '/tent?a=1&b=2&c=3'); |
| | proxyServer.close(); |
| | done(err); |
| | }); |
| | }); |
| | }); |
| |
|
| | }); |
| |
|