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 by a fixture. We do this, because imports from tests_authentik are difficult as it is not part of the python environment. We expect from X import function to fail here. 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