UserGetterTests.coffee 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. should = require('chai').should()
  2. SandboxedModule = require('sandboxed-module')
  3. assert = require('assert')
  4. path = require('path')
  5. sinon = require('sinon')
  6. modulePath = path.join __dirname, "../../../../app/js/Features/User/UserGetter"
  7. expect = require("chai").expect
  8. Errors = require "../../../../app/js/Features/Errors/Errors"
  9. describe "UserGetter", ->
  10. beforeEach ->
  11. @fakeUser =
  12. _id: '12390i'
  13. email: 'email2@foo.bar'
  14. emails: [
  15. { email: 'email1@foo.bar' }
  16. { email: 'email2@foo.bar' }
  17. ]
  18. @findOne = sinon.stub().callsArgWith(2, null, @fakeUser)
  19. @Mongo =
  20. db: users: findOne: @findOne
  21. ObjectId: (id) -> return id
  22. settings = apis: { v1: { url: 'v1.url', user: '', pass: '' } }
  23. @getUserAffiliations = sinon.stub().callsArgWith(1, null, [])
  24. @UserGetter = SandboxedModule.require modulePath, requires:
  25. "logger-sharelatex": log:->
  26. "../../infrastructure/mongojs": @Mongo
  27. "metrics-sharelatex": timeAsyncMethod: sinon.stub()
  28. 'settings-sharelatex': settings
  29. '../Institutions/InstitutionsAPI':
  30. getUserAffiliations: @getUserAffiliations
  31. "../Errors/Errors": Errors
  32. describe "getUser", ->
  33. it "should get user", (done)->
  34. query = _id: 'foo'
  35. projection = email: 1
  36. @UserGetter.getUser query, projection, (error, user) =>
  37. @findOne.called.should.equal true
  38. @findOne.calledWith(query, projection).should.equal true
  39. user.should.deep.equal @fakeUser
  40. done()
  41. it "should not allow email in query", (done)->
  42. @UserGetter.getUser email: 'foo@bar.com', {}, (error, user) =>
  43. error.should.exist
  44. done()
  45. it "should not allow null query", (done)->
  46. @UserGetter.getUser null, {}, (error, user) =>
  47. error.should.exist
  48. done()
  49. describe "getUserFullEmails", ->
  50. it "should get user", (done)->
  51. @UserGetter.getUser = sinon.stub().callsArgWith(2, null, @fakeUser)
  52. projection = email: 1, emails: 1
  53. @UserGetter.getUserFullEmails @fakeUser._id, (error, fullEmails) =>
  54. @UserGetter.getUser.called.should.equal true
  55. @UserGetter.getUser.calledWith(@fakeUser._id, projection).should.equal true
  56. done()
  57. it "should fetch emails data", (done)->
  58. @UserGetter.getUser = sinon.stub().callsArgWith(2, null, @fakeUser)
  59. @UserGetter.getUserFullEmails @fakeUser._id, (error, fullEmails) =>
  60. assert.deepEqual fullEmails, [
  61. { email: 'email1@foo.bar', default: false }
  62. { email: 'email2@foo.bar', default: true }
  63. ]
  64. done()
  65. it "should merge affiliation data", (done)->
  66. @UserGetter.getUser = sinon.stub().callsArgWith(2, null, @fakeUser)
  67. affiliationsData = [
  68. {
  69. email: 'email1@foo.bar'
  70. role: 'Prof'
  71. department: 'Maths'
  72. inferred: false
  73. institution: { name: 'University Name', isUniversity: true }
  74. }
  75. ]
  76. @getUserAffiliations.callsArgWith(1, null, affiliationsData)
  77. @UserGetter.getUserFullEmails @fakeUser._id, (error, fullEmails) =>
  78. assert.deepEqual fullEmails, [
  79. {
  80. email: 'email1@foo.bar'
  81. default: false
  82. affiliation:
  83. institution: affiliationsData[0].institution
  84. inferred: affiliationsData[0].inferred
  85. department: affiliationsData[0].department
  86. role: affiliationsData[0].role
  87. }
  88. { email: 'email2@foo.bar', default: true }
  89. ]
  90. done()
  91. describe "getUserbyMainEmail", ->
  92. it "query user by main email", (done)->
  93. email = 'hello@world.com'
  94. projection = emails: 1
  95. @UserGetter.getUserByMainEmail email, projection, (error, user) =>
  96. @findOne.called.should.equal true
  97. @findOne.calledWith(email: email, projection).should.equal true
  98. done()
  99. it "return user if found", (done)->
  100. email = 'hello@world.com'
  101. @UserGetter.getUserByMainEmail email, (error, user) =>
  102. user.should.deep.equal @fakeUser
  103. done()
  104. it "trim email", (done)->
  105. email = 'hello@world.com'
  106. @UserGetter.getUserByMainEmail " #{email} ", (error, user) =>
  107. @findOne.called.should.equal true
  108. @findOne.calledWith(email: email).should.equal true
  109. done()
  110. describe "getUserByAnyEmail", ->
  111. it "query user for any email", (done)->
  112. email = 'hello@world.com'
  113. expectedQuery =
  114. emails: { $exists: true }
  115. 'emails.email': email
  116. projection = emails: 1
  117. @UserGetter.getUserByAnyEmail " #{email} ", projection, (error, user) =>
  118. @findOne.calledWith(expectedQuery, projection).should.equal true
  119. user.should.deep.equal @fakeUser
  120. done()
  121. it "query contains $exists:true so partial index is used", (done)->
  122. expectedQuery =
  123. emails: { $exists: true }
  124. 'emails.email': ''
  125. @UserGetter.getUserByAnyEmail '', {}, (error, user) =>
  126. @findOne.calledWith(expectedQuery, {}).should.equal true
  127. done()
  128. it "checks main email as well", (done)->
  129. @findOne.callsArgWith(2, null, null)
  130. email = 'hello@world.com'
  131. projection = emails: 1
  132. @UserGetter.getUserByAnyEmail " #{email} ", projection, (error, user) =>
  133. @findOne.calledTwice.should.equal true
  134. @findOne.calledWith(email: email, projection).should.equal true
  135. done()
  136. describe 'ensureUniqueEmailAddress', ->
  137. beforeEach ->
  138. @UserGetter.getUserByAnyEmail = sinon.stub()
  139. it 'should return error if existing user is found', (done)->
  140. @UserGetter.getUserByAnyEmail.callsArgWith(1, null, @fakeUser)
  141. @UserGetter.ensureUniqueEmailAddress @newEmail, (err)=>
  142. should.exist(err)
  143. expect(err).to.be.an.instanceof(Errors.EmailExistsError)
  144. err.message.should.equal 'alread_exists'
  145. done()
  146. it 'should return null if no user is found', (done)->
  147. @UserGetter.getUserByAnyEmail.callsArgWith(1)
  148. @UserGetter.ensureUniqueEmailAddress @newEmail, (err)=>
  149. should.not.exist(err)
  150. done()