import pytest from unittest.mock import MagicMock, patch import tkinter as tk from installer.screen import render_title, render_paragraph, TerminalConsole @pytest.fixture def mock_app(): app = MagicMock() app.bg_canvas = MagicMock() app._canvas_items = [] return app def test_render_title(mock_app): render_title(mock_app, "Test Title", y=50) mock_app.bg_canvas.create_text.assert_called_once() args, kwargs = mock_app.bg_canvas.create_text.call_args assert args == (48, 50) assert kwargs["text"] == "Test Title" assert len(mock_app._canvas_items) == 1 def test_render_paragraph(mock_app): render_paragraph(mock_app, "Test Paragraph", y=100) mock_app.bg_canvas.create_text.assert_called_once() args, kwargs = mock_app.bg_canvas.create_text.call_args assert args == (48, 100) assert kwargs["text"] == "Test Paragraph" assert len(mock_app._canvas_items) == 1 def test_render_title_no_canvas(): app = MagicMock() app.bg_canvas = None render_title(app, "Title") # Should not raise exception @patch("platform.system", return_value="Darwin") def test_terminal_console(mock_platform): import sys from unittest.mock import MagicMock as _MM # TerminalConsole requires a real tkinter root; skip when tkinter is mocked. if isinstance(sys.modules.get("tkinter"), _MM): pytest.skip("tkinter is mocked in this test run; TerminalConsole needs real tkinter") root = tk.Tk() try: console = TerminalConsole(root) console.write("Hello\n") # In mock or headless env, we might not be able to check text content easily # but we can verify it doesn't crash and state is managed assert console.text.cget("state") == "disabled" console.clear() assert console.text.cget("state") == "disabled" finally: root.destroy()