"""Tests for stateless checker helpers."""
import pytest
from scanner.checker import (
    check_links_against_whitelist,
    check_security_headers,
    is_suspicious_url,
)


class TestIsSuspiciousUrl:
    @pytest.mark.parametrize("url", [
        "https://b.info/uploads/shell.php",
        "https://b.info/c99.php",
        "https://b.info/wso.aspx",
        "https://b.info/admin/backdoor.php",
        "https://b.info/webshell.php",
    ])
    def test_flags_webshell_names(self, url):
        assert is_suspicious_url(url) is True

    @pytest.mark.parametrize("url", [
        "https://b.info/index.html",
        "https://b.info/css/app.css",
        "https://b.info/impressum",
        "https://b.info/team/photo.jpg",
        # Regression: legitimate site assets must NOT be flagged
        "https://b.info/assets/js/PSEMailerAntispam.js",
        "https://b.info/navigate.php",
        "https://b.info/uploads/document.pdf",
    ])
    def test_ignores_normal_names(self, url):
        assert is_suspicious_url(url) is False


class TestSecurityHeaders:
    def test_reports_missing(self):
        present = {"Content-Type": "text/html"}
        missing = check_security_headers(present, ["Content-Security-Policy", "X-Content-Type-Options"])
        assert "Content-Security-Policy" in missing

    def test_case_insensitive(self):
        present = {"content-security-policy": "default-src 'self'"}
        missing = check_security_headers(present, ["Content-Security-Policy"])
        assert missing == []


class TestWhitelist:
    def _page(self, ext_url):
        return {
            "links": {"a": [{"url": ext_url, "class": "external"}]},
            "comment_links": [],
            "hidden_content": [],
        }

    def test_flags_unlisted_domain(self):
        page = self._page("https://spam.example.com/x")
        violations = check_links_against_whitelist(page, set(), "b.info")
        assert any(v["domain"] == "spam.example.com" for v in violations)

    def test_allows_listed_domain(self):
        page = self._page("https://good.example.com/x")
        violations = check_links_against_whitelist(page, {"good.example.com"}, "b.info")
        assert violations == []
