11"""Tests for proxy support in SentienceBrowser"""
22
3+ import logging
34import os
45from unittest .mock import MagicMock , patch
56
7+ import pytest
8+
69from sentience .browser import SentienceBrowser
710from sentience .models import ProxyConfig
811
@@ -96,33 +99,33 @@ def test_parse_proxy_socks5(self):
9699 assert config .username == "user"
97100 assert config .password == "pass"
98101
99- def test_parse_proxy_invalid_scheme (self , capsys ):
102+ def test_parse_proxy_invalid_scheme (self , caplog ):
100103 """Test parsing proxy with invalid scheme"""
101- browser = SentienceBrowser ()
102- config = browser ._parse_proxy ("ftp://proxy.example.com:8080" )
104+ with caplog .at_level (logging .WARNING ):
105+ browser = SentienceBrowser ()
106+ config = browser ._parse_proxy ("ftp://proxy.example.com:8080" )
103107
104- assert config is None
105- captured = capsys .readouterr ()
106- assert "Unsupported proxy scheme: ftp" in captured .out
107- assert "Supported: http, https, socks5" in captured .out
108+ assert config is None
109+ assert "Unsupported proxy scheme: ftp" in caplog .text
110+ assert "Supported: http, https, socks5" in caplog .text
108111
109- def test_parse_proxy_missing_port (self , capsys ):
112+ def test_parse_proxy_missing_port (self , caplog ):
110113 """Test parsing proxy without port"""
111- browser = SentienceBrowser ()
112- config = browser ._parse_proxy ("http://proxy.example.com" )
114+ with caplog .at_level (logging .WARNING ):
115+ browser = SentienceBrowser ()
116+ config = browser ._parse_proxy ("http://proxy.example.com" )
113117
114- assert config is None
115- captured = capsys .readouterr ()
116- assert "Proxy URL must include hostname and port" in captured .out
118+ assert config is None
119+ assert "Proxy URL must include hostname and port" in caplog .text
117120
118- def test_parse_proxy_missing_host (self , capsys ):
121+ def test_parse_proxy_missing_host (self , caplog ):
119122 """Test parsing proxy without hostname"""
120- browser = SentienceBrowser ()
121- config = browser ._parse_proxy ("http://:8080" )
123+ with caplog .at_level (logging .WARNING ):
124+ browser = SentienceBrowser ()
125+ config = browser ._parse_proxy ("http://:8080" )
122126
123- assert config is None
124- captured = capsys .readouterr ()
125- assert "Proxy URL must include hostname and port" in captured .out
127+ assert config is None
128+ assert "Proxy URL must include hostname and port" in caplog .text
126129
127130 def test_parse_proxy_empty_string (self ):
128131 """Test parsing empty proxy string"""
@@ -202,7 +205,7 @@ def test_start_without_proxy(self, mock_playwright, mock_copytree):
202205
203206 @patch ("sentience.browser.shutil.copytree" )
204207 @patch ("sentience.browser.sync_playwright" )
205- def test_start_with_proxy (self , mock_playwright , mock_copytree , capsys ):
208+ def test_start_with_proxy (self , mock_playwright , mock_copytree , caplog ):
206209 """Test browser start with proxy"""
207210 # Mock Playwright
208211 mock_pw_instance = MagicMock ()
@@ -221,21 +224,21 @@ def test_start_with_proxy(self, mock_playwright, mock_copytree, capsys):
221224 mock_path .return_value .parent .parent .parent = MagicMock ()
222225 mock_path .return_value .parent .parent .parent .__truediv__ .return_value = mock_ext_path
223226
224- browser = SentienceBrowser ( proxy = "http://user:pass@proxy.example.com:8080" )
225- browser . start ( )
226-
227- # Verify proxy was passed to launch_persistent_context
228- call_kwargs = mock_pw_instance . chromium . launch_persistent_context . call_args [ 1 ]
229- assert "proxy" in call_kwargs
230- assert call_kwargs [ "proxy" ] == {
231- "server" : "http:// proxy.example.com:8080" ,
232- "username " : "user " ,
233- "password " : "pass " ,
234- }
235-
236- # Verify console message
237- captured = capsys . readouterr ()
238- assert "Using proxy: http://proxy.example.com:8080" in captured . out
227+ with caplog . at_level ( logging . INFO ):
228+ browser = SentienceBrowser ( proxy = "http://user:pass@proxy.example.com:8080" )
229+ browser . start ()
230+
231+ # Verify proxy was passed to launch_persistent_context
232+ call_kwargs = mock_pw_instance . chromium . launch_persistent_context . call_args [ 1 ]
233+ assert "proxy" in call_kwargs
234+ assert call_kwargs [ " proxy" ] == {
235+ "server " : "http://proxy.example.com:8080 " ,
236+ "username " : "user " ,
237+ "password" : "pass" ,
238+ }
239+
240+ # Verify log message
241+ assert "Using proxy: http://proxy.example.com:8080" in caplog . text
239242
240243 @patch ("sentience.browser.shutil.copytree" )
241244 @patch ("sentience.browser.sync_playwright" )
0 commit comments