Files
sshecret/tests/frontend/test_secrets.py
2025-05-16 17:38:21 +02:00

190 lines
7.5 KiB
Python

"""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')]"
)