"""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