SubscriptionUpdaterTests.coffee 9.7 KB

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