|
|
'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); |
|
|
}); |
|
|
}); |
|
|
}); |
|
|
|
|
|
}); |
|
|
|