Skip to content

Commit 223143d

Browse files
committed
fix: normalised luxon countdown
1 parent 5a45715 commit 223143d

File tree

3 files changed

+37
-37
lines changed

3 files changed

+37
-37
lines changed

static/js/countdown-simple.js

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@
5050

5151
// Calculate time difference
5252
const now = DateTime.now();
53-
const diff = deadline.diff(now, ['days', 'hours', 'minutes', 'seconds']);
53+
const diff = deadline.diff(now);
5454

5555
if (diff.toMillis() <= 0) {
5656
// Deadline has passed
@@ -59,11 +59,13 @@
5959
: 'Deadline passed';
6060
el.classList.add('deadline-passed');
6161
} else {
62-
// Format and display countdown
63-
const days = Math.floor(diff.days);
64-
const hours = Math.floor(diff.hours);
65-
const minutes = Math.floor(diff.minutes);
66-
const seconds = Math.floor(diff.seconds);
62+
// Format and display countdown - get normalized components using shiftTo
63+
const normalized = diff.shiftTo('days', 'hours', 'minutes', 'seconds');
64+
const components = normalized.toObject();
65+
const days = Math.floor(components.days || 0);
66+
const hours = Math.floor(components.hours || 0);
67+
const minutes = Math.floor(components.minutes || 0);
68+
const seconds = Math.floor(components.seconds || 0);
6769

6870
if (el.classList.contains('countdown-small')) {
6971
// Compact format for small countdown

tests/frontend/unit/countdown-simple.test.js

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -77,16 +77,19 @@ describe('Countdown Timer System', () => {
7777
describe('Countdown Display Formats', () => {
7878
beforeEach(() => {
7979
// Mock Luxon DateTime more specifically for these tests
80-
const createMockDateTime = (days, hours, minutes, seconds) => ({
81-
invalid: false,
82-
diff: jest.fn(() => ({
83-
days,
84-
hours,
85-
minutes,
86-
seconds,
87-
toMillis: () => (days * 24 * 60 * 60 + hours * 60 * 60 + minutes * 60 + seconds) * 1000
88-
}))
89-
});
80+
const createMockDateTime = (days, hours, minutes, seconds) => {
81+
const totalMillis = (days * 24 * 60 * 60 + hours * 60 * 60 + minutes * 60 + seconds) * 1000;
82+
return {
83+
invalid: false,
84+
diff: jest.fn(() => ({
85+
toMillis: () => totalMillis,
86+
// shiftTo method returns normalized components
87+
shiftTo: jest.fn((...units) => ({
88+
toObject: () => ({ days, hours, minutes, seconds })
89+
}))
90+
}))
91+
};
92+
};
9093

9194
window.luxon = {
9295
DateTime: {

tests/frontend/utils/mockHelpers.js

Lines changed: 16 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -249,39 +249,34 @@ function mockPageVisibility(isVisible = true) {
249249
*/
250250
function mockLuxonDateTime() {
251251
if (!window.luxon) {
252+
// Create a helper to generate proper Duration mocks
253+
const createDurationMock = (days, hours, minutes, seconds) => {
254+
const totalMillis = (days * 24 * 60 * 60 + hours * 60 * 60 + minutes * 60 + seconds) * 1000;
255+
return {
256+
// Total milliseconds
257+
toMillis: () => totalMillis,
258+
// shiftTo method returns normalized components
259+
shiftTo: jest.fn((...units) => ({
260+
toObject: () => ({ days, hours, minutes, seconds })
261+
}))
262+
};
263+
};
264+
252265
// Simple mock if Luxon not loaded
253266
window.luxon = {
254267
DateTime: {
255268
now: jest.fn(() => ({
256269
toISO: () => new Date().toISOString(),
257270
toMillis: () => Date.now(),
258-
diff: jest.fn(() => ({
259-
days: 7,
260-
hours: 12,
261-
minutes: 30,
262-
seconds: 45,
263-
toMillis: () => 7 * 24 * 60 * 60 * 1000
264-
}))
271+
diff: jest.fn(() => createDurationMock(7, 12, 30, 45))
265272
})),
266273
fromSQL: jest.fn((str) => ({
267274
invalid: false,
268-
diff: jest.fn(() => ({
269-
days: 7,
270-
hours: 12,
271-
minutes: 30,
272-
seconds: 45,
273-
toMillis: () => 7 * 24 * 60 * 60 * 1000
274-
}))
275+
diff: jest.fn(() => createDurationMock(7, 12, 30, 45))
275276
})),
276277
fromISO: jest.fn((str) => ({
277278
invalid: false,
278-
diff: jest.fn(() => ({
279-
days: 7,
280-
hours: 12,
281-
minutes: 30,
282-
seconds: 45,
283-
toMillis: () => 7 * 24 * 60 * 60 * 1000
284-
}))
279+
diff: jest.fn(() => createDurationMock(7, 12, 30, 45))
285280
}))
286281
}
287282
};

0 commit comments

Comments
 (0)