# QA Checklist - SchoolCompare Next.js Migration

## Functionality Testing

### Home Page
- [ ] Page loads with SSR (view source shows rendered HTML)
- [ ] Featured schools display correctly
- [ ] Search by school name filters results
- [ ] Search by postcode finds nearby schools
- [ ] Radius filter works with postcode search
- [ ] Local authority filter updates results
- [ ] School type filter updates results
- [ ] Pagination works correctly
- [ ] "Add to Compare" button adds schools to basket
- [ ] Comparison badge shows correct count
- [ ] School cards display all information (name, type, location, metrics)
- [ ] Trend indicators show correct direction (↗ ↘ →)
- [ ] Links to school detail pages work
- [ ] Empty state shows when no results

### Individual School Pages
- [ ] School detail page loads with SSR
- [ ] URL format: `/school/{urn}` works
- [ ] School name and meta information display
- [ ] Latest results summary shows correctly
- [ ] Performance chart displays multi-year data
- [ ] All metrics sections render (Reading, Writing, Maths)
- [ ] Absence data shows if available
- [ ] Map displays school location
- [ ] Historical data table shows all years
- [ ] "Add to Compare" button works
- [ ] "In Comparison" state shows when already added
- [ ] Meta tags are correct (check view source)
- [ ] JSON-LD structured data validates
- [ ] 404 page shows for invalid URN

### Compare Page
- [ ] Compare page loads with SSR
- [ ] URL format: `/compare?urns=...` works
- [ ] Selected schools load from URL
- [ ] Schools display in comparison grid
- [ ] Metric selector changes chart
- [ ] Performance chart displays all schools
- [ ] Comparison table shows correct values
- [ ] "Remove" button removes school from comparison
- [ ] "+ Add School" opens search modal
- [ ] School search modal works
- [ ] Maximum 5 schools enforced
- [ ] URL updates when schools added/removed
- [ ] Empty state shows when no schools selected
- [ ] Comparison persists in localStorage
- [ ] Sharing URL loads same comparison

### Rankings Page
- [ ] Rankings page loads with SSR
- [ ] Default metric displays (RWM Expected)
- [ ] Metric selector updates rankings
- [ ] Area filter updates rankings
- [ ] Year filter updates rankings
- [ ] Rankings display in correct order
- [ ] Top 3 schools have special styling (medals)
- [ ] "Add to Compare" button works
- [ ] School links navigate to detail pages
- [ ] Rankings table is responsive

### Navigation & Layout
- [ ] Navigation bar displays correctly
- [ ] Active page is highlighted in nav
- [ ] Comparison badge updates in real-time
- [ ] Footer displays correctly
- [ ] Logo links to home page
- [ ] Mobile menu works (if applicable)

## Cross-Browser Testing

### Desktop Browsers
- [ ] Chrome (latest)
- [ ] Firefox (latest)
- [ ] Safari (latest)
- [ ] Edge (latest)

### Mobile Browsers
- [ ] iOS Safari
- [ ] Android Chrome
- [ ] Samsung Internet

## Responsive Design

### Breakpoints
- [ ] Desktop (1280px+): Full layout
- [ ] Tablet (768px-1279px): Adjusted layout
- [ ] Mobile (<768px): Stacked layout

### Components
- [ ] School cards adapt to screen size
- [ ] Charts are responsive
- [ ] Maps are responsive
- [ ] Tables scroll horizontally on mobile
- [ ] Navigation adapts to mobile
- [ ] Filters stack on mobile

## Performance Testing

### Lighthouse Scores (Target: 90+)
- [ ] Performance: ____
- [ ] Accessibility: ____
- [ ] Best Practices: ____
- [ ] SEO: ____

### Core Web Vitals
- [ ] LCP (Largest Contentful Paint): < 2.5s
- [ ] FID (First Input Delay): < 100ms
- [ ] CLS (Cumulative Layout Shift): < 0.1

### Load Times
- [ ] Home page: < 2s
- [ ] School detail page: < 2s
- [ ] Compare page: < 2s
- [ ] Rankings page: < 2s

## SEO Testing

- [ ] Sitemap generates correctly (`/sitemap.xml`)
- [ ] Robots.txt accessible (`/robots.txt`)
- [ ] Meta titles are unique per page
- [ ] Meta descriptions are descriptive
- [ ] Open Graph tags present
- [ ] Twitter Card tags present
- [ ] Canonical URLs set correctly
- [ ] JSON-LD structured data validates (use Google Rich Results Test)
- [ ] School pages indexed in Google (post-launch)

## Accessibility Testing

### WCAG 2.1 AA Compliance
- [ ] Keyboard navigation works
- [ ] Focus indicators visible
- [ ] Color contrast ratios meet standards
- [ ] Alt text on images (if any)
- [ ] ARIA labels on interactive elements
- [ ] Form labels present
- [ ] Headings in logical order
- [ ] No accessibility errors in axe DevTools
- [ ] No accessibility errors in WAVE

### Screen Reader Testing
- [ ] Page structure makes sense
- [ ] All interactive elements announced
- [ ] Navigation is clear

## Data Integration Testing

### API Integration
- [ ] All API endpoints respond correctly
- [ ] Error handling works (try invalid URN)
- [ ] Loading states display
- [ ] Data formats correctly
- [ ] Caching works (check Network tab)

### Edge Cases
- [ ] Schools with null data values display "-"
- [ ] Schools with no yearly data handled
- [ ] Schools with no location don't break map
- [ ] Empty search results show empty state
- [ ] Invalid postcode shows error

## Security Testing

- [ ] HTTPS enabled (production)
- [ ] Security headers present (X-Frame-Options, etc.)
- [ ] No API keys exposed in client code
- [ ] CORS configured correctly
- [ ] XSS prevention (try injecting scripts)
- [ ] No console errors or warnings

## State Management Testing

### URL State
- [ ] Filter changes update URL
- [ ] Browser back/forward buttons work
- [ ] Sharing URLs preserves state
- [ ] Page refresh preserves filters

### LocalStorage
- [ ] Comparison basket persists across sessions
- [ ] Invalid data in localStorage handled gracefully

## Error Handling

- [ ] 404 page displays for invalid routes
- [ ] API errors show user-friendly messages
- [ ] Network errors handled gracefully
- [ ] Invalid data doesn't crash app
- [ ] Error boundaries catch React errors

## Integration Testing

### User Flows
- [ ] **Flow 1**: Search → View School → Add to Compare → Go to Compare Page
- [ ] **Flow 2**: Browse Home → Add Multiple Schools → Compare → Remove School
- [ ] **Flow 3**: View Rankings → Click School → View Details → Add to Compare
- [ ] **Flow 4**: Search by Postcode → View Map → Click School → View Details
- [ ] **Flow 5**: Filter by Area & Type → View Results → Paginate

## Build & Deployment Testing

- [ ] `npm run build` succeeds without errors
- [ ] `npm run lint` passes
- [ ] `npm test` passes
- [ ] Production build runs correctly
- [ ] Docker image builds successfully (if using Docker)
- [ ] Environment variables load correctly

## Documentation Review

- [ ] README.md is complete and accurate
- [ ] DEPLOYMENT.md covers all deployment options
- [ ] Environment variables documented
- [ ] API integration documented

## Final Checks

- [ ] All console errors resolved
- [ ] All console warnings reviewed
- [ ] No TODO comments in production code
- [ ] Version numbers updated
- [ ] Change log updated (if applicable)
- [ ] Git repository clean
- [ ] All tests passing

---

## Sign-Off

| Role | Name | Date | Signature |
|------|------|------|-----------|
| Developer | | | |
| QA Lead | | | |
| Product Owner | | | |
| Tech Lead | | | |

---

## Notes

Add any additional notes or issues discovered during QA:

_______________________________________________
_______________________________________________
_______________________________________________
_______________________________________________
