disagreement/tests/test_channel_permissions.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

129 lines
3.5 KiB
Python

import pytest # pylint: disable=E0401
from disagreement.models import Guild, Member, Role, TextChannel, PermissionOverwrite
from disagreement.enums import (
ChannelType,
VerificationLevel,
MessageNotificationLevel,
ExplicitContentFilterLevel,
MFALevel,
GuildNSFWLevel,
PremiumTier,
OverwriteType,
)
from disagreement.permissions import Permissions
from disagreement.client import Client
class DummyClient(Client):
def __init__(self):
super().__init__(token="test")
def _base_guild(client):
data = {
"id": "1",
"name": "g",
"owner_id": "1",
"afk_timeout": 60,
"verification_level": VerificationLevel.NONE.value,
"default_message_notifications": MessageNotificationLevel.ALL_MESSAGES.value,
"explicit_content_filter": ExplicitContentFilterLevel.DISABLED.value,
"roles": [],
"emojis": [],
"features": [],
"mfa_level": MFALevel.NONE.value,
"system_channel_flags": 0,
"premium_tier": PremiumTier.NONE.value,
"nsfw_level": GuildNSFWLevel.DEFAULT.value,
}
guild = Guild(data, client_instance=client)
client._guilds.set(guild.id, guild)
return guild
def _member(guild, *roles):
data = {
"user": {"id": "10", "username": "u", "discriminator": "0001"},
"joined_at": "t",
"roles": [r.id for r in roles] or [guild.id],
}
member = Member(data, client_instance=None)
member.guild_id = guild.id
guild._members.set(member.id, member)
return member
def _role(guild, rid, perms):
role = Role(
{
"id": rid,
"name": f"r{rid}",
"color": 0,
"hoist": False,
"position": 0,
"permissions": str(int(perms)),
"managed": False,
"mentionable": False,
}
)
guild.roles.append(role)
return role
def _channel(guild, client):
data = {
"id": "100",
"type": ChannelType.GUILD_TEXT.value,
"guild_id": guild.id,
"permission_overwrites": [],
}
channel = TextChannel(data, client_instance=client)
guild._channels.set(channel.id, channel)
return channel
def test_permissions_for_base_roles():
client = DummyClient()
guild = _base_guild(client)
everyone = _role(
guild, guild.id, Permissions.VIEW_CHANNEL | Permissions.SEND_MESSAGES
)
mod = _role(guild, "2", Permissions.MANAGE_MESSAGES)
member = _member(guild, everyone, mod)
channel = _channel(guild, client)
perms = channel.permissions_for(member)
assert perms & Permissions.MANAGE_MESSAGES
assert perms & Permissions.SEND_MESSAGES
assert perms & Permissions.VIEW_CHANNEL
def test_permissions_for_with_overwrite():
client = DummyClient()
guild = _base_guild(client)
everyone = _role(
guild, guild.id, Permissions.VIEW_CHANNEL | Permissions.SEND_MESSAGES
)
mod = _role(guild, "2", Permissions.MANAGE_MESSAGES)
member = _member(guild, everyone, mod)
channel = _channel(guild, client)
channel.permission_overwrites.append(
PermissionOverwrite(
{
"id": mod.id,
"type": OverwriteType.ROLE.value,
"allow": "0",
"deny": str(int(Permissions.MANAGE_MESSAGES)),
}
)
)
perms = channel.permissions_for(member)
assert not perms & Permissions.MANAGE_MESSAGES
assert perms & Permissions.SEND_MESSAGES
assert perms & Permissions.VIEW_CHANNEL