Skip to content

Commit

Permalink
add unit tests
Browse files Browse the repository at this point in the history
  • Loading branch information
masci committed Nov 10, 2024
1 parent 1aaecfb commit bff235f
Show file tree
Hide file tree
Showing 3 changed files with 135 additions and 5 deletions.
7 changes: 2 additions & 5 deletions src/banks/filters/image.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,8 @@


def _is_url(string: str) -> bool:
try:
result = urlparse(string)
return all([result.scheme, result.netloc])
except ValueError:
return False
result = urlparse(string)
return all([result.scheme, result.netloc])


def image(value: str) -> str:
Expand Down
92 changes: 92 additions & 0 deletions tests/test_image.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
import json
from pathlib import Path

import pytest

from banks.filters.image import _is_url, image


def test_is_url():
"""Test the internal URL validation function"""
assert _is_url("https://example.com/image.jpg") is True
assert _is_url("http://example.com/image.jpg") is True
assert _is_url("ftp://example.com/image.jpg") is True
assert _is_url("not_a_url.jpg") is False
assert _is_url("/path/to/image.jpg") is False
assert _is_url("relative/path/image.jpg") is False
assert _is_url("") is False
assert _is_url("https:\\example.com/image.jpg") is False


def test_image_with_url():
"""Test image filter with a URL input"""
url = "https://example.com/image.jpg"
result = image(url)

# Verify the content block wrapper
assert result.startswith("<content_block>")
assert result.endswith("</content_block>")

# Parse the JSON content
json_content = result[15:-16] # Remove wrapper tags
content_block = json.loads(json_content)

assert content_block["type"] == "image_url"
assert content_block["image_url"]["url"] == url


def test_image_with_file_path(tmp_path):
"""Test image filter with a file path input"""
# Create a temporary test image file
test_image = tmp_path / "test_image.jpg"
test_content = b"fake image content"
test_image.write_bytes(test_content)

result = image(str(test_image))

# Verify the content block wrapper
assert result.startswith("<content_block>")
assert result.endswith("</content_block>")

# Parse the JSON content
json_content = result[15:-16] # Remove wrapper tags
content_block = json.loads(json_content)

assert content_block["type"] == "image_url"
assert content_block["image_url"]["url"].startswith("data:image/jpeg;base64,")


def test_image_with_nonexistent_file():
"""Test image filter with a nonexistent file path"""
with pytest.raises(FileNotFoundError):
image("nonexistent/image.jpg")


def test_image_content_block_structure():
"""Test the structure of the generated content block"""
url = "https://example.com/image.jpg"
result = image(url)

json_content = result[15:-16] # Remove wrapper tags
content_block = json.loads(json_content)

# Verify the content block has all expected fields
assert set(content_block.keys()) >= {"type", "image_url"}
assert content_block["type"] == "image_url"
assert isinstance(content_block["image_url"], dict)
assert "url" in content_block["image_url"]


@pytest.mark.parametrize(
"invalid_input",
[
"", # empty string
None, # None value
123, # non-string number
True, # boolean
],
)
def test_image_with_invalid_input(invalid_input):
"""Test image filter with various invalid inputs"""
with pytest.raises((IsADirectoryError, ValueError, AttributeError, TypeError)):
image(invalid_input)
41 changes: 41 additions & 0 deletions tests/test_types.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import base64
from pathlib import Path

import pytest

from banks.types import ImageUrl


def test_image_url_from_base64():
"""Test creating ImageUrl from base64 encoded data"""
test_data = "Hello, World!"
base64_data = base64.b64encode(test_data.encode()).decode("utf-8")
media_type = "image/jpeg"

image_url = ImageUrl.from_base64(media_type, base64_data)
expected_url = f"data:{media_type};base64,{base64_data}"
assert image_url.url == expected_url


def test_image_url_from_path(tmp_path):
"""Test creating ImageUrl from a file path"""
# Create a temporary test image file
test_image = tmp_path / "test_image.jpg"
test_content = b"fake image content"
test_image.write_bytes(test_content)

image_url = ImageUrl.from_path(test_image)

# Verify the URL starts with the expected data URI prefix
assert image_url.url.startswith("data:image/jpeg;base64,")

# Decode the base64 part and verify the content matches
base64_part = image_url.url.split(",")[1]
decoded_content = base64.b64decode(base64_part)
assert decoded_content == test_content


def test_image_url_from_path_nonexistent():
"""Test creating ImageUrl from a nonexistent file path"""
with pytest.raises(FileNotFoundError):
ImageUrl.from_path(Path("nonexistent.jpg"))

0 comments on commit bff235f

Please sign in to comment.