UserMembershipHandlerTests.coffee 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. chai = require('chai')
  2. should = chai.should()
  3. expect = require('chai').expect
  4. sinon = require('sinon')
  5. assertCalledWith = sinon.assert.calledWith
  6. assertNotCalled = sinon.assert.notCalled
  7. ObjectId = require("../../../../app/js/infrastructure/mongojs").ObjectId
  8. modulePath = "../../../../app/js/Features/UserMembership/UserMembershipHandler"
  9. SandboxedModule = require("sandboxed-module")
  10. Errors = require("../../../../app/js/Features/Errors/Errors")
  11. EntityConfigs = require("../../../../app/js/Features/UserMembership/UserMembershipEntityConfigs")
  12. describe 'UserMembershipHandler', ->
  13. beforeEach ->
  14. @user = _id: 'mock-user-id'
  15. @newUser = _id: 'mock-new-user-id', email: 'new-user-email@foo.bar'
  16. @fakeEntityId = ObjectId()
  17. @subscription =
  18. _id: 'mock-subscription-id'
  19. groupPlan: true
  20. membersLimit: 10
  21. member_ids: [ObjectId(), ObjectId()]
  22. manager_ids: [ObjectId()]
  23. invited_emails: ['mock-email-1@foo.com']
  24. teamInvites: [{ email: 'mock-email-1@bar.com' }]
  25. update: sinon.stub().yields(null)
  26. @institution =
  27. _id: 'mock-institution-id'
  28. v1Id: 123
  29. managerIds: [ObjectId(), ObjectId(), ObjectId()]
  30. update: sinon.stub().yields(null)
  31. @UserMembershipViewModel =
  32. buildAsync: sinon.stub().yields(null, { _id: 'mock-member-id'})
  33. build: sinon.stub().returns(@newUser)
  34. @UserGetter =
  35. getUserByAnyEmail: sinon.stub().yields(null, @newUser)
  36. @Institution =
  37. findOne: sinon.stub().yields(null, @institution)
  38. @Subscription =
  39. findOne: sinon.stub().yields(null, @subscription)
  40. @UserMembershipHandler = SandboxedModule.require modulePath, requires:
  41. './UserMembershipViewModel': @UserMembershipViewModel
  42. '../User/UserGetter': @UserGetter
  43. '../Errors/Errors': Errors
  44. '../../models/Institution': Institution: @Institution
  45. '../../models/Subscription': Subscription: @Subscription
  46. 'logger-sharelatex':
  47. log: ->
  48. err: ->
  49. describe 'getEntty', ->
  50. describe 'group subscriptions', ->
  51. it 'get subscription', (done) ->
  52. @UserMembershipHandler.getEntity @fakeEntityId, EntityConfigs.group, @user, (error, subscription) =>
  53. should.not.exist(error)
  54. expectedQuery =
  55. groupPlan: true
  56. _id: @fakeEntityId
  57. manager_ids: ObjectId(@user._id)
  58. assertCalledWith(@Subscription.findOne, expectedQuery)
  59. expect(subscription).to.equal @subscription
  60. expect(subscription.membersLimit).to.equal 10
  61. done()
  62. it 'get for admin', (done) ->
  63. @UserMembershipHandler.getEntity @fakeEntityId, EntityConfigs.group, { isAdmin: true }, (error, subscription) =>
  64. should.not.exist(error)
  65. expectedQuery =
  66. groupPlan: true
  67. _id: @fakeEntityId
  68. assertCalledWith(@Subscription.findOne, expectedQuery)
  69. done()
  70. it 'handle error', (done) ->
  71. @Subscription.findOne.yields(new Error('some error'))
  72. @UserMembershipHandler.getEntity @fakeEntityId, EntityConfigs.group, @user._id, (error, subscription) =>
  73. should.exist(error)
  74. done()
  75. describe 'institutions', ->
  76. it 'get institution', (done) ->
  77. @UserMembershipHandler.getEntity @fakeEntityId, EntityConfigs.institution, @user, (error, institution) =>
  78. should.not.exist(error)
  79. expectedQuery = _id: @fakeEntityId, managerIds: ObjectId(@user._id)
  80. assertCalledWith(@Institution.findOne, expectedQuery)
  81. expect(institution).to.equal @institution
  82. done()
  83. it 'handle errors', (done) ->
  84. @Institution.findOne.yields(new Error('nope'))
  85. @UserMembershipHandler.getEntity @fakeEntityId, EntityConfigs.institution, @user._id, (error, institution) =>
  86. should.exist(error)
  87. expect(error).to.not.be.an.instanceof(Errors.NotFoundError)
  88. done()
  89. describe 'getUsers', ->
  90. describe 'group', ->
  91. it 'build view model for all users', (done) ->
  92. @UserMembershipHandler.getUsers @subscription, EntityConfigs.group, (error, users) =>
  93. expectedCallcount =
  94. @subscription.member_ids.length +
  95. @subscription.invited_emails.length +
  96. @subscription.teamInvites.length
  97. expect(@UserMembershipViewModel.buildAsync.callCount).to.equal expectedCallcount
  98. done()
  99. describe 'group mamagers', ->
  100. it 'build view model for all managers', (done) ->
  101. @UserMembershipHandler.getUsers @subscription, EntityConfigs.groupManagers, (error, users) =>
  102. expectedCallcount = @subscription.manager_ids.length
  103. expect(@UserMembershipViewModel.buildAsync.callCount).to.equal expectedCallcount
  104. done()
  105. describe 'institution', ->
  106. it 'build view model for all managers', (done) ->
  107. @UserMembershipHandler.getUsers @institution, EntityConfigs.institution, (error, users) =>
  108. expectedCallcount = @institution.managerIds.length
  109. expect(@UserMembershipViewModel.buildAsync.callCount).to.equal expectedCallcount
  110. done()
  111. describe 'addUser', ->
  112. beforeEach ->
  113. @email = @newUser.email
  114. describe 'institution', ->
  115. it 'get user', (done) ->
  116. @UserMembershipHandler.addUser @institution, EntityConfigs.institution, @email, (error, user) =>
  117. assertCalledWith(@UserGetter.getUserByAnyEmail, @email)
  118. done()
  119. it 'handle user not found', (done) ->
  120. @UserGetter.getUserByAnyEmail.yields(null, null)
  121. @UserMembershipHandler.addUser @institution, EntityConfigs.institution, @email, (error) =>
  122. expect(error).to.exist
  123. expect(error).to.be.an.instanceof(Errors.NotFoundError)
  124. done()
  125. it 'add user to institution', (done) ->
  126. @UserMembershipHandler.addUser @institution, EntityConfigs.institution, @email, (error, user) =>
  127. assertCalledWith(@institution.update, { $addToSet: managerIds: @newUser._id })
  128. done()
  129. it 'return user view', (done) ->
  130. @UserMembershipHandler.addUser @institution, EntityConfigs.institution, @email, (error, user) =>
  131. user.should.equal @newUser
  132. done()
  133. describe 'removeUser', ->
  134. describe 'institution', ->
  135. it 'remove user from institution', (done) ->
  136. @UserMembershipHandler.removeUser @institution, EntityConfigs.institution, @newUser._id, (error, user) =>
  137. lastCall = @institution.update.lastCall
  138. assertCalledWith(@institution.update, { $pull: managerIds: @newUser._id })
  139. done()