UserGetterTests.coffee 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  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. @UserGetter = SandboxedModule.require modulePath, requires:
  22. "logger-sharelatex": log:->
  23. "../../infrastructure/mongojs": @Mongo
  24. "metrics-sharelatex": timeAsyncMethod: sinon.stub()
  25. describe "getUser", ->
  26. it "should get user", (done)->
  27. query = _id: 'foo'
  28. projection = email: 1
  29. @UserGetter.getUser query, projection, (error, user) =>
  30. @findOne.called.should.equal true
  31. @findOne.calledWith(query, projection).should.equal true
  32. user.should.deep.equal @fakeUser
  33. done()
  34. it "should not allow email in query", (done)->
  35. @UserGetter.getUser email: 'foo@bar.com', {}, (error, user) =>
  36. error.should.exist
  37. done()
  38. describe "getUserFullEmails", -
  39. it "should get user", (done)->
  40. @UserGetter.getUser = sinon.stub().callsArgWith(2, null, @fakeUser)
  41. projection = email: 1, emails: 1
  42. @UserGetter.getUserFullEmails @fakeUser._id, (error, fullEmails) =>
  43. @UserGetter.getUser.called.should.equal true
  44. @UserGetter.getUser.calledWith(@fakeUser._id, projection).should.equal true
  45. done()
  46. it "should fetch emails data", (done)->
  47. @UserGetter.getUser = sinon.stub().callsArgWith(2, null, @fakeUser)
  48. @UserGetter.getUserFullEmails @fakeUser._id, (error, fullEmails) =>
  49. assert.deepEqual fullEmails, [
  50. { email: 'email1@foo.bar', default: false }
  51. { email: 'email2@foo.bar', default: true }
  52. ]
  53. done()
  54. describe "getUserbyMainEmail", ->
  55. it "query user by main email", (done)->
  56. email = 'hello@world.com'
  57. projection = emails: 1
  58. @UserGetter.getUserByMainEmail email, projection, (error, user) =>
  59. @findOne.called.should.equal true
  60. @findOne.calledWith(email: email, projection).should.equal true
  61. done()
  62. it "return user if found", (done)->
  63. email = 'hello@world.com'
  64. @UserGetter.getUserByMainEmail email, (error, user) =>
  65. user.should.deep.equal @fakeUser
  66. done()
  67. it "trim email", (done)->
  68. email = 'hello@world.com'
  69. @UserGetter.getUserByMainEmail " #{email} ", (error, user) =>
  70. @findOne.called.should.equal true
  71. @findOne.calledWith(email: email).should.equal true
  72. done()
  73. describe "getUserByAnyEmail", ->
  74. it "query user for any email", (done)->
  75. email = 'hello@world.com'
  76. expectedQuery =
  77. emails: { $exists: true }
  78. 'emails.email': email
  79. projection = emails: 1
  80. @UserGetter.getUserByAnyEmail " #{email} ", projection, (error, user) =>
  81. @findOne.calledWith(expectedQuery, projection).should.equal true
  82. user.should.deep.equal @fakeUser
  83. done()
  84. it "query contains $exists:true so partial index is used", (done)->
  85. expectedQuery =
  86. emails: { $exists: true }
  87. 'emails.email': ''
  88. @UserGetter.getUserByAnyEmail '', {}, (error, user) =>
  89. @findOne.calledWith(expectedQuery, {}).should.equal true
  90. done()
  91. it "checks main email as well", (done)->
  92. @findOne.callsArgWith(2, null, null)
  93. email = 'hello@world.com'
  94. projection = emails: 1
  95. @UserGetter.getUserByAnyEmail " #{email} ", projection, (error, user) =>
  96. @findOne.calledTwice.should.equal true
  97. @findOne.calledWith(email: email, projection).should.equal true
  98. done()
  99. describe 'ensureUniqueEmailAddress', ->
  100. beforeEach ->
  101. @UserGetter.getUserByAnyEmail = sinon.stub()
  102. it 'should return error if existing user is found', (done)->
  103. @UserGetter.getUserByAnyEmail.callsArgWith(1, null, @fakeUser)
  104. @UserGetter.ensureUniqueEmailAddress @newEmail, (err)=>
  105. should.exist(err)
  106. err.message.should.equal 'alread_exists'
  107. done()
  108. it 'should return null if no user is found', (done)->
  109. @UserGetter.getUserByAnyEmail.callsArgWith(1)
  110. @UserGetter.ensureUniqueEmailAddress @newEmail, (err)=>
  111. should.not.exist(err)
  112. done()