|
|
|
import asyncio
|
|
|
|
from unittest.mock import AsyncMock, call, patch
|
|
|
|
|
|
|
|
import pytest
|
|
|
|
import socketio
|
|
|
|
|
|
|
|
from announce_server.decorator import _announce_server
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
|
|
async def test_announce_server(event_loop):
|
|
|
|
# Mock the socketio.AsyncClient to prevent actual connections
|
|
|
|
|
|
|
|
with patch("announce_server.decorator.sio") as mock_sio:
|
|
|
|
# Create a fake sio.connect() function that simulates a retry loop
|
|
|
|
async def fake_connect(*args, **kwargs):
|
|
|
|
await asyncio.sleep(0.1)
|
|
|
|
raise RuntimeError("Failed to connect")
|
|
|
|
|
|
|
|
# Set the fake connect function to be used as a side_effect for the mock
|
|
|
|
mock_sio.connect = AsyncMock(side_effect=fake_connect)
|
|
|
|
|
|
|
|
# Define the outer_kwargs for the _announce_server function
|
|
|
|
outer_kwargs = {
|
|
|
|
"name": "test_server",
|
|
|
|
"ip": "127.0.0.1",
|
|
|
|
"port": 8000,
|
|
|
|
"host_ip": "127.0.0.1",
|
|
|
|
"host_port": 5123,
|
|
|
|
"retry_interval": 0.001,
|
|
|
|
}
|
|
|
|
|
|
|
|
# Run the _announce_server function with a timeout to avoid infinite loop
|
|
|
|
try:
|
|
|
|
await asyncio.wait_for(_announce_server(**outer_kwargs), timeout=0.105)
|
|
|
|
except asyncio.TimeoutError:
|
|
|
|
pass
|
|
|
|
|
|
|
|
# Check if sio.connect was called multiple times due to the retry loop
|
|
|
|
assert mock_sio.connect.call_count >= 2
|
|
|
|
|
|
|
|
# Check if sio.connect was called with the correct arguments
|
|
|
|
mock_sio.connect.assert_has_calls(
|
|
|
|
[call("http://127.0.0.1:5123")] * mock_sio.connect.call_count
|
|
|
|
)
|
|
|
|
|
|
|
|
# Since we don't have access to the event handlers directly, we can't test them in this way.
|
|
|
|
# Instead, you could refactor the code to make the event handlers separate functions that can be tested independently.
|