Implement Auth module

This commit is contained in:
Juan Cruz Viotti 2014-11-14 09:51:59 -04:00
parent 5d6d2f0511
commit 58300acb77
2 changed files with 145 additions and 7 deletions

View File

@ -1,8 +1,27 @@
server = require('../../server/server') async = require('async')
exports.getToken = (credentials, callback) -> server = require('../../server/server')
token = require('../../token/token')
exports.authenticate = (credentials, callback) ->
server.post '/login_', credentials, (error, response) -> server.post '/login_', credentials, (error, response) ->
return callback(error, response?.body) return callback(error, response?.body)
exports.login = (credentials, callback) -> exports.login = (credentials, callback) ->
exports.getToken(credentials, callback) async.waterfall([
(callback) ->
exports.authenticate(credentials, callback)
(authToken, callback) ->
token.saveToken(authToken, callback)
], callback)
# Handy aliases
exports.isLoggedIn = token.hasToken
exports.getToken = token.getToken
# TODO: Maybe we should post to /logout or something
# like that to invalidate the token on the server?
exports.logout = token.clearToken

View File

@ -1,8 +1,10 @@
expect = require('chai').expect expect = require('chai').expect
nock = require('nock') nock = require('nock')
async = require('async')
auth = require('./auth') auth = require('./auth')
config = require('../../config') config = require('../../config')
johnDoeFixture = require('../../../tests/fixtures/johndoe') johnDoeFixture = require('../../../tests/fixtures/johndoe')
janeDoeFixture = require('../../../tests/fixtures/janedoe')
describe 'Auth:', -> describe 'Auth:', ->
@ -13,15 +15,41 @@ describe 'Auth:', ->
.post('/login_', johnDoeFixture.credentials) .post('/login_', johnDoeFixture.credentials)
.reply(200, johnDoeFixture.token) .reply(200, johnDoeFixture.token)
describe '#getToken()', -> describe '#authenticate()', ->
it 'should return a token string', (done) -> it 'should return a token string', (done) ->
auth.getToken johnDoeFixture.credentials, (error, token) -> auth.authenticate johnDoeFixture.credentials, (error, token) ->
return done(error) if error? return done(error) if error?
expect(token).to.be.a('string') expect(token).to.be.a('string')
expect(token).to.equal(johnDoeFixture.token) expect(token).to.equal(johnDoeFixture.token)
done() done()
describe '#login()', ->
it 'should save the token', (done) ->
async.waterfall [
(callback) ->
auth.isLoggedIn (isLoggedIn) ->
return callback(null, isLoggedIn)
(isLoggedIn, callback) ->
expect(isLoggedIn).to.be.false
auth.login(johnDoeFixture.credentials, callback)
(authToken, callback) ->
expect(authToken).to.be.a.string
auth.isLoggedIn (isLoggedIn) ->
return callback(null, isLoggedIn)
(isLoggedIn, callback) ->
expect(isLoggedIn).to.be.true
return callback(null)
], (error) ->
expect(error).to.not.exist
done()
describe 'given invalid credentials', -> describe 'given invalid credentials', ->
beforeEach -> beforeEach ->
@ -29,10 +57,101 @@ describe 'Auth:', ->
.post('/login_') .post('/login_')
.reply(401) .reply(401)
describe '#getToken()', -> describe '#authenticate()', ->
it 'should return an error', (done) -> it 'should return an error', (done) ->
auth.getToken johnDoeFixture.credentials, (error, token) -> auth.authenticate johnDoeFixture.credentials, (error, token) ->
expect(error).to.exist expect(error).to.exist
expect(error).to.be.an.instanceof(Error) expect(error).to.be.an.instanceof(Error)
expect(token).to.be.undefined
done()
describe '#login()', ->
it 'should return an error', (done) ->
auth.login johnDoeFixture.credentials, (error, token) ->
expect(error).to.exist
expect(error).to.be.an.instanceof(Error)
expect(token).to.be.undefined
done()
describe 'given a logged in user', ->
beforeEach (done) ->
nock(config.baseUrl)
.post('/login_', johnDoeFixture.credentials)
.reply(200, johnDoeFixture.token)
nock(config.baseUrl)
.post('/login_', janeDoeFixture.credentials)
.reply(200, janeDoeFixture.token)
auth.login(johnDoeFixture.credentials, done)
describe '#login()', ->
it 'should override the old user', (done) ->
async.waterfall [
(callback) ->
auth.getToken(callback)
(token, callback) ->
expect(token).to.equal(johnDoeFixture.token)
auth.login(janeDoeFixture.credentials, callback)
(token, callback) ->
expect(token).to.be.a.string
auth.getToken(callback)
(token, callback) ->
expect(token).to.equal(janeDoeFixture.token)
return callback(null)
], (error) ->
expect(error).to.not.exist
done()
describe '#isLoggedIn()', ->
it 'should return true', (done) ->
auth.isLoggedIn (isLoggedIn) ->
expect(isLoggedIn).to.be.true
done()
describe '#getToken()', ->
it 'should return the saved token', (done) ->
auth.getToken (error, token) ->
expect(error).to.not.exist
expect(token).to.equal(johnDoeFixture.token)
done()
describe '#logout()', ->
it 'should effectively logout the user', (done) ->
async.waterfall [
(callback) ->
auth.isLoggedIn (isLoggedIn) ->
return callback(null, isLoggedIn)
(isLoggedIn, callback) ->
expect(isLoggedIn).to.be.true
auth.logout(callback)
(callback) ->
auth.isLoggedIn (isLoggedIn) ->
return callback(null, isLoggedIn)
(isLoggedIn, callback) ->
expect(isLoggedIn).to.be.false
auth.getToken(callback)
(token, callback) ->
expect(token).to.be.undefined
return callback(null)
], (error) ->
expect(error).to.not.exist
done() done()