disagreement/tests/test_member.py

114 lines
3.2 KiB
Python

import pytest # pylint: disable=E0401
from disagreement.client import Client
from disagreement.enums import (
VerificationLevel,
MessageNotificationLevel,
ExplicitContentFilterLevel,
MFALevel,
GuildNSFWLevel,
PremiumTier,
)
from disagreement.models import Member, Guild, Role
from disagreement.permissions import Permissions
class DummyClient(Client):
def __init__(self):
super().__init__(token="test")
def _make_member(member_id: str, username: str, nick: str | None):
data = {
"user": {"id": member_id, "username": username, "discriminator": "0001"},
"joined_at": "t",
"roles": [],
}
if nick is not None:
data["nick"] = nick
return Member(data, client_instance=None)
def _base_guild(client: Client) -> Guild:
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 _role(guild: Guild, rid: str, perms: Permissions) -> Role:
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 _member(guild: Guild, client: Client, *roles: Role) -> Member:
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=client)
member.guild_id = guild.id
member._client = client
guild._members.set(member.id, member)
return member
def test_display_name_prefers_nick():
member = _make_member("1", "u", "nickname")
assert member.display_name == "nickname"
def test_display_name_falls_back_to_username():
member = _make_member("2", "u2", None)
assert member.display_name == "u2"
def test_guild_permissions_from_roles():
client = DummyClient()
guild = _base_guild(client)
everyone = _role(guild, guild.id, Permissions.VIEW_CHANNEL)
mod = _role(guild, "2", Permissions.MANAGE_MESSAGES)
member = _member(guild, client, everyone, mod)
perms = member.guild_permissions
assert perms & Permissions.VIEW_CHANNEL
assert perms & Permissions.MANAGE_MESSAGES
assert not perms & Permissions.BAN_MEMBERS
def test_guild_permissions_administrator_role_grants_all():
client = DummyClient()
guild = _base_guild(client)
admin = _role(guild, "2", Permissions.ADMINISTRATOR)
member = _member(guild, client, admin)
assert member.guild_permissions == Permissions(~0)