diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/unit/__init__.py b/tests/unit/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/unit/miniscord/__init__.py b/tests/unit/miniscord/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/unit/miniscord/test_discord_utils.py b/tests/unit/miniscord/test_discord_utils.py new file mode 100644 index 0000000..74223df --- /dev/null +++ b/tests/unit/miniscord/test_discord_utils.py @@ -0,0 +1,47 @@ +from unittest import TestCase +import asyncio +from unittest.mock import Mock, AsyncMock +import discord +from miniscord._discord_utils import delete_message, message_id + + +class TestDeleteMessage(TestCase): + def setUp(self): + self.loop = asyncio.new_event_loop() + asyncio.set_event_loop(None) + + def tearDown(self): + self.loop.close() + + def test_success(self): + mock = AsyncMock() + self.assertTrue(self.loop.run_until_complete(delete_message(mock))) + mock.delete.assert_awaited_once() + + def test_forbidden(self): + mock = AsyncMock() + mock.delete.side_effect = discord.Forbidden(Mock(), "") + self.assertFalse(self.loop.run_until_complete(delete_message(mock))) + mock.delete.assert_awaited_once() + + def test_not_found(self): + mock = AsyncMock() + mock.delete.side_effect = discord.NotFound(Mock(), "") + self.assertFalse(self.loop.run_until_complete(delete_message(mock))) + mock.delete.assert_awaited_once() + + +class TestMessageId(TestCase): + def test_direct(self): + mock = Mock() + mock.channel.type = discord.ChannelType.private + mock.author.id = "TEST" + self.assertEqual("TEST", message_id(mock)) + + def test_not_direct(self): + mock = Mock() + mock.channel.type = discord.ChannelType.text + mock.guild.id = "TEST1" + mock.channel.id = "TEST2" + mock.author.id = "TEST3" + self.assertEqual("TEST1/TEST2/TEST3", message_id(mock)) diff --git a/tests/unit/miniscord/test_utils.py b/tests/unit/miniscord/test_utils.py new file mode 100644 index 0000000..75674c5 --- /dev/null +++ b/tests/unit/miniscord/test_utils.py @@ -0,0 +1,39 @@ +from unittest import TestCase +from miniscord._utils import sanitize_input, parse_arguments + + +class TestSanitizeInput(TestCase): + def test_no_change(self): + self.assertEqual("abc 0_9", sanitize_input("abc 0_9")) + + def test_lower_trim(self): + self.assertEqual("abc", sanitize_input(" ABC ")) + + def test_remove_special_chars(self): + self.assertEqual("hello id some command", sanitize_input("Hello <@id> ! `some command`")) + + +class TestParseArguments(TestCase): + def test_empty(self): + self.assertEqual([], parse_arguments("")) + + def test_single_arg(self): + self.assertEqual(["abc"], parse_arguments("abc")) + + def test_multi_args(self): + self.assertEqual(["abc", "def", "ghi"], parse_arguments("abc def ghi")) + + def test_quotes(self): + self.assertEqual(["abc def"], parse_arguments("'abc def'")) + + def test_quotes_squotes(self): + self.assertEqual(["abc 'def'"], parse_arguments("\"abc 'def'\"")) + + def test_squotes(self): + self.assertEqual(["abc def"], parse_arguments("\"abc def\"")) + + def test_squotes_quotes(self): + self.assertEqual(["\"abc\" def"], parse_arguments("'\"abc\" def'")) + + def test_complex(self): + self.assertEqual(["abc 'def'", "ghi", "jkl mno"], parse_arguments("\"abc 'def'\" ghi 'jkl mno'"))