TeamInvitesHandlerTests.coffee 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. SandboxedModule = require('sandboxed-module')
  2. should = require('chai').should()
  3. sinon = require 'sinon'
  4. expect = require("chai").expect
  5. querystring = require 'querystring'
  6. modulePath = "../../../../app/js/Features/Subscription/TeamInvitesHandler"
  7. ObjectId = require("mongojs").ObjectId
  8. describe "TeamInvitesHandler", ->
  9. beforeEach ->
  10. @manager = {
  11. id: "666666",
  12. first_name: "Daenerys"
  13. last_name: "Targaryen"
  14. email: "daenerys@motherofdragons.com"
  15. }
  16. @token = "aaaaaaaaaaaaaaaaaaaaaa"
  17. @teamInvite = {
  18. email: "jorah@mormont.org",
  19. token: @token,
  20. }
  21. @subscription = {
  22. id: "55153a8014829a865bbf700d",
  23. admin_id: @manager.id,
  24. member_ids: []
  25. teamInvites: [ @teamInvite ]
  26. save: sinon.stub().yields(null)
  27. }
  28. @SubscriptionLocator = {
  29. getUsersSubscription: sinon.stub(),
  30. getSubscription: sinon.stub().yields(null, @subscription)
  31. }
  32. @UserGetter = {
  33. getUser: sinon.stub()
  34. }
  35. @SubscriptionUpdater = {
  36. addUserToGroup: sinon.stub().yields()
  37. }
  38. @LimitationsManager = {
  39. teamHasReachedMemberLimit: sinon.stub().returns(false)
  40. }
  41. @Subscription = {
  42. findOne: sinon.stub().yields()
  43. update: sinon.stub().yields()
  44. }
  45. @EmailHandler = {
  46. sendEmail: sinon.stub().yields(null)
  47. }
  48. @newToken = "bbbbbbbbb"
  49. @crypto = {
  50. randomBytes: =>
  51. toString: sinon.stub().returns(@newToken)
  52. }
  53. @UserGetter.getUser.withArgs(@manager.id).yields(null, @manager)
  54. @SubscriptionLocator.getUsersSubscription.yields(null, @subscription)
  55. @Subscription.findOne.yields(null, @subscription)
  56. @TeamInvitesHandler = SandboxedModule.require modulePath, requires:
  57. "logger-sharelatex": { log: -> }
  58. "crypto": @crypto
  59. "settings-sharelatex": { siteUrl: "http://example.com" }
  60. "../../models/TeamInvite": { TeamInvite: @TeamInvite = {} }
  61. "../../models/Subscription": { Subscription: @Subscription }
  62. "../User/UserGetter": @UserGetter
  63. "./SubscriptionLocator": @SubscriptionLocator
  64. "./SubscriptionUpdater": @SubscriptionUpdater
  65. "./LimitationsManager": @LimitationsManager
  66. "../Email/EmailHandler": @EmailHandler
  67. describe "getInvite", ->
  68. it "returns the invite if there's one", (done) ->
  69. @TeamInvitesHandler.getInvite @token, (err, invite, subscription) =>
  70. expect(err).to.eq(null)
  71. expect(invite).to.deep.eq(@teamInvite)
  72. expect(subscription).to.deep.eq(@subscription)
  73. done()
  74. it "returns teamNotFound if there's none", (done) ->
  75. @Subscription.findOne = sinon.stub().yields(null, null)
  76. @TeamInvitesHandler.getInvite @token, (err, invite, subscription) ->
  77. expect(err).to.deep.eq(teamNotFound: true)
  78. done()
  79. describe "createManagerInvite", ->
  80. it "adds the team invite to the subscription", (done) ->
  81. @TeamInvitesHandler.createManagerInvite @manager.id, "John.Snow@nightwatch.com", (err, invite) =>
  82. expect(err).to.eq(null)
  83. expect(invite.token).to.eq(@newToken)
  84. expect(invite.email).to.eq("john.snow@nightwatch.com")
  85. expect(invite.inviterName).to.eq("Daenerys Targaryen (daenerys@motherofdragons.com)")
  86. expect(@subscription.teamInvites).to.deep.include(invite)
  87. done()
  88. it "sends an email", (done) ->
  89. @TeamInvitesHandler.createManagerInvite @manager.id, "John.Snow@nightwatch.com", (err, invite) =>
  90. @EmailHandler.sendEmail.calledWith("verifyEmailToJoinTeam",
  91. sinon.match({
  92. to: "john.snow@nightwatch.com",
  93. inviterName: "Daenerys Targaryen (daenerys@motherofdragons.com)",
  94. acceptInviteUrl: "http://example.com/subscription/invites/#{@newToken}/"
  95. })
  96. ).should.equal true
  97. done()
  98. it "refreshes the existing invite if the email has already been invited", (done) ->
  99. originalInvite = Object.assign({}, @teamInvite)
  100. @TeamInvitesHandler.createManagerInvite @manager.id, originalInvite.email, (err, invite) =>
  101. expect(err).to.eq(null)
  102. expect(invite).to.exist
  103. expect(@subscription.teamInvites.length).to.eq 1
  104. expect(@subscription.teamInvites).to.deep.include invite
  105. expect(invite.email).to.eq originalInvite.email
  106. @subscription.save.calledOnce.should.eq true
  107. done()
  108. describe "createDomainInvite", ->
  109. beforeEach ->
  110. @licence =
  111. subscription_id: @subscription.id
  112. name: "Team Daenerys"
  113. @user =
  114. email: "John.Snow@nightwatch.com"
  115. it "adds the team invite to the subscription", (done) ->
  116. @TeamInvitesHandler.createDomainInvite @user, @licence, (err, invite) =>
  117. expect(err).to.eq(null)
  118. expect(invite.token).to.eq(@newToken)
  119. expect(invite.email).to.eq("john.snow@nightwatch.com")
  120. expect(invite.inviterName).to.eq("Team Daenerys")
  121. expect(@subscription.teamInvites).to.deep.include(invite)
  122. done()
  123. it "sends an email", (done) ->
  124. @TeamInvitesHandler.createDomainInvite @user, @licence, (err, invite) =>
  125. @EmailHandler.sendEmail.calledWith("verifyEmailToJoinTeam",
  126. sinon.match({
  127. to: "john.snow@nightwatch.com"
  128. inviterName: "Team Daenerys"
  129. acceptInviteUrl: "http://example.com/subscription/invites/#{@newToken}/"
  130. })
  131. ).should.equal true
  132. done()
  133. describe "acceptInvite", ->
  134. beforeEach ->
  135. @user = {
  136. id: "123456789",
  137. first_name: "Tyrion",
  138. last_name: "Lannister",
  139. email: "tyrion@lannister.com"
  140. }
  141. @UserGetter.getUser.withArgs(@user.id).yields(null, @user)
  142. @subscription.teamInvites.push({
  143. email: "john.snow@nightwatch.com",
  144. token: "dddddddd",
  145. inviterName: "Daenerys Targaryen (daenerys@motherofdragons.com)"
  146. })
  147. it "adds the user to the team", (done) ->
  148. @TeamInvitesHandler.acceptInvite "dddddddd", @user.id, =>
  149. @SubscriptionUpdater.addUserToGroup.calledWith(@manager.id, @user.id).should.eq true
  150. done()
  151. it "removes the invite from the subscription", (done) ->
  152. @TeamInvitesHandler.acceptInvite "dddddddd", @user.id, =>
  153. @Subscription.update.calledWith(
  154. { _id: new ObjectId("55153a8014829a865bbf700d") },
  155. { '$pull': { teamInvites: { email: 'john.snow@nightwatch.com' } } }
  156. ).should.eq true
  157. done()
  158. describe "revokeInvite", ->
  159. it "removes the team invite from the subscription", (done) ->
  160. @TeamInvitesHandler.revokeInvite @manager.id, "jorah@mormont.org", =>
  161. @Subscription.update.calledWith(
  162. { _id: new ObjectId("55153a8014829a865bbf700d") },
  163. { '$pull': { teamInvites: { email: "jorah@mormont.org" } } }
  164. ).should.eq true
  165. done()
  166. describe "createTeamInvitesForLegacyInvitedEmail", (done) ->
  167. beforeEach ->
  168. @subscription.invited_emails = ["eddard@stark.com", "robert@stark.com"]
  169. @TeamInvitesHandler.createManagerInvite = sinon.stub().yields(null)
  170. @SubscriptionLocator.getGroupsWithEmailInvite = sinon.stub().yields(null, [@subscription])
  171. it "sends an invitation email to addresses in the legacy invited_emails field", (done) ->
  172. @TeamInvitesHandler.createTeamInvitesForLegacyInvitedEmail "eddard@stark.com", (err, invite) =>
  173. expect(err).not.to.exist
  174. @TeamInvitesHandler.createManagerInvite.calledWith(
  175. @subscription.admin_id,
  176. "eddard@stark.com"
  177. ).should.eq true
  178. @TeamInvitesHandler.createManagerInvite.callCount.should.eq 1
  179. done()
  180. describe "validation", ->
  181. it "doesn't create an invite if the team limit has been reached", (done) ->
  182. @LimitationsManager.teamHasReachedMemberLimit = sinon.stub().returns(true)
  183. @TeamInvitesHandler.createManagerInvite @manager.id, "John.Snow@nightwatch.com", (err, invite) =>
  184. expect(err).to.deep.equal(limitReached: true)
  185. done()
  186. it "doen't create an invite if the user is already part of the team", (done) ->
  187. member = {
  188. id: "1a2b",
  189. email: "tyrion@lannister.com"
  190. }
  191. @subscription.member_ids = [member.id]
  192. @UserGetter.getUser.withArgs(member.id).yields(null, member)
  193. @TeamInvitesHandler.createManagerInvite @manager.id, "tyrion@lannister.com", (err, invite) =>
  194. expect(err).to.deep.equal(alreadyInTeam: true)
  195. expect(invite).not.to.exist
  196. done()