""" Getting Started checklist: what the server decides, and what it must not. The timezone step used to tick server-side when the saved timezone differed from the shipped default, OR-ed with the saved city. That made the step unsatisfiable for anyone genuinely in the default zone (the card nagged forever), and let a saved city tick it off while the timezone was still wrong. The step is now verified in the browser against its own zone, so the server's only job is to hand over the configured value and stay out of the decision. These tests pin that contract: the panel-size step still reflects config, the timezone step never pre-ticks, it carries the configured zone, and the city has no influence on it. """ import copy import re import sys from pathlib import Path from unittest.mock import MagicMock import pytest from flask import Flask PROJECT_ROOT = Path(__file__).parent.parent sys.path.insert(0, str(PROJECT_ROOT)) BASE_CONFIG = { "timezone": "America/New_York", "location": {"city": "Tampa", "state": "Florida", "country": "US"}, "display": { "hardware": {"rows": 32, "cols": 64, "chain_length": 2, "parallel": 1}, "runtime": {}, "double_sided": {"enabled": False}, "vegas_scroll": {"plugin_order": [], "excluded_plugins": []}, "plugin_rotation_order": [], }, "plugin_system": {}, "schedule": {}, "dim_schedule": {}, "sync": {}, } def render(config): """Render the overview partial against one config, as app.py would.""" base = PROJECT_ROOT / "web_interface" app = Flask( __name__, template_folder=str(base / "templates"), static_folder=str(base / "static"), ) app.config["TESTING"] = True from web_interface.blueprints import pages_v3 as pv # pages_v3 is a module-level singleton shared across the test process; # restore whatever the previous test left on it. original_cm = getattr(pv.pages_v3, "config_manager", None) original_pm = getattr(pv.pages_v3, "plugin_manager", None) mock_cm = MagicMock() mock_cm.load_config.return_value = config mock_cm.get_raw_file_content.return_value = config pv.pages_v3.config_manager = mock_cm mock_pm = MagicMock() mock_pm.plugins = {} mock_pm.get_all_plugin_info.return_value = [] mock_pm.get_plugin_display_modes.side_effect = lambda pid: [] pv.pages_v3.plugin_manager = mock_pm app.register_blueprint(pv.pages_v3, url_prefix="") try: resp = app.test_client().get("/partials/overview") assert resp.status_code == 200, resp.status_code return resp.get_data(as_text=True) finally: pv.pages_v3.config_manager = original_cm pv.pages_v3.plugin_manager = original_pm def timezone_step(body): """The checklist