589 lines
22 KiB
Python
589 lines
22 KiB
Python
"""
|
|
Test Enhanced Strategy Service - Phase 1 Implementation
|
|
Validates the enhanced strategy service with 30+ strategic inputs and AI recommendations.
|
|
"""
|
|
|
|
import asyncio
|
|
from datetime import datetime
|
|
from typing import Dict, Any
|
|
|
|
# Import models
|
|
from models.enhanced_strategy_models import EnhancedContentStrategy, EnhancedAIAnalysisResult, OnboardingDataIntegration
|
|
|
|
# Import services
|
|
from api.content_planning.services.enhanced_strategy_service import EnhancedStrategyService
|
|
from services.enhanced_strategy_db_service import EnhancedStrategyDBService
|
|
|
|
class TestEnhancedStrategyPhase1:
|
|
"""Test class for Enhanced Strategy Service Phase 1 implementation."""
|
|
|
|
def get_sample_strategy_data(self) -> Dict[str, Any]:
|
|
"""Sample strategy data for testing."""
|
|
return {
|
|
'user_id': 1,
|
|
'name': 'Test Enhanced Strategy',
|
|
'industry': 'technology',
|
|
|
|
# Business Context (8 inputs)
|
|
'business_objectives': {
|
|
'primary': 'Increase brand awareness',
|
|
'secondary': ['Lead generation', 'Customer engagement']
|
|
},
|
|
'target_metrics': {
|
|
'traffic': '50% increase',
|
|
'engagement': '25% improvement',
|
|
'conversions': '15% growth'
|
|
},
|
|
'content_budget': 5000.0,
|
|
'team_size': 3,
|
|
'implementation_timeline': '6 months',
|
|
'market_share': '2.5%',
|
|
'competitive_position': 'challenger',
|
|
'performance_metrics': {
|
|
'current_traffic': 10000,
|
|
'current_engagement': 3.2,
|
|
'current_conversions': 2.1
|
|
},
|
|
|
|
# Audience Intelligence (6 inputs)
|
|
'content_preferences': {
|
|
'formats': ['blog_posts', 'videos', 'infographics'],
|
|
'topics': ['technology', 'business', 'innovation'],
|
|
'tone': 'professional'
|
|
},
|
|
'consumption_patterns': {
|
|
'peak_times': ['9-11 AM', '2-4 PM'],
|
|
'devices': ['desktop', 'mobile'],
|
|
'channels': ['website', 'social_media']
|
|
},
|
|
'audience_pain_points': [
|
|
'Complex technology solutions',
|
|
'Limited time for research',
|
|
'Need for practical implementation'
|
|
],
|
|
'buying_journey': {
|
|
'awareness': 'Social media, SEO',
|
|
'consideration': 'Case studies, demos',
|
|
'decision': 'Free trials, consultations'
|
|
},
|
|
'seasonal_trends': {
|
|
'Q1': 'New year planning content',
|
|
'Q2': 'Spring technology updates',
|
|
'Q3': 'Summer optimization',
|
|
'Q4': 'Year-end reviews'
|
|
},
|
|
'engagement_metrics': {
|
|
'avg_time_on_page': 2.5,
|
|
'bounce_rate': 45.2,
|
|
'social_shares': 150
|
|
},
|
|
|
|
# Competitive Intelligence (5 inputs)
|
|
'top_competitors': [
|
|
'Competitor A',
|
|
'Competitor B',
|
|
'Competitor C'
|
|
],
|
|
'competitor_content_strategies': {
|
|
'Competitor A': 'High-frequency blog posts',
|
|
'Competitor B': 'Video-focused content',
|
|
'Competitor C': 'Whitepaper strategy'
|
|
},
|
|
'market_gaps': [
|
|
'Interactive content experiences',
|
|
'AI-powered personalization',
|
|
'Industry-specific solutions'
|
|
],
|
|
'industry_trends': [
|
|
'AI integration',
|
|
'Remote work solutions',
|
|
'Sustainability focus'
|
|
],
|
|
'emerging_trends': [
|
|
'Voice search optimization',
|
|
'Video-first content',
|
|
'Personalization at scale'
|
|
],
|
|
|
|
# Content Strategy (7 inputs)
|
|
'preferred_formats': ['blog_posts', 'videos', 'webinars'],
|
|
'content_mix': {
|
|
'blog_posts': 40,
|
|
'videos': 30,
|
|
'webinars': 20,
|
|
'infographics': 10
|
|
},
|
|
'content_frequency': 'weekly',
|
|
'optimal_timing': {
|
|
'blog_posts': 'Tuesday 9 AM',
|
|
'videos': 'Thursday 2 PM',
|
|
'social_posts': 'Daily 10 AM'
|
|
},
|
|
'quality_metrics': {
|
|
'readability_score': 8.5,
|
|
'engagement_threshold': 3.0,
|
|
'conversion_target': 2.5
|
|
},
|
|
'editorial_guidelines': {
|
|
'tone': 'professional',
|
|
'style': 'clear and concise',
|
|
'formatting': 'scannable'
|
|
},
|
|
'brand_voice': {
|
|
'personality': 'innovative',
|
|
'tone': 'authoritative',
|
|
'style': 'informative'
|
|
},
|
|
|
|
# Performance & Analytics (4 inputs)
|
|
'traffic_sources': {
|
|
'organic': 45,
|
|
'social': 25,
|
|
'direct': 20,
|
|
'referral': 10
|
|
},
|
|
'conversion_rates': {
|
|
'overall': 2.1,
|
|
'blog_posts': 1.8,
|
|
'videos': 3.2,
|
|
'webinars': 5.5
|
|
},
|
|
'content_roi_targets': {
|
|
'target_roi': 300,
|
|
'cost_per_lead': 50,
|
|
'lifetime_value': 500
|
|
},
|
|
'ab_testing_capabilities': True
|
|
}
|
|
|
|
def test_enhanced_strategy_model_creation(self):
|
|
"""Test creating enhanced strategy model with 30+ inputs."""
|
|
sample_strategy_data = self.get_sample_strategy_data()
|
|
strategy = EnhancedContentStrategy(**sample_strategy_data)
|
|
|
|
# Verify all fields are set
|
|
assert strategy.user_id == 1
|
|
assert strategy.name == 'Test Enhanced Strategy'
|
|
assert strategy.industry == 'technology'
|
|
|
|
# Verify business context fields
|
|
assert strategy.business_objectives is not None
|
|
assert strategy.target_metrics is not None
|
|
assert strategy.content_budget == 5000.0
|
|
assert strategy.team_size == 3
|
|
|
|
# Verify audience intelligence fields
|
|
assert strategy.content_preferences is not None
|
|
assert strategy.consumption_patterns is not None
|
|
assert strategy.audience_pain_points is not None
|
|
|
|
# Verify competitive intelligence fields
|
|
assert strategy.top_competitors is not None
|
|
assert strategy.market_gaps is not None
|
|
assert strategy.industry_trends is not None
|
|
|
|
# Verify content strategy fields
|
|
assert strategy.preferred_formats is not None
|
|
assert strategy.content_mix is not None
|
|
assert strategy.content_frequency == 'weekly'
|
|
|
|
# Verify performance analytics fields
|
|
assert strategy.traffic_sources is not None
|
|
assert strategy.conversion_rates is not None
|
|
assert strategy.ab_testing_capabilities is True
|
|
|
|
print("✅ Enhanced strategy model creation test passed")
|
|
|
|
def test_completion_percentage_calculation(self):
|
|
"""Test completion percentage calculation for 30+ inputs."""
|
|
sample_strategy_data = self.get_sample_strategy_data()
|
|
strategy = EnhancedContentStrategy(**sample_strategy_data)
|
|
|
|
# Calculate completion percentage
|
|
completion = strategy.calculate_completion_percentage()
|
|
|
|
# Should be high since we provided most fields
|
|
assert completion > 80
|
|
assert strategy.completion_percentage > 80
|
|
|
|
print(f"✅ Completion percentage calculation test passed: {completion}%")
|
|
|
|
def test_enhanced_strategy_to_dict(self):
|
|
"""Test enhanced strategy to_dict method."""
|
|
sample_strategy_data = self.get_sample_strategy_data()
|
|
strategy = EnhancedContentStrategy(**sample_strategy_data)
|
|
strategy_dict = strategy.to_dict()
|
|
|
|
# Verify all categories are present
|
|
assert 'business_objectives' in strategy_dict
|
|
assert 'content_preferences' in strategy_dict
|
|
assert 'top_competitors' in strategy_dict
|
|
assert 'preferred_formats' in strategy_dict
|
|
assert 'traffic_sources' in strategy_dict
|
|
|
|
# Verify metadata fields
|
|
assert 'completion_percentage' in strategy_dict
|
|
assert 'created_at' in strategy_dict
|
|
assert 'updated_at' in strategy_dict
|
|
|
|
print("✅ Enhanced strategy to_dict test passed")
|
|
|
|
def test_ai_analysis_result_model(self):
|
|
"""Test AI analysis result model creation."""
|
|
analysis_data = {
|
|
'user_id': 1,
|
|
'strategy_id': 1,
|
|
'analysis_type': 'comprehensive_strategy',
|
|
'comprehensive_insights': {
|
|
'strategic_positioning': 'Strong market position',
|
|
'content_pillars': ['Educational', 'Thought Leadership', 'Case Studies']
|
|
},
|
|
'audience_intelligence': {
|
|
'persona_insights': 'Tech-savvy professionals',
|
|
'engagement_patterns': 'Peak engagement on Tuesdays'
|
|
},
|
|
'competitive_intelligence': {
|
|
'competitor_analysis': 'Identified 3 key competitors',
|
|
'differentiation_opportunities': ['AI integration', 'Personalization']
|
|
},
|
|
'performance_optimization': {
|
|
'traffic_optimization': 'Focus on organic search',
|
|
'conversion_improvement': 'A/B test landing pages'
|
|
},
|
|
'content_calendar_optimization': {
|
|
'publishing_schedule': 'Tuesday/Thursday posts',
|
|
'content_mix': '40% blog, 30% video, 30% other'
|
|
},
|
|
'processing_time': 2.5,
|
|
'ai_service_status': 'operational'
|
|
}
|
|
|
|
analysis_result = EnhancedAIAnalysisResult(**analysis_data)
|
|
|
|
assert analysis_result.user_id == 1
|
|
assert analysis_result.strategy_id == 1
|
|
assert analysis_result.analysis_type == 'comprehensive_strategy'
|
|
assert analysis_result.processing_time == 2.5
|
|
assert analysis_result.ai_service_status == 'operational'
|
|
|
|
print("✅ AI analysis result model test passed")
|
|
|
|
def test_onboarding_integration_model(self):
|
|
"""Test onboarding data integration model creation."""
|
|
integration_data = {
|
|
'user_id': 1,
|
|
'strategy_id': 1,
|
|
'website_analysis_data': {
|
|
'writing_style': {'tone': 'professional'},
|
|
'target_audience': {'demographics': 'professionals'}
|
|
},
|
|
'research_preferences_data': {
|
|
'content_types': ['blog_posts', 'videos'],
|
|
'research_depth': 'comprehensive'
|
|
},
|
|
'auto_populated_fields': {
|
|
'content_preferences': 'website_analysis',
|
|
'target_audience': 'website_analysis',
|
|
'preferred_formats': 'research_preferences'
|
|
},
|
|
'field_mappings': {
|
|
'writing_style.tone': 'brand_voice.personality',
|
|
'content_types': 'preferred_formats'
|
|
},
|
|
'data_quality_scores': {
|
|
'website_analysis': 85.0,
|
|
'research_preferences': 90.0
|
|
},
|
|
'confidence_levels': {
|
|
'content_preferences': 0.8,
|
|
'target_audience': 0.8,
|
|
'preferred_formats': 0.7
|
|
}
|
|
}
|
|
|
|
integration = OnboardingDataIntegration(**integration_data)
|
|
|
|
assert integration.user_id == 1
|
|
assert integration.strategy_id == 1
|
|
assert integration.website_analysis_data is not None
|
|
assert integration.research_preferences_data is not None
|
|
assert integration.auto_populated_fields is not None
|
|
|
|
print("✅ Onboarding integration model test passed")
|
|
|
|
def test_enhanced_strategy_service_initialization(self):
|
|
"""Test enhanced strategy service initialization."""
|
|
service = EnhancedStrategyService()
|
|
|
|
# Verify strategic input fields are defined
|
|
assert 'business_context' in service.strategic_input_fields
|
|
assert 'audience_intelligence' in service.strategic_input_fields
|
|
assert 'competitive_intelligence' in service.strategic_input_fields
|
|
assert 'content_strategy' in service.strategic_input_fields
|
|
assert 'performance_analytics' in service.strategic_input_fields
|
|
|
|
# Verify field counts
|
|
total_fields = sum(len(fields) for fields in service.strategic_input_fields.values())
|
|
assert total_fields >= 30 # 30+ strategic inputs
|
|
|
|
print(f"✅ Enhanced strategy service initialization test passed: {total_fields} fields")
|
|
|
|
def test_specialized_prompt_creation(self):
|
|
"""Test specialized AI prompt creation."""
|
|
service = EnhancedStrategyService()
|
|
|
|
strategy_data = {
|
|
'name': 'Test Strategy',
|
|
'industry': 'technology',
|
|
'business_objectives': 'Increase brand awareness',
|
|
'target_metrics': '50% traffic growth',
|
|
'content_budget': 5000,
|
|
'team_size': 3
|
|
}
|
|
|
|
# Test each analysis type
|
|
analysis_types = [
|
|
'comprehensive_strategy',
|
|
'audience_intelligence',
|
|
'competitive_intelligence',
|
|
'performance_optimization',
|
|
'content_calendar_optimization'
|
|
]
|
|
|
|
for analysis_type in analysis_types:
|
|
prompt = service._create_specialized_prompt(analysis_type, strategy_data, None)
|
|
|
|
assert prompt is not None
|
|
assert len(prompt) > 0
|
|
assert 'Test Strategy' in prompt
|
|
|
|
# Check for either analysis type or relevant keywords
|
|
if analysis_type == 'performance_optimization':
|
|
assert 'optimization' in prompt.lower()
|
|
elif analysis_type == 'content_calendar_optimization':
|
|
assert 'optimization' in prompt.lower()
|
|
else:
|
|
assert analysis_type in prompt or 'analysis' in prompt.lower()
|
|
|
|
print("✅ Specialized prompt creation test passed")
|
|
|
|
def test_fallback_recommendations(self):
|
|
"""Test fallback recommendations when AI service fails."""
|
|
service = EnhancedStrategyService()
|
|
|
|
analysis_types = [
|
|
'comprehensive_strategy',
|
|
'audience_intelligence',
|
|
'competitive_intelligence',
|
|
'performance_optimization',
|
|
'content_calendar_optimization'
|
|
]
|
|
|
|
for analysis_type in analysis_types:
|
|
fallback = service._get_fallback_recommendations(analysis_type)
|
|
|
|
assert fallback is not None
|
|
assert 'recommendations' in fallback
|
|
assert 'insights' in fallback
|
|
assert 'metrics' in fallback
|
|
assert 'score' in fallback['metrics']
|
|
assert 'confidence' in fallback['metrics']
|
|
|
|
print("✅ Fallback recommendations test passed")
|
|
|
|
def test_data_quality_calculation(self):
|
|
"""Test data quality score calculation."""
|
|
service = EnhancedStrategyService()
|
|
|
|
data_sources = {
|
|
'website_analysis': {
|
|
'writing_style': {'tone': 'professional'},
|
|
'target_audience': {'demographics': 'professionals'},
|
|
'content_type': {'primary': 'blog_posts'}
|
|
},
|
|
'research_preferences': {
|
|
'content_types': ['blog_posts', 'videos'],
|
|
'research_depth': 'comprehensive'
|
|
}
|
|
}
|
|
|
|
quality_scores = service._calculate_data_quality_scores(data_sources)
|
|
|
|
assert 'website_analysis' in quality_scores
|
|
assert 'research_preferences' in quality_scores
|
|
assert quality_scores['website_analysis'] > 0
|
|
assert quality_scores['research_preferences'] > 0
|
|
|
|
print("✅ Data quality calculation test passed")
|
|
|
|
def test_confidence_level_calculation(self):
|
|
"""Test confidence level calculation for auto-populated fields."""
|
|
service = EnhancedStrategyService()
|
|
|
|
auto_populated_fields = {
|
|
'content_preferences': 'website_analysis',
|
|
'target_audience': 'website_analysis',
|
|
'preferred_formats': 'research_preferences'
|
|
}
|
|
|
|
confidence_levels = service._calculate_confidence_levels(auto_populated_fields)
|
|
|
|
assert 'content_preferences' in confidence_levels
|
|
assert 'target_audience' in confidence_levels
|
|
assert 'preferred_formats' in confidence_levels
|
|
|
|
# Verify confidence levels are between 0 and 1
|
|
for field, confidence in confidence_levels.items():
|
|
assert 0 <= confidence <= 1
|
|
|
|
print("✅ Confidence level calculation test passed")
|
|
|
|
def test_strategic_scores_calculation(self):
|
|
"""Test strategic scores calculation from AI recommendations."""
|
|
service = EnhancedStrategyService()
|
|
|
|
ai_recommendations = {
|
|
'comprehensive_strategy': {
|
|
'metrics': {'score': 85, 'confidence': 0.9}
|
|
},
|
|
'audience_intelligence': {
|
|
'metrics': {'score': 80, 'confidence': 0.8}
|
|
},
|
|
'competitive_intelligence': {
|
|
'metrics': {'score': 75, 'confidence': 0.7}
|
|
}
|
|
}
|
|
|
|
scores = service._calculate_strategic_scores(ai_recommendations)
|
|
|
|
assert 'overall_score' in scores
|
|
assert 'content_quality_score' in scores
|
|
assert 'engagement_score' in scores
|
|
assert 'conversion_score' in scores
|
|
assert 'innovation_score' in scores
|
|
|
|
# Verify scores are calculated
|
|
assert scores['overall_score'] > 0
|
|
|
|
print("✅ Strategic scores calculation test passed")
|
|
|
|
def test_market_positioning_extraction(self):
|
|
"""Test market positioning extraction from AI recommendations."""
|
|
service = EnhancedStrategyService()
|
|
|
|
ai_recommendations = {
|
|
'comprehensive_strategy': {
|
|
'metrics': {'score': 85, 'confidence': 0.9}
|
|
}
|
|
}
|
|
|
|
positioning = service._extract_market_positioning(ai_recommendations)
|
|
|
|
assert 'industry_position' in positioning
|
|
assert 'competitive_advantage' in positioning
|
|
assert 'market_share' in positioning
|
|
assert 'positioning_score' in positioning
|
|
|
|
print("✅ Market positioning extraction test passed")
|
|
|
|
def test_competitive_advantages_extraction(self):
|
|
"""Test competitive advantages extraction from AI recommendations."""
|
|
service = EnhancedStrategyService()
|
|
|
|
ai_recommendations = {
|
|
'competitive_intelligence': {
|
|
'metrics': {'score': 80, 'confidence': 0.8}
|
|
}
|
|
}
|
|
|
|
advantages = service._extract_competitive_advantages(ai_recommendations)
|
|
|
|
assert isinstance(advantages, list)
|
|
assert len(advantages) > 0
|
|
|
|
for advantage in advantages:
|
|
assert 'advantage' in advantage
|
|
assert 'impact' in advantage
|
|
assert 'implementation' in advantage
|
|
|
|
print("✅ Competitive advantages extraction test passed")
|
|
|
|
def test_strategic_risks_extraction(self):
|
|
"""Test strategic risks extraction from AI recommendations."""
|
|
service = EnhancedStrategyService()
|
|
|
|
ai_recommendations = {
|
|
'comprehensive_strategy': {
|
|
'metrics': {'score': 85, 'confidence': 0.9}
|
|
}
|
|
}
|
|
|
|
risks = service._extract_strategic_risks(ai_recommendations)
|
|
|
|
assert isinstance(risks, list)
|
|
assert len(risks) > 0
|
|
|
|
for risk in risks:
|
|
assert 'risk' in risk
|
|
assert 'probability' in risk
|
|
assert 'impact' in risk
|
|
|
|
print("✅ Strategic risks extraction test passed")
|
|
|
|
def test_opportunity_analysis_extraction(self):
|
|
"""Test opportunity analysis extraction from AI recommendations."""
|
|
service = EnhancedStrategyService()
|
|
|
|
ai_recommendations = {
|
|
'comprehensive_strategy': {
|
|
'metrics': {'score': 85, 'confidence': 0.9}
|
|
}
|
|
}
|
|
|
|
opportunities = service._extract_opportunity_analysis(ai_recommendations)
|
|
|
|
assert isinstance(opportunities, list)
|
|
assert len(opportunities) > 0
|
|
|
|
for opportunity in opportunities:
|
|
assert 'opportunity' in opportunity
|
|
assert 'potential_impact' in opportunity
|
|
assert 'implementation_ease' in opportunity
|
|
|
|
print("✅ Opportunity analysis extraction test passed")
|
|
|
|
def run_enhanced_strategy_phase1_tests():
|
|
"""Run all Phase 1 tests for enhanced strategy service."""
|
|
print("🚀 Starting Enhanced Strategy Phase 1 Tests")
|
|
print("=" * 50)
|
|
|
|
test_instance = TestEnhancedStrategyPhase1()
|
|
|
|
# Run all tests
|
|
test_instance.test_enhanced_strategy_model_creation()
|
|
test_instance.test_completion_percentage_calculation()
|
|
test_instance.test_enhanced_strategy_to_dict()
|
|
test_instance.test_ai_analysis_result_model()
|
|
test_instance.test_onboarding_integration_model()
|
|
test_instance.test_enhanced_strategy_service_initialization()
|
|
test_instance.test_specialized_prompt_creation()
|
|
test_instance.test_fallback_recommendations()
|
|
test_instance.test_data_quality_calculation()
|
|
test_instance.test_confidence_level_calculation()
|
|
test_instance.test_strategic_scores_calculation()
|
|
test_instance.test_market_positioning_extraction()
|
|
test_instance.test_competitive_advantages_extraction()
|
|
test_instance.test_strategic_risks_extraction()
|
|
test_instance.test_opportunity_analysis_extraction()
|
|
|
|
print("=" * 50)
|
|
print("✅ All Enhanced Strategy Phase 1 Tests Passed!")
|
|
print("🎯 Phase 1 Implementation Complete:")
|
|
print(" - Enhanced database schema with 30+ input fields ✓")
|
|
print(" - Enhanced Strategy Service core implementation ✓")
|
|
print(" - 5 specialized AI prompt implementations ✓")
|
|
print(" - Onboarding data integration ✓")
|
|
print(" - Comprehensive AI recommendations ✓")
|
|
|
|
if __name__ == "__main__":
|
|
run_enhanced_strategy_phase1_tests() |