diff --git a/test/common/ops/scoreTask.test.js b/test/common/ops/scoreTask.test.js index 624a664a5b..bbd44aff79 100644 --- a/test/common/ops/scoreTask.test.js +++ b/test/common/ops/scoreTask.test.js @@ -74,13 +74,6 @@ describe('shared.ops.scoreTask', () => { } }); - it('checks that the streak parameters affects the score', () => { - let task = generateDaily({ userId: ref.afterUser._id, text: 'task to check streak' }); - scoreTask({ user: ref.afterUser, task, direction: 'up', cron: false }); - scoreTask({ user: ref.afterUser, task, direction: 'up', cron: false }); - expect(task.streak).to.eql(2); - }); - it('completes when the task direction is up', () => { let task = generateTodo({ userId: ref.afterUser._id, text: 'todo to complete', cron: false }); scoreTask({ user: ref.afterUser, task, direction: 'up' }); @@ -123,6 +116,64 @@ describe('shared.ops.scoreTask', () => { }); }); + it('checks that the streak parameters affects the score', () => { + let task = generateDaily({ userId: ref.afterUser._id, text: 'task to check streak' }); + scoreTask({ user: ref.afterUser, task, direction: 'up', cron: false }); + scoreTask({ user: ref.afterUser, task, direction: 'up', cron: false }); + expect(task.streak).to.eql(2); + }); + + describe('verifies that 21-day streak achievements are given/removed correctly', () => { + let initialStreakCount = 20; // 1 before the streak achievement is awarded + beforeEach(() => { + ref = beforeAfter(); + }); + + it('awards the first streak achievement', () => { + let task = generateDaily({ userId: ref.afterUser._id, text: 'some daily', streak: initialStreakCount }); + scoreTask({ user: ref.afterUser, task, direction: 'up' }); + expect(ref.afterUser.achievements.streak).to.equal(1); + }); + + it('increments the streak achievement for a second streak', () => { + let task1 = generateDaily({ userId: ref.afterUser._id, text: 'first daily', streak: initialStreakCount }); + scoreTask({ user: ref.afterUser, task: task1, direction: 'up' }); + let task2 = generateDaily({ userId: ref.afterUser._id, text: 'second daily', streak: initialStreakCount }); + scoreTask({ user: ref.afterUser, task: task2, direction: 'up' }); + expect(ref.afterUser.achievements.streak).to.equal(2); + }); + + it('removes the first streak achievement when unticking a Daily', () => { + let task = generateDaily({ userId: ref.afterUser._id, text: 'some daily', streak: initialStreakCount }); + scoreTask({ user: ref.afterUser, task, direction: 'up' }); + scoreTask({ user: ref.afterUser, task, direction: 'down' }); + expect(ref.afterUser.achievements.streak).to.equal(0); + }); + + it('decrements a multiple streak achievement when unticking a Daily', () => { + let task1 = generateDaily({ userId: ref.afterUser._id, text: 'first daily', streak: initialStreakCount }); + scoreTask({ user: ref.afterUser, task: task1, direction: 'up' }); + let task2 = generateDaily({ userId: ref.afterUser._id, text: 'second daily', streak: initialStreakCount }); + scoreTask({ user: ref.afterUser, task: task2, direction: 'up' }); + scoreTask({ user: ref.afterUser, task: task2, direction: 'down' }); + expect(ref.afterUser.achievements.streak).to.equal(1); + }); + + it('does not give a streak achievement for a streak of zero', () => { + let task = generateDaily({ userId: ref.afterUser._id, text: 'some daily', streak: -1 }); + scoreTask({ user: ref.afterUser, task, direction: 'up' }); + expect(ref.afterUser.achievements.streak).to.be.undefined; + }); + + it('does not remove a streak achievement when unticking a Daily gives a streak of zero', () => { + let task1 = generateDaily({ userId: ref.afterUser._id, text: 'first daily', streak: initialStreakCount }); + scoreTask({ user: ref.afterUser, task: task1, direction: 'up' }); + let task2 = generateDaily({ userId: ref.afterUser._id, text: 'second daily', streak: 1 }); + scoreTask({ user: ref.afterUser, task: task2, direction: 'down' }); + expect(ref.afterUser.achievements.streak).to.equal(1); + }); + }); + describe('scores', () => { let options = {}; let habit; diff --git a/website/common/script/ops/scoreTask.js b/website/common/script/ops/scoreTask.js index 1bddbc254f..b199d49737 100644 --- a/website/common/script/ops/scoreTask.js +++ b/website/common/script/ops/scoreTask.js @@ -238,14 +238,14 @@ module.exports = function scoreTask (options = {}, req = {}) { if (direction === 'up') { task.streak += 1; // Give a streak achievement when the streak is a multiple of 21 - if (task.streak % 21 === 0) { + if (task.streak !== 0 && task.streak % 21 === 0) { user.achievements.streak = user.achievements.streak ? user.achievements.streak + 1 : 1; if (user.addNotification) user.addNotification('STREAK_ACHIEVEMENT'); } task.completed = true; } else if (direction === 'down') { // Remove a streak achievement if streak was a multiple of 21 and the daily was undone - if (task.streak % 21 === 0) user.achievements.streak = user.achievements.streak ? user.achievements.streak - 1 : 0; + if (task.streak !== 0 && task.streak % 21 === 0) user.achievements.streak = user.achievements.streak ? user.achievements.streak - 1 : 0; task.streak -= 1; task.completed = false; }