134 lines
5.0 KiB
Python
134 lines
5.0 KiB
Python
"""Contract tests — scenario data CRUD."""
|
|
|
|
import pytest
|
|
|
|
from tests.base import ContractHelpers as H
|
|
from tests.endpoints import Endpoints as E
|
|
from tests.helpers import set_scenario
|
|
|
|
|
|
class TestFlights:
|
|
@pytest.mark.asyncio
|
|
async def test_list_flights(self, client):
|
|
await set_scenario(client, "weather_disruption_ord")
|
|
res = await client.get(E.DATA_FLIGHTS)
|
|
H.assert_status(res, 200)
|
|
data = res.json()
|
|
H.assert_is_list(data, min_length=1)
|
|
H.assert_has_fields(data[0], "flight_id", "origin", "destination", "status")
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_flights_change_with_scenario(self, client):
|
|
await set_scenario(client, "weather_disruption_ord")
|
|
ord_ids = {f["flight_id"] for f in (await client.get(E.DATA_FLIGHTS)).json()}
|
|
|
|
await set_scenario(client, "crew_swap_ewr")
|
|
ewr_ids = {f["flight_id"] for f in (await client.get(E.DATA_FLIGHTS)).json()}
|
|
|
|
assert ord_ids != ewr_ids, "Different scenarios should have different flights"
|
|
await set_scenario(client, "weather_disruption_ord")
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_patch_flight_delay(self, client):
|
|
await set_scenario(client, "weather_disruption_ord")
|
|
res = await client.patch(E.flight("UA432"), json={"delay_minutes": 120})
|
|
H.assert_status(res, 200)
|
|
assert res.json()["delay_minutes"] == 120
|
|
|
|
flights = (await client.get(E.DATA_FLIGHTS)).json()
|
|
ua432 = next(f for f in flights if f["flight_id"] == "UA432")
|
|
assert ua432["delay_minutes"] == 120
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_patch_flight_status(self, client):
|
|
await set_scenario(client, "weather_disruption_ord")
|
|
res = await client.patch(E.flight("UA432"), json={"status": "CANCELLED"})
|
|
H.assert_status(res, 200)
|
|
assert res.json()["status"] == "CANCELLED"
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_patch_unknown_flight(self, client):
|
|
res = await client.patch(E.flight("FAKE"), json={"delay_minutes": 10})
|
|
H.assert_status(res, 200)
|
|
assert "error" in res.json()
|
|
|
|
|
|
class TestCrew:
|
|
@pytest.mark.asyncio
|
|
async def test_list_crew(self, client):
|
|
await set_scenario(client, "weather_disruption_ord")
|
|
res = await client.get(E.DATA_CREW)
|
|
H.assert_status(res, 200)
|
|
data = res.json()
|
|
H.assert_is_list(data, min_length=1)
|
|
H.assert_has_fields(data[0], "crew_id", "name", "role", "hours_until_limit", "at_risk")
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_patch_crew_duty_hours(self, client):
|
|
await set_scenario(client, "weather_disruption_ord")
|
|
res = await client.patch(E.crew("CR-1001"), json={"duty_hours_elapsed": 13.5})
|
|
H.assert_status(res, 200)
|
|
data = res.json()
|
|
assert data["duty_hours_elapsed"] == 13.5
|
|
assert data["at_risk"] is True
|
|
assert data["hours_until_limit"] == 0.5
|
|
|
|
|
|
class TestCrewNotes:
|
|
@pytest.mark.asyncio
|
|
async def test_get_notes(self, client):
|
|
await set_scenario(client, "weather_disruption_ord")
|
|
res = await client.get(E.DATA_CREW_NOTES)
|
|
H.assert_status(res, 200)
|
|
data = res.json()
|
|
assert isinstance(data, dict)
|
|
assert "UA432" in data
|
|
assert len(data["UA432"]) > 0
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_update_notes(self, client):
|
|
await set_scenario(client, "weather_disruption_ord")
|
|
new_notes = ["Test note alpha", "Test note beta"]
|
|
res = await client.put(E.crew_notes("UA432"), json={"notes": new_notes})
|
|
H.assert_status(res, 200)
|
|
assert res.json()["notes"] == new_notes
|
|
|
|
all_notes = (await client.get(E.DATA_CREW_NOTES)).json()
|
|
assert all_notes["UA432"] == new_notes
|
|
|
|
|
|
class TestMaintenance:
|
|
@pytest.mark.asyncio
|
|
async def test_get_maintenance(self, client):
|
|
await set_scenario(client, "weather_disruption_ord")
|
|
res = await client.get(E.DATA_MAINTENANCE)
|
|
H.assert_status(res, 200)
|
|
assert isinstance(res.json(), dict)
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_maintenance_has_mel_items(self, client):
|
|
await set_scenario(client, "maintenance_delay_sfo")
|
|
data = (await client.get(E.DATA_MAINTENANCE)).json()
|
|
assert len(data) > 0
|
|
for tail, items in data.items():
|
|
for item in items:
|
|
H.assert_has_fields(item, "mel_id", "system", "description")
|
|
|
|
|
|
class TestRebookings:
|
|
@pytest.mark.asyncio
|
|
async def test_get_rebookings(self, client):
|
|
await set_scenario(client, "weather_disruption_ord")
|
|
res = await client.get(E.DATA_REBOOKINGS)
|
|
H.assert_status(res, 200)
|
|
data = res.json()
|
|
H.assert_is_list(data, min_length=1)
|
|
H.assert_has_fields(data[0], "pax_id", "name", "urgency", "original_flight")
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_empty_in_normal_ops(self, client):
|
|
await set_scenario(client, "normal_ops")
|
|
data = (await client.get(E.DATA_REBOOKINGS)).json()
|
|
assert len(data) == 0
|
|
await set_scenario(client, "weather_disruption_ord")
|