# Manual Testing Checklist Living document. Each phase appends its own section — do not delete older sections when the code behind them changes; mark items as superseded instead so the audit trail stays intact. Run the site locally before walking through the list: ```bash source venv/bin/activate uvicorn app.main:app --reload ``` Then open `http://127.0.0.1:8000/` in a real browser (not just curl). --- ## Phase 1 — Public Site Skeleton ### Home (`/`) - [ ] Page returns 200 and renders without console errors. - [ ] Header shows the Chicken Babies R Us logo at ~48px tall. - [ ] `` `alt` attribute reads **Chicken Babies R Us**. - [ ] Nav items appear in order: Home · About · Contact · Shop. - [ ] "Home" is visibly the active nav link and carries `aria-current="page"`. - [ ] "Shop" nav link is visually muted (lower contrast) but still clickable. - [ ] Page intro ("Welcome to Chicken Babies R Us") is present. - [ ] With no posts in the DB, the empty-state reads **"No posts yet — check back soon!"**. - [ ] Footer shows "Chicken Babies R Us · Morrison, Tennessee". - [ ] No street address is visible anywhere on the page (CLAUDE.md constraint). ### About (`/about`) - [ ] Page returns 200 and renders without console errors. - [ ] H1 reads **"About the farm"**. - [ ] Copy mentions Morrison, Tennessee by name. - [ ] Copy name-checks Head Hen. - [ ] No street address appears anywhere. - [ ] Nav marks "About" as active (`aria-current="page"`). ### Contact (`/contact`) - [ ] Page returns 200 and renders without console errors. - [ ] H1 reads **"Get in touch"**. - [ ] When `ADMIN_CONTACT_EMAIL` is set, a `mailto:` link renders above the form. - [ ] When `ADMIN_CONTACT_EMAIL` is unset, the muted placeholder sentence appears and no `mailto:` link renders. - [ ] The note **"Secure contact form coming soon"** is visible. - [ ] Form fields (name, email, message) are visually disabled and cannot be typed into. - [ ] "Send message" button is visually disabled. - [ ] Form has no `method="POST"` attribute (view source). - [ ] Nav marks "Contact" as active. ### Shop (`/shop`) - [ ] Page returns 200 and renders without console errors. - [ ] H1 reads **"Shop"**. - [ ] "Coming soon" card is visible with mention of eggs, chicks, and waterfowl. - [ ] Nav marks "Shop" as active. ### Responsive Use the browser devtools responsive toolbar. - [ ] **360 × 800 (mobile):** nav collapses behind a hamburger toggle; toggle opens/closes on click; logo remains legible; no horizontal scroll. - [ ] **768 × 1024 (tablet):** nav appears inline; layout uses full container width; no horizontal scroll. - [ ] **1280 × 800 (desktop):** content capped at `--max-width` (68rem ≈ 1088px); generous whitespace either side. ### Accessibility - [ ] Tab-key order from top of page: skip link → logo → nav links → main content. - [ ] Pressing **Tab** from a cold page load reveals the skip link in the top-left corner. - [ ] Activating the skip link jumps focus into `
`. - [ ] Logo has a non-empty `alt` attribute ("Chicken Babies R Us"). - [ ] Navigating with a screen reader announces each landmark (`header`, `nav`, `main`, `footer`). - [ ] Spot-check color contrast of `--c-ink` (#2B3A42) on `--c-cream` (#FAF3E7) — should be comfortably above WCAG AA for body text. ### Assets - [ ] `/static/img/logo.png` loads and is roughly 256px tall. - [ ] `/static/img/logo.webp` loads with content-type `image/webp`. - [ ] `/static/img/favicon.ico` is requested by the browser and returns 200. - [ ] `/static/img/apple-touch-icon.png` is 180×180 and has a cream (#FAF3E7) background. ### Ops smoke - [ ] `pytest -q` passes locally. - [ ] `python -c "from app.main import app"` exits cleanly. - [ ] `python scripts/generate_static_assets.py` regenerates the four asset files without error. - [ ] `docker compose config` still parses cleanly.