from unittest.mock import Mock, patch import pytest from webmentions_ssg.url_security import ( NonPublicAddressError, ensure_public_url, ) @patch("webmentions_ssg.url_security.dns.resolver.resolve_name") @pytest.mark.parametrize( ("url", "resolved_addresses"), [ ("http://127.0.0.1/", ["127.0.0.1"]), ("http://127.0.0.1:8080/test", ["127.0.0.1"]), ("http://[::1]/", ["::1"]), ("http://10.0.0.1/", ["10.0.0.1"]), ("http://172.16.0.1/", ["172.16.0.1"]), ("http://192.168.1.1/", ["192.168.1.1"]), ("http://169.254.169.254/", ["169.254.169.254"]), ("http://localhost/", ["127.0.0.1", "::1"]), ("http://internal.example/", ["192.168.1.10"]), ], ) def test_ensure_public_url_rejects_non_public_addresses( resolve_name: Mock, url: str, resolved_addresses: list[str], ) -> None: resolve_name.return_value.addresses.return_value = resolved_addresses with pytest.raises(NonPublicAddressError): ensure_public_url(url)