webdrop-bridge/tests/unit/test_url_converter.py
2026-02-19 15:16:05 +01:00

144 lines
4.6 KiB
Python

"""Unit tests for URL converter."""
from pathlib import Path
import pytest
from webdrop_bridge.config import Config, URLMapping
from webdrop_bridge.core.url_converter import URLConverter
@pytest.fixture
def test_config():
"""Create test configuration with URL mappings."""
return Config(
app_name="Test App",
app_version="1.0.0",
log_level="INFO",
log_file=None,
allowed_roots=[],
allowed_urls=[],
webapp_url="https://dev.agravity.io/",
url_mappings=[
URLMapping(
url_prefix="https://devagravitystg.file.core.windows.net/devagravitysync/",
local_path="Z:"
),
URLMapping(
url_prefix="https://other.blob.core.windows.net/container/",
local_path="Y:\\shared"
)
]
)
@pytest.fixture
def converter(test_config):
"""Create URL converter with test config."""
return URLConverter(test_config)
def test_convert_simple_url(converter):
"""Test converting a simple Azure URL to local path."""
url = "https://devagravitystg.file.core.windows.net/devagravitysync/test/file.png"
result = converter.convert_url_to_path(url)
assert result is not None
assert str(result).endswith("test\\file.png") # Windows path separator
def test_convert_url_with_special_characters(converter):
"""Test URL with special characters (URL encoded)."""
url = "https://devagravitystg.file.core.windows.net/devagravitysync/folder/file%20with%20spaces.png"
result = converter.convert_url_to_path(url)
assert result is not None
assert "file with spaces.png" in str(result)
def test_convert_url_with_subdirectories(converter):
"""Test URL with deep directory structure."""
url = "https://devagravitystg.file.core.windows.net/devagravitysync/aN5PysnXIuRECzcRbvHkjL7g0/subfolder/file.png"
result = converter.convert_url_to_path(url)
assert result is not None
assert "aN5PysnXIuRECzcRbvHkjL7g0" in str(result)
assert "subfolder" in str(result)
def test_convert_unmapped_url(converter):
"""Test URL that doesn't match any mapping."""
url = "https://unknown.blob.core.windows.net/container/file.png"
result = converter.convert_url_to_path(url)
assert result is None
def test_convert_empty_url(converter):
"""Test empty URL."""
result = converter.convert_url_to_path("")
assert result is None
def test_convert_none_url(converter):
"""Test None URL."""
result = converter.convert_url_to_path(None)
assert result is None
def test_is_azure_url_positive(converter):
"""Test recognizing valid Azure URLs."""
url = "https://devagravitystg.file.core.windows.net/devagravitysync/file.png"
assert converter.is_azure_url(url) is True
def test_is_azure_url_negative(converter):
"""Test rejecting non-Azure URLs."""
assert converter.is_azure_url("https://example.com/file.png") is False
assert converter.is_azure_url("Z:\\file.png") is False
assert converter.is_azure_url("") is False
def test_multiple_mappings(converter):
"""Test that correct mapping is used for URL."""
url1 = "https://devagravitystg.file.core.windows.net/devagravitysync/file.png"
url2 = "https://other.blob.core.windows.net/container/file.png"
result1 = converter.convert_url_to_path(url1)
result2 = converter.convert_url_to_path(url2)
assert result1 is not None
assert result2 is not None
assert str(result1).startswith("Z:")
assert str(result2).startswith("Y:")
def test_url_mapping_validation_http():
"""Test that URL mapping requires http:// or https://."""
with pytest.raises(Exception): # ConfigurationError
URLMapping(
url_prefix="ftp://server/path/",
local_path="Z:"
)
def test_url_mapping_adds_trailing_slash():
"""Test that URL mapping adds trailing slash if missing."""
mapping = URLMapping(
url_prefix="https://example.com/path",
local_path="Z:"
)
assert mapping.url_prefix.endswith("/")
def test_convert_url_example_from_docs(converter):
"""Test the exact example from documentation."""
url = "https://devagravitystg.file.core.windows.net/devagravitysync/aN5PysnXIuRECzcRbvHkjL7g0/Hintergrund_Agravity.png"
result = converter.convert_url_to_path(url)
assert result is not None
# Should be: Z:\aN5PysnXIuRECzcRbvHkjL7g0\Hintergrund_Agravity.png
expected_parts = ["Z:", "aN5PysnXIuRECzcRbvHkjL7g0", "Hintergrund_Agravity.png"]
result_str = str(result)
for part in expected_parts:
assert part in result_str