UserGetterTests.coffee 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  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. describe "getUserFullEmails", ->
  46. it "should get user", (done)->
  47. @UserGetter.getUser = sinon.stub().callsArgWith(2, null, @fakeUser)
  48. projection = email: 1, emails: 1
  49. @UserGetter.getUserFullEmails @fakeUser._id, (error, fullEmails) =>
  50. @UserGetter.getUser.called.should.equal true
  51. @UserGetter.getUser.calledWith(@fakeUser._id, projection).should.equal true
  52. done()
  53. it "should fetch emails data", (done)->
  54. @UserGetter.getUser = sinon.stub().callsArgWith(2, null, @fakeUser)
  55. @UserGetter.getUserFullEmails @fakeUser._id, (error, fullEmails) =>
  56. assert.deepEqual fullEmails, [
  57. { email: 'email1@foo.bar', default: false }
  58. { email: 'email2@foo.bar', default: true }
  59. ]
  60. done()
  61. it "should merge affiliation data", (done)->
  62. @UserGetter.getUser = sinon.stub().callsArgWith(2, null, @fakeUser)
  63. affiliationsData = [
  64. {
  65. email: 'email1@foo.bar'
  66. role: 'Prof'
  67. department: 'Maths'
  68. inferred: false
  69. institution: { name: 'University Name', isUniversity: true }
  70. }
  71. ]
  72. @getUserAffiliations.callsArgWith(1, null, affiliationsData)
  73. @UserGetter.getUserFullEmails @fakeUser._id, (error, fullEmails) =>
  74. assert.deepEqual fullEmails, [
  75. {
  76. email: 'email1@foo.bar'
  77. default: false
  78. affiliation:
  79. institution: affiliationsData[0].institution
  80. inferred: affiliationsData[0].inferred
  81. department: affiliationsData[0].department
  82. role: affiliationsData[0].role
  83. }
  84. { email: 'email2@foo.bar', default: true }
  85. ]
  86. done()
  87. describe "getUserbyMainEmail", ->
  88. it "query user by main email", (done)->
  89. email = 'hello@world.com'
  90. projection = emails: 1
  91. @UserGetter.getUserByMainEmail email, projection, (error, user) =>
  92. @findOne.called.should.equal true
  93. @findOne.calledWith(email: email, projection).should.equal true
  94. done()
  95. it "return user if found", (done)->
  96. email = 'hello@world.com'
  97. @UserGetter.getUserByMainEmail email, (error, user) =>
  98. user.should.deep.equal @fakeUser
  99. done()
  100. it "trim email", (done)->
  101. email = 'hello@world.com'
  102. @UserGetter.getUserByMainEmail " #{email} ", (error, user) =>
  103. @findOne.called.should.equal true
  104. @findOne.calledWith(email: email).should.equal true
  105. done()
  106. describe "getUserByAnyEmail", ->
  107. it "query user for any email", (done)->
  108. email = 'hello@world.com'
  109. expectedQuery =
  110. emails: { $exists: true }
  111. 'emails.email': email
  112. projection = emails: 1
  113. @UserGetter.getUserByAnyEmail " #{email} ", projection, (error, user) =>
  114. @findOne.calledWith(expectedQuery, projection).should.equal true
  115. user.should.deep.equal @fakeUser
  116. done()
  117. it "query contains $exists:true so partial index is used", (done)->
  118. expectedQuery =
  119. emails: { $exists: true }
  120. 'emails.email': ''
  121. @UserGetter.getUserByAnyEmail '', {}, (error, user) =>
  122. @findOne.calledWith(expectedQuery, {}).should.equal true
  123. done()
  124. it "checks main email as well", (done)->
  125. @findOne.callsArgWith(2, null, null)
  126. email = 'hello@world.com'
  127. projection = emails: 1
  128. @UserGetter.getUserByAnyEmail " #{email} ", projection, (error, user) =>
  129. @findOne.calledTwice.should.equal true
  130. @findOne.calledWith(email: email, projection).should.equal true
  131. done()
  132. describe 'ensureUniqueEmailAddress', ->
  133. beforeEach ->
  134. @UserGetter.getUserByAnyEmail = sinon.stub()
  135. it 'should return error if existing user is found', (done)->
  136. @UserGetter.getUserByAnyEmail.callsArgWith(1, null, @fakeUser)
  137. @UserGetter.ensureUniqueEmailAddress @newEmail, (err)=>
  138. should.exist(err)
  139. expect(err).to.be.an.instanceof(Errors.EmailExistsError)
  140. err.message.should.equal 'alread_exists'
  141. done()
  142. it 'should return null if no user is found', (done)->
  143. @UserGetter.getUserByAnyEmail.callsArgWith(1)
  144. @UserGetter.ensureUniqueEmailAddress @newEmail, (err)=>
  145. should.not.exist(err)
  146. done()