- Next.js 16 App Router project with Tailwind CSS - Plant disease knowledge base (93 diseases, 25 plants) - Image upload with client+server preprocessing - ML inference pipeline with mock/demo fallback - Responsive results page with disease cards and treatment - Full test suite (285 passing tests)
135 lines
6.4 KiB
Markdown
135 lines
6.4 KiB
Markdown
# 07. Test Suite, Vercel Deployment Config, and CI Pipeline
|
|
|
|
meta:
|
|
id: hyper-specific-plant-disease-id-07
|
|
feature: hyper-specific-plant-disease-id
|
|
priority: P2
|
|
depends_on: [hyper-specific-plant-disease-id-02, hyper-specific-plant-disease-id-05, hyper-specific-plant-disease-id-06]
|
|
tags: [testing, deployment, ci, qa]
|
|
|
|
objective:
|
|
- Write comprehensive unit and integration tests for all modules, configure Vercel deployment with proper environment variables and build settings, and set up a GitHub Actions CI pipeline that runs on every push.
|
|
|
|
deliverables:
|
|
- `__tests__/` — organized test directory mirroring source structure
|
|
- `jest.config.ts` — Jest configuration for Next.js with `@testing-library/react`
|
|
- `__tests__/lib/api/diseases.test.ts` — knowledge base query tests
|
|
- `__tests__/lib/image-processing.test.ts` — resize and tensor conversion tests
|
|
- `__tests__/lib/ml/inference.test.ts` — softmax, confidence calibration, label mapping tests
|
|
- `__tests__/components/ImageUpload.test.tsx` — upload component interaction tests
|
|
- `__tests__/components/DiseaseCard.test.tsx` — card expand/collapse and rendering tests
|
|
- `__tests__/components/ConfidenceBadge.test.tsx` — badge color/label tests
|
|
- `__tests__/components/Navbar.test.tsx` — navigation and mobile menu tests
|
|
- `__tests__/components/SymptomChecker.test.tsx` — checklist interaction tests
|
|
- `__tests__/pages/homepage.test.tsx` — homepage render and element presence
|
|
- `__tests__/pages/browse.test.tsx` — browse page render and search filter
|
|
- `__tests__/pages/results.test.tsx` — results page with mock API data
|
|
- `__tests__/api/health.test.ts` — health endpoint integration test
|
|
- `__tests__/api/plants.test.ts` — plants API endpoint tests
|
|
- `__tests__/api/diseases.test.ts` — diseases API endpoint tests
|
|
- `__tests__/api/upload.test.ts` — upload endpoint with mock file
|
|
- `__tests__/api/identify.test.ts` — identify endpoint integration test
|
|
- `.github/workflows/ci.yml` — CI pipeline: lint → test → build
|
|
- `next.config.js` — final configuration for Vercel deployment
|
|
- `vercel.json` — deployment config (framework, rewrites, headers, regions)
|
|
|
|
steps:
|
|
1. Initialize Jest with `jest.config.ts`:
|
|
- Use `next/jest` preset.
|
|
- Configure `@testing-library/react` and `@testing-library/jest-dom`.
|
|
- Set up `jest.setup.ts` for global mocks (fetch, canvas, File, etc.).
|
|
2. Write unit tests for all lib modules:
|
|
- **Knowledge base queries:** search by plant, search by disease, search by text, 404 handling.
|
|
- **Image processing:** resize maintains aspect ratio, tensor shape is correct, normalization range is [0,1].
|
|
- **ML inference:** softmax sums to 1, top-5 extraction, confidence thresholds.
|
|
3. Write component tests using `@testing-library/react`:
|
|
- `ImageUpload`: simulate drag/drop, file selection, validation errors, upload progress.
|
|
- `DiseaseCard`: click expands/collapses, content renders.
|
|
- `ConfidenceBadge`: correct color for each confidence level.
|
|
- `SymptomChecker`: toggle checkboxes updates counter.
|
|
- `Navbar`: links render, mobile menu toggles.
|
|
- `LoadingSkeleton`: renders correct variant and count.
|
|
- `ErrorBoundary`: catches error and renders fallback.
|
|
4. Write integration tests for API routes:
|
|
- Use `next-test-api-route-handler` or Jest with Vercel's test helpers.
|
|
- Test each endpoint with valid and invalid inputs.
|
|
- Test response status codes and body shapes.
|
|
- Test error paths (404, 400, 413, 500).
|
|
5. Write page integration tests:
|
|
- Homepage renders hero, upload CTA, featured plants.
|
|
- Browse page renders plant grid, search filters work.
|
|
- Results page renders with mock prediction data.
|
|
- 404 page shows for unknown routes.
|
|
6. Create `.github/workflows/ci.yml`:
|
|
```yaml
|
|
name: CI
|
|
on: [push, pull_request]
|
|
jobs:
|
|
ci:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
- uses: actions/setup-node@v4
|
|
with: { node-version: 20 }
|
|
- run: npm ci
|
|
- run: npm run lint
|
|
- run: npm run test -- --coverage
|
|
- run: npm run build
|
|
```
|
|
7. Finalize `next.config.js`:
|
|
- Enable SWC minification.
|
|
- Configure `images.remotePatterns` if using external plant photos.
|
|
- Set `experimental.serverActions` for any server actions.
|
|
- Add security headers (CSP, X-Frame-Options, etc.).
|
|
8. Update `vercel.json`:
|
|
```json
|
|
{
|
|
"framework": "nextjs",
|
|
"regions": ["iad1"],
|
|
"headers": [
|
|
{ "source": "/(.*)", "headers": [
|
|
{ "key": "X-Content-Type-Options", "value": "nosniff" },
|
|
{ "key": "X-Frame-Options", "value": "DENY" },
|
|
{ "key": "Referrer-Policy", "value": "strict-origin-when-cross-origin" }
|
|
]}
|
|
],
|
|
"functions": {
|
|
"api/identify/route.ts": { "memory": 1024, "maxDuration": 30 }
|
|
}
|
|
}
|
|
```
|
|
9. Add `.env.production` template with production values.
|
|
10. Run full test suite and ensure 100% pass rate.
|
|
11. Perform a dry-run Vercel deploy (`vercel --prod --dry-run`) to validate config.
|
|
|
|
tests:
|
|
- **All the test files listed in deliverables above** — each must pass.
|
|
- **Code coverage:** ≥80% line coverage across lib/, components/, and API routes.
|
|
- **Lint:** ESLint passes with zero errors.
|
|
- **Build:** `next build` completes with zero warnings (or documented exceptions).
|
|
|
|
acceptance_criteria:
|
|
- `npm test` passes all tests (unit + integration + component).
|
|
- `npm run build` completes successfully.
|
|
- GitHub Actions CI runs and passes on every push.
|
|
- Vercel preview deployment succeeds.
|
|
- Code coverage report shows ≥80% across all modules.
|
|
- All API endpoints tested for both happy and error paths.
|
|
- Security headers present in Vercel response.
|
|
|
|
validation:
|
|
```bash
|
|
npm run lint # → No errors
|
|
npm run test # → All tests passing, coverage report generated
|
|
npm run build # → ✓ Compiled successfully
|
|
# CI: push to GitHub → Actions tab shows green checkmark
|
|
# Vercel: vercel --prod → deployment URL loads homepage
|
|
```
|
|
|
|
notes:
|
|
- Use `jest-canvas-mock` for canvas-dependent tests (image processing).
|
|
- Use `next-test-api-route-handler` for API route integration tests without running a full server.
|
|
- For ML inference tests, mock the model loading and return deterministic fake predictions.
|
|
- If Vercel Hobby plan's 10s function timeout is too restrictive for the identify endpoint, consider upgrading or using a Vercel Serverless Function with increased limits.
|
|
- Add a `test-assets/` directory with small sample plant images used across tests.
|