Ship base Jinja layout (header/nav/main/footer with skip link and aria-current), mobile-first single-file CSS using the ROADMAP palette tokens, and four public routes: /, /about, /contact, /shop. Blog index renders via a stable PostService.list_published() stub returning [] — Phase 2 only swaps the body. About is static placeholder copy, /contact ships an inert form plus a mailto: link driven by ADMIN_CONTACT_EMAIL, /shop shows a "Coming soon" card. Adds a Pillow-based scripts/generate_static_assets.py producing resized logo PNG + WebP, multi-size favicon.ico, and a 180x180 apple-touch-icon on a cream background. Outputs committed for a reproducible build. Also ship docs/MANUAL_TESTING.md with per-route / responsive / a11y / static- asset checklists, and mark Phase 1 complete in docs/ROADMAP.md.
3.8 KiB
3.8 KiB
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:
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.
<img>altattribute 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_EMAILis set, amailto:link renders above the form. - When
ADMIN_CONTACT_EMAILis unset, the muted placeholder sentence appears and nomailto: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
<main>. - Logo has a non-empty
altattribute ("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.pngloads and is roughly 256px tall./static/img/logo.webploads with content-typeimage/webp./static/img/favicon.icois requested by the browser and returns 200./static/img/apple-touch-icon.pngis 180×180 and has a cream (#FAF3E7) background.
Ops smoke
pytest -qpasses locally.python -c "from app.main import app"exits cleanly.python scripts/generate_static_assets.pyregenerates the four asset files without error.docker compose configstill parses cleanly.