144 lines
4.6 KiB
Python
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
|