Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
92 changes: 91 additions & 1 deletion src/cogs/admin/test_announcements.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,29 @@
from discord.app_commands import Choice

from src.cogs.admin.announcements import Announcements
from src.ui.modals.announcement import Announcement
from src.ui.modals.announcement import Announcement, _format_announcement


class TestAnnouncementFormatting(unittest.TestCase):
def test_format_announcement_with_title_uses_single_newline(self):
announcement = _format_announcement("my title", "test")

self.assertEqual(announcement, "# my title\ntest")

def test_format_announcement_with_title_strips_leading_line_breaks_from_content(self):
announcement = _format_announcement("my title", "\n\ntest")

self.assertEqual(announcement, "# my title\ntest")

def test_format_announcement_without_title_has_no_leading_newline(self):
announcement = _format_announcement("", "test")

self.assertEqual(announcement, "test")

def test_format_announcement_with_whitespace_title_treats_it_as_missing(self):
announcement = _format_announcement(" ", "test")

self.assertEqual(announcement, "test")


class TestAnnouncements(IsolatedAsyncioTestCase):
Expand Down Expand Up @@ -49,5 +71,73 @@ async def test_announce_command(self, mock_wait):
self.assertIsInstance(sent_modal, Announcement)
mock_wait.assert_awaited_once()

async def test_on_submit_regular_submission_uses_single_newline(self):
mock_channel = MagicMock()
mock_channel.send = AsyncMock()

mock_interaction = MagicMock(spec=Interaction)
mock_interaction.response = MagicMock()
mock_interaction.response.is_done = MagicMock(return_value=False)
mock_interaction.response.send_message = AsyncMock()
mock_interaction.followup = MagicMock()
mock_interaction.followup.send = AsyncMock()

modal = Announcement(None, mock_channel, "regular")
modal.announcement_title = MagicMock(value="my title")
modal.announcement = MagicMock(value="test")

await modal.on_submit(mock_interaction)

mock_channel.send.assert_awaited_once_with(
content="# my title\ntest",
file=None
)

async def test_on_submit_regular_submission_drops_leading_line_breaks_in_content(self):
mock_channel = MagicMock()
mock_channel.send = AsyncMock()

mock_interaction = MagicMock(spec=Interaction)
mock_interaction.response = MagicMock()
mock_interaction.response.is_done = MagicMock(return_value=False)
mock_interaction.response.send_message = AsyncMock()
mock_interaction.followup = MagicMock()
mock_interaction.followup.send = AsyncMock()

modal = Announcement(None, mock_channel, "regular")
modal.announcement_title = MagicMock(value="my title")
modal.announcement = MagicMock(value="\n\ntest")

await modal.on_submit(mock_interaction)

mock_channel.send.assert_awaited_once_with(
content="# my title\ntest",
file=None
)

async def test_on_submit_embed_submission_skips_leading_newline_without_title(self):
mock_channel = MagicMock()
mock_channel.send = AsyncMock()

mock_interaction = MagicMock(spec=Interaction)
mock_interaction.response = MagicMock()
mock_interaction.response.is_done = MagicMock(return_value=False)
mock_interaction.response.send_message = AsyncMock()
mock_interaction.followup = MagicMock()
mock_interaction.followup.send = AsyncMock()

modal = Announcement(None, mock_channel, "embed")
modal.announcement_title = MagicMock(value=" ")
modal.announcement = MagicMock(value="test")

await modal.on_submit(mock_interaction)

mock_channel.send.assert_awaited_once()
self.assertEqual(
mock_channel.send.await_args.kwargs["embed"].description,
"test"
)
self.assertIsNone(mock_channel.send.await_args.kwargs["file"])

if __name__ == "__main__":
unittest.main()
20 changes: 15 additions & 5 deletions src/ui/modals/announcement.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,17 @@ def _unique(iterable: list) -> list:
return r


def _format_announcement(title: str, content: str) -> str:
"""Build the outgoing announcement body."""
title = title.strip()

if title:
content = content.lstrip("\r\n")
return f"# {title}\n{content}"

return content


class Announcement(Modal, title='Announcement'):
announcement_title = TextInput(
label='Title',
Expand Down Expand Up @@ -57,15 +68,14 @@ def __init__(

async def on_submit(self, interaction: Interaction) -> None:
photo = None
announcement_title = ""

if self.attachment: # If the user has uploaded an attachment
photo = await self.attachment.to_file()

if self.announcement_title.value:
announcement_title = f"**{self.announcement_title.value}**"

announcement = announcement_title + f'\n\n{self.announcement.value}'
announcement = _format_announcement(
self.announcement_title.value,
self.announcement.value
)

if self.mention:
selection_view = AnnouncementView()
Expand Down
Loading