From a3bc20f8557ef35f128aef5dda5c31e88bba159d Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Fri, 9 Dec 2022 12:16:33 +0100 Subject: [PATCH] Fix case where a number was sometimes a string --- test/api/unit/libs/cron.test.js | 19 +++++++++++++++++++ website/server/models/subscriptionPlan.js | 3 +++ 2 files changed, 22 insertions(+) diff --git a/test/api/unit/libs/cron.test.js b/test/api/unit/libs/cron.test.js index 2b177b6f2e..773da476ae 100644 --- a/test/api/unit/libs/cron.test.js +++ b/test/api/unit/libs/cron.test.js @@ -347,6 +347,7 @@ describe('cron', async () => { }); expect(user.purchased.plan.perkMonthCount).to.equal(1); user.purchased.plan.perkMonthCount = undefined; + user.purchased.plan.consecutive.count = 8; clock.restore(); clock = sinon.useFakeTimers(moment().utcOffset(0).startOf('month').add(2, 'months') .add(2, 'days') @@ -436,6 +437,8 @@ describe('cron', async () => { it('keeps existing plan.perkMonthCount intact when incrementing consecutive benefits', async () => { user3.purchased.plan.perkMonthCount = 2 + user3.purchased.plan.consecutive.trinkets = 1 + user3.purchased.plan.consecutive.gemCapExtra = 5 clock = sinon.useFakeTimers(moment().utcOffset(0).startOf('month').add(4, 'months') .add(2, 'days') .toDate()); @@ -443,6 +446,8 @@ describe('cron', async () => { user: user3, tasksByType, daysMissed, analytics, }); expect(user3.purchased.plan.perkMonthCount).to.equal(2); + expect(user3.purchased.plan.consecutive.trinkets).to.equal(2); + expect(user3.purchased.plan.consecutive.gemCapExtra).to.equal(10); }); it('does not increment consecutive benefits in the second month of the second period that they already have benefits for', async () => { @@ -516,6 +521,7 @@ describe('cron', async () => { user6.purchased.plan.customerId = 'subscribedId'; user6.purchased.plan.dateUpdated = moment().toDate(); user6.purchased.plan.planId = 'google_6mo'; + user6.purchased.plan.perkMonthCount = 0; user6.purchased.plan.consecutive.count = 0; user6.purchased.plan.consecutive.offset = 6; user6.purchased.plan.consecutive.trinkets = 2; @@ -561,6 +567,19 @@ describe('cron', async () => { expect(user6.purchased.plan.consecutive.gemCapExtra).to.equal(20); }); + it('keeps existing plan.perkMonthCount intact when incrementing consecutive benefits', async () => { + user6.purchased.plan.perkMonthCount = 2 + clock = sinon.useFakeTimers(moment().utcOffset(0).startOf('month').add(7, 'months') + .add(2, 'days') + .toDate()); + await cron({ + user: user6, tasksByType, daysMissed, analytics, + }); + expect(user6.purchased.plan.perkMonthCount).to.equal(2); + expect(user6.purchased.plan.consecutive.trinkets).to.equal(4); + expect(user6.purchased.plan.consecutive.gemCapExtra).to.equal(20); + }); + it('increments consecutive benefits the month after the third paid period has started', async () => { clock = sinon.useFakeTimers(moment().utcOffset(0).startOf('month').add(13, 'months') .add(2, 'days') diff --git a/website/server/models/subscriptionPlan.js b/website/server/models/subscriptionPlan.js index 21e4999f99..1470175b1f 100644 --- a/website/server/models/subscriptionPlan.js +++ b/website/server/models/subscriptionPlan.js @@ -52,6 +52,9 @@ schema.plugin(baseModel, { schema.methods.incrementPerkCounterAndReward = async function incrementPerkCounterAndReward (userID, adding) { + if (typeof adding === 'string' || adding instanceof String) { + adding = parseInt(adding) + } // if perkMonthCount wasn't used before, initialize it. if (this.perkMonthCount == undefined && adding == 1) { this.perkMonthCount = (this.consecutive.count-1) % SUBSCRIPTION_BASIC_BLOCK_LENGTH;