2018-05-23 10:12:23 -04:00
|
|
|
should = require('chai').should()
|
|
|
|
SandboxedModule = require('sandboxed-module')
|
|
|
|
assert = require('assert')
|
|
|
|
path = require('path')
|
|
|
|
sinon = require('sinon')
|
|
|
|
modulePath = path.join __dirname, "../../../../app/js/Features/User/UserGetter"
|
|
|
|
expect = require("chai").expect
|
2018-07-17 06:12:09 -04:00
|
|
|
Errors = require "../../../../app/js/Features/Errors/Errors"
|
2018-05-23 10:12:23 -04:00
|
|
|
|
|
|
|
describe "UserGetter", ->
|
|
|
|
|
|
|
|
beforeEach ->
|
2018-06-08 13:05:19 -04:00
|
|
|
@fakeUser =
|
|
|
|
_id: '12390i'
|
|
|
|
email: 'email2@foo.bar'
|
|
|
|
emails: [
|
|
|
|
{ email: 'email1@foo.bar' }
|
|
|
|
{ email: 'email2@foo.bar' }
|
|
|
|
]
|
2018-05-23 10:12:23 -04:00
|
|
|
@findOne = sinon.stub().callsArgWith(2, null, @fakeUser)
|
|
|
|
@Mongo =
|
|
|
|
db: users: findOne: @findOne
|
|
|
|
ObjectId: (id) -> return id
|
2018-06-21 06:30:12 -04:00
|
|
|
settings = apis: { v1: { url: 'v1.url', user: '', pass: '' } }
|
2018-07-10 15:49:24 -04:00
|
|
|
@getUserAffiliations = sinon.stub().callsArgWith(1, null, [])
|
2018-05-23 10:12:23 -04:00
|
|
|
|
|
|
|
@UserGetter = SandboxedModule.require modulePath, requires:
|
|
|
|
"logger-sharelatex": log:->
|
|
|
|
"../../infrastructure/mongojs": @Mongo
|
|
|
|
"metrics-sharelatex": timeAsyncMethod: sinon.stub()
|
2018-06-21 06:30:12 -04:00
|
|
|
'settings-sharelatex': settings
|
2018-07-10 15:49:24 -04:00
|
|
|
'../Institutions/InstitutionsAPI':
|
|
|
|
getUserAffiliations: @getUserAffiliations
|
2018-07-17 06:12:09 -04:00
|
|
|
"../Errors/Errors": Errors
|
2018-05-23 10:12:23 -04:00
|
|
|
|
|
|
|
describe "getUser", ->
|
|
|
|
it "should get user", (done)->
|
|
|
|
query = _id: 'foo'
|
|
|
|
projection = email: 1
|
|
|
|
@UserGetter.getUser query, projection, (error, user) =>
|
|
|
|
@findOne.called.should.equal true
|
|
|
|
@findOne.calledWith(query, projection).should.equal true
|
|
|
|
user.should.deep.equal @fakeUser
|
|
|
|
done()
|
|
|
|
|
|
|
|
it "should not allow email in query", (done)->
|
|
|
|
@UserGetter.getUser email: 'foo@bar.com', {}, (error, user) =>
|
|
|
|
error.should.exist
|
|
|
|
done()
|
|
|
|
|
2018-09-13 12:31:35 -04:00
|
|
|
it "should not allow null query", (done)->
|
|
|
|
@UserGetter.getUser null, {}, (error, user) =>
|
|
|
|
error.should.exist
|
|
|
|
done()
|
|
|
|
|
2018-06-28 04:15:55 -04:00
|
|
|
describe "getUserFullEmails", ->
|
2018-06-08 13:05:19 -04:00
|
|
|
it "should get user", (done)->
|
|
|
|
@UserGetter.getUser = sinon.stub().callsArgWith(2, null, @fakeUser)
|
|
|
|
projection = email: 1, emails: 1
|
|
|
|
@UserGetter.getUserFullEmails @fakeUser._id, (error, fullEmails) =>
|
|
|
|
@UserGetter.getUser.called.should.equal true
|
|
|
|
@UserGetter.getUser.calledWith(@fakeUser._id, projection).should.equal true
|
|
|
|
done()
|
|
|
|
|
|
|
|
it "should fetch emails data", (done)->
|
|
|
|
@UserGetter.getUser = sinon.stub().callsArgWith(2, null, @fakeUser)
|
|
|
|
@UserGetter.getUserFullEmails @fakeUser._id, (error, fullEmails) =>
|
|
|
|
assert.deepEqual fullEmails, [
|
|
|
|
{ email: 'email1@foo.bar', default: false }
|
|
|
|
{ email: 'email2@foo.bar', default: true }
|
|
|
|
]
|
|
|
|
done()
|
|
|
|
|
2018-06-21 06:30:12 -04:00
|
|
|
it "should merge affiliation data", (done)->
|
|
|
|
@UserGetter.getUser = sinon.stub().callsArgWith(2, null, @fakeUser)
|
|
|
|
affiliationsData = [
|
|
|
|
{
|
|
|
|
email: 'email1@foo.bar'
|
|
|
|
role: 'Prof'
|
|
|
|
department: 'Maths'
|
|
|
|
inferred: false
|
|
|
|
institution: { name: 'University Name', isUniversity: true }
|
|
|
|
}
|
|
|
|
]
|
2018-07-10 15:49:24 -04:00
|
|
|
@getUserAffiliations.callsArgWith(1, null, affiliationsData)
|
2018-06-21 06:30:12 -04:00
|
|
|
@UserGetter.getUserFullEmails @fakeUser._id, (error, fullEmails) =>
|
|
|
|
assert.deepEqual fullEmails, [
|
|
|
|
{
|
|
|
|
email: 'email1@foo.bar'
|
|
|
|
default: false
|
|
|
|
affiliation:
|
|
|
|
institution: affiliationsData[0].institution
|
|
|
|
inferred: affiliationsData[0].inferred
|
|
|
|
department: affiliationsData[0].department
|
|
|
|
role: affiliationsData[0].role
|
|
|
|
}
|
|
|
|
{ email: 'email2@foo.bar', default: true }
|
|
|
|
]
|
|
|
|
done()
|
|
|
|
|
2018-09-18 08:57:11 -04:00
|
|
|
it "should get user when it has no emails field", (done)->
|
|
|
|
@fakeUser =
|
|
|
|
_id: '12390i'
|
|
|
|
email: 'email2@foo.bar'
|
|
|
|
@UserGetter.getUser = sinon.stub().callsArgWith(2, null, @fakeUser)
|
|
|
|
projection = email: 1, emails: 1
|
|
|
|
@UserGetter.getUserFullEmails @fakeUser._id, (error, fullEmails) =>
|
|
|
|
@UserGetter.getUser.called.should.equal true
|
|
|
|
@UserGetter.getUser.calledWith(@fakeUser._id, projection).should.equal true
|
|
|
|
assert.deepEqual fullEmails, []
|
|
|
|
done()
|
|
|
|
|
2018-05-23 10:12:23 -04:00
|
|
|
describe "getUserbyMainEmail", ->
|
|
|
|
it "query user by main email", (done)->
|
|
|
|
email = 'hello@world.com'
|
|
|
|
projection = emails: 1
|
|
|
|
@UserGetter.getUserByMainEmail email, projection, (error, user) =>
|
|
|
|
@findOne.called.should.equal true
|
|
|
|
@findOne.calledWith(email: email, projection).should.equal true
|
|
|
|
done()
|
|
|
|
|
|
|
|
it "return user if found", (done)->
|
|
|
|
email = 'hello@world.com'
|
|
|
|
@UserGetter.getUserByMainEmail email, (error, user) =>
|
|
|
|
user.should.deep.equal @fakeUser
|
|
|
|
done()
|
|
|
|
|
|
|
|
it "trim email", (done)->
|
|
|
|
email = 'hello@world.com'
|
|
|
|
@UserGetter.getUserByMainEmail " #{email} ", (error, user) =>
|
|
|
|
@findOne.called.should.equal true
|
|
|
|
@findOne.calledWith(email: email).should.equal true
|
|
|
|
done()
|
2018-05-25 07:04:09 -04:00
|
|
|
|
|
|
|
describe "getUserByAnyEmail", ->
|
|
|
|
it "query user for any email", (done)->
|
|
|
|
email = 'hello@world.com'
|
2018-06-06 08:52:09 -04:00
|
|
|
expectedQuery =
|
|
|
|
emails: { $exists: true }
|
|
|
|
'emails.email': email
|
2018-05-25 07:04:09 -04:00
|
|
|
projection = emails: 1
|
|
|
|
@UserGetter.getUserByAnyEmail " #{email} ", projection, (error, user) =>
|
2018-06-06 08:52:09 -04:00
|
|
|
@findOne.calledWith(expectedQuery, projection).should.equal true
|
2018-05-25 07:04:09 -04:00
|
|
|
user.should.deep.equal @fakeUser
|
|
|
|
done()
|
|
|
|
|
2018-06-06 09:45:12 -04:00
|
|
|
it "query contains $exists:true so partial index is used", (done)->
|
|
|
|
expectedQuery =
|
|
|
|
emails: { $exists: true }
|
|
|
|
'emails.email': ''
|
|
|
|
@UserGetter.getUserByAnyEmail '', {}, (error, user) =>
|
|
|
|
@findOne.calledWith(expectedQuery, {}).should.equal true
|
|
|
|
done()
|
|
|
|
|
2018-05-25 07:04:09 -04:00
|
|
|
it "checks main email as well", (done)->
|
|
|
|
@findOne.callsArgWith(2, null, null)
|
|
|
|
email = 'hello@world.com'
|
|
|
|
projection = emails: 1
|
|
|
|
@UserGetter.getUserByAnyEmail " #{email} ", projection, (error, user) =>
|
|
|
|
@findOne.calledTwice.should.equal true
|
|
|
|
@findOne.calledWith(email: email, projection).should.equal true
|
|
|
|
done()
|
2018-05-28 10:08:37 -04:00
|
|
|
|
|
|
|
describe 'ensureUniqueEmailAddress', ->
|
|
|
|
beforeEach ->
|
|
|
|
@UserGetter.getUserByAnyEmail = sinon.stub()
|
|
|
|
|
|
|
|
it 'should return error if existing user is found', (done)->
|
|
|
|
@UserGetter.getUserByAnyEmail.callsArgWith(1, null, @fakeUser)
|
|
|
|
@UserGetter.ensureUniqueEmailAddress @newEmail, (err)=>
|
|
|
|
should.exist(err)
|
2018-07-17 06:12:09 -04:00
|
|
|
expect(err).to.be.an.instanceof(Errors.EmailExistsError)
|
2018-05-28 10:08:37 -04:00
|
|
|
err.message.should.equal 'alread_exists'
|
|
|
|
done()
|
|
|
|
|
|
|
|
it 'should return null if no user is found', (done)->
|
|
|
|
@UserGetter.getUserByAnyEmail.callsArgWith(1)
|
|
|
|
@UserGetter.ensureUniqueEmailAddress @newEmail, (err)=>
|
|
|
|
should.not.exist(err)
|
|
|
|
done()
|