UserGetterTests.coffee 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  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. it "should get user when it has no emails field", (done)->
  92. @fakeUser =
  93. _id: '12390i'
  94. email: 'email2@foo.bar'
  95. @UserGetter.getUser = sinon.stub().callsArgWith(2, null, @fakeUser)
  96. projection = email: 1, emails: 1
  97. @UserGetter.getUserFullEmails @fakeUser._id, (error, fullEmails) =>
  98. @UserGetter.getUser.called.should.equal true
  99. @UserGetter.getUser.calledWith(@fakeUser._id, projection).should.equal true
  100. assert.deepEqual fullEmails, []
  101. done()
  102. describe "getUserbyMainEmail", ->
  103. it "query user by main email", (done)->
  104. email = 'hello@world.com'
  105. projection = emails: 1
  106. @UserGetter.getUserByMainEmail email, projection, (error, user) =>
  107. @findOne.called.should.equal true
  108. @findOne.calledWith(email: email, projection).should.equal true
  109. done()
  110. it "return user if found", (done)->
  111. email = 'hello@world.com'
  112. @UserGetter.getUserByMainEmail email, (error, user) =>
  113. user.should.deep.equal @fakeUser
  114. done()
  115. it "trim email", (done)->
  116. email = 'hello@world.com'
  117. @UserGetter.getUserByMainEmail " #{email} ", (error, user) =>
  118. @findOne.called.should.equal true
  119. @findOne.calledWith(email: email).should.equal true
  120. done()
  121. describe "getUserByAnyEmail", ->
  122. it "query user for any email", (done)->
  123. email = 'hello@world.com'
  124. expectedQuery =
  125. emails: { $exists: true }
  126. 'emails.email': email
  127. projection = emails: 1
  128. @UserGetter.getUserByAnyEmail " #{email} ", projection, (error, user) =>
  129. @findOne.calledWith(expectedQuery, projection).should.equal true
  130. user.should.deep.equal @fakeUser
  131. done()
  132. it "query contains $exists:true so partial index is used", (done)->
  133. expectedQuery =
  134. emails: { $exists: true }
  135. 'emails.email': ''
  136. @UserGetter.getUserByAnyEmail '', {}, (error, user) =>
  137. @findOne.calledWith(expectedQuery, {}).should.equal true
  138. done()
  139. it "checks main email as well", (done)->
  140. @findOne.callsArgWith(2, null, null)
  141. email = 'hello@world.com'
  142. projection = emails: 1
  143. @UserGetter.getUserByAnyEmail " #{email} ", projection, (error, user) =>
  144. @findOne.calledTwice.should.equal true
  145. @findOne.calledWith(email: email, projection).should.equal true
  146. done()
  147. describe 'ensureUniqueEmailAddress', ->
  148. beforeEach ->
  149. @UserGetter.getUserByAnyEmail = sinon.stub()
  150. it 'should return error if existing user is found', (done)->
  151. @UserGetter.getUserByAnyEmail.callsArgWith(1, null, @fakeUser)
  152. @UserGetter.ensureUniqueEmailAddress @newEmail, (err)=>
  153. should.exist(err)
  154. expect(err).to.be.an.instanceof(Errors.EmailExistsError)
  155. err.message.should.equal 'alread_exists'
  156. done()
  157. it 'should return null if no user is found', (done)->
  158. @UserGetter.getUserByAnyEmail.callsArgWith(1)
  159. @UserGetter.ensureUniqueEmailAddress @newEmail, (err)=>
  160. should.not.exist(err)
  161. done()