170 lines
5.3 KiB
Python
170 lines
5.3 KiB
Python
"""
|
|
Tests for Flywheel Module - Feedback Parser.
|
|
|
|
Tests email feedback parsing logic.
|
|
"""
|
|
|
|
import pytest
|
|
from src.flywheel.feedback_parser import (
|
|
FeedbackParser,
|
|
FeedbackResult,
|
|
FeedbackType,
|
|
get_feedback_parser
|
|
)
|
|
|
|
|
|
class TestFeedbackParser:
|
|
"""Tests for FeedbackParser class."""
|
|
|
|
@pytest.fixture
|
|
def parser(self):
|
|
"""Create feedback parser."""
|
|
return FeedbackParser()
|
|
|
|
def test_parse_resolved_portuguese(self, parser):
|
|
"""Test resolved detection in Portuguese."""
|
|
result = parser.parse(
|
|
ticket_id="TKT-001",
|
|
email_content="Obrigado pelo suporte! O problema foi resolvido.",
|
|
subject="Re: Chamado TKT-001"
|
|
)
|
|
|
|
assert result.feedback_type == FeedbackType.RESOLVED
|
|
assert result.sentiment == "positive"
|
|
|
|
def test_parse_resolved_english(self, parser):
|
|
"""Test resolved detection in English."""
|
|
result = parser.parse(
|
|
ticket_id="TKT-001",
|
|
email_content="Thanks, the issue is now fixed and working perfectly!",
|
|
subject="Re: Ticket TKT-001"
|
|
)
|
|
|
|
assert result.feedback_type == FeedbackType.RESOLVED
|
|
|
|
def test_parse_resolved_emoji(self, parser):
|
|
"""Test resolved detection with emoji."""
|
|
result = parser.parse(
|
|
ticket_id="TKT-001",
|
|
email_content="Funcionou! 👍✅",
|
|
subject="Re: TKT-001"
|
|
)
|
|
|
|
assert result.feedback_type == FeedbackType.RESOLVED
|
|
|
|
def test_parse_reopened(self, parser):
|
|
"""Test reopened detection."""
|
|
result = parser.parse(
|
|
ticket_id="TKT-001",
|
|
email_content="O problema ainda persiste. Não foi resolvido.",
|
|
subject="Re: TKT-001"
|
|
)
|
|
|
|
assert result.feedback_type == FeedbackType.REOPENED
|
|
assert result.sentiment == "negative"
|
|
|
|
def test_parse_reopened_english(self, parser):
|
|
"""Test reopened detection in English."""
|
|
result = parser.parse(
|
|
ticket_id="TKT-001",
|
|
email_content="The problem is still happening. Not fixed.",
|
|
subject="Re: TKT-001"
|
|
)
|
|
|
|
assert result.feedback_type == FeedbackType.REOPENED
|
|
|
|
def test_parse_escalate(self, parser):
|
|
"""Test escalation detection."""
|
|
result = parser.parse(
|
|
ticket_id="TKT-001",
|
|
email_content="URGENTE! Sistema crítico parou, preciso falar com o gerente!",
|
|
subject="URGENTE Re: TKT-001"
|
|
)
|
|
|
|
assert result.feedback_type == FeedbackType.ESCALATE
|
|
|
|
def test_parse_clarification(self, parser):
|
|
"""Test clarification request detection."""
|
|
result = parser.parse(
|
|
ticket_id="TKT-001",
|
|
email_content="Como faço para aplicar essa correção? Pode explicar melhor?",
|
|
subject="Re: TKT-001"
|
|
)
|
|
|
|
assert result.feedback_type == FeedbackType.CLARIFICATION
|
|
|
|
def test_extract_satisfaction_score(self, parser):
|
|
"""Test satisfaction score extraction."""
|
|
result = parser.parse(
|
|
ticket_id="TKT-001",
|
|
email_content="Resolvido! Nota 5/5 para o atendimento.",
|
|
subject="Re: TKT-001"
|
|
)
|
|
|
|
assert result.satisfaction_score == 5
|
|
|
|
def test_extract_satisfaction_thumbs(self, parser):
|
|
"""Test satisfaction from thumbs emoji."""
|
|
result = parser.parse(
|
|
ticket_id="TKT-001",
|
|
email_content="👍👍👍 Excelente suporte!",
|
|
subject="Re: TKT-001"
|
|
)
|
|
|
|
assert result.satisfaction_score == 5
|
|
|
|
def test_follow_up_detection(self, parser):
|
|
"""Test follow-up request detection."""
|
|
result = parser.parse(
|
|
ticket_id="TKT-001",
|
|
email_content="Ok, me ligar amanhã para acompanhar.",
|
|
subject="Re: TKT-001"
|
|
)
|
|
|
|
assert result.follow_up_requested is True
|
|
|
|
def test_unknown_feedback(self, parser):
|
|
"""Test unknown feedback type."""
|
|
result = parser.parse(
|
|
ticket_id="TKT-001",
|
|
email_content="xyz", # Genuinely unrecognizable
|
|
subject="Re: TKT-001"
|
|
)
|
|
|
|
# Short gibberish should be unknown
|
|
assert result.feedback_type == FeedbackType.UNKNOWN
|
|
|
|
def test_suggested_action_resolved(self, parser):
|
|
"""Test suggested action for resolved."""
|
|
result = parser.parse(
|
|
ticket_id="TKT-001",
|
|
email_content="Problema resolvido, obrigado!",
|
|
subject="Re: TKT-001"
|
|
)
|
|
|
|
assert "Fechar ticket" in result.suggested_action
|
|
|
|
def test_suggested_action_reopened(self, parser):
|
|
"""Test suggested action for reopened."""
|
|
result = parser.parse(
|
|
ticket_id="TKT-001",
|
|
email_content="Ainda não funciona, problema voltou.",
|
|
subject="Re: TKT-001"
|
|
)
|
|
|
|
assert "Reabrir" in result.suggested_action
|
|
|
|
|
|
class TestFeedbackParserSingleton:
|
|
"""Tests for singleton."""
|
|
|
|
def test_singleton(self):
|
|
"""Test singleton returns same instance."""
|
|
import src.flywheel.feedback_parser as module
|
|
module._parser = None
|
|
|
|
p1 = get_feedback_parser()
|
|
p2 = get_feedback_parser()
|
|
|
|
assert p1 is p2
|