diff --git a/.gitignore b/.gitignore index b447aabb..1f48fc50 100644 --- a/.gitignore +++ b/.gitignore @@ -143,4 +143,5 @@ PythonImportHelper-v2-Completion.json deploy/ # idea -.idea/ \ No newline at end of file +.idea/ +selenium-data/ \ No newline at end of file diff --git a/kdb-bot/test/ui_tests/src/ui_tests_shared/__init__.py b/kdb-bot/test/ui_tests/src/ui_tests_shared/__init__.py new file mode 100644 index 00000000..425ab6c1 --- /dev/null +++ b/kdb-bot/test/ui_tests/src/ui_tests_shared/__init__.py @@ -0,0 +1 @@ +# imports diff --git a/kdb-bot/test/ui_tests/src/ui_tests_shared/command_selectors_enum.py b/kdb-bot/test/ui_tests/src/ui_tests_shared/command_selectors_enum.py new file mode 100644 index 00000000..ceb3d6b0 --- /dev/null +++ b/kdb-bot/test/ui_tests/src/ui_tests_shared/command_selectors_enum.py @@ -0,0 +1,11 @@ +from enum import Enum + + +class CommandSelectorsEnum(Enum): + cmd_chat = '/html/body/div[1]/div[2]/div/div[1]/div/div[2]/div/div[1]/div/div/div[3]/div[2]/main/form/div/div[1]/div/div[3]/div/div[2]/div' + cmd_chat_input = '/html/body/div[1]/div[2]/div/div[1]/div/div[2]/div/div[1]/div/div/div[3]/div/main/form/div/div[2]/div/div[2]/div/div' + + ping = '//*[ contains (text(), ‘Krümmelmonster-test’ ) ]' + info = '//*[ contains (text(), ‘Krümmelmonster-test’ ) ]' + help = '//*[ contains (text(), ‘Krümmelmonster-test’ ) ]' + afk = '//*[ contains (text(), ‘Krümmelmonster-test’ ) ]' diff --git a/kdb-bot/test/ui_tests_shared/command_test_case_with_app.py b/kdb-bot/test/ui_tests_shared/command_test_case_with_app.py index bf5789a7..d2abe048 100644 --- a/kdb-bot/test/ui_tests_shared/command_test_case_with_app.py +++ b/kdb-bot/test/ui_tests_shared/command_test_case_with_app.py @@ -10,6 +10,7 @@ from selenium.webdriver.remote.webelement import WebElement from selenium.webdriver.support import expected_conditions from selenium.webdriver.support.wait import WebDriverWait +from ui_tests.src.ui_tests_shared.command_selectors_enum import CommandSelectorsEnum from ui_tests_shared.test_case_with_app import TestCaseWithApp from ui_tests_shared.ui import UI @@ -27,11 +28,11 @@ class CommandTestCaseWithApp(TestCaseWithApp): cls._t = cls._services.get_service(TranslatePipe) @classmethod - def send_command(cls, cmd: str): + def send_command(cls, cmd: str, selector: CommandSelectorsEnum): UI.driver.get(cls._test_settings.cmd_url) time.sleep(2) - cmd_element_ident = (By.XPATH, '/html/body/div[1]/div[2]/div/div[1]/div/div[2]/div/div[1]/div/div/div[3]/div[2]/main/form/div/div[1]/div/div[3]/div/div[2]/div') + cmd_element_ident = (By.XPATH, CommandSelectorsEnum.cmd_chat.value) cmd_element = UI.driver.find_element(*cmd_element_ident) cmd_element.send_keys(f'/{cmd}') time.sleep(2) @@ -40,9 +41,8 @@ class CommandTestCaseWithApp(TestCaseWithApp): WebDriverWait(UI.driver, 20, ignored_exceptions=ignored_exceptions).until( expected_conditions.presence_of_element_located(( By.XPATH, - '/html/body/div[1]/div[2]/div/div[1]/div/div[2]/div/div[1]/div/div/div[3]/div[2]/main/form/div/div[2]/div/div/div[5]' + selector.value )) ).click() time.sleep(2) - UI.driver.find_element(By.XPATH, '/html/body/div[1]/div[2]/div/div[1]/div/div[2]/div/div[1]/div/div/div[3]/div/main/form/div/div[2]/div/div[2]/div/div').send_keys( - Keys.ENTER) + UI.driver.find_element(By.XPATH, CommandSelectorsEnum.cmd_chat_input.value).send_keys(Keys.ENTER) diff --git a/kdb-bot/test/ui_tests_shared/ui.py b/kdb-bot/test/ui_tests_shared/ui.py index 3dd3a383..e6ac0892 100644 --- a/kdb-bot/test/ui_tests_shared/ui.py +++ b/kdb-bot/test/ui_tests_shared/ui.py @@ -19,8 +19,15 @@ class UI: _test_settings: Optional[TestSettings] = None options = webdriver.ChromeOptions() + options.add_argument("user-data-dir=selenium-data") options.add_experimental_option('useAutomationExtension', False) options.add_experimental_option("excludeSwitches", ["enable-automation"]) + options.add_experimental_option("prefs", { + "profile.default_content_setting_values.media_stream_mic": 1, + "profile.default_content_setting_values.media_stream_camera": 1, + "profile.default_content_setting_values.geolocation": 1, + "profile.default_content_setting_values.notifications": 1 + }) driver = webdriver.Chrome(options=options) _is_logged_in = False @@ -38,7 +45,12 @@ class UI: cls.driver.get(cls._test_settings.login_url) - WebDriverWait(cls.driver, 20).until(expected_conditions.presence_of_element_located((By.NAME, 'email'))) + try: + WebDriverWait(cls.driver, 10).until(expected_conditions.url_matches(cls._test_settings.me_page_url)) + cls._is_logged_in = True + return + except Exception as e: + WebDriverWait(cls.driver, 20).until(expected_conditions.presence_of_element_located((By.NAME, 'email'))) mail_element = cls.driver.find_element(By.NAME, 'email') mail_element.clear() diff --git a/kdb-bot/test/ui_tests_tests/commands/common/afk_command_test_case.py b/kdb-bot/test/ui_tests_tests/commands/common/afk_command_test_case.py new file mode 100644 index 00000000..66f8a776 --- /dev/null +++ b/kdb-bot/test/ui_tests_tests/commands/common/afk_command_test_case.py @@ -0,0 +1,42 @@ +import time + +import discord +from discord import VoiceState +from selenium.webdriver.common.by import By + +from ui_tests.src.ui_tests_shared.command_selectors_enum import CommandSelectorsEnum +from ui_tests_shared.command_test_case_with_app import CommandTestCaseWithApp +from ui_tests_shared.decorators import Async +from ui_tests_shared.ui import UI + + +class AFKCommandTestCase(CommandTestCaseWithApp): + + @Async.test + async def test_error_message(self): + correct_response = self._t.transform('modules.base.afk_command_channel_missing_message') + self.assertIsNotNone(correct_response) + self.send_command('afk', CommandSelectorsEnum.afk) + + def check(m: discord.Message): + return m.content == correct_response and m.author.id == self._test_settings.bot_id + + response = await self._bot.wait_for('message', check=check) + self.assertEqual(response.content, correct_response) + + @Async.test + async def test_move(self): + # correct_response = self._t.transform('modules.base.pong') + # self.assertIsNotNone(correct_response) + UI.driver.find_element(By.XPATH, '//*[@id="channels"]/ul/li[20]/div/div/div/a').click() + time.sleep(1) + + self.send_command('afk', CommandSelectorsEnum.afk) + + def check(member: discord.Member, before: discord.VoiceState, after: discord.VoiceState): + return member.id == self._bot.user.id + + response: VoiceState = await self._bot.wait_for('voice_state_update', check=check) + self.assertIsNotNone(response.channel) + self.assertEqual(response.channel.id, 910199452915093594) + # self.assertEqual(response.content, correct_response) diff --git a/kdb-bot/test/ui_tests_tests/commands/common/help_command_test_case.py b/kdb-bot/test/ui_tests_tests/commands/common/help_command_test_case.py index e6f7b6b4..72594086 100644 --- a/kdb-bot/test/ui_tests_tests/commands/common/help_command_test_case.py +++ b/kdb-bot/test/ui_tests_tests/commands/common/help_command_test_case.py @@ -1,5 +1,6 @@ import discord +from ui_tests.src.ui_tests_shared.command_selectors_enum import CommandSelectorsEnum from ui_tests_shared.command_test_case_with_app import CommandTestCaseWithApp from ui_tests_shared.decorators import Async @@ -9,7 +10,7 @@ class HelpCommandTestCase(CommandTestCaseWithApp): @Async.test async def test_help(self): correct_response = 'https://git.sh-edraft.de/sh-edraft.de/kd_discord_bot/wiki/Befehle' - self.send_command('help') + self.send_command('help', CommandSelectorsEnum.help) def check(m: discord.Message): return m.content == correct_response and m.author.id == self._test_settings.bot_id diff --git a/kdb-bot/test/ui_tests_tests/commands/common/info_command_test_case.py b/kdb-bot/test/ui_tests_tests/commands/common/info_command_test_case.py index 08499404..865d54d0 100644 --- a/kdb-bot/test/ui_tests_tests/commands/common/info_command_test_case.py +++ b/kdb-bot/test/ui_tests_tests/commands/common/info_command_test_case.py @@ -3,11 +3,12 @@ import discord import bot from bot_core.abc.client_utils_service_abc import ClientUtilsServiceABC +from ui_tests.src.ui_tests_shared.command_selectors_enum import CommandSelectorsEnum from ui_tests_shared.command_test_case_with_app import CommandTestCaseWithApp from ui_tests_shared.decorators import Async -class HelpCommandTestCase(CommandTestCaseWithApp): +class InfoCommandTestCase(CommandTestCaseWithApp): def get_embed(self) -> discord.Embed: client_utils: ClientUtilsServiceABC = self._services.get_service(ClientUtilsServiceABC) @@ -36,10 +37,10 @@ class HelpCommandTestCase(CommandTestCaseWithApp): @Async.test async def test_info(self): correct_response = self.get_embed() - self.send_command('info') + self.send_command('info', CommandSelectorsEnum.info) def check(m: discord.Message): - return m.content == correct_response and m.author.id == self._test_settings.bot_id + return m.embeds[0] == correct_response and m.author.id == self._test_settings.bot_id response: discord.Message = await self._bot.wait_for('message', check=check) self.assertEqual(len(response.embeds), 1) diff --git a/kdb-bot/test/ui_tests_tests/commands/common/ping_command_test_case.py b/kdb-bot/test/ui_tests_tests/commands/common/ping_command_test_case.py index 05dae8a4..efc6617f 100644 --- a/kdb-bot/test/ui_tests_tests/commands/common/ping_command_test_case.py +++ b/kdb-bot/test/ui_tests_tests/commands/common/ping_command_test_case.py @@ -1,5 +1,6 @@ import discord +from ui_tests.src.ui_tests_shared.command_selectors_enum import CommandSelectorsEnum from ui_tests_shared.command_test_case_with_app import CommandTestCaseWithApp from ui_tests_shared.decorators import Async @@ -10,7 +11,7 @@ class PingCommandTestCase(CommandTestCaseWithApp): async def test_ping(self): correct_response = self._t.transform('modules.base.pong') self.assertIsNotNone(correct_response) - self.send_command('ping') + self.send_command('ping', CommandSelectorsEnum.ping) def check(m: discord.Message): return m.content == correct_response and m.author.id == self._test_settings.bot_id