# #region Test.Maintenance.BannerRenderer [C:3] [TYPE Module] [SEMANTICS test, maintenance, banner, renderer, coverage] # @BRIEF Tests for banner renderer — build_banner_text, _build_banner_text_for_dashboard, rebuild_banner. # @RELATION BINDS_TO -> [MaintenanceBannerRenderer] import sys from pathlib import Path sys.path.insert(0, str(Path(__file__).parent.parent.parent.parent / "src")) from datetime import UTC, datetime from unittest.mock import AsyncMock, MagicMock, patch import pytest from src.models.maintenance import ( MaintenanceDashboardBanner, MaintenanceDashboardBannerStatus, MaintenanceDashboardState, MaintenanceDashboardStateStatus, MaintenanceEvent, MaintenanceEventStatus, MaintenanceSettings, ) class TestBuildBannerText: @pytest.fixture def single_event(self): return [{"start_time": "2026-06-15T10:00:00Z", "end_time": "2026-06-15T12:00:00Z", "message": "Scheduled maintenance"}] def test_empty_events(self): from src.services.maintenance._banner_renderer import build_banner_text assert build_banner_text([], "Template") == "" def test_single_event_substitution(self, single_event): from src.services.maintenance._banner_renderer import build_banner_text result = build_banner_text(single_event, "Maintenance: {message} ({start_time} - {end_time})") assert "Scheduled maintenance" in result assert "2026-06-15 10:00" in result assert "2026-06-15 12:00" in result def test_single_event_with_unknown_variables_removed(self): from src.services.maintenance._banner_renderer import build_banner_text events = [{"start_time": None, "end_time": None, "message": "Test"}] result = build_banner_text(events, "Msg: {message} ({unknown_var})") assert "Msg: Test" in result assert "{unknown_var}" not in result def test_multi_event_combined(self): from src.services.maintenance._banner_renderer import build_banner_text events = [ {"start_time": "2026-06-15T10:00:00Z", "end_time": "2026-06-15T12:00:00Z", "message": "First event"}, {"start_time": "2026-06-16T10:00:00Z", "end_time": "2026-06-16T12:00:00Z", "message": "Second event"}, ] result = build_banner_text(events, "Event: {message}") assert "First event" in result assert "Second event" in result assert "---" in result # separator def test_multi_event_with_single_event_path(self): """Multiple events path but len(events)==1 comparison after join.""" from src.services.maintenance._banner_renderer import build_banner_text events = [{"start_time": "2026-06-15T10:00:00Z", "end_time": None, "message": "Test"}] result = build_banner_text(events, "Msg: {message} ({start_time})") assert "Test" in result assert "2026-06-15 10:00" in result def test_html_escaping(self): from src.services.maintenance._banner_renderer import build_banner_text events = [{"start_time": None, "end_time": None, "message": ""}] result = build_banner_text(events, "{message}") assert "<script>" in result assert "