Backend

Module for ‘server-side’ state during testing. This module should contain methods for altering said server-side state, which then are responsible for triggering a parse_* call in the configured client state to inform the bot of the change.

This setup matches discord’s actual setup, where an HTTP call triggers a change on the server, which is then sent back to the bot as an event which is parsed and dispatched.

class BackendState(messages: Dict[int, List[Dict[str, Union[str, int, bool, Dict[str, JsonVal], List[JsonVal]]]]], state: discord.ext.test.state.FakeState)

The dpytest backend, with all the state it needs to hold to be able to pretend to be discord. Generally only used internally, but exposed through get_state()

property messages

Alias for field number 0

property state

Alias for field number 1

__slots__ = ()
class FakeRequest(status: int, reason: str)

A fake web response, for use with discord HTTPExceptions

property status

Alias for field number 0

property reason

Alias for field number 1

__slots__ = ()
class FakeHttp(loop: Optional[asyncio.events.AbstractEventLoop] = None)

A mock implementation of an HTTPClient. Instead of actually sending requests to discord, it triggers a runner callback and calls the dpytest backend to update any necessary state and trigger any necessary fake messages to the client.

fileno: ClassVar[int] = 0
__init__(loop: Optional[asyncio.events.AbstractEventLoop] = None)None

Initialize self. See help(type(self)) for accurate signature.

state: discord.ext.test.state.FakeState
async request(*args: Any, **kwargs: Any)NoReturn

Overloaded to raise a NotImplemented error informing the user that the requested operation isn’t yet supported by dpytest. To fix this, the method call that triggered this error should be overloaded below to instead trigger a callback and call the appropriate backend function.

Parameters
  • args – Arguments provided to the request

  • kwargs – Keyword arguments provided to the request

async create_channel(guild_id: int, channel_type: discord.ChannelType, *, reason: Optional[str] = None, **options: Any)Dict[str, Union[str, int, bool, Dict[str, JsonVal], List[JsonVal]]]
async delete_channel(channel_id: int, *, reason: Optional[str] = None)None
async get_channel(channel_id: int)Dict[str, Union[str, int, bool, Dict[str, JsonVal], List[JsonVal]]]
async start_private_message(user_id: int)Dict[str, Union[str, int, bool, Dict[str, JsonVal], List[JsonVal]]]
async send_message(channel_id: int, content: str, *, tts: bool = False, embed: Optional[Dict[str, Union[str, int, bool, Dict[str, JsonVal], List[JsonVal]]]] = None, nonce: Optional[int] = None, allowed_mentions: Optional[Dict[str, Union[str, int, bool, Dict[str, JsonVal], List[JsonVal]]]] = None, message_reference: Optional[Dict[str, Union[str, int, bool, Dict[str, JsonVal], List[JsonVal]]]] = None)Dict[str, Union[str, int, bool, Dict[str, JsonVal], List[JsonVal]]]
async send_typing(channel_id: int)None
async send_files(channel_id: int, *, files: Iterable[discord.File], content: Optional[str] = None, tts: bool = False, embed: Optional[Dict[str, Union[str, int, bool, Dict[str, JsonVal], List[JsonVal]]]] = None, nonce: Optional[int] = None, allowed_mentions: Optional[Dict[str, Union[str, int, bool, Dict[str, JsonVal], List[JsonVal]]]] = None, message_reference: Optional[Dict[str, Union[str, int, bool, Dict[str, JsonVal], List[JsonVal]]]] = None)Dict[str, Union[str, int, bool, Dict[str, JsonVal], List[JsonVal]]]
async delete_message(channel_id: int, message_id: int, *, reason: Optional[str] = None)None
async edit_message(channel_id: int, message_id: int, **fields: Any)Dict[str, Union[str, int, bool, Dict[str, JsonVal], List[JsonVal]]]
async add_reaction(channel_id: int, message_id: int, emoji: str)None
async remove_reaction(channel_id: int, message_id: int, emoji: str, member_id: int)None
async remove_own_reaction(channel_id: int, message_id: int, emoji: str)None
async clear_reactions(channel_id: int, message_id: int)None
async get_message(channel_id: int, message_id: int)Dict[str, Union[str, int, bool, Dict[str, JsonVal], List[JsonVal]]]
async logs_from(channel_id: int, limit: int, before: Optional[int] = None, after: Optional[int] = None, around: Optional[int] = None)List[Dict[str, Union[str, int, bool, Dict[str, JsonVal], List[JsonVal]]]]
async kick(user_id: int, guild_id: int, reason: Optional[str] = None)None
async ban(user_id: int, guild_id: int, delete_message_days: int = 1, reason: Optional[str] = None)None
async change_my_nickname(guild_id: int, nickname: str, *, reason: Optional[str] = None)Dict[str, Union[str, int, bool, Dict[str, JsonVal], List[JsonVal]]]
async edit_member(guild_id: int, user_id: int, *, reason: Optional[str] = None, **fields: Any)None
async get_member(guild_id: int, member_id: int)Dict[str, Union[str, int, bool, Dict[str, JsonVal], List[JsonVal]]]
async edit_role(guild_id: int, role_id: int, *, reason: Optional[str] = None, **fields: Any)Dict[str, Union[str, int, bool, Dict[str, JsonVal], List[JsonVal]]]
async delete_role(guild_id: int, role_id: int, *, reason: Optional[str] = None)None
async create_role(guild_id: int, *, reason: Optional[str] = None, **fields: Any)Dict[str, Union[str, int, bool, Dict[str, JsonVal], List[JsonVal]]]
async move_role_position(guild_id: int, positions: List[Dict[str, Union[str, int, bool, Dict[str, JsonVal], List[JsonVal]]]], *, reason: Optional[str] = None)None
async add_role(guild_id: int, user_id: int, role_id: int, *, reason: Optional[str] = None)None
async remove_role(guild_id: int, user_id: int, role_id: int, *, reason: Optional[str] = None)None
async application_info()Dict[str, Union[str, int, bool, Dict[str, JsonVal], List[JsonVal]]]
async delete_channel_permissions(channel_id: int, target_id: int, *, reason: Optional[str] = None)None
async edit_channel_permissions(channel_id: int, target_id: int, allow_value: int, deny_value: int, perm_type: str, *, reason: Optional[str] = None)None
async get_from_cdn(url: str)bytes
async get_user(user_id: int)Dict[str, Union[str, int, bool, Dict[str, JsonVal], List[JsonVal]]]
async pin_message(channel_id: int, message_id: int, reason: Optional[str] = None)None
async unpin_message(channel_id: int, message_id: int, reason: Optional[str] = None)None
get_state()discord.ext.test.state.FakeState

Get the current backend state, or raise an error if it hasn’t been configured

Returns

Current backend state

make_guild(name: str, members: Optional[List[discord.Member]] = None, channels: Optional[List[Union[discord.TextChannel, discord.CategoryChannel, discord.abc.GuildChannel, discord.abc.PrivateChannel]]] = None, roles: Optional[List[discord.Role]] = None, owner: bool = False, id_num: int = - 1)discord.Guild

Add a new guild to the backend, triggering any relevant callbacks on the configured client

Parameters
  • name – Name of the guild

  • members – Existing members of the guild or None

  • channels – Existing channels in the guild or None

  • roles – Existing roles in the guild or None

  • owner – Whether the configured client owns the guild, default is false

  • id_num – ID of the guild, or nothing to auto-generate

Returns

Newly created guild

update_guild(guild: discord.Guild, roles: Optional[List[discord.Role]] = None)discord.Guild

Update an existing guild with new information, triggers a guild update but not any individual item create/edit calls

Parameters
  • guild – Guild to be updated

  • roles – New role list for the guild

Returns

Updated guild object

make_role(name: str, guild: discord.Guild, id_num: int = - 1, colour: int = 0, color: Optional[int] = None, permissions: int = 104324161, hoist: bool = False, mentionable: bool = False)discord.Role

Add a new role to the backend, triggering any relevant callbacks on the configured client

Parameters
  • name – Name of the new role

  • guild – Guild role is being added to

  • id_num – ID of the new role, or nothing to auto-generate

  • colour – Color of the new role

  • color – Alias for above

  • permissions – Permissions for the new role

  • hoist – Whether the new role is hoisted

  • mentionable – Whether the new role is mentionable

Returns

Newly created role

update_role(role: discord.Role, colour: Optional[int] = None, color: Optional[int] = None, permissions: Optional[int] = None, hoist: Optional[bool] = None, mentionable: Optional[bool] = None, name: Optional[str] = None)discord.Role

Update an existing role with new data, triggering a role update event. Any value not passed/passed None will not update the existing value.

Parameters
  • role – Role to update

  • colour – New color for the role

  • color – Alias for above

  • permissions – New permissions

  • hoist – New hoist value

  • mentionable – New mention value

  • name – New name for the role

Returns

Role that was updated

delete_role(role: discord.Role)None

Remove a role from the backend, deleting it from the guild

Parameters

role – Role to delete

make_text_channel(name: str, guild: discord.Guild, position: int = - 1, id_num: int = - 1, permission_overwrites: Optional[Dict[str, Union[str, int, bool, Dict[str, JsonVal], List[JsonVal]]]] = None, parent_id: Optional[int] = None)discord.TextChannel
make_category_channel(name: str, guild: discord.Guild, position: int = - 1, id_num: int = - 1, permission_overwrites: Optional[Dict[str, Union[str, int, bool, Dict[str, JsonVal], List[JsonVal]]]] = None)discord.CategoryChannel
delete_channel(channel: Union[discord.TextChannel, discord.CategoryChannel, discord.abc.GuildChannel, discord.abc.PrivateChannel])None
update_text_channel(channel: discord.channel.TextChannel, target: Union[discord.user.User, discord.role.Role], override: Optional[discord.permissions.PermissionOverwrite] = <object object>)None
make_user(username: str, discrim: Union[str, int], avatar: Optional[str] = None, id_num: int = - 1)discord.User
make_member(user: Union[discord.user.BaseUser, discord.abc.User], guild: discord.Guild, nick: Optional[str] = None, roles: Optional[List[discord.Role]] = None)discord.Member
update_member(member: discord.Member, nick: Optional[str] = None, roles: Optional[List[discord.Role]] = None)discord.Member
delete_member(member: discord.Member)None
make_message(content: str, author: Union[discord.user.BaseUser, discord.abc.User], channel: Union[discord.TextChannel, discord.CategoryChannel, discord.abc.GuildChannel, discord.abc.PrivateChannel], tts: bool = False, embeds: Optional[List[discord.Embed]] = None, attachments: Optional[List[discord.Attachment]] = None, nonce: Optional[int] = None, id_num: int = - 1)discord.Message
find_user_mentions(content: Optional[str], guild: Optional[discord.Guild])List[discord.Member]
find_role_mentions(content: Optional[str], guild: Optional[discord.Guild])List[int]
find_channel_mentions(content: Optional[str], guild: Optional[discord.Guild])List[Union[discord.TextChannel, discord.CategoryChannel, discord.abc.GuildChannel, discord.abc.PrivateChannel]]
delete_message(message: discord.Message)None
make_attachment(filename: pathlib.Path, name: Optional[str] = None, id_num: int = - 1)discord.Attachment
add_reaction(message: discord.Message, user: Union[discord.user.BaseUser, discord.abc.User], emoji: str)None
remove_reaction(message: discord.Message, user: discord.user.BaseUser, emoji: str)None
clear_reactions(message: discord.Message)
pin_message(channel_id: int, message_id: int)
unpin_message(channel_id: int, message_id: int)
configure(client: discord.Client)None
configure(client: Optional[discord.Client], *, use_dummy: bool = False)None

Configure the backend, optionally with the provided client

Parameters
  • client – Client to use, or None

  • use_dummy – Whether to use a dummy if client param is None, or error