All checks were successful
Python CI / test (push) Successful in 1m44s
Lint / lint (push) Successful in 1m29s
Tests / test (3.11) (push) Successful in 1m49s
Tests / test (3.12) (push) Successful in 1m52s
Tests / test (3.13) (push) Successful in 1m45s
Tests / test (3.14) (push) Successful in 1m28s
Improved pdf generation speed
281 lines
9.9 KiB
Python
281 lines
9.9 KiB
Python
"""
|
|
Unit tests for FrameManager class and frame definitions
|
|
"""
|
|
|
|
import pytest
|
|
from pyPhotoAlbum.frame_manager import (
|
|
FrameManager,
|
|
FrameDefinition,
|
|
FrameCategory,
|
|
FrameType,
|
|
get_frame_manager,
|
|
)
|
|
|
|
|
|
class TestFrameCategory:
|
|
"""Tests for FrameCategory enum"""
|
|
|
|
def test_modern_category_value(self):
|
|
"""Test MODERN category has correct value"""
|
|
assert FrameCategory.MODERN.value == "modern"
|
|
|
|
def test_vintage_category_value(self):
|
|
"""Test VINTAGE category has correct value"""
|
|
assert FrameCategory.VINTAGE.value == "vintage"
|
|
|
|
def test_geometric_category_value(self):
|
|
"""Test GEOMETRIC category has correct value"""
|
|
assert FrameCategory.GEOMETRIC.value == "geometric"
|
|
|
|
def test_custom_category_value(self):
|
|
"""Test CUSTOM category has correct value"""
|
|
assert FrameCategory.CUSTOM.value == "custom"
|
|
|
|
|
|
class TestFrameType:
|
|
"""Tests for FrameType enum"""
|
|
|
|
def test_corners_type_value(self):
|
|
"""Test CORNERS type has correct value"""
|
|
assert FrameType.CORNERS.value == "corners"
|
|
|
|
def test_full_type_value(self):
|
|
"""Test FULL type has correct value"""
|
|
assert FrameType.FULL.value == "full"
|
|
|
|
def test_edges_type_value(self):
|
|
"""Test EDGES type has correct value"""
|
|
assert FrameType.EDGES.value == "edges"
|
|
|
|
|
|
class TestFrameDefinition:
|
|
"""Tests for FrameDefinition dataclass"""
|
|
|
|
def test_basic_frame_definition(self):
|
|
"""Test creating a basic frame definition"""
|
|
frame = FrameDefinition(
|
|
name="test_frame",
|
|
display_name="Test Frame",
|
|
category=FrameCategory.MODERN,
|
|
frame_type=FrameType.FULL,
|
|
description="A test frame",
|
|
)
|
|
assert frame.name == "test_frame"
|
|
assert frame.display_name == "Test Frame"
|
|
assert frame.category == FrameCategory.MODERN
|
|
assert frame.frame_type == FrameType.FULL
|
|
assert frame.description == "A test frame"
|
|
|
|
def test_frame_definition_defaults(self):
|
|
"""Test frame definition default values"""
|
|
frame = FrameDefinition(
|
|
name="minimal",
|
|
display_name="Minimal",
|
|
category=FrameCategory.MODERN,
|
|
frame_type=FrameType.FULL,
|
|
)
|
|
assert frame.description == ""
|
|
assert frame.assets == {}
|
|
assert frame.colorizable is True
|
|
assert frame.default_thickness == 5.0
|
|
|
|
def test_corner_type_frame(self):
|
|
"""Test creating a corner-type frame"""
|
|
frame = FrameDefinition(
|
|
name="corners",
|
|
display_name="Corners",
|
|
category=FrameCategory.VINTAGE,
|
|
frame_type=FrameType.CORNERS,
|
|
default_thickness=8.0,
|
|
)
|
|
assert frame.frame_type == FrameType.CORNERS
|
|
assert frame.default_thickness == 8.0
|
|
|
|
|
|
class TestFrameManager:
|
|
"""Tests for FrameManager class"""
|
|
|
|
@pytest.fixture
|
|
def frame_manager(self):
|
|
"""Create a fresh FrameManager instance"""
|
|
return FrameManager()
|
|
|
|
def test_frame_manager_has_frames(self, frame_manager):
|
|
"""Test that FrameManager loads bundled frames"""
|
|
frames = frame_manager.get_all_frames()
|
|
assert len(frames) > 0
|
|
|
|
def test_get_frame_by_name(self, frame_manager):
|
|
"""Test getting a frame by name"""
|
|
frame = frame_manager.get_frame("simple_line")
|
|
assert frame is not None
|
|
assert frame.name == "simple_line"
|
|
assert frame.display_name == "Simple Line"
|
|
|
|
def test_get_nonexistent_frame(self, frame_manager):
|
|
"""Test getting a nonexistent frame returns None"""
|
|
frame = frame_manager.get_frame("nonexistent_frame")
|
|
assert frame is None
|
|
|
|
def test_get_frames_by_category_modern(self, frame_manager):
|
|
"""Test getting frames by MODERN category"""
|
|
frames = frame_manager.get_frames_by_category(FrameCategory.MODERN)
|
|
assert len(frames) > 0
|
|
for frame in frames:
|
|
assert frame.category == FrameCategory.MODERN
|
|
|
|
def test_get_frames_by_category_vintage(self, frame_manager):
|
|
"""Test getting frames by VINTAGE category"""
|
|
frames = frame_manager.get_frames_by_category(FrameCategory.VINTAGE)
|
|
assert len(frames) > 0
|
|
for frame in frames:
|
|
assert frame.category == FrameCategory.VINTAGE
|
|
|
|
def test_get_frames_by_category_geometric(self, frame_manager):
|
|
"""Test getting frames by GEOMETRIC category"""
|
|
frames = frame_manager.get_frames_by_category(FrameCategory.GEOMETRIC)
|
|
assert len(frames) > 0
|
|
for frame in frames:
|
|
assert frame.category == FrameCategory.GEOMETRIC
|
|
|
|
def test_get_frame_names(self, frame_manager):
|
|
"""Test getting list of frame names"""
|
|
names = frame_manager.get_frame_names()
|
|
assert isinstance(names, list)
|
|
assert "simple_line" in names
|
|
assert "double_line" in names
|
|
assert "leafy_corners" in names
|
|
|
|
def test_bundled_frames_exist(self, frame_manager):
|
|
"""Test that expected bundled frames exist"""
|
|
expected_frames = [
|
|
"simple_line",
|
|
"double_line",
|
|
"rounded_modern",
|
|
"geometric_corners",
|
|
"leafy_corners",
|
|
"ornate_flourish",
|
|
"victorian",
|
|
"art_nouveau",
|
|
]
|
|
for name in expected_frames:
|
|
frame = frame_manager.get_frame(name)
|
|
assert frame is not None, f"Expected frame '{name}' not found"
|
|
|
|
def test_modern_frames_are_full_type(self, frame_manager):
|
|
"""Test that modern frames are FULL type"""
|
|
modern_frames = ["simple_line", "double_line", "rounded_modern"]
|
|
for name in modern_frames:
|
|
frame = frame_manager.get_frame(name)
|
|
assert frame is not None
|
|
assert frame.frame_type == FrameType.FULL
|
|
|
|
def test_leafy_corners_is_corners_type(self, frame_manager):
|
|
"""Test that leafy_corners is CORNERS type"""
|
|
frame = frame_manager.get_frame("leafy_corners")
|
|
assert frame is not None
|
|
assert frame.frame_type == FrameType.CORNERS
|
|
|
|
def test_all_frames_are_colorizable(self, frame_manager):
|
|
"""Test that all bundled frames are colorizable"""
|
|
for frame in frame_manager.get_all_frames():
|
|
assert frame.colorizable is True
|
|
|
|
|
|
class TestGetFrameManager:
|
|
"""Tests for global frame manager instance"""
|
|
|
|
def test_get_frame_manager_returns_instance(self):
|
|
"""Test that get_frame_manager returns a FrameManager"""
|
|
manager = get_frame_manager()
|
|
assert isinstance(manager, FrameManager)
|
|
|
|
def test_get_frame_manager_returns_same_instance(self):
|
|
"""Test that get_frame_manager returns the same instance"""
|
|
manager1 = get_frame_manager()
|
|
manager2 = get_frame_manager()
|
|
assert manager1 is manager2
|
|
|
|
|
|
class TestFrameCategories:
|
|
"""Tests for frame category organization"""
|
|
|
|
@pytest.fixture
|
|
def frame_manager(self):
|
|
return FrameManager()
|
|
|
|
def test_modern_category_not_empty(self, frame_manager):
|
|
"""Test MODERN category has frames"""
|
|
frames = frame_manager.get_frames_by_category(FrameCategory.MODERN)
|
|
assert len(frames) >= 3 # simple_line, double_line, rounded_modern
|
|
|
|
def test_vintage_category_not_empty(self, frame_manager):
|
|
"""Test VINTAGE category has frames"""
|
|
frames = frame_manager.get_frames_by_category(FrameCategory.VINTAGE)
|
|
assert len(frames) >= 3 # leafy_corners, ornate_flourish, victorian, art_nouveau
|
|
|
|
def test_geometric_category_not_empty(self, frame_manager):
|
|
"""Test GEOMETRIC category has frames"""
|
|
frames = frame_manager.get_frames_by_category(FrameCategory.GEOMETRIC)
|
|
assert len(frames) >= 1 # geometric_corners
|
|
|
|
def test_all_frames_count(self, frame_manager):
|
|
"""Test total frame count"""
|
|
all_frames = frame_manager.get_all_frames()
|
|
# Should be at least 8 bundled frames
|
|
assert len(all_frames) >= 8
|
|
|
|
|
|
class TestFrameDescriptions:
|
|
"""Tests for frame descriptions"""
|
|
|
|
@pytest.fixture
|
|
def frame_manager(self):
|
|
return FrameManager()
|
|
|
|
def test_simple_line_has_description(self, frame_manager):
|
|
"""Test simple_line has a description"""
|
|
frame = frame_manager.get_frame("simple_line")
|
|
assert frame.description != ""
|
|
|
|
def test_leafy_corners_has_description(self, frame_manager):
|
|
"""Test leafy_corners has a description"""
|
|
frame = frame_manager.get_frame("leafy_corners")
|
|
assert frame.description != ""
|
|
|
|
def test_all_frames_have_descriptions(self, frame_manager):
|
|
"""Test all frames have non-empty descriptions"""
|
|
for frame in frame_manager.get_all_frames():
|
|
assert frame.description != "", f"Frame '{frame.name}' has no description"
|
|
|
|
def test_all_frames_have_display_names(self, frame_manager):
|
|
"""Test all frames have display names"""
|
|
for frame in frame_manager.get_all_frames():
|
|
assert frame.display_name != "", f"Frame '{frame.name}' has no display name"
|
|
|
|
|
|
class TestFrameThickness:
|
|
"""Tests for frame default thickness values"""
|
|
|
|
@pytest.fixture
|
|
def frame_manager(self):
|
|
return FrameManager()
|
|
|
|
def test_simple_line_thickness(self, frame_manager):
|
|
"""Test simple_line has thin default thickness"""
|
|
frame = frame_manager.get_frame("simple_line")
|
|
assert frame.default_thickness == 2.0
|
|
|
|
def test_vintage_frames_are_thicker(self, frame_manager):
|
|
"""Test vintage frames have thicker default"""
|
|
leafy = frame_manager.get_frame("leafy_corners")
|
|
victorian = frame_manager.get_frame("victorian")
|
|
|
|
assert leafy.default_thickness >= 8.0
|
|
assert victorian.default_thickness >= 10.0
|
|
|
|
def test_all_thicknesses_positive(self, frame_manager):
|
|
"""Test all frames have positive thickness"""
|
|
for frame in frame_manager.get_all_frames():
|
|
assert frame.default_thickness > 0
|