SubscriptionUpdaterTests.coffee 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. SandboxedModule = require('sandboxed-module')
  2. should = require('chai').should()
  3. expect = require('chai').expect
  4. sinon = require 'sinon'
  5. modulePath = "../../../../app/js/Features/Subscription/SubscriptionUpdater"
  6. assert = require("chai").assert
  7. ObjectId = require('mongoose').Types.ObjectId
  8. describe "SubscriptionUpdater", ->
  9. beforeEach ->
  10. @recurlySubscription =
  11. uuid: "1238uoijdasjhd"
  12. plan:
  13. plan_code: "kjhsakjds"
  14. @adminUser =
  15. _id: @adminuser_id = "5208dd34438843e2db000007"
  16. @otherUserId = "5208dd34438842e2db000005"
  17. @allUserIds = ["13213", "dsadas", "djsaiud89"]
  18. @subscription = subscription =
  19. admin_id: @adminUser._id
  20. member_ids: @allUserIds
  21. save: sinon.stub().callsArgWith(0)
  22. freeTrial:{}
  23. planCode:"student_or_something"
  24. @user_id = @adminuser_id
  25. @groupSubscription =
  26. admin_id: @adminUser._id
  27. member_ids: @allUserIds
  28. save: sinon.stub().callsArgWith(0)
  29. freeTrial:{}
  30. planCode:"group_subscription"
  31. @updateStub = sinon.stub().callsArgWith(2, null)
  32. @findAndModifyStub = sinon.stub().callsArgWith(2, null, @subscription)
  33. @SubscriptionModel = class
  34. constructor: (opts)->
  35. subscription.admin_id = opts.admin_id
  36. return subscription
  37. @remove: sinon.stub().yields()
  38. @SubscriptionModel.update = @updateStub
  39. @SubscriptionModel.findAndModify = @findAndModifyStub
  40. @SubscriptionLocator =
  41. getUsersSubscription: sinon.stub()
  42. getGroupSubscriptionMemberOf:sinon.stub()
  43. @Settings =
  44. freeTrialPlanCode: "collaborator"
  45. defaultPlanCode: "personal"
  46. defaultFeatures: { "default": "features" }
  47. @UserFeaturesUpdater =
  48. updateFeatures : sinon.stub().yields()
  49. @PlansLocator =
  50. findLocalPlanInSettings: sinon.stub().returns({})
  51. @ReferalFeatures = getBonusFeatures: sinon.stub().callsArgWith(1)
  52. @Modules = {hooks: {fire: sinon.stub().callsArgWith(2, null, null)}}
  53. @SubscriptionUpdater = SandboxedModule.require modulePath, requires:
  54. '../../models/Subscription': Subscription:@SubscriptionModel
  55. './UserFeaturesUpdater': @UserFeaturesUpdater
  56. './SubscriptionLocator': @SubscriptionLocator
  57. './PlansLocator': @PlansLocator
  58. "logger-sharelatex": log:->
  59. 'settings-sharelatex': @Settings
  60. "./FeaturesUpdater": @FeaturesUpdater = {}
  61. describe "syncSubscription", ->
  62. beforeEach ->
  63. @SubscriptionLocator.getUsersSubscription.callsArgWith(1, null, @subscription)
  64. @SubscriptionUpdater._updateSubscriptionFromRecurly = sinon.stub().callsArgWith(2)
  65. it "should update the subscription if the user already is admin of one", (done)->
  66. @SubscriptionUpdater._createNewSubscription = sinon.stub()
  67. @SubscriptionUpdater.syncSubscription @recurlySubscription, @adminUser._id, (err)=>
  68. @SubscriptionLocator.getUsersSubscription.calledWith(@adminUser._id).should.equal true
  69. @SubscriptionUpdater._updateSubscriptionFromRecurly.called.should.equal true
  70. @SubscriptionUpdater._updateSubscriptionFromRecurly.calledWith(@recurlySubscription, @subscription).should.equal true
  71. done()
  72. it "should not call updateFeatures with group subscription if recurly subscription is not expired", (done)->
  73. @SubscriptionUpdater.syncSubscription @recurlySubscription, @adminUser._id, (err)=>
  74. @SubscriptionLocator.getUsersSubscription.calledWith(@adminUser._id).should.equal true
  75. @SubscriptionUpdater._updateSubscriptionFromRecurly.called.should.equal true
  76. @SubscriptionUpdater._updateSubscriptionFromRecurly.calledWith(@recurlySubscription, @subscription).should.equal true
  77. @UserFeaturesUpdater.updateFeatures.called.should.equal false
  78. done()
  79. describe "_updateSubscriptionFromRecurly", ->
  80. beforeEach ->
  81. @FeaturesUpdater.refreshFeatures = sinon.stub().callsArgWith(1)
  82. it "should update the subscription with token etc when not expired", (done)->
  83. @SubscriptionUpdater._updateSubscriptionFromRecurly @recurlySubscription, @subscription, (err)=>
  84. @subscription.recurlySubscription_id.should.equal @recurlySubscription.uuid
  85. @subscription.planCode.should.equal @recurlySubscription.plan.plan_code
  86. @subscription.freeTrial.allowed.should.equal true
  87. assert.equal(@subscription.freeTrial.expiresAt, undefined)
  88. assert.equal(@subscription.freeTrial.planCode, undefined)
  89. @subscription.save.called.should.equal true
  90. @FeaturesUpdater.refreshFeatures.calledWith(@adminUser._id).should.equal true
  91. done()
  92. it "should remove the recurlySubscription_id when expired", (done)->
  93. @recurlySubscription.state = "expired"
  94. @SubscriptionUpdater._updateSubscriptionFromRecurly @recurlySubscription, @subscription, (err)=>
  95. assert.equal(@subscription.recurlySubscription_id, undefined)
  96. @subscription.save.called.should.equal true
  97. @FeaturesUpdater.refreshFeatures.calledWith(@adminUser._id).should.equal true
  98. done()
  99. it "should update all the users features", (done)->
  100. @SubscriptionUpdater._updateSubscriptionFromRecurly @recurlySubscription, @subscription, (err)=>
  101. @FeaturesUpdater.refreshFeatures.calledWith(@adminUser._id).should.equal true
  102. @FeaturesUpdater.refreshFeatures.calledWith(@allUserIds[0]).should.equal true
  103. @FeaturesUpdater.refreshFeatures.calledWith(@allUserIds[1]).should.equal true
  104. @FeaturesUpdater.refreshFeatures.calledWith(@allUserIds[2]).should.equal true
  105. done()
  106. it "should set group to true and save how many members can be added to group", (done)->
  107. @PlansLocator.findLocalPlanInSettings.withArgs(@recurlySubscription.plan.plan_code).returns({groupPlan:true, membersLimit:5})
  108. @SubscriptionUpdater._updateSubscriptionFromRecurly @recurlySubscription, @subscription, (err)=>
  109. @subscription.membersLimit.should.equal 5
  110. @subscription.groupPlan.should.equal true
  111. done()
  112. it "should not set group to true or set groupPlan", (done)->
  113. @SubscriptionUpdater._updateSubscriptionFromRecurly @recurlySubscription, @subscription, (err)=>
  114. assert.notEqual @subscription.membersLimit, 5
  115. assert.notEqual @subscription.groupPlan, true
  116. done()
  117. describe "_createNewSubscription", ->
  118. it "should create a new subscription then update the subscription", (done)->
  119. @SubscriptionUpdater._createNewSubscription @adminUser._id, =>
  120. @subscription.admin_id.should.equal @adminUser._id
  121. @subscription.freeTrial.allowed.should.equal false
  122. @subscription.save.called.should.equal true
  123. done()
  124. describe "addUserToGroup", ->
  125. beforeEach ->
  126. @FeaturesUpdater.refreshFeatures = sinon.stub().callsArgWith(1)
  127. it "should add the users id to the group as a set", (done)->
  128. @SubscriptionUpdater.addUserToGroup @adminUser._id, @otherUserId, =>
  129. searchOps =
  130. admin_id: @adminUser._id
  131. insertOperation =
  132. "$addToSet": {member_ids:@otherUserId}
  133. @findAndModifyStub.calledWith(searchOps, insertOperation).should.equal true
  134. done()
  135. it "should update the users features", (done)->
  136. @SubscriptionUpdater.addUserToGroup @adminUser._id, @otherUserId, =>
  137. @FeaturesUpdater.refreshFeatures.calledWith(@otherUserId).should.equal true
  138. done()
  139. describe "removeUserFromGroup", ->
  140. beforeEach ->
  141. @FeaturesUpdater.refreshFeatures = sinon.stub().callsArgWith(1)
  142. it "should pull the users id from the group", (done)->
  143. @SubscriptionUpdater.removeUserFromGroup @adminUser._id, @otherUserId, =>
  144. searchOps =
  145. admin_id:@adminUser._id
  146. removeOperation =
  147. "$pull": {member_ids:@otherUserId}
  148. @updateStub.calledWith(searchOps, removeOperation).should.equal true
  149. done()
  150. it "should update the users features", (done)->
  151. @SubscriptionUpdater.removeUserFromGroup @adminUser._id, @otherUserId, =>
  152. @FeaturesUpdater.refreshFeatures.calledWith(@otherUserId).should.equal true
  153. done()
  154. describe "deleteSubscription", ->
  155. beforeEach (done) ->
  156. @subscription_id = ObjectId().toString()
  157. @subscription = {
  158. "mock": "subscription",
  159. admin_id: ObjectId(),
  160. member_ids: [ ObjectId(), ObjectId(), ObjectId() ]
  161. }
  162. @SubscriptionLocator.getSubscription = sinon.stub().yields(null, @subscription)
  163. @FeaturesUpdater.refreshFeatures = sinon.stub().yields()
  164. @SubscriptionUpdater.deleteSubscription @subscription_id, done
  165. it "should look up the subscription", ->
  166. @SubscriptionLocator.getSubscription
  167. .calledWith(@subscription_id)
  168. .should.equal true
  169. it "should remove the subscription", ->
  170. @SubscriptionModel.remove
  171. .calledWith({_id: ObjectId(@subscription_id)})
  172. .should.equal true
  173. it "should downgrade the admin_id", ->
  174. @FeaturesUpdater.refreshFeatures
  175. .calledWith(@subscription.admin_id)
  176. .should.equal true
  177. it "should downgrade all of the members", ->
  178. for user_id in @subscription.member_ids
  179. @FeaturesUpdater.refreshFeatures
  180. .calledWith(user_id)
  181. .should.equal true