Skip to content

Commit b6f27b4

Browse files
committed
ENH: update route tests to use dependency injection with cache clearing
- Replace patch from src.routes to src.dependencies for controller mocking - Use AsyncMock for all controller methods (they are async functions) - Clear lru_cache before and after each test to ensure fresh mock instances
1 parent 9a7f0d7 commit b6f27b4

4 files changed

Lines changed: 85 additions & 51 deletions

File tree

tests/unit/test_routes/test_environments_route.py

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@
1010
EnvironmentRetrieved,
1111
EnvironmentSimulation,
1212
)
13+
14+
from src.dependencies import get_environment_controller
15+
1316
from src import app
1417

1518
client = TestClient(app)
@@ -24,17 +27,23 @@ def stub_environment_simulation_dump():
2427

2528
@pytest.fixture(autouse=True)
2629
def mock_controller_instance():
27-
with patch(
28-
"src.routes.environment.EnvironmentController", autospec=True
29-
) as mock_controller:
30-
mock_controller_instance = mock_controller.return_value
31-
mock_controller_instance.post_environment = Mock()
32-
mock_controller_instance.get_environment_by_id = Mock()
33-
mock_controller_instance.put_environment_by_id = Mock()
34-
mock_controller_instance.delete_environment_by_id = Mock()
35-
mock_controller_instance.get_environment_simulation = Mock()
36-
mock_controller_instance.get_rocketpy_environment_binary = Mock()
37-
yield mock_controller_instance
30+
with patch("src.dependencies.EnvironmentController") as mock_class:
31+
mock_controller = AsyncMock()
32+
mock_controller.post_environment = AsyncMock()
33+
mock_controller.get_environment_by_id = AsyncMock()
34+
mock_controller.put_environment_by_id = AsyncMock()
35+
mock_controller.delete_environment_by_id = AsyncMock()
36+
mock_controller.get_environment_simulation = AsyncMock()
37+
mock_controller.get_rocketpy_environment_binary = AsyncMock()
38+
39+
mock_class.return_value = mock_controller
40+
41+
42+
get_environment_controller.cache_clear()
43+
44+
yield mock_controller
45+
46+
get_environment_controller.cache_clear()
3847

3948

4049
def test_create_environment(stub_environment_dump, mock_controller_instance):

tests/unit/test_routes/test_flights_route.py

Lines changed: 23 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@
1515
FlightSimulation,
1616
FlightView,
1717
)
18+
19+
from src.dependencies import get_flight_controller
20+
1821
from src import app
1922

2023
client = TestClient(app)
@@ -43,21 +46,26 @@ def stub_flight_simulate_dump():
4346

4447
@pytest.fixture(autouse=True)
4548
def mock_controller_instance():
46-
with patch(
47-
"src.routes.flight.FlightController", autospec=True
48-
) as mock_controller:
49-
mock_controller_instance = mock_controller.return_value
50-
mock_controller_instance.post_flight = Mock()
51-
mock_controller_instance.get_flight_by_id = Mock()
52-
mock_controller_instance.put_flight_by_id = Mock()
53-
mock_controller_instance.delete_flight_by_id = Mock()
54-
mock_controller_instance.get_flight_simulation = Mock()
55-
mock_controller_instance.get_rocketpy_flight_binary = Mock()
56-
mock_controller_instance.update_environment_by_flight_id = Mock()
57-
mock_controller_instance.update_rocket_by_flight_id = Mock()
58-
mock_controller_instance.create_flight_from_references = Mock()
59-
mock_controller_instance.update_flight_from_references = Mock()
60-
yield mock_controller_instance
49+
with patch("src.dependencies.FlightController") as mock_class:
50+
mock_controller = AsyncMock()
51+
mock_controller.post_flight = AsyncMock()
52+
mock_controller.get_flight_by_id = AsyncMock()
53+
mock_controller.put_flight_by_id = AsyncMock()
54+
mock_controller.delete_flight_by_id = AsyncMock()
55+
mock_controller.get_flight_simulation = AsyncMock()
56+
mock_controller.get_rocketpy_flight_binary = AsyncMock()
57+
mock_controller.update_environment_by_flight_id = AsyncMock()
58+
mock_controller.update_rocket_by_flight_id = AsyncMock()
59+
mock_controller.create_flight_from_references = AsyncMock()
60+
mock_controller.update_flight_from_references = AsyncMock()
61+
62+
mock_class.return_value = mock_controller
63+
64+
get_flight_controller.cache_clear()
65+
66+
yield mock_controller
67+
68+
get_flight_controller.cache_clear()
6169

6270

6371
@pytest.fixture

tests/unit/test_routes/test_motors_route.py

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,10 @@
99
MotorRetrieved,
1010
MotorSimulation,
1111
MotorView,
12-
)
12+
)
13+
14+
from src.dependencies import get_motor_controller
15+
1316
from src import app
1417

1518
client = TestClient(app)
@@ -24,17 +27,22 @@ def stub_motor_dump_simulation():
2427

2528
@pytest.fixture(autouse=True)
2629
def mock_controller_instance():
27-
with patch(
28-
"src.routes.motor.MotorController", autospec=True
29-
) as mock_controller:
30-
mock_controller_instance = mock_controller.return_value
31-
mock_controller_instance.post_motor = Mock()
32-
mock_controller_instance.get_motor_by_id = Mock()
33-
mock_controller_instance.put_motor_by_id = Mock()
34-
mock_controller_instance.delete_motor_by_id = Mock()
35-
mock_controller_instance.get_motor_simulation = Mock()
36-
mock_controller_instance.get_rocketpy_motor_binary = Mock()
37-
yield mock_controller_instance
30+
with patch("src.dependencies.MotorController") as mock_class:
31+
mock_controller = AsyncMock()
32+
mock_controller.post_motor = AsyncMock()
33+
mock_controller.get_motor_by_id = AsyncMock()
34+
mock_controller.put_motor_by_id = AsyncMock()
35+
mock_controller.delete_motor_by_id = AsyncMock()
36+
mock_controller.get_motor_simulation = AsyncMock()
37+
mock_controller.get_rocketpy_motor_binary = AsyncMock()
38+
39+
mock_class.return_value = mock_controller
40+
41+
get_motor_controller.cache_clear()
42+
43+
yield mock_controller
44+
45+
get_motor_controller.cache_clear()
3846

3947

4048
def test_create_motor(stub_motor_dump, mock_controller_instance):

tests/unit/test_routes/test_rockets_route.py

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@
1919
RocketSimulation,
2020
RocketView,
2121
)
22+
23+
24+
from src.dependencies import get_rocket_controller
25+
2226
from src import app
2327

2428
client = TestClient(app)
@@ -72,19 +76,24 @@ def stub_parachute_dump():
7276

7377
@pytest.fixture(autouse=True)
7478
def mock_controller_instance():
75-
with patch(
76-
"src.routes.rocket.RocketController", autospec=True
77-
) as mock_controller:
78-
mock_controller_instance = mock_controller.return_value
79-
mock_controller_instance.post_rocket = Mock()
80-
mock_controller_instance.get_rocket_by_id = Mock()
81-
mock_controller_instance.put_rocket_by_id = Mock()
82-
mock_controller_instance.delete_rocket_by_id = Mock()
83-
mock_controller_instance.get_rocket_simulation = Mock()
84-
mock_controller_instance.get_rocketpy_rocket_binary = Mock()
85-
mock_controller_instance.create_rocket_from_motor_reference = Mock()
86-
mock_controller_instance.update_rocket_from_motor_reference = Mock()
87-
yield mock_controller_instance
79+
with patch("src.dependencies.RocketController") as mock_class:
80+
mock_controller = AsyncMock()
81+
mock_controller.post_rocket = AsyncMock()
82+
mock_controller.get_rocket_by_id = AsyncMock()
83+
mock_controller.put_rocket_by_id = AsyncMock()
84+
mock_controller.delete_rocket_by_id = AsyncMock()
85+
mock_controller.get_rocket_simulation = AsyncMock()
86+
mock_controller.get_rocketpy_rocket_binary = AsyncMock()
87+
mock_controller.create_rocket_from_motor_reference = AsyncMock()
88+
mock_controller.update_rocket_from_motor_reference = AsyncMock()
89+
90+
mock_class.return_value = mock_controller
91+
92+
get_rocket_controller.cache_clear()
93+
94+
yield mock_controller
95+
96+
get_rocket_controller.cache_clear()
8897

8998

9099
@pytest.fixture

0 commit comments

Comments
 (0)