143 lines
4.0 KiB
Python
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)
|
|
|
|
|