"""Tests for the GitOps provider choice screen (_render_gitops_choice_page).""" from __future__ import annotations import sys import tkinter as tk from pathlib import Path PROJECT_ROOT = Path(__file__).resolve().parents[2] if str(PROJECT_ROOT) not in sys.path: sys.path.insert(0, str(PROJECT_ROOT)) from knoe.ui.screens.base import ScreenBaseMixin from knoe.ui.screens.gitops import GitOpsScreenMixin class _DummyGitOpsApp(ScreenBaseMixin, GitOpsScreenMixin): """Minimal surface to render the GitOps choice screen.""" def __init__(self, root: tk.Tk, canvas: tk.Canvas): self.root = root self.bg_canvas = canvas self._canvas_items: list[int] = [] self._overlay_widgets: list[tk.Widget] = [] self.gitops_provider = tk.StringVar(master=root, value="gitea") self.gitops_enabled = tk.BooleanVar(master=root, value=False) self.argocd_enabled = tk.BooleanVar(master=root, value=False) self.knoe_cfg_data: dict = {} def _save_knoe_cfg(self): pass def _canvas_texts(cnv: tk.Canvas) -> list[str]: return [ cnv.itemcget(item, "text") for item in cnv.find_all() if cnv.type(item) == "text" ] def test_gitops_choice_page_renders_title_and_options(): """The choice screen must render a title and all three provider options.""" root = tk.Tk() root.withdraw() try: canvas = tk.Canvas(root, width=975, height=600, bg="white") canvas.pack(fill="both", expand=False) root.update() app = _DummyGitOpsApp(root, canvas) app._render_gitops_choice_page() root.update() texts = _canvas_texts(canvas) assert "GitOps Provider" in texts # All three provider labels must appear as Radiobutton text (widget titles). widget_texts = [w.cget("text") for w in app._overlay_widgets if isinstance(w, tk.Radiobutton)] assert any("Gitea" in t for t in widget_texts) assert any("ArgoCD" in t for t in widget_texts) assert any("None" in t for t in widget_texts) finally: root.destroy() def test_on_gitops_provider_change_syncs_boolean_vars(): """Selecting a provider must update gitops_enabled and argocd_enabled accordingly.""" root = tk.Tk() root.withdraw() try: canvas = tk.Canvas(root, width=975, height=600, bg="white") canvas.pack() root.update() app = _DummyGitOpsApp(root, canvas) app.gitops_provider.set("gitea") app._on_gitops_provider_change() assert app.gitops_enabled.get() is True assert app.argocd_enabled.get() is False assert app.knoe_cfg_data["Optional Features"]["GITOPS_PROVIDER"] == "gitea" app.gitops_provider.set("argocd") app._on_gitops_provider_change() assert app.gitops_enabled.get() is False assert app.argocd_enabled.get() is True assert app.knoe_cfg_data["Optional Features"]["ARGOCD_ENABLED"] == "True" app.gitops_provider.set("none") app._on_gitops_provider_change() assert app.gitops_enabled.get() is False assert app.argocd_enabled.get() is False assert app.knoe_cfg_data["Optional Features"]["GITOPS_PROVIDER"] == "none" finally: root.destroy()