""" Test for link navigation example (09_link_navigation_demo.py). This test ensures the link navigation example runs correctly and produces expected output. """ import pytest import sys from pathlib import Path import importlib.util # Add examples to path examples_dir = Path(__file__).parent.parent.parent / "examples" sys.path.insert(0, str(examples_dir)) # Load the demo module spec = importlib.util.spec_from_file_location( "link_navigation_demo", examples_dir / "09_link_navigation_demo.py" ) demo_module = importlib.util.module_from_spec(spec) spec.loader.exec_module(demo_module) def test_link_demo_imports(): """Test that the link demo can be imported without errors.""" assert demo_module is not None def test_create_paragraph_with_links(): """Test creating a paragraph with mixed text and links.""" create_paragraph_with_links = demo_module.create_paragraph_with_links from pyWebLayout.abstract.block import Paragraph from pyWebLayout.abstract.inline import LinkedWord, Word from pyWebLayout.abstract.functional import LinkType text_parts = [ ('text', "Click"), ('link', "here", "https://example.com", LinkType.EXTERNAL, "test_link"), ('text', "to visit"), ] para = create_paragraph_with_links(text_parts) assert isinstance(para, Paragraph) assert len(para.words) == 4 # "Click", "here" (linked), "to", "visit" # Check that the second word is a LinkedWord assert isinstance(para.words[1], LinkedWord) assert para.words[1].text == "here" assert para.words[1].location == "https://example.com" assert para.words[1]._link_type == LinkType.EXTERNAL def test_link_callback_function(): """Test that link callbacks work correctly.""" link_callback = demo_module.link_callback demo_module.link_clicks = [] callback = link_callback("test_id") callback() assert "test_id" in demo_module.link_clicks def test_create_example_1_internal_links(): """Test creating internal links example.""" create_example_1 = demo_module.create_example_1_internal_links from pyWebLayout.concrete.page import Page page = create_example_1() assert isinstance(page, Page) assert page.size == (500, 600) def test_create_example_2_external_links(): """Test creating external links example.""" create_example_2 = demo_module.create_example_2_external_links from pyWebLayout.concrete.page import Page page = create_example_2() assert isinstance(page, Page) assert page.size == (500, 600) def test_create_example_3_api_links(): """Test creating API links example.""" create_example_3 = demo_module.create_example_3_api_links from pyWebLayout.concrete.page import Page page = create_example_3() assert isinstance(page, Page) assert page.size == (500, 600) def test_create_example_4_function_links(): """Test creating function links example.""" create_example_4 = demo_module.create_example_4_function_links from pyWebLayout.concrete.page import Page page = create_example_4() assert isinstance(page, Page) assert page.size == (500, 600) def test_different_link_types(): """Test that different link types are created correctly.""" create_paragraph_with_links = demo_module.create_paragraph_with_links from pyWebLayout.abstract.functional import LinkType # Test each link type link_types = [ (LinkType.INTERNAL, "#section1"), (LinkType.EXTERNAL, "https://example.com"), (LinkType.API, "/api/action"), (LinkType.FUNCTION, "function()"), ] for link_type, location in link_types: para = create_paragraph_with_links([ ('link', "test", location, link_type, f"test_{link_type.name}") ]) assert len(para.words) == 1 assert para.words[0]._link_type == link_type assert para.words[0].location == location def test_combine_pages_into_grid(): """Test combining pages into grid.""" combine_pages_into_grid = demo_module.combine_pages_into_grid from pyWebLayout.concrete.page import Page from pyWebLayout.style.page_style import PageStyle # Create a few pages page_style = PageStyle() pages = [ Page(size=(200, 200), style=page_style), Page(size=(200, 200), style=page_style), Page(size=(200, 200), style=page_style), Page(size=(200, 200), style=page_style) ] combined = combine_pages_into_grid(pages, "Test Title") # Should create a combined image from PIL import Image assert isinstance(combined, Image.Image) # Should be larger than individual pages assert combined.size[0] > 200 assert combined.size[1] > 200 def test_main_function(): """Test that the main function runs without errors.""" main = demo_module.main # Run main (will create output files) result = main() # Should return combined image and link clicks assert result is not None assert len(result) == 2 combined_image, link_clicks = result # Should be a PIL image from PIL import Image assert isinstance(combined_image, Image.Image) # Link clicks should be a list (may be empty since we're not actually clicking) assert isinstance(link_clicks, list) # Output file should exist output_dir = Path("docs/images") assert (output_dir / "example_09_link_navigation.png").exists() if __name__ == "__main__": pytest.main([__file__, "-v"])