Skip to content

Commit 8d6e107

Browse files
[3.13] gh-131178: Add tests for site command-line interface (GH-133582) (GH-137833)
gh-131178: Add tests for `site` command-line interface (GH-133582) (cherry picked from commit 03f5519) Co-authored-by: ggqlq <[email protected]>
1 parent 83e4b43 commit 8d6e107

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
@@ -12,6 +12,7 @@
1212
from test.support import socket_helper
1313
from test.support import captured_stderr
1414
from test.support.os_helper import TESTFN, EnvironmentVarGuard
15+
from test.support.script_helper import spawn_python, kill_python
1516
import ast
1617
import builtins
1718
import glob
@@ -24,6 +25,7 @@
2425
import sys
2526
import sysconfig
2627
import tempfile
28+
from textwrap import dedent
2729
import urllib.error
2830
import urllib.request
2931
from unittest import mock
@@ -793,5 +795,107 @@ def test_underpth_dll_file(self):
793795
self.assertTrue(rc, "sys.path is incorrect")
794796

795797

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

0 commit comments

Comments
 (0)