prole/tests/installer/test_gitops_choice_screen.py

92 lines
3.2 KiB
Python

"""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()