7.9 KiB
Testing the Calendar Skill
End-to-end tests for send, reply, todo, calendar sync, and local calendar. All commands use --dry-run first, then live.
SKILL_DIR=~/.openclaw/workspace/skills/calendar
# Use a date 3 days from now for test events
TEST_DATE=$(date -d "+3 days" +%Y-%m-%d)
1. Dry Run: Send Invite
Generates the ICS and MIME email without sending. Check that:
- ICS has
METHOD:REQUEST - MIME has
Content-Type: text/calendar; method=REQUEST mail@luyx.orgappears as attendee (auto-added)- Times and timezone look correct
$SKILL_DIR/scripts/calendar.sh send \
--to "mail@luyx.org" \
--subject "Test Invite" \
--summary "Test Event" \
--start "${TEST_DATE}T15:00:00" \
--end "${TEST_DATE}T16:00:00" \
--dry-run
2. Live Send: Self-Invite
Send a real invite to mail@luyx.org only (no confirmation needed per email rules).
$SKILL_DIR/scripts/calendar.sh send \
--to "mail@luyx.org" \
--subject "Calendar Skill Test" \
--summary "Calendar Skill Test" \
--start "${TEST_DATE}T15:00:00" \
--end "${TEST_DATE}T16:00:00" \
--location "Test Location"
Verify:
- Script exits without error
- Email arrives at
mail@luyx.org - Email shows Accept/Decline/Tentative buttons (not just an attachment)
.icsfile saved to~/.openclaw/workspace/calendars/home/
3. Verify Calendar Sync and Local Calendar
After sending in step 2, check that the event synced and appears locally.
# Check vdirsyncer sync ran (should have printed "Synced to CalDAV server" in step 2)
# If not, run manually:
vdirsyncer sync
# List .ics files in local calendar
ls ~/.openclaw/workspace/calendars/home/
# Check the event shows up in khal
khal list "$TEST_DATE"
Verify:
vdirsyncer synccompletes without errors.icsfile exists in~/.openclaw/workspace/calendars/home/khal listshows "Calendar Skill Test" on the test date
4. Reply: Accept the Self-Invite
The invite sent in step 2 should be in the inbox. Find it, then accept it. This tests the full reply flow without needing an external sender.
# Find the test invite in inbox
himalaya envelope list
# Confirm it's the calendar invite
himalaya message read <envelope-id>
# Accept it
$SKILL_DIR/scripts/calendar.sh reply \
--envelope-id <envelope-id> \
--action accept
Verify:
- Reply sent to organizer (youlu@luyanxin.com, i.e. ourselves)
- Original invite forwarded to
mail@luyx.org - Event still in
~/.openclaw/workspace/calendars/home/ vdirsyncer syncrankhal list "$TEST_DATE"still shows the event
5. Reply: Decline an Invite
Send another self-invite, then decline it. This verifies decline removes the event from local calendar.
# Send a second test invite
$SKILL_DIR/scripts/calendar.sh send \
--to "mail@luyx.org" \
--subject "Decline Test" \
--summary "Decline Test Event" \
--start "${TEST_DATE}T17:00:00" \
--end "${TEST_DATE}T18:00:00"
# Find it in inbox
himalaya envelope list
# Decline it
$SKILL_DIR/scripts/calendar.sh reply \
--envelope-id <envelope-id> \
--action decline \
--comment "Testing decline flow."
Verify:
- Reply sent to organizer with comment
- Event NOT forwarded to
mail@luyx.org - Event removed from local calendar
khal list "$TEST_DATE"does NOT show "Decline Test Event"
6. Verify Final Calendar State
After all tests, confirm the calendar is in a clean state.
# Sync one more time
vdirsyncer sync
# Only the accepted event should remain
khal list "$TEST_DATE"
# List all upcoming events
khal list today 7d
7. Dry Run: Add Todo
Generates the VTODO ICS and MIME email without saving. Check that:
- ICS has
BEGIN:VTODO - ICS has correct
PRIORITYvalue (1 for high) - ICS has
STATUS:NEEDS-ACTION - ICS has
BEGIN:VALARM - MIME has
Content-Type: text/calendar
$SKILL_DIR/scripts/calendar.sh todo add \
--summary "Test Todo" \
--due "$TEST_DATE" \
--priority high \
--dry-run
8. Live Add: Create a Todo
$SKILL_DIR/scripts/calendar.sh todo add \
--summary "Test Todo" \
--due "$TEST_DATE" \
--priority medium \
--description "Test description"
Verify:
- Script exits without error
.icsfile created in~/.openclaw/workspace/calendars/tasks/todo list(todoman directly) shows "Test Todo"- Email arrives at
mail@luyx.orgwith .ics attachment vdirsyncer syncran
9. List Todos
# Via our wrapper (formatted Chinese output)
$SKILL_DIR/scripts/calendar.sh todo list
# Via todoman directly (should show the same items)
todo list
# Include completed
$SKILL_DIR/scripts/calendar.sh todo list --all
Verify:
- "Test Todo" appears in both outputs
- Priority grouping is correct in wrapper output
--allflag works (same output when none are completed)
10. Complete a Todo
$SKILL_DIR/scripts/calendar.sh todo complete --match "Test Todo"
Verify:
todo list(todoman) — "Test Todo" no longer appears$SKILL_DIR/scripts/calendar.sh todo list— also gone$SKILL_DIR/scripts/calendar.sh todo list --all— appears as completed (with checkmark)vdirsyncer syncran
11. Delete a Todo
Create a second test todo, then delete it.
# Create
$SKILL_DIR/scripts/calendar.sh todo add \
--summary "Delete Me Todo" \
--due "$TEST_DATE" \
--priority low
# Confirm it appears
todo list
# Delete
$SKILL_DIR/scripts/calendar.sh todo delete --match "Delete Me"
Verify:
- .ics file removed from tasks dir
todo list(todoman) does not show "Delete Me Todo"vdirsyncer syncran
12. Todo Check (Cron Output)
# Create a test todo
$SKILL_DIR/scripts/calendar.sh todo add \
--summary "Check Test Todo" \
--due "$TEST_DATE"
# Run check
$SKILL_DIR/scripts/calendar.sh todo check
Verify:
- Output matches daily digest format (priority groups, urgency labels)
- Complete the todo, run
todo checkagain — silent exit (no output)
$SKILL_DIR/scripts/calendar.sh todo complete --match "Check Test"
$SKILL_DIR/scripts/calendar.sh todo check
# Should produce no output
13. Regression: Existing Invite Commands
Verify the rename didn't break VEVENT flow.
$SKILL_DIR/scripts/calendar.sh send \
--to "test@example.com" \
--subject "Regression Test" \
--summary "Regression Test Event" \
--start "${TEST_DATE}T10:00:00" \
--end "${TEST_DATE}T11:00:00" \
--dry-run
Verify:
- ICS has
BEGIN:VEVENT,METHOD:REQUEST - No errors from the renamed script
Quick Health Checks
Run these first if any step fails.
# icalendar library is available
uv run --project $SKILL_DIR python -c "import icalendar; print('ok')"
# himalaya can list emails
himalaya envelope list --page-size 5
# vdirsyncer can sync
vdirsyncer sync
# khal can read local calendar
khal list today 7d
# todoman can list todos
todo list
Common Failures
| Symptom | Likely Cause |
|---|---|
himalaya message send errors |
SMTP config issue, check ~/.config/himalaya/config.toml |
No .ics attachment found |
Email doesn't have a calendar invite, or himalaya can't download attachments |
vdirsyncer sync fails |
Check credentials in ~/.config/vdirsyncer/config, or server is unreachable |
ModuleNotFoundError: icalendar |
Run uv sync --project $SKILL_DIR to install dependencies |
| Invite shows as attachment (no Accept/Decline) | Check MIME Content-Type includes method=REQUEST |
Event not in khal list after sync |
Check .ics file exists in ~/.openclaw/workspace/calendars/home/ |
todo command not found |
Install with uv tool install todoman |
todo list errors |
Check ~/.config/todoman/config.py exists and path points to tasks dir |
| Todo not syncing | Check ~/.openclaw/workspace/calendars/tasks/ exists, verify vdirsyncer cal/tasks pair |