@@ -27,6 +27,11 @@ def test_returns_number_from_valid_github_ref(self, number: int) -> None:
27
27
github_ref = f"refs/pull/{ number } /merge"
28
28
assert sut .pr_number_from_github_ref (github_ref ) == number
29
29
30
+ @hypothesis .given (number = st .integers (min_value = 0 , max_value = 10000 ))
31
+ def test_ignores_leading_zeroes (self , number : int ) -> None :
32
+ github_ref = f"refs/pull/0{ number } /merge"
33
+ assert sut .pr_number_from_github_ref (github_ref ) == number
34
+
30
35
@hypothesis .given (invalid_github_ref = st .text ())
31
36
def test_returns_none_on_random_input (self , invalid_github_ref : str ) -> None :
32
37
assert sut .pr_number_from_github_ref (invalid_github_ref ) is None
@@ -35,6 +40,7 @@ def test_returns_none_on_random_input(self, invalid_github_ref: str) -> None:
35
40
"invalid_number" ,
36
41
[
37
42
"" ,
43
+ "-1" ,
38
44
"123a" ,
39
45
"a123" ,
40
46
"12a34" ,
@@ -80,3 +86,77 @@ def test_returns_none_on_invalid_number(self, invalid_number: str) -> None:
80
86
)
81
87
def test_returns_none_on_malformed_ref (self , malformed_ref : str ) -> None :
82
88
assert sut .pr_number_from_github_ref (malformed_ref ) is None
89
+
90
+
91
+ class Test_github_issue_from_pr_body :
92
+ @hypothesis .given (number = st .integers (min_value = 0 , max_value = 10000 ))
93
+ def test_returns_number (self , number : int ) -> None :
94
+ text = f"zzyzx={ number } "
95
+ assert sut .github_issue_from_pr_body (text , "zzyzx" ) == number
96
+
97
+ @hypothesis .given (number = st .integers (min_value = 0 , max_value = 10000 ))
98
+ def test_ignores_leading_zeroes (self , number : int ) -> None :
99
+ text = f"zzyzx=0{ number } "
100
+ assert sut .github_issue_from_pr_body (text , "zzyzx" ) == number
101
+
102
+ @hypothesis .given (number = st .integers (min_value = 0 , max_value = 10000 ))
103
+ def test_ignores_whitespace (self , number : int ) -> None :
104
+ text = f" zzyzx = { number } "
105
+ assert sut .github_issue_from_pr_body (text , "zzyzx" ) == number
106
+
107
+ @hypothesis .given (
108
+ number1 = st .integers (min_value = 0 , max_value = 10000 ),
109
+ number2 = st .integers (min_value = 0 , max_value = 10000 ),
110
+ )
111
+ def test_does_not_ignore_whitespace_in_key (self , number1 : int , number2 : int ) -> None :
112
+ text = f"zzyzx={ number1 } \n z z y z x = { number2 } "
113
+ assert sut .github_issue_from_pr_body (text , "z z y z x" ) == number2
114
+
115
+ @hypothesis .given (
116
+ number1 = st .integers (min_value = 0 , max_value = 10000 ),
117
+ number2 = st .integers (min_value = 0 , max_value = 10000 ),
118
+ )
119
+ def test_returns_first_number_ignoring_second (self , number1 : int , number2 : int ) -> None :
120
+ text = f"zzyzx={ number1 } \n zzyzx={ number2 } "
121
+ assert sut .github_issue_from_pr_body (text , "zzyzx" ) == number1
122
+
123
+ @hypothesis .given (number = st .integers (min_value = 0 , max_value = 10000 ))
124
+ def test_returns_first_valid_number_ignoring_invalid (self , number : int ) -> None :
125
+ text = f"zzyzx=12X34\n zzyzx={ number } "
126
+ assert sut .github_issue_from_pr_body (text , "zzyzx" ) == number
127
+
128
+ @hypothesis .given (number = st .integers (min_value = 0 , max_value = 10000 ))
129
+ def test_returns_number_amidst_other_lines (self , number : int ) -> None :
130
+ text = f"line 1\n line 2\n zzyzx={ number } \n line 3"
131
+ assert sut .github_issue_from_pr_body (text , "zzyzx" ) == number
132
+
133
+ @hypothesis .given (number = st .integers (min_value = 0 , max_value = 10000 ))
134
+ def test_returns_escapes_regex_special_chars_in_key (self , number : int ) -> None :
135
+ text = f"*+={ number } "
136
+ assert sut .github_issue_from_pr_body (text , "*+" ) == number
137
+
138
+ @pytest .mark .parametrize (
139
+ "text" ,
140
+ [
141
+ "" ,
142
+ "asdf" ,
143
+ "zzyzx=" ,
144
+ "=zzyzx" ,
145
+ "zzyzx=a" ,
146
+ "zzyzx=-1" ,
147
+ "zzyzx=a123" ,
148
+ "zzyzx=123a" ,
149
+ "zzyzx=1.2" ,
150
+ "a zzyzx=1234" ,
151
+ "zzyzx=1234 a" ,
152
+ pytest .param (
153
+ "zzyzx=1234" ,
154
+ marks = pytest .mark .xfail (
155
+ reason = "make sure that the test would otherwise pass on valid text" ,
156
+ strict = True ,
157
+ ),
158
+ ),
159
+ ],
160
+ )
161
+ def test_returns_none_when_key_not_found_or_cannot_parse_int (self , text : str ) -> None :
162
+ assert sut .github_issue_from_pr_body (text , "zzyzx" ) is None
0 commit comments