| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- sinon = require('sinon')
- chai = require('chai')
- should = chai.should()
- expect = chai.expect
- modulePath = "../../../../app/js/Features/Authentication/AuthenticationManager.js"
- SandboxedModule = require('sandboxed-module')
- events = require "events"
- ObjectId = require("mongojs").ObjectId
- describe "AuthenticationManager", ->
- beforeEach ->
- @AuthenticationManager = SandboxedModule.require modulePath, requires:
- "../../models/User": User: @User = {}
- "../../infrastructure/mongojs":
- db: @db =
- users: {}
- ObjectId: ObjectId
- "bcrypt": @bcrypt = {}
- @callback = sinon.stub()
- describe "authenticate", ->
- describe "when the user exists in the database", ->
- beforeEach ->
- @user =
- _id: "user-id"
- email: @email = "USER@sharelatex.com"
- @unencryptedPassword = "banana"
- @User.findOne = sinon.stub().callsArgWith(1, null, @user)
-
- describe "when the hashed password matches", ->
- beforeEach (done) ->
- @user.hashedPassword = @hashedPassword = "asdfjadflasdf"
- @bcrypt.compare = sinon.stub().callsArgWith(2, null, true)
- @AuthenticationManager.authenticate email: @email, @unencryptedPassword, (error, user) =>
- @callback(error, user)
- done()
- it "should look up the correct user in the database", ->
- @User.findOne.calledWith(email: @email).should.equal true
- it "should check that the passwords match", ->
- @bcrypt.compare
- .calledWith(@unencryptedPassword, @hashedPassword)
- .should.equal true
- it "should return the user", ->
- @callback.calledWith(null, @user).should.equal true
- describe "when the encrypted passwords do not match", ->
- beforeEach ->
- @AuthenticationManager._encryptPassword = sinon.stub().returns("Not the encrypted password")
- @AuthenticationManager.authenticate(email: @email, @unencryptedPassword, @callback)
- it "should not return the user", ->
- @callback.calledWith(null, null).should.equal true
- describe "when the user does not exist in the database", ->
- beforeEach ->
- @User.findOne = sinon.stub().callsArgWith(1, null, null)
- @AuthenticationManager.authenticate(email: @email, @unencrpytedPassword, @callback)
- it "should not return a user", ->
- @callback.calledWith(null, null).should.equal true
- describe "setUserPassword", ->
- beforeEach ->
- @user_id = ObjectId()
- @password = "banana"
- @hashedPassword = "asdkjfa;osiuvandf"
- @salt = "saltaasdfasdfasdf"
- @bcrypt.genSalt = sinon.stub().callsArgWith(1, null, @salt)
- @bcrypt.hash = sinon.stub().callsArgWith(2, null, @hashedPassword)
- @db.users.update = sinon.stub().callsArg(2)
- @AuthenticationManager.setUserPassword(@user_id, @password, @callback)
- it "should update the user's password in the database", ->
- @db.users.update
- .calledWith({
- _id: ObjectId(@user_id.toString())
- }, {
- $set: {
- "hashedPassword": @hashedPassword
- }
- $unset: password: true
- })
- .should.equal true
- it "should hash the password", ->
- @bcrypt.genSalt
- .calledWith(7)
- .should.equal true
- @bcrypt.hash
- .calledWith(@password, @salt)
- .should.equal true
- it "should call the callback", ->
- @callback.called.should.equal true
|