Skip to content

Commit c1f6b22

Browse files
author
Koen Konst
committed
Fixed a bug in full day recurring events and fixed a broken test that wasn't expecting the correct result since Sydney is +10 but the asserted time was only +2 from Berlin so +4 in total
1 parent 68a80ee commit c1f6b22

File tree

3 files changed

+34
-27
lines changed

3 files changed

+34
-27
lines changed

modules/default/calendar/calendar.js

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -425,16 +425,15 @@ Module.register("calendar", {
425425
// For full day events we use the fullDayEventDateFormat
426426
if (event.fullDayEvent) {
427427
//subtract one second so that fullDayEvents end at 23:59:59, and not at 0:00:00 one the next day
428-
event.endDate -= ONE_SECOND;
428+
eventEndDateMoment.subtract(1, "second");
429429
timeWrapper.innerHTML = CalendarUtils.capFirst(eventStartDateMoment.format(this.config.fullDayEventDateFormat));
430430
// only show end if requested and allowed and the dates are different
431431
if (this.config.showEnd && !this.config.showEndsOnlyWithDuration && !eventStartDateMoment.isSame(eventEndDateMoment, "d")) {
432432
timeWrapper.innerHTML += "-";
433433
timeWrapper.innerHTML += CalendarUtils.capFirst(eventEndDateMoment.format(this.config.fullDayEventDateFormat));
434-
} else
435-
if (!eventStartDateMoment.isSame(eventEndDateMoment, "d") && eventStartDateMoment.isBefore(now)) {
436-
timeWrapper.innerHTML = CalendarUtils.capFirst(now.format(this.config.fullDayEventDateFormat));
437-
}
434+
} else if (!eventStartDateMoment.isSame(eventEndDateMoment, "d") && eventStartDateMoment.isBefore(now)) {
435+
timeWrapper.innerHTML = CalendarUtils.capFirst(now.format(this.config.fullDayEventDateFormat));
436+
}
438437
} else if (this.config.getRelative > 0 && eventStartDateMoment.isBefore(now)) {
439438
// Ongoing and getRelative is set
440439
timeWrapper.innerHTML = CalendarUtils.capFirst(
@@ -588,7 +587,7 @@ Module.register("calendar", {
588587

589588
/**
590589
* converts the given timestamp to a moment with a timezone
591-
* @param timestamp timestamp from an event
590+
* @param {number} timestamp timestamp from an event
592591
* @returns {moment.Moment} moment with a timezone
593592
*/
594593
timestampToMoment (timestamp) {
@@ -644,7 +643,7 @@ Module.register("calendar", {
644643
* if sliceMultiDayEvents is set to true, multiday events (events exceeding at least one midnight) are sliced into days,
645644
* otherwise, esp. in dateheaders mode it is not clear how long these events are.
646645
*/
647-
const maxCount = eventEndDateMoment.diff(eventStartDateMoment, "days") + 1;
646+
const maxCount = eventEndDateMoment.diff(eventStartDateMoment, "days");
648647
if (this.config.sliceMultiDayEvents && maxCount > 1) {
649648
const splitEvents = [];
650649
let midnight

modules/default/calendar/calendarfetcherutils.js

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
/**
22
* @external Moment
33
*/
4-
const path = require("node:path");
54
const moment = require("moment-timezone");
65

7-
const zoneTable = require(path.join(__dirname, "windowsZones.json"));
86
const Log = require("../../../js/logger");
97

108
const CalendarFetcherUtils = {
@@ -73,7 +71,7 @@ const CalendarFetcherUtils = {
7371
* @returns {string} timezone
7472
*/
7573
getLocalTimezone () {
76-
return "America/Los_Angeles";
74+
return moment.tz.guess();
7775
},
7876

7977
/**
@@ -136,7 +134,8 @@ const CalendarFetcherUtils = {
136134
const newEvents = [];
137135

138136
const eventDate = function (event, time) {
139-
return CalendarFetcherUtils.isFullDayEvent(event) ? moment.tz(event[time], event[time].tz).startOf("day") : moment.tz(event[time], event[time].tz);
137+
const startMoment = event[time].tz ? moment.tz(event[time], event[time].tz) : moment.tz(event[time], CalendarFetcherUtils.getLocalTimezone());
138+
return CalendarFetcherUtils.isFullDayEvent(event) ? startMoment.startOf("day") : startMoment;
140139
};
141140

142141
Log.debug(`There are ${Object.entries(data).length} calendar entries.`);

tests/electron/modules/calendar_spec.js

Lines changed: 25 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,19 @@ describe("Calendar module", () => {
2222
return await loc.count();
2323
};
2424

25+
/**
26+
* Use this for debugging broken tests, it will console log the text of the calendar module
27+
* @returns {Promise<void>}
28+
*/
29+
const logAllText = async () => {
30+
expect(global.page).not.toBeNull();
31+
const loc = await global.page.locator(".calendar .event");
32+
const elem = loc.first();
33+
await elem.waitFor();
34+
expect(elem).not.toBeNull();
35+
console.log(await loc.allInnerTexts());
36+
};
37+
2538
const first = 0;
2639
const second = 1;
2740
const third = 2;
@@ -153,19 +166,6 @@ describe("Calendar module", () => {
153166
* RRULE TESTS:
154167
* Add any tests that check rrule functionality here.
155168
*/
156-
describe("sliceMultiDayEvents", () => {
157-
it("Issue #3452 split multiday in Europe", async () => {
158-
await helpers.startApplication("tests/configs/modules/calendar/sliceMultiDayEvents.js", "01 Sept 2024 10:38:00 GMT+02:00", [], "Europe/Berlin");
159-
expect(global.page).not.toBeNull();
160-
const loc = await global.page.locator(".calendar .event");
161-
const elem = loc.first();
162-
await elem.waitFor();
163-
expect(elem).not.toBeNull();
164-
const cnt = await loc.count();
165-
expect(cnt).toBe(6);
166-
});
167-
});
168-
169169
describe("sliceMultiDayEvents direct count", () => {
170170
it("Issue #3452 split multiday in Europe", async () => {
171171
await helpers.startApplication("tests/configs/modules/calendar/sliceMultiDayEvents.js", "01 Sept 2024 10:38:00 GMT+02:00", [], "Europe/Berlin");
@@ -197,21 +197,30 @@ describe("Calendar module", () => {
197197
describe("berlin late in day event moved, viewed from berlin", () => {
198198
it("Issue #unknown rrule ETC+2 close to timezone edge", async () => {
199199
await helpers.startApplication("tests/configs/modules/calendar/end_of_day_berlin_moved.js", "08 Oct 2024 12:30:00 GMT+02:00", [], "Europe/Berlin");
200-
await expect(doTestTableContent(".calendar .event", ".time", "24th.Oct, 23:00-00:00", last)).resolves.toBe(true);
200+
await expect(doTestCount()).resolves.toBe(3);
201+
await expect(doTestTableContent(".calendar .event", ".time", "22nd.Oct, 23:00-00:00", first)).resolves.toBe(true);
202+
await expect(doTestTableContent(".calendar .event", ".time", "23rd.Oct, 23:00-00:00", second)).resolves.toBe(true);
203+
await expect(doTestTableContent(".calendar .event", ".time", "24th.Oct, 23:00-00:00", third)).resolves.toBe(true);
201204
});
202205
});
203206

204207
describe("berlin late in day event moved, viewed from sydney", () => {
205208
it("Issue #unknown rrule ETC+2 close to timezone edge", async () => {
206209
await helpers.startApplication("tests/configs/modules/calendar/end_of_day_berlin_moved.js", "08 Oct 2024 12:30:00 GMT+02:00", [], "Australia/Sydney");
207-
await expect(doTestTableContent(".calendar .event", ".time", "25th.Oct, 01:00-02:00", last)).resolves.toBe(true);
210+
await expect(doTestCount()).resolves.toBe(3);
211+
await expect(doTestTableContent(".calendar .event", ".time", "23rd.Oct, 08:00-09:00", first)).resolves.toBe(true);
212+
await expect(doTestTableContent(".calendar .event", ".time", "24th.Oct, 08:00-09:00", second)).resolves.toBe(true);
213+
await expect(doTestTableContent(".calendar .event", ".time", "25th.Oct, 08:00-09:00", third)).resolves.toBe(true);
208214
});
209215
});
210216

211217
describe("berlin late in day event moved, viewed from chicago", () => {
212218
it("Issue #unknown rrule ETC+2 close to timezone edge", async () => {
213219
await helpers.startApplication("tests/configs/modules/calendar/end_of_day_berlin_moved.js", "08 Oct 2024 12:30:00 GMT+02:00", [], "America/Chicago");
214-
await expect(doTestTableContent(".calendar .event", ".time", "24th.Oct, 16:00-17:00", last)).resolves.toBe(true);
220+
await expect(doTestCount()).resolves.toBe(3);
221+
await expect(doTestTableContent(".calendar .event", ".time", "22nd.Oct, 16:00-17:00", first)).resolves.toBe(true);
222+
await expect(doTestTableContent(".calendar .event", ".time", "23rd.Oct, 16:00-17:00", second)).resolves.toBe(true);
223+
await expect(doTestTableContent(".calendar .event", ".time", "24th.Oct, 16:00-17:00", third)).resolves.toBe(true);
215224
});
216225
});
217226

0 commit comments

Comments
 (0)