Comment authentifier les requêtes Supertest avec Passport / Stratégie Facebook /?

J’utilise Passport.js pour l’authentification (stratégie Facebook) et les tests avec Mocha et Supertest. Comment créer une session et faire des requêtes authentifiées avec la stratégie Supertest pour Facebook?

Voici l’exemple de test lorsque l’utilisateur n’est pas connecté:

describe 'when user not logged in', -> describe 'POST /api/posts', -> it 'respond with 401', (done)-> request(app). post(API.url('posts')). set('Accept', 'application/json'). send(post: data). expect('Content-Type', /json/). expect(401, done) 

Merci pour le conseil: D

Cela ressemble à peu de choses différentes, alors j’ai divisé ma réponse en deux parties.

1) Vous devez d’abord créer des utilisateurs de test via Facebook. Vous pouvez le faire via l’une des méthodes suivantes: 1) l’API graphique de Facebook ou 2) via la page Rôles de votre application.

2) La méthode recommandée pour les sessions persistantes avec SuperTest utilise une méthode SuperAgent appelée .agent () pour la persistance de sessions. Tout ce que vous pouvez faire avec SuperAgent, vous pouvez le faire avec SuperTest. Voir ce post Github pour plus.

 var supertest = require('supertest'); var app = require('../lib/your_app_location'); describe('when user not logged in', function() { describe('POST /api/posts', function() { var agent1 = supertest.agent(app); agent1 .post(API.url('posts')) .set('Accept', 'application/json') .send(post: data) .(end(function(err, res) { should.not.exist(err); res.should.have.status(401); should.exist(res.headers['set-cookie']); done(); })); }); }); 

Il existe d’autres extraits de code utiles sur le Github VisionMedia. Veuillez les trouver ici .

La solution générale consiste à créer un cookie jar qui sera réutilisé entre les demandes.

L’exemple suivant n’est pas spécifique au passeport, mais devrait fonctionner:

 var request = require('request'); describe('POST /api/posts', function () { // Create a new cookie jar var j = request.jar(); var requestWithCookie = request.defaults({jar: j}), // Authenticate, thus setting the cookie in the cookie jar before(function(done) { requestWithCookie.post('http://localhost/user', {user: 'foo', password: 'bar'}, done); }); it('should get the user profile', function (done) { requestWithCookie.get('http://localhost/user', function (err, res, user) { assert.equal(user.login, 'foo'); done(); }); }); }); 

Cet exemple montre comment effectuer la partie SuperTest du test:

 describe('request', function() { describe('persistent agent', function() { var agent1 = request.agent(); var agent2 = request.agent(); var agent3 = request.agent(); var agent4 = request.agent(); it('should gain a session on POST', function(done) { agent3 .post('http://localhost:4000/signin') .end(function(err, res) { should.not.exist(err); res.should.have.status(200); should.not.exist(res.headers['set-cookie']); res.text.should.include('dashboard'); done(); }); }); 

Voici un article de blog à ce sujet.