UserMembershipControllerTests.coffee 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. sinon = require('sinon')
  2. assertCalledWith = sinon.assert.calledWith
  3. assertNotCalled = sinon.assert.notCalled
  4. chai = require('chai')
  5. should = chai.should()
  6. assert = chai.assert
  7. expect = require('chai').expect
  8. modulePath = "../../../../app/js/Features/UserMembership/UserMembershipController.js"
  9. SandboxedModule = require('sandboxed-module')
  10. MockRequest = require "../helpers/MockRequest"
  11. MockResponse = require "../helpers/MockResponse"
  12. EntityConfigs = require("../../../../app/js/Features/UserMembership/UserMembershipEntityConfigs")
  13. Errors = require("../../../../app/js/Features/Errors/Errors")
  14. describe "UserMembershipController", ->
  15. beforeEach ->
  16. @req = new MockRequest()
  17. @req.params.id = 'mock-entity-id'
  18. @user = _id: 'mock-user-id'
  19. @newUser = _id: 'mock-new-user-id', email: 'new-user-email@foo.bar'
  20. @subscription =
  21. _id: 'mock-subscription-id'
  22. fetchV1Data: (callback) => callback(null, @subscription)
  23. @institution =
  24. _id: 'mock-institution-id'
  25. v1Id: 123
  26. fetchV1Data: (callback) =>
  27. institution = Object.assign({}, @institution)
  28. institution.name = 'Test Institution Name'
  29. callback(null, institution)
  30. @users = [
  31. { _id: 'mock-member-id-1', email: 'mock-email-1@foo.com' }
  32. { _id: 'mock-member-id-2', email: 'mock-email-2@foo.com' }
  33. ]
  34. @AuthenticationController =
  35. getSessionUser: sinon.stub().returns(@user)
  36. getLoggedInUserId: sinon.stub().returns(@user._id)
  37. @UserMembershipHandler =
  38. getEntity: sinon.stub().yields(null, @subscription)
  39. getUsers: sinon.stub().yields(null, @users)
  40. addUser: sinon.stub().yields(null, @newUser)
  41. removeUser: sinon.stub().yields(null)
  42. @UserMembershipController = SandboxedModule.require modulePath, requires:
  43. '../Authentication/AuthenticationController': @AuthenticationController
  44. './UserMembershipHandler': @UserMembershipHandler
  45. '../Errors/Errors': Errors
  46. "logger-sharelatex":
  47. log: ->
  48. err: ->
  49. describe 'index', ->
  50. beforeEach ->
  51. @req.entity = @subscription
  52. @req.entityConfig = EntityConfigs.group
  53. it 'get users', (done) ->
  54. @UserMembershipController.index @req, render: () =>
  55. sinon.assert.calledWithMatch(
  56. @UserMembershipHandler.getUsers,
  57. @subscription,
  58. modelName: 'Subscription',
  59. )
  60. done()
  61. it 'render group view', (done) ->
  62. @UserMembershipController.index @req, render: (viewPath, viewParams) =>
  63. expect(viewPath).to.equal 'user_membership/index'
  64. expect(viewParams.users).to.deep.equal @users
  65. expect(viewParams.groupSize).to.equal @subscription.membersLimit
  66. expect(viewParams.translations.title).to.equal 'group_account'
  67. expect(viewParams.paths.addMember).to.equal "/manage/groups/#{@subscription._id}/invites"
  68. done()
  69. it 'render group managers view', (done) ->
  70. @req.entityConfig = EntityConfigs.groupManagers
  71. @UserMembershipController.index @req, render: (viewPath, viewParams) =>
  72. expect(viewPath).to.equal 'user_membership/index'
  73. expect(viewParams.groupSize).to.equal undefined
  74. expect(viewParams.translations.title).to.equal 'group_account'
  75. expect(viewParams.translations.subtitle).to.equal 'managers_management'
  76. expect(viewParams.paths.exportMembers).to.be.undefined
  77. done()
  78. it 'render institution view', (done) ->
  79. @req.entity = @institution
  80. @req.entityConfig = EntityConfigs.institution
  81. @UserMembershipController.index @req, render: (viewPath, viewParams) =>
  82. expect(viewPath).to.equal 'user_membership/index'
  83. expect(viewParams.name).to.equal 'Test Institution Name'
  84. expect(viewParams.groupSize).to.equal undefined
  85. expect(viewParams.translations.title).to.equal 'institution_account'
  86. expect(viewParams.paths.exportMembers).to.be.undefined
  87. done()
  88. describe 'add', ->
  89. beforeEach ->
  90. @req.body.email = @newUser.email
  91. @req.entity = @subscription
  92. @req.entityConfig = EntityConfigs.groupManagers
  93. it 'add user', (done) ->
  94. @UserMembershipController.add @req, json: () =>
  95. sinon.assert.calledWithMatch(
  96. @UserMembershipHandler.addUser,
  97. @subscription,
  98. modelName: 'Subscription',
  99. @newUser.email
  100. )
  101. done()
  102. it 'return user object', (done) ->
  103. @UserMembershipController.add @req, json: (payload) =>
  104. payload.user.should.equal @newUser
  105. done()
  106. it 'handle readOnly entity', (done) ->
  107. @req.entityConfig = EntityConfigs.group
  108. @UserMembershipController.add @req, null, (error) =>
  109. expect(error).to.extist
  110. expect(error).to.be.an.instanceof(Errors.NotFoundError)
  111. done()
  112. it 'handle user already added', (done) ->
  113. @UserMembershipHandler.addUser.yields(alreadyAdded: true)
  114. @UserMembershipController.add @req, status: () => json: (payload) =>
  115. expect(payload.error.code).to.equal 'user_already_added'
  116. done()
  117. it 'handle user not found', (done) ->
  118. @UserMembershipHandler.addUser.yields(userNotFound: true)
  119. @UserMembershipController.add @req, status: () => json: (payload) =>
  120. expect(payload.error.code).to.equal 'user_not_found'
  121. done()
  122. it 'handle invalid email', (done) ->
  123. @req.body.email = 'not_valid_email'
  124. @UserMembershipController.add @req, status: () => json: (payload) =>
  125. expect(payload.error.code).to.equal 'invalid_email'
  126. done()
  127. describe 'remove', ->
  128. beforeEach ->
  129. @req.params.userId = @newUser._id
  130. @req.entity = @subscription
  131. @req.entityConfig = EntityConfigs.groupManagers
  132. it 'remove user', (done) ->
  133. @UserMembershipController.remove @req, send: () =>
  134. sinon.assert.calledWithMatch(
  135. @UserMembershipHandler.removeUser,
  136. @subscription,
  137. modelName: 'Subscription',
  138. @newUser._id
  139. )
  140. done()
  141. it 'handle readOnly entity', (done) ->
  142. @req.entityConfig = EntityConfigs.group
  143. @UserMembershipController.remove @req, null, (error) =>
  144. expect(error).to.extist
  145. expect(error).to.be.an.instanceof(Errors.NotFoundError)
  146. done()
  147. it 'prevent self removal', (done) ->
  148. @req.params.userId = @user._id
  149. @UserMembershipController.remove @req, status: () => json: (payload) =>
  150. expect(payload.error.code).to.equal 'managers_cannot_remove_self'
  151. done()
  152. it 'prevent admin removal', (done) ->
  153. @UserMembershipHandler.removeUser.yields(isAdmin: true)
  154. @UserMembershipController.remove @req, status: () => json: (payload) =>
  155. expect(payload.error.code).to.equal 'managers_cannot_remove_admin'
  156. done()
  157. describe "exportCsv", ->
  158. beforeEach ->
  159. @req.entity = @subscription
  160. @req.entityConfig = EntityConfigs.groupManagers
  161. @res = new MockResponse()
  162. @res.contentType = sinon.stub()
  163. @res.header = sinon.stub()
  164. @res.send = sinon.stub()
  165. @UserMembershipController.exportCsv @req, @res
  166. it 'get users', ->
  167. sinon.assert.calledWithMatch(
  168. @UserMembershipHandler.getUsers,
  169. @subscription,
  170. modelName: 'Subscription',
  171. )
  172. it "should set the correct content type on the request", ->
  173. assertCalledWith(@res.contentType, "text/csv")
  174. it "should name the exported csv file", ->
  175. assertCalledWith(
  176. @res.header
  177. "Content-Disposition",
  178. "attachment; filename=Group.csv"
  179. )
  180. it "should export the correct csv", ->
  181. assertCalledWith(@res.send, "mock-email-1@foo.com\nmock-email-2@foo.com\n")