import os import re from typing import Callable, Generator import pytest from playwright.sync_api import APIRequestContext, BrowserContext, Playwright, TimeoutError from pytest_abra import BaseUrl, DirManager @pytest.fixture(scope="session") def api_request_context( playwright: Playwright, DIR: DirManager, ) -> Generator[APIRequestContext, None, None]: state_file = DIR.STATES / "authentik_admin_state.json" request_context = playwright.request.new_context(storage_state=state_file) yield request_context request_context.dispose() @pytest.fixture def check_if_user_exists() -> Callable[[BrowserContext, dict[str, str], BaseUrl], bool]: """This is actually a normal function supplied as a fixture. This is because normal imports from tests_authentik is difficult. tests_authentik is not part of the python environment, so from ... import function will most likely fail. However, pytest handles the loading of fixtures from conftest.py automatically, hence we use that to load functions too.""" def inner_check_if_user_exists(admin_context: BrowserContext, env_config: dict[str, str], URL: BaseUrl) -> bool: # go to admin page page = admin_context.new_page() page.goto(URL.get()) page.get_by_role("link", name="Admin Interface").click() nav = page.locator("ak-sidebar-item", has_text=re.compile(r"Directory|Verzeichnis")) nav.click() nav.get_by_role("link", name=re.compile(r"Users|Benutzer")).click() user = page.get_by_text(os.environ["TEST_USER"]) try: user.wait_for(state="visible", timeout=5_000) return True except TimeoutError: return False return inner_check_if_user_exists