UserGetterTests.coffee 5.2 KB

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