from datetime import datetime from pathlib import Path from typing import Protocol from dirmanager import DirManager from dotenv import dotenv_values from icecream import ic from tests_authentik.runner_authentik import RunnerAuthentik from tests_wordpress.runner_wordpress import RunnerWordpress TESTS_DIR = Path("../tests") ENV_FILES = [ Path("../envfiles/login.test.dev.local-it.cloud.env"), # authentik # Path("../envfiles/blog.test.dev.local-it.cloud.env"), # wordpress ] class TestRunner(Protocol): def __init__(self, dotenv_path: Path): ... def run_tests(self): ... # Register all runners here. A .env file with TYPE=authentik will be ran with RunnerAuthentik RUNNER_DICT: dict[str, type[TestRunner]] = { "authentik": RunnerAuthentik, "wordpress": RunnerWordpress, } class Wrapper: def __init__(self, env_files: list[Path]): self.env_files = env_files self.check_env_files(self.env_files) session_id = self.get_session_id() self.setup_test(session_id) self.run_test() def setup_test(self, session_id: str): self.dir_manager = DirManager(tests_dir=TESTS_DIR, session_id=session_id) self.dir_manager.create_all_dirs() def run_test(self): self.runners: list[TestRunner] = self.load_runners(self.env_files) self.run_tests(self.runners) def load_runners(self, env_files: list[Path]) -> list[TestRunner]: runners = [] for env_file in env_files: config: dict[str, str] = dotenv_values(env_file) RunnerClass = RUNNER_DICT[config["TYPE"]] runners.append(RunnerClass(env_file)) return runners def run_tests(self, runners: list[TestRunner]): for runner in runners: runner.run_tests() @staticmethod def check_env_files(env_files: list[Path]): """checks if file exist for every file in list""" for env_file in env_files: assert env_file.is_file() @staticmethod def get_session_id() -> str: current_datetime = datetime.now() return current_datetime.strftime("%Y-%m-%d-%H-%M-%S") if __name__ == "__main__": t = Wrapper(ENV_FILES)