from datetime import datetime, timedelta from app.models.arrival import Arrival, ArrivalStatus from app.models.departure import Departure, DepartureStatus from app.models.local_flight import LocalFlight, LocalFlightStatus, LocalFlightType from app.models.ppr import Aircraft, Airport, PPRRecord, PPRStatus def test_public_arrivals_and_departures_start_empty(client): arrivals = client.get("/api/v1/public/arrivals") departures = client.get("/api/v1/public/departures") assert arrivals.status_code == 200 assert arrivals.json() == [] assert departures.status_code == 200 assert departures.json() == [] def test_public_boards_include_todays_flights(client, db): now = datetime.now().replace(microsecond=0) ppr = PPRRecord( status=PPRStatus.LANDED, ac_reg="G-PPR1", ac_type="PA28", ac_call="GPPR1", captain="Arriving Pilot", in_from="EGLL", eta=now, pob_in=2, out_to="EGKK", etd=now, pob_out=2, created_by="test", ) local_flight = LocalFlight( registration="G-LOC1", type="C152", callsign="GLOC1", pob=1, flight_type=LocalFlightType.LOCAL, status=LocalFlightStatus.BOOKED_OUT, created_dt=now, etd=now, ) arrival = Arrival( registration="G-ARR1", type="DA40", callsign="GARR1", pob=3, in_from="EGBB", status=ArrivalStatus.INBOUND, created_dt=now, eta=now, ) departure = Departure( registration="G-DEP1", type="SR22", callsign="GDEP1", pob=2, out_to="EGCC", status=DepartureStatus.BOOKED_OUT, created_dt=now, etd=now, ) db.add_all([ppr, local_flight, arrival, departure]) db.commit() arrivals = client.get("/api/v1/public/arrivals") departures = client.get("/api/v1/public/departures") assert arrivals.status_code == 200 assert {item.get("ac_reg") or item.get("registration") for item in arrivals.json()} == { "G-PPR1", "G-ARR1", } assert departures.status_code == 200 assert {item["ac_reg"] for item in departures.json()} == { "G-PPR1", "G-LOC1", "G-DEP1", } def test_public_boards_include_current_local_flight_statuses(client, db): now = datetime.now().replace(microsecond=0) ground_local = LocalFlight( registration="G-GRND", type="C152", callsign="GGRND", pob=1, flight_type=LocalFlightType.LOCAL, status=LocalFlightStatus.GROUND, created_dt=now, etd=now, ) airborne_local = LocalFlight( registration="G-AIR1", type="PA28", callsign="GAIR1", pob=2, flight_type=LocalFlightType.LOCAL, status=LocalFlightStatus.LOCAL, created_dt=now, etd=now, takeoff_dt=now, duration=45, ) circuit_local = LocalFlight( registration="G-CCT1", type="C152", callsign="GCCT1", pob=1, flight_type=LocalFlightType.CIRCUITS, status=LocalFlightStatus.CIRCUIT, created_dt=now, etd=now, takeoff_dt=now, duration=30, ) landed_local = LocalFlight( registration="G-LND1", type="C172", callsign="GLND1", pob=1, flight_type=LocalFlightType.LOCAL, status=LocalFlightStatus.LANDED, created_dt=now, etd=now, takeoff_dt=now, landed_dt=now, ) db.add_all([ground_local, airborne_local, circuit_local, landed_local]) db.commit() arrivals = client.get("/api/v1/public/arrivals") departures = client.get("/api/v1/public/departures") assert arrivals.status_code == 200 assert { item["ac_reg"] for item in arrivals.json() if item.get("isLocalFlight") } == {"G-AIR1", "G-CCT1"} assert departures.status_code == 200 assert { item["ac_reg"] for item in departures.json() if item.get("isLocalFlight") } == {"G-GRND"} def test_public_reference_lookups_return_seeded_records(client, db): db.add( Airport( icao="EGLL", iata="LHR", name="London Heathrow", country="United Kingdom", city="London", ) ) db.add( Aircraft( registration="G-ABCD", type_code="PA28", clean_reg="GABCD", manufacturer_name="Piper", model="Cherokee", ) ) db.commit() airport_response = client.get("/api/v1/airport/public/lookup/EGLL") aircraft_response = client.get("/api/v1/aircraft/public/lookup/G-ABC") assert airport_response.status_code == 200 assert airport_response.json()[0]["icao"] == "EGLL" assert aircraft_response.status_code == 200 assert aircraft_response.json()[0]["registration"] == "G-ABCD" def test_public_reference_lookups_return_empty_for_short_queries(client): airport_response = client.get("/api/v1/airport/public/lookup/E") aircraft_response = client.get("/api/v1/aircraft/public/lookup/G-A") assert airport_response.status_code == 200 assert airport_response.json() == [] assert aircraft_response.status_code == 200 assert aircraft_response.json() == [] def test_public_airport_lookup_searches_by_partial_name(client, db): db.add( Airport( icao="EGBB", iata="BHX", name="Birmingham Airport", country="United Kingdom", city="Birmingham", ) ) db.commit() response = client.get("/api/v1/airport/public/lookup/Birmingham") assert response.status_code == 200 assert response.json()[0]["icao"] == "EGBB" def test_public_boards_exclude_old_and_cancelled_records(client, db): yesterday = datetime.now().replace(microsecond=0) - timedelta(days=1) db.add( PPRRecord( status=PPRStatus.CANCELED, ac_reg="G-OLD1", ac_type="PA28", captain="Old Pilot", in_from="EGLL", eta=yesterday, pob_in=1, out_to="EGKK", etd=yesterday, created_by="test", ) ) db.add( LocalFlight( registration="G-OLD2", type="C152", pob=1, flight_type=LocalFlightType.LOCAL, status=LocalFlightStatus.BOOKED_OUT, created_dt=yesterday, ) ) db.commit() arrivals = client.get("/api/v1/public/arrivals") departures = client.get("/api/v1/public/departures") assert arrivals.status_code == 200 assert arrivals.json() == [] assert departures.status_code == 200 assert departures.json() == []