== Renderer output == PASS preview is a PNG PASS preview is exactly 1200x630 PASS preview starts with PNG signature PASS fallback is a PNG 1200x630 PASS degraded (no-freetype) render is a PNG 1200x630 PASS committed static fallback asset exists and is 1200x630 == Preview cache key == PASS preview key varies by month PASS preview key varies by ICS fingerprint PASS preview key varies with the summaries setting == Image version tag and validation == PASS version tag is -r-s PASS version tag is bounded + URL-safe PASS summaries OFF tag ends -s0 PASS summaries ON tag ends -s1 PASS privacy state changes the version tag PASS same content + same privacy → same tag PASS different content → different version tag PASS renderer version is part of the tag PASS no-fingerprint fallback tag includes renderer + privacy PASS no-fingerprint fallback reflects summaries on PASS valid v (with -s) accepted PASS oversized v ignored safely (returns null) PASS malformed v ignored safely (returns null) PASS null v ignored cleanly == Summary privacy default == PASS summaries are OFF by default PASS summaries enabled by '1' PASS summaries enabled by 'true' PASS summaries enabled by 'yes' PASS summaries enabled by 'on' PASS summaries enabled by 'TRUE' PASS summaries enabled by 'On' PASS summaries disabled by '0' PASS summaries disabled by 'false' PASS summaries disabled by 'no' PASS summaries disabled by 'off' PASS summaries disabled by '(empty)' PASS summaries-off render is a 1200x630 PNG PASS summaries-on render is a 1200x630 PNG == Fetcher + endpoint (live loopback server) == PASS test server is up PASS fetch success returns ICS PASS redirect is rejected (upstream, not followed) PASS oversized response rejected (too_large) PASS upstream 404 maps to not_found PASS non-ICS body maps to invalid_ics PASS http rejected when HTTPS required PASS endpoint returns 200 PASS endpoint Content-Type is image/png PASS endpoint body is 1200x630 PNG PASS endpoint body contains no HTML error text PASS malformed request returns 400 PASS malformed request still returns a 1200x630 PNG PASS malformed response leaks no internal text PASS revoked calendar returns 404 PASS revoked calendar still returns a PNG PASS endpoint sends an ETag PASS matching If-None-Match returns 304 PASS success sends X-Calee-Preview-State: ok PASS malformed request → 400 + invalid-request state PASS revoked calendar → 404 + not-found state PASS too-large calendar → 200 PNG fallback PASS too-large calendar → calendar-too-large state (no internal leak) PASS too-large fallback leaks no internal detail PASS valid v param → 200 PNG PASS array-valued v → 200 PNG (no TypeError) PASS oversized v → 200 PNG (rejected cleanly, ignored) PASS no v (backward compatible) → 200 PNG == GD-absent status contract (forced) == PASS GD-absent test server is up PASS GD-absent revoked token → 404 PNG (contract preserved) PASS GD-absent malformed token → 400 PNG PASS GD-absent valid calendar → 200 PNG PASS GD-absent valid calendar → 1200x630 static PNG PASS GD-absent valid calendar → gd-unavailable state All calendar-preview self-tests passed.