@@ -27,6 +27,11 @@ def test_returns_number_from_valid_github_ref(self, number: int) -> None:
2727 github_ref = f"refs/pull/{ number } /merge"
2828 assert sut .pr_number_from_github_ref (github_ref ) == number
2929
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+
3035 @hypothesis .given (invalid_github_ref = st .text ())
3136 def test_returns_none_on_random_input (self , invalid_github_ref : str ) -> None :
3237 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:
3540 "invalid_number" ,
3641 [
3742 "" ,
43+ "-1" ,
3844 "123a" ,
3945 "a123" ,
4046 "12a34" ,
@@ -80,3 +86,77 @@ def test_returns_none_on_invalid_number(self, invalid_number: str) -> None:
8086 )
8187 def test_returns_none_on_malformed_ref (self , malformed_ref : str ) -> None :
8288 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