e85a2bae14
* fix: prevent duplicate streak achievement notifications (#13325) * fix(lint): whitespace also remove unnecessary file and comments --------- Co-authored-by: Kalista Payne <kalista@habitica.com>
109 lines
3.8 KiB
JavaScript
109 lines
3.8 KiB
JavaScript
import { model as UserNotification } from '../../../../website/server/models/userNotification';
|
|
|
|
describe('UserNotification Model', () => {
|
|
context('cleanupCorruptData', () => {
|
|
it('converts an array of notifications to a safe version', () => {
|
|
const notifications = [
|
|
null, // invalid, not an object
|
|
{ seen: true }, // invalid, no type or id
|
|
{ id: 123 }, // invalid, no type
|
|
{ type: 'ABC' }, // invalid, no id
|
|
new UserNotification({ type: 'ABC', id: 123 }), // valid
|
|
];
|
|
|
|
const safeNotifications = UserNotification.cleanupCorruptData(notifications);
|
|
expect(safeNotifications.length).to.equal(1);
|
|
expect(safeNotifications[0].data).to.deep.equal({});
|
|
expect(safeNotifications[0].seen).to.equal(false);
|
|
expect(safeNotifications[0].type).to.equal('ABC');
|
|
expect(safeNotifications[0].id).to.equal('123');
|
|
});
|
|
|
|
it('removes multiple NEW_CHAT_MESSAGE for the same group', () => {
|
|
const notifications = [
|
|
new UserNotification({
|
|
type: 'NEW_CHAT_MESSAGE',
|
|
id: 123,
|
|
data: { group: { id: 12345 } },
|
|
}),
|
|
new UserNotification({
|
|
type: 'NEW_CHAT_MESSAGE',
|
|
id: 1234,
|
|
data: { group: { id: 12345 } },
|
|
}),
|
|
new UserNotification({
|
|
type: 'NEW_CHAT_MESSAGE',
|
|
id: 123,
|
|
data: { group: { id: 123456 } },
|
|
}), // not duplicate, different group
|
|
new UserNotification({
|
|
type: 'NEW_CHAT_MESSAGE_DIFF',
|
|
id: 123,
|
|
data: { group: { id: 12345 } },
|
|
}), // not duplicate, different type
|
|
];
|
|
|
|
const safeNotifications = UserNotification.cleanupCorruptData(notifications);
|
|
expect(safeNotifications.length).to.equal(3);
|
|
expect(safeNotifications[0].data).to.deep.equal({ group: { id: 12345 } });
|
|
expect(safeNotifications[0].seen).to.equal(false);
|
|
expect(safeNotifications[0].type).to.equal('NEW_CHAT_MESSAGE');
|
|
expect(safeNotifications[0].id).to.equal('123');
|
|
});
|
|
|
|
it('removes duplicate STREAK_ACHIEVEMENT notifications', () => {
|
|
// Fixes issue #13325 - Users receiving duplicate streak achievement notifications
|
|
const notifications = [
|
|
new UserNotification({
|
|
type: 'STREAK_ACHIEVEMENT',
|
|
id: 123,
|
|
data: {},
|
|
}),
|
|
new UserNotification({
|
|
type: 'STREAK_ACHIEVEMENT',
|
|
id: 456,
|
|
data: {},
|
|
}),
|
|
new UserNotification({
|
|
type: 'CRON',
|
|
id: 789,
|
|
data: {},
|
|
}), // different type, should be kept
|
|
];
|
|
|
|
const safeNotifications = UserNotification.cleanupCorruptData(notifications);
|
|
expect(safeNotifications.length).to.equal(2);
|
|
expect(safeNotifications[0].type).to.equal('STREAK_ACHIEVEMENT');
|
|
expect(safeNotifications[0].id).to.equal('123');
|
|
expect(safeNotifications[1].type).to.equal('CRON');
|
|
expect(safeNotifications[1].id).to.equal('789');
|
|
});
|
|
|
|
it('handles multiple STREAK_ACHIEVEMENT duplicates correctly', () => {
|
|
// Test case: 3 duplicate STREAK_ACHIEVEMENT notifications
|
|
const notifications = [
|
|
new UserNotification({
|
|
type: 'STREAK_ACHIEVEMENT',
|
|
id: 111,
|
|
data: {},
|
|
}),
|
|
new UserNotification({
|
|
type: 'STREAK_ACHIEVEMENT',
|
|
id: 222,
|
|
data: {},
|
|
}),
|
|
new UserNotification({
|
|
type: 'STREAK_ACHIEVEMENT',
|
|
id: 333,
|
|
data: {},
|
|
}),
|
|
];
|
|
|
|
const safeNotifications = UserNotification.cleanupCorruptData(notifications);
|
|
expect(safeNotifications.length).to.equal(1);
|
|
expect(safeNotifications[0].type).to.equal('STREAK_ACHIEVEMENT');
|
|
expect(safeNotifications[0].id).to.equal('111'); // Keep first one
|
|
});
|
|
});
|
|
});
|