1+ import asyncio
2+ import json
13import unittest
4+ import warnings
25from unittest .mock import Mock
36
4- from yfinance .live import BaseWebSocket
7+ from yfinance .live import AsyncWebSocket , BaseWebSocket
58
69
710class TestWebSocket (unittest .TestCase ):
@@ -28,3 +31,50 @@ def test_decode_message_invalid(self):
2831 assert "error" in decoded
2932 assert "raw_base64" in decoded
3033 self .assertEqual (base64_message , decoded ["raw_base64" ])
34+
35+
36+ class _FakeAsyncConnection :
37+ def __init__ (self , messages ):
38+ self ._messages = messages
39+ self .closed = False
40+
41+ async def __aiter__ (self ):
42+ for message in self ._messages :
43+ yield message
44+ raise asyncio .CancelledError
45+
46+ async def close (self ):
47+ self .closed = True
48+
49+
50+ class TestAsyncWebSocketListen (unittest .IsolatedAsyncioTestCase ):
51+ message = ("CgdCVEMtVVNEFYoMuUcYwLCVgIplIgNVU0QqA0NDQzApOAFFPWrEP0iAgOrxvANVx/25R12csrRHZYD8skR9/"
52+ "7i0R7ABgIDq8bwD2AEE4AGAgOrxvAPoAYCA6vG8A/IBA0JUQ4ECAAAAwPrjckGJAgAA2P5ZT3tC" )
53+
54+ async def _listen (self , handler ):
55+ ws = AsyncWebSocket (verbose = False )
56+ ws ._ws = _FakeAsyncConnection ([json .dumps ({"message" : self .message })])
57+ with warnings .catch_warnings ():
58+ # asyncio.iscoroutinefunction is deprecated since Python 3.14.
59+ warnings .simplefilter ("error" , DeprecationWarning )
60+ await ws .listen (handler )
61+ self .assertTrue (ws ._ws .closed )
62+
63+ async def test_listen_awaits_async_handler (self ):
64+ received = []
65+
66+ async def handler (message ):
67+ received .append (message )
68+
69+ await self ._listen (handler )
70+ self .assertEqual (["BTC-USD" ], [m ["id" ] for m in received ])
71+
72+ async def test_listen_calls_sync_handler (self ):
73+ received = []
74+
75+ def handler (message ):
76+ received .append (message )
77+
78+ await self ._listen (handler )
79+ self .assertEqual (["BTC-USD" ], [m ["id" ] for m in received ])
80+
0 commit comments