from __future__ import annotations

import socket

import pytest

from app.network_security import normalize_origin, validate_media_reference, validate_public_media_url


def test_normalize_origin_rejects_paths() -> None:
    with pytest.raises(ValueError):
        normalize_origin("https://example.com/chgrid")


def test_normalize_origin_normalizes_case_and_trailing_slash() -> None:
    assert normalize_origin("HTTPS://Example.COM:443/") == "https://example.com:443"


def test_validate_public_media_url_rejects_private_ip() -> None:
    with pytest.raises(ValueError):
        validate_public_media_url("http://127.0.0.1/audio")


def test_validate_public_media_url_resolves_hostname(monkeypatch: pytest.MonkeyPatch) -> None:
    def fake_getaddrinfo(host: str, port, type: int = 0):
        assert host == "radio.example.com"
        return [(socket.AF_INET, type, 6, "", ("93.184.216.34", 0))]

    monkeypatch.setattr(socket, "getaddrinfo", fake_getaddrinfo)

    assert validate_public_media_url("https://Radio.Example.com/live") == "https://radio.example.com/live"


def test_validate_public_media_url_rejects_private_resolution(monkeypatch: pytest.MonkeyPatch) -> None:
    def fake_getaddrinfo(host: str, port, type: int = 0):
        assert host == "radio.example.com"
        return [(socket.AF_INET, type, 6, "", ("10.0.0.5", 0))]

    monkeypatch.setattr(socket, "getaddrinfo", fake_getaddrinfo)

    with pytest.raises(ValueError):
        validate_public_media_url("https://radio.example.com/live")


def test_validate_media_reference_allows_site_relative_path() -> None:
    assert validate_media_reference("/chgrid/media_proxy.php?url=test") == "/chgrid/media_proxy.php?url=test"
