pyPhotoAlbum/tests/test_embedded_templates.py
2025-11-11 16:02:02 +00:00

304 lines
10 KiB
Python

"""
Tests for embedded template functionality
"""
import pytest
import tempfile
import os
from pyPhotoAlbum.project import Project, Page
from pyPhotoAlbum.template_manager import TemplateManager, Template
from pyPhotoAlbum.models import PlaceholderData, TextBoxData
from pyPhotoAlbum.page_layout import PageLayout
def test_embed_template_in_project():
"""Test embedding a template in a project"""
# Create a project
project = Project(name="Test Project")
# Create a template manager with the project
template_manager = TemplateManager(project=project)
# Create a simple template
template = Template(name="Test Template", description="A test template")
placeholder = PlaceholderData(
placeholder_type="image",
x=10, y=10, width=100, height=100
)
template.add_element(placeholder)
# Embed the template
template_manager.embed_template(template)
# Verify it's embedded
assert "Test Template" in project.embedded_templates
assert project.embedded_templates["Test Template"]["name"] == "Test Template"
assert len(project.embedded_templates["Test Template"]["elements"]) == 1
def test_load_embedded_template():
"""Test loading an embedded template"""
# Create a project
project = Project(name="Test Project")
# Create a template manager with the project
template_manager = TemplateManager(project=project)
# Create and embed a template
template = Template(name="Test Template", description="A test template")
placeholder = PlaceholderData(
placeholder_type="image",
x=10, y=10, width=100, height=100
)
template.add_element(placeholder)
template_manager.embed_template(template)
# Load the embedded template
loaded_template = template_manager.load_template("Test Template")
assert loaded_template.name == "Test Template"
assert loaded_template.description == "A test template"
assert len(loaded_template.elements) == 1
def test_list_embedded_templates():
"""Test listing embedded templates alongside filesystem templates"""
# Create a project
project = Project(name="Test Project")
# Create a template manager with the project
template_manager = TemplateManager(project=project)
# Embed some templates
for i in range(3):
template = Template(name=f"Embedded_{i}")
template_manager.embed_template(template)
# List all templates
templates = template_manager.list_templates()
# Check embedded templates are listed with prefix
embedded_templates = [t for t in templates if t.startswith("[Embedded]")]
assert len(embedded_templates) == 3
assert "[Embedded] Embedded_0" in templates
assert "[Embedded] Embedded_1" in templates
assert "[Embedded] Embedded_2" in templates
def test_embedded_template_priority():
"""Test that embedded templates take priority over filesystem templates"""
# Create a project
project = Project(name="Test Project")
# Create a template manager with the project
template_manager = TemplateManager(project=project)
# Embed a template with a common name
embedded_template = Template(name="Common", description="Embedded version")
template_manager.embed_template(embedded_template)
# Load by name without prefix (should get embedded version)
loaded = template_manager.load_template("Common")
assert loaded.description == "Embedded version"
def test_serialize_project_with_embedded_templates():
"""Test serializing a project with embedded templates"""
# Create a project
project = Project(name="Test Project")
# Create a template manager with the project
template_manager = TemplateManager(project=project)
# Create and embed a template
template = Template(name="Test Template", description="A test template")
placeholder = PlaceholderData(
placeholder_type="image",
x=10, y=10, width=100, height=100
)
template.add_element(placeholder)
template_manager.embed_template(template)
# Serialize the project
serialized = project.serialize()
# Verify embedded templates are in serialization
assert "embedded_templates" in serialized
assert "Test Template" in serialized["embedded_templates"]
assert serialized["embedded_templates"]["Test Template"]["name"] == "Test Template"
def test_deserialize_project_with_embedded_templates():
"""Test deserializing a project with embedded templates"""
# Create a project with embedded template
project = Project(name="Test Project")
template_manager = TemplateManager(project=project)
template = Template(name="Test Template", description="A test template")
placeholder = PlaceholderData(
placeholder_type="image",
x=10, y=10, width=100, height=100
)
template.add_element(placeholder)
template_manager.embed_template(template)
# Serialize the project
serialized = project.serialize()
# Create a new project and deserialize
new_project = Project(name="New Project")
new_project.deserialize(serialized)
# Verify embedded templates were restored
assert "Test Template" in new_project.embedded_templates
assert new_project.embedded_templates["Test Template"]["name"] == "Test Template"
# Verify we can load the template from the new project
new_template_manager = TemplateManager(project=new_project)
loaded_template = new_template_manager.load_template("Test Template")
assert loaded_template.name == "Test Template"
assert len(loaded_template.elements) == 1
def test_auto_embed_on_apply():
"""Test that templates are automatically embedded when applied"""
# Create a project and page
project = Project(name="Test Project")
page = Page()
project.add_page(page)
# Create a template manager with the project
template_manager = TemplateManager(project=project)
# Create a template (not embedded yet)
template = Template(name="Auto Embed Test", description="Should auto-embed")
placeholder = PlaceholderData(
placeholder_type="image",
x=10, y=10, width=100, height=100
)
template.add_element(placeholder)
# Apply template with auto_embed=True (default)
template_manager.apply_template_to_page(template, page)
# Verify template was auto-embedded
assert "Auto Embed Test" in project.embedded_templates
def test_auto_embed_on_create_page():
"""Test that templates are automatically embedded when creating pages"""
# Create a project
project = Project(name="Test Project")
# Create a template manager with the project
template_manager = TemplateManager(project=project)
# Create a template (not embedded yet)
template = Template(name="Auto Embed Page Test", description="Should auto-embed")
placeholder = PlaceholderData(
placeholder_type="image",
x=10, y=10, width=100, height=100
)
template.add_element(placeholder)
# Create page from template with auto_embed=True (default)
page = template_manager.create_page_from_template(template, page_number=1)
# Verify template was auto-embedded
assert "Auto Embed Page Test" in project.embedded_templates
def test_delete_embedded_template():
"""Test deleting an embedded template"""
# Create a project
project = Project(name="Test Project")
# Create a template manager with the project
template_manager = TemplateManager(project=project)
# Embed a template
template = Template(name="To Delete")
template_manager.embed_template(template)
assert "To Delete" in project.embedded_templates
# Delete the embedded template
template_manager.delete_template("[Embedded] To Delete")
assert "To Delete" not in project.embedded_templates
def test_embedded_template_with_text():
"""Test embedding template with text elements"""
# Create a project
project = Project(name="Test Project")
# Create a template manager with the project
template_manager = TemplateManager(project=project)
# Create a template with text
template = Template(name="Text Template")
textbox = TextBoxData(
text_content="Sample Text",
x=10, y=10, width=200, height=50
)
template.add_element(textbox)
# Embed and reload
template_manager.embed_template(template)
loaded = template_manager.load_template("Text Template")
assert len(loaded.elements) == 1
assert isinstance(loaded.elements[0], TextBoxData)
assert loaded.elements[0].text_content == "Sample Text"
def test_roundtrip_serialization():
"""Test complete roundtrip: create project, embed template, serialize, deserialize"""
# Create a project with pages and embedded template
project = Project(name="Roundtrip Test")
template_manager = TemplateManager(project=project)
# Create a template
template = Template(name="Roundtrip Template", page_size_mm=(200, 300))
placeholder1 = PlaceholderData(
placeholder_type="image",
x=10, y=10, width=80, height=80
)
placeholder2 = PlaceholderData(
placeholder_type="image",
x=110, y=10, width=80, height=80
)
template.add_element(placeholder1)
template.add_element(placeholder2)
# Create a page from this template
page = template_manager.create_page_from_template(template, page_number=1)
project.add_page(page)
# Serialize
serialized = project.serialize()
# Create new project and deserialize
new_project = Project(name="New Roundtrip")
new_project.deserialize(serialized)
# Verify embedded template
assert "Roundtrip Template" in new_project.embedded_templates
# Verify we can use the template
new_template_manager = TemplateManager(project=new_project)
loaded_template = new_template_manager.load_template("Roundtrip Template")
assert loaded_template.name == "Roundtrip Template"
assert loaded_template.page_size_mm == (200, 300)
assert len(loaded_template.elements) == 2
# Create another page from the loaded template
new_page = new_template_manager.create_page_from_template(
loaded_template,
page_number=2,
auto_embed=False # Don't embed again
)
assert len(new_page.layout.elements) == 2