Update tests
This commit is contained in:
1
tests/frontend/helpers/__init__.py
Normal file
1
tests/frontend/helpers/__init__.py
Normal file
@ -0,0 +1 @@
|
||||
|
||||
30
tests/frontend/helpers/auth.py
Normal file
30
tests/frontend/helpers/auth.py
Normal file
@ -0,0 +1,30 @@
|
||||
"""Auth helpers."""
|
||||
|
||||
from selenium.webdriver.common.by import By
|
||||
from selenium.webdriver.remote.webdriver import WebDriver
|
||||
from tests.integration.types import AdminServer
|
||||
from .wait_helpers import wait_until_url_contains
|
||||
|
||||
def login(ui_admin_server: AdminServer, driver: WebDriver) -> WebDriver:
|
||||
"""Log in."""
|
||||
admin_url, credentials = ui_admin_server
|
||||
username, password = credentials
|
||||
|
||||
driver.get(admin_url + "/login")
|
||||
username_input = driver.find_element(By.NAME, "username")
|
||||
password_input = driver.find_element(By.NAME, "password")
|
||||
submit_button = driver.find_element(By.XPATH, "//button[@type='submit']")
|
||||
assert username_input is not None
|
||||
assert password_input is not None
|
||||
assert submit_button.text.lower() == "sign in"
|
||||
|
||||
username_input.clear()
|
||||
username_input.send_keys(username)
|
||||
password_input.send_keys(password)
|
||||
|
||||
|
||||
submit_button.click()
|
||||
|
||||
wait_until_url_contains(driver, "/dashboard")
|
||||
|
||||
return driver
|
||||
66
tests/frontend/helpers/db.py
Normal file
66
tests/frontend/helpers/db.py
Normal file
@ -0,0 +1,66 @@
|
||||
"""Database helpers.
|
||||
|
||||
Allows pre-loading database for tests.
|
||||
"""
|
||||
|
||||
from collections.abc import Iterator
|
||||
from contextlib import contextmanager
|
||||
import httpx
|
||||
from sshecret.crypto import generate_private_key, generate_public_key_string
|
||||
|
||||
|
||||
class DatabasePreloader:
|
||||
"""Database preloader class."""
|
||||
|
||||
def __init__(self, admin_url: str, username: str, password: str) -> None:
|
||||
"""Instantiate class to populate database."""
|
||||
self.admin_url: str = admin_url
|
||||
self.username: str = username
|
||||
self.password: str = password
|
||||
|
||||
@contextmanager
|
||||
def login(self) -> Iterator[httpx.Client]:
|
||||
"""Login and yield client."""
|
||||
login_client = httpx.Client(base_url=self.admin_url)
|
||||
resp = login_client.post(
|
||||
"api/v1/token",
|
||||
data={"username": self.username, "password": self.password}
|
||||
)
|
||||
assert resp.status_code == 200
|
||||
data = resp.json()
|
||||
token = data["access_token"]
|
||||
headers = {"Authorization": f"Bearer {token}"}
|
||||
with httpx.Client(base_url=self.admin_url, headers=headers) as client:
|
||||
yield client
|
||||
|
||||
def create_client(self, *names: str) -> None:
|
||||
"""Create one or more clients."""
|
||||
with self.login() as http_client:
|
||||
for name in names:
|
||||
private_key = generate_private_key()
|
||||
public_key = generate_public_key_string(private_key.public_key())
|
||||
data = {
|
||||
"name": name,
|
||||
"description": "Test client",
|
||||
"public_key": public_key,
|
||||
"sources": ["0.0.0.0/0", "::/0"],
|
||||
}
|
||||
resp = http_client.post("api/v1/clients/", json=data)
|
||||
resp.raise_for_status()
|
||||
|
||||
def create_secret(self, *secrets: tuple[str, list[str]]) -> None:
|
||||
"""Create secret.
|
||||
|
||||
Argument format is (secret_name, [client1, client2, ...])
|
||||
|
||||
Clients must exist.
|
||||
"""
|
||||
with self.login() as http_client:
|
||||
for name, clients in secrets:
|
||||
data = {
|
||||
"name": name,
|
||||
"clients": clients,
|
||||
"value": {"auto_generate": True, "length": 32}
|
||||
}
|
||||
|
||||
http_client.post("api/v1/secrets/", json=data)
|
||||
63
tests/frontend/helpers/wait_helpers.py
Normal file
63
tests/frontend/helpers/wait_helpers.py
Normal file
@ -0,0 +1,63 @@
|
||||
"""
|
||||
Collection of waiting statements.
|
||||
"""
|
||||
|
||||
from selenium.webdriver.remote.webdriver import WebDriver
|
||||
from selenium.webdriver.support.ui import WebDriverWait
|
||||
from selenium.webdriver.support import expected_conditions as EC
|
||||
from selenium.webdriver.common.by import By
|
||||
|
||||
|
||||
def wait_for_url_change(driver: WebDriver, old_url: str, timeout: int = 10) -> None:
|
||||
WebDriverWait(driver, timeout).until(lambda d: d.current_url != old_url)
|
||||
|
||||
|
||||
def wait_until_url_contains(driver: WebDriver, text: str, timeout: int = 10) -> None:
|
||||
WebDriverWait(driver, timeout).until(lambda d: text in d.current_url)
|
||||
|
||||
|
||||
def wait_for_element(driver: WebDriver, by: str, value: str, timeout: int = 10):
|
||||
return WebDriverWait(driver, timeout).until(
|
||||
EC.presence_of_element_located((by, value))
|
||||
)
|
||||
|
||||
|
||||
def wait_for_element_with_text(
|
||||
driver: WebDriver, tag: str, text: str, timeout: int = 10
|
||||
):
|
||||
return WebDriverWait(driver, timeout).until(
|
||||
EC.text_to_be_present_in_element((By.TAG_NAME, tag), text)
|
||||
)
|
||||
|
||||
|
||||
def wait_for_clickable(driver: WebDriver, by: str, value: str, timeout: int = 10):
|
||||
return WebDriverWait(driver, timeout).until(EC.element_to_be_clickable((by, value)))
|
||||
|
||||
|
||||
def wait_for_element_to_be_visisble(driver: WebDriver, id: str, timeout: int = 10):
|
||||
return WebDriverWait(driver, timeout).until(
|
||||
EC.visibility_of_element_located((By.ID, id))
|
||||
)
|
||||
|
||||
|
||||
def wait_for_element_to_be_disabled(
|
||||
driver: WebDriver, by: str, value: str, timeout: int = 10
|
||||
):
|
||||
"""Wait for an element to be disabled."""
|
||||
return WebDriverWait(driver, timeout).until(
|
||||
EC.none_of(EC.element_to_be_clickable((by, value)))
|
||||
)
|
||||
|
||||
|
||||
def wait_for_alert(driver: WebDriver, timeout: int = 10):
|
||||
"""Wait for an alert."""
|
||||
return WebDriverWait(driver, timeout).until(lambda d: d.switch_to.alert)
|
||||
|
||||
|
||||
def wait_for_element_to_disappear(
|
||||
driver: WebDriver, by: str, value: str, timeout: int = 10
|
||||
):
|
||||
"""Wait for an element to disappear."""
|
||||
return WebDriverWait(driver, timeout).until(
|
||||
EC.none_of(EC.presence_of_element_located((by, value)))
|
||||
)
|
||||
Reference in New Issue
Block a user