import os import subprocess import sys import unittest from test import support from test.test_tools import import_tool, scriptsdir, skip_if_missing # need Tools/script/ directory: skip if run on Python installed on the system skip_if_missing() class TestPathfixFunctional(unittest.TestCase): script = os.path.join(scriptsdir, 'pathfix.py') def setUp(self): self.temp_file = support.TESTFN self.addCleanup(support.unlink, support.TESTFN) def pathfix(self, shebang, pathfix_flags, exitcode=0, stdout='', stderr=''): with open(self.temp_file, 'w', encoding='utf8') as f: f.write(f'{shebang}\n' + 'print("Hello world")\n') proc = subprocess.run( [sys.executable, self.script, *pathfix_flags, '-n', self.temp_file], capture_output=True, text=1) if stdout == '' and proc.returncode == 0: stdout = f'{self.temp_file}: updating\n' self.assertEqual(proc.returncode, exitcode, proc) self.assertEqual(proc.stdout, stdout, proc) self.assertEqual(proc.stderr, stderr, proc) with open(self.temp_file, 'r', encoding='utf8') as f: output = f.read() lines = output.split('\n') self.assertEqual(lines[1:], ['print("Hello world")', '']) new_shebang = lines[0] if proc.returncode != 0: self.assertEqual(shebang, new_shebang) return new_shebang def test_pathfix(self): self.assertEqual( self.pathfix( '#! /usr/bin/env python', ['-i', '/usr/bin/python3']), '#! /usr/bin/python3') self.assertEqual( self.pathfix( '#! /usr/bin/env python -R', ['-i', '/usr/bin/python3']), '#! /usr/bin/python3') def test_pathfix_keeping_flags(self): self.assertEqual( self.pathfix( '#! /usr/bin/env python -R', ['-i', '/usr/bin/python3', '-k']), '#! /usr/bin/python3 -R') self.assertEqual( self.pathfix( '#! /usr/bin/env python', ['-i', '/usr/bin/python3', '-k']), '#! /usr/bin/python3') def test_pathfix_adding_flag(self): self.assertEqual( self.pathfix( '#! /usr/bin/env python', ['-i', '/usr/bin/python3', '-a', 's']), '#! /usr/bin/python3 -s') self.assertEqual( self.pathfix( '#! /usr/bin/env python -S', ['-i', '/usr/bin/python3', '-a', 's']), '#! /usr/bin/python3 -s') self.assertEqual( self.pathfix( '#! /usr/bin/env python -V', ['-i', '/usr/bin/python3', '-a', 'v', '-k']), '#! /usr/bin/python3 -vV') self.assertEqual( self.pathfix( '#! /usr/bin/env python', ['-i', '/usr/bin/python3', '-a', 'Rs']), '#! /usr/bin/python3 -Rs') self.assertEqual( self.pathfix( '#! /usr/bin/env python -W default', ['-i', '/usr/bin/python3', '-a', 's', '-k']), '#! /usr/bin/python3 -sW default') def test_pathfix_adding_errors(self): self.pathfix( '#! /usr/bin/env python -E', ['-i', '/usr/bin/python3', '-a', 'W default', '-k'], exitcode=2, stderr="-a option doesn't support whitespaces") if __name__ == '__main__': unittest.main()