| """ |
| Unit tests for intent_classifier module |
| Tests the IntentClassifier class |
| """ |
|
|
| import unittest |
| from unittest.mock import Mock |
|
|
| from src.intent_classifier import IntentClassifier |
|
|
|
|
| class TestIntentClassifier(unittest.TestCase): |
| """Test cases for IntentClassifier class""" |
|
|
| def setUp(self): |
| """Set up test fixtures""" |
| self.classifier = IntentClassifier() |
|
|
| def test_initialization(self): |
| """Test classifier initialization""" |
| self.assertIsNotNone(self.classifier.intent_patterns) |
| self.assertIn("greeting", self.classifier.intent_patterns) |
| self.assertIn("thanks", self.classifier.intent_patterns) |
| self.assertIn("goodbye", self.classifier.intent_patterns) |
|
|
| def test_classify_greeting(self): |
| """Test classification of greeting messages""" |
| test_cases = [ |
| "hi", |
| "hello", |
| "Hey there", |
| "good morning", |
| "Good afternoon!", |
| "how are you", |
| ] |
|
|
| for message in test_cases: |
| intent, response = self.classifier.classify_intent(message) |
| self.assertEqual(intent, "greeting", f"Failed for message: {message}") |
| self.assertIsInstance(response, str) |
| self.assertGreater(len(response), 0) |
|
|
| def test_classify_thanks(self): |
| """Test classification of thank you messages""" |
| test_cases = [ |
| "thank you", |
| "thanks", |
| "thank u", |
| "thx", |
| "I appreciate it", |
| "thanks a lot", |
| "thank you so much", |
| ] |
|
|
| for message in test_cases: |
| intent, response = self.classifier.classify_intent(message) |
| self.assertEqual(intent, "thanks", f"Failed for message: {message}") |
| self.assertIsInstance(response, str) |
| self.assertGreater(len(response), 0) |
|
|
| def test_classify_goodbye(self): |
| """Test classification of goodbye messages""" |
| test_cases = [ |
| "bye", |
| "goodbye", |
| "see you", |
| "farewell", |
| "take care", |
| "have a good day", |
| "talk to you later", |
| ] |
|
|
| for message in test_cases: |
| intent, response = self.classifier.classify_intent(message) |
| self.assertEqual(intent, "goodbye", f"Failed for message: {message}") |
| self.assertIsInstance(response, str) |
| self.assertGreater(len(response), 0) |
|
|
| def test_classify_query(self): |
| """Test classification of query messages""" |
| test_cases = [ |
| "How do I open an account?", |
| "What are the transaction fees?", |
| "Can you help me with my balance?", |
| "Tell me about XENO services", |
| ] |
|
|
| for message in test_cases: |
| intent, response = self.classifier.classify_intent(message) |
| self.assertEqual(intent, "query", f"Failed for message: {message}") |
| self.assertEqual(response, "") |
|
|
| def test_case_insensitivity(self): |
| """Test that classification is case insensitive""" |
| messages = [ |
| ("HI", "greeting"), |
| ("THANK YOU", "thanks"), |
| ("BYE", "goodbye"), |
| ("Hi There", "greeting"), |
| ] |
|
|
| for message, expected_intent in messages: |
| intent, _ = self.classifier.classify_intent(message) |
| self.assertEqual(intent, expected_intent) |
|
|
| def test_with_timer(self): |
| """Test classification with timer object""" |
| mock_timer = Mock() |
| mock_timer.time_step = Mock() |
| mock_timer.time_step.return_value.__enter__ = Mock() |
| mock_timer.time_step.return_value.__exit__ = Mock() |
|
|
| intent, response = self.classifier.classify_intent("hello", timer=mock_timer) |
|
|
| self.assertEqual(intent, "greeting") |
| mock_timer.time_step.assert_called_once_with("intent_classification") |
|
|
| def test_is_simple_intent(self): |
| """Test is_simple_intent method""" |
| self.assertTrue(self.classifier.is_simple_intent("greeting")) |
| self.assertTrue(self.classifier.is_simple_intent("thanks")) |
| self.assertFalse(self.classifier.is_simple_intent("goodbye")) |
| self.assertFalse(self.classifier.is_simple_intent("query")) |
|
|
| def test_add_intent(self): |
| """Test adding a new intent""" |
| patterns = [r"\b(test|testing)\b"] |
| responses = ["This is a test response"] |
|
|
| self.classifier.add_intent("test_intent", patterns, responses) |
|
|
| |
| self.assertIn("test_intent", self.classifier.intent_patterns) |
| self.assertEqual( |
| self.classifier.intent_patterns["test_intent"]["patterns"], patterns |
| ) |
| self.assertEqual( |
| self.classifier.intent_patterns["test_intent"]["responses"], responses |
| ) |
|
|
| |
| intent, response = self.classifier.classify_intent("testing") |
| self.assertEqual(intent, "test_intent") |
| self.assertEqual(response, "This is a test response") |
|
|
| def test_response_variety(self): |
| """Test that responses vary (random selection)""" |
| |
| responses = set() |
| for _ in range(20): |
| _, response = self.classifier.classify_intent("hello") |
| responses.add(response) |
|
|
| |
| self.assertGreater(len(responses), 0) |
|
|
| def test_empty_message(self): |
| """Test classification of empty or whitespace messages""" |
| test_cases = ["", " ", "\n", "\t"] |
|
|
| for message in test_cases: |
| intent, response = self.classifier.classify_intent(message) |
| self.assertEqual(intent, "query") |
| self.assertEqual(response, "") |
|
|
| def test_mixed_intent_message(self): |
| """Test messages that might match multiple patterns""" |
| |
| intent, response = self.classifier.classify_intent("hi thank you") |
| |
| self.assertIn(intent, ["greeting", "thanks"]) |
|
|
|
|
| if __name__ == "__main__": |
| unittest.main() |
|
|