2016-07-13 3 views
2

У меня есть приложение, использующее Express и Passport. Я использую Стратегию Google OAuth2 с паспортом. У меня есть несколько маршрутов, требующих входа в систему с помощью этой стратегии.Тестирование Экспресс и Паспорт OAuth2 с Mocha и Chai

В настоящее время я выполняю интеграционные тесты с Mocha и Chai, но я не уверен, как обойти или работать с аутентификацией OAuth2, которая требуется для некоторых моих маршрутов.

Например, вот один из моих тестов:

it("should list a single item on /items/<id> GET", function(done) {                    
    chai.request(server) 
    .get('/items/' + id) 
    .end(function(err, res) { 
     res.should.have.status(200); 
     res.should.be.json; 
     res.body.should.be.a('object'); 
     res.body.should.have.property('description'); 
     done(); 
    }); 
}); 

Мой маршрут для /items/:id

router.get('/items/:id', auth.isLoggedIn, function(req, res) { 
    var item = getItem(); 
    res.json(item); 
}); 

/items/:id требует логин. Есть ли способ обойти логин для тестирования или издеваться над тем, что мое интеграционное тестирование будет работать?

ответ

0

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

я никогда б Chai раньше, но вы, вероятно, можете сделать что-то вроде этого:

var user = null; 

it("should log the user in", function(done) {                    
    chai.request(server) 
    .post('/login', userCredentials) 
    .end(function(err, res) { 
     res.should.have.status(200); 
     user = res.body; 
     done(); 
    }); 
}); 
+2

Проблема с этим он использует метод аутентификации Google OAuth2, который требует много переадресаций и обратные вызовы для аутентификации Google. Это не типичный метод локальной аутентификации. – intargc

+0

@intargc - Я получил эту работу для github - см. Пример кода, ношение запросов OAuth и API должно быть похоже на google, дайте мне знать, с какими проблемами вы сталкиваетесь! – stujo

1

я понял, как сделать эту работу насмешливого isAuthenticated в объекте запроса в пределах моего мокко теста.

var chai = require('chai'); 
var chaiHttp = require('chaiHttp'); 
var server = require('../app'); 
var should = chai.should(); 

chai.use(chaiHttp); 

// Allows the middleware to think we're already authenticated. 
server.request.isAuthenticated = function() { 
    return true; 
} 

describe('Items', function() { 
    it('should list all items on/GET', function(done) { 
    chai.request(server) 
     .get('/') 
     .end(function(err, res) { 
     res.should.have.status(200); 
     res.should.be.json; 
     // more tests... 
     done(); 
     }); 
    }); 
}); 
3

Я был в состоянии проверить GitHub OAuth/паспорт с мокко Chai Chai-клиента хвостовик и хвостовик-GitHub-OAuth

nock-github-oauth окурки из URL-адреса лексем

Также вручную наложил пользователь GitHub и по электронной почте апи вызовы с образцами из API Docs GitHub

Это мой auth_controller_spec.js

//During the test the env variable is set to test 
process.env.NODE_ENV = 'test'; 

var chai = require('chai'); 
var chaiHttp = require('chai-http'); 
var should = chai.should(); 
var expect = chai.expect 

var User = require.main.require('models/User'); 

// https://gist.github.com/branneman/8048520#7-the-wrapper 
var app = require.main.require('app'); 

chai.use(chaiHttp); 


function nockGitHubUserAPI(nock) { 
    /** 
    * Intercept `https://api.github.com:443/user` API Call. 
    */ 
    nock('https://api.github.com:443') 
    .filteringPath(/\/user.+/, '/user') 
    .get('/user') 
    .reply(200, 
     { 
     "login": "octocat", 
     "id": 1, 
     "avatar_url": "https://github.com/images/error/octocat_happy.gif", 
     "gravatar_id": "", 
     "url": "https://api.github.com/users/octocat", 
     "html_url": "https://github.com/octocat", 
     "followers_url": "https://api.github.com/users/octocat/followers", 
     "following_url": "https://api.github.com/users/octocat/following{/other_user}", 
     "gists_url": "https://api.github.com/users/octocat/gists{/gist_id}", 
     "starred_url": "https://api.github.com/users/octocat/starred{/owner}{/repo}", 
     "subscriptions_url": "https://api.github.com/users/octocat/subscriptions", 
     "organizations_url": "https://api.github.com/users/octocat/orgs", 
     "repos_url": "https://api.github.com/users/octocat/repos", 
     "events_url": "https://api.github.com/users/octocat/events{/privacy}", 
     "received_events_url": "https://api.github.com/users/octocat/received_events", 
     "type": "User", 
     "site_admin": false, 
     "name": "monalisa octocat", 
     "company": "GitHub", 
     "blog": "https://github.com/blog", 
     "location": "San Francisco", 
     "email": "[email protected]", 
     "hireable": false, 
     "bio": "There once was...", 
     "public_repos": 2, 
     "public_gists": 1, 
     "followers": 20, 
     "following": 0, 
     "created_at": "2008-01-14T04:33:35Z", 
     "updated_at": "2008-01-14T04:33:35Z" 
     } 
    ); 

/** 
* Intercept `https://api.github.com:443/user/emails` API Call. 
*/ 
    nock('https://api.github.com:443') 
    .filteringPath(/\/user\/emails.+/, '/user/emails') 
    .get('/user/emails') 
    .reply(200, 
     [ 
     { 
      "email": "[email protected]", 
      "verified": true, 
      "primary": true 
     } 
     ] 
    ); 
} 


describe('Auth Controller', (done) => { 

    var user, nock, github, mockToken, githubHost; 

    before((done) => { 
    nock = require('nock'); 
    nock.enableNetConnect('127.0.0.1'); 
    github = require('nock-github-oauth'); 

    nockGitHubUserAPI(nock) 

    github.nock(done); 
    }) 

    beforeEach((done) => { //Before each test we reset the database 
    User.query().del().then(() => { 
     var params = {name: 'bonzo', authtype: 'github', authid: '12345678'} 
     // Create a user so the db isn't empty 
     // May help us uncover odd bugs 
     new User(params).save() 
     .then((bonzo) => { 
      user = bonzo; 
      done(); 
     }) 
    }) 
    }); 

    after(function(done) { 
     nock.cleanAll(); 
     done(); 
    }); 

    describe('github link',() => { 
     it('it should redirect to github.com login/approve page', (done) => { 
     chai.request(app) 
      .get('/auth/github') 
      .redirects(0) 
      .end((err, res) => { 
       expect(res.headers['location']).to.match(/^https:\/\/github.com\/login\/oauth\/authorize/); 
       done(); 
      }); 
     }); 
    }); 

    describe('github callback',() => { 
     it(' should poll github api for details, upsert the user and log them in', (done) => { 
     var agent = chai.request.agent(app) 
      agent.get('/auth/github/callback') 
      .query({code : '9835b716e83875665b21' }) 
      .end((err, res) => { 
       // If successful layout displays username on page in (brackets) 
       expect(res.text).to.match(/\(octocat\)/); 
       done(); 
      }); 
     }); 
    }); 


    describe('logout',() => { 
     it('it should end the session and show login', (done) => { 
     chai.request(app) 
      .get('/auth/logout') 
      .end((err, res) => { 
       expect(res.redirects[0]).to.match(/\/$/); 
       // If successful layout displays Login links 
       expect(res.text).to.match(/Login/); 
       done(); 
      }); 
     }); 
    }); 

}); 

Полный исходный код здесь: https://github.com/stujo/node-express-gamebase

Смежные вопросы