ai-robot-core/ai-service/tests/test_intent.py

143 lines
4.0 KiB
Python

"""
Tests for intent router.
"""
import uuid
import pytest
from app.services.intent.router import IntentRouter, RuleMatcher
from app.services.intent.models import (
FusionConfig,
RuleMatchResult,
SemanticMatchResult,
LlmJudgeResult,
FusionResult,
)
from app.models.entities import IntentRule
class TestRuleMatcher:
"""Test RuleMatcher basic functionality."""
def test_match_empty_message(self):
matcher = RuleMatcher()
result = matcher.match("", [])
assert result.score == 0.0
assert result.rule is None
assert result.duration_ms >= 0
def test_match_empty_rules(self):
matcher = RuleMatcher()
rule = IntentRule(
id=uuid.uuid4(),
tenant_id="test_tenant",
name="Test Rule",
keywords=["test", "demo"],
is_enabled=True,
)
result = matcher.match("test message", [rule])
assert result.score == 1.0
assert result.rule == rule
assert result.match_type == "keyword"
assert result.matched_text == "test"
def test_match_regex(self):
matcher = RuleMatcher()
rule = IntentRule(
id=uuid.uuid4(),
tenant_id="test_tenant",
name="Test Regex Rule",
patterns=[r"test.*pattern"],
is_enabled=True,
)
result = matcher.match("this is a test regex pattern", [rule])
assert result.score == 1.0
assert result.rule == rule
assert result.match_type == "regex"
assert "pattern" in result.matched_text
def test_no_match(self):
matcher = RuleMatcher()
rule = IntentRule(
id=uuid.uuid4(),
tenant_id="test_tenant",
name="Test Rule",
keywords=["specific", "keyword"],
is_enabled=True,
)
result = matcher.match("no match here", [rule])
assert result.score == 0.0
assert result.rule is None
def test_priority_order(self):
matcher = RuleMatcher()
rule1 = IntentRule(
id=uuid.uuid4(),
tenant_id="test_tenant",
name="High Priority",
keywords=["high"],
priority=10,
is_enabled=True,
)
rule2 = IntentRule(
id=uuid.uuid4(),
tenant_id="test_tenant",
name="Low Priority",
keywords=["low"],
priority=1,
is_enabled=True,
)
result = matcher.match("high priority message", [rule1, rule2])
assert result.rule == rule1
assert result.rule.name == "High Priority"
def test_disabled_rule(self):
matcher = RuleMatcher()
rule = IntentRule(
id=uuid.uuid4(),
tenant_id="test_tenant",
name="Disabled Rule",
keywords=["disabled"],
is_enabled=False,
)
result = matcher.match("disabled message", [rule])
assert result.score == 0.0
assert result.rule is None
class TestIntentRouterBackwardCompatibility:
"""Test IntentRouter backward compatibility."""
def test_match_backward_compatible(self):
router = IntentRouter()
rule = IntentRule(
id=uuid.uuid4(),
tenant_id="test_tenant",
name="Test Rule",
keywords=["hello", "hi"],
is_enabled=True,
)
result = router.match("hello world", [rule])
assert result is not None
assert result.rule.name == "Test Rule"
assert result.match_type == "keyword"
assert result.matched == "hello"
def test_match_with_stats(self):
router = IntentRouter()
rule = IntentRule(
id=uuid.uuid4(),
tenant_id="test_tenant",
name="Test Rule",
keywords=["test"],
is_enabled=True,
)
result, rule_id = router.match_with_stats("test message", [rule])
assert result is not None
assert rule_id == str(rule.id)