def test_success_messages_are_printed_on_stderr(tmpdir, capsys): f = tmpdir.join('f.py') f.write('import os,sys') main((str(f), )) out, err = capsys.readouterr() assert err == f'Reordering imports in {f}\n' assert out == ''
def test_warning_pythonpath(tmpdir, capsys): f = tmpdir.join('f.py').ensure() with mock.patch.dict(os.environ, {'PYTHONPATH': str(tmpdir)}): main((str(f), )) out, err = capsys.readouterr() assert err == '$PYTHONPATH set, import order may be unexpected\n' assert out == ''
def test_separate_from_import_integration(in_tmpdir): in_tmpdir.join('foo/__init__.py').ensure() in_tmpdir.join('foo/bar/__init__.py').ensure() in_tmpdir.join('foo/foo.py').write( 'import thirdparty\n' 'import foo.bar\n' 'from foo import bar\n' 'from . import bar\n', ) main(('foo/foo.py',)) assert in_tmpdir.join('foo/foo.py').read() == ( 'import thirdparty\n' '\n' 'import foo.bar\n' 'from . import bar\n' 'from foo import bar\n' ) main(('foo/foo.py', '--separate-from-import')) assert in_tmpdir.join('foo/foo.py').read() == ( 'import thirdparty\n' '\n' 'import foo.bar\n' '\n' 'from . import bar\n' 'from foo import bar\n' )
def test_py_options_io(tmpdir, opt, expected): f = tmpdir.join('f.py') src = 'from io import open\n' f.write(src) main((str(f), opt)) ret = f.read() assert ret == expected
def test_py_options(tmpdir, futures, opt, expected): f = tmpdir.join('f.py') src = 'from __future__ import {}'.format(', '.join(futures)) f.write(src) main((str(f), opt)) ret = {l[len('from __future__ import '):].strip() for l in f.readlines()} assert ret == expected
def test_additional_directories_integration(in_tmpdir): if '' in sys.path: # pragma: no cover (depends on run environment) sys.path.remove('') # Intentionally avoiding 'tests' and 'testing' because those would clash # with the names of this project in_tmpdir.join('nottests/nottesting/__init__.py').ensure() in_tmpdir.join('foo.py').write( 'import thirdparty\n' 'import nottests\n' 'import nottesting\n', ) # Without the new option main(('foo.py', )) assert in_tmpdir.join('foo.py').read() == ('import nottesting\n' 'import thirdparty\n' '\n' 'import nottests\n') # With the new option main(('foo.py', '--application-directories', '.:nottests')) assert in_tmpdir.join('foo.py').read() == ('import thirdparty\n' '\n' 'import nottesting\n' 'import nottests\n')
def test_unreadable_files_print_filename(tmpdir, capsys): f = tmpdir.join('f.py') f.write_binary(b'\x98\xef\x12...') filename = str(f) with pytest.raises(UnicodeDecodeError): main([filename]) _, err = capsys.readouterr() assert filename in err
def test_py_options(tmpdir, opt, expected): f = tmpdir.join('f.py') f.write( 'from __future__ import unicode_literals\n' 'from __future__ import with_statement\n\n' 'from io import open\n', ) main((str(f), opt)) assert f.read() == expected
def test_invalid_add_remove_syntaxes(tmpdir, capsys, opt, s): f = tmpdir.join('f.py') f.write('import os\n') with pytest.raises(SystemExit) as excinfo: main((str(f), opt, s)) retc, = excinfo.value.args assert retc out = ''.join(capsys.readouterr()) assert f'{opt}: expected import: {s!r}' in out
def test_replace_module_invalid_arg(tmpdir, capsys, s): f = tmpdir.join('f.py') f.write('import os\n') with pytest.raises(SystemExit) as excinfo: main((str(f), '--replace-import', s)) retc, = excinfo.value.args assert retc out = ''.join(capsys.readouterr()) expected = (f'--replace-import: expected `orig.mod=new.mod` or ' f'`orig.mod=new.mod:attr`: {s!r}') assert expected in out
def test_integration_main(s, expected, tmpdir): test_file = tmpdir.join('test.py') test_file.write(s) # Check return value with --diff-only retv_diff = main((str(test_file), '--diff-only')) assert retv_diff == int(s != expected) retv = main((str(test_file), )) # Check return value assert retv == int(s != expected) # Check the contents rewritten assert test_file.read() == expected
def test_main_stdin_fix_basic(capsys): input_b = b'import sys\nimport os\n' stdin = io.TextIOWrapper(io.BytesIO(input_b), 'UTF-8') with mock.patch.object(sys, 'stdin', stdin): assert main(('-', )) == 1 out, err = capsys.readouterr() assert out == 'import os\nimport sys\n'
def test_replace_module(tmpdir): f = tmpdir.join('f.py') f.write('from six.moves.urllib.parse import quote_plus\n') assert main(( str(f), '--replace-import', 'six.moves.urllib.parse=urllib.parse', )) assert f.read() == 'from urllib.parse import quote_plus\n'
def test_main_stdin_diff_only_no_changes(capsys): input_b = b'import os\nimport sys\n' stdin = io.TextIOWrapper(io.BytesIO(input_b), 'UTF-8') with mock.patch.object(sys, 'stdin', stdin): assert main(('-', '--diff-only')) == 0 out, err = capsys.readouterr() assert out == ''
def test_unreadable_files_print_filename(tmpdir, capsys): f = tmpdir.join('f.py') f.write_binary(b'\x98\xef\x12...') filename = str(f) assert main([filename]) _, err = capsys.readouterr() assert filename in err
def test_integration_main_stdout(capsys): ret = main(('--print-only', 'test_data/inputs/needs_reordering.py')) assert ret == 1 out, err = capsys.readouterr() assert out == 'import os\n\nimport six\n\nimport reorder_python_imports\n' assert err == ('!!! --print-only is deprecated\n' '!!! maybe use `-` instead?\n' '==> test_data/inputs/needs_reordering.py <==\n')
def test_does_not_reorder_with_diff_only(in_tmpdir, capsys): test_file = in_tmpdir.join('test.py') test_file.write('import sys\nimport os\n') retv = main((str(test_file), '--diff-only')) assert retv == 1 assert test_file.read() == 'import sys\nimport os\n' patch, _ = capsys.readouterr() _apply_patch(patch) assert test_file.read() == 'import os\nimport sys\n'
def test_integration_main(filename, tmpdir): with io.open(os.path.join('test_data/inputs', filename)) as f: input_contents = f.read() with io.open(os.path.join('test_data/outputs', filename)) as f: expected = f.read() test_file = tmpdir.join('test.py') test_file.write(input_contents) # Check return value with --diff-only retv_diff = main((str(test_file), '--diff-only')) assert retv_diff == int(input_contents != expected) retv = main((str(test_file), )) # Check return value assert retv == int(input_contents != expected) # Check the contents rewritten assert test_file.read() == expected
def test_main_stdin_diff_only(tmpdir, capsys): tf = tmpdir.join('t.py') input_b = b'import sys\nimport os\n' tf.write(input_b) stdin = io.TextIOWrapper(io.BytesIO(input_b), 'UTF-8') with mock.patch.object(sys, 'stdin', stdin): assert main(('-', '--diff-only')) == 1 out, _ = capsys.readouterr() _apply_patch(out, origfile=tf) assert tf.read() == 'import os\nimport sys\n'
def test_integration_main_stdout(tmpdir, capsys): f = tmpdir.join('f.py') f.write('import reorder_python_imports\n' 'import os\n' 'import six\n', ) ret = main(('--print-only', f.strpath)) assert ret == 1 out, err = capsys.readouterr() assert out == ('import os\n\n' 'import six\n\n' 'import reorder_python_imports\n') assert err == (f'!!! --print-only is deprecated\n' f'!!! maybe use `-` instead?\n' f'==> {f} <==\n')
def test_patch_multiple_files_no_eol(in_tmpdir, capsys): test1file = in_tmpdir.join('test1.py') test2file = in_tmpdir.join('test2.py') # Intentionally no EOL test1file.write('import sys\nimport os') test2file.write('import sys\nimport os\n') ret = main((str(test1file), str(test2file), '--diff-only')) assert ret == 1 patch, _ = capsys.readouterr() _apply_patch(patch) assert test1file.read() == 'import os\nimport sys\n' assert test2file.read() == 'import os\nimport sys\n'
def test_can_add_multiple_imports_at_once(tmpdir): f = tmpdir.join('f.py') f.write('import argparse') assert main((str(f), '--add-import', 'import os, sys')) assert f.read() == 'import argparse\nimport os\nimport sys\n'
def test_py38_plus_rewrites_mypy_extensions_import(tmpdir): f = tmpdir.join('f.py') f.write('from mypy_extensions import TypedDict\n') assert main((str(f), '--py38-plus')) assert f.read() == 'from typing import TypedDict\n'
def test_py3_plus_removes_builtins_star_import(tmpdir): f = tmpdir.join('f.py') f.write('from builtins import *') assert main((str(f), '--py3-plus')) assert f.read() == ''
def test_py37_plus_rewrites_typing_extensions_import(tmpdir): f = tmpdir.join('f.py') f.write('from typing_extensions import Deque\n') assert main((str(f), '--py37-plus')) assert f.read() == 'from typing import Deque\n'
def test_py3_plus_removes_python_future_imports(tmpdir): f = tmpdir.join('f.py') f.write('from builtins import str\n') assert main((str(f), '--py3-plus')) assert f.read() == ''
def test_py3_plus_does_not_rewrite_mock_version_info(tmpdir): f = tmpdir.join('f.py') f.write('from mock import version_info\n') assert not main((str(f), '--py3-plus')) assert f.read() == 'from mock import version_info\n'
def test_py3_plus_does_not_unsix_moves_urllib(tmpdir): f = tmpdir.join('f.py') f.write('from six.moves import urllib\n') assert not main((str(f), '--py3-plus')) assert f.read() == 'from six.moves import urllib\n'
def test_py3_plus_rewrites_absolute_mock_to_relative_unittest_mock(tmpdir): f = tmpdir.join('f.py') f.write('import mock\n') assert main((str(f), '--py3-plus')) assert f.read() == 'from unittest import mock\n'
def test_py3_plus_rewrites_mock_mock(tmpdir): f = tmpdir.join('f.py') f.write('from mock.mock import ANY\n') assert main((str(f), '--py3-plus')) assert f.read() == 'from unittest.mock import ANY\n'