| 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' |