fix(test): avoid impact of system proxies on urllib test suite by mocking relevant functions

Signed-off-by: Frost Ming <me@frostming.com>
This commit is contained in:
Frost Ming 2025-10-15 10:56:27 +08:00
parent 9a87ce8b57
commit 4669c445cb
No known key found for this signature in database
GPG key ID: 5BFA9CB4DDA943BF
3 changed files with 18 additions and 5 deletions

View file

@ -7,6 +7,7 @@
import email.message import email.message
import io import io
import unittest import unittest
import unittest.mock
from test import support from test import support
from test.support import os_helper from test.support import os_helper
from test.support import socket_helper from test.support import socket_helper
@ -86,9 +87,15 @@ def fakehttp(self, fakedata, mock_close=False):
fake_http_class = fakehttp(fakedata, mock_close=mock_close) fake_http_class = fakehttp(fakedata, mock_close=mock_close)
self._connection_class = http.client.HTTPConnection self._connection_class = http.client.HTTPConnection
http.client.HTTPConnection = fake_http_class http.client.HTTPConnection = fake_http_class
# Disable proxies during the test
self.getproxies = unittest.mock.patch.object(urllib.request, 'getproxies', return_value={})
self.getproxies.start()
# Clear cached opener
urllib.request.install_opener(None)
def unfakehttp(self): def unfakehttp(self):
http.client.HTTPConnection = self._connection_class http.client.HTTPConnection = self._connection_class
self.getproxies.stop()
class urlopen_FileTests(unittest.TestCase): class urlopen_FileTests(unittest.TestCase):

View file

@ -1380,6 +1380,9 @@ def request(conn, method, url, *pos, **kw):
# Change response for subsequent connection # Change response for subsequent connection
conn.__class__.fakedata = b"HTTP/1.1 200 OK\r\n\r\nHello!" conn.__class__.fakedata = b"HTTP/1.1 200 OK\r\n\r\nHello!"
http.client.HTTPConnection.request = request http.client.HTTPConnection.request = request
with mock.patch('urllib.request.getproxies', return_value={}):
# Disable proxy for predictable URL handling
urllib.request.install_opener(None)
fp = urllib.request.urlopen("http://python.org/path") fp = urllib.request.urlopen("http://python.org/path")
self.assertEqual(fp.geturl(), "http://python.org/path?query") self.assertEqual(fp.geturl(), "http://python.org/path?query")
@ -1399,6 +1402,7 @@ def http_open(self, req):
) )
return result return result
handler = Handler() handler = Handler()
with mock.patch('urllib.request.getproxies', return_value={}):
opener = urllib.request.build_opener(handler) opener = urllib.request.build_opener(handler)
tests = ( tests = (
(b'/p\xC3\xA5-dansk/', b'/p%C3%A5-dansk/'), (b'/p\xC3\xA5-dansk/', b'/p%C3%A5-dansk/'),

View file

@ -6,6 +6,7 @@
import http.server import http.server
import threading import threading
import unittest import unittest
import unittest.mock
import hashlib import hashlib
from test import support from test import support
@ -336,8 +337,9 @@ def restore_environ(old_environ):
os.environ.clear() os.environ.clear()
os.environ.update(old_environ) os.environ.update(old_environ)
self.addCleanup(restore_environ, os.environ.copy()) self.addCleanup(restore_environ, os.environ.copy())
os.environ['NO_PROXY'] = '' self._proxy_bypass = unittest.mock.patch('urllib.request.proxy_bypass', return_value=False)
os.environ['no_proxy'] = '' self._proxy_bypass.start()
self.addCleanup(self._proxy_bypass.stop)
self.digest_auth_handler = DigestAuthHandler() self.digest_auth_handler = DigestAuthHandler()
self.digest_auth_handler.set_users({self.USER: self.PASSWD}) self.digest_auth_handler.set_users({self.USER: self.PASSWD})