diff --git a/bot/extensions/translator_cog.py b/bot/extensions/translator_cog.py index c807299..9886991 100644 --- a/bot/extensions/translator_cog.py +++ b/bot/extensions/translator_cog.py @@ -20,9 +20,9 @@ async def language_autocomplete(_: Interaction, current: str) -> list[Choice[str return [ Choice(name=language.capitalize(), value=language) - for language in languages[:25] + for language in languages if current.lower() in language.lower() - ] + ][:25] class TranslatorCog( @@ -36,13 +36,16 @@ class TranslatorCog( usage="sentence={sentence}", ) @autocomplete(translate_into=language_autocomplete) - async def translator(self, ctx: Context, *, sentence: str, translate_into: str): + @autocomplete(translate_from=language_autocomplete) + async def translator(self, ctx: Context, *, sentence: str, translate_from: str | None = "auto", translate_into: str): """Translate a sentence or word from any language into any languages. :param ctx: The context object. :type ctx: Context :param sentence: The sentence or word to be translated. :type sentence: str + :param translate_from: The language code for the source language. + :type translate_from: str | None :param translate_into: The language code for the target language. :type translate_into: str :return: Embed with original input and its translation @@ -50,7 +53,7 @@ async def translator(self, ctx: Context, *, sentence: str, translate_into: str): await ctx.defer() text_translator = Translator() - translated_text = text_translator.translate(sentence, dest=translate_into) + translated_text = text_translator.translate(sentence, src=translate_from, dest=translate_into) embed = Embed(color=self.bot.default_color) @@ -60,8 +63,8 @@ async def translator(self, ctx: Context, *, sentence: str, translate_into: str): inline=False, ) embed.add_field( - name=f"{translate_into} Translation", - value=translated_text.text, + name=f"{translate_into.capitalize()} Translation", + value=translated_text.text.capitalize(), inline=False, ) diff --git a/tests/extensions/conftest.py b/tests/extensions/conftest.py new file mode 100644 index 0000000..46ac231 --- /dev/null +++ b/tests/extensions/conftest.py @@ -0,0 +1,13 @@ +from unittest.mock import MagicMock + +import pytest + + +@pytest.fixture +def mock_bot(): + """Create a mock Discord bot instance.""" + bot = MagicMock() + bot.default_color = 0xFFFFFF + bot.app.config.get = MagicMock(return_value=None) + bot.scheduler = MagicMock() + return bot diff --git a/tests/extensions/test_reminder_cog.py b/tests/extensions/test_reminder_cog.py index bb57999..eb44dc6 100644 --- a/tests/extensions/test_reminder_cog.py +++ b/tests/extensions/test_reminder_cog.py @@ -1,6 +1,6 @@ import re from datetime import UTC, datetime, timedelta -from unittest.mock import AsyncMock, MagicMock +from unittest.mock import AsyncMock import pytest from dateutil.tz import tzlocal @@ -10,16 +10,6 @@ from bot.extensions.reminder_cog import ReminderCog -@pytest.fixture -def mock_bot(): - """Create a mock Discord bot instance.""" - bot = MagicMock() - bot.default_color = 0xFFFFFF - bot.app.config.get = MagicMock(return_value=None) - bot.scheduler = MagicMock() - return bot - - @pytest.fixture def reminder_cog(mock_bot): """Instantiate the ReminderCog with a mock bot.""" diff --git a/tests/extensions/test_threads_cog.py b/tests/extensions/test_threads_cog.py index 8fddf69..c71f67e 100644 --- a/tests/extensions/test_threads_cog.py +++ b/tests/extensions/test_threads_cog.py @@ -6,16 +6,6 @@ from bot.models.extensions.thread import Thread -@pytest.fixture -def mock_bot(): - """Create a mock Discord bot instance.""" - bot = MagicMock() - bot.default_color = 0xFFFFFF - bot.app.config.get = MagicMock(return_value=None) - bot.scheduler = MagicMock() - return bot - - @pytest.fixture def threads_cog(mock_bot): """Instantiate the ThreadsCog with a mock bot.""" diff --git a/tests/extensions/test_time_cog.py b/tests/extensions/test_time_cog.py index ea06e3a..e1e5f5e 100644 --- a/tests/extensions/test_time_cog.py +++ b/tests/extensions/test_time_cog.py @@ -7,12 +7,6 @@ from bot.extensions.time_cog import TimeCog -@pytest.fixture -def mock_bot(): - """Create a mock Discord bot instance.""" - return MagicMock() - - @pytest.fixture def time_cog(mock_bot): """Instantiate the TimeCog with a mock bot.""" diff --git a/tests/extensions/test_translator_cog.py b/tests/extensions/test_translator_cog.py new file mode 100644 index 0000000..7be93f5 --- /dev/null +++ b/tests/extensions/test_translator_cog.py @@ -0,0 +1,73 @@ +from unittest.mock import AsyncMock, MagicMock + +import pytest +from discord import Embed +from discord.app_commands import Choice + +from bot.extensions.translator_cog import TranslatorCog, language_autocomplete + + +@pytest.fixture +def translator_cog(mock_bot): + """Instantiate the TranslatorCog with a mock bot.""" + + return TranslatorCog(mock_bot) + +@pytest.mark.asyncio +async def test_translator(translator_cog, mock_bot): + ctx = MagicMock() + ctx.defer = AsyncMock() + ctx.send = AsyncMock() + + translate_from = "English" + translate_into = "Arabic" + sentence = "Funny" + translated_text = "مضحك" + + await translator_cog.translator( + translator_cog, + ctx, + sentence="Funny", + translate_from="English", + translate_into="Arabic" + ) + + result = Embed(color=mock_bot.default_color) + + result.add_field( + name=f"{translate_from} Original", + value=sentence, + inline=False, + ) + result.add_field( + name=f"{translate_into} Translation", + value=translated_text, + inline=False, + ) + + ctx.send.assert_awaited_once_with(embed=result) + + +@pytest.mark.asyncio +async def test_language_autocomplete_empty_input(): + empty = await language_autocomplete(None, "") + assert len(empty) == 25 + +@pytest.mark.asyncio +async def test_language_autocomplete_invalid_input(): + invalid = await language_autocomplete(None, "1232") + assert invalid == [] + +@pytest.mark.asyncio +async def test_language_autocomplete_ara_input(): + ara = await language_autocomplete(None, "ara") + assert ara == [ + Choice(name='Arabic', value='arabic'), + Choice(name='Gujarati', value='gujarati'), + Choice(name='Marathi', value='marathi') + ] + +@pytest.mark.asyncio +async def test_language_autocomplete_zu_input(): + zu = await language_autocomplete(None, "zu") + assert zu == [Choice(name='Zulu', value='zulu')]