UserGetterTests.coffee 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  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 = {_id:"12390i"}
  11. @findOne = sinon.stub().callsArgWith(2, null, @fakeUser)
  12. @Mongo =
  13. db: users: findOne: @findOne
  14. ObjectId: (id) -> return id
  15. @UserGetter = SandboxedModule.require modulePath, requires:
  16. "logger-sharelatex": log:->
  17. "../../infrastructure/mongojs": @Mongo
  18. "metrics-sharelatex": timeAsyncMethod: sinon.stub()
  19. describe "getUser", ->
  20. it "should get user", (done)->
  21. query = _id: 'foo'
  22. projection = email: 1
  23. @UserGetter.getUser query, projection, (error, user) =>
  24. @findOne.called.should.equal true
  25. @findOne.calledWith(query, projection).should.equal true
  26. user.should.deep.equal @fakeUser
  27. done()
  28. it "should not allow email in query", (done)->
  29. @UserGetter.getUser email: 'foo@bar.com', {}, (error, user) =>
  30. error.should.exist
  31. done()
  32. describe "getUserbyMainEmail", ->
  33. it "query user by main email", (done)->
  34. email = 'hello@world.com'
  35. projection = emails: 1
  36. @UserGetter.getUserByMainEmail email, projection, (error, user) =>
  37. @findOne.called.should.equal true
  38. @findOne.calledWith(email: email, projection).should.equal true
  39. done()
  40. it "return user if found", (done)->
  41. email = 'hello@world.com'
  42. @UserGetter.getUserByMainEmail email, (error, user) =>
  43. user.should.deep.equal @fakeUser
  44. done()
  45. it "trim email", (done)->
  46. email = 'hello@world.com'
  47. @UserGetter.getUserByMainEmail " #{email} ", (error, user) =>
  48. @findOne.called.should.equal true
  49. @findOne.calledWith(email: email).should.equal true
  50. done()
  51. describe "getUserByAnyEmail", ->
  52. it "query user for any email", (done)->
  53. email = 'hello@world.com'
  54. expectedQuery =
  55. emails: { $exists: true }
  56. 'emails.email': email
  57. projection = emails: 1
  58. @UserGetter.getUserByAnyEmail " #{email} ", projection, (error, user) =>
  59. @findOne.calledWith(expectedQuery, projection).should.equal true
  60. user.should.deep.equal @fakeUser
  61. done()
  62. it "query contains $exists:true so partial index is used", (done)->
  63. expectedQuery =
  64. emails: { $exists: true }
  65. 'emails.email': ''
  66. @UserGetter.getUserByAnyEmail '', {}, (error, user) =>
  67. @findOne.calledWith(expectedQuery, {}).should.equal true
  68. done()
  69. it "checks main email as well", (done)->
  70. @findOne.callsArgWith(2, null, null)
  71. email = 'hello@world.com'
  72. projection = emails: 1
  73. @UserGetter.getUserByAnyEmail " #{email} ", projection, (error, user) =>
  74. @findOne.calledTwice.should.equal true
  75. @findOne.calledWith(email: email, projection).should.equal true
  76. done()
  77. describe 'ensureUniqueEmailAddress', ->
  78. beforeEach ->
  79. @UserGetter.getUserByAnyEmail = sinon.stub()
  80. it 'should return error if existing user is found', (done)->
  81. @UserGetter.getUserByAnyEmail.callsArgWith(1, null, @fakeUser)
  82. @UserGetter.ensureUniqueEmailAddress @newEmail, (err)=>
  83. should.exist(err)
  84. err.message.should.equal 'alread_exists'
  85. done()
  86. it 'should return null if no user is found', (done)->
  87. @UserGetter.getUserByAnyEmail.callsArgWith(1)
  88. @UserGetter.ensureUniqueEmailAddress @newEmail, (err)=>
  89. should.not.exist(err)
  90. done()