148 lines
5.0 KiB
Python
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
|
|
|