UserMembershipHandlerTests.coffee 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  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: ObjectId()
  15. @newUser = _id: ObjectId(), 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. @publisher =
  32. _id: 'mock-publisher-id'
  33. slug: 'slug'
  34. managerIds: [ObjectId(), ObjectId()]
  35. update: sinon.stub().yields(null)
  36. @UserMembershipViewModel =
  37. buildAsync: sinon.stub().yields(null, { _id: 'mock-member-id'})
  38. build: sinon.stub().returns(@newUser)
  39. @UserGetter =
  40. getUserByAnyEmail: sinon.stub().yields(null, @newUser)
  41. @Institution =
  42. findOne: sinon.stub().yields(null, @institution)
  43. @Subscription =
  44. findOne: sinon.stub().yields(null, @subscription)
  45. @Publisher =
  46. findOne: sinon.stub().yields(null, @publisher)
  47. create: sinon.stub().yields(null, @publisher)
  48. @UserMembershipHandler = SandboxedModule.require modulePath, requires:
  49. './UserMembershipViewModel': @UserMembershipViewModel
  50. '../User/UserGetter': @UserGetter
  51. '../Errors/Errors': Errors
  52. '../../models/Institution': Institution: @Institution
  53. '../../models/Subscription': Subscription: @Subscription
  54. '../../models/Publisher': Publisher: @Publisher
  55. 'logger-sharelatex':
  56. log: ->
  57. err: ->
  58. describe 'getEntity', ->
  59. describe 'group subscriptions', ->
  60. it 'get subscription', (done) ->
  61. @UserMembershipHandler.getEntity @fakeEntityId, EntityConfigs.group, @user, null, (error, subscription) =>
  62. should.not.exist(error)
  63. expectedQuery =
  64. groupPlan: true
  65. _id: @fakeEntityId
  66. manager_ids: ObjectId(@user._id)
  67. assertCalledWith(@Subscription.findOne, expectedQuery)
  68. expect(subscription).to.equal @subscription
  69. expect(subscription.membersLimit).to.equal 10
  70. done()
  71. it 'get for admin', (done) ->
  72. @UserMembershipHandler.getEntity @fakeEntityId, EntityConfigs.group, { isAdmin: true }, null, (error, subscription) =>
  73. should.not.exist(error)
  74. expectedQuery =
  75. groupPlan: true
  76. _id: @fakeEntityId
  77. assertCalledWith(@Subscription.findOne, expectedQuery)
  78. done()
  79. it 'get with staffAccess field', (done) ->
  80. @UserMembershipHandler.getEntity @fakeEntityId, EntityConfigs.group, { staffAccess: {institutionMetrics: true}}, 'institutionMetrics', (error, subscription) =>
  81. should.not.exist(error)
  82. expectedQuery =
  83. groupPlan: true
  84. _id: @fakeEntityId
  85. assertCalledWith(@Subscription.findOne, expectedQuery)
  86. done()
  87. it 'handle error', (done) ->
  88. @Subscription.findOne.yields(new Error('some error'))
  89. @UserMembershipHandler.getEntity @fakeEntityId, EntityConfigs.group, @user._id, null, (error, subscription) =>
  90. should.exist(error)
  91. done()
  92. describe 'getEntityWithoutAuthorizationCheck', ->
  93. it 'get publisher', (done) ->
  94. @UserMembershipHandler.getEntityWithoutAuthorizationCheck @fakeEntityId, EntityConfigs.publisher, (error, subscription) =>
  95. should.not.exist(error)
  96. expectedQuery = slug: @fakeEntityId
  97. assertCalledWith(@Publisher.findOne, expectedQuery)
  98. expect(subscription).to.equal @publisher
  99. done()
  100. describe 'institutions', ->
  101. it 'get institution', (done) ->
  102. @UserMembershipHandler.getEntity @institution.v1Id, EntityConfigs.institution, @user, null, (error, institution) =>
  103. should.not.exist(error)
  104. expectedQuery = v1Id: @institution.v1Id, managerIds: ObjectId(@user._id)
  105. assertCalledWith(@Institution.findOne, expectedQuery)
  106. expect(institution).to.equal @institution
  107. done()
  108. it 'handle errors', (done) ->
  109. @Institution.findOne.yields(new Error('nope'))
  110. @UserMembershipHandler.getEntity @fakeEntityId, EntityConfigs.institution, @user._id, null, (error, institution) =>
  111. should.exist(error)
  112. expect(error).to.not.be.an.instanceof(Errors.NotFoundError)
  113. done()
  114. describe 'publishers', ->
  115. it 'get publisher', (done) ->
  116. @UserMembershipHandler.getEntity @publisher.slug, EntityConfigs.publisher, @user, null, (error, institution) =>
  117. should.not.exist(error)
  118. expectedQuery = slug: @publisher.slug, managerIds: ObjectId(@user._id)
  119. assertCalledWith(@Publisher.findOne, expectedQuery)
  120. expect(institution).to.equal @publisher
  121. done()
  122. describe 'getUsers', ->
  123. describe 'group', ->
  124. it 'build view model for all users', (done) ->
  125. @UserMembershipHandler.getUsers @subscription, EntityConfigs.group, (error, users) =>
  126. expectedCallcount =
  127. @subscription.member_ids.length +
  128. @subscription.invited_emails.length +
  129. @subscription.teamInvites.length
  130. expect(@UserMembershipViewModel.buildAsync.callCount).to.equal expectedCallcount
  131. done()
  132. describe 'group mamagers', ->
  133. it 'build view model for all managers', (done) ->
  134. @UserMembershipHandler.getUsers @subscription, EntityConfigs.groupManagers, (error, users) =>
  135. expectedCallcount = @subscription.manager_ids.length
  136. expect(@UserMembershipViewModel.buildAsync.callCount).to.equal expectedCallcount
  137. done()
  138. describe 'institution', ->
  139. it 'build view model for all managers', (done) ->
  140. @UserMembershipHandler.getUsers @institution, EntityConfigs.institution, (error, users) =>
  141. expectedCallcount = @institution.managerIds.length
  142. expect(@UserMembershipViewModel.buildAsync.callCount).to.equal expectedCallcount
  143. done()
  144. describe 'createEntity', ->
  145. it 'creates publisher', (done) ->
  146. @UserMembershipHandler.createEntity @fakeEntityId, EntityConfigs.publisher, (error, publisher) =>
  147. should.not.exist(error)
  148. assertCalledWith(@Publisher.create, slug: @fakeEntityId)
  149. done()
  150. describe 'addUser', ->
  151. beforeEach ->
  152. @email = @newUser.email
  153. describe 'institution', ->
  154. it 'get user', (done) ->
  155. @UserMembershipHandler.addUser @institution, EntityConfigs.institution, @email, (error, user) =>
  156. assertCalledWith(@UserGetter.getUserByAnyEmail, @email)
  157. done()
  158. it 'handle user not found', (done) ->
  159. @UserGetter.getUserByAnyEmail.yields(null, null)
  160. @UserMembershipHandler.addUser @institution, EntityConfigs.institution, @email, (error) =>
  161. expect(error).to.exist
  162. expect(error.userNotFound).to.equal true
  163. done()
  164. it 'handle user already added', (done) ->
  165. @institution.managerIds.push(@newUser._id)
  166. @UserMembershipHandler.addUser @institution, EntityConfigs.institution, @email, (error, users) =>
  167. expect(error).to.exist
  168. expect(error.alreadyAdded).to.equal true
  169. done()
  170. it 'add user to institution', (done) ->
  171. @UserMembershipHandler.addUser @institution, EntityConfigs.institution, @email, (error, user) =>
  172. assertCalledWith(@institution.update, { $addToSet: managerIds: @newUser._id })
  173. done()
  174. it 'return user view', (done) ->
  175. @UserMembershipHandler.addUser @institution, EntityConfigs.institution, @email, (error, user) =>
  176. user.should.equal @newUser
  177. done()
  178. describe 'removeUser', ->
  179. describe 'institution', ->
  180. it 'remove user from institution', (done) ->
  181. @UserMembershipHandler.removeUser @institution, EntityConfigs.institution, @newUser._id, (error, user) =>
  182. lastCall = @institution.update.lastCall
  183. assertCalledWith(@institution.update, { $pull: managerIds: @newUser._id })
  184. done()
  185. it 'handle admin', (done) ->
  186. @subscription.admin_id = @newUser._id
  187. @UserMembershipHandler.removeUser @subscription, EntityConfigs.groupManagers, @newUser._id, (error, user) =>
  188. expect(error).to.exist
  189. expect(error.isAdmin).to.equal true
  190. done()