Michael Pilosov
2 years ago
3 changed files with 45 additions and 37 deletions
@ -1,39 +1,46 @@ |
|||||
import asyncio |
import asyncio |
||||
import subprocess |
from unittest.mock import AsyncMock, call, patch |
||||
from unittest.mock import MagicMock, patch |
|
||||
|
|
||||
import pytest |
import pytest |
||||
|
import socketio |
||||
|
|
||||
from announce_server.decorator import _announce_server, announce_server |
from announce_server.decorator import _announce_server |
||||
|
|
||||
|
|
||||
@patch("announce_server.decorator._announce_server") |
@pytest.mark.asyncio |
||||
def test_announce_server_decorator(mock_announce_server): |
async def test_announce_server(event_loop): |
||||
# Mock the _announce_server function to prevent actual connections |
# Mock the socketio.AsyncClient to prevent actual connections |
||||
mock_announce_server.return_value = MagicMock() |
|
||||
|
with patch("announce_server.decorator.sio") as mock_sio: |
||||
# Decorate the sample function with announce_server |
# Create a fake sio.connect() function that simulates a retry loop |
||||
@announce_server( |
async def fake_connect(*args, **kwargs): |
||||
name="test_server", |
await asyncio.sleep(0.1) |
||||
ip="127.0.0.1", |
raise RuntimeError("Failed to connect") |
||||
port=8000, |
|
||||
host_ip="127.0.0.1", |
# Set the fake connect function to be used as a side_effect for the mock |
||||
host_port=5000, |
mock_sio.connect = AsyncMock(side_effect=fake_connect) |
||||
) |
|
||||
def http_server(): |
# Define the outer_kwargs for the _announce_server function |
||||
server = subprocess.Popen(["python3", "-m", "http.server", "13373"]) |
outer_kwargs = { |
||||
yield |
"name": "test_server", |
||||
server.terminate() |
"ip": "127.0.0.1", |
||||
server.wait() |
"port": 8000, |
||||
|
"host_ip": "127.0.0.1", |
||||
# Run the decorated function |
"host_port": 5123, |
||||
http_server() |
"retry_interval": 0.001, |
||||
|
} |
||||
# Check if the _announce_server function was called with the correct arguments |
|
||||
mock_announce_server.assert_called_once_with( |
# Run the _announce_server function with a timeout to avoid infinite loop |
||||
name="test_server", |
try: |
||||
ip="127.0.0.1", |
await asyncio.wait_for(_announce_server(**outer_kwargs), timeout=0.105) |
||||
port=8000, |
except asyncio.TimeoutError: |
||||
host_ip="127.0.0.1", |
pass |
||||
host_port=5000, |
|
||||
) |
# 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. |
||||
|
Loading…
Reference in new issue