Я пытаюсь создать тесты для нашего приложения веб-API, но это становится действительно тяжелым за брандмауэр / прокси / любой другой блок работы. API основан на express и MongoDB. Для тестирования использую мокко, чай и супертест. У меня есть приложение server.js
, которое выполняет следующие действия:
const server = express();
function start() {
process.env.NO_PROXY = '*';
var options = {
key: fs.readFileSync(__dirname +'/key.pem', "utf8"),
cert: fs.readFileSync(__dirname + '/cert.pem', "utf8"),
ca: fs.readFileSync(__dirname + '/ca.pem', "utf8"),
passphrase: process.env.PASSPHRASE,
secureProtocol: "TLSv1_2_method"
};
/** Create SSO authentication here **/
server.use(routes);
Q.allSettled(promises).then(
function (results) {
/** More code **/
var https_server = https.createServer(options, server);
/** More code **/
}
);
}
start();
// Export for testing
module.exports = server;
Обратите внимание, что в Create SSO authentication here
мы устанавливаем sso нашей компании (server.use
и server.get
). Мы запускаем приложение следующим образом:
node server.js <port_number> (dev | prod) [verbose]
В test.js
у меня есть:
const server = require('../server.js');
describe('Test API', function () {
describe('Test Health Check', function() {
it('should return status 302 for healthcheck', function(done) {
this.timeout(50000);
request(server)
.get('/healthcheck')
.end(function(err, res) {
console.log(res.text);
done();
});
});
});
});
Я запускаю /node_modules/mocha/bin/mocha --exit
, распечатываю res.text
, и он говорит :
Found. Redirecting to <WORK'S-FIRWALL-DOMAIN/URL>
Думаю, мне нужно использовать redirects(1)
, так:
.get('/healthcheck').redirects(1)
.end(function(err, res) {
console.log(res.text);
done();
});
Но я получаю undefined
. После некоторого дополнительного исследования SO я обнаружил, что я должен использовать process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';
в начале файла test.js
. Но затем я получаю (изменено на console.log(res.error)
, чтобы это была более читаемая ошибка):
{ Error: cannot GET /api/v1/Windows/Auth?redirectUrl=<URL> (401)
at Response.toError (/api_app/node_modules/superagent/lib/node/response.js:94:15)
at ResponseBase._setStatusProperties (/api_app/node_modules/superagent/lib/response-base.js:123:16)
at new Response (/api_app/node_modules/superagent/lib/node/response.js:41:8)
at Test.Request._emitResponse (/api_app/node_modules/superagent/lib/node/index.js:752:20)
at parser (/api_app/node_modules/superagent/lib/node/index.js:916:38)
at IncomingMessage.res.on (/api_app/node_modules/superagent/lib/node/parsers/json.js:19:7)
at emitNone (events.js:111:20)
at IncomingMessage.emit (events.js:208:7)
at endReadableNT (_stream_readable.js:1055:12)
at _combinedTickCallback (internal/process/next_tick.js:138:11)
at process._tickCallback (internal/process/next_tick.js:180:9)
status: 401,
text: '{\r\n "Message": "Authorization has been denied for this request."\r\n}',
method: 'GET',
path: '/api/v1/Windows/Auth?redirectUrl=<URL>' },
Когда я go перехожу к нашему производственному экземпляру, щелкните инструменты разработчика Chrome и проверьте initiator
из networks
, я вижу, что URL-адрес делает 4 перенаправления:
[Requested-URL] -> [Auth-URL] -> [Validsso-URL] ->[Requested-URL]
Итак, я попытался изменить на redirects(4)
(после проверки 2
, 3
и даже 5
), но во всех попытках была одна и та же ошибка.
Я действительно понятия не имею, почему это происходит и как это решить. Пытался пройти go через все проблемы с github супертеста, но не смог найти причину. Я понимаю, что мне нужен SSL-сертификат для подключения к веб-сайту, но я не смог найти способ передать файлы pem
в request(server)
. Я также пытался установить и использовать supertest-proxy
(request(server).proxy(PROXY)
), но это не помогло. Также я не думаю, что это проблема прокси, скорее проблема аутентификации. более того, я не понимаю, почему он пытался ввести /api/v1/Windows/Auth?redirectUrl=<URL>
(без https
). Любая помощь будет принята с благодарностью!
EDIT : Я удалил часть SSO, и она работает без нее (и даже без перенаправления). Я бы хотел, чтобы он работал с SSO. Что я мог пропустить?