186 lines
5.3 KiB
Python
186 lines
5.3 KiB
Python
"""
|
|
Unit tests for SitePageRepository
|
|
"""
|
|
|
|
import pytest
|
|
from unittest.mock import Mock, MagicMock
|
|
from sqlalchemy.exc import IntegrityError
|
|
from src.database.repositories import SitePageRepository
|
|
from src.database.models import SitePage
|
|
|
|
|
|
@pytest.fixture
|
|
def mock_session():
|
|
return Mock()
|
|
|
|
|
|
@pytest.fixture
|
|
def site_page_repo(mock_session):
|
|
return SitePageRepository(mock_session)
|
|
|
|
|
|
def test_create_site_page_success(site_page_repo, mock_session):
|
|
mock_session.add = Mock()
|
|
mock_session.commit = Mock()
|
|
mock_session.refresh = Mock()
|
|
|
|
page = site_page_repo.create(
|
|
site_deployment_id=1,
|
|
page_type="about",
|
|
content="<html>About Page</html>"
|
|
)
|
|
|
|
assert mock_session.add.called
|
|
assert mock_session.commit.called
|
|
assert mock_session.refresh.called
|
|
|
|
|
|
def test_create_site_page_duplicate_raises_error(site_page_repo, mock_session):
|
|
mock_session.add = Mock()
|
|
mock_session.commit = Mock(side_effect=IntegrityError("", "", ""))
|
|
mock_session.rollback = Mock()
|
|
|
|
with pytest.raises(ValueError) as exc_info:
|
|
site_page_repo.create(
|
|
site_deployment_id=1,
|
|
page_type="about",
|
|
content="<html>About Page</html>"
|
|
)
|
|
|
|
assert "already exists" in str(exc_info.value)
|
|
assert mock_session.rollback.called
|
|
|
|
|
|
def test_get_by_site(site_page_repo, mock_session):
|
|
mock_query = Mock()
|
|
mock_filter = Mock()
|
|
mock_pages = [
|
|
Mock(spec=SitePage, id=1, page_type="about"),
|
|
Mock(spec=SitePage, id=2, page_type="contact"),
|
|
Mock(spec=SitePage, id=3, page_type="privacy")
|
|
]
|
|
|
|
mock_filter.all = Mock(return_value=mock_pages)
|
|
mock_query.filter = Mock(return_value=mock_filter)
|
|
mock_session.query = Mock(return_value=mock_query)
|
|
|
|
pages = site_page_repo.get_by_site(1)
|
|
|
|
assert len(pages) == 3
|
|
assert mock_session.query.called
|
|
|
|
|
|
def test_get_by_site_and_type(site_page_repo, mock_session):
|
|
mock_query = Mock()
|
|
mock_filter = Mock()
|
|
mock_page = Mock(spec=SitePage, id=1, page_type="about")
|
|
|
|
mock_filter.first = Mock(return_value=mock_page)
|
|
mock_query.filter = Mock(return_value=mock_filter)
|
|
mock_session.query = Mock(return_value=mock_query)
|
|
|
|
page = site_page_repo.get_by_site_and_type(1, "about")
|
|
|
|
assert page == mock_page
|
|
assert mock_session.query.called
|
|
|
|
|
|
def test_get_by_site_and_type_not_found(site_page_repo, mock_session):
|
|
mock_query = Mock()
|
|
mock_filter = Mock()
|
|
|
|
mock_filter.first = Mock(return_value=None)
|
|
mock_query.filter = Mock(return_value=mock_filter)
|
|
mock_session.query = Mock(return_value=mock_query)
|
|
|
|
page = site_page_repo.get_by_site_and_type(1, "about")
|
|
|
|
assert page is None
|
|
|
|
|
|
def test_update_content_success(site_page_repo, mock_session):
|
|
mock_page = Mock(spec=SitePage, id=1, content="<html>Old</html>")
|
|
|
|
mock_query = Mock()
|
|
mock_filter = Mock()
|
|
mock_filter.first = Mock(return_value=mock_page)
|
|
mock_query.filter = Mock(return_value=mock_filter)
|
|
mock_session.query = Mock(return_value=mock_query)
|
|
mock_session.commit = Mock()
|
|
mock_session.refresh = Mock()
|
|
|
|
updated_page = site_page_repo.update_content(1, "<html>New</html>")
|
|
|
|
assert updated_page.content == "<html>New</html>"
|
|
assert mock_session.commit.called
|
|
|
|
|
|
def test_update_content_page_not_found(site_page_repo, mock_session):
|
|
mock_query = Mock()
|
|
mock_filter = Mock()
|
|
mock_filter.first = Mock(return_value=None)
|
|
mock_query.filter = Mock(return_value=mock_filter)
|
|
mock_session.query = Mock(return_value=mock_query)
|
|
|
|
with pytest.raises(ValueError) as exc_info:
|
|
site_page_repo.update_content(1, "<html>New</html>")
|
|
|
|
assert "not found" in str(exc_info.value)
|
|
|
|
|
|
def test_exists_returns_true(site_page_repo, mock_session):
|
|
mock_query = Mock()
|
|
mock_filter = Mock()
|
|
mock_page = Mock(spec=SitePage)
|
|
|
|
mock_filter.first = Mock(return_value=mock_page)
|
|
mock_query.filter = Mock(return_value=mock_filter)
|
|
mock_session.query = Mock(return_value=mock_query)
|
|
|
|
exists = site_page_repo.exists(1, "about")
|
|
|
|
assert exists is True
|
|
|
|
|
|
def test_exists_returns_false(site_page_repo, mock_session):
|
|
mock_query = Mock()
|
|
mock_filter = Mock()
|
|
|
|
mock_filter.first = Mock(return_value=None)
|
|
mock_query.filter = Mock(return_value=mock_filter)
|
|
mock_session.query = Mock(return_value=mock_query)
|
|
|
|
exists = site_page_repo.exists(1, "about")
|
|
|
|
assert exists is False
|
|
|
|
|
|
def test_delete_success(site_page_repo, mock_session):
|
|
mock_page = Mock(spec=SitePage, id=1)
|
|
|
|
mock_query = Mock()
|
|
mock_filter = Mock()
|
|
mock_filter.first = Mock(return_value=mock_page)
|
|
mock_query.filter = Mock(return_value=mock_filter)
|
|
mock_session.query = Mock(return_value=mock_query)
|
|
mock_session.delete = Mock()
|
|
mock_session.commit = Mock()
|
|
|
|
result = site_page_repo.delete(1)
|
|
|
|
assert result is True
|
|
assert mock_session.delete.called
|
|
assert mock_session.commit.called
|
|
|
|
|
|
def test_delete_page_not_found(site_page_repo, mock_session):
|
|
mock_query = Mock()
|
|
mock_filter = Mock()
|
|
mock_filter.first = Mock(return_value=None)
|
|
mock_query.filter = Mock(return_value=mock_filter)
|
|
mock_session.query = Mock(return_value=mock_query)
|
|
|
|
result = site_page_repo.delete(1)
|
|
|
|
assert result is False
|