UserGetterTests.coffee 5.2 KB

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