""" Unit tests for pyPhotoAlbum project module """ import pytest from pyPhotoAlbum.project import Project, Page from pyPhotoAlbum.page_layout import PageLayout from pyPhotoAlbum.models import ImageData class TestPage: """Tests for Page class""" def test_initialization_default(self): """Test Page initialization with default values""" layout = PageLayout() page = Page(layout=layout, page_number=1) assert page.layout is layout assert page.page_number == 1 def test_initialization_with_parameters(self): """Test Page initialization with custom parameters""" layout = PageLayout() page = Page(layout=layout, page_number=5) assert page.layout is layout assert page.page_number == 5 def test_page_number_modification(self): """Test modifying page number after initialization""" layout = PageLayout() page = Page(layout=layout, page_number=1) page.page_number = 10 assert page.page_number == 10 class TestProject: """Tests for Project class""" def test_initialization_default(self): """Test Project initialization with default values""" project = Project() assert project.name == "Untitled Project" assert len(project.pages) == 0 assert project.working_dpi == 300 assert project.page_size_mm == (140, 140) # Default 14cm x 14cm square def test_initialization_with_name(self): """Test Project initialization with custom name""" project = Project(name="My Album") assert project.name == "My Album" def test_add_page(self): """Test adding a page to the project""" project = Project() layout = PageLayout() page = Page(layout=layout, page_number=1) project.add_page(page) assert len(project.pages) == 1 assert project.pages[0] is page def test_add_multiple_pages(self): """Test adding multiple pages to the project""" project = Project() page1 = Page(layout=PageLayout(), page_number=1) page2 = Page(layout=PageLayout(), page_number=2) page3 = Page(layout=PageLayout(), page_number=3) project.add_page(page1) project.add_page(page2) project.add_page(page3) assert len(project.pages) == 3 assert project.pages[0] is page1 assert project.pages[1] is page2 assert project.pages[2] is page3 def test_remove_page(self): """Test removing a page from the project""" project = Project() page1 = Page(layout=PageLayout(), page_number=1) page2 = Page(layout=PageLayout(), page_number=2) project.add_page(page1) project.add_page(page2) project.remove_page(page1) assert len(project.pages) == 1 assert project.pages[0] is page2 def test_remove_page_not_in_list(self): """Test removing a page that's not in the project""" project = Project() page1 = Page(layout=PageLayout(), page_number=1) page2 = Page(layout=PageLayout(), page_number=2) project.add_page(page1) # Try to remove a page that was never added with pytest.raises(ValueError): project.remove_page(page2) def test_working_dpi_modification(self): """Test modifying working DPI""" project = Project() project.working_dpi = 300 assert project.working_dpi == 300 def test_page_size_modification(self): """Test modifying page size""" project = Project() project.page_size_mm = (300, 400) assert project.page_size_mm == (300, 400) def test_project_name_modification(self): """Test modifying project name""" project = Project(name="Initial Name") project.name = "New Name" assert project.name == "New Name" def test_asset_manager_exists(self): """Test that project has an asset manager""" project = Project() assert hasattr(project, 'asset_manager') assert project.asset_manager is not None def test_history_exists(self): """Test that project has a history manager""" project = Project() assert hasattr(project, 'history') assert project.history is not None def test_pages_list_is_mutable(self): """Test that pages list can be directly modified""" project = Project() page = Page(layout=PageLayout(), page_number=1) project.pages.append(page) assert len(project.pages) == 1 assert project.pages[0] is page def test_empty_project_has_no_pages(self): """Test that a new project has no pages""" project = Project() assert len(project.pages) == 0 assert project.pages == [] class TestProjectWithPages: """Integration tests for Project with Page operations""" def test_project_with_populated_pages(self, sample_image_data): """Test project with pages containing elements""" project = Project(name="Photo Album") # Create pages with elements for i in range(3): layout = PageLayout() img = ImageData( image_path=f"image_{i}.jpg", x=10 + i*10, y=20 + i*10, width=100, height=100 ) layout.add_element(img) page = Page(layout=layout, page_number=i+1) project.add_page(page) assert len(project.pages) == 3 # Check each page has elements for i, page in enumerate(project.pages): assert len(page.layout.elements) == 1 assert page.page_number == i + 1 def test_reorder_pages(self): """Test reordering pages in project""" project = Project() page1 = Page(layout=PageLayout(), page_number=1) page2 = Page(layout=PageLayout(), page_number=2) page3 = Page(layout=PageLayout(), page_number=3) project.add_page(page1) project.add_page(page2) project.add_page(page3) # Swap page 1 and page 3 project.pages[0], project.pages[2] = project.pages[2], project.pages[0] assert project.pages[0] is page3 assert project.pages[1] is page2 assert project.pages[2] is page1 def test_clear_all_pages(self): """Test clearing all pages from project""" project = Project() for i in range(5): page = Page(layout=PageLayout(), page_number=i+1) project.add_page(page) # Clear all pages project.pages.clear() assert len(project.pages) == 0 def test_get_page_by_index(self): """Test accessing pages by index""" project = Project() page1 = Page(layout=PageLayout(), page_number=1) page2 = Page(layout=PageLayout(), page_number=2) project.add_page(page1) project.add_page(page2) assert project.pages[0] is page1 assert project.pages[1] is page2 def test_insert_page_at_position(self): """Test inserting a page at a specific position""" project = Project() page1 = Page(layout=PageLayout(), page_number=1) page2 = Page(layout=PageLayout(), page_number=2) page_new = Page(layout=PageLayout(), page_number=99) project.add_page(page1) project.add_page(page2) # Insert new page in the middle project.pages.insert(1, page_new) assert len(project.pages) == 3 assert project.pages[0] is page1 assert project.pages[1] is page_new assert project.pages[2] is page2