UserMembershipHandlerTests.coffee 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  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. describe 'UserMembershipHandler', ->
  12. beforeEach ->
  13. @user = _id: 'mock-user-id'
  14. @newUser = _id: 'mock-new-user-id', email: 'new-user-email@foo.bar'
  15. @subscription =
  16. _id: 'mock-subscription-id'
  17. groupPlan: true
  18. membersLimit: 10
  19. member_ids: [ObjectId(), ObjectId()]
  20. manager_ids: [ObjectId()]
  21. invited_emails: ['mock-email-1@foo.com']
  22. teamInvites: [{ email: 'mock-email-1@bar.com' }]
  23. update: sinon.stub().yields(null)
  24. @institution =
  25. _id: 'mock-institution-id'
  26. v1Id: 123
  27. managerIds: [ObjectId(), ObjectId(), ObjectId()]
  28. update: sinon.stub().yields(null)
  29. @SubscriptionLocator =
  30. findManagedSubscription: sinon.stub().yields(null, @subscription)
  31. @InstitutionsLocator =
  32. findManagedInstitution: sinon.stub().yields(null, @institution)
  33. @UserMembershipViewModel =
  34. buildAsync: sinon.stub().yields(null, { _id: 'mock-member-id'})
  35. build: sinon.stub().returns(@newUser)
  36. @UserGetter =
  37. getUserByAnyEmail: sinon.stub().yields(null, @newUser)
  38. @UserMembershipHandler = SandboxedModule.require modulePath, requires:
  39. '../Subscription/SubscriptionLocator': @SubscriptionLocator
  40. '../Institutions/InstitutionsLocator': @InstitutionsLocator
  41. './UserMembershipViewModel': @UserMembershipViewModel
  42. '../User/UserGetter': @UserGetter
  43. '../Errors/Errors': Errors
  44. 'logger-sharelatex':
  45. log: ->
  46. err: ->
  47. describe 'getEntty', ->
  48. it 'validate type', (done) ->
  49. @UserMembershipHandler.getEntity 'foo', null, (error) ->
  50. should.exist(error)
  51. expect(error.message).to.match /No such entity/
  52. done()
  53. describe 'group subscriptions', ->
  54. it 'get subscription', (done) ->
  55. @UserMembershipHandler.getEntity 'group', @user._id, (error, subscription) =>
  56. should.not.exist(error)
  57. assertCalledWith(@SubscriptionLocator.findManagedSubscription, @user._id)
  58. expect(subscription).to.equal @subscription
  59. expect(subscription.membersLimit).to.equal 10
  60. done()
  61. it 'check subscription is a group', (done) ->
  62. @SubscriptionLocator.findManagedSubscription.yields(null, { groupPlan: false })
  63. @UserMembershipHandler.getEntity 'group', @user._id, (error, subscription) ->
  64. should.exist(error)
  65. done()
  66. it 'handle error', (done) ->
  67. @SubscriptionLocator.findManagedSubscription.yields(new Error('some error'))
  68. @UserMembershipHandler.getEntity 'group', @user._id, (error, subscription) =>
  69. should.exist(error)
  70. done()
  71. describe 'group managers', ->
  72. it 'has no members limit', (done) ->
  73. @UserMembershipHandler.getEntity 'groupManagers', @user._id, (error, subscription) =>
  74. should.not.exist(error)
  75. assertCalledWith(@SubscriptionLocator.findManagedSubscription, @user._id)
  76. expect(subscription.membersLimit).to.equal null
  77. done()
  78. describe 'institutions', ->
  79. it 'get institution', (done) ->
  80. @UserMembershipHandler.getEntity 'institution', @user._id, (error, institution) =>
  81. should.not.exist(error)
  82. assertCalledWith(@InstitutionsLocator.findManagedInstitution, @user._id)
  83. expect(institution).to.equal @institution
  84. done()
  85. it 'handle institution not found', (done) ->
  86. @InstitutionsLocator.findManagedInstitution.yields(null, null)
  87. @UserMembershipHandler.getEntity 'institution', @user._id, (error, institution) =>
  88. should.exist(error)
  89. expect(error).to.be.an.instanceof(Errors.NotFoundError)
  90. done()
  91. it 'handle errors', (done) ->
  92. @InstitutionsLocator.findManagedInstitution.yields(new Error('nope'))
  93. @UserMembershipHandler.getEntity 'institution', @user._id, (error, institution) =>
  94. should.exist(error)
  95. expect(error).to.not.be.an.instanceof(Errors.NotFoundError)
  96. done()
  97. describe 'getUsers', ->
  98. describe 'group', ->
  99. it 'build view model for all users', (done) ->
  100. @UserMembershipHandler.getUsers 'group', @subscription, (error, users) =>
  101. expectedCallcount =
  102. @subscription.member_ids.length +
  103. @subscription.invited_emails.length +
  104. @subscription.teamInvites.length
  105. expect(@UserMembershipViewModel.buildAsync.callCount).to.equal expectedCallcount
  106. done()
  107. describe 'group mamagers', ->
  108. it 'build view model for all managers', (done) ->
  109. @UserMembershipHandler.getUsers 'groupManagers', @subscription, (error, users) =>
  110. expectedCallcount = @subscription.manager_ids.length
  111. expect(@UserMembershipViewModel.buildAsync.callCount).to.equal expectedCallcount
  112. done()
  113. describe 'institution', ->
  114. it 'build view model for all managers', (done) ->
  115. @UserMembershipHandler.getUsers 'institution', @institution, (error, users) =>
  116. expectedCallcount = @institution.managerIds.length
  117. expect(@UserMembershipViewModel.buildAsync.callCount).to.equal expectedCallcount
  118. done()
  119. describe 'addUser', ->
  120. beforeEach ->
  121. @email = @newUser.email
  122. describe 'group', ->
  123. it 'fails', (done) ->
  124. @UserMembershipHandler.addUser 'group', @subscription, @email, (error) =>
  125. expect(error).to.exist
  126. done()
  127. describe 'institution', ->
  128. it 'get user', (done) ->
  129. @UserMembershipHandler.addUser 'institution', @institution, @email, (error, user) =>
  130. assertCalledWith(@UserGetter.getUserByAnyEmail, @email)
  131. done()
  132. it 'handle user not found', (done) ->
  133. @UserGetter.getUserByAnyEmail.yields(null, null)
  134. @UserMembershipHandler.addUser 'institution', @institution, @email, (error) =>
  135. expect(error).to.exist
  136. expect(error).to.be.an.instanceof(Errors.NotFoundError)
  137. done()
  138. it 'add user to institution', (done) ->
  139. @UserMembershipHandler.addUser 'institution', @institution, @email, (error, user) =>
  140. assertCalledWith(@institution.update, { $addToSet: managerIds: @newUser._id })
  141. done()
  142. it 'return user view', (done) ->
  143. @UserMembershipHandler.addUser 'institution', @institution, @email, (error, user) =>
  144. user.should.equal @newUser
  145. done()
  146. describe 'removeUser', ->
  147. describe 'institution', ->
  148. it 'remove user from institution', (done) ->
  149. @UserMembershipHandler.removeUser 'institution', @institution, @newUser._id, (error, user) =>
  150. lastCall = @institution.update.lastCall
  151. assertCalledWith(@institution.update, { $pull: managerIds: @newUser._id })
  152. done()