mirror of
https://github.com/Rapptz/discord.py.git
synced 2026-09-21 03:27:42 +00:00
Fix nested UI item parent state
This commit is contained in:
@@ -28,6 +28,12 @@ import discord
|
||||
import pytest
|
||||
|
||||
|
||||
class DynamicButton(discord.ui.DynamicItem[discord.ui.Button], template=r'dynamic:(?P<number>[0-9]+)'):
|
||||
@classmethod
|
||||
async def from_custom_id(cls, interaction, item, match):
|
||||
return cls(discord.ui.Button(label='Dynamic', custom_id=match.group(0)))
|
||||
|
||||
|
||||
def test_add_item_with_full_row():
|
||||
view = discord.ui.View()
|
||||
|
||||
@@ -86,3 +92,91 @@ def test_layout_view_add_item_with_too_many_children():
|
||||
assert view.total_children_count == max_item_limit - 1
|
||||
assert row.view is None
|
||||
assert all(item.view is None for item in row.children)
|
||||
|
||||
|
||||
def test_section_remove_item_clears_view_and_parent():
|
||||
view = discord.ui.LayoutView()
|
||||
section = discord.ui.Section('test', accessory=discord.ui.Button(label='Test'))
|
||||
view.add_item(section)
|
||||
item = section.children[0]
|
||||
|
||||
section.remove_item(item)
|
||||
|
||||
assert item.view is None
|
||||
assert item.parent is None
|
||||
|
||||
|
||||
def test_action_row_remove_item_clears_view_and_parent():
|
||||
view = discord.ui.LayoutView()
|
||||
row = discord.ui.ActionRow()
|
||||
item = discord.ui.Button(label='Test')
|
||||
row.add_item(item)
|
||||
view.add_item(row)
|
||||
|
||||
row.remove_item(item)
|
||||
|
||||
assert item.view is None
|
||||
assert item.parent is None
|
||||
|
||||
|
||||
def test_container_remove_item_clears_view_and_parent():
|
||||
view = discord.ui.LayoutView()
|
||||
container = discord.ui.Container()
|
||||
item = discord.ui.TextDisplay('test')
|
||||
container.add_item(item)
|
||||
view.add_item(container)
|
||||
|
||||
container.remove_item(item)
|
||||
|
||||
assert item.view is None
|
||||
assert item.parent is None
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_action_row_dynamic_item_swap_preserves_parent_checks():
|
||||
calls = []
|
||||
|
||||
class Row(discord.ui.ActionRow):
|
||||
async def interaction_check(self, interaction):
|
||||
calls.append('row')
|
||||
return True
|
||||
|
||||
base = discord.ui.Button(label='Dynamic', custom_id='dynamic:1')
|
||||
row = Row(base)
|
||||
view = discord.ui.LayoutView()
|
||||
view.add_item(row)
|
||||
item = DynamicButton(discord.ui.Button(label='Dynamic', custom_id='dynamic:1'))
|
||||
|
||||
row._swap_item(base, item, 'dynamic:1')
|
||||
await item._run_checks(None)
|
||||
|
||||
assert item.view is view
|
||||
assert item.parent is row
|
||||
assert base.view is None
|
||||
assert base.parent is None
|
||||
assert calls == ['row']
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_container_dynamic_item_swap_preserves_parent_checks():
|
||||
calls = []
|
||||
|
||||
class Container(discord.ui.Container):
|
||||
async def interaction_check(self, interaction):
|
||||
calls.append('container')
|
||||
return True
|
||||
|
||||
base = discord.ui.ActionRow(discord.ui.Button(label='Dynamic', custom_id='dynamic:1'))
|
||||
container = Container(base)
|
||||
view = discord.ui.LayoutView()
|
||||
view.add_item(container)
|
||||
item = DynamicButton(discord.ui.Button(label='Dynamic', custom_id='dynamic:1'))
|
||||
|
||||
container._swap_item(base, item, 'dynamic:1')
|
||||
await item._run_checks(None)
|
||||
|
||||
assert item.view is view
|
||||
assert item.parent is container
|
||||
assert base.view is None
|
||||
assert base.parent is None
|
||||
assert calls == ['container']
|
||||
|
||||
Reference in New Issue
Block a user