Michael Pilosov
2 years ago
4 changed files with 113 additions and 31 deletions
@ -1,54 +1,39 @@ |
|||||
import asyncio |
import asyncio |
||||
import sys |
import subprocess |
||||
from unittest.mock import patch, MagicMock |
from unittest.mock import MagicMock, patch |
||||
|
|
||||
if sys.version_info >= (3, 8): |
|
||||
from unittest.mock import AsyncMock |
|
||||
else: |
|
||||
from asynctest import CoroutineMock as AsyncMock |
|
||||
|
|
||||
import pytest |
import pytest |
||||
|
|
||||
from announce_server.decorator import _announce_server, announce_server |
from announce_server.decorator import _announce_server, announce_server |
||||
|
|
||||
|
|
||||
@pytest.mark.asyncio |
@patch("announce_server.decorator._announce_server") |
||||
# @patch('announce_server.decorator.announce_server', new=MagicMock()) |
def test_announce_server_decorator(mock_announce_server): |
||||
async def test_announce_server_decorator(mocked_announce_server, event_loop): |
|
||||
# Sample function to be decorated |
|
||||
async def sample_async_function(): |
|
||||
await asyncio.sleep(1) |
|
||||
return "Hello, world!" |
|
||||
|
|
||||
# Mock the _announce_server function to prevent actual connections |
# Mock the _announce_server function to prevent actual connections |
||||
mocked_announce_server.return_value = lambda x: x |
mock_announce_server.return_value = MagicMock() |
||||
|
|
||||
# Decorate the sample function with announce_server |
# Decorate the sample function with announce_server |
||||
decorated_function = announce_server( |
@announce_server( |
||||
name="test_server", |
name="test_server", |
||||
ip="127.0.0.1", |
ip="127.0.0.1", |
||||
port=8000, |
port=8000, |
||||
host_ip="127.0.0.1", |
host_ip="127.0.0.1", |
||||
host_port=5000, |
host_port=5000, |
||||
loop=event_loop, # Pass the current event loop |
) |
||||
)(sample_async_function) |
def http_server(): |
||||
|
server = subprocess.Popen(["python3", "-m", "http.server", "13373"]) |
||||
|
yield |
||||
|
server.terminate() |
||||
|
server.wait() |
||||
|
|
||||
# Run the decorated function |
# Run the decorated function |
||||
coro = asyncio.to_thread(decorated_function) |
http_server() |
||||
task = await asyncio.gather(coro) |
|
||||
await asyncio.sleep(1.1) # Sleep slightly longer than sample_async_function |
|
||||
task.cancel() # Cancel the task |
|
||||
|
|
||||
# Check if the _announce_server function was called with the correct arguments |
# Check if the _announce_server function was called with the correct arguments |
||||
mocked_announce_server.assert_called_once_with( |
mock_announce_server.assert_called_once_with( |
||||
name="test_server", |
name="test_server", |
||||
ip="127.0.0.1", |
ip="127.0.0.1", |
||||
port=8000, |
port=8000, |
||||
host_ip="127.0.0.1", |
host_ip="127.0.0.1", |
||||
host_port=5000, |
host_port=5000, |
||||
loop=event_loop, |
|
||||
) |
) |
||||
|
|
||||
# Check if the decorated function returns the expected result |
|
||||
result = await sample_async_function() |
|
||||
assert result == "Hello, world!" |
|
Loading…
Reference in new issue