44
55from antares .client .tcp import TCPSubscriber
66from antares .errors import SubscriptionError
7+ from antares .models .track import Track
78
89
910@pytest .mark .asyncio
10- async def test_subscribe_success (monkeypatch ):
11- # Simulated lines returned from the TCP stream
12- lines = [b'{"event": "ok"} \n ' , b'{"event": "done"} \n ' , b"" ]
11+ async def test_subscribe_success (monkeypatch , sample_track_line ):
12+ # Simulated CSV lines returned from the TCP stream
13+ encoded_lines = [sample_track_line . encode () + b" \n " , b"" ]
1314
1415 async def fake_readline ():
15- return lines .pop (0 )
16+ return encoded_lines .pop (0 )
1617
1718 # Simulate EOF after all lines are read
18- eof_flags = [False , False , True ]
19+ eof_flags = [False , True ]
1920
2021 fake_reader = AsyncMock ()
2122 fake_reader .readline = AsyncMock (side_effect = fake_readline )
@@ -27,7 +28,11 @@ async def fake_readline():
2728 subscriber = TCPSubscriber ("localhost" , 1234 , reconnect = False )
2829
2930 events = [event async for event in subscriber .subscribe ()]
30- assert events == [{"event" : "ok" }, {"event" : "done" }]
31+ expected_lat = - 33.45
32+ assert len (events ) == 1
33+ assert isinstance (events [0 ], Track )
34+ assert events [0 ].name == "Eagle-1"
35+ assert events [0 ].lat == expected_lat
3136
3237
3338@pytest .mark .asyncio
@@ -41,7 +46,7 @@ async def test_subscribe_failure(monkeypatch):
4146
4247
4348@pytest .mark .asyncio
44- async def test_subscribe_reconnects_on_failure (monkeypatch ):
49+ async def test_subscribe_reconnects_on_failure (monkeypatch , sample_track_line ):
4550 class OneMessageReader :
4651 def __init__ (self ):
4752 self .called = False
@@ -52,7 +57,7 @@ def at_eof(self):
5257 async def readline (self ):
5358 if not self .called :
5459 self .called = True
55- return b'{"event": "recovered"} \n '
60+ return sample_track_line . encode () + b" \n "
5661 return b""
5762
5863 open_calls = []
@@ -71,6 +76,65 @@ async def fake_open_connection(host, port):
7176 events = []
7277 async for event in subscriber .subscribe ():
7378 events .append (event )
74- break # Exit after one event
79+ break # exit after first track
7580
76- assert events == [{"event" : "recovered" }]
81+ assert len (events ) == 1
82+ assert isinstance (events [0 ], Track )
83+ assert events [0 ].name == "Eagle-1"
84+
85+
86+ @pytest .mark .asyncio
87+ async def test_subscribe_invalid_field_count (monkeypatch ):
88+ invalid_line = "1,2025,4,11"
89+
90+ async def fake_readline ():
91+ return invalid_line .encode () + b"\n "
92+
93+ fake_reader = AsyncMock ()
94+ fake_reader .readline = AsyncMock (side_effect = fake_readline )
95+ fake_reader .at_eof = MagicMock (side_effect = [False , True ])
96+
97+ monkeypatch .setattr ("asyncio.open_connection" , AsyncMock (return_value = (fake_reader , None )))
98+
99+ subscriber = TCPSubscriber ("localhost" , 1234 , reconnect = False )
100+
101+ with pytest .raises (SubscriptionError ) as excinfo :
102+ async for _ in subscriber .subscribe ():
103+ pass
104+
105+ assert "Expected 25 fields" in str (excinfo .value )
106+
107+
108+ @pytest .mark .asyncio
109+ async def test_subscribe_invalid_value (monkeypatch , sample_track_line ):
110+ bad_line = sample_track_line .replace ("1," , "bad_id," , 1 )
111+
112+ async def fake_readline ():
113+ return bad_line .encode () + b"\n "
114+
115+ fake_reader = AsyncMock ()
116+ fake_reader .readline = AsyncMock (side_effect = fake_readline )
117+ fake_reader .at_eof = MagicMock (side_effect = [False , True ])
118+
119+ monkeypatch .setattr ("asyncio.open_connection" , AsyncMock (return_value = (fake_reader , None )))
120+
121+ subscriber = TCPSubscriber ("localhost" , 1234 , reconnect = False )
122+
123+ with pytest .raises (SubscriptionError ) as excinfo :
124+ async for _ in subscriber .subscribe ():
125+ pass
126+
127+ assert "Invalid value for field 'id'" in str (excinfo .value )
128+
129+
130+ def test_from_csv_field_type_none (monkeypatch ):
131+ class FakeTrack (Track ):
132+ __field_order__ = ["id" ]
133+ id : int
134+
135+ FakeTrack .model_fields ["id" ].annotation = None
136+
137+ with pytest .raises (ValueError ) as excinfo :
138+ FakeTrack .from_csv_row ("123" )
139+
140+ assert "has no type annotation" in str (excinfo .value )
0 commit comments