Good. Here's the complete audit.

---

## Audit: Chart/Figure Generation Test Coverage

### Overview

I found **22 `generate_*_figure()` / `generate_*_figures()` methods** across 18 service files under `flask_planhead/app/services/`. Below is the service-by-service breakdown.

---

### ✅ Fully Covered (tested directly in corresponding test file)

| Service | Methods | Test File | Status |
|---|---|---|---|
| `dashboard_service.py` | `generate_scenario_figure`, `generate_monthly_category_flow_figure`, `generate_monthly_income_expense_figure`, `generate_priority_expense_pie_figure` | `test_dashboard_service.py` | ✅ 4 calls each |
| `freezer_service.py` | `generate_comparison_figure` | `test_freezer_service.py` | ✅ 2 calls (line 47) |
| `reading_service.py` | `generate_reading_figure` | `test_reading_service.py` | ✅ 2 calls (line 33) |
| `washing_machine_service.py` | `generate_comparison_figure` | `test_washing_machine_service.py` | ✅ 2 calls (line 53) |

Note: `dashboard_service.generate_depot_figure` is **not directly tested** in `test_dashboard_service.py` (0 hits), but the dashboard tests cover the other 4 methods thoroughly. The route tests in `test_routes.py` mock all 5 dashboard figure methods but don't test them directly.

---

### ⚠️ Untested — Test file exists but figure method has zero coverage

| Service | Methods | Test File | Problem |
|---|---|---|---|
| `caffeine_service.py` | `generate_decay_figure` | `test_caffeine_service.py` | ❌ 0 calls |
| `calorie_service.py` | `generate_comparison_figure` | `test_calorie_service.py` | ❌ 0 calls |
| `coffee_service.py` | `generate_comparison_figures` | `test_coffee_service.py` | ❌ 0 calls |
| `inflation_service.py` | `generate_inflation_figure` | `test_inflation_service.py` | ❌ 0 calls |
| `kettle_service.py` | `generate_waste_figure` | `test_kettle_service.py` | ❌ 0 calls |
| `oven_service.py` | `generate_comparison_figure` | `test_oven_service.py` | ❌ 0 calls |
| `pc_service.py` | `generate_comparison_figure` | `test_pc_service.py` | ❌ 0 calls |
| `stove_service.py` | `generate_comparison_figure` | `test_stove_service.py` | ❌ 0 calls |
| `tv_service.py` | `generate_comparison_figure` | `test_tv_service.py` | ❌ 0 calls |

---

### ❌ Missing Entirely — No test file exists for the service

| Service | Methods | Missing Test File |
|---|---|---|
| `car_service.py` | `generate_comparison_figure` | `test_car_service.py` — **does not exist** |
| `dishwasher_service.py` | `generate_comparison_figure` | `test_dishwasher_service.py` — **does not exist** |
| `dryer_service.py` | `generate_comparison_figure` | `test_dryer_service.py` — **does not exist** |
| `fitness_service.py` | `generate_comparison_figures` | `test_fitness_service.py` — **does not exist** |
| `lighting_service.py` | `generate_comparison_figure` | `test_lighting_service.py` — **does not exist** |

---

### Summary Statistics

| Category | Count |
|---|---|
| Total figure methods across all services | **22** |
| Directly tested (≥1 assertion calling the method) | **6** (27%) |
| Method exists but untested in existing test file | **9** (41%) |
| No test file exists at all | **5** (23%) |
| Mocked in route tests only (no direct unit test) | **2** (`depot_figure` is untested; `scenario_figure` is tested in dashboard tests) |

---

### Recommendations (priority order)

1. **Create missing test files** (highest priority — whole services are uncovered):
   - **`tests/test_car_service.py`** — test `car_service.generate_comparison_figure()`
   - **`tests/test_dishwasher_service.py`** — test `dishwasher_service.generate_comparison_figure()`
   - **`tests/test_dryer_service.py`** — test `dryer_service.generate_comparison_figure()`
   - **`tests/test_fitness_service.py`** — test `fitness_service.generate_comparison_figures()`
   - **`tests/test_lighting_service.py`** — test `lighting_service.generate_comparison_figure()`

2. **Extend existing test files** (medium priority — services exist but figure methods are skipped):
   - **`tests/test_caffeine_service.py`** — add test for `generate_decay_figure`
   - **`tests/test_calorie_service.py`** — add test for `generate_comparison_figure`
   - **`tests/test_coffee_service.py`** — add test for `generate_comparison_figures`
   - **`tests/test_inflation_service.py`** — add test for `generate_inflation_figure`
   - **`tests/test_kettle_service.py`** — add test for `generate_waste_figure`
   - **`tests/test_oven_service.py`** — add test for `generate_comparison_figure`
   - **`tests/test_pc_service.py`** — add test for `generate_comparison_figure`
   - **`tests/test_stove_service.py`** — add test for `generate_comparison_figure`
   - **`tests/test_tv_service.py`** — add test for `generate_comparison_figure`

3. **Cover `generate_depot_figure`** (lower priority — route-level mock exists, but no unit test):
   - **`tests/test_dashboard_service.py`** — add test for `generate_depot_figure` (the only untested dashboard figure method)
