import pytest import re import time import subprocess import requests from pathlib import Path from tests.lib.common_test_utils import ( GiteaAPIClient, mock_build_result, ) # ============================================================================= # TEST CASES # ============================================================================= def test_pr_workflow_succeeded(staging_main_env, mock_build_result): """End-to-end test for a successful PR workflow.""" gitea_env, test_full_repo_name, merge_branch_name = staging_main_env diff = "diff --git a/test.txt b/test.txt\nnew file mode 100644\nindex 0000000..e69de29\n" pr = gitea_env.create_gitea_pr("mypool/pkgA", diff, "Test PR - should succeed", False, base_branch=merge_branch_name) initial_pr_number = pr["number"] compose_dir = Path(__file__).parent.parent forwarded_pr_number = gitea_env.wait_for_project_pr("mypool/pkgA", initial_pr_number) assert ( forwarded_pr_number is not None ), "Workflow bot did not create a project PR." print(f"Found forwarded PR: myproducts/mySLFO #{forwarded_pr_number}") print(f"Polling myproducts/mySLFO PR #{forwarded_pr_number} for reviewer assignment...") reviewer_added = False for _ in range(15): time.sleep(1) pr_details = gitea_env.get_pr_details("myproducts/mySLFO", forwarded_pr_number) if any( r.get("login") == "autogits_obs_staging_bot" for r in pr_details.get("requested_reviewers", []) ): reviewer_added = True break assert reviewer_added, "Staging bot was not added as a reviewer." print("Staging bot has been added as a reviewer.") mock_build_result(package_name="pkgA", code="succeeded") print("Restarting obs-staging-bot...") subprocess.run( ["podman-compose", "restart", "obs-staging-bot"], cwd=compose_dir, check=True, capture_output=True, ) print(f"Polling myproducts/mySLFO PR #{forwarded_pr_number} for final status...") status_comment_found = False for _ in range(20): time.sleep(1) timeline_events = gitea_env.get_timeline_events("myproducts/mySLFO", forwarded_pr_number) for event in timeline_events: print(event.get("body", "not a body")) if event.get("body") and "successful" in event["body"]: status_comment_found = True break if status_comment_found: break assert status_comment_found, "Staging bot did not post a 'successful' comment." def test_pr_workflow_failed(staging_main_env, mock_build_result): """End-to-end test for a failed PR workflow.""" gitea_env, test_full_repo_name, merge_branch_name = staging_main_env diff = "diff --git a/another_test.txt b/another_test.txt\nnew file mode 100644\nindex 0000000..e69de29\n" pr = gitea_env.create_gitea_pr("mypool/pkgA", diff, "Test PR - should fail", False, base_branch=merge_branch_name) initial_pr_number = pr["number"] compose_dir = Path(__file__).parent.parent forwarded_pr_number = gitea_env.wait_for_project_pr("mypool/pkgA", initial_pr_number) assert ( forwarded_pr_number is not None ), "Workflow bot did not create a project PR." print(f"Found forwarded PR: myproducts/mySLFO #{forwarded_pr_number}") print(f"Polling myproducts/mySLFO PR #{forwarded_pr_number} for reviewer assignment...") reviewer_added = False for _ in range(15): time.sleep(1) pr_details = gitea_env.get_pr_details("myproducts/mySLFO", forwarded_pr_number) if any( r.get("login") == "autogits_obs_staging_bot" for r in pr_details.get("requested_reviewers", []) ): reviewer_added = True break assert reviewer_added, "Staging bot was not added as a reviewer." print("Staging bot has been added as a reviewer.") mock_build_result(package_name="pkgA", code="failed") print("Restarting obs-staging-bot...") subprocess.run( ["podman-compose", "restart", "obs-staging-bot"], cwd=compose_dir, check=True, capture_output=True, ) print(f"Polling myproducts/mySLFO PR #{forwarded_pr_number} for final status...") status_comment_found = False for _ in range(20): time.sleep(1) timeline_events = gitea_env.get_timeline_events("myproducts/mySLFO", forwarded_pr_number) for event in timeline_events: if event.get("body") and "failed" in event["body"]: status_comment_found = True break if status_comment_found: break assert status_comment_found, "Staging bot did not post a 'failed' comment."