From dd5cb0295bbbbd44b426e518c09e4a6b25351b77 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 18 Sep 2025 04:23:20 +0000 Subject: [PATCH 1/6] Initial plan From 789b1a58410f762eba0ad497d41569c8a46f3e10 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 18 Sep 2025 04:33:33 +0000 Subject: [PATCH 2/6] feat(backend): show someday base recurring events in sidebar - Modified getReadAllFilter to include base someday recurring events while excluding base calendar recurring events - Added comprehensive tests for both scenarios - Verified web application still loads correctly - Fixed issue where someday base recurring events were not visible in sidebar when moved from calendar Co-authored-by: victor-enogwe <23452630+victor-enogwe@users.noreply.github.com> --- .../src/event/services/event.find.test.ts | 63 +++++++++++++++++++ .../src/event/services/event.service.util.ts | 11 +++- 2 files changed, 72 insertions(+), 2 deletions(-) diff --git a/packages/backend/src/event/services/event.find.test.ts b/packages/backend/src/event/services/event.find.test.ts index bce39b05a..72bfee868 100644 --- a/packages/backend/src/event/services/event.find.test.ts +++ b/packages/backend/src/event/services/event.find.test.ts @@ -88,6 +88,39 @@ describe("Jan 2022: Many Formats", () => { const instances = result.filter(isExistingInstance); expect(instances).toHaveLength(gInstances.length); }); + + it("excludes base calendar recurring events when someday=false", async () => { + // Create a base calendar recurring event (isSomeday: false) + const baseCalendarRecurringEvent = { + user: userId, + title: "Base Calendar Recurring Event", + isSomeday: false, + startDate: "2023-10-01T10:00:00Z", + endDate: "2023-10-01T11:00:00Z", + recurrence: { + rule: ["RRULE:FREQ=WEEKLY;COUNT=5"], + }, + }; + + // Insert the test event + await mongoService.event.insertOne(baseCalendarRecurringEvent); + + // Query for calendar events (not someday) + const filter = getReadAllFilter(userId, { + start: "2023-10-01", + end: "2023-10-31", + }); + const result = await mongoService.event.find(filter).toArray(); + + // Should NOT include the base calendar recurring event + const baseCalendarRecurringEvents = result.filter( + (e) => e.isSomeday === false && e.recurrence?.rule, + ); + + expect(baseCalendarRecurringEvents).toHaveLength(0); + const titles = result.map((e) => e.title); + expect(titles).not.toContain("Base Calendar Recurring Event"); + }); }); describe("finds events with exact same timestamps", () => { @@ -298,6 +331,36 @@ describe("Jan 2022: Many Formats", () => { expect(result[0]?.title).toBe("Multi-Month 2"); }); }); + + it("includes base someday recurring events when someday query provided", async () => { + // Create a base someday recurring event + const baseSomedayRecurringEvent = { + user: userId, + title: "Base Someday Recurring Event", + isSomeday: true, + startDate: "2023-10-01", + endDate: "2023-10-02", + recurrence: { + rule: ["RRULE:FREQ=WEEKLY;COUNT=5"], + }, + }; + + // Insert the test event + await mongoService.event.insertOne(baseSomedayRecurringEvent); + + // Query for someday events + const filter = getReadAllFilter(userId, { someday: "true" }); + const result = await mongoService.event.find(filter).toArray(); + + // Should include the base someday recurring event + const baseSomedayRecurringEvents = result.filter( + (e) => e.isSomeday === true && e.recurrence?.rule, + ); + + expect(baseSomedayRecurringEvents.length).toBeGreaterThan(0); + const titles = baseSomedayRecurringEvents.map((e) => e.title); + expect(titles).toContain("Base Someday Recurring Event"); + }); }); }); diff --git a/packages/backend/src/event/services/event.service.util.ts b/packages/backend/src/event/services/event.service.util.ts index 9226e2738..279dc29d4 100644 --- a/packages/backend/src/event/services/event.service.util.ts +++ b/packages/backend/src/event/services/event.service.util.ts @@ -72,8 +72,15 @@ export const getReadAllFilter = ( Object.assign(filter, dateFilters); } - // Exclude base recurring events (those with recurrence.rule) - filter["recurrence.rule"] = { $exists: false }; + // For someday events: include base recurring events (those with recurrence.rule) + // For calendar events: exclude base recurring events (those with recurrence.rule) + if (isSomeday) { + // Include all someday events, including base recurring events + // No additional filter needed for recurrence.rule + } else { + // Exclude base recurring events (those with recurrence.rule) + filter["recurrence.rule"] = { $exists: false }; + } return filter; }; From f9839df39f9fb842722e89e57b7d626850b651d6 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 24 Sep 2025 07:31:25 +0000 Subject: [PATCH 3/6] refactor(backend): use existing mock creator functions in event tests Updated test cases to use createMockBaseEvent instead of manually creating test objects as requested in PR review feedback. - Imported createMockBaseEvent from @core/util/test/ccal.event.factory - Replaced manual object creation with createMockBaseEvent calls in both test cases - Maintained same test functionality while following established patterns Co-authored-by: victor-enogwe <23452630+victor-enogwe@users.noreply.github.com> --- packages/backend/src/event/services/event.find.test.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/backend/src/event/services/event.find.test.ts b/packages/backend/src/event/services/event.find.test.ts index 72bfee868..09d5c63ab 100644 --- a/packages/backend/src/event/services/event.find.test.ts +++ b/packages/backend/src/event/services/event.find.test.ts @@ -4,6 +4,7 @@ import { mockEventSetSomeday1 } from "@core/__mocks__/v1/events/events.someday.1 import { MapEvent, gEventToCompassEvent } from "@core/mappers/map.event"; import { Schema_Event } from "@core/types/event.types"; import { isBase, isExistingInstance } from "@core/util/event/event.util"; +import { createMockBaseEvent } from "@core/util/test/ccal.event.factory"; import { cleanupTestDb, setupTestDb, @@ -91,7 +92,7 @@ describe("Jan 2022: Many Formats", () => { it("excludes base calendar recurring events when someday=false", async () => { // Create a base calendar recurring event (isSomeday: false) - const baseCalendarRecurringEvent = { + const baseCalendarRecurringEvent = createMockBaseEvent({ user: userId, title: "Base Calendar Recurring Event", isSomeday: false, @@ -100,7 +101,7 @@ describe("Jan 2022: Many Formats", () => { recurrence: { rule: ["RRULE:FREQ=WEEKLY;COUNT=5"], }, - }; + }); // Insert the test event await mongoService.event.insertOne(baseCalendarRecurringEvent); @@ -334,7 +335,7 @@ describe("Jan 2022: Many Formats", () => { it("includes base someday recurring events when someday query provided", async () => { // Create a base someday recurring event - const baseSomedayRecurringEvent = { + const baseSomedayRecurringEvent = createMockBaseEvent({ user: userId, title: "Base Someday Recurring Event", isSomeday: true, @@ -343,7 +344,7 @@ describe("Jan 2022: Many Formats", () => { recurrence: { rule: ["RRULE:FREQ=WEEKLY;COUNT=5"], }, - }; + }); // Insert the test event await mongoService.event.insertOne(baseSomedayRecurringEvent); From 2fffdf09024177d3e74d3aa1728d57d5bce1f8e7 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 24 Sep 2025 07:36:22 +0000 Subject: [PATCH 4/6] refactor(backend): make conditional logic more concise in getReadAllFilter Simplified if-else block by inverting the condition to remove empty if branch. - Changed from: if (isSomeday) { /* empty */ } else { /* code */ } - Changed to: if (!isSomeday) { /* code */ } This makes the code more readable and concise while maintaining the exact same functionality. Co-authored-by: victor-enogwe <23452630+victor-enogwe@users.noreply.github.com> --- packages/backend/src/event/services/event.service.util.ts | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/packages/backend/src/event/services/event.service.util.ts b/packages/backend/src/event/services/event.service.util.ts index 279dc29d4..cf21942b6 100644 --- a/packages/backend/src/event/services/event.service.util.ts +++ b/packages/backend/src/event/services/event.service.util.ts @@ -74,11 +74,7 @@ export const getReadAllFilter = ( // For someday events: include base recurring events (those with recurrence.rule) // For calendar events: exclude base recurring events (those with recurrence.rule) - if (isSomeday) { - // Include all someday events, including base recurring events - // No additional filter needed for recurrence.rule - } else { - // Exclude base recurring events (those with recurrence.rule) + if (!isSomeday) { filter["recurrence.rule"] = { $exists: false }; } From 229de177fa351b7d33ca8c2cde126cf137242d19 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 25 Sep 2025 11:39:38 +0000 Subject: [PATCH 5/6] refactor(backend): clean up test code and simplify if statement - Removed unnecessary custom fields from createMockBaseEvent calls (title, startDate, endDate, recurrence.rule) - Removed unnecessary test conditions that checked specific titles - Simplified single-line if statement by removing braces - Tests now rely on default mock values while only overriding essential fields (user, isSomeday) Co-authored-by: victor-enogwe <23452630+victor-enogwe@users.noreply.github.com> --- .../src/event/services/event.find.test.ts | 16 ---------------- .../src/event/services/event.service.util.ts | 4 +--- 2 files changed, 1 insertion(+), 19 deletions(-) diff --git a/packages/backend/src/event/services/event.find.test.ts b/packages/backend/src/event/services/event.find.test.ts index 09d5c63ab..a9cf33b2a 100644 --- a/packages/backend/src/event/services/event.find.test.ts +++ b/packages/backend/src/event/services/event.find.test.ts @@ -94,13 +94,7 @@ describe("Jan 2022: Many Formats", () => { // Create a base calendar recurring event (isSomeday: false) const baseCalendarRecurringEvent = createMockBaseEvent({ user: userId, - title: "Base Calendar Recurring Event", isSomeday: false, - startDate: "2023-10-01T10:00:00Z", - endDate: "2023-10-01T11:00:00Z", - recurrence: { - rule: ["RRULE:FREQ=WEEKLY;COUNT=5"], - }, }); // Insert the test event @@ -119,8 +113,6 @@ describe("Jan 2022: Many Formats", () => { ); expect(baseCalendarRecurringEvents).toHaveLength(0); - const titles = result.map((e) => e.title); - expect(titles).not.toContain("Base Calendar Recurring Event"); }); }); @@ -337,13 +329,7 @@ describe("Jan 2022: Many Formats", () => { // Create a base someday recurring event const baseSomedayRecurringEvent = createMockBaseEvent({ user: userId, - title: "Base Someday Recurring Event", isSomeday: true, - startDate: "2023-10-01", - endDate: "2023-10-02", - recurrence: { - rule: ["RRULE:FREQ=WEEKLY;COUNT=5"], - }, }); // Insert the test event @@ -359,8 +345,6 @@ describe("Jan 2022: Many Formats", () => { ); expect(baseSomedayRecurringEvents.length).toBeGreaterThan(0); - const titles = baseSomedayRecurringEvents.map((e) => e.title); - expect(titles).toContain("Base Someday Recurring Event"); }); }); }); diff --git a/packages/backend/src/event/services/event.service.util.ts b/packages/backend/src/event/services/event.service.util.ts index cf21942b6..ebeb3b2ce 100644 --- a/packages/backend/src/event/services/event.service.util.ts +++ b/packages/backend/src/event/services/event.service.util.ts @@ -74,9 +74,7 @@ export const getReadAllFilter = ( // For someday events: include base recurring events (those with recurrence.rule) // For calendar events: exclude base recurring events (those with recurrence.rule) - if (!isSomeday) { - filter["recurrence.rule"] = { $exists: false }; - } + if (!isSomeday) filter["recurrence.rule"] = { $exists: false }; return filter; }; From 29886253f6807d69b76d3a0d0db21c8ab637eae9 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 25 Sep 2025 11:52:20 +0000 Subject: [PATCH 6/6] refactor(backend): use existing discriminator functions in tests Updated test filters to use the existing `isBase` function instead of manually checking `e.recurrence?.rule`. - Changed from: `e.isSomeday === false && e.recurrence?.rule` - Changed to: `isBase(e) && e.isSomeday === false` This follows the established pattern of using discriminator functions from @core/util/event/event.util for event type checking. Co-authored-by: victor-enogwe <23452630+victor-enogwe@users.noreply.github.com> --- packages/backend/src/event/services/event.find.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/backend/src/event/services/event.find.test.ts b/packages/backend/src/event/services/event.find.test.ts index a9cf33b2a..869961067 100644 --- a/packages/backend/src/event/services/event.find.test.ts +++ b/packages/backend/src/event/services/event.find.test.ts @@ -109,7 +109,7 @@ describe("Jan 2022: Many Formats", () => { // Should NOT include the base calendar recurring event const baseCalendarRecurringEvents = result.filter( - (e) => e.isSomeday === false && e.recurrence?.rule, + (e) => isBase(e) && e.isSomeday === false, ); expect(baseCalendarRecurringEvents).toHaveLength(0); @@ -341,7 +341,7 @@ describe("Jan 2022: Many Formats", () => { // Should include the base someday recurring event const baseSomedayRecurringEvents = result.filter( - (e) => e.isSomeday === true && e.recurrence?.rule, + (e) => isBase(e) && e.isSomeday === true, ); expect(baseSomedayRecurringEvents.length).toBeGreaterThan(0);