Big-Link-Man/tests/unit/test_site_page_generator.py

148 lines
5.0 KiB
Python

"""
Unit tests for site page generator
"""
import pytest
from unittest.mock import Mock, MagicMock
from src.generation.site_page_generator import (
get_domain_from_site,
generate_site_pages,
PAGE_TYPES
)
from src.database.models import SiteDeployment, SitePage
class TestGetDomainFromSite:
"""Tests for domain extraction from site deployment"""
def test_custom_hostname_preferred(self):
site = Mock(spec=SiteDeployment)
site.custom_hostname = "www.example.com"
site.pull_zone_bcdn_hostname = "example.b-cdn.net"
assert get_domain_from_site(site) == "www.example.com"
def test_bcdn_hostname_fallback(self):
site = Mock(spec=SiteDeployment)
site.custom_hostname = None
site.pull_zone_bcdn_hostname = "example.b-cdn.net"
assert get_domain_from_site(site) == "example.b-cdn.net"
class TestGenerateSitePages:
"""Tests for site page generation"""
def test_generates_all_three_pages(self):
site = Mock(spec=SiteDeployment)
site.id = 1
site.custom_hostname = "www.example.com"
site.pull_zone_bcdn_hostname = "example.b-cdn.net"
page_repo = Mock()
page_repo.exists.return_value = False
created_page = Mock(spec=SitePage)
page_repo.create.return_value = created_page
template_service = Mock()
template_service.format_page.return_value = "<html>formatted</html>"
result = generate_site_pages(site, "basic", page_repo, template_service)
assert len(result) == 3
assert page_repo.create.call_count == 3
assert template_service.format_page.call_count == 3
def test_skips_existing_pages(self):
site = Mock(spec=SiteDeployment)
site.id = 1
site.custom_hostname = "www.example.com"
page_repo = Mock()
page_repo.exists.side_effect = [True, False, False]
created_page = Mock(spec=SitePage)
page_repo.create.return_value = created_page
template_service = Mock()
template_service.format_page.return_value = "<html>formatted</html>"
result = generate_site_pages(site, "basic", page_repo, template_service)
assert len(result) == 2
assert page_repo.create.call_count == 2
def test_correct_page_titles_used(self):
site = Mock(spec=SiteDeployment)
site.id = 1
site.custom_hostname = "www.example.com"
page_repo = Mock()
page_repo.exists.return_value = False
page_repo.create.return_value = Mock(spec=SitePage)
template_service = Mock()
template_service.format_page.return_value = "<html>formatted</html>"
generate_site_pages(site, "basic", page_repo, template_service)
calls = template_service.format_page.call_args_list
titles = [call.kwargs['page_title'] for call in calls]
assert "About Us" in titles
assert "Contact" in titles
assert "Privacy Policy" in titles
def test_uses_correct_template(self):
site = Mock(spec=SiteDeployment)
site.id = 1
site.custom_hostname = "www.example.com"
page_repo = Mock()
page_repo.exists.return_value = False
page_repo.create.return_value = Mock(spec=SitePage)
template_service = Mock()
template_service.format_page.return_value = "<html>formatted</html>"
generate_site_pages(site, "modern", page_repo, template_service)
for call in template_service.format_page.call_args_list:
assert call.kwargs['template_name'] == "modern"
def test_raises_error_on_page_creation_failure(self):
site = Mock(spec=SiteDeployment)
site.id = 1
site.custom_hostname = "www.example.com"
page_repo = Mock()
page_repo.exists.return_value = False
page_repo.create.side_effect = Exception("Database error")
template_service = Mock()
template_service.format_page.return_value = "<html>formatted</html>"
with pytest.raises(ValueError, match="Page generation failed"):
generate_site_pages(site, "basic", page_repo, template_service)
def test_stores_formatted_html_in_database(self):
site = Mock(spec=SiteDeployment)
site.id = 1
site.custom_hostname = "www.example.com"
page_repo = Mock()
page_repo.exists.return_value = False
page_repo.create.return_value = Mock(spec=SitePage)
template_service = Mock()
formatted_html = "<html><body><h1>About Us</h1></body></html>"
template_service.format_page.return_value = formatted_html
generate_site_pages(site, "basic", page_repo, template_service)
create_calls = page_repo.create.call_args_list
for call in create_calls:
assert call.kwargs['content'] == formatted_html