{
"event": "PreToolUse",
"tool_name": "Write",
"tool_input": {
"file_path": "\/var\/www\/dev.campus.systemische-tools.de\/crawler\/tests\/unit\/domain\/test_normalized_url.py",
"content": "from __future__ import annotations\n\nimport pytest\n\nfrom src.domain.value_objects.normalized_url import normalize\n\n\ndef test_normalize_lowercases_scheme_and_host() -> None:\n n = normalize(\"HTTPS:\/\/Example.COM\/Path\")\n assert n.scheme == \"https\"\n assert n.host == \"example.com\"\n assert n.path == \"\/Path\"\n\n\ndef test_normalize_strips_default_ports() -> None:\n assert normalize(\"http:\/\/example.com:80\/\").port is None\n assert normalize(\"https:\/\/example.com:443\/\").port is None\n\n\ndef test_normalize_keeps_custom_port() -> None:\n assert normalize(\"http:\/\/example.com:8080\/\").port == 8080\n\n\ndef test_normalize_empty_path_becomes_slash() -> None:\n assert normalize(\"https:\/\/example.com\").path == \"\/\"\n\n\ndef test_normalize_sorts_query_alphabetically() -> None:\n n = normalize(\"https:\/\/example.com\/p?z=1&a=2\")\n assert n.query == \"a=2&z=1\"\n\n\ndef test_normalize_strip_tracking_removes_utm_and_clids() -> None:\n n = normalize(\n \"https:\/\/example.com\/?utm_source=x&ref=keep&gclid=1&fbclid=2\",\n strip_tracking=True,\n )\n assert n.query == \"ref=keep\"\n\n\ndef test_normalize_without_strip_keeps_tracking() -> None:\n n = normalize(\"https:\/\/example.com\/?utm_source=x\", strip_tracking=False)\n assert \"utm_source=x\" in n.query\n\n\ndef test_normalize_hash_is_deterministic_sha256() -> None:\n a = normalize(\"https:\/\/example.com\/?b=2&a=1\")\n b = normalize(\"https:\/\/example.com\/?a=1&b=2\")\n assert a.url_hash == b.url_hash\n assert len(a.url_hash) == 64\n\n\ndef test_normalize_different_urls_get_different_hashes() -> None:\n a = normalize(\"https:\/\/example.com\/a\")\n b = normalize(\"https:\/\/example.com\/b\")\n assert a.url_hash != b.url_hash\n\n\n@pytest.mark.parametrize(\n (\"raw\", \"expected_url\"),\n [\n (\"https:\/\/example.com:8080\/x?a=1\", \"https:\/\/example.com:8080\/x?a=1\"),\n (\"https:\/\/example.com:443\/x\", \"https:\/\/example.com\/x\"),\n ],\n)\ndef test_canonical_url_round_trip(raw: str, expected_url: str) -> None:\n assert normalize(raw).url == expected_url\n"
}
}
{
"tool_response": {
"type": "create",
"filePath": "\/var\/www\/dev.campus.systemische-tools.de\/crawler\/tests\/unit\/domain\/test_normalized_url.py",
"content": "from __future__ import annotations\n\nimport pytest\n\nfrom src.domain.value_objects.normalized_url import normalize\n\n\ndef test_normalize_lowercases_scheme_and_host() -> None:\n n = normalize(\"HTTPS:\/\/Example.COM\/Path\")\n assert n.scheme == \"https\"\n assert n.host == \"example.com\"\n assert n.path == \"\/Path\"\n\n\ndef test_normalize_strips_default_ports() -> None:\n assert normalize(\"http:\/\/example.com:80\/\").port is None\n assert normalize(\"https:\/\/example.com:443\/\").port is None\n\n\ndef test_normalize_keeps_custom_port() -> None:\n assert normalize(\"http:\/\/example.com:8080\/\").port == 8080\n\n\ndef test_normalize_empty_path_becomes_slash() -> None:\n assert normalize(\"https:\/\/example.com\").path == \"\/\"\n\n\ndef test_normalize_sorts_query_alphabetically() -> None:\n n = normalize(\"https:\/\/example.com\/p?z=1&a=2\")\n assert n.query == \"a=2&z=1\"\n\n\ndef test_normalize_strip_tracking_removes_utm_and_clids() -> None:\n n = normalize(\n \"https:\/\/example.com\/?utm_source=x&ref=keep&gclid=1&fbclid=2\",\n strip_tracking=True,\n )\n assert n.query == \"ref=keep\"\n\n\ndef test_normalize_without_strip_keeps_tracking() -> None:\n n = normalize(\"https:\/\/example.com\/?utm_source=x\", strip_tracking=False)\n assert \"utm_source=x\" in n.query\n\n\ndef test_normalize_hash_is_deterministic_sha256() -> None:\n a = normalize(\"https:\/\/example.com\/?b=2&a=1\")\n b = normalize(\"https:\/\/example.com\/?a=1&b=2\")\n assert a.url_hash == b.url_hash\n assert len(a.url_hash) == 64\n\n\ndef test_normalize_different_urls_get_different_hashes() -> None:\n a = normalize(\"https:\/\/example.com\/a\")\n b = normalize(\"https:\/\/example.com\/b\")\n assert a.url_hash != b.url_hash\n\n\n@pytest.mark.parametrize(\n (\"raw\", \"expected_url\"),\n [\n (\"https:\/\/example.com:8080\/x?a=1\", \"https:\/\/example.com:8080\/x?a=1\"),\n (\"https:\/\/example.com:443\/x\", \"https:\/\/example.com\/x\"),\n ],\n)\ndef test_canonical_url_round_trip(raw: str, expected_url: str) -> None:\n assert normalize(raw).url == expected_url\n",
"structuredPatch": [],
"originalFile": null,
"userModified": false
}
}