Skip to content

Commit 9155ad1

Browse files
extends routes tests
1 parent fe4c9cf commit 9155ad1

File tree

2 files changed

+207
-2
lines changed

2 files changed

+207
-2
lines changed

tests/unit/test_routes/test_flights_route.py

Lines changed: 103 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
from unittest.mock import patch, Mock, AsyncMock
2+
import copy
23
import json
34
import pytest
45
from fastapi.testclient import TestClient
56
from fastapi import HTTPException, status
67
from src.models.environment import EnvironmentModel
7-
from src.models.flight import FlightModel
8+
from src.models.flight import FlightModel, FlightWithReferencesRequest
89
from src.models.rocket import RocketModel
910
from src.views.motor import MotorView
1011
from src.views.rocket import RocketView
@@ -54,9 +55,23 @@ def mock_controller_instance():
5455
mock_controller_instance.get_rocketpy_flight_binary = Mock()
5556
mock_controller_instance.update_environment_by_flight_id = Mock()
5657
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()
5760
yield mock_controller_instance
5861

5962

63+
@pytest.fixture
64+
def stub_flight_reference_payload(stub_flight_dump):
65+
partial_flight = copy.deepcopy(stub_flight_dump)
66+
partial_flight.pop('environment', None)
67+
partial_flight.pop('rocket', None)
68+
return {
69+
'environment_id': 'env-123',
70+
'rocket_id': 'rocket-456',
71+
'flight': partial_flight,
72+
}
73+
74+
6075
def test_create_flight(stub_flight_dump, mock_controller_instance):
6176
mock_response = AsyncMock(return_value=FlightCreated(flight_id='123'))
6277
mock_controller_instance.post_flight = mock_response
@@ -71,6 +86,50 @@ def test_create_flight(stub_flight_dump, mock_controller_instance):
7186
)
7287

7388

89+
def test_create_flight_from_references(
90+
stub_flight_reference_payload, mock_controller_instance
91+
):
92+
mock_response = AsyncMock(return_value=FlightCreated(flight_id='123'))
93+
mock_controller_instance.create_flight_from_references = mock_response
94+
response = client.post(
95+
'/flights/from-references', json=stub_flight_reference_payload
96+
)
97+
assert response.status_code == 201
98+
assert response.json() == {
99+
'flight_id': '123',
100+
'message': 'Flight successfully created',
101+
}
102+
mock_controller_instance.create_flight_from_references.assert_called_once_with(
103+
FlightWithReferencesRequest(**stub_flight_reference_payload)
104+
)
105+
106+
107+
def test_create_flight_from_references_not_found(
108+
stub_flight_reference_payload, mock_controller_instance
109+
):
110+
mock_controller_instance.create_flight_from_references.side_effect = (
111+
HTTPException(status_code=status.HTTP_404_NOT_FOUND)
112+
)
113+
response = client.post(
114+
'/flights/from-references', json=stub_flight_reference_payload
115+
)
116+
assert response.status_code == 404
117+
assert response.json() == {'detail': 'Not Found'}
118+
119+
120+
def test_create_flight_from_references_server_error(
121+
stub_flight_reference_payload, mock_controller_instance
122+
):
123+
mock_controller_instance.create_flight_from_references.side_effect = (
124+
HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR)
125+
)
126+
response = client.post(
127+
'/flights/from-references', json=stub_flight_reference_payload
128+
)
129+
assert response.status_code == 500
130+
assert response.json() == {'detail': 'Internal Server Error'}
131+
132+
74133
def test_create_flight_optional_params(
75134
stub_flight_dump, mock_controller_instance
76135
):
@@ -173,6 +232,49 @@ def test_update_flight_by_id(stub_flight_dump, mock_controller_instance):
173232
)
174233

175234

235+
def test_update_flight_from_references(
236+
stub_flight_reference_payload, mock_controller_instance
237+
):
238+
mock_response = AsyncMock(return_value=None)
239+
mock_controller_instance.update_flight_from_references = mock_response
240+
response = client.put(
241+
'/flights/123/from-references',
242+
json=stub_flight_reference_payload,
243+
)
244+
assert response.status_code == 204
245+
mock_controller_instance.update_flight_from_references.assert_called_once_with(
246+
'123', FlightWithReferencesRequest(**stub_flight_reference_payload)
247+
)
248+
249+
250+
def test_update_flight_from_references_not_found(
251+
stub_flight_reference_payload, mock_controller_instance
252+
):
253+
mock_controller_instance.update_flight_from_references.side_effect = (
254+
HTTPException(status_code=status.HTTP_404_NOT_FOUND)
255+
)
256+
response = client.put(
257+
'/flights/123/from-references',
258+
json=stub_flight_reference_payload,
259+
)
260+
assert response.status_code == 404
261+
assert response.json() == {'detail': 'Not Found'}
262+
263+
264+
def test_update_flight_from_references_server_error(
265+
stub_flight_reference_payload, mock_controller_instance
266+
):
267+
mock_controller_instance.update_flight_from_references.side_effect = (
268+
HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR)
269+
)
270+
response = client.put(
271+
'/flights/123/from-references',
272+
json=stub_flight_reference_payload,
273+
)
274+
assert response.status_code == 500
275+
assert response.json() == {'detail': 'Internal Server Error'}
276+
277+
176278
def test_update_environment_by_flight_id(
177279
stub_environment_dump, mock_controller_instance
178280
):

tests/unit/test_routes/test_rockets_route.py

Lines changed: 104 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from unittest.mock import patch, Mock, AsyncMock
2+
import copy
23
import json
34
import pytest
45
from fastapi.testclient import TestClient
@@ -8,7 +9,10 @@
89
RailButtons,
910
Parachute,
1011
)
11-
from src.models.rocket import RocketModel
12+
from src.models.rocket import (
13+
RocketModel,
14+
RocketWithMotorReferenceRequest,
15+
)
1216
from src.views.rocket import (
1317
RocketCreated,
1418
RocketRetrieved,
@@ -78,9 +82,21 @@ def mock_controller_instance():
7882
mock_controller_instance.delete_rocket_by_id = Mock()
7983
mock_controller_instance.get_rocket_simulation = Mock()
8084
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()
8187
yield mock_controller_instance
8288

8389

90+
@pytest.fixture
91+
def stub_rocket_reference_payload(stub_rocket_dump):
92+
partial_rocket = copy.deepcopy(stub_rocket_dump)
93+
partial_rocket.pop('motor', None)
94+
return {
95+
'motor_id': 'motor-123',
96+
'rocket': partial_rocket,
97+
}
98+
99+
84100
def test_create_rocket(stub_rocket_dump, mock_controller_instance):
85101
mock_response = AsyncMock(return_value=RocketCreated(rocket_id='123'))
86102
mock_controller_instance.post_rocket = mock_response
@@ -95,6 +111,50 @@ def test_create_rocket(stub_rocket_dump, mock_controller_instance):
95111
)
96112

97113

114+
def test_create_rocket_from_motor_reference(
115+
stub_rocket_reference_payload, mock_controller_instance
116+
):
117+
mock_response = AsyncMock(return_value=RocketCreated(rocket_id='123'))
118+
mock_controller_instance.create_rocket_from_motor_reference = mock_response
119+
response = client.post(
120+
'/rockets/from-motor-reference', json=stub_rocket_reference_payload
121+
)
122+
assert response.status_code == 201
123+
assert response.json() == {
124+
'rocket_id': '123',
125+
'message': 'Rocket successfully created',
126+
}
127+
mock_controller_instance.create_rocket_from_motor_reference.assert_called_once_with(
128+
RocketWithMotorReferenceRequest(**stub_rocket_reference_payload)
129+
)
130+
131+
132+
def test_create_rocket_from_motor_reference_not_found(
133+
stub_rocket_reference_payload, mock_controller_instance
134+
):
135+
mock_controller_instance.create_rocket_from_motor_reference.side_effect = (
136+
HTTPException(status_code=status.HTTP_404_NOT_FOUND)
137+
)
138+
response = client.post(
139+
'/rockets/from-motor-reference', json=stub_rocket_reference_payload
140+
)
141+
assert response.status_code == 404
142+
assert response.json() == {'detail': 'Not Found'}
143+
144+
145+
def test_create_rocket_from_motor_reference_server_error(
146+
stub_rocket_reference_payload, mock_controller_instance
147+
):
148+
mock_controller_instance.create_rocket_from_motor_reference.side_effect = (
149+
HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR)
150+
)
151+
response = client.post(
152+
'/rockets/from-motor-reference', json=stub_rocket_reference_payload
153+
)
154+
assert response.status_code == 500
155+
assert response.json() == {'detail': 'Internal Server Error'}
156+
157+
98158
def test_create_rocket_optional_params(
99159
stub_rocket_dump,
100160
stub_tail_dump,
@@ -372,6 +432,49 @@ def test_update_rocket_invalid_input():
372432
assert response.status_code == 422
373433

374434

435+
def test_update_rocket_from_motor_reference(
436+
stub_rocket_reference_payload, mock_controller_instance
437+
):
438+
mock_response = AsyncMock(return_value=None)
439+
mock_controller_instance.update_rocket_from_motor_reference = mock_response
440+
response = client.put(
441+
'/rockets/123/from-motor-reference',
442+
json=stub_rocket_reference_payload,
443+
)
444+
assert response.status_code == 204
445+
mock_controller_instance.update_rocket_from_motor_reference.assert_called_once_with(
446+
'123', RocketWithMotorReferenceRequest(**stub_rocket_reference_payload)
447+
)
448+
449+
450+
def test_update_rocket_from_motor_reference_not_found(
451+
stub_rocket_reference_payload, mock_controller_instance
452+
):
453+
mock_controller_instance.update_rocket_from_motor_reference.side_effect = (
454+
HTTPException(status_code=status.HTTP_404_NOT_FOUND)
455+
)
456+
response = client.put(
457+
'/rockets/123/from-motor-reference',
458+
json=stub_rocket_reference_payload,
459+
)
460+
assert response.status_code == 404
461+
assert response.json() == {'detail': 'Not Found'}
462+
463+
464+
def test_update_rocket_from_motor_reference_server_error(
465+
stub_rocket_reference_payload, mock_controller_instance
466+
):
467+
mock_controller_instance.update_rocket_from_motor_reference.side_effect = (
468+
HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR)
469+
)
470+
response = client.put(
471+
'/rockets/123/from-motor-reference',
472+
json=stub_rocket_reference_payload,
473+
)
474+
assert response.status_code == 500
475+
assert response.json() == {'detail': 'Internal Server Error'}
476+
477+
375478
def test_update_rocket_not_found(stub_rocket_dump, mock_controller_instance):
376479
mock_controller_instance.put_rocket_by_id.side_effect = HTTPException(
377480
status_code=status.HTTP_404_NOT_FOUND

0 commit comments

Comments
 (0)