From 6ed422cd28f8576994fd84b789be91df3659a0f8 Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Wed, 8 May 2024 17:42:24 +0200 Subject: [PATCH] Improve repeating events handling --- test/content/events.test.js | 40 ++++++++++++++++ .../common/script/content/constants/events.js | 47 ++++++++++--------- 2 files changed, 66 insertions(+), 21 deletions(-) create mode 100644 test/content/events.test.js diff --git a/test/content/events.test.js b/test/content/events.test.js new file mode 100644 index 0000000000..db6efd95b5 --- /dev/null +++ b/test/content/events.test.js @@ -0,0 +1,40 @@ +import { getRepeatingEvents } from '../../website/common/script/content/constants/events'; + +describe.only('events', () => { + let clock; + + afterEach(() => { + if (clock) { + clock.restore(); + } + }); + + it('returns empty array when no events are active', () => { + clock = sinon.useFakeTimers(new Date('2024-01-06')); + const events = getRepeatingEvents(); + expect(events).to.be.empty; + }); + + it('returns events when active', () => { + clock = sinon.useFakeTimers(new Date('2024-01-31')); + const events = getRepeatingEvents(); + expect(events).to.have.length(1); + expect(events[0].key).to.equal('birthday'); + expect(events[0].end).to.be.greaterThan(new Date()); + expect(events[0].start).to.be.lessThan(new Date()); + }); + + it('returns nye event at beginning of the year', () => { + clock = sinon.useFakeTimers(new Date('2025-01-01')); + const events = getRepeatingEvents(); + expect(events).to.have.length(1); + expect(events[0].key).to.equal('nye'); + }); + + it('returns nye event at end of the year', () => { + clock = sinon.useFakeTimers(new Date('2024-12-30')); + const events = getRepeatingEvents(); + expect(events).to.have.length(1); + expect(events[0].key).to.equal('nye'); + }); +}); diff --git a/website/common/script/content/constants/events.js b/website/common/script/content/constants/events.js index 8771f87cf9..adcc730659 100644 --- a/website/common/script/content/constants/events.js +++ b/website/common/script/content/constants/events.js @@ -12,8 +12,8 @@ const gemsPromo = { export const REPEATING_EVENTS = { nye: { - start: '1970-12-28T08:00-05:00', - end: '1970-01-04T23:59-05:00', + start: new Date('1970-12-28T08:00-05:00'), + end: new Date('1970-01-04T23:59-05:00'), season: 'nye', npcImageSuffix: '_nye', content: [ @@ -26,15 +26,15 @@ export const REPEATING_EVENTS = { ], }, birthday: { - start: '1970-01-30T08:00-05:00', - end: '1970-02-08T23:59-05:00', + start: new Date('1970-01-30T08:00-05:00'), + end: new Date('1970-02-08T23:59-05:00'), season: 'birthday', npcImageSuffix: '_birthday', foodSeason: 'Cake', }, valentines: { - start: '1970-02-13T08:00-05:00', - end: '1970-02-17T23:59-05:00', + start: new Date('1970-02-13T08:00-05:00'), + end: new Date('1970-02-17T23:59-05:00'), season: 'valentines', npcImageSuffix: '_valentines', content: [ @@ -47,23 +47,23 @@ export const REPEATING_EVENTS = { ], }, piDay: { - start: '1970-03-13T08:00-05:00', - end: '1970-03-15T23:59-05:00', + start: new Date('1970-03-13T08:00-05:00'), + end: new Date('1970-03-15T23:59-05:00'), foodSeason: 'Pie', }, namingDay: { - start: '1970-07-30T08:00-05:00', - end: '1970-08-01T23:59-05:00', + start: new Date('1970-07-30T08:00-05:00'), + end: new Date('1970-08-01T23:59-05:00'), foodSeason: 'Cake', }, habitoween: { - start: '1970-10-30T08:00-05:00', - end: '1970-11-01T23:59-05:00', + start: new Date('1970-10-30T08:00-05:00'), + end: new Date('1970-11-01T23:59-05:00'), foodSeason: 'Candy', }, harvestFeast: { - start: '1970-11-22T08:00-05:00', - end: '1970-11-27T20:00-05:00', + start: new Date('1970-11-22T08:00-05:00'), + end: new Date('1970-11-27T20:00-05:00'), season: 'thanksgiving', npcImageSuffix: '_thanksgiving', foodSeason: 'Pie', @@ -72,13 +72,18 @@ export const REPEATING_EVENTS = { export function getRepeatingEvents (date) { const momentDate = date instanceof moment ? date : moment(date); - return filter(Object.keys(REPEATING_EVENTS), eventKey => { - const eventData = REPEATING_EVENTS[eventKey]; - const startDate = eventData.start.replace('1970', momentDate.year()); - const endDate = eventData.end.replace('1970', momentDate.year()); - - return momentDate.isBetween(startDate, endDate); - }).map(eventKey => REPEATING_EVENTS[eventKey]); + return Object.keys(REPEATING_EVENTS).map(eventKey => { + const event = REPEATING_EVENTS[eventKey]; + event.key = eventKey; + event.start.setYear(momentDate.year()); + event.end.setYear(momentDate.year()); + if (event.end < event.start && momentDate < event.start) { + event.start.setYear(momentDate.year() - 1); + } else if (event.end < event.start && momentDate > event.end) { + event.end.setYear(momentDate.year() + 1); + } + return event; + }).filter(event => momentDate.isBetween(event.start, event.end)); } export const EVENTS = {