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

1import pytest 

2from unittest.mock import MagicMock 

3 

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"} 

9 

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 ] 

20 

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 

23 

24 response = await async_client.get("/api/v1/vehicles/AB12CDE") 

25 

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 

31 

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 

36 

37 response = await async_client.get("/api/v1/vehicles/UNKNOWN") 

38 

39 assert response.status_code == 404 

40 assert response.json()["detail"] == "Vehicle not found" 

41 

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 

63 

64 response = await async_client.get("/api/v1/vehicles/AB12CDE/mot-history") 

65 

66 assert response.status_code == 200 

67 data = response.json() 

68 assert data["vrm"] == "AB12CDE" 

69 assert len(data["tests"]) == 2 

70 

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" 

76 

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 

81 

82 response = await async_client.get("/api/v1/vehicles/UNKNOWN/mot-history") 

83 

84 assert response.status_code == 404 

85 assert response.json()["detail"] == "MOT history not found for this vehicle"