SubscriptionUpdaterTests.coffee 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  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 "Subscription Updater", ->
  8. beforeEach ->
  9. @recurlySubscription =
  10. uuid: "1238uoijdasjhd"
  11. plan:
  12. plan_code: "kjhsakjds"
  13. @adminUser =
  14. _id:"5208dd34438843e2db000007"
  15. @otherUserId = "5208dd34438842e2db000005"
  16. @allUserIds = ["13213", "dsadas", "djsaiud89"]
  17. @subscription = subscription =
  18. admin_id: @adminUser._id
  19. members_id: @allUserIds
  20. save: sinon.stub().callsArgWith(0)
  21. freeTrial:{}
  22. plan_code:"student_or_something"
  23. @updateStub = sinon.stub().callsArgWith(2, null)
  24. @findAndModifyStub = sinon.stub().callsArgWith(2, null, @subscription)
  25. @SubscriptionModel = class
  26. constructor: (opts)->
  27. subscription.admin_id = opts.admin_id
  28. return subscription
  29. @SubscriptionModel.update = @updateStub
  30. @SubscriptionModel.findAndModify = @findAndModifyStub
  31. @SubscriptionLocator =
  32. getUsersSubscription: sinon.stub()
  33. @Settings =
  34. freeTrialPlanCode: "collaborator"
  35. defaultPlanCode: "personal"
  36. @UserFeaturesUpdater =
  37. updateFeatures : sinon.stub().callsArgWith(2)
  38. @PlansLocator =
  39. findLocalPlanInSettings: sinon.stub().returns({})
  40. @ReferalAllocator = assignBonus:sinon.stub().callsArgWith(1)
  41. @ReferalAllocator.cock = true
  42. @SubscriptionUpdater = SandboxedModule.require modulePath, requires:
  43. '../../models/Subscription': Subscription:@SubscriptionModel
  44. './UserFeaturesUpdater': @UserFeaturesUpdater
  45. './SubscriptionLocator': @SubscriptionLocator
  46. './PlansLocator': @PlansLocator
  47. "logger-sharelatex": log:->
  48. 'settings-sharelatex': @Settings
  49. "../Referal/ReferalAllocator" : @ReferalAllocator
  50. describe "syncSubscription", ->
  51. it "should update the subscription if the user already is admin of one", (done)->
  52. @SubscriptionLocator.getUsersSubscription.callsArgWith(1, null, @subscription)
  53. @SubscriptionUpdater._updateSubscription = sinon.stub().callsArgWith(2)
  54. @SubscriptionUpdater._createNewSubscription = sinon.stub()
  55. @SubscriptionUpdater.syncSubscription @recurlySubscription, @adminUser._id, (err)=>
  56. @SubscriptionLocator.getUsersSubscription.calledWith(@adminUser._id).should.equal true
  57. @SubscriptionUpdater._updateSubscription.called.should.equal true
  58. @SubscriptionUpdater._updateSubscription.calledWith(@recurlySubscription, @subscription).should.equal true
  59. done()
  60. describe "_updateSubscription", ->
  61. it "should update the subscription with token etc when not expired", (done)->
  62. @SubscriptionUpdater._updateSubscription @recurlySubscription, @subscription, (err)=>
  63. @subscription.recurlySubscription_id.should.equal @recurlySubscription.uuid
  64. @subscription.planCode.should.equal @recurlySubscription.plan.plan_code
  65. @subscription.freeTrial.allowed.should.equal true
  66. assert.equal(@subscription.freeTrial.expiresAt, undefined)
  67. assert.equal(@subscription.freeTrial.planCode, undefined)
  68. @subscription.save.called.should.equal true
  69. @UserFeaturesUpdater.updateFeatures.calledWith(@adminUser._id, @recurlySubscription.plan.plan_code).should.equal true
  70. done()
  71. it "should remove the recurlySubscription_id when expired", (done)->
  72. @recurlySubscription.state = "expired"
  73. @SubscriptionUpdater._updateSubscription @recurlySubscription, @subscription, (err)=>
  74. assert.equal(@subscription.recurlySubscription_id, undefined)
  75. @subscription.save.called.should.equal true
  76. @UserFeaturesUpdater.updateFeatures.calledWith(@adminUser._id, @Settings.defaultPlanCode).should.equal true
  77. done()
  78. it "should update all the users features", (done)->
  79. @SubscriptionUpdater._updateSubscription @recurlySubscription, @subscription, (err)=>
  80. @UserFeaturesUpdater.updateFeatures.calledWith(@adminUser._id, @recurlySubscription.plan.plan_code).should.equal true
  81. @UserFeaturesUpdater.updateFeatures.calledWith(@allUserIds[0], @recurlySubscription.plan.plan_code).should.equal true
  82. @UserFeaturesUpdater.updateFeatures.calledWith(@allUserIds[1], @recurlySubscription.plan.plan_code).should.equal true
  83. @UserFeaturesUpdater.updateFeatures.calledWith(@allUserIds[2], @recurlySubscription.plan.plan_code).should.equal true
  84. done()
  85. it "should set group to true and save how many members can be added to group", (done)->
  86. @PlansLocator.findLocalPlanInSettings.withArgs(@recurlySubscription.plan.plan_code).returns({groupPlan:true, membersLimit:5})
  87. @SubscriptionUpdater._updateSubscription @recurlySubscription, @subscription, (err)=>
  88. @subscription.membersLimit.should.equal 5
  89. @subscription.groupPlan.should.equal true
  90. done()
  91. it "should not set group to true or set groupPlan", (done)->
  92. @SubscriptionUpdater._updateSubscription @recurlySubscription, @subscription, (err)=>
  93. assert.notEqual @subscription.membersLimit, 5
  94. assert.notEqual @subscription.groupPlan, true
  95. done()
  96. it "should call assignBonus", (done)->
  97. @SubscriptionUpdater._updateSubscription @recurlySubscription, @subscription, (err)=>
  98. @ReferalAllocator.assignBonus.calledWith(@subscription.admin_id).should.equal true
  99. done()
  100. describe "_createNewSubscription", ->
  101. it "should create a new subscription then update the subscription", (done)->
  102. @SubscriptionUpdater._createNewSubscription @adminUser._id, =>
  103. @subscription.admin_id.should.equal @adminUser._id
  104. @subscription.freeTrial.allowed.should.equal false
  105. @subscription.save.called.should.equal true
  106. done()
  107. describe "addUserToGroup", ->
  108. it "should add the users id to the group as a set", (done)->
  109. @SubscriptionUpdater.addUserToGroup @adminUser._id, @otherUserId, =>
  110. searchOps =
  111. admin_id: @adminUser._id
  112. insertOperation =
  113. "$addToSet": {member_ids:@otherUserId}
  114. @findAndModifyStub.calledWith(searchOps, insertOperation).should.equal true
  115. done()
  116. it "should update the users features", (done)->
  117. @SubscriptionUpdater.addUserToGroup @adminUser._id, @otherUserId, =>
  118. @UserFeaturesUpdater.updateFeatures.calledWith(@otherUserId, @subscription.planCode).should.equal true
  119. done()
  120. describe "removeUserFromGroup", ->
  121. it "should pull the users id from the group", (done)->
  122. @SubscriptionUpdater.removeUserFromGroup @adminUser._id, @otherUserId, =>
  123. searchOps =
  124. admin_id:@adminUser._id
  125. removeOperation =
  126. "$pull": {member_ids:@otherUserId}
  127. @updateStub.calledWith(searchOps, removeOperation).should.equal true
  128. done()
  129. it "should update the users features", (done)->
  130. @SubscriptionUpdater.removeUserFromGroup @adminUser._id, @otherUserId, =>
  131. @UserFeaturesUpdater.updateFeatures.calledWith(@otherUserId, @Settings.defaultPlanCode).should.equal true
  132. done()