From 154328e7273481f62d5ce877a5c310b72dca9ebb Mon Sep 17 00:00:00 2001 From: tangyuan0821 Date: Tue, 23 Jun 2026 16:30:34 +0800 Subject: [PATCH 1/2] gh-131178: Add tests for pydoc command-line interface --- Lib/pydoc.py | 1 + Lib/test/test_pydoc/test_pydoc.py | 61 +++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+) diff --git a/Lib/pydoc.py b/Lib/pydoc.py index fe42592530c2cfd..a0626cb8bb9d338 100644 --- a/Lib/pydoc.py +++ b/Lib/pydoc.py @@ -2850,6 +2850,7 @@ class BadUsage(Exception): pass directory. If contains a '{sep}', it is treated as a filename; if it names a directory, documentation is written for all the contents. """.format(cmd=cmd, sep=os.sep)) + sys.exit(1) if __name__ == '__main__': cli() diff --git a/Lib/test/test_pydoc/test_pydoc.py b/Lib/test/test_pydoc/test_pydoc.py index 5543c664528e6c8..687c460033b9915 100644 --- a/Lib/test/test_pydoc/test_pydoc.py +++ b/Lib/test/test_pydoc/test_pydoc.py @@ -2462,6 +2462,67 @@ def __version__(self): self.assertEqual(len(w), 1) +@support.force_not_colorized_test_class +class TestPydocCLI(unittest.TestCase): + """Tests for the pydoc command-line interface.""" + + def test_show_doc(self): + rc, out, err = assert_python_ok('-m', 'pydoc', 'os') + self.assertEqual(rc, 0) + self.assertIn(b'os', out) + self.assertEqual(err, b'') + + def test_show_doc_builtin(self): + rc, out, err = assert_python_ok('-m', 'pydoc', 'list') + self.assertEqual(rc, 0) + self.assertIn(b'list', out) + self.assertEqual(err, b'') + + def test_show_doc_keyword(self): + rc, out, err = assert_python_ok('-m', 'pydoc', 'for') + self.assertEqual(rc, 0) + self.assertIn(b'for', out) + self.assertEqual(err, b'') + + def test_keyword_search(self): + rc, out, err = assert_python_ok('-m', 'pydoc', '-k', 'thread') + self.assertEqual(rc, 0) + # Either matching modules are listed or no documentation is found. + self.assertTrue( + b'thread' in out.lower() or + b'no Python documentation found' in out, + out + ) + self.assertEqual(err, b'') + + def test_write_html(self): + with os_helper.temp_dir() as tmpdir: + rc, out, err = assert_python_ok('-m', 'pydoc', '-w', 'os', + __cwd=tmpdir) + self.assertEqual(rc, 0) + self.assertIn(b'wrote os.html', out.lower()) + self.assertEqual(err, b'') + self.assertTrue(os.path.exists(os.path.join(tmpdir, 'os.html'))) + + def test_nonexistent_module(self): + rc, out, err = assert_python_failure('-m', 'pydoc', 'nonexistent_module') + self.assertEqual(rc, 1) + self.assertIn(b'nonexistent_module', out) + self.assertEqual(err, b'') + + def test_no_args(self): + rc, out, err = assert_python_failure('-m', 'pydoc') + self.assertEqual(rc, 1) + self.assertIn(b'pydoc - the Python documentation tool', out) + self.assertEqual(err, b'') + + def test_invalid_flag(self): + rc, out, err = assert_python_failure('-m', 'pydoc', '--xyz') + self.assertEqual(rc, 1) + self.assertIn(b'pydoc - the Python documentation tool', out) + self.assertEqual(err, b'') + + def setUpModule(): thread_info = threading_helper.threading_setup() unittest.addModuleCleanup(threading_helper.threading_cleanup, *thread_info) From d5a415361bd016c37816cd6cf389e3d09ff31cac Mon Sep 17 00:00:00 2001 From: tangyuan0821 Date: Tue, 23 Jun 2026 16:36:11 +0800 Subject: [PATCH 2/2] gh-131178: Add news entries for pydoc CLI tests --- .../next/Library/2026-06-23-16-34-09.gh-issue-131178.XyZaBc.rst | 1 + .../next/Tests/2026-06-23-16-34-08.gh-issue-131178.LmNpQr.rst | 1 + 2 files changed, 2 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2026-06-23-16-34-09.gh-issue-131178.XyZaBc.rst create mode 100644 Misc/NEWS.d/next/Tests/2026-06-23-16-34-08.gh-issue-131178.LmNpQr.rst diff --git a/Misc/NEWS.d/next/Library/2026-06-23-16-34-09.gh-issue-131178.XyZaBc.rst b/Misc/NEWS.d/next/Library/2026-06-23-16-34-09.gh-issue-131178.XyZaBc.rst new file mode 100644 index 000000000000000..8560098689c20f2 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2026-06-23-16-34-09.gh-issue-131178.XyZaBc.rst @@ -0,0 +1 @@ +Make :mod:`pydoc` exit with code 1 when invoked with no arguments or an invalid option. diff --git a/Misc/NEWS.d/next/Tests/2026-06-23-16-34-08.gh-issue-131178.LmNpQr.rst b/Misc/NEWS.d/next/Tests/2026-06-23-16-34-08.gh-issue-131178.LmNpQr.rst new file mode 100644 index 000000000000000..919c7481612c0ea --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2026-06-23-16-34-08.gh-issue-131178.LmNpQr.rst @@ -0,0 +1 @@ +Add CLI tests for :mod:`pydoc`.