from __future__ import annotations import io import pytest from pre_commit_hooks.fix_encoding_pragma import _normalize_pragma from pre_commit_hooks.fix_encoding_pragma import fix_encoding_pragma from pre_commit_hooks.fix_encoding_pragma import main def test_integration_inserting_pragma(tmpdir): path = tmpdir.join('foo.py') path.write_binary(b'import httplib\n') assert main((str(path),)) == 1 assert path.read_binary() == ( b'# -*- coding: utf-8 -*-\n' b'import httplib\n' ) def test_integration_ok(tmpdir): path = tmpdir.join('foo.py') path.write_binary(b'# -*- coding: utf-8 -*-\nx = 1\n') assert main((str(path),)) == 0 def test_integration_remove(tmpdir): path = tmpdir.join('foo.py') path.write_binary(b'# -*- coding: utf-8 -*-\nx = 1\n') assert main((str(path), '--remove')) == 1 assert path.read_binary() == b'x = 1\n' def test_integration_remove_ok(tmpdir): path = tmpdir.join('foo.py') path.write_binary(b'x = 1\n') assert main((str(path), '--remove')) == 0 @pytest.mark.parametrize( 'input_str', ( b'', ( b'# -*- coding: utf-8 -*-\n' b'x = 1\n' ), ( b'#!/usr/bin/env python\n' b'# -*- coding: utf-8 -*-\n' b'foo = "bar"\n' ), ), ) def test_ok_inputs(input_str): bytesio = io.BytesIO(input_str) assert fix_encoding_pragma(bytesio) == 0 bytesio.seek(0) assert bytesio.read() == input_str @pytest.mark.parametrize( ('input_str', 'output'), ( ( b'import httplib\n', b'# -*- coding: utf-8 -*-\n' b'import httplib\n', ), ( b'#!/usr/bin/env python\n' b'x = 1\n', b'#!/usr/bin/env python\n' b'# -*- coding: utf-8 -*-\n' b'x = 1\n', ), ( b'#coding=utf-8\n' b'x = 1\n', b'# -*- coding: utf-8 -*-\n' b'x = 1\n', ), ( b'#!/usr/bin/env python\n' b'#coding=utf8\n' b'x = 1\n', b'#!/usr/bin/env python\n' b'# -*- coding: utf-8 -*-\n' b'x = 1\n', ), # These should each get truncated (b'#coding: utf-8\n', b''), (b'# -*- coding: utf-8 -*-\n', b''), (b'#!/usr/bin/env python\n', b''), (b'#!/usr/bin/env python\n#coding: utf8\n', b''), (b'#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n', b''), ), ) def test_not_ok_inputs(input_str, output): bytesio = io.BytesIO(input_str) assert fix_encoding_pragma(bytesio) == 1 bytesio.seek(0) assert bytesio.read() == output def test_ok_input_alternate_pragma(): input_s = b'# coding: utf-8\nx = 1\n' bytesio = io.BytesIO(input_s) ret = fix_encoding_pragma(bytesio, expected_pragma=b'# coding: utf-8') assert ret == 0 bytesio.seek(0) assert bytesio.read() == input_s def test_not_ok_input_alternate_pragma(): bytesio = io.BytesIO(b'x = 1\n') ret = fix_encoding_pragma(bytesio, expected_pragma=b'# coding: utf-8') assert ret == 1 bytesio.seek(0) assert bytesio.read() == b'# coding: utf-8\nx = 1\n' @pytest.mark.parametrize( ('input_s', 'expected'), ( ('# coding: utf-8', b'# coding: utf-8'), # trailing whitespace ('# coding: utf-8\n', b'# coding: utf-8'), ), ) def test_normalize_pragma(input_s, expected): assert _normalize_pragma(input_s) == expected def test_integration_alternate_pragma(tmpdir, capsys): f = tmpdir.join('f.py') f.write('x = 1\n') pragma = '# coding: utf-8' assert main((str(f), '--pragma', pragma)) == 1 assert f.read() == '# coding: utf-8\nx = 1\n' out, _ = capsys.readouterr() assert out == f'Added `# coding: utf-8` to {str(f)}\n' def test_crlf_ok(tmpdir): f = tmpdir.join('f.py') f.write_binary(b'# -*- coding: utf-8 -*-\r\nx = 1\r\n') assert not main((str(f),)) def test_crfl_adds(tmpdir): f = tmpdir.join('f.py') f.write_binary(b'x = 1\r\n') assert main((str(f),)) assert f.read_binary() == b'# -*- coding: utf-8 -*-\r\nx = 1\r\n'