SubscriptionUpdaterTests.coffee 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  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. @SubscriptionUpdater = SandboxedModule.require modulePath, requires:
  41. '../../models/Subscription': Subscription:@SubscriptionModel
  42. './UserFeaturesUpdater': @UserFeaturesUpdater
  43. './SubscriptionLocator': @SubscriptionLocator
  44. './PlansLocator': @PlansLocator
  45. "logger-sharelatex": log:->
  46. 'settings-sharelatex': @Settings
  47. describe "syncSubscription", ->
  48. it "should update the subscription if the user already is admin of one", (done)->
  49. @SubscriptionLocator.getUsersSubscription.callsArgWith(1, null, @subscription)
  50. @SubscriptionUpdater._updateSubscription = sinon.stub().callsArgWith(2)
  51. @SubscriptionUpdater._createNewSubscription = sinon.stub()
  52. @SubscriptionUpdater.syncSubscription @recurlySubscription, @adminUser._id, (err)=>
  53. @SubscriptionLocator.getUsersSubscription.calledWith(@adminUser._id).should.equal true
  54. @SubscriptionUpdater._updateSubscription.called.should.equal true
  55. @SubscriptionUpdater._updateSubscription.calledWith(@recurlySubscription, @subscription).should.equal true
  56. done()
  57. describe "_updateSubscription", ->
  58. it "should update the subscription with token etc when not expired", (done)->
  59. @SubscriptionUpdater._updateSubscription @recurlySubscription, @subscription, (err)=>
  60. @subscription.recurlySubscription_id.should.equal @recurlySubscription.uuid
  61. @subscription.planCode.should.equal @recurlySubscription.plan.plan_code
  62. @subscription.freeTrial.allowed.should.equal true
  63. assert.equal(@subscription.freeTrial.expiresAt, undefined)
  64. assert.equal(@subscription.freeTrial.planCode, undefined)
  65. @subscription.save.called.should.equal true
  66. @UserFeaturesUpdater.updateFeatures.calledWith(@adminUser._id, @recurlySubscription.plan.plan_code).should.equal true
  67. done()
  68. it "should remove the recurlySubscription_id when expired", (done)->
  69. @recurlySubscription.state = "expired"
  70. @SubscriptionUpdater._updateSubscription @recurlySubscription, @subscription, (err)=>
  71. assert.equal(@subscription.recurlySubscription_id, undefined)
  72. @subscription.save.called.should.equal true
  73. @UserFeaturesUpdater.updateFeatures.calledWith(@adminUser._id, @Settings.defaultPlanCode).should.equal true
  74. done()
  75. it "should update all the users features", (done)->
  76. @SubscriptionUpdater._updateSubscription @recurlySubscription, @subscription, (err)=>
  77. @UserFeaturesUpdater.updateFeatures.calledWith(@adminUser._id, @recurlySubscription.plan.plan_code).should.equal true
  78. @UserFeaturesUpdater.updateFeatures.calledWith(@allUserIds[0], @recurlySubscription.plan.plan_code).should.equal true
  79. @UserFeaturesUpdater.updateFeatures.calledWith(@allUserIds[1], @recurlySubscription.plan.plan_code).should.equal true
  80. @UserFeaturesUpdater.updateFeatures.calledWith(@allUserIds[2], @recurlySubscription.plan.plan_code).should.equal true
  81. done()
  82. it "should set group to true and save how many members can be added to group", (done)->
  83. @PlansLocator.findLocalPlanInSettings.withArgs(@recurlySubscription.plan.plan_code).returns({groupPlan:true, membersLimit:5})
  84. @SubscriptionUpdater._updateSubscription @recurlySubscription, @subscription, (err)=>
  85. @subscription.membersLimit.should.equal 5
  86. @subscription.groupPlan.should.equal true
  87. done()
  88. it "should not set group to true or set groupPlan", (done)->
  89. @SubscriptionUpdater._updateSubscription @recurlySubscription, @subscription, (err)=>
  90. assert.notEqual @subscription.membersLimit, 5
  91. assert.notEqual @subscription.groupPlan, true
  92. done()
  93. describe "_createNewSubscription", ->
  94. it "should create a new subscription then update the subscription", (done)->
  95. @SubscriptionUpdater._createNewSubscription @adminUser._id, =>
  96. @subscription.admin_id.should.equal @adminUser._id
  97. @subscription.freeTrial.allowed.should.equal false
  98. @subscription.save.called.should.equal true
  99. done()
  100. describe "addUserToGroup", ->
  101. it "should add the users id to the group as a set", (done)->
  102. @SubscriptionUpdater.addUserToGroup @adminUser._id, @otherUserId, =>
  103. searchOps =
  104. admin_id: @adminUser._id
  105. insertOperation =
  106. "$addToSet": {member_ids:@otherUserId}
  107. @findAndModifyStub.calledWith(searchOps, insertOperation).should.equal true
  108. done()
  109. it "should update the users features", (done)->
  110. @SubscriptionUpdater.addUserToGroup @adminUser._id, @otherUserId, =>
  111. @UserFeaturesUpdater.updateFeatures.calledWith(@otherUserId, @subscription.planCode).should.equal true
  112. done()
  113. describe "removeUserFromGroup", ->
  114. it "should pull the users id from the group", (done)->
  115. @SubscriptionUpdater.removeUserFromGroup @adminUser._id, @otherUserId, =>
  116. searchOps =
  117. admin_id:@adminUser._id
  118. removeOperation =
  119. "$pull": {member_ids:@otherUserId}
  120. @updateStub.calledWith(searchOps, removeOperation).should.equal true
  121. done()
  122. it "should update the users features", (done)->
  123. @SubscriptionUpdater.removeUserFromGroup @adminUser._id, @otherUserId, =>
  124. @UserFeaturesUpdater.updateFeatures.calledWith(@otherUserId, @Settings.defaultPlanCode).should.equal true
  125. done()