File size: 11,301 Bytes
330b6e4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
"""

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()