"""Tests for FlightCorrelator: ACARS/VDL2 message matching.""" import pytest from utils.flight_correlator import FlightCorrelator class TestFlightCorrelator: """Test ACARS/VDL2 message matching by callsign.""" @pytest.fixture(autouse=True) def setup(self): self.correlator = FlightCorrelator(max_messages=100) def test_add_acars_message(self): self.correlator.add_acars_message( { "flight": "BAW123", "tail": "G-ABCD", "text": "Hello", } ) assert self.correlator.acars_count == 1 def test_add_vdl2_message(self): self.correlator.add_vdl2_message( { "flight": "DLH456", "text": "World", } ) assert self.correlator.vdl2_count == 1 def test_match_by_callsign(self): self.correlator.add_acars_message( { "flight": "BAW123", "text": "msg1", } ) self.correlator.add_acars_message( { "flight": "DLH456", "text": "msg2", } ) result = self.correlator.get_messages_for_aircraft(callsign="BAW123") assert len(result["acars"]) == 1 assert result["acars"][0]["text"] == "msg1" def test_match_by_icao(self): self.correlator.add_vdl2_message( { "icao": "ABC123", "text": "vdl2 msg", } ) result = self.correlator.get_messages_for_aircraft(icao="ABC123") assert len(result["vdl2"]) == 1 assert result["vdl2"][0]["text"] == "vdl2 msg" def test_no_match_returns_empty(self): self.correlator.add_acars_message({"flight": "BAW123", "text": "msg"}) result = self.correlator.get_messages_for_aircraft(callsign="NOMATCH") assert result["acars"] == [] assert result["vdl2"] == [] def test_empty_search_returns_empty(self): result = self.correlator.get_messages_for_aircraft() assert result == {"acars": [], "vdl2": []} def test_ring_buffer_limit(self): correlator = FlightCorrelator(max_messages=5) for i in range(10): correlator.add_acars_message({"flight": f"FL{i}", "text": f"msg{i}"}) assert correlator.acars_count == 5 # First 5 messages should have been evicted result = correlator.get_messages_for_aircraft(callsign="FL0") assert len(result["acars"]) == 0 # Last message should still be there result = correlator.get_messages_for_aircraft(callsign="FL9") assert len(result["acars"]) == 1 def test_case_insensitive_matching(self): self.correlator.add_acars_message({"flight": "baw123", "text": "lowercase"}) result = self.correlator.get_messages_for_aircraft(callsign="BAW123") assert len(result["acars"]) == 1 def test_match_by_tail_field(self): self.correlator.add_acars_message( { "tail": "G-ABCD", "text": "tail match", } ) result = self.correlator.get_messages_for_aircraft(callsign="G-ABCD") assert len(result["acars"]) == 1 def test_internal_fields_not_returned(self): self.correlator.add_acars_message({"flight": "TEST", "text": "msg"}) result = self.correlator.get_messages_for_aircraft(callsign="TEST") msg = result["acars"][0] assert "_corr_time" not in msg def test_both_acars_and_vdl2_returned(self): self.correlator.add_acars_message({"flight": "UAL789", "text": "acars"}) self.correlator.add_vdl2_message({"flight": "UAL789", "text": "vdl2"}) result = self.correlator.get_messages_for_aircraft(callsign="UAL789") assert len(result["acars"]) == 1 assert len(result["vdl2"]) == 1