Anthony Sottile | 8f61529 | 2022-01-15 19:24:05 -0500 | [diff] [blame] | 1 | from __future__ import annotations |
| 2 | |
Joey Pinhas | ec6c39e | 2019-09-24 15:42:24 -0400 | [diff] [blame] | 3 | import os |
Anthony Sottile | a99475a | 2016-05-27 14:09:50 -0700 | [diff] [blame] | 4 | import shutil |
Léo Cavaillé | 55bf22d | 2015-06-10 17:08:48 -0400 | [diff] [blame] | 5 | |
Anthony Sottile | 3a3a7a1 | 2015-12-25 09:37:18 -0800 | [diff] [blame] | 6 | import pytest |
| 7 | |
Anthony Sottile | 030bfac | 2019-01-31 19:19:10 -0800 | [diff] [blame] | 8 | from pre_commit_hooks.pretty_format_json import main |
Calum Lind | 5b6ddaf | 2017-12-10 09:34:36 +0000 | [diff] [blame] | 9 | from pre_commit_hooks.pretty_format_json import parse_num_to_int |
Léo Cavaillé | 55bf22d | 2015-06-10 17:08:48 -0400 | [diff] [blame] | 10 | from testing.util import get_resource_path |
| 11 | |
| 12 | |
Calum Lind | 5b6ddaf | 2017-12-10 09:34:36 +0000 | [diff] [blame] | 13 | def test_parse_num_to_int(): |
| 14 | assert parse_num_to_int('0') == 0 |
| 15 | assert parse_num_to_int('2') == 2 |
| 16 | assert parse_num_to_int('\t') == '\t' |
| 17 | assert parse_num_to_int(' ') == ' ' |
Sander Maijers | a562886 | 2016-06-10 20:16:00 +0200 | [diff] [blame] | 18 | |
Calum Lind | 00974ef | 2017-12-10 08:57:34 +0000 | [diff] [blame] | 19 | |
Anthony Sottile | e9aea74 | 2017-07-15 12:56:51 -0700 | [diff] [blame] | 20 | @pytest.mark.parametrize( |
| 21 | ('filename', 'expected_retval'), ( |
| 22 | ('not_pretty_formatted_json.json', 1), |
| 23 | ('unsorted_pretty_formatted_json.json', 1), |
| 24 | ('non_ascii_pretty_formatted_json.json', 1), |
| 25 | ('pretty_formatted_json.json', 0), |
| 26 | ), |
| 27 | ) |
Anthony Sottile | 030bfac | 2019-01-31 19:19:10 -0800 | [diff] [blame] | 28 | def test_main(filename, expected_retval): |
| 29 | ret = main([get_resource_path(filename)]) |
Léo Cavaillé | 55bf22d | 2015-06-10 17:08:48 -0400 | [diff] [blame] | 30 | assert ret == expected_retval |
| 31 | |
| 32 | |
Anthony Sottile | e9aea74 | 2017-07-15 12:56:51 -0700 | [diff] [blame] | 33 | @pytest.mark.parametrize( |
| 34 | ('filename', 'expected_retval'), ( |
| 35 | ('not_pretty_formatted_json.json', 1), |
| 36 | ('unsorted_pretty_formatted_json.json', 0), |
| 37 | ('non_ascii_pretty_formatted_json.json', 1), |
| 38 | ('pretty_formatted_json.json', 0), |
| 39 | ), |
| 40 | ) |
Anthony Sottile | 030bfac | 2019-01-31 19:19:10 -0800 | [diff] [blame] | 41 | def test_unsorted_main(filename, expected_retval): |
| 42 | ret = main(['--no-sort-keys', get_resource_path(filename)]) |
mattclegg | bd4e37c | 2016-04-14 09:36:47 +0100 | [diff] [blame] | 43 | assert ret == expected_retval |
| 44 | |
| 45 | |
Anthony Sottile | e9aea74 | 2017-07-15 12:56:51 -0700 | [diff] [blame] | 46 | @pytest.mark.parametrize( |
| 47 | ('filename', 'expected_retval'), ( |
| 48 | ('not_pretty_formatted_json.json', 1), |
| 49 | ('unsorted_pretty_formatted_json.json', 1), |
| 50 | ('non_ascii_pretty_formatted_json.json', 1), |
| 51 | ('pretty_formatted_json.json', 1), |
| 52 | ('tab_pretty_formatted_json.json', 0), |
| 53 | ), |
| 54 | ) |
Anthony Sottile | f5c42a0 | 2020-02-05 11:10:42 -0800 | [diff] [blame] | 55 | def test_tab_main(filename, expected_retval): |
Anthony Sottile | 030bfac | 2019-01-31 19:19:10 -0800 | [diff] [blame] | 56 | ret = main(['--indent', '\t', get_resource_path(filename)]) |
Sander Maijers | a562886 | 2016-06-10 20:16:00 +0200 | [diff] [blame] | 57 | assert ret == expected_retval |
| 58 | |
| 59 | |
Anthony Sottile | 030bfac | 2019-01-31 19:19:10 -0800 | [diff] [blame] | 60 | def test_non_ascii_main(): |
Anthony Sottile | 4575652 | 2019-02-11 19:56:15 -0800 | [diff] [blame] | 61 | ret = main(( |
| 62 | '--no-ensure-ascii', |
| 63 | get_resource_path('non_ascii_pretty_formatted_json.json'), |
| 64 | )) |
ushuz | 10f8bd2 | 2017-03-16 14:54:55 +0800 | [diff] [blame] | 65 | assert ret == 0 |
| 66 | |
| 67 | |
Anthony Sottile | 030bfac | 2019-01-31 19:19:10 -0800 | [diff] [blame] | 68 | def test_autofix_main(tmpdir): |
Anthony Sottile | 7376a29 | 2015-12-26 10:58:33 -0800 | [diff] [blame] | 69 | srcfile = tmpdir.join('to_be_json_formatted.json') |
Anthony Sottile | a99475a | 2016-05-27 14:09:50 -0700 | [diff] [blame] | 70 | shutil.copyfile( |
| 71 | get_resource_path('not_pretty_formatted_json.json'), |
Max Rozentsveyg | f35bfed | 2020-05-20 12:07:45 -0400 | [diff] [blame] | 72 | str(srcfile), |
Anthony Sottile | a99475a | 2016-05-27 14:09:50 -0700 | [diff] [blame] | 73 | ) |
Léo Cavaillé | 55bf22d | 2015-06-10 17:08:48 -0400 | [diff] [blame] | 74 | |
| 75 | # now launch the autofix on that file |
Max Rozentsveyg | f35bfed | 2020-05-20 12:07:45 -0400 | [diff] [blame] | 76 | ret = main(['--autofix', str(srcfile)]) |
Léo Cavaillé | 55bf22d | 2015-06-10 17:08:48 -0400 | [diff] [blame] | 77 | # it should have formatted it |
| 78 | assert ret == 1 |
| 79 | |
Anthony Sottile | 7376a29 | 2015-12-26 10:58:33 -0800 | [diff] [blame] | 80 | # file was formatted (shouldn't trigger linter again) |
Max Rozentsveyg | f35bfed | 2020-05-20 12:07:45 -0400 | [diff] [blame] | 81 | ret = main([str(srcfile)]) |
Léo Cavaillé | 55bf22d | 2015-06-10 17:08:48 -0400 | [diff] [blame] | 82 | assert ret == 0 |
| 83 | |
dmlb2000 | 84b1fb6 | 2016-11-03 15:54:48 -0700 | [diff] [blame] | 84 | |
dmlb2000 | 845a3d5 | 2016-11-03 09:41:23 -0700 | [diff] [blame] | 85 | def test_orderfile_get_pretty_format(): |
Anthony Sottile | 4575652 | 2019-02-11 19:56:15 -0800 | [diff] [blame] | 86 | ret = main(( |
| 87 | '--top-keys=alist', get_resource_path('pretty_formatted_json.json'), |
| 88 | )) |
dmlb2000 | 845a3d5 | 2016-11-03 09:41:23 -0700 | [diff] [blame] | 89 | assert ret == 0 |
| 90 | |
dmlb2000 | 84b1fb6 | 2016-11-03 15:54:48 -0700 | [diff] [blame] | 91 | |
dmlb2000 | 7f057b0 | 2016-11-03 15:51:24 -0700 | [diff] [blame] | 92 | def test_not_orderfile_get_pretty_format(): |
Anthony Sottile | 4575652 | 2019-02-11 19:56:15 -0800 | [diff] [blame] | 93 | ret = main(( |
| 94 | '--top-keys=blah', get_resource_path('pretty_formatted_json.json'), |
| 95 | )) |
dmlb2000 | 845a3d5 | 2016-11-03 09:41:23 -0700 | [diff] [blame] | 96 | assert ret == 1 |
Léo Cavaillé | 55bf22d | 2015-06-10 17:08:48 -0400 | [diff] [blame] | 97 | |
dmlb2000 | 84b1fb6 | 2016-11-03 15:54:48 -0700 | [diff] [blame] | 98 | |
David Brown | e9e9c3d | 2016-11-03 18:05:43 -0700 | [diff] [blame] | 99 | def test_top_sorted_get_pretty_format(): |
Anthony Sottile | 4575652 | 2019-02-11 19:56:15 -0800 | [diff] [blame] | 100 | ret = main(( |
| 101 | '--top-keys=01-alist,alist', get_resource_path('top_sorted_json.json'), |
| 102 | )) |
David Brown | e9e9c3d | 2016-11-03 18:05:43 -0700 | [diff] [blame] | 103 | assert ret == 0 |
| 104 | |
| 105 | |
Anthony Sottile | 030bfac | 2019-01-31 19:19:10 -0800 | [diff] [blame] | 106 | def test_badfile_main(): |
| 107 | ret = main([get_resource_path('ok_yaml.yaml')]) |
Léo Cavaillé | 55bf22d | 2015-06-10 17:08:48 -0400 | [diff] [blame] | 108 | assert ret == 1 |
Joey Pinhas | b28837a | 2019-08-23 14:14:10 -0400 | [diff] [blame] | 109 | |
| 110 | |
Joey Pinhas | 0ff23d4 | 2019-09-13 14:30:52 -0400 | [diff] [blame] | 111 | def test_diffing_output(capsys): |
Joey Pinhas | 35c76c4 | 2019-09-15 12:54:03 -0400 | [diff] [blame] | 112 | resource_path = get_resource_path('not_pretty_formatted_json.json') |
Joey Pinhas | 0ff23d4 | 2019-09-13 14:30:52 -0400 | [diff] [blame] | 113 | expected_retval = 1 |
Joey Pinhas | ec6c39e | 2019-09-24 15:42:24 -0400 | [diff] [blame] | 114 | a = os.path.join('a', resource_path) |
| 115 | b = os.path.join('b', resource_path) |
Anthony Sottile | f5c42a0 | 2020-02-05 11:10:42 -0800 | [diff] [blame] | 116 | expected_out = f'''\ |
| 117 | --- {a} |
| 118 | +++ {b} |
Joey Pinhas | ec6c39e | 2019-09-24 15:42:24 -0400 | [diff] [blame] | 119 | @@ -1,6 +1,9 @@ |
| 120 | {{ |
Joey Pinhas | 31e740e | 2019-09-15 13:48:00 -0400 | [diff] [blame] | 121 | - "foo": |
| 122 | - "bar", |
| 123 | - "alist": [2, 34, 234], |
| 124 | - "blah": null |
| 125 | + "alist": [ |
| 126 | + 2, |
| 127 | + 34, |
| 128 | + 234 |
| 129 | + ], |
| 130 | + "blah": null, |
| 131 | + "foo": "bar" |
Joey Pinhas | ec6c39e | 2019-09-24 15:42:24 -0400 | [diff] [blame] | 132 | }} |
Anthony Sottile | f5c42a0 | 2020-02-05 11:10:42 -0800 | [diff] [blame] | 133 | ''' |
Joey Pinhas | 35c76c4 | 2019-09-15 12:54:03 -0400 | [diff] [blame] | 134 | actual_retval = main([resource_path]) |
| 135 | actual_out, actual_err = capsys.readouterr() |
Joey Pinhas | 0ff23d4 | 2019-09-13 14:30:52 -0400 | [diff] [blame] | 136 | |
| 137 | assert actual_retval == expected_retval |
Joey Pinhas | 35c76c4 | 2019-09-15 12:54:03 -0400 | [diff] [blame] | 138 | assert actual_out == expected_out |
Anthony Sottile | 86a010b | 2019-10-12 13:39:15 -0700 | [diff] [blame] | 139 | assert actual_err == '' |