Супертест, тестирование безопасного REST API

Я пишу интеграционный тест для REST API, защищенного jwt. Одна операция API POST /user/token возвращает jwt с учетом username и password, и этот токен затем используется для списка операций, таких как:

GET /user/:id

Если маршрут использует jwt({secret: secret.secretToken}), токен включается в HTTP-заголовок Authorization.

При тестировании с помощью супертеста у меня может быть вложенное тестирование, но я хочу сначала получить токен, а затем использовать этот токен для тестирования других операций.

POST /user/token => 12345
GET /user/:id, `Authorization Bearer 12345`
GET /user/:foo, `Authorization Bearer 12345`

Как не генерировать новый токен для каждой операции тестирования (см. ниже), а использовать только один, генерируемый POST /user/token.

it('should get a valid token for user: user1', function(done) { 
  request(url)
    .post('/user/token')
    .send({ _id: user1._id, password: user1.password })
    .expect(200) // created
      .end(function(err, res) {
        // test operation GET /user/:id

person JohnJohnGa    schedule 19.10.2014    source источник


Ответы (2)


Вы хотите выполнить одиночный POST для /user/token, а затем использовать токен, полученный в каждом тестовом примере? Если да, то используйте хук before используемой вами тестовой среды (Mocha?) и сохраните токен в переменной, например.

describe('My API tests', function() {

  var token = null;

  before(function(done) {
    request(url)
      .post('/user/token')
      .send({ _id: user1._id, password: user1.password })
      .end(function(err, res) {
        token = res.body.token; // Or something
        done();
      });
  });

  it('should get a valid token for user: user1', function(done) { 
    request('/get/user')
      .set('Authorization', 'Bearer ' + token)
      .expect(200, done);
  });
});
person vesse    schedule 20.10.2014
comment
Как этого добиться, если у нас есть несколько файлов и папок с рассредоточенными в них юнит-тестами, не повторяя получение токена в каждом файле? - person Steve K; 30.03.2015
comment
@SirBenBenji Я думаю, вам просто нужно определить крючок, чтобы вы могли require его использовать там, где это необходимо, например. stackoverflow.com/a/10561632 будет работать. См. также github.com/mochajs/mocha/wiki/Shared-Behaviours. - person vesse; 31.03.2015

Необходимо установить Авторизация как «Носитель» + токен

 var token = null;

 before(function(done) {
    request(url)
      .post('/user/token')
      .send({ _id: user1._id, password: user1.password })
      .end(function(err, res) {
        token = res.body.token; // Or something
        done();
      });
  });


 it('should get a valid token for user: user1', function(done) { 
    request('/get/user')
      .set('Authorization', 'Bearer ' + token)
      .expect(200, done);
  });
person Girish Gupta    schedule 25.02.2017