Big-Link-Man/tests/integration/test_site_page_integration.py

157 lines
5.7 KiB
Python

"""
Integration tests for site page generation
"""
import pytest
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from src.database.models import Base, SiteDeployment, SitePage
from src.database.repositories import SiteDeploymentRepository, SitePageRepository
from src.templating.service import TemplateService
from src.generation.site_page_generator import generate_site_pages
@pytest.fixture
def test_db():
"""Create a test database"""
engine = create_engine("sqlite:///:memory:")
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
session = Session()
yield session
session.close()
@pytest.fixture
def site_repo(test_db):
return SiteDeploymentRepository(test_db)
@pytest.fixture
def page_repo(test_db):
return SitePageRepository(test_db)
@pytest.fixture
def template_service():
return TemplateService()
@pytest.fixture
def sample_site(site_repo):
"""Create a sample site for testing"""
return site_repo.create(
site_name="integration-test-site",
storage_zone_id=999,
storage_zone_name="test-storage",
storage_zone_password="test-password",
storage_zone_region="DE",
pull_zone_id=888,
pull_zone_bcdn_hostname="integration-test.b-cdn.net",
custom_hostname=None
)
class TestSitePageIntegration:
"""Integration tests for site page generation flow"""
def test_full_page_generation_flow(self, sample_site, page_repo, template_service):
"""Test complete flow of generating pages for a site"""
pages = generate_site_pages(sample_site, "basic", page_repo, template_service)
assert len(pages) == 3
stored_pages = page_repo.get_by_site(sample_site.id)
assert len(stored_pages) == 3
page_types = {p.page_type for p in stored_pages}
assert page_types == {"about", "contact", "privacy"}
def test_pages_use_correct_template(self, sample_site, page_repo, template_service):
"""Test that pages are formatted with correct template"""
generate_site_pages(sample_site, "modern", page_repo, template_service)
about_page = page_repo.get_by_site_and_type(sample_site.id, "about")
assert about_page is not None
assert "<html" in about_page.content.lower()
assert "About Us" in about_page.content
def test_multiple_templates(self, site_repo, page_repo, template_service):
"""Test page generation with different templates"""
templates = ["basic", "modern", "classic"]
for template_name in templates:
site = site_repo.create(
site_name=f"test-{template_name}",
storage_zone_id=100 + templates.index(template_name),
storage_zone_name=f"storage-{template_name}",
storage_zone_password="password",
storage_zone_region="DE",
pull_zone_id=200 + templates.index(template_name),
pull_zone_bcdn_hostname=f"{template_name}.b-cdn.net"
)
pages = generate_site_pages(site, template_name, page_repo, template_service)
assert len(pages) == 3
for page in pages:
assert "<html" in page.content.lower()
def test_pages_not_duplicated(self, sample_site, page_repo, template_service):
"""Test that running generation twice doesn't duplicate pages"""
generate_site_pages(sample_site, "basic", page_repo, template_service)
generate_site_pages(sample_site, "basic", page_repo, template_service)
pages = page_repo.get_by_site(sample_site.id)
assert len(pages) == 3
def test_page_content_structure(self, sample_site, page_repo, template_service):
"""Test that generated pages have proper HTML structure"""
generate_site_pages(sample_site, "basic", page_repo, template_service)
for page_type in ["about", "contact", "privacy"]:
page = page_repo.get_by_site_and_type(sample_site.id, page_type)
assert page is not None
content = page.content
assert "<!DOCTYPE html>" in content or "<html" in content.lower()
assert "<head>" in content.lower()
assert "<body>" in content.lower()
assert "<nav>" in content.lower()
def test_custom_hostname_vs_bcdn(self, site_repo, page_repo, template_service):
"""Test page generation for sites with and without custom hostnames"""
site_custom = site_repo.create(
site_name="custom-hostname-site",
storage_zone_id=111,
storage_zone_name="custom-storage",
storage_zone_password="password",
storage_zone_region="DE",
pull_zone_id=222,
pull_zone_bcdn_hostname="custom.b-cdn.net",
custom_hostname="www.custom-domain.com"
)
site_bcdn = site_repo.create(
site_name="bcdn-only-site",
storage_zone_id=333,
storage_zone_name="bcdn-storage",
storage_zone_password="password",
storage_zone_region="DE",
pull_zone_id=444,
pull_zone_bcdn_hostname="bcdn-only.b-cdn.net",
custom_hostname=None
)
pages_custom = generate_site_pages(site_custom, "basic", page_repo, template_service)
pages_bcdn = generate_site_pages(site_bcdn, "basic", page_repo, template_service)
assert len(pages_custom) == 3
assert len(pages_bcdn) == 3
assert all(p.content for p in pages_custom)
assert all(p.content for p in pages_bcdn)