disagreement/tests/test_http_reactions.py
Slipstream 45a5ef1fb5
Improves asyncio loop handling and test initialization
Replaces deprecated get_event_loop() with proper running loop detection and fallback to new loop creation for better asyncio compatibility.

Fixes test suite by replacing manual Client instantiation with proper constructor calls, ensuring all internal caches and attributes are correctly initialized.

Updates cache access patterns to use new cache API methods consistently across the codebase.
2025-06-11 02:25:24 -06:00

135 lines
3.7 KiB
Python

import pytest
from types import SimpleNamespace
from unittest.mock import AsyncMock
from disagreement.client import Client
from disagreement.errors import DisagreementException
from disagreement.models import Message, User, Reaction
@pytest.mark.asyncio
async def test_create_reaction_calls_http():
http = SimpleNamespace(create_reaction=AsyncMock())
client = Client.__new__(Client)
client._http = http
client._closed = False
message_data = {
"id": "2",
"channel_id": "1",
"author": {"id": "3", "username": "u", "discriminator": "0001"},
"content": "hi",
"timestamp": "t",
}
message = Message(message_data, client_instance=client)
await message.add_reaction("😀")
http.create_reaction.assert_called_once_with("1", "2", "😀")
@pytest.mark.asyncio
async def test_create_reaction_closed():
http = SimpleNamespace(create_reaction=AsyncMock())
client = Client.__new__(Client)
client._http = http
client._closed = True
message_data = {
"id": "2",
"channel_id": "1",
"author": {"id": "3", "username": "u", "discriminator": "0001"},
"content": "hi",
"timestamp": "t",
}
message = Message(message_data, client_instance=client)
with pytest.raises(DisagreementException):
await message.add_reaction("😀")
@pytest.mark.asyncio
async def test_delete_reaction_calls_http():
http = SimpleNamespace(delete_reaction=AsyncMock())
client = Client.__new__(Client)
client._http = http
client._closed = False
message_data = {
"id": "2",
"channel_id": "1",
"author": {"id": "3", "username": "u", "discriminator": "0001"},
"content": "hi",
"timestamp": "t",
}
message = Message(message_data, client_instance=client)
await message.remove_reaction("😀")
http.delete_reaction.assert_called_once_with("1", "2", "😀")
@pytest.mark.asyncio
async def test_get_reactions_parses_users():
users_payload = [{"id": "1", "username": "u", "discriminator": "0001"}]
http = SimpleNamespace(get_reactions=AsyncMock(return_value=users_payload))
client = Client(token="test")
client._http = http
users = await client.get_reactions("1", "2", "😀")
http.get_reactions.assert_called_once_with("1", "2", "😀")
assert isinstance(users[0], User)
@pytest.mark.asyncio
async def test_create_reaction_dispatches_event(monkeypatch):
http = SimpleNamespace(create_reaction=AsyncMock())
client = Client(token="t")
client._http = http
events = {}
async def on_add(reaction):
events["add"] = reaction
client._event_dispatcher.register("MESSAGE_REACTION_ADD", on_add)
message_data = {
"id": "2",
"channel_id": "1",
"author": {"id": "3", "username": "u", "discriminator": "0001"},
"content": "hi",
"timestamp": "t",
}
message = Message(message_data, client_instance=client)
await message.add_reaction("😀")
assert isinstance(events.get("add"), Reaction)
@pytest.mark.asyncio
async def test_delete_reaction_dispatches_event(monkeypatch):
http = SimpleNamespace(delete_reaction=AsyncMock())
client = Client(token="t")
client._http = http
events = {}
async def on_remove(reaction):
events["remove"] = reaction
client._event_dispatcher.register("MESSAGE_REACTION_REMOVE", on_remove)
message_data = {
"id": "2",
"channel_id": "1",
"author": {"id": "3", "username": "u", "discriminator": "0001"},
"content": "hi",
"timestamp": "t",
}
message = Message(message_data, client_instance=client)
await message.remove_reaction("😀")
assert isinstance(events.get("remove"), Reaction)