# Comprehensive QA Dimensions Checklist Use this checklist when the user asks for "full", "complete", or "comprehensive" QA testing. Each dimension should appear as a section in the test plan with at least 1 test case. ## Core Functional (always cover) - [ ] Page loads (HTTP 200) for all public pages - [ ] Navigation links work (header, footer, sidebar) - [ ] CRUD operations (create, read, update, delete) - [ ] Form submissions (valid data, empty data, invalid data) - [ ] Search/filter functionality - [ ] Pagination - [ ] Error pages (404, 500) ## Auth & Permissions - [ ] Login page loads and form works - [ ] Valid credentials → success + cookie set - [ ] Invalid credentials → error message - [ ] Logout clears cookie - [ ] Cross-service cookie propagation (shared domain cookies) - [ ] Admin pages: admin user can access - [ ] Admin pages: regular user gets denied - [ ] Admin pages: unauthenticated user redirects to login - [ ] RBAC: different roles see different features - [ ] Permission checks on API endpoints ## Input Validation - [ ] Empty form submissions (browser validation or server error) - [ ] Boundary values (min/max length, special chars) - [ ] Password strength requirements - [ ] Username format validation - [ ] Email format validation (if applicable) - [ ] Invite code validation (if invite-based registration) ## Security — Cookie - [ ] Auth cookie: HttpOnly=true - [ ] Auth cookie: Secure=true (production) - [ ] Auth cookie: SameSite=Lax or Strict - [ ] Auth cookie: Max-Age is reasonable (not infinite) - [ ] Auth cookie: Domain scope correct (e.g., `.example.com` for subdomains) - [ ] CSRF cookie: HttpOnly=false (by design, JS needs to read it) ## Security — CSRF - [ ] All state-changing POST endpoints require CSRF token - [ ] CSRF token matches between form field and cookie - [ ] CSRF token expires (check timestamp-based expiry) - [ ] Missing/invalid CSRF token returns 403 or error ## Security — Redirect - [ ] `redirect` parameter accepts valid same-domain URLs - [ ] `redirect` parameter rejects external domains (open redirect prevention) - [ ] `redirect` parameter rejects protocol-relative URLs (`//evil.com`) - [ ] Default redirect when parameter is empty/invalid ## Security — Rate Limiting - [ ] Login rate limit (e.g., 5/minute per IP) - [ ] Registration rate limit (e.g., 5/hour per IP) - [ ] API rate limits (comments, likes, uploads) - [ ] Account lockout after N failed attempts - [ ] IP-based lockout after N failed attempts - [ ] Rate limit returns 429 status ## Security — File Upload - [ ] Allowed file types enforced (extension check) - [ ] File size limit enforced - [ ] Filename sanitized (no path traversal) - [ ] Uploaded files stored safely (UUID names, outside web root or in controlled dir) - [ ] Image processing (resize, format conversion) doesn't crash on malformed files ## Security — Input Injection - [ ] XSS: user input rendered as text, not HTML (test ``) - [ ] Path traversal: slug validation prevents `../` sequences - [ ] SQL injection: parameterized queries (verify from source code) ## Session & Token - [ ] Token expiration: expired token redirects to login - [ ] Token format validation (reject malformed tokens) - [ ] Role changes: DB role takes precedence over token role - [ ] Token max-age from configuration ## Content & Rendering - [ ] Empty state (no content) shows appropriate message - [ ] Long content doesn't break layout - [ ] Special characters (CJK, emoji, HTML entities) render correctly - [ ] Markdown rendering (code blocks, tables, lists) - [ ] LaTeX/MathJax rendering (if applicable) - [ ] Code syntax highlighting (if applicable) ## Encoding - [ ] No BOM markers in HTML templates (`ef bb bf`) - [ ] No leading whitespace before `` - [ ] UTF-8 charset declared in meta tag - [ ] Python source files: no BOM ## SEO & Metadata - [ ] `