"""Tests for the secrets page.""" import allure import pytest from selenium.webdriver.common.by import By from selenium.webdriver.remote.webdriver import WebDriver from selenium.webdriver.support.select import Select from tests.integration.types import AdminServer from .helpers.auth import login from .helpers.db import DatabasePreloader from .helpers.wait_helpers import ( wait_for_alert, wait_for_element, wait_for_element_to_be_disabled, wait_for_element_to_be_visisble, wait_for_element_to_disappear, wait_for_element_with_text, ) class TestSecretsPage: """Test secrets page.""" @pytest.fixture(autouse=True) def login(self, ui_admin_server: AdminServer, driver: WebDriver) -> None: """Log in and navigate to secrets page..""" admin_url = ui_admin_server[0] driver = login(ui_admin_server, driver) driver.get(admin_url + "/secrets") @pytest.fixture(autouse=True) def create_testdata(self, ui_admin_server: AdminServer) -> None: """Preload some test data.""" test_clients = ["client1", "client2", "client3"] admin_url, (username, password) = ui_admin_server db = DatabasePreloader(admin_url, username, password) db.create_client(*test_clients) @allure.title("Test secret creation") @allure.description("Verify that secrets can be created") def test_create_secret(self, driver: WebDriver) -> None: """Test creation of secrets.""" driver.refresh() create_secret_button = driver.find_element(By.ID, "createSecretButton") assert create_secret_button is not None create_secret_button.click() wait_for_element_to_be_visisble(driver, "drawer-create-secret-default") drawer = driver.find_element(By.ID, "drawer-create-secret-default") assert drawer is not None name_input = drawer.find_element(By.NAME, "name") value_input = drawer.find_element(By.NAME, "value") client_select = drawer.find_element(By.NAME, "clients") client_select_node = Select(client_select) name_input.send_keys("testsecret") value_input.send_keys("secret") client_select_node.select_by_visible_text("client1") add_secret_button = drawer.find_element(By.XPATH, "//button[@type='submit']") add_secret_button.click() client_appeared = wait_for_element_with_text(driver, "td", "testsecret") assert client_appeared is not False secret_name_field = driver.find_element( By.XPATH, "//tr/td[contains(text(), 'testsecret')]" ) secret_row = secret_name_field.find_element(By.XPATH, "./..") client_field = secret_row.find_element(By.CLASS_NAME, "secret-client-list") secret_client = client_field.find_element( By.XPATH, "//span[contains(text(), 'client1')]" ) assert secret_client is not None @allure.title("Test auto-generating secrets") @allure.description("Test creation of a secret with automatic value") def test_auto_secret_creation(self, driver: WebDriver) -> None: """Test creation of secret with automatic value.""" driver.refresh() create_secret_button = driver.find_element(By.ID, "createSecretButton") assert create_secret_button is not None create_secret_button.click() wait_for_element_to_be_visisble(driver, "drawer-create-secret-default") drawer = driver.find_element(By.ID, "drawer-create-secret-default") assert drawer is not None name_input = drawer.find_element(By.NAME, "name") value_input = drawer.find_element(By.NAME, "value") # The auto generate checkbox is obscured by a dynamic div. # We find the label and its nested div auto_generate_label = drawer.find_element(By.ID, "autoGenerateCheckboxLabel") # find the first div checkbox_div = auto_generate_label.find_element(By.TAG_NAME, "div") checkbox_div.click() wait_for_element_to_be_disabled(driver, By.NAME, "value") client_select = drawer.find_element(By.NAME, "clients") client_select_node = Select(client_select) name_input.send_keys("autosecret") client_select_node.deselect_all() client_select_node.select_by_visible_text("client1") client_select_node.select_by_visible_text("client2") add_secret_button = drawer.find_element(By.XPATH, "//button[@type='submit']") add_secret_button.click() client_appeared = wait_for_element_with_text(driver, "td", "autosecret") secret_name_field = driver.find_element( By.XPATH, "//tr/td[contains(text(), 'autosecret')]" ) secret_row = secret_name_field.find_element(By.XPATH, "./..") client_field = secret_row.find_element(By.CLASS_NAME, "secret-client-list") secret_client1 = client_field.find_element( By.XPATH, "//span[contains(text(), 'client1')]" ) assert secret_client1 is not None secret_client2 = client_field.find_element( By.XPATH, "//span[contains(text(), 'client2')]" ) assert secret_client2 is not None @allure.title("Test manage client access") def test_manage_client_access(self, driver: WebDriver) -> None: """Test the manage client access button.""" # Use the previous step to create a secret assigned to two clients. self.test_auto_secret_creation(driver) driver.refresh() # Find the manage client access button # btn_id = "client-secret-modal-autosecret" manage_btn = driver.find_element(By.ID, "manage-client-access-btn-autosecret") assert manage_btn is not None manage_btn.click() wait_for_element_to_be_visisble(driver, "client-secret-modal-autosecret") modal = driver.find_element(By.ID, "client-secret-modal-autosecret") assert modal is not None client_pills = modal.find_elements(By.CLASS_NAME, "pill-client-secret") assert len(client_pills) == 2 # Remove client1 remove_pill_btn_id = "btn-remove-client-client1-secret-autosecret" remove_btn = modal.find_element(By.ID, remove_pill_btn_id) assert remove_btn is not None remove_btn.click() alert = wait_for_alert(driver) alert.accept() # Wait for the client pill to disappear. wait_for_element_to_disappear( driver, By.XPATH, "//td[@id='secret-client-list-autosecret']/span[contains(text(), 'client1')]", ) # Add a different client. client_select_field = modal.find_element(By.NAME, "client") assert client_select_field is not None assert client_select_field.tag_name == "select" client_select = Select(client_select_field) client_select.select_by_visible_text("client3") give_access = modal.find_element(By.XPATH, "//button[@type='submit']") assert "give access" in give_access.text.lower() give_access.click() wait_for_element(driver, By.ID, "client-secret-autosecret-pill-client3") @allure.title("Test secret deletion") def test_delete_secret(self, driver: WebDriver) -> None: """Test deleting a secret.""" self.test_auto_secret_creation(driver) driver.refresh() delete_btn_id = "delete-secret-btn-autosecret" delete_btn = driver.find_element(By.ID, delete_btn_id) delete_btn.click() alert = wait_for_alert(driver) alert.accept() wait_for_element_to_disappear( driver, By.XPATH, "//td[contains(text(), 'autosecret')]" )