mirror of
https://github.com/HabitRPG/habitica.git
synced 2025-12-18 07:07:35 +01:00
* prevent "Zero-day streak" giving a 21-day streak achievement - fixes #2578 * add tests for streak achievements * remove .only from set of tests * refactor(test): fix linting
This commit is contained in:
@@ -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', () => {
|
it('completes when the task direction is up', () => {
|
||||||
let task = generateTodo({ userId: ref.afterUser._id, text: 'todo to complete', cron: false });
|
let task = generateTodo({ userId: ref.afterUser._id, text: 'todo to complete', cron: false });
|
||||||
scoreTask({ user: ref.afterUser, task, direction: 'up' });
|
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', () => {
|
describe('scores', () => {
|
||||||
let options = {};
|
let options = {};
|
||||||
let habit;
|
let habit;
|
||||||
|
|||||||
@@ -238,14 +238,14 @@ module.exports = function scoreTask (options = {}, req = {}) {
|
|||||||
if (direction === 'up') {
|
if (direction === 'up') {
|
||||||
task.streak += 1;
|
task.streak += 1;
|
||||||
// Give a streak achievement when the streak is a multiple of 21
|
// 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;
|
user.achievements.streak = user.achievements.streak ? user.achievements.streak + 1 : 1;
|
||||||
if (user.addNotification) user.addNotification('STREAK_ACHIEVEMENT');
|
if (user.addNotification) user.addNotification('STREAK_ACHIEVEMENT');
|
||||||
}
|
}
|
||||||
task.completed = true;
|
task.completed = true;
|
||||||
} else if (direction === 'down') {
|
} else if (direction === 'down') {
|
||||||
// Remove a streak achievement if streak was a multiple of 21 and the daily was undone
|
// 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.streak -= 1;
|
||||||
task.completed = false;
|
task.completed = false;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user