Anthony Sottile | 8f61529 | 2022-01-15 19:24:05 -0500 | [diff] [blame] | 1 | from __future__ import annotations |
| 2 | |
Cameron Paul | b83ea59 | 2014-12-16 12:22:37 -0800 | [diff] [blame] | 3 | import pytest |
| 4 | |
Daniel Gallagher | 844d983 | 2017-06-25 10:14:58 -0700 | [diff] [blame] | 5 | from pre_commit_hooks.requirements_txt_fixer import FAIL |
Anthony Sottile | 030bfac | 2019-01-31 19:19:10 -0800 | [diff] [blame] | 6 | from pre_commit_hooks.requirements_txt_fixer import main |
Daniel Gallagher | 844d983 | 2017-06-25 10:14:58 -0700 | [diff] [blame] | 7 | from pre_commit_hooks.requirements_txt_fixer import PASS |
Cameron Paul | b83ea59 | 2014-12-16 12:22:37 -0800 | [diff] [blame] | 8 | from pre_commit_hooks.requirements_txt_fixer import Requirement |
| 9 | |
Daniel Gallagher | 844d983 | 2017-06-25 10:14:58 -0700 | [diff] [blame] | 10 | |
| 11 | @pytest.mark.parametrize( |
| 12 | ('input_s', 'expected_retval', 'output'), |
| 13 | ( |
| 14 | (b'', PASS, b''), |
| 15 | (b'\n', PASS, b'\n'), |
Anthony Sottile | 86691ed | 2017-10-09 10:59:17 -0700 | [diff] [blame] | 16 | (b'# intentionally empty\n', PASS, b'# intentionally empty\n'), |
| 17 | (b'foo\n# comment at end\n', PASS, b'foo\n# comment at end\n'), |
Daniel Gallagher | 844d983 | 2017-06-25 10:14:58 -0700 | [diff] [blame] | 18 | (b'foo\nbar\n', FAIL, b'bar\nfoo\n'), |
| 19 | (b'bar\nfoo\n', PASS, b'bar\nfoo\n'), |
Barak Y. Reif | da2ea3f | 2019-09-28 21:40:09 +0300 | [diff] [blame] | 20 | (b'a\nc\nb\n', FAIL, b'a\nb\nc\n'), |
| 21 | (b'a\nc\nb', FAIL, b'a\nb\nc\n'), |
Barak Y. Reif | d4b544d | 2019-09-28 21:59:41 +0300 | [diff] [blame] | 22 | (b'a\nb\nc', FAIL, b'a\nb\nc\n'), |
Anthony Sottile | 4575652 | 2019-02-11 19:56:15 -0800 | [diff] [blame] | 23 | ( |
| 24 | b'#comment1\nfoo\n#comment2\nbar\n', |
| 25 | FAIL, |
| 26 | b'#comment2\nbar\n#comment1\nfoo\n', |
| 27 | ), |
| 28 | ( |
| 29 | b'#comment1\nbar\n#comment2\nfoo\n', |
| 30 | PASS, |
| 31 | b'#comment1\nbar\n#comment2\nfoo\n', |
| 32 | ), |
Daniel Gallagher | 844d983 | 2017-06-25 10:14:58 -0700 | [diff] [blame] | 33 | (b'#comment\n\nfoo\nbar\n', FAIL, b'#comment\n\nbar\nfoo\n'), |
| 34 | (b'#comment\n\nbar\nfoo\n', PASS, b'#comment\n\nbar\nfoo\n'), |
Viacheslav Greshilov | 28b2c8e | 2021-01-17 21:15:05 +0200 | [diff] [blame] | 35 | ( |
| 36 | b'foo\n\t#comment with indent\nbar\n', |
| 37 | FAIL, |
| 38 | b'\t#comment with indent\nbar\nfoo\n', |
| 39 | ), |
| 40 | ( |
| 41 | b'bar\n\t#comment with indent\nfoo\n', |
| 42 | PASS, |
| 43 | b'bar\n\t#comment with indent\nfoo\n', |
| 44 | ), |
Daniel Gallagher | 844d983 | 2017-06-25 10:14:58 -0700 | [diff] [blame] | 45 | (b'\nfoo\nbar\n', FAIL, b'bar\n\nfoo\n'), |
| 46 | (b'\nbar\nfoo\n', PASS, b'\nbar\nfoo\n'), |
Anthony Sottile | 4575652 | 2019-02-11 19:56:15 -0800 | [diff] [blame] | 47 | ( |
Max Rozentsveyg | 7ebd420 | 2020-05-16 23:58:27 -0400 | [diff] [blame] | 48 | b'pyramid-foo==1\npyramid>=2\n', |
| 49 | FAIL, |
| 50 | b'pyramid>=2\npyramid-foo==1\n', |
| 51 | ), |
| 52 | ( |
| 53 | b'a==1\n' |
| 54 | b'c>=1\n' |
| 55 | b'bbbb!=1\n' |
| 56 | b'c-a>=1;python_version>="3.6"\n' |
| 57 | b'e>=2\n' |
| 58 | b'd>2\n' |
| 59 | b'g<2\n' |
| 60 | b'f<=2\n', |
| 61 | FAIL, |
| 62 | b'a==1\n' |
| 63 | b'bbbb!=1\n' |
| 64 | b'c>=1\n' |
| 65 | b'c-a>=1;python_version>="3.6"\n' |
| 66 | b'd>2\n' |
| 67 | b'e>=2\n' |
| 68 | b'f<=2\n' |
| 69 | b'g<2\n', |
Anthony Sottile | 4575652 | 2019-02-11 19:56:15 -0800 | [diff] [blame] | 70 | ), |
Vincent Houlbrèque | 0d6d0a7 | 2024-02-21 14:22:08 +0100 | [diff] [blame] | 71 | (b'a==1\nb==1\na==1\n', FAIL, b'a==1\nb==1\n'), |
| 72 | ( |
| 73 | b'a==1\nb==1\n#comment about a\na==1\n', |
| 74 | FAIL, |
| 75 | b'#comment about a\na==1\nb==1\n', |
| 76 | ), |
Daniel Gallagher | 844d983 | 2017-06-25 10:14:58 -0700 | [diff] [blame] | 77 | (b'ocflib\nDjango\nPyMySQL\n', FAIL, b'Django\nocflib\nPyMySQL\n'), |
| 78 | ( |
| 79 | b'-e git+ssh://git_url@tag#egg=ocflib\nDjango\nPyMySQL\n', |
| 80 | FAIL, |
Anthony Sottile | 2a902e0 | 2017-07-12 18:35:24 -0700 | [diff] [blame] | 81 | b'Django\n-e git+ssh://git_url@tag#egg=ocflib\nPyMySQL\n', |
Daniel Gallagher | 844d983 | 2017-06-25 10:14:58 -0700 | [diff] [blame] | 82 | ), |
Michał Sochoń | 1d6ad0d | 2018-03-25 23:28:04 +0200 | [diff] [blame] | 83 | (b'bar\npkg-resources==0.0.0\nfoo\n', FAIL, b'bar\nfoo\n'), |
| 84 | (b'foo\npkg-resources==0.0.0\nbar\n', FAIL, b'bar\nfoo\n'), |
Vinay Karanam | 189e33e | 2019-11-14 02:22:07 +0530 | [diff] [blame] | 85 | ( |
| 86 | b'git+ssh://git_url@tag#egg=ocflib\nDjango\nijk\n', |
| 87 | FAIL, |
| 88 | b'Django\nijk\ngit+ssh://git_url@tag#egg=ocflib\n', |
| 89 | ), |
Aniket Bhatnagar | bbcd31e | 2020-05-07 21:02:12 +0100 | [diff] [blame] | 90 | ( |
| 91 | b'b==1.0.0\n' |
| 92 | b'c=2.0.0 \\\n' |
| 93 | b' --hash=sha256:abcd\n' |
| 94 | b'a=3.0.0 \\\n' |
| 95 | b' --hash=sha256:a1b1c1d1', |
| 96 | FAIL, |
| 97 | b'a=3.0.0 \\\n' |
| 98 | b' --hash=sha256:a1b1c1d1\n' |
| 99 | b'b==1.0.0\n' |
| 100 | b'c=2.0.0 \\\n' |
| 101 | b' --hash=sha256:abcd\n', |
| 102 | ), |
| 103 | ( |
| 104 | b'a=2.0.0 \\\n --hash=sha256:abcd\nb==1.0.0\n', |
| 105 | PASS, |
| 106 | b'a=2.0.0 \\\n --hash=sha256:abcd\nb==1.0.0\n', |
| 107 | ), |
Anthony Sottile | 2a902e0 | 2017-07-12 18:35:24 -0700 | [diff] [blame] | 108 | ), |
Cameron Paul | b83ea59 | 2014-12-16 12:22:37 -0800 | [diff] [blame] | 109 | ) |
Anthony Sottile | 2f1d2bb | 2015-01-04 11:08:53 -0800 | [diff] [blame] | 110 | def test_integration(input_s, expected_retval, output, tmpdir): |
Anthony Sottile | a99475a | 2016-05-27 14:09:50 -0700 | [diff] [blame] | 111 | path = tmpdir.join('file.txt') |
| 112 | path.write_binary(input_s) |
Cameron Paul | b83ea59 | 2014-12-16 12:22:37 -0800 | [diff] [blame] | 113 | |
Max Rozentsveyg | f35bfed | 2020-05-20 12:07:45 -0400 | [diff] [blame] | 114 | output_retval = main([str(path)]) |
Daniel Gallagher | 844d983 | 2017-06-25 10:14:58 -0700 | [diff] [blame] | 115 | |
Anthony Sottile | a99475a | 2016-05-27 14:09:50 -0700 | [diff] [blame] | 116 | assert path.read_binary() == output |
Daniel Gallagher | 844d983 | 2017-06-25 10:14:58 -0700 | [diff] [blame] | 117 | assert output_retval == expected_retval |
Cameron Paul | b83ea59 | 2014-12-16 12:22:37 -0800 | [diff] [blame] | 118 | |
| 119 | |
| 120 | def test_requirement_object(): |
| 121 | top_of_file = Requirement() |
Anthony Sottile | 030bfac | 2019-01-31 19:19:10 -0800 | [diff] [blame] | 122 | top_of_file.comments.append(b'#foo') |
Cameron Paul | b83ea59 | 2014-12-16 12:22:37 -0800 | [diff] [blame] | 123 | top_of_file.value = b'\n' |
| 124 | |
| 125 | requirement_foo = Requirement() |
| 126 | requirement_foo.value = b'foo' |
| 127 | |
| 128 | requirement_bar = Requirement() |
| 129 | requirement_bar.value = b'bar' |
| 130 | |
| 131 | # This may look redundant, but we need to test both foo.__lt__(bar) and |
| 132 | # bar.__lt__(foo) |
| 133 | assert requirement_foo > top_of_file |
| 134 | assert top_of_file < requirement_foo |
| 135 | assert requirement_foo > requirement_bar |
| 136 | assert requirement_bar < requirement_foo |