Issue #11995: test_pydoc doesn't import all sys.path modules anymore.

This commit is contained in:
Antoine Pitrou 2013-05-19 15:46:37 +02:00
commit c52d113e28
2 changed files with 63 additions and 16 deletions

View File

@ -1,10 +1,12 @@
import os import os
import sys import sys
import builtins import builtins
import contextlib
import difflib import difflib
import inspect import inspect
import pydoc import pydoc
import keyword import keyword
import pkgutil
import re import re
import string import string
import test.support import test.support
@ -17,7 +19,8 @@ from collections import namedtuple
from test.script_helper import assert_python_ok from test.script_helper import assert_python_ok
from test.support import ( from test.support import (
TESTFN, rmtree, TESTFN, rmtree,
reap_children, reap_threads, captured_output, captured_stdout, unlink reap_children, reap_threads, captured_output, captured_stdout,
captured_stderr, unlink
) )
from test import pydoc_mod from test import pydoc_mod
@ -255,6 +258,29 @@ def get_html_title(text):
return title return title
class PydocBaseTest(unittest.TestCase):
def _restricted_walk_packages(self, walk_packages, path=None):
"""
A version of pkgutil.walk_packages() that will restrict itself to
a given path.
"""
default_path = path or [os.path.dirname(__file__)]
def wrapper(path=None, prefix='', onerror=None):
return walk_packages(path or default_path, prefix, onerror)
return wrapper
@contextlib.contextmanager
def restrict_walk_packages(self, path=None):
walk_packages = pkgutil.walk_packages
pkgutil.walk_packages = self._restricted_walk_packages(walk_packages,
path)
try:
yield
finally:
pkgutil.walk_packages = walk_packages
class PydocDocTest(unittest.TestCase): class PydocDocTest(unittest.TestCase):
@unittest.skipIf(sys.flags.optimize >= 2, @unittest.skipIf(sys.flags.optimize >= 2,
@ -441,7 +467,7 @@ class PydocDocTest(unittest.TestCase):
self.assertDictEqual(methods, expected) self.assertDictEqual(methods, expected)
class PydocImportTest(unittest.TestCase): class PydocImportTest(PydocBaseTest):
def setUp(self): def setUp(self):
self.test_dir = os.mkdir(TESTFN) self.test_dir = os.mkdir(TESTFN)
@ -475,8 +501,19 @@ class PydocImportTest(unittest.TestCase):
badsyntax = os.path.join(pkgdir, "__init__") + os.extsep + "py" badsyntax = os.path.join(pkgdir, "__init__") + os.extsep + "py"
with open(badsyntax, 'w') as f: with open(badsyntax, 'w') as f:
f.write("invalid python syntax = $1\n") f.write("invalid python syntax = $1\n")
result = run_pydoc('zqwykjv', '-k', PYTHONPATH=TESTFN) with self.restrict_walk_packages(path=[TESTFN]):
self.assertEqual(b'', result) with captured_stdout() as out:
with captured_stderr() as err:
pydoc.apropos('xyzzy')
# No result, no error
self.assertEqual(out.getvalue(), '')
self.assertEqual(err.getvalue(), '')
# The package name is still matched
with captured_stdout() as out:
with captured_stderr() as err:
pydoc.apropos('syntaxerr')
self.assertEqual(out.getvalue().strip(), 'syntaxerr')
self.assertEqual(err.getvalue(), '')
def test_apropos_with_unreadable_dir(self): def test_apropos_with_unreadable_dir(self):
# Issue 7367 - pydoc -k failed when unreadable dir on path # Issue 7367 - pydoc -k failed when unreadable dir on path
@ -485,8 +522,13 @@ class PydocImportTest(unittest.TestCase):
self.addCleanup(os.rmdir, self.unreadable_dir) self.addCleanup(os.rmdir, self.unreadable_dir)
# Note, on Windows the directory appears to be still # Note, on Windows the directory appears to be still
# readable so this is not really testing the issue there # readable so this is not really testing the issue there
result = run_pydoc('zqwykjv', '-k', PYTHONPATH=TESTFN) with self.restrict_walk_packages(path=[TESTFN]):
self.assertEqual(b'', result) with captured_stdout() as out:
with captured_stderr() as err:
pydoc.apropos('SOMEKEY')
# No result, no error
self.assertEqual(out.getvalue(), '')
self.assertEqual(err.getvalue(), '')
class TestDescriptions(unittest.TestCase): class TestDescriptions(unittest.TestCase):
@ -548,7 +590,7 @@ class PydocServerTest(unittest.TestCase):
self.assertEqual(serverthread.error, None) self.assertEqual(serverthread.error, None)
class PydocUrlHandlerTest(unittest.TestCase): class PydocUrlHandlerTest(PydocBaseTest):
"""Tests for pydoc._url_handler""" """Tests for pydoc._url_handler"""
def test_content_type_err(self): def test_content_type_err(self):
@ -575,18 +617,19 @@ class PydocUrlHandlerTest(unittest.TestCase):
("getfile?key=foobar", "Pydoc: Error - getfile?key=foobar"), ("getfile?key=foobar", "Pydoc: Error - getfile?key=foobar"),
] ]
for url, title in requests: with self.restrict_walk_packages():
for url, title in requests:
text = pydoc._url_handler(url, "text/html")
result = get_html_title(text)
self.assertEqual(result, title, text)
path = string.__file__
title = "Pydoc: getfile " + path
url = "getfile?key=" + path
text = pydoc._url_handler(url, "text/html") text = pydoc._url_handler(url, "text/html")
result = get_html_title(text) result = get_html_title(text)
self.assertEqual(result, title) self.assertEqual(result, title)
path = string.__file__
title = "Pydoc: getfile " + path
url = "getfile?key=" + path
text = pydoc._url_handler(url, "text/html")
result = get_html_title(text)
self.assertEqual(result, title)
class TestHelper(unittest.TestCase): class TestHelper(unittest.TestCase):
def test_keywords(self): def test_keywords(self):

View File

@ -331,6 +331,11 @@ Documentation
- Issue #6696: add documentation for the Profile objects, and improve - Issue #6696: add documentation for the Profile objects, and improve
profile/cProfile docs. Patch by Tom Pinckney. profile/cProfile docs. Patch by Tom Pinckney.
Tests
-----
- Issue #11995: test_pydoc doesn't import all sys.path modules anymore.
C-API C-API
----- -----
@ -338,7 +343,6 @@ C-API
- Issue #17327: Add PyDict_SetDefault. - Issue #17327: Add PyDict_SetDefault.
IDLE IDLE
---- ----