from services.seeder_api.app import ( MarketingQuery, marketing_diagnostics, marketing_intelligence, marketing_processes, marketing_statistical_intelligence, ) from services.seeder_api.intelligence import ( MarketingCampaign, MarketingIntelligenceEngine, ) def test_marketing_campaign_parsing_handles_standard_format(): raw = ( "Campaign: social ads targeting climate tech founders leveraging video testimonial to drive product demos." ) campaign = MarketingCampaign.parse(raw) assert campaign.channel == "social ads" assert campaign.audience == "climate tech founders" assert campaign.offer == "video testimonial" assert campaign.objective == "drive product demos" def test_marketing_engine_recommendations_use_prompt_keywords(): engine = MarketingIntelligenceEngine.from_file() results = engine.recommend("B2B SaaS founders looking for pipeline velocity", limit=2) assert len(results) == 2 assert any("B2B SaaS founders" in campaign.audience for campaign in results) def test_marketing_statistical_engine_enriches_results_with_metrics(): engine = MarketingIntelligenceEngine.from_file() scored = engine.recommend_statistical( "Need ROI positive programs for B2B SaaS founders", limit=2 ) assert len(scored) == 2 assert all(score.metrics.expected_roi > 0 for score in scored) assert any(score.keyword_coverage["audience"] > 0 for score in scored) def test_marketing_intelligence_endpoint_returns_structured_payload(): payload = marketing_intelligence( MarketingQuery(prompt="Need to accelerate demos for B2B SaaS founders", limit=2) ) assert payload.query == "Need to accelerate demos for B2B SaaS founders" assert len(payload.recommendations) == 2 audiences = {entry.audience for entry in payload.recommendations} assert any("B2B SaaS founders" in audience for audience in audiences) assert "accelerate" in payload.insight.lower() def test_marketing_statistical_endpoint_returns_portfolio_metrics(): payload = marketing_statistical_intelligence( MarketingQuery(prompt="Optimize ROI for AI founders", limit=2) ) assert payload.query == "Optimize ROI for AI founders" assert len(payload.recommendations) == 2 assert payload.portfolio.expected_roi > 0 assert payload.portfolio.confidence > 0 assert payload.portfolio.strongest_drivers def test_marketing_engine_diagnostics_detects_stage_and_focus(): engine = MarketingIntelligenceEngine.from_file() diagnostics = engine.diagnose("Need urgent conversion plays for enterprise SaaS founders") assert diagnostics.stage in {"conversion", "consideration"} assert diagnostics.urgency != "standard" assert diagnostics.focus.startswith("enterprise") or "startup" in diagnostics.focus assert diagnostics.recommended_kpis assert diagnostics.keyword_summary["tokens"] def test_marketing_diagnostics_endpoint_returns_structured_analysis(): payload = marketing_diagnostics( MarketingQuery(prompt="Pipeline is stalled for B2B founders, need fast ROI", limit=3) ) assert payload.query == "Pipeline is stalled for B2B founders, need fast ROI" assert payload.stage in {"conversion", "consideration"} assert "pipeline" in payload.recommended_kpis[0].lower() or payload.recommended_kpis assert payload.opportunities assert "Performance plateau" in " ".join(payload.risk_signals) or not payload.risk_signals def test_marketing_engine_expansion_grid_generates_egg_experiments(): engine = MarketingIntelligenceEngine.from_file() scored = engine.recommend_statistical( "Need urgent conversion plays for enterprise SaaS founders", limit=2 ) experiments = engine.expansion_grid("Need urgent conversion plays for enterprise SaaS founders", scored) assert experiments first = experiments[0] assert first.primary_metric assert first.playbook assert 0.2 <= first.confidence <= 0.99 def test_marketing_engine_google_ads_fallback_without_credentials(monkeypatch): monkeypatch.delenv("GOOGLE_ADS_DEVELOPER_TOKEN", raising=False) monkeypatch.delenv("GOOGLE_ADS_CLIENT_ID", raising=False) monkeypatch.delenv("GOOGLE_ADS_CLIENT_SECRET", raising=False) monkeypatch.delenv("GOOGLE_ADS_REFRESH_TOKEN", raising=False) monkeypatch.delenv("GOOGLE_ADS_CUSTOMER_ID", raising=False) engine = MarketingIntelligenceEngine.from_file() scored = engine.recommend_statistical( "Need urgent conversion plays for enterprise SaaS founders", limit=2 ) insights = engine.google_ads_enrichment( "Need urgent conversion plays for enterprise SaaS founders", scored, limit=2 ) assert len(insights) == 2 assert all(entry.source == "simulated" for entry in insights) assert all(entry.clicks > 0 for entry in insights) def test_marketing_processes_endpoint_combines_rag_and_egg(): payload = marketing_processes( MarketingQuery(prompt="Need urgent conversion plays for enterprise SaaS founders", limit=2) ) assert payload.query == "Need urgent conversion plays for enterprise SaaS founders" assert payload.rag.process == "rag" assert len(payload.rag.recommendations) == 2 assert payload.egg assert payload.egg[0].playbook assert payload.google_ads assert payload.google_ads[0].source in {"simulated", "google_ads_api"}