This file should adhere to Keep a Changelog, but it's manually maintained. Feel free to comment or make a pull request if something breaks for you.
This project should adhere to Semantic Versioning, though some earlier releases may be incompatible with the SemVer standard.
This release works with caldav 3.2 and higher.
- Lots of new test probing the scheduling features. Those requires multiple user accounts on the server. This can now be configured.
- Lots of new tests probing edge-cases wrg of date searching, open-ended searches, etc
This release has been predominantly coded with AI-assistance. The level of scrutiny done on this tool is a bit less than the level of scrutiny done on the caldav libary. Then again, I don't expect you to run this checker directly towards some calendars that are also used in production.
--name radicale(and other lowercase names) failed to find servers in the caldav test registry after the caldav library renamed its server entries to capitalised names (Radicale,Xandikos). The registry lookup is now case-insensitive.--nameregistry lookup silently returned nothing when the caldav-server-tester's owntests/package shadowed the caldav project'stests/test_serversinsys.modulesor via the CWD entry insys.path. The registry is now loaded viaimportlibusing the explicit file path, bypassingsys.pathresolution.
CheckSearchnow setssearch.combined-is-logical-andtoNonewhen category search is unsupported, preventing a spuriousAssertionErrorin the post-check consistency validation.run_checknow raisesAssertionError(instead of silently logging) when a check class fails to set all declaredfeatures_to_be_checkedor sets undeclared features.- Removed
tests/test_compat_xandikos.py(redundant with the integration tests in the caldav project'stestCheckCompatibility).
- Updated USAGE.md
--format textsection to reflect current multi-line output format and actual support-level values; addedunknownstatus- added guide for contributing a new server profile to
caldav/compatibility_hints.py - added guide for storing checker results in
~/.config/caldav/calendar.conf(named profile, inline features, and base+overrides patterns)
Considering this tool as "production ready" now - even though it's still lots of corner cases to be tested.
This release corresponds to version 3.0.2 of the caldav library. It's important to keep those two libraries in sync as the "feature list" is contained in the caldav library.
- Minimum required
caldavlibrary version bumped to 3.0.2. - Text report now labels extra check information with "Extra check information:" header (rationale: it was a bit confusing with two "descriptions" on one feature).
- Added
CONTRIBUTING.mdwith contribution guidelines - Conventional commit message enforcement via
conventional-pre-commitpre-commit hook - Link checker CI workflow
- Development status classifier updated to Production/Stable
Lots of changes have been done since v0.1.0. I'm not sure the changelog is complete, I didn't get time to do a proper QA on it. CalDAV version 3.0 is required.
This was sort of a pre-release of v1.0.0.
(Version 0.2.0/0.2.1 was never published due to problems with the auto-publish workflow)
-
--config-sectionCLI option: select a named section from the caldav config file (passed through toget_davclient) -
--namenow falls back to the caldav config file when the name is not found in the test server registry (instead of raising an error) -
Text report now shows the feature description (from
compatibility_hints.py) below each feature line -
YAML output format (
--format yaml) -
Hints output format (
--format hints): outputs observed features as a Python dict literal suitable for pasting intocompatibility_hints.py -
--diffflag: show diff between configured (expected) and observed features in the report -
--no-cleanupflag: skip test data removal after a run -
--skip-confirmation/--yes/-yflag to suppress interactive prompts for external servers -
report()now acceptsshow_diff=Trueandreturn_what="yaml"/"hints" -
Expanded search feature coverage with new feature flags:
search.text- Basic text/summary searchsearch.text.case-sensitive- Case-sensitive text matching (default behavior)search.text.case-insensitive- Case-insensitive text matching via CalDAVSearchersearch.text.substring- Substring matching for text searchessearch.is-not-defined- Property filter with is-not-defined operatorsearch.text.category- Category search supportsearch.text.category.substring- Substring matching for category searches
-
post_filter=Falseparameter to all server behavior tests to ensure testing actual server responses -
New
CheckSyncTokencheck class for RFC6578 sync-collection reports:- Tests for sync token support (full/fragile/unsupported)
- Detects time-based sync tokens (second-precision, requires sleep(1) between operations)
- Detects fragile sync tokens (occasionally returns extra content due to race conditions)
- Tests sync-collection reports after object deletion
-
New
CheckAlarmSearchcheck class for alarm time-range searches (RFC4791 section 9.9):- Tests if server supports searching for events based on when their alarms trigger
- Verifies correct filtering of alarm times vs event times
-
New
CheckPrincipalSearchcheck class for principal search operations:- Tests basic principal access
- Tests searching for own principal by display name (
principal-search.by-name.self) - Tests listing all principals (
principal-search.list-all) - Note: Full
principal-search.by-nametesting requires multiple users and is not yet implemented
-
New
CheckDuplicateUIDcheck class for duplicate UID handling:- Tests if server allows events with same UID in different calendars (
save.duplicate-uid.cross-calendar) - Detects if duplicates are silently ignored or rejected with errors
- Verifies events are treated as separate entities when allowed
- Tests if server allows events with same UID in different calendars (
- Improved
search.comp-type.optionaltest with additional text search validation
create-calendarfeature detection to not incorrectly mark mkcol method as standard calendar creation- CLI no longer calls
cleanup()twice (it was called inside_run_checks_againstand again by the caller) - CLI now cleans up by default (
force=True) instead of silently skipping cleanup unless the server was explicitly configured for it cleanup()no longer raisesAttributeErrorwhenPrepareCalendarwas never run- Removed "Not fully implemented yet - TODO" placeholder from the JSON/dict report output
- Fixed broken
missing_keys/parent_keyslogic inCheck.run_check()— declared-feature invariants are now actually enforced, withlogging.errorinstead of a trivially-passing assert - Fixed wrong variable in
CheckRecurrenceSearch:infinite-scopefeature now correctly usesfar_future_recurrenceinstead ofevents - Fixed global monkey-patch of
Calendar.searchso the delay value is stored as a class attribute and updated on eachServerQuirkCheckerconstruction - Cleanup now deletes all
csc_*objects as a fallback when calendar deletion is not supported (not just the hardcoded UID list) - Fixed missing
set_feature("search.is-not-defined.class", ...)call inCheckIsNotDefined - Replaced bare
except:withexcept Exception:throughout to avoid silently swallowingSystemExit/KeyboardInterrupt - Replaced production
assertstatements withlogging.error/raiseso they are not silenced bypython -O - Fixed double
_compute_diff()call when formatting as plain text with--diff - Fixed typo: "Fature support level found" → "Feature support level found"
- Fixed
type(foo) == dateto useisinstancewith correct datetime-exclusion semantics in_filter_2000 - Decomposed 415-line
PrepareCalendar._run_checkinto focused helper methods
This release corresponds with the caldav version 2.1.2
This is the first release, so I shouldn't need to list up changes since the previous release.
This project was initiated in 2023, it was forgotten, I started working a bit on it inside the caldav library in 2024, moved the work into this project in May 2025, and at some point I decided to throw all of the old work away, and start from scratch - to grow the project it's needed with a less chaotic and more organized approach. I was very close to making a dual release of the caldav library and the caldav-server-tester library just before the summer vacation started, but didn't manage - and then for half a year things were continously happening in my life preventing me to focus on the caldav project. So this is a very much overdue release.