scratch_chat / tests /unit /test_language_context.py
WebashalarForML's picture
Upload 178 files
330b6e4 verified
Raw History Blame Contribute Delete
11.3 kB
"""
Unit tests for Language Context Manager
Tests language switching, prompt template generation, and validation
functionality for the multi-language chat agent.
"""
import unittest
from unittest.mock import patch
from datetime import datetime
from chat_agent.services.language_context import LanguageContextManager
class TestLanguageContextManager(unittest.TestCase):
"""Test cases for LanguageContextManager class."""
def setUp(self):
"""Set up test fixtures before each test method."""
self.manager = LanguageContextManager()
self.test_session_id = "test-session-123"
def test_initialization(self):
"""Test that LanguageContextManager initializes correctly."""
self.assertIsInstance(self.manager, LanguageContextManager)
self.assertEqual(self.manager.DEFAULT_LANGUAGE, 'python')
self.assertIsInstance(self.manager.SUPPORTED_LANGUAGES, set)
self.assertIn('python', self.manager.SUPPORTED_LANGUAGES)
self.assertIn('javascript', self.manager.SUPPORTED_LANGUAGES)
self.assertIn('java', self.manager.SUPPORTED_LANGUAGES)
def test_validate_language_valid_languages(self):
"""Test validation of supported programming languages."""
valid_languages = ['python', 'javascript', 'java', 'cpp', 'csharp', 'go', 'rust']
for language in valid_languages:
with self.subTest(language=language):
self.assertTrue(self.manager.validate_language(language))
# Test case insensitive validation
self.assertTrue(self.manager.validate_language(language.upper()))
self.assertTrue(self.manager.validate_language(language.title()))
def test_validate_language_invalid_languages(self):
"""Test validation rejects invalid programming languages."""
invalid_languages = ['cobol', 'fortran', 'assembly', 'brainfuck', '']
for language in invalid_languages:
with self.subTest(language=language):
self.assertFalse(self.manager.validate_language(language))
def test_validate_language_edge_cases(self):
"""Test validation handles edge cases properly."""
# Test None
self.assertFalse(self.manager.validate_language(None))
# Test empty string
self.assertFalse(self.manager.validate_language(''))
# Test whitespace
self.assertFalse(self.manager.validate_language(' '))
# Test valid language with whitespace
self.assertTrue(self.manager.validate_language(' python '))
def test_get_language_default(self):
"""Test getting language returns Python default for new sessions."""
language = self.manager.get_language(self.test_session_id)
self.assertEqual(language, 'python')
def test_set_language_valid(self):
"""Test setting valid programming languages."""
test_cases = [
('python', 'python'),
('JavaScript', 'javascript'),
('JAVA', 'java'),
(' cpp ', 'cpp')
]
for input_lang, expected_lang in test_cases:
with self.subTest(input_lang=input_lang):
result = self.manager.set_language(self.test_session_id, input_lang)
self.assertTrue(result)
actual_lang = self.manager.get_language(self.test_session_id)
self.assertEqual(actual_lang, expected_lang)
def test_set_language_invalid(self):
"""Test setting invalid programming languages fails gracefully."""
invalid_languages = ['cobol', 'assembly', '', None]
for language in invalid_languages:
with self.subTest(language=language):
result = self.manager.set_language(self.test_session_id, language)
self.assertFalse(result)
# Should still return default language
actual_lang = self.manager.get_language(self.test_session_id)
self.assertEqual(actual_lang, 'python')
@patch('chat_agent.services.language_context.datetime')
def test_set_language_updates_timestamp(self, mock_datetime):
"""Test that setting language updates the timestamp."""
mock_now = datetime(2023, 1, 1, 12, 0, 0)
mock_datetime.now.return_value = mock_now
self.manager.set_language(self.test_session_id, 'javascript')
context = self.manager.get_session_context(self.test_session_id)
self.assertEqual(context['updated_at'], mock_now)
def test_get_language_prompt_template_by_language(self):
"""Test getting prompt templates by language."""
template = self.manager.get_language_prompt_template(language='python')
self.assertIn('Python', template)
self.assertIn('programming assistant', template)
template = self.manager.get_language_prompt_template(language='javascript')
self.assertIn('JavaScript', template)
self.assertIn('programming assistant', template)
def test_get_language_prompt_template_by_session(self):
"""Test getting prompt templates by session ID."""
# Set session language
self.manager.set_language(self.test_session_id, 'java')
template = self.manager.get_language_prompt_template(session_id=self.test_session_id)
self.assertIn('Java', template)
self.assertIn('programming assistant', template)
def test_get_language_prompt_template_default(self):
"""Test getting default prompt template."""
template = self.manager.get_language_prompt_template()
self.assertIn('Python', template) # Should default to Python
self.assertIn('programming assistant', template)
def test_get_language_prompt_template_invalid_language(self):
"""Test getting prompt template for invalid language returns default."""
template = self.manager.get_language_prompt_template(language='cobol')
self.assertIn('Python', template) # Should default to Python
def test_get_session_context_new_session(self):
"""Test getting context for new session initializes with defaults."""
context = self.manager.get_session_context(self.test_session_id)
self.assertEqual(context['language'], 'python')
self.assertIn('prompt_template', context)
self.assertIn('updated_at', context)
def test_get_session_context_existing_session(self):
"""Test getting context for existing session."""
# Set up session
self.manager.set_language(self.test_session_id, 'javascript')
context = self.manager.get_session_context(self.test_session_id)
self.assertEqual(context['language'], 'javascript')
self.assertIn('JavaScript', context['prompt_template'])
def test_remove_session_context(self):
"""Test removing session context."""
# Set up session
self.manager.set_language(self.test_session_id, 'java')
# Verify session exists
self.assertEqual(self.manager.get_language(self.test_session_id), 'java')
# Remove session
result = self.manager.remove_session_context(self.test_session_id)
self.assertTrue(result)
# Verify session is removed (should return default)
self.assertEqual(self.manager.get_language(self.test_session_id), 'python')
def test_remove_session_context_nonexistent(self):
"""Test removing non-existent session context."""
result = self.manager.remove_session_context("non-existent-session")
self.assertFalse(result)
def test_get_supported_languages(self):
"""Test getting supported languages returns correct set."""
languages = self.manager.get_supported_languages()
self.assertIsInstance(languages, set)
self.assertIn('python', languages)
self.assertIn('javascript', languages)
self.assertIn('java', languages)
self.assertIn('cpp', languages)
# Verify it's a copy (modifying shouldn't affect original)
languages.add('fake-language')
self.assertNotIn('fake-language', self.manager.SUPPORTED_LANGUAGES)
def test_get_language_display_name(self):
"""Test getting display names for programming languages."""
test_cases = [
('python', 'Python'),
('javascript', 'JavaScript'),
('cpp', 'C++'),
('csharp', 'C#'),
('typescript', 'TypeScript'),
('unknown', 'Unknown') # Should title-case unknown languages
]
for language, expected_display in test_cases:
with self.subTest(language=language):
display_name = self.manager.get_language_display_name(language)
self.assertEqual(display_name, expected_display)
def test_language_switching_workflow(self):
"""Test complete language switching workflow."""
session_id = "workflow-test-session"
# Start with default
self.assertEqual(self.manager.get_language(session_id), 'python')
# Switch to JavaScript
result = self.manager.set_language(session_id, 'javascript')
self.assertTrue(result)
self.assertEqual(self.manager.get_language(session_id), 'javascript')
# Get JavaScript template
template = self.manager.get_language_prompt_template(session_id=session_id)
self.assertIn('JavaScript', template)
# Switch to Java
result = self.manager.set_language(session_id, 'java')
self.assertTrue(result)
self.assertEqual(self.manager.get_language(session_id), 'java')
# Verify context is updated
context = self.manager.get_session_context(session_id)
self.assertEqual(context['language'], 'java')
self.assertIn('Java', context['prompt_template'])
def test_multiple_sessions_isolation(self):
"""Test that multiple sessions maintain separate contexts."""
session1 = "session-1"
session2 = "session-2"
# Set different languages for each session
self.manager.set_language(session1, 'python')
self.manager.set_language(session2, 'javascript')
# Verify isolation
self.assertEqual(self.manager.get_language(session1), 'python')
self.assertEqual(self.manager.get_language(session2), 'javascript')
# Verify templates are different
template1 = self.manager.get_language_prompt_template(session_id=session1)
template2 = self.manager.get_language_prompt_template(session_id=session2)
self.assertIn('Python', template1)
self.assertIn('JavaScript', template2)
if __name__ == '__main__':
unittest.main()