fix: OOO days not correctly blocked (#25259)

* fix: OOO check in buildSlotsWithDateRanges

* added testcase

---------

Co-authored-by: chauhan_s <somaychauhan98@gmail.com>
Co-authored-by: Udit Takkar <53316345+Udit-takkar@users.noreply.github.com>
This commit is contained in:
Abhijeet Singh
2025-11-25 20:14:05 +00:00
committed by GitHub
co-authored by chauhan_s Udit Takkar
parent 81224f324a
commit 625c260e40
2 changed files with 58 additions and 3 deletions
@@ -840,4 +840,60 @@ describe("Tests the date-range slot logic with showOptimizedSlots", () => {
vi.useRealTimers();
});
it("should mark slots as away when OOO is on next day and availability extends past midnight", async () => {
// This test reproduces the bug where:
// - Day 1 has availability from 00:00 to 23:59
// - Day 2 is marked as OOO
// - Slots generated after midnight are not marked as away
vi.setSystemTime(dayjs.utc("2025-11-17T00:00:00Z").toDate());
const day1Start = dayjs.utc("2025-11-17T00:00:00Z");
const day2End = dayjs.utc("2025-11-18T23:59:59Z");
// OOO data for Day 2 (2025-11-18)
const datesOutOfOffice = {
"2025-11-18": {
fromUser: { id: 1, displayName: "Test User" },
toUser: null,
reason: "Out of office",
emoji: "🏖️",
},
};
const slots = getSlots({
inviteeDate: day1Start,
frequency: 15,
minimumBookingNotice: 0,
eventLength: 15,
dateRanges: [
{
start: day1Start,
end: day2End,
},
],
datesOutOfOffice,
});
// Filter slots by day
const day1Slots = slots.filter((slot) => slot.time.format("YYYY-MM-DD") === "2025-11-17");
const day2Slots = slots.filter((slot) => slot.time.format("YYYY-MM-DD") === "2025-11-18");
// Day 1 slots should NOT be marked as away
day1Slots.forEach((slot) => {
expect(slot.away).toBeUndefined();
});
expect(day2Slots.length).toBeGreaterThan(0);
// Day 2 slots should be marked as away
day2Slots.forEach((slot) => {
expect(slot.away).toBe(true);
expect(slot.reason).toBe("Out of office");
expect(slot.emoji).toBe("🏖️");
});
vi.useRealTimers();
});
});
+2 -3
View File
@@ -122,7 +122,6 @@ function buildSlotsWithDateRanges({
const slotBoundaries = new Map<number, true>();
orderedDateRanges.forEach((range) => {
const dateYYYYMMDD = range.start.format("YYYY-MM-DD");
let slotStartTime = range.start.utc().isAfter(startTimeWithMinNotice)
? range.start
@@ -182,8 +181,8 @@ function buildSlotsWithDateRanges({
}
slotBoundaries.set(slotStartTime.valueOf(), true);
const dateOutOfOfficeExists = datesOutOfOffice?.[dateYYYYMMDD];
const slotDateYYYYMMDD = slotStartTime.format("YYYY-MM-DD");
const dateOutOfOfficeExists = datesOutOfOffice?.[slotDateYYYYMMDD];
let slotData: {
time: Dayjs;
userIds?: number[];