import unittest from unittest.mock import patch, MagicMock import requests # Import requests for its exception types import os import sys # Add the parent directory to sys.path to find the src module sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) # Adjust the import path based on your project structure # If web_browser.py is in a 'src' directory: from src.web_browsing_tool import WebBrowser # If web_browser.py is in the same directory as app.py (and tools are in a 'tools' subdir): # from tools.web_browser import WebBrowser class TestWebBrowser(unittest.TestCase): def setUp(self): self.browser = WebBrowser(user_agent="TestAgent/1.0") @patch('src.web_browsing_tool.requests.get') def test_browse_successful_fetch_and_parse(self, mock_get): # Mock the response from requests.get mock_response = MagicMock() mock_response.status_code = 200 mock_response.content = b"
Hello World!
" mock_response.raise_for_status = MagicMock() # Ensure this doesn't raise an error mock_get.return_value = mock_response url = "http://example.com/testpage" result = self.browser.browse(url) mock_get.assert_called_once_with(url, headers={"User-Agent": "TestAgent/1.0"}, timeout=15) self.assertEqual(result, "Test Page\nHello World!") @patch('src.web_browsing_tool.requests.get') def test_browse_http_error(self, mock_get): # Mock requests.get to raise an HTTPError mock_get.side_effect = requests.exceptions.HTTPError("404 Client Error: Not Found for url") url = "http://example.com/notfound" result = self.browser.browse(url) mock_get.assert_called_once_with(url, headers={"User-Agent": "TestAgent/1.0"}, timeout=15) self.assertTrue(result.startswith("Error: HTTP error occurred")) self.assertIn("404 Client Error", result) @patch('src.web_browsing_tool.requests.get') def test_browse_connection_error(self, mock_get): mock_get.side_effect = requests.exceptions.ConnectionError("Connection refused") url = "http://example.com/unreachable" result = self.browser.browse(url) self.assertTrue(result.startswith("Error: Connection error occurred")) self.assertIn("Connection refused", result) @patch('src.web_browsing_tool.requests.get') def test_browse_timeout_error(self, mock_get): mock_get.side_effect = requests.exceptions.Timeout("Request timed out") url = "http://example.com/slowresponse" result = self.browser.browse(url) self.assertTrue(result.startswith("Error: Timeout occurred")) self.assertIn("Request timed out", result) @patch('src.web_browsing_tool.requests.get') def test_browse_generic_request_exception(self, mock_get): mock_get.side_effect = requests.exceptions.RequestException("Some other request error") url = "http://example.com/othererror" result = self.browser.browse(url) self.assertTrue(result.startswith("Error: An unexpected error occurred while fetching")) self.assertIn("Some other request error", result) def test_browse_invalid_url_format(self): url = "www.example.com" # Missing http:// or https:// result = self.browser.browse(url) self.assertEqual(result, "Error: Invalid URL format. URL must start with http:// or https://. Received: www.example.com") @patch('src.web_browsing_tool.requests.get') def test_browse_no_text_content(self, mock_get): mock_response = MagicMock() mock_response.status_code = 200 mock_response.content = b"" mock_response.raise_for_status = MagicMock() mock_get.return_value = mock_response url = "http://example.com/notext" result = self.browser.browse(url) self.assertEqual(result, f"Error: No text content found at {url}.") @patch('src.web_browsing_tool.requests.get') def test_browse_strips_extra_whitespace_and_newlines(self, mock_get): mock_response = MagicMock() mock_response.status_code = 200 mock_response.content = b"Line 1
Line 2
\n\nLine\n3