Merge pull request #3503 from overleaf/cmg-downgrade-group-subscription

Downgrade group subscription properly

GitOrigin-RevId: 6d028b79f8d5cc1ae9257e72b12d06190fed4121
This commit is contained in:
Thomas 2021-05-17 16:20:05 +02:00 committed by Copybot
parent 682abe9ca5
commit f7fd2dec65
2 changed files with 105 additions and 5 deletions

View file

@ -258,6 +258,34 @@ const SubscriptionUpdater = {
subscription.save(err => callback(err, subscription))
},
_deleteAndReplaceSubscriptionFromRecurly(
recurlySubscription,
subscription,
requesterData,
callback
) {
const adminUserId = subscription.admin_id
SubscriptionUpdater.deleteSubscription(subscription, requesterData, err => {
if (err) {
return callback(err)
}
SubscriptionUpdater._createNewSubscription(
adminUserId,
(err, newSubscription) => {
if (err) {
return callback(err)
}
SubscriptionUpdater._updateSubscriptionFromRecurly(
recurlySubscription,
newSubscription,
requesterData,
callback
)
}
)
})
},
_updateSubscriptionFromRecurly(
recurlySubscription,
subscription,
@ -271,19 +299,31 @@ const SubscriptionUpdater = {
callback
)
}
subscription.recurlySubscription_id = recurlySubscription.uuid
subscription.planCode = recurlySubscription.plan.plan_code
const plan = PlansLocator.findLocalPlanInSettings(subscription.planCode)
const updatedPlanCode = recurlySubscription.plan.plan_code
const plan = PlansLocator.findLocalPlanInSettings(updatedPlanCode)
if (plan == null) {
return callback(
new Error(`plan code not found: ${subscription.planCode}`)
return callback(new Error(`plan code not found: ${updatedPlanCode}`))
}
if (!plan.groupPlan && subscription.groupPlan) {
// If downgrading from group to individual plan, delete group sub and create a new one
return SubscriptionUpdater._deleteAndReplaceSubscriptionFromRecurly(
recurlySubscription,
subscription,
requesterData,
callback
)
}
subscription.recurlySubscription_id = recurlySubscription.uuid
subscription.planCode = updatedPlanCode
if (plan.groupPlan) {
if (!subscription.groupPlan) {
subscription.member_ids = subscription.member_ids || []
subscription.member_ids.push(subscription.admin_id)
}
subscription.groupPlan = true
subscription.membersLimit = plan.membersLimit

View file

@ -32,6 +32,7 @@ describe('SubscriptionUpdater', function () {
manager_ids: [this.adminUser._id],
member_ids: this.allUserIds,
save: sinon.stub().callsArgWith(0),
groupPlan: true,
planCode: 'group_subscription',
}
@ -324,6 +325,29 @@ describe('SubscriptionUpdater', function () {
)
})
it('should delete and replace subscription when downgrading from group to individual plan', function (done) {
this.PlansLocator.findLocalPlanInSettings
.withArgs(this.recurlySubscription.plan.plan_code)
.returns({ groupPlan: false })
this.SubscriptionUpdater._deleteAndReplaceSubscriptionFromRecurly = sinon
.stub()
.yields()
this.SubscriptionUpdater._updateSubscriptionFromRecurly(
this.recurlySubscription,
this.groupSubscription,
{},
err => {
if (err != null) {
return done(err)
}
this.SubscriptionUpdater._deleteAndReplaceSubscriptionFromRecurly
.calledWithMatch(this.recurlySubscription, this.groupSubscription)
.should.equal(true)
done()
}
)
})
it('should not set group to true or set groupPlan', function (done) {
this.SubscriptionUpdater._updateSubscriptionFromRecurly(
this.recurlySubscription,
@ -559,4 +583,40 @@ describe('SubscriptionUpdater', function () {
}
})
})
describe('_deleteAndReplaceSubscriptionFromRecurly', function () {
beforeEach(function (done) {
this.SubscriptionUpdater.deleteSubscription = sinon.stub().yields()
this.SubscriptionUpdater._createNewSubscription = sinon
.stub()
.yields(null, this.subscription)
this.SubscriptionUpdater._updateSubscriptionFromRecurly = sinon
.stub()
.yields()
this.SubscriptionUpdater._deleteAndReplaceSubscriptionFromRecurly(
this.recurlySubscription,
this.groupSubscription,
{},
done
)
})
it('should delete the old subscription', function () {
this.SubscriptionUpdater.deleteSubscription
.calledWithMatch(this.groupSubscription)
.should.equal(true)
})
it('should create a new subscription', function () {
this.SubscriptionUpdater._createNewSubscription
.calledWith(this.groupSubscription.admin_id)
.should.equal(true)
})
it('should update the new subscription', function () {
this.SubscriptionUpdater._updateSubscriptionFromRecurly
.calledWithMatch(this.recurlySubscription, this.subscription)
.should.equal(true)
})
})
})