Как указать информацию для аутентификации в запросе супертеста? - PullRequest
0 голосов
/ 28 мая 2020

Я пытаюсь создать тесты для нашего приложения веб-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. Что я мог пропустить?

...