# #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 "