"""Regression tests for sanitized Telegram Web live-smoke diagnostics."""

from __future__ import annotations

import importlib.util
import io
import unittest
from contextlib import redirect_stdout
from pathlib import Path

MODULE_PATH = Path(__file__).with_name("telegram_web_qa.py")
SPEC = importlib.util.spec_from_file_location("telegram_web_qa", MODULE_PATH)
assert SPEC is not None and SPEC.loader is not None
qa = importlib.util.module_from_spec(SPEC)
SPEC.loader.exec_module(qa)


class LiveDiagnosticRegressionTest(unittest.TestCase):
    def test_distinct_failures_are_sanitized_and_not_collapsed(self) -> None:
        diagnostics = qa.LiveDiagnostics()
        diagnostics.stage = "state_wait"
        diagnostics.record_event("request", "https://web.telegram.org/a/?token=secret")
        diagnostics.record_event("response", "https://venus.web.telegram.org/api", 200)
        diagnostics.record_event("blocked", "https://example.invalid/private?id=123")

        payload = diagnostics.failure_payload(qa.PlaywrightError("sensitive page text"))

        self.assertEqual(payload["code"], "login_state_failed")
        self.assertEqual(payload["exception_class"], "Error")
        self.assertEqual(payload["stage"], "state_wait")
        self.assertEqual(
            payload["hosts"],
            {"blocked": 1, "official_root": 1, "official_subdomain": 1},
        )
        self.assertEqual(payload["statuses"], {"200": 1})
        self.assertEqual(payload["events"], {"blocked": 1, "request": 1, "response": 1})
        rendered = io.StringIO()
        with redirect_stdout(rendered):
            qa.emit({**payload, "state": "error"})
        output = rendered.getvalue()
        for forbidden in ("secret", "token", "example.invalid", "venus", "private", "123"):
            self.assertNotIn(forbidden, output)

    def test_cleanup_failure_does_not_mask_primary_failure(self) -> None:
        diagnostics = qa.LiveDiagnostics()
        diagnostics.stage = "navigation"
        primary = qa.PlaywrightError("sensitive navigation failure")
        cleanup = PermissionError("sensitive profile path")

        payload = diagnostics.failure_payload(primary, cleanup_error=cleanup)

        self.assertEqual(payload["code"], "navigation_failed")
        self.assertEqual(payload["exception_class"], "Error")
        self.assertEqual(payload["cleanup_exception_class"], "PermissionError")
        self.assertEqual(payload["stage"], "navigation")


if __name__ == "__main__":
    unittest.main()
