"""内容生成Pipeline测试""" import pytest from app.services.content.content_pipeline import ContentPipeline, PipelineResponse class TestContentPipeline: """内容Pipeline测试""" @pytest.mark.asyncio async def test_pipeline_complete_run(self): """测试完整Pipeline执行""" pipeline = ContentPipeline() request = { "content": "这是一篇关于华为手机评测的深度文章," "详细介绍了华为Mate系列的特点和性能。", "title": "华为手机评测", "platform": "zhihu", "optimize_for": ["validation", "sensitive", "seo"], "output_formats": ["html", "markdown", "plain"], "keyword": "华为手机" } result = await pipeline.run(request) # 验证返回类型 assert isinstance(result, PipelineResponse) assert result.stages is not None assert len(result.stages) > 0 # 验证输出 assert result.outputs is not None assert result.outputs.html is not None or result.outputs.markdown is not None @pytest.mark.asyncio async def test_pipeline_validation_only(self): """测试仅校验模式""" pipeline = ContentPipeline() request = { "content": "这是一篇测试文章内容", "title": "测试标题", "platform": "zhihu", "optimize_for": ["validation"] } result = await pipeline.run(request) assert result.stages is not None # 仅校验模式不生成输出 validation_stage = next((s for s in result.stages if s.name == "validation"), None) assert validation_stage is not None @pytest.mark.asyncio async def test_pipeline_sensitive_filter_only(self): """测试仅敏感词过滤模式""" pipeline = ContentPipeline() request = { "content": "这是一篇正常内容的文章", "title": "测试标题", "platform": "zhihu", "optimize_for": ["sensitive"] } result = await pipeline.run(request) assert result.stages is not None assert len(result.stages) >= 1 @pytest.mark.asyncio async def test_pipeline_seo_only(self): """测试仅SEO优化模式""" pipeline = ContentPipeline() request = { "content": "华为手机是知名的手机品牌", "title": "华为手机评测", "platform": "zhihu", "optimize_for": ["seo"], "keyword": "华为手机" } result = await pipeline.run(request) assert result.stages is not None @pytest.mark.asyncio async def test_pipeline_with_validation_fail(self): """测试校验失败场景""" pipeline = ContentPipeline() request = { "content": "内容", "title": "这个标题太长了超过了三十个字符的限制了哈哈哈啊", "platform": "wechat", "optimize_for": ["validation"] } result = await pipeline.run(request) # 校验失败时不应继续执行后续阶段 validation_stage = next((s for s in result.stages if s.name == "validation"), None) assert validation_stage is not None assert validation_stage.passed is False @pytest.mark.asyncio async def test_pipeline_stage_timing(self): """测试各阶段耗时记录""" pipeline = ContentPipeline() request = { "content": "这是一篇测试文章内容", "title": "测试标题", "platform": "zhihu", "optimize_for": ["validation", "sensitive", "seo"] } result = await pipeline.run(request) for stage in result.stages: assert stage.name is not None assert hasattr(stage, 'duration') assert stage.duration >= 0 @pytest.mark.asyncio async def test_pipeline_multi_platform(self): """测试多平台适配""" pipeline = ContentPipeline() platforms = ["zhihu", "wechat", "xiaohongshu"] results = [] for platform in platforms: result = await pipeline.run({ "content": "
测试内容
", "title": "测试标题", "platform": platform, "optimize_for": ["validation", "sensitive"] }) results.append(result) assert result.stages is not None # 各平台结果都应成功 assert len(results) == len(platforms) @pytest.mark.asyncio async def test_pipeline_output_formats(self): """测试不同输出格式""" pipeline = ContentPipeline() request = { "content": "测试内容", "title": "测试标题", "platform": "zhihu", "optimize_for": [], "output_formats": ["html", "markdown", "plain"] } result = await pipeline.run(request) assert result.outputs is not None # HTML生成是默认的 assert result.outputs.html is not None @pytest.mark.asyncio async def test_pipeline_empty_optimize_for(self): """测试空的optimize_for参数""" pipeline = ContentPipeline() request = { "content": "测试内容", "title": "测试标题", "platform": "zhihu", "optimize_for": [], "output_formats": ["html"] } result = await pipeline.run(request) # 无优化阶段但应有HTML生成阶段 assert result.outputs is not None @pytest.mark.asyncio async def test_pipeline_error_handling(self): """测试无效平台错误处理""" pipeline = ContentPipeline() try: result = await pipeline.run({ "content": "内容", "title": "标题", "platform": "invalid_platform" }) # 应该返回错误 assert result.error is not None or len(result.stages) > 0 except ValueError as e: assert "不支持的平台" in str(e) @pytest.mark.asyncio async def test_pipeline_validate_only_method(self): """测试validate_only方法""" pipeline = ContentPipeline() result = await pipeline.validate_only( content="测试内容", title="测试标题", platform="zhihu" ) assert result is not None assert hasattr(result, 'is_valid') assert hasattr(result, 'score') assert hasattr(result, 'issues') assert hasattr(result, 'passed')