Coverage for tests/test_vehicles.py: 100%
47 statements
« prev ^ index » next coverage.py v7.14.1, created at 2026-05-31 21:56 +0000
« prev ^ index » next coverage.py v7.14.1, created at 2026-05-31 21:56 +0000
1import pytest
2from unittest.mock import MagicMock
4@pytest.mark.asyncio
5async def test_health_check(async_client):
6 response = await async_client.get("/health")
7 assert response.status_code == 200
8 assert response.json() == {"status": "ok"}
10@pytest.mark.asyncio
11async def test_get_vehicle_found(async_client, mock_db_session):
12 # Mock the database result
13 mock_db_session.fetchone.return_value = (
14 "AB12CDE", "VOLKSWAGEN", "GOLF", 2013, "BLACK", "2024-10-15", 1
15 )
16 mock_db_session.description = [
17 ("vrm",), ("make",), ("model",), ("year",),
18 ("color",), ("mot_expiry",), ("generation_id",)
19 ]
21 # In duckdb, execute returns self, so we can mock execute to return the session itself
22 mock_db_session.execute.return_value = mock_db_session
24 response = await async_client.get("/api/v1/vehicles/AB12CDE")
26 assert response.status_code == 200
27 data = response.json()
28 assert data["vrm"] == "AB12CDE"
29 assert data["make"] == "VOLKSWAGEN"
30 assert "Cache-Control" in response.headers
32@pytest.mark.asyncio
33async def test_get_vehicle_not_found(async_client, mock_db_session):
34 mock_db_session.fetchone.return_value = None
35 mock_db_session.execute.return_value = mock_db_session
37 response = await async_client.get("/api/v1/vehicles/UNKNOWN")
39 assert response.status_code == 404
40 assert response.json()["detail"] == "Vehicle not found"
42@pytest.mark.asyncio
43async def test_get_mot_history_found(async_client, mock_db_session):
44 # Mock the duckdb list/struct result
45 mock_db_session.fetchall.return_value = [
46 (
47 12345, "2023-10-10", "FAIL", 85000, "mi",
48 [
49 {"item_type": "MAJOR", "description": "Brakes significantly worn", "pos_code": None},
50 {"item_type": "ADVISORY", "description": "Tyre worn close to legal limit", "pos_code": None}
51 ]
52 ),
53 (
54 12344, "2022-10-10", "PASS", 75000, "mi",
55 [] # Empty list for items if no defects
56 )
57 ]
58 mock_db_session.description = [
59 ("test_number",), ("test_date",), ("result",),
60 ("odometer_reading",), ("odometer_unit",), ("items",)
61 ]
62 mock_db_session.execute.return_value = mock_db_session
64 response = await async_client.get("/api/v1/vehicles/AB12CDE/mot-history")
66 assert response.status_code == 200
67 data = response.json()
68 assert data["vrm"] == "AB12CDE"
69 assert len(data["tests"]) == 2
71 first_test = data["tests"][0]
72 assert first_test["test_number"] == "12345"
73 assert first_test["result"] == "FAIL"
74 assert len(first_test["items"]) == 2
75 assert first_test["items"][0]["item_type"] == "MAJOR"
77@pytest.mark.asyncio
78async def test_get_mot_history_not_found(async_client, mock_db_session):
79 mock_db_session.fetchall.return_value = []
80 mock_db_session.execute.return_value = mock_db_session
82 response = await async_client.get("/api/v1/vehicles/UNKNOWN/mot-history")
84 assert response.status_code == 404
85 assert response.json()["detail"] == "MOT history not found for this vehicle"