| from __future__ import annotations | |
| import os | |
| import shutil | |
| import pytest | |
| from pre_commit_hooks.pretty_format_json import main | |
| from pre_commit_hooks.pretty_format_json import parse_num_to_int | |
| from testing.util import get_resource_path | |
| def test_parse_num_to_int(): | |
| assert parse_num_to_int('0') == 0 | |
| assert parse_num_to_int('2') == 2 | |
| assert parse_num_to_int('\t') == '\t' | |
| assert parse_num_to_int(' ') == ' ' | |
| @pytest.mark.parametrize( | |
| ('filename', 'expected_retval'), ( | |
| ('not_pretty_formatted_json.json', 1), | |
| ('unsorted_pretty_formatted_json.json', 1), | |
| ('non_ascii_pretty_formatted_json.json', 1), | |
| ('pretty_formatted_json.json', 0), | |
| ), | |
| ) | |
| def test_main(filename, expected_retval): | |
| ret = main([get_resource_path(filename)]) | |
| assert ret == expected_retval | |
| @pytest.mark.parametrize( | |
| ('filename', 'expected_retval'), ( | |
| ('not_pretty_formatted_json.json', 1), | |
| ('unsorted_pretty_formatted_json.json', 0), | |
| ('non_ascii_pretty_formatted_json.json', 1), | |
| ('pretty_formatted_json.json', 0), | |
| ), | |
| ) | |
| def test_unsorted_main(filename, expected_retval): | |
| ret = main(['--no-sort-keys', get_resource_path(filename)]) | |
| assert ret == expected_retval | |
| @pytest.mark.parametrize( | |
| ('filename', 'expected_retval'), ( | |
| ('not_pretty_formatted_json.json', 1), | |
| ('unsorted_pretty_formatted_json.json', 1), | |
| ('non_ascii_pretty_formatted_json.json', 1), | |
| ('pretty_formatted_json.json', 1), | |
| ('tab_pretty_formatted_json.json', 0), | |
| ), | |
| ) | |
| def test_tab_main(filename, expected_retval): | |
| ret = main(['--indent', '\t', get_resource_path(filename)]) | |
| assert ret == expected_retval | |
| def test_non_ascii_main(): | |
| ret = main(( | |
| '--no-ensure-ascii', | |
| get_resource_path('non_ascii_pretty_formatted_json.json'), | |
| )) | |
| assert ret == 0 | |
| def test_autofix_main(tmpdir): | |
| srcfile = tmpdir.join('to_be_json_formatted.json') | |
| shutil.copyfile( | |
| get_resource_path('not_pretty_formatted_json.json'), | |
| str(srcfile), | |
| ) | |
| # now launch the autofix on that file | |
| ret = main(['--autofix', str(srcfile)]) | |
| # it should have formatted it | |
| assert ret == 1 | |
| # file was formatted (shouldn't trigger linter again) | |
| ret = main([str(srcfile)]) | |
| assert ret == 0 | |
| def test_invalid_main(tmpdir): | |
| srcfile1 = tmpdir.join('not_valid_json.json') | |
| srcfile1.write( | |
| '{\n' | |
| ' // not json\n' | |
| ' "a": "b"\n' | |
| '}', | |
| ) | |
| srcfile2 = tmpdir.join('to_be_json_formatted.json') | |
| srcfile2.write('{ "a": "b" }') | |
| # it should have skipped the first file and formatted the second one | |
| assert main(['--autofix', str(srcfile1), str(srcfile2)]) == 1 | |
| # confirm second file was formatted (shouldn't trigger linter again) | |
| assert main([str(srcfile2)]) == 0 | |
| def test_orderfile_get_pretty_format(): | |
| ret = main(( | |
| '--top-keys=alist', get_resource_path('pretty_formatted_json.json'), | |
| )) | |
| assert ret == 0 | |
| def test_not_orderfile_get_pretty_format(): | |
| ret = main(( | |
| '--top-keys=blah', get_resource_path('pretty_formatted_json.json'), | |
| )) | |
| assert ret == 1 | |
| def test_top_sorted_get_pretty_format(): | |
| ret = main(( | |
| '--top-keys=01-alist,alist', get_resource_path('top_sorted_json.json'), | |
| )) | |
| assert ret == 0 | |
| def test_badfile_main(): | |
| ret = main([get_resource_path('ok_yaml.yaml')]) | |
| assert ret == 1 | |
| def test_diffing_output(capsys): | |
| resource_path = get_resource_path('not_pretty_formatted_json.json') | |
| expected_retval = 1 | |
| a = os.path.join('a', resource_path) | |
| b = os.path.join('b', resource_path) | |
| expected_out = f'''\ | |
| --- {a} | |
| +++ {b} | |
| @@ -1,6 +1,9 @@ | |
| {{ | |
| - "foo": | |
| - "bar", | |
| - "alist": [2, 34, 234], | |
| - "blah": null | |
| + "alist": [ | |
| + 2, | |
| + 34, | |
| + 234 | |
| + ], | |
| + "blah": null, | |
| + "foo": "bar" | |
| }} | |
| ''' | |
| actual_retval = main([resource_path]) | |
| actual_out, actual_err = capsys.readouterr() | |
| assert actual_retval == expected_retval | |
| assert actual_out == expected_out | |
| assert actual_err == '' |