-
Notifications
You must be signed in to change notification settings - Fork 0
Automated Test: fix/handle-collective-multiple-host-destinations #359
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
@@ -84,7 +84,7 @@ export default class GoogleCalendarService implements Calendar { | |||||||||||||||
| }; | ||||||||||||||||
| }; | ||||||||||||||||
|
|
||||||||||||||||
| async createEvent(calEventRaw: CalendarEvent): Promise<NewCalendarEventType> { | ||||||||||||||||
| async createEvent(calEventRaw: CalendarEvent, credentialId: number): Promise<NewCalendarEventType> { | ||||||||||||||||
| const eventAttendees = calEventRaw.attendees.map(({ id: _id, ...rest }) => ({ | ||||||||||||||||
| ...rest, | ||||||||||||||||
| responseStatus: "accepted", | ||||||||||||||||
|
|
@@ -97,6 +97,10 @@ export default class GoogleCalendarService implements Calendar { | |||||||||||||||
| responseStatus: "accepted", | ||||||||||||||||
| })) || []; | ||||||||||||||||
| return new Promise(async (resolve, reject) => { | ||||||||||||||||
| const [mainHostDestinationCalendar] = | ||||||||||||||||
| calEventRaw?.destinationCalendar && calEventRaw?.destinationCalendar.length > 0 | ||||||||||||||||
| ? calEventRaw.destinationCalendar | ||||||||||||||||
| : []; | ||||||||||||||||
| const myGoogleAuth = await this.auth.getToken(); | ||||||||||||||||
| const payload: calendar_v3.Schema$Event = { | ||||||||||||||||
| summary: calEventRaw.title, | ||||||||||||||||
|
|
@@ -115,8 +119,8 @@ export default class GoogleCalendarService implements Calendar { | |||||||||||||||
| id: String(calEventRaw.organizer.id), | ||||||||||||||||
| responseStatus: "accepted", | ||||||||||||||||
| organizer: true, | ||||||||||||||||
| email: calEventRaw.destinationCalendar?.externalId | ||||||||||||||||
| ? calEventRaw.destinationCalendar.externalId | ||||||||||||||||
| email: mainHostDestinationCalendar?.externalId | ||||||||||||||||
| ? mainHostDestinationCalendar.externalId | ||||||||||||||||
| : calEventRaw.organizer.email, | ||||||||||||||||
| }, | ||||||||||||||||
| ...eventAttendees, | ||||||||||||||||
|
|
@@ -138,13 +142,16 @@ export default class GoogleCalendarService implements Calendar { | |||||||||||||||
| const calendar = google.calendar({ | ||||||||||||||||
| version: "v3", | ||||||||||||||||
| }); | ||||||||||||||||
| const selectedCalendar = calEventRaw.destinationCalendar?.externalId | ||||||||||||||||
| ? calEventRaw.destinationCalendar.externalId | ||||||||||||||||
| : "primary"; | ||||||||||||||||
| // Find in calEventRaw.destinationCalendar the one with the same credentialId | ||||||||||||||||
|
|
||||||||||||||||
| const selectedCalendar = calEventRaw.destinationCalendar?.find( | ||||||||||||||||
| (cal) => cal.credentialId === credentialId | ||||||||||||||||
| )?.externalId; | ||||||||||||||||
|
|
||||||||||||||||
| calendar.events.insert( | ||||||||||||||||
| { | ||||||||||||||||
| auth: myGoogleAuth, | ||||||||||||||||
| calendarId: selectedCalendar, | ||||||||||||||||
| calendarId: selectedCalendar || "primary", | ||||||||||||||||
|
Comment on lines
+145
to
+154
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Line 154 correctly falls back to Proposed fix calendar.events.patch({
// Update the same event but this time we know the hangout link
- calendarId: selectedCalendar,
+ calendarId: selectedCalendar || "primary",
auth: myGoogleAuth,🤖 Prompt for AI Agents |
||||||||||||||||
| requestBody: payload, | ||||||||||||||||
| conferenceDataVersion: 1, | ||||||||||||||||
| sendUpdates: "none", | ||||||||||||||||
|
|
@@ -188,6 +195,8 @@ export default class GoogleCalendarService implements Calendar { | |||||||||||||||
|
|
||||||||||||||||
| async updateEvent(uid: string, event: CalendarEvent, externalCalendarId: string): Promise<any> { | ||||||||||||||||
| return new Promise(async (resolve, reject) => { | ||||||||||||||||
| const [mainHostDestinationCalendar] = | ||||||||||||||||
| event?.destinationCalendar && event?.destinationCalendar.length > 0 ? event.destinationCalendar : []; | ||||||||||||||||
| const myGoogleAuth = await this.auth.getToken(); | ||||||||||||||||
| const eventAttendees = event.attendees.map(({ ...rest }) => ({ | ||||||||||||||||
| ...rest, | ||||||||||||||||
|
|
@@ -216,8 +225,8 @@ export default class GoogleCalendarService implements Calendar { | |||||||||||||||
| id: String(event.organizer.id), | ||||||||||||||||
| organizer: true, | ||||||||||||||||
| responseStatus: "accepted", | ||||||||||||||||
| email: event.destinationCalendar?.externalId | ||||||||||||||||
| ? event.destinationCalendar.externalId | ||||||||||||||||
| email: mainHostDestinationCalendar?.externalId | ||||||||||||||||
| ? mainHostDestinationCalendar.externalId | ||||||||||||||||
| : event.organizer.email, | ||||||||||||||||
| }, | ||||||||||||||||
| ...(eventAttendees as any), | ||||||||||||||||
|
|
@@ -244,7 +253,7 @@ export default class GoogleCalendarService implements Calendar { | |||||||||||||||
|
|
||||||||||||||||
| const selectedCalendar = externalCalendarId | ||||||||||||||||
| ? externalCalendarId | ||||||||||||||||
| : event.destinationCalendar?.externalId; | ||||||||||||||||
| : event.destinationCalendar?.find((cal) => cal.externalId === externalCalendarId)?.externalId; | ||||||||||||||||
|
Comment on lines
254
to
+256
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Bug: tautological When The likely intent was to look up by Possible fix (mirror the createEvent pattern)- const selectedCalendar = externalCalendarId
- ? externalCalendarId
- : event.destinationCalendar?.find((cal) => cal.externalId === externalCalendarId)?.externalId;
+ const selectedCalendar = externalCalendarId
+ ? externalCalendarId
+ : event.destinationCalendar?.[0]?.externalId || "primary";📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents |
||||||||||||||||
|
|
||||||||||||||||
| calendar.events.update( | ||||||||||||||||
| { | ||||||||||||||||
|
|
@@ -303,7 +312,9 @@ export default class GoogleCalendarService implements Calendar { | |||||||||||||||
| }); | ||||||||||||||||
|
|
||||||||||||||||
| const defaultCalendarId = "primary"; | ||||||||||||||||
| const calendarId = externalCalendarId ? externalCalendarId : event.destinationCalendar?.externalId; | ||||||||||||||||
| const calendarId = externalCalendarId | ||||||||||||||||
| ? externalCalendarId | ||||||||||||||||
| : event.destinationCalendar?.find((cal) => cal.externalId === externalCalendarId)?.externalId; | ||||||||||||||||
|
Comment on lines
+315
to
+317
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Same tautological Identical issue: when Proposed fix const calendarId = externalCalendarId
? externalCalendarId
- : event.destinationCalendar?.find((cal) => cal.externalId === externalCalendarId)?.externalId;
+ : event.destinationCalendar?.[0]?.externalId;🤖 Prompt for AI Agents |
||||||||||||||||
|
|
||||||||||||||||
| calendar.events.delete( | ||||||||||||||||
| { | ||||||||||||||||
|
|
||||||||||||||||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🧩 Analysis chain
🏁 Script executed:
Repository: admin-coderabbit/coderabbit-cal_dot_com-mirror
Length of output: 6096
🏁 Script executed:
Repository: admin-coderabbit/coderabbit-cal_dot_com-mirror
Length of output: 3196
🏁 Script executed:
Repository: admin-coderabbit/coderabbit-cal_dot_com-mirror
Length of output: 418
🏁 Script executed:
Repository: admin-coderabbit/coderabbit-cal_dot_com-mirror
Length of output: 1188
🏁 Script executed:
Repository: admin-coderabbit/coderabbit-cal_dot_com-mirror
Length of output: 2189
The handlers intentionally produce different types for
destinationCalendar.The test expectations reflect the actual handler behavior:
confirm.handler.ts(BOOKING_REJECTED) defaults to[]when no calendar is foundhandleNewBooking.ts(BOOKING_CREATED/BOOKING_REQUESTED) defaults tonullWhile the tests correctly reflect their respective handlers, this type inconsistency across webhook events suggests a potential API contract issue. Consider whether all webhook events should produce the same shape for
destinationCalendar(either all[]or allnull) for consistency.🤖 Prompt for AI Agents