Big-Link-Man/tests/integration/test_content_generation.py

195 lines
6.3 KiB
Python

"""
Integration tests for content generation pipeline
"""
import pytest
import os
from unittest.mock import Mock, patch
from src.database.models import Project, User, GeneratedContent
from src.database.repositories import ProjectRepository, GeneratedContentRepository
from src.generation.service import ContentGenerationService
from src.generation.job_config import JobConfig, TierConfig, ModelConfig
@pytest.fixture
def test_project(db_session):
"""Create a test project"""
user = User(
username="testuser",
hashed_password="hashed",
role="User"
)
db_session.add(user)
db_session.commit()
project_data = {
"main_keyword": "test automation",
"word_count": 1000,
"term_frequency": 3,
"h2_total": 5,
"h2_exact": 1,
"h2_related_search": 1,
"h2_entities": 2,
"h3_total": 10,
"h3_exact": 1,
"h3_related_search": 2,
"h3_entities": 3,
"entities": ["automation tool", "testing framework", "ci/cd"],
"related_searches": ["test automation best practices", "automation frameworks"]
}
project_repo = ProjectRepository(db_session)
project = project_repo.create(user.id, "Test Project", project_data)
return project
@pytest.mark.integration
def test_generated_content_repository(db_session, test_project):
"""Test GeneratedContentRepository CRUD operations"""
repo = GeneratedContentRepository(db_session)
content = repo.create(test_project.id, tier=1)
assert content.id is not None
assert content.project_id == test_project.id
assert content.tier == 1
assert content.status == "pending"
assert content.generation_stage == "title"
retrieved = repo.get_by_id(content.id)
assert retrieved is not None
assert retrieved.id == content.id
project_contents = repo.get_by_project_id(test_project.id)
assert len(project_contents) == 1
assert project_contents[0].id == content.id
content.title = "Test Title"
content.status = "completed"
updated = repo.update(content)
assert updated.title == "Test Title"
assert updated.status == "completed"
success = repo.set_active(content.id, test_project.id, tier=1)
assert success is True
active = repo.get_active_by_project(test_project.id, tier=1)
assert active is not None
assert active.id == content.id
assert active.is_active is True
@pytest.mark.integration
@patch.dict(os.environ, {"AI_API_KEY": "test-key"})
def test_content_generation_service_initialization(db_session):
"""Test ContentGenerationService initializes correctly"""
with patch('src.generation.ai_client.OpenAI'):
service = ContentGenerationService(db_session)
assert service.session is not None
assert service.config is not None
assert service.ai_client is not None
assert service.content_repo is not None
assert service.rule_engine is not None
assert service.validator is not None
assert service.augmenter is not None
@pytest.mark.integration
@patch.dict(os.environ, {"AI_API_KEY": "test-key"})
def test_content_generation_flow_mocked(db_session, test_project):
"""Test full content generation flow with mocked AI"""
with patch('src.generation.ai_client.OpenAI'):
service = ContentGenerationService(db_session)
service.ai_client.generate = Mock(return_value="Test Automation: Complete Guide")
outline = {
"h1": "Test Automation Overview",
"sections": [
{"h2": "Test Automation Basics", "h3s": ["Getting Started", "Best Practices"]},
{"h2": "Advanced Topics", "h3s": ["CI/CD Integration"]},
{"h2": "Frequently Asked Questions", "h3s": ["What is test automation?", "How to start?"]}
]
}
service.ai_client.generate_json = Mock(return_value=outline)
html_content = """
<h1>Test Automation Overview</h1>
<p>Test automation is essential for modern software development.</p>
<h2>Test Automation Basics</h2>
<p>Understanding test automation fundamentals is crucial.</p>
<h3>Getting Started</h3>
<p>Begin with test automation frameworks and tools.</p>
<h3>Best Practices</h3>
<p>Follow test automation best practices for success.</p>
<h2>Advanced Topics</h2>
<p>Explore advanced test automation techniques.</p>
<h3>CI/CD Integration</h3>
<p>Integrate test automation with ci/cd pipelines.</p>
<h2>Frequently Asked Questions</h2>
<h3>What is test automation?</h3>
<p>What is test automation? Test automation is the practice of running tests automatically.</p>
<h3>How to start?</h3>
<p>How to start? Begin by selecting an automation tool and testing framework.</p>
"""
service.ai_client.generate = Mock(side_effect=[
"Test Automation: Complete Guide",
html_content
])
try:
content = service.generate_article(
project=test_project,
tier=1,
title_model="test-model",
outline_model="test-model",
content_model="test-model",
max_retries=1
)
assert content is not None
assert content.title is not None
assert content.outline is not None
assert content.status in ["completed", "failed"]
except Exception as e:
pytest.skip(f"Generation failed (expected in mocked test): {e}")
@pytest.mark.integration
def test_job_config_validation():
"""Test JobConfig validation"""
models = ModelConfig(
title="anthropic/claude-3.5-sonnet",
outline="anthropic/claude-3.5-sonnet",
content="anthropic/claude-3.5-sonnet"
)
tier = TierConfig(
tier=1,
article_count=5,
models=models
)
job = JobConfig(
job_name="Integration Test Job",
project_id=1,
tiers=[tier]
)
assert job.get_total_articles() == 5
assert len(job.tiers) == 1
assert job.tiers[0].tier == 1