import unittest from unittest.mock import patch, mock_open, MagicMock import main import time import json import http.server import threading class TestMain(unittest.TestCase): @patch('main.requests.post') @patch('main.open', new_callable=mock_open) def test_setup(self, mock_file, mock_post): mock_resp = MagicMock() mock_resp.json.return_value = { 'device_code': 'test_device_code', 'user_code': 'test_user_code', 'verification_uri': 'test_verification_uri' } mock_post.return_value = mock_resp with patch('builtins.print') as mock_print: main.setup() mock_print.assert_any_call('Please visit test_verification_uri and enter code test_user_code to authenticate.') mock_file().write.assert_called_once_with('test_access_token') @patch('main.requests.get') @patch('main.open', new_callable=mock_open, read_data='test_access_token') def test_get_token(self, mock_file, mock_get): mock_resp = MagicMock() mock_resp.json.return_value = {'token': 'test_token'} mock_get.return_value = mock_resp main.get_token() self.assertEqual(main.token, 'test_token') @patch('main.get_token') @patch('main.time.sleep', return_value=None) def test_token_thread(self, mock_sleep, mock_get_token): with patch('threading.Thread.start') as mock_start: thread = threading.Thread(target=main.token_thread) thread.start() mock_start.assert_called_once() @patch('main.requests.post') @patch('main.is_token_invalid', return_value=True) @patch('main.get_token') def test_copilot(self, mock_get_token, mock_is_token_invalid, mock_post): mock_resp = MagicMock() mock_resp.text = 'data: {"choices":[{"text":"test_completion"}]}' mock_post.return_value = mock_resp result = main.copilot('test_prompt') self.assertEqual(result, 'test_completion') def test_is_token_invalid(self): valid_token = 'exp=9999999999' invalid_token = 'exp=0' self.assertFalse(main.is_token_invalid(valid_token)) self.assertTrue(main.is_token_invalid(invalid_token)) def test_extract_exp_value(self): token = 'key1=value1; exp=1234567890; key2=value2' self.assertEqual(main.extract_exp_value(token), 1234567890) @patch('main.copilot', return_value='test_completion') def test_HTTPRequestHandler(self, mock_copilot): handler = main.HTTPRequestHandler handler.rfile = MagicMock() handler.rfile.read.return_value = json.dumps({'prompt': 'test_prompt', 'language': 'python'}).encode() handler.headers = {'Content-Length': len(handler.rfile.read.return_value)} handler.wfile = MagicMock() handler.do_POST(handler) handler.wfile.write.assert_called_once_with(b'test_completion') @patch('main.threading.Thread.start') @patch('main.http.server.HTTPServer.serve_forever') def test_main(self, mock_serve_forever, mock_thread_start): with patch('builtins.print') as mock_print: with patch('sys.argv', ['main.py', '8080']): main.main() mock_print.assert_any_call('Listening on port 0.0.0.0:8080...') mock_thread_start.assert_called_once() mock_serve_forever.assert_called_once() if __name__ == '__main__': unittest.main()