This commit is contained in:
alorig
2025-11-18 06:50:35 +05:00
parent ef16ad760f
commit 873f97ea3f
27 changed files with 1717 additions and 4 deletions

View File

@@ -0,0 +1,5 @@
"""
Publishing Tests
Phase 5: Sites Renderer & Publishing
"""

View File

@@ -0,0 +1,97 @@
"""
Tests for Publishing Adapters
Phase 6: Site Integration & Multi-Destination Publishing
"""
from django.test import TestCase
from unittest.mock import Mock, patch
from igny8_core.auth.models import Account, Site, Sector
from igny8_core.business.publishing.services.adapters.base_adapter import BaseAdapter
from igny8_core.business.publishing.services.adapters.sites_renderer_adapter import SitesRendererAdapter
from igny8_core.business.publishing.services.adapters.wordpress_adapter import WordPressAdapter
from igny8_core.business.site_building.models import SiteBlueprint
class AdapterPatternTestCase(TestCase):
"""Test cases for adapter pattern"""
def setUp(self):
"""Set up test data"""
self.account = Account.objects.create(name="Test Account")
self.site = Site.objects.create(
account=self.account,
name="Test Site",
slug="test-site"
)
self.sector = Sector.objects.create(
account=self.account,
site=self.site,
name="Test Sector",
slug="test-sector"
)
self.blueprint = SiteBlueprint.objects.create(
account=self.account,
site=self.site,
sector=self.sector,
name="Test Blueprint",
status='ready'
)
def test_sites_renderer_adapter_implements_base_interface(self):
"""Test: Adapter pattern works correctly"""
adapter = SitesRendererAdapter()
self.assertIsInstance(adapter, BaseAdapter)
self.assertTrue(hasattr(adapter, 'publish'))
self.assertTrue(hasattr(adapter, 'test_connection'))
self.assertTrue(hasattr(adapter, 'get_status'))
def test_wordpress_adapter_implements_base_interface(self):
"""Test: Adapter pattern works correctly"""
adapter = WordPressAdapter()
self.assertIsInstance(adapter, BaseAdapter)
self.assertTrue(hasattr(adapter, 'publish'))
self.assertTrue(hasattr(adapter, 'test_connection'))
self.assertTrue(hasattr(adapter, 'get_status'))
def test_sites_renderer_adapter_deploys_site(self):
"""Test: Multi-destination publishing works"""
adapter = SitesRendererAdapter()
result = adapter.deploy(self.blueprint)
self.assertTrue(result.get('success'))
self.assertIsNotNone(result.get('deployment_url'))
self.assertIsNotNone(result.get('version'))
def test_wordpress_adapter_publishes_content(self):
"""Test: Multi-destination publishing works"""
from igny8_core.business.content.models import Content
content = Content.objects.create(
account=self.account,
site=self.site,
sector=self.sector,
title="Test Content",
html_content="<p>Test</p>"
)
adapter = WordPressAdapter()
config = {
'url': 'https://example.com',
'username': 'test',
'password': 'test'
}
with patch('igny8_core.utils.wordpress.WordPressClient') as mock_client:
mock_instance = Mock()
mock_instance.create_post.return_value = {'id': 123, 'link': 'https://example.com/post/123'}
mock_client.return_value = mock_instance
result = adapter.publish(content, config)
self.assertTrue(result.get('success'))
self.assertIsNotNone(result.get('external_id'))
self.assertIsNotNone(result.get('url'))

View File

@@ -0,0 +1,107 @@
"""
Tests for DeploymentService
Phase 5: Sites Renderer & Publishing
"""
from django.test import TestCase
from django.utils import timezone
from igny8_core.auth.models import Account, Site, Sector
from igny8_core.business.site_building.models import SiteBlueprint
from igny8_core.business.publishing.models import DeploymentRecord
from igny8_core.business.publishing.services.deployment_service import DeploymentService
class DeploymentServiceTestCase(TestCase):
"""Test cases for DeploymentService"""
def setUp(self):
"""Set up test data"""
self.account = Account.objects.create(name="Test Account")
self.site = Site.objects.create(
account=self.account,
name="Test Site",
slug="test-site"
)
self.sector = Sector.objects.create(
account=self.account,
site=self.site,
name="Test Sector",
slug="test-sector"
)
self.blueprint = SiteBlueprint.objects.create(
account=self.account,
site=self.site,
sector=self.sector,
name="Test Blueprint",
status='ready',
version=1
)
self.service = DeploymentService()
def test_get_status_returns_deployed_record(self):
"""Test: Sites are accessible publicly"""
DeploymentRecord.objects.create(
account=self.account,
site=self.site,
sector=self.sector,
site_blueprint=self.blueprint,
version=1,
status='deployed',
deployment_url='https://test-site.igny8.com',
deployed_at=timezone.now()
)
status = self.service.get_status(self.blueprint)
self.assertIsNotNone(status)
self.assertEqual(status.status, 'deployed')
self.assertEqual(status.deployment_url, 'https://test-site.igny8.com')
def test_get_latest_deployment_returns_most_recent(self):
"""Test: Deployment works end-to-end"""
DeploymentRecord.objects.create(
account=self.account,
site=self.site,
sector=self.sector,
site_blueprint=self.blueprint,
version=1,
status='failed',
created_at=timezone.now()
)
latest = DeploymentRecord.objects.create(
account=self.account,
site=self.site,
sector=self.sector,
site_blueprint=self.blueprint,
version=2,
status='deployed',
deployment_url='https://test-site.igny8.com',
deployed_at=timezone.now()
)
result = self.service.get_latest_deployment(self.blueprint)
self.assertIsNotNone(result)
self.assertEqual(result.version, 2)
self.assertEqual(result.status, 'deployed')
def test_rollback_reverts_to_previous_version(self):
"""Test: Deployment works end-to-end"""
DeploymentRecord.objects.create(
account=self.account,
site=self.site,
sector=self.sector,
site_blueprint=self.blueprint,
version=1,
status='deployed',
deployment_url='https://test-site.igny8.com',
deployed_at=timezone.now()
)
result = self.service.rollback(self.blueprint, target_version=1)
self.assertTrue(result.get('success'))
self.blueprint.refresh_from_db()
self.assertEqual(self.blueprint.deployed_version, 1)

View File

@@ -0,0 +1,114 @@
"""
Tests for PublisherService
Phase 5: Sites Renderer & Publishing
"""
from django.test import TestCase
from django.utils import timezone
from unittest.mock import Mock, patch
from igny8_core.auth.models import Account, Site, Sector
from igny8_core.business.site_building.models import SiteBlueprint
from igny8_core.business.publishing.models import PublishingRecord, DeploymentRecord
from igny8_core.business.publishing.services.publisher_service import PublisherService
class PublisherServiceTestCase(TestCase):
"""Test cases for PublisherService"""
def setUp(self):
"""Set up test data"""
from igny8_core.business.site_building.tests.base import SiteBuilderTestBase
# Use SiteBuilderTestBase pattern if available, otherwise create manually
self.account = Account.objects.create(name="Test Account")
self.site = Site.objects.create(
account=self.account,
name="Test Site",
slug="test-site"
)
self.sector = Sector.objects.create(
account=self.account,
site=self.site,
name="Test Sector",
slug="test-sector"
)
self.blueprint = SiteBlueprint.objects.create(
account=self.account,
site=self.site,
sector=self.sector,
name="Test Blueprint",
status='ready'
)
self.service = PublisherService()
def test_publish_to_sites_creates_deployment_record(self):
"""Test: Deployment works end-to-end"""
with patch('igny8_core.business.publishing.services.adapters.sites_renderer_adapter.SitesRendererAdapter.deploy') as mock_deploy:
mock_deploy.return_value = {
'success': True,
'deployment_url': 'https://test-site.igny8.com',
'version': 1
}
result = self.service.publish_to_sites(self.blueprint)
self.assertTrue(result.get('success'))
self.assertIsNotNone(result.get('deployment_url'))
# Verify deployment record was created
deployment = DeploymentRecord.objects.filter(site_blueprint=self.blueprint).first()
self.assertIsNotNone(deployment)
def test_get_deployment_status_returns_latest(self):
"""Test: Sites are accessible publicly"""
DeploymentRecord.objects.create(
account=self.account,
site=self.site,
sector=self.sector,
site_blueprint=self.blueprint,
version=1,
status='deployed',
deployment_url='https://test-site.igny8.com',
deployed_at=timezone.now()
)
status = self.service.get_deployment_status(self.blueprint)
self.assertIsNotNone(status)
self.assertEqual(status.status, 'deployed')
self.assertIsNotNone(status.deployment_url)
def test_publish_content_to_multiple_destinations(self):
"""Test: Multi-destination publishing works"""
from igny8_core.business.content.models import Content
content = Content.objects.create(
account=self.account,
site=self.site,
sector=self.sector,
title="Test Content",
html_content="<p>Test</p>"
)
with patch.object(self.service, '_get_adapter') as mock_get_adapter:
mock_adapter = Mock()
mock_adapter.publish.return_value = {
'success': True,
'external_id': '123',
'url': 'https://example.com/post/123'
}
mock_get_adapter.return_value = mock_adapter
result = self.service.publish_content(
content_id=content.id,
destinations=['wordpress', 'sites'],
account=self.account
)
self.assertTrue(result.get('success'))
self.assertEqual(len(result.get('results', [])), 2)
# Verify publishing records were created
records = PublishingRecord.objects.filter(content=content)
self.assertEqual(records.count(), 2)