@@ -140,3 +140,99 @@ def mock_init(self, verbose=False, base=None, repos=None):
140140
141141 # Outputs should be identical (deterministic)
142142 assert output1 .getvalue () == output2 .getvalue ()
143+
144+ def test_main_exit_code_zero_for_already_broken_only (self , monkeypatch , mock_dnf_base , capsys ):
145+ """Test that main() exits with 0 when only already-broken packages are found."""
146+ monkeypatch .setattr ('sys.argv' , ['fedora-revdep-check' , 'pytest' , '8.0.0' ])
147+
148+ original_init = FedoraRevDepChecker .__init__
149+
150+ def mock_init (self , verbose = False , base = None , repos = None ):
151+ original_init (self , verbose = verbose , base = mock_dnf_base if base is None else base , repos = repos )
152+
153+ # Mock simulate_version_change to return only already-broken conflicts
154+ original_simulate = FedoraRevDepChecker .simulate_version_change
155+
156+ def mock_simulate (self , srpm_name , new_version ):
157+ return {
158+ 'srpm_name' : srpm_name ,
159+ 'new_version' : new_version ,
160+ 'binary_packages' : ['python3-pytest-7.0.0-1.fc40' ],
161+ 'conflicts' : [
162+ {
163+ 'rdep_package' : 'oldpkg-1.0.0-1.fc40' ,
164+ 'rdep_source' : 'oldpkg' ,
165+ 'rdep_arch' : 'src' ,
166+ 'requirement' : 'python3dist(pytest) < 5.0' ,
167+ 'provide_name' : 'python3dist(pytest)' ,
168+ 'new_version' : new_version ,
169+ 'failed_constraint' : 'python3dist(pytest) < 5.0' ,
170+ 'already_broken' : True
171+ }
172+ ]
173+ }
174+
175+ monkeypatch .setattr (FedoraRevDepChecker , '__init__' , mock_init )
176+ monkeypatch .setattr (FedoraRevDepChecker , 'simulate_version_change' , mock_simulate )
177+
178+ # main() should exit with 0 (no NEW conflicts)
179+ main ()
180+
181+ # Check output contains already-broken message
182+ captured = capsys .readouterr ()
183+ assert 'already FTBFS (not a new problem)' in captured .out
184+
185+ def test_main_exit_code_one_for_mixed_conflicts (self , monkeypatch , mock_dnf_base , capsys ):
186+ """Test that main() exits with 1 when there are new conflicts mixed with already-broken."""
187+ monkeypatch .setattr ('sys.argv' , ['fedora-revdep-check' , 'pytest' , '8.0.0' ])
188+
189+ original_init = FedoraRevDepChecker .__init__
190+
191+ def mock_init (self , verbose = False , base = None , repos = None ):
192+ original_init (self , verbose = verbose , base = mock_dnf_base if base is None else base , repos = repos )
193+
194+ # Mock simulate_version_change to return mixed conflicts
195+ def mock_simulate (self , srpm_name , new_version ):
196+ return {
197+ 'srpm_name' : srpm_name ,
198+ 'new_version' : new_version ,
199+ 'binary_packages' : ['python3-pytest-7.0.0-1.fc40' ],
200+ 'conflicts' : [
201+ # New conflict
202+ {
203+ 'rdep_package' : 'newpkg-1.0.0-1.fc40' ,
204+ 'rdep_source' : 'newpkg' ,
205+ 'rdep_arch' : 'src' ,
206+ 'requirement' : 'python3dist(pytest) < 8.0' ,
207+ 'provide_name' : 'python3dist(pytest)' ,
208+ 'new_version' : new_version ,
209+ 'failed_constraint' : 'python3dist(pytest) < 8.0' ,
210+ 'already_broken' : False
211+ },
212+ # Already broken
213+ {
214+ 'rdep_package' : 'oldpkg-1.0.0-1.fc40' ,
215+ 'rdep_source' : 'oldpkg' ,
216+ 'rdep_arch' : 'src' ,
217+ 'requirement' : 'python3dist(pytest) < 5.0' ,
218+ 'provide_name' : 'python3dist(pytest)' ,
219+ 'new_version' : new_version ,
220+ 'failed_constraint' : 'python3dist(pytest) < 5.0' ,
221+ 'already_broken' : True
222+ }
223+ ]
224+ }
225+
226+ monkeypatch .setattr (FedoraRevDepChecker , '__init__' , mock_init )
227+ monkeypatch .setattr (FedoraRevDepChecker , 'simulate_version_change' , mock_simulate )
228+
229+ # main() should exit with 1 (NEW conflicts found)
230+ with pytest .raises (SystemExit ) as exc_info :
231+ main ()
232+
233+ assert exc_info .value .code == 1
234+
235+ # Check output contains both sections
236+ captured = capsys .readouterr ()
237+ assert 'These packages would FTBFS:' in captured .out
238+ assert 'already FTBFS (not a new problem)' in captured .out
0 commit comments