[Integration] Map & test Google Calendar integration #31

Open
opened 2026-03-23 08:38:40 -07:00 by pyr0ball · 0 comments
Owner

Google Calendar — Interview Event Push

Automatically push interview events to Google Calendar when a job moves to phone_screen or interviewing stage in the kanban.

Current state

scripts/integrations/google_calendar.py exists (79 lines, 8 methods). The v0.6.0 CalDAV calendar push landed for Apple Calendar — Google Calendar integration should follow the same pattern.

Tasks

Mapping

  • Document OAuth2 credential flow: client_id, client_secret, refresh_token
  • Map calendar event fields: title = "Interview: {company}", description = job URL + notes
  • Decide: create new calendar vs. add to primary calendar (config option?)
  • Document config file format: config/integrations/google_calendar.yaml

Implementation

  • Verify GoogleCalendarIntegration.connect() stores OAuth credentials
  • Implement GoogleCalendarIntegration.test() — list calendars to validate token
  • Wire event creation: call from scripts/calendar_push.py when kanban stage changes
  • Handle token refresh (Google OAuth tokens expire — implement refresh flow)
  • Idempotent sync via calendar_event_id column in jobs table

Testing

  • Unit test: test_google_calendar_connect_stores_config()
  • Unit test: test_google_calendar_test_validates_token()
  • Integration test: create event → verify it appears in Google Calendar
  • Integration test: move job to phone_screen → verify calendar event created
  • Test duplicate prevention: move same job twice → only one calendar event

Acceptance criteria

  • Settings → Integrations shows Google Calendar card
  • Moving a job to phone_screen or interviewing creates a Google Calendar event
  • Event includes job title, company, interview date, and job URL in description
  • calendar_event_id stored on job record prevents duplicates
## Google Calendar — Interview Event Push Automatically push interview events to Google Calendar when a job moves to `phone_screen` or `interviewing` stage in the kanban. ### Current state `scripts/integrations/google_calendar.py` exists (79 lines, 8 methods). The v0.6.0 CalDAV calendar push landed for Apple Calendar — Google Calendar integration should follow the same pattern. ### Tasks **Mapping** - [ ] Document OAuth2 credential flow: client_id, client_secret, refresh_token - [ ] Map calendar event fields: title = "Interview: {company}", description = job URL + notes - [ ] Decide: create new calendar vs. add to primary calendar (config option?) - [ ] Document config file format: `config/integrations/google_calendar.yaml` **Implementation** - [ ] Verify `GoogleCalendarIntegration.connect()` stores OAuth credentials - [ ] Implement `GoogleCalendarIntegration.test()` — list calendars to validate token - [ ] Wire event creation: call from `scripts/calendar_push.py` when kanban stage changes - [ ] Handle token refresh (Google OAuth tokens expire — implement refresh flow) - [ ] Idempotent sync via `calendar_event_id` column in `jobs` table **Testing** - [ ] Unit test: `test_google_calendar_connect_stores_config()` - [ ] Unit test: `test_google_calendar_test_validates_token()` - [ ] Integration test: create event → verify it appears in Google Calendar - [ ] Integration test: move job to phone_screen → verify calendar event created - [ ] Test duplicate prevention: move same job twice → only one calendar event ### Acceptance criteria - Settings → Integrations shows Google Calendar card - Moving a job to phone_screen or interviewing creates a Google Calendar event - Event includes job title, company, interview date, and job URL in description - `calendar_event_id` stored on job record prevents duplicates
pyr0ball added this to the Paid Tier GA milestone 2026-03-23 08:38:40 -07:00
pyr0ball added the
feature-request
label 2026-03-23 08:38:40 -07:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: Circuit-Forge/peregrine#31
No description provided.