222 lines
6.6 KiB
Python
222 lines
6.6 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_engine():
|
|
engine = create_engine('sqlite:///:memory:')
|
|
Base.metadata.create_all(engine)
|
|
return engine
|
|
|
|
|
|
@pytest.fixture
|
|
def test_session(test_engine):
|
|
Session = sessionmaker(bind=test_engine)
|
|
session = Session()
|
|
yield session
|
|
session.close()
|
|
|
|
|
|
@pytest.fixture
|
|
def site_repo(test_session):
|
|
return SiteDeploymentRepository(test_session)
|
|
|
|
|
|
@pytest.fixture
|
|
def page_repo(test_session):
|
|
return SitePageRepository(test_session)
|
|
|
|
|
|
@pytest.fixture
|
|
def template_service():
|
|
return TemplateService()
|
|
|
|
|
|
@pytest.fixture
|
|
def test_site(site_repo):
|
|
site = site_repo.create(
|
|
site_name="test-site",
|
|
storage_zone_id=12345,
|
|
storage_zone_name="test-storage",
|
|
storage_zone_password="password123",
|
|
storage_zone_region="DE",
|
|
pull_zone_id=67890,
|
|
pull_zone_bcdn_hostname="test-site.b-cdn.net",
|
|
custom_hostname=None
|
|
)
|
|
return site
|
|
|
|
|
|
def test_generate_pages_for_site(test_site, page_repo, template_service):
|
|
pages = generate_site_pages(test_site, page_repo, template_service)
|
|
|
|
assert len(pages) == 3
|
|
|
|
page_types = [p.page_type for p in pages]
|
|
assert "about" in page_types
|
|
assert "contact" in page_types
|
|
assert "privacy" in page_types
|
|
|
|
|
|
def test_generated_pages_stored_in_database(test_site, page_repo, template_service):
|
|
generate_site_pages(test_site, page_repo, template_service)
|
|
|
|
stored_pages = page_repo.get_by_site(test_site.id)
|
|
|
|
assert len(stored_pages) == 3
|
|
|
|
for page in stored_pages:
|
|
assert page.site_deployment_id == test_site.id
|
|
assert page.page_type in ["about", "contact", "privacy"]
|
|
assert page.content is not None
|
|
assert len(page.content) > 0
|
|
assert "<html" in page.content.lower()
|
|
|
|
|
|
def test_pages_use_site_template(test_site, page_repo, template_service):
|
|
test_site.template_name = "modern"
|
|
|
|
pages = generate_site_pages(test_site, page_repo, template_service)
|
|
|
|
for page in pages:
|
|
assert page.content is not None
|
|
assert "<html" in page.content.lower()
|
|
|
|
|
|
def test_cannot_create_duplicate_pages(test_site, page_repo, template_service):
|
|
generate_site_pages(test_site, page_repo, template_service)
|
|
|
|
pages = generate_site_pages(test_site, page_repo, template_service)
|
|
|
|
assert len(pages) == 0
|
|
|
|
|
|
def test_unique_constraint_enforced(test_site, page_repo):
|
|
page_repo.create(
|
|
site_deployment_id=test_site.id,
|
|
page_type="about",
|
|
content="<html>About</html>"
|
|
)
|
|
|
|
with pytest.raises(ValueError) as exc_info:
|
|
page_repo.create(
|
|
site_deployment_id=test_site.id,
|
|
page_type="about",
|
|
content="<html>Another About</html>"
|
|
)
|
|
|
|
assert "already exists" in str(exc_info.value)
|
|
|
|
|
|
def test_update_page_content(test_site, page_repo, template_service):
|
|
pages = generate_site_pages(test_site, page_repo, template_service)
|
|
|
|
about_page = next(p for p in pages if p.page_type == "about")
|
|
original_content = about_page.content
|
|
|
|
new_content = "<html>Updated About Page</html>"
|
|
updated_page = page_repo.update_content(about_page.id, new_content)
|
|
|
|
assert updated_page.content == new_content
|
|
assert updated_page.content != original_content
|
|
|
|
|
|
def test_delete_page(test_site, page_repo, template_service):
|
|
pages = generate_site_pages(test_site, page_repo, template_service)
|
|
|
|
about_page = next(p for p in pages if p.page_type == "about")
|
|
|
|
result = page_repo.delete(about_page.id)
|
|
|
|
assert result is True
|
|
|
|
remaining_pages = page_repo.get_by_site(test_site.id)
|
|
assert len(remaining_pages) == 2
|
|
|
|
|
|
def test_multiple_sites_have_separate_pages(site_repo, page_repo, template_service):
|
|
site1 = site_repo.create(
|
|
site_name="site-1",
|
|
storage_zone_id=111,
|
|
storage_zone_name="storage-1",
|
|
storage_zone_password="pass1",
|
|
storage_zone_region="DE",
|
|
pull_zone_id=222,
|
|
pull_zone_bcdn_hostname="site1.b-cdn.net"
|
|
)
|
|
|
|
site2 = site_repo.create(
|
|
site_name="site-2",
|
|
storage_zone_id=333,
|
|
storage_zone_name="storage-2",
|
|
storage_zone_password="pass2",
|
|
storage_zone_region="NY",
|
|
pull_zone_id=444,
|
|
pull_zone_bcdn_hostname="site2.b-cdn.net"
|
|
)
|
|
|
|
pages1 = generate_site_pages(site1, page_repo, template_service)
|
|
pages2 = generate_site_pages(site2, page_repo, template_service)
|
|
|
|
assert len(pages1) == 3
|
|
assert len(pages2) == 3
|
|
|
|
site1_pages = page_repo.get_by_site(site1.id)
|
|
site2_pages = page_repo.get_by_site(site2.id)
|
|
|
|
assert len(site1_pages) == 3
|
|
assert len(site2_pages) == 3
|
|
|
|
assert all(p.site_deployment_id == site1.id for p in site1_pages)
|
|
assert all(p.site_deployment_id == site2.id for p in site2_pages)
|
|
|
|
|
|
def test_page_with_custom_domain(site_repo, page_repo, template_service):
|
|
site = site_repo.create(
|
|
site_name="custom-site",
|
|
storage_zone_id=555,
|
|
storage_zone_name="custom-storage",
|
|
storage_zone_password="pass",
|
|
storage_zone_region="DE",
|
|
pull_zone_id=666,
|
|
pull_zone_bcdn_hostname="custom-site.b-cdn.net",
|
|
custom_hostname="www.custom-domain.com"
|
|
)
|
|
|
|
pages = generate_site_pages(site, page_repo, template_service)
|
|
|
|
assert len(pages) == 3
|
|
|
|
for page in pages:
|
|
assert page.site_deployment_id == site.id
|
|
|
|
|
|
def test_get_specific_page_by_type(test_site, page_repo, template_service):
|
|
generate_site_pages(test_site, page_repo, template_service)
|
|
|
|
about_page = page_repo.get_by_site_and_type(test_site.id, "about")
|
|
|
|
assert about_page is not None
|
|
assert about_page.page_type == "about"
|
|
assert about_page.site_deployment_id == test_site.id
|
|
|
|
|
|
def test_check_page_exists(test_site, page_repo, template_service):
|
|
assert page_repo.exists(test_site.id, "about") is False
|
|
|
|
generate_site_pages(test_site, page_repo, template_service)
|
|
|
|
assert page_repo.exists(test_site.id, "about") is True
|
|
assert page_repo.exists(test_site.id, "contact") is True
|
|
assert page_repo.exists(test_site.id, "privacy") is True
|
|
assert page_repo.exists(test_site.id, "nonexistent") is False
|