@@ -171,6 +171,84 @@ def test_reports_post_tokenless(client, db, mocker, private, branch, branch_sent
171171 assert response .json ().get ("detail" ) == "Not valid tokenless upload"
172172
173173
174+ @pytest .mark .parametrize ("private" , [False , True ])
175+ @pytest .mark .parametrize ("branch" , ["main" , "fork:branch" , "someone/fork:branch" ])
176+ @pytest .mark .parametrize (
177+ "branch_sent" ,
178+ [
179+ None ,
180+ "branch" ,
181+ "fork:branch" ,
182+ "someone/fork:branch" ,
183+ ],
184+ )
185+ @pytest .mark .parametrize ("upload_token_required_for_public_repos" , [True , False ])
186+ def test_reports_post_upload_token_required_auth_check (
187+ client ,
188+ db ,
189+ mocker ,
190+ private ,
191+ branch ,
192+ branch_sent ,
193+ upload_token_required_for_public_repos ,
194+ ):
195+ mocked_call = mocker .patch .object (TaskService , "preprocess_upload" )
196+ repository = RepositoryFactory (
197+ name = "the_repo" ,
198+ author__username = "codecov" ,
199+ author__service = "github" ,
200+ private = private ,
201+ author__upload_token_required_for_public_repos = upload_token_required_for_public_repos ,
202+ )
203+ commit = CommitFactory (repository = repository )
204+ commit .branch = branch
205+ repository .save ()
206+ commit .save ()
207+
208+ client = APIClient ()
209+ url = reverse (
210+ "new_upload.reports" ,
211+ args = ["github" , "codecov::::the_repo" , commit .commitid ],
212+ )
213+
214+ data = {"code" : "code1" }
215+ if branch_sent :
216+ data ["branch" ] = branch_sent
217+ response = client .post (
218+ url ,
219+ data = data ,
220+ headers = {},
221+ )
222+
223+ assert (
224+ url == f"/upload/github/codecov::::the_repo/commits/{ commit .commitid } /reports"
225+ )
226+
227+ # when TokenlessAuthentication is removed, this test should use `if private == False and upload_token_required_for_public_repos == False:`
228+ # but TokenlessAuthentication lets some additional uploads through.
229+ authorized_by_tokenless_auth_class = ":" in branch
230+
231+ if private == False and (
232+ upload_token_required_for_public_repos == False
233+ or authorized_by_tokenless_auth_class
234+ ):
235+ assert response .status_code == 201
236+ assert CommitReport .objects .filter (
237+ commit_id = commit .id ,
238+ code = "code1" ,
239+ report_type = CommitReport .ReportType .COVERAGE ,
240+ ).exists ()
241+ mocked_call .assert_called_with (repository .repoid , commit .commitid , "code1" )
242+ else :
243+ assert response .status_code == 401
244+ assert not CommitReport .objects .filter (
245+ commit_id = commit .id ,
246+ code = "code1" ,
247+ report_type = CommitReport .ReportType .COVERAGE ,
248+ ).exists ()
249+ assert response .json ().get ("detail" ) == "Not valid tokenless upload"
250+
251+
174252def test_create_report_already_exists (client , db , mocker ):
175253 mocked_call = mocker .patch .object (TaskService , "preprocess_upload" )
176254 repository = RepositoryFactory (
@@ -316,6 +394,82 @@ def test_reports_results_post_successful_github_oidc_auth(
316394 )
317395
318396
397+ @pytest .mark .parametrize ("private" , [False , True ])
398+ @pytest .mark .parametrize ("branch" , ["main" , "fork:branch" , "someone/fork:branch" ])
399+ @pytest .mark .parametrize (
400+ "branch_sent" ,
401+ [
402+ None ,
403+ "branch" ,
404+ "fork:branch" ,
405+ "someone/fork:branch" ,
406+ ],
407+ )
408+ @pytest .mark .parametrize ("upload_token_required_for_public_repos" , [True , False ])
409+ def test_reports_results_post_upload_token_required_auth_check (
410+ client ,
411+ db ,
412+ mocker ,
413+ private ,
414+ branch ,
415+ branch_sent ,
416+ upload_token_required_for_public_repos ,
417+ ):
418+ mocked_task = mocker .patch ("services.task.TaskService.create_report_results" )
419+ repository = RepositoryFactory (
420+ name = "the_repo" ,
421+ author__username = "codecov" ,
422+ author__service = "github" ,
423+ private = private ,
424+ author__upload_token_required_for_public_repos = upload_token_required_for_public_repos ,
425+ )
426+ commit = CommitFactory (repository = repository )
427+ commit_report = CommitReport .objects .create (commit = commit , code = "code" )
428+ commit .branch = branch
429+ repository .save ()
430+ commit .save ()
431+
432+ client = APIClient ()
433+ url = reverse (
434+ "new_upload.reports_results" ,
435+ args = ["github" , "codecov::::the_repo" , commit .commitid , "code" ],
436+ )
437+
438+ data = {"code" : "code1" }
439+ if branch_sent :
440+ data ["branch" ] = branch_sent
441+ response = client .post (
442+ url ,
443+ data = data ,
444+ headers = {},
445+ )
446+
447+ assert (
448+ url
449+ == f"/upload/github/codecov::::the_repo/commits/{ commit .commitid } /reports/code/results"
450+ )
451+
452+ # when TokenlessAuthentication is removed, this test should use `if private == False and upload_token_required_for_public_repos == False:`
453+ # but TokenlessAuthentication lets some additional uploads through.
454+ authorized_by_tokenless_auth_class = ":" in branch
455+
456+ if private == False and (
457+ upload_token_required_for_public_repos == False
458+ or authorized_by_tokenless_auth_class
459+ ):
460+ assert response .status_code == 201
461+ assert ReportResults .objects .filter (
462+ report_id = commit_report .id ,
463+ ).exists ()
464+ mocked_task .assert_called_once ()
465+ else :
466+ assert response .status_code == 401
467+ assert not ReportResults .objects .filter (
468+ report_id = commit_report .id ,
469+ ).exists ()
470+ assert response .json ().get ("detail" ) == "Not valid tokenless upload"
471+
472+
319473def test_reports_results_already_exists_post_successful (client , db , mocker ):
320474 mocked_task = mocker .patch ("services.task.TaskService.create_report_results" )
321475 mocker .patch .object (
0 commit comments