import pytest from review_agent.models import Conversation, FileAttachment from review_agent.skill_router import route_message_intent pytestmark = pytest.mark.django_db @pytest.mark.parametrize( "content", [ "帮我填注册证", "给我这个内容对应的表格", "为我该方案生成申报模板", "请自动填表并生成表格", "生成安全和性能基本原则清单", ], ) def test_rule_router_starts_application_form_fill_for_keywords(monkeypatch, django_user_model, content): user = django_user_model.objects.create_user(username="owner", password="pass") conversation = Conversation.objects.create(user=user, title="会话") monkeypatch.setattr( "review_agent.skill_router._route_with_llm", lambda conversation, content, attachments: (_ for _ in ()).throw(ValueError("fallback")), ) route = route_message_intent(conversation, content) assert route.action == "application_form_fill" assert route.workflow_type == "application_form_fill" assert route.starts_application_form_fill def test_rule_router_does_not_misroute_normal_chat(monkeypatch, django_user_model): user = django_user_model.objects.create_user(username="owner", password="pass") conversation = Conversation.objects.create(user=user, title="会话") monkeypatch.setattr( "review_agent.skill_router._route_with_llm", lambda conversation, content, attachments: (_ for _ in ()).throw(ValueError("fallback")), ) route = route_message_intent(conversation, "你好,解释一下法规背景") assert route.action == "normal_chat" def test_application_form_fill_prompt_preempts_attachment_reader_llm(monkeypatch, tmp_path, django_user_model): user = django_user_model.objects.create_user(username="owner", password="pass") conversation = Conversation.objects.create(user=user, title="会话") archive_path = tmp_path / "第1章_监管信息.rar" archive_path.write_bytes(b"rar") FileAttachment.objects.create( conversation=conversation, user=user, original_name="第1章_监管信息.rar", storage_path=str(archive_path), file_size=archive_path.stat().st_size, ) monkeypatch.setattr( "review_agent.skill_router._route_with_llm", lambda conversation, content, attachments: (_ for _ in ()).throw( AssertionError("明确自动填表意图不应进入 LLM 路由") ), ) route = route_message_intent( conversation, "请基于当前对话最近成功汇总的产品资料,自动提取产品关键信息并填入申报文件模板,优先生成注册证 Word 和字段来源追溯清单。", ) assert route.action == "application_form_fill" assert route.source == "rule_preflight"