Implement content synchronization from WordPress and Shopify in ContentSyncService

- Added methods to sync content from WordPress and Shopify to IGNY8, including error handling and logging.
- Introduced internal methods for fetching posts from WordPress and products from Shopify.
- Updated IntegrationService to include a method for retrieving active integrations for a site.
- Enhanced test cases to cover new functionality and ensure proper setup of test data, including industry and sector associations.
This commit is contained in:
IGNY8 VPS (Salman)
2025-11-18 02:07:22 +00:00
parent 873f97ea3f
commit 51c3986e01
12 changed files with 583 additions and 64 deletions

View File

@@ -5,7 +5,7 @@ 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.auth.models import Account, Site, Sector, User, Plan, Industry, IndustrySector
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
@@ -17,15 +17,56 @@ class AdapterPatternTestCase(TestCase):
def setUp(self):
"""Set up test data"""
self.account = Account.objects.create(name="Test Account")
# Create plan first
self.plan = Plan.objects.create(
name="Test Plan",
slug="test-plan",
price=0,
credits_per_month=1000
)
# Create user first (Account needs owner)
self.user = User.objects.create_user(
username='testuser',
email='test@test.com',
password='testpass123',
role='owner'
)
# Create account with owner
self.account = Account.objects.create(
name="Test Account",
slug="test-account",
plan=self.plan,
owner=self.user
)
# Update user to have account
self.user.account = self.account
self.user.save()
# Create industry and sector
self.industry = Industry.objects.create(
name="Test Industry",
slug="test-industry"
)
self.industry_sector = IndustrySector.objects.create(
industry=self.industry,
name="Test Sector",
slug="test-sector"
)
self.site = Site.objects.create(
account=self.account,
name="Test Site",
slug="test-site"
slug="test-site",
industry=self.industry
)
self.sector = Sector.objects.create(
account=self.account,
site=self.site,
industry_sector=self.industry_sector,
name="Test Sector",
slug="test-sector"
)
@@ -79,15 +120,16 @@ class AdapterPatternTestCase(TestCase):
adapter = WordPressAdapter()
config = {
'url': 'https://example.com',
'site_url': 'https://example.com',
'username': 'test',
'password': 'test'
'app_password': 'test'
}
with patch('igny8_core.utils.wordpress.WordPressClient') as mock_client:
# Patch WordPressClient at the point where it's used in the adapter
with patch('igny8_core.business.publishing.services.adapters.wordpress_adapter.WordPressClient') as mock_client_class:
mock_instance = Mock()
mock_instance.create_post.return_value = {'id': 123, 'link': 'https://example.com/post/123'}
mock_client.return_value = mock_instance
mock_client_class.return_value = mock_instance
result = adapter.publish(content, config)

View File

@@ -5,7 +5,7 @@ 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.auth.models import Account, Site, Sector, User, Plan, Industry, IndustrySector
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
@@ -16,15 +16,56 @@ class DeploymentServiceTestCase(TestCase):
def setUp(self):
"""Set up test data"""
self.account = Account.objects.create(name="Test Account")
# Create plan first
self.plan = Plan.objects.create(
name="Test Plan",
slug="test-plan",
price=0,
credits_per_month=1000
)
# Create user first (Account needs owner)
self.user = User.objects.create_user(
username='testuser',
email='test@test.com',
password='testpass123',
role='owner'
)
# Create account with owner
self.account = Account.objects.create(
name="Test Account",
slug="test-account",
plan=self.plan,
owner=self.user
)
# Update user to have account
self.user.account = self.account
self.user.save()
# Create industry and sector
self.industry = Industry.objects.create(
name="Test Industry",
slug="test-industry"
)
self.industry_sector = IndustrySector.objects.create(
industry=self.industry,
name="Test Sector",
slug="test-sector"
)
self.site = Site.objects.create(
account=self.account,
name="Test Site",
slug="test-site"
slug="test-site",
industry=self.industry
)
self.sector = Sector.objects.create(
account=self.account,
site=self.site,
industry_sector=self.industry_sector,
name="Test Sector",
slug="test-sector"
)

View File

@@ -6,7 +6,7 @@ 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.auth.models import Account, Site, Sector, User, Plan, Industry, IndustrySector
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
@@ -17,18 +17,56 @@ class PublisherServiceTestCase(TestCase):
def setUp(self):
"""Set up test data"""
from igny8_core.business.site_building.tests.base import SiteBuilderTestBase
# Create plan first
self.plan = Plan.objects.create(
name="Test Plan",
slug="test-plan",
price=0,
credits_per_month=1000
)
# Create user first (Account needs owner)
self.user = User.objects.create_user(
username='testuser',
email='test@test.com',
password='testpass123',
role='owner'
)
# Create account with owner
self.account = Account.objects.create(
name="Test Account",
slug="test-account",
plan=self.plan,
owner=self.user
)
# Update user to have account
self.user.account = self.account
self.user.save()
# Create industry and sector
self.industry = Industry.objects.create(
name="Test Industry",
slug="test-industry"
)
self.industry_sector = IndustrySector.objects.create(
industry=self.industry,
name="Test Sector",
slug="test-sector"
)
# 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"
slug="test-site",
industry=self.industry
)
self.sector = Sector.objects.create(
account=self.account,
site=self.site,
industry_sector=self.industry_sector,
name="Test Sector",
slug="test-sector"
)
@@ -43,12 +81,11 @@ class PublisherServiceTestCase(TestCase):
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
}
# Don't mock deploy - let it run to create the deployment record
# But mock the filesystem operations to avoid actual file writes
with patch('igny8_core.business.publishing.services.adapters.sites_renderer_adapter.Path.mkdir'), \
patch('igny8_core.business.publishing.services.adapters.sites_renderer_adapter.open', create=True) as mock_open:
mock_file = mock_open.return_value.__enter__.return_value
result = self.service.publish_to_sites(self.blueprint)