Skip to content

Commit 03f5519

Browse files
authored
gh-131178: Add tests for site command-line interface (GH-133582)
1 parent eee6589 commit 03f5519

File tree

1 file changed

+104
-0
lines changed

1 file changed

+104
-0
lines changed

Lib/test/test_site.py

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
from test.support import socket_helper
1414
from test.support import captured_stderr
1515
from test.support.os_helper import TESTFN, EnvironmentVarGuard
16+
from test.support.script_helper import spawn_python, kill_python
1617
import ast
1718
import builtins
1819
import glob
@@ -25,6 +26,7 @@
2526
import sys
2627
import sysconfig
2728
import tempfile
29+
from textwrap import dedent
2830
import urllib.error
2931
import urllib.request
3032
from unittest import mock
@@ -803,5 +805,107 @@ def test_underpth_dll_file(self):
803805
self.assertTrue(rc, "sys.path is incorrect")
804806

805807

808+
class CommandLineTests(unittest.TestCase):
809+
def exists(self, path):
810+
if path is not None and os.path.isdir(path):
811+
return "exists"
812+
else:
813+
return "doesn't exist"
814+
815+
def get_excepted_output(self, *args):
816+
if len(args) == 0:
817+
user_base = site.getuserbase()
818+
user_site = site.getusersitepackages()
819+
output = io.StringIO()
820+
output.write("sys.path = [\n")
821+
for dir in sys.path:
822+
output.write(" %r,\n" % (dir,))
823+
output.write("]\n")
824+
output.write(f"USER_BASE: {user_base} ({self.exists(user_base)})\n")
825+
output.write(f"USER_SITE: {user_site} ({self.exists(user_site)})\n")
826+
output.write(f"ENABLE_USER_SITE: {site.ENABLE_USER_SITE}\n")
827+
return 0, dedent(output.getvalue()).strip()
828+
829+
buffer = []
830+
if '--user-base' in args:
831+
buffer.append(site.getuserbase())
832+
if '--user-site' in args:
833+
buffer.append(site.getusersitepackages())
834+
835+
if buffer:
836+
return_code = 3
837+
if site.ENABLE_USER_SITE:
838+
return_code = 0
839+
elif site.ENABLE_USER_SITE is False:
840+
return_code = 1
841+
elif site.ENABLE_USER_SITE is None:
842+
return_code = 2
843+
output = os.pathsep.join(buffer)
844+
return return_code, os.path.normpath(dedent(output).strip())
845+
else:
846+
return 10, None
847+
848+
def invoke_command_line(self, *args):
849+
args = ["-m", "site", *args]
850+
851+
with EnvironmentVarGuard() as env:
852+
env["PYTHONUTF8"] = "1"
853+
env["PYTHONIOENCODING"] = "utf-8"
854+
proc = spawn_python(*args, text=True, env=env,
855+
encoding='utf-8', errors='replace')
856+
857+
output = kill_python(proc)
858+
return_code = proc.returncode
859+
return return_code, os.path.normpath(dedent(output).strip())
860+
861+
@support.requires_subprocess()
862+
def test_no_args(self):
863+
return_code, output = self.invoke_command_line()
864+
excepted_return_code, _ = self.get_excepted_output()
865+
self.assertEqual(return_code, excepted_return_code)
866+
lines = output.splitlines()
867+
self.assertEqual(lines[0], "sys.path = [")
868+
self.assertEqual(lines[-4], "]")
869+
excepted_base = f"USER_BASE: '{site.getuserbase()}'" +\
870+
f" ({self.exists(site.getuserbase())})"
871+
self.assertEqual(lines[-3], excepted_base)
872+
excepted_site = f"USER_SITE: '{site.getusersitepackages()}'" +\
873+
f" ({self.exists(site.getusersitepackages())})"
874+
self.assertEqual(lines[-2], excepted_site)
875+
self.assertEqual(lines[-1], f"ENABLE_USER_SITE: {site.ENABLE_USER_SITE}")
876+
877+
@support.requires_subprocess()
878+
def test_unknown_args(self):
879+
return_code, output = self.invoke_command_line("--unknown-arg")
880+
excepted_return_code, _ = self.get_excepted_output("--unknown-arg")
881+
self.assertEqual(return_code, excepted_return_code)
882+
self.assertIn('[--user-base] [--user-site]', output)
883+
884+
@support.requires_subprocess()
885+
def test_base_arg(self):
886+
return_code, output = self.invoke_command_line("--user-base")
887+
excepted = self.get_excepted_output("--user-base")
888+
excepted_return_code, excepted_output = excepted
889+
self.assertEqual(return_code, excepted_return_code)
890+
self.assertEqual(output, excepted_output)
891+
892+
@support.requires_subprocess()
893+
def test_site_arg(self):
894+
return_code, output = self.invoke_command_line("--user-site")
895+
excepted = self.get_excepted_output("--user-site")
896+
excepted_return_code, excepted_output = excepted
897+
self.assertEqual(return_code, excepted_return_code)
898+
self.assertEqual(output, excepted_output)
899+
900+
@support.requires_subprocess()
901+
def test_both_args(self):
902+
return_code, output = self.invoke_command_line("--user-base",
903+
"--user-site")
904+
excepted = self.get_excepted_output("--user-base", "--user-site")
905+
excepted_return_code, excepted_output = excepted
906+
self.assertEqual(return_code, excepted_return_code)
907+
self.assertEqual(output, excepted_output)
908+
909+
806910
if __name__ == "__main__":
807911
unittest.main()

0 commit comments

Comments
 (0)