Remove obsolete scripts and files, update site builder configurations
- Deleted the `import_plans.py`, `run_tests.py`, and `test_run.py` scripts as they are no longer needed. - Updated the initial migration dependency in `0001_initial.py` to reflect recent changes in the `igny8_core_auth` app. - Enhanced the implementation plan documentation to include new phases and updates on the site builder project. - Updated the `vite.config.ts` and `package.json` to integrate testing configurations and dependencies for the site builder.
This commit is contained in:
@@ -8,7 +8,7 @@ class Migration(migrations.Migration):
|
||||
initial = True
|
||||
|
||||
dependencies = [
|
||||
('igny8_core_auth', '0008_passwordresettoken_alter_industry_options_and_more'),
|
||||
('igny8_core_auth', '0014_remove_plan_operation_limits_phase0'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
|
||||
|
||||
90
backend/igny8_core/business/site_building/tests/base.py
Normal file
90
backend/igny8_core/business/site_building/tests/base.py
Normal file
@@ -0,0 +1,90 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from decimal import Decimal
|
||||
|
||||
from django.test import TestCase
|
||||
|
||||
from igny8_core.auth.models import (
|
||||
Account,
|
||||
Industry,
|
||||
IndustrySector,
|
||||
Plan,
|
||||
Sector,
|
||||
Site,
|
||||
User,
|
||||
)
|
||||
from igny8_core.business.site_building.models import PageBlueprint, SiteBlueprint
|
||||
|
||||
|
||||
class SiteBuilderTestBase(TestCase):
|
||||
"""
|
||||
Provides a lightweight set of fixtures (account/site/sector/blueprint)
|
||||
so Site Builder tests can focus on service logic instead of boilerplate.
|
||||
"""
|
||||
|
||||
def setUp(self):
|
||||
super().setUp()
|
||||
self.plan = Plan.objects.create(
|
||||
name='Test Plan',
|
||||
slug='test-plan',
|
||||
price=Decimal('0.00'),
|
||||
included_credits=1000,
|
||||
)
|
||||
self.user = User.objects.create_user(
|
||||
username='blueprint-owner',
|
||||
email='owner@example.com',
|
||||
password='testpass123',
|
||||
role='owner',
|
||||
)
|
||||
self.account = Account.objects.create(
|
||||
name='Site Builder Account',
|
||||
slug='site-builder-account',
|
||||
owner=self.user,
|
||||
plan=self.plan,
|
||||
)
|
||||
self.user.account = self.account
|
||||
self.user.save()
|
||||
|
||||
self.industry = Industry.objects.create(name='Automation', slug='automation')
|
||||
self.industry_sector = IndustrySector.objects.create(
|
||||
industry=self.industry,
|
||||
name='Robotics',
|
||||
slug='robotics',
|
||||
)
|
||||
self.site = Site.objects.create(
|
||||
name='Acme Robotics',
|
||||
slug='acme-robotics',
|
||||
account=self.account,
|
||||
industry=self.industry,
|
||||
)
|
||||
self.sector = Sector.objects.create(
|
||||
site=self.site,
|
||||
industry_sector=self.industry_sector,
|
||||
name='Warehouse Automation',
|
||||
slug='warehouse-automation',
|
||||
account=self.account,
|
||||
)
|
||||
|
||||
self.blueprint = SiteBlueprint.objects.create(
|
||||
site=self.site,
|
||||
sector=self.sector,
|
||||
name='Core Blueprint',
|
||||
description='Initial blueprint used for tests',
|
||||
hosting_type='igny8_sites',
|
||||
config_json={
|
||||
'business_brief': 'Default brief',
|
||||
'objectives': ['Drive demos'],
|
||||
'style': {'palette': 'bold'},
|
||||
},
|
||||
)
|
||||
self.page_blueprint = PageBlueprint.objects.create(
|
||||
site_blueprint=self.blueprint,
|
||||
slug='home',
|
||||
title='Home',
|
||||
type='home',
|
||||
blocks_json=[{'type': 'hero', 'heading': 'Welcome'}],
|
||||
status='draft',
|
||||
order=0,
|
||||
)
|
||||
|
||||
|
||||
@@ -0,0 +1,97 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from unittest.mock import MagicMock, patch
|
||||
|
||||
from igny8_core.business.billing.exceptions import InsufficientCreditsError
|
||||
from igny8_core.business.content.models import Tasks
|
||||
from igny8_core.business.site_building.services.page_generation_service import PageGenerationService
|
||||
from igny8_core.business.site_building.services.structure_generation_service import (
|
||||
StructureGenerationService,
|
||||
)
|
||||
|
||||
from .base import SiteBuilderTestBase
|
||||
|
||||
|
||||
class StructureGenerationServiceTests(SiteBuilderTestBase):
|
||||
"""Covers the orchestration path for generating site structures."""
|
||||
|
||||
@patch('igny8_core.ai.tasks.run_ai_task')
|
||||
@patch('igny8_core.business.site_building.services.structure_generation_service.CreditService.check_credits')
|
||||
def test_generate_structure_updates_config_and_dispatches_task(self, mock_check, mock_run_ai):
|
||||
mock_async_result = MagicMock()
|
||||
mock_async_result.id = 'celery-123'
|
||||
mock_run_ai.delay.return_value = mock_async_result
|
||||
|
||||
service = StructureGenerationService()
|
||||
payload = {
|
||||
'business_brief': 'We build autonomous fulfillment robots.',
|
||||
'objectives': ['Book more demos'],
|
||||
'style_preferences': {'palette': 'cool', 'personality': 'optimistic'},
|
||||
'metadata': {'requested_by': 'integration-test'},
|
||||
}
|
||||
|
||||
result = service.generate_structure(self.blueprint, **payload)
|
||||
|
||||
self.assertTrue(result['success'])
|
||||
self.assertEqual(result['task_id'], 'celery-123')
|
||||
mock_check.assert_called_once_with(self.account, 'site_structure_generation')
|
||||
mock_run_ai.delay.assert_called_once()
|
||||
|
||||
self.blueprint.refresh_from_db()
|
||||
self.assertEqual(self.blueprint.status, 'generating')
|
||||
self.assertEqual(self.blueprint.config_json['business_brief'], payload['business_brief'])
|
||||
self.assertEqual(self.blueprint.config_json['objectives'], payload['objectives'])
|
||||
self.assertEqual(self.blueprint.config_json['style'], payload['style_preferences'])
|
||||
self.assertIn('last_requested_at', self.blueprint.config_json)
|
||||
self.assertEqual(self.blueprint.config_json['metadata'], payload['metadata'])
|
||||
|
||||
@patch('igny8_core.business.site_building.services.structure_generation_service.CreditService.check_credits')
|
||||
def test_generate_structure_rolls_back_when_insufficient_credits(self, mock_check):
|
||||
mock_check.side_effect = InsufficientCreditsError('No credits remaining')
|
||||
service = StructureGenerationService()
|
||||
|
||||
with self.assertRaises(InsufficientCreditsError):
|
||||
service.generate_structure(
|
||||
self.blueprint,
|
||||
business_brief='Too expensive request',
|
||||
)
|
||||
|
||||
self.blueprint.refresh_from_db()
|
||||
self.assertEqual(self.blueprint.status, 'draft')
|
||||
|
||||
|
||||
class PageGenerationServiceTests(SiteBuilderTestBase):
|
||||
"""Ensures Site Builder pages correctly leverage the Writer pipeline."""
|
||||
|
||||
@patch('igny8_core.business.site_building.services.page_generation_service.ContentGenerationService.generate_content')
|
||||
def test_generate_page_content_creates_writer_task(self, mock_generate_content):
|
||||
mock_generate_content.return_value = {'success': True}
|
||||
service = PageGenerationService()
|
||||
|
||||
result = service.generate_page_content(self.page_blueprint)
|
||||
|
||||
created_task = Tasks.objects.get()
|
||||
expected_title = '[Site Builder] Home'
|
||||
self.assertEqual(created_task.title, expected_title)
|
||||
mock_generate_content.assert_called_once_with([created_task.id], self.account)
|
||||
self.page_blueprint.refresh_from_db()
|
||||
self.assertEqual(self.page_blueprint.status, 'generating')
|
||||
self.assertEqual(result, {'success': True})
|
||||
|
||||
@patch('igny8_core.business.site_building.services.page_generation_service.ContentGenerationService.generate_content')
|
||||
def test_regenerate_page_replaces_writer_task(self, mock_generate_content):
|
||||
mock_generate_content.return_value = {'success': True}
|
||||
service = PageGenerationService()
|
||||
|
||||
first_result = service.generate_page_content(self.page_blueprint)
|
||||
first_task_id = Tasks.objects.get().id
|
||||
self.assertEqual(first_result, {'success': True})
|
||||
|
||||
second_result = service.regenerate_page(self.page_blueprint)
|
||||
second_task = Tasks.objects.get()
|
||||
self.assertEqual(second_result, {'success': True})
|
||||
self.assertNotEqual(first_task_id, second_task.id)
|
||||
self.assertEqual(Tasks.objects.count(), 1)
|
||||
self.assertEqual(mock_generate_content.call_count, 2)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user