import pytest import re import time import subprocess import requests from pathlib import Path from tests.lib.common_test_utils import ( GiteaAPIClient, ) # ============================================================================= # TEST CASES # ============================================================================= pytest.pr = None pytest.pr_details = None pytest.initial_pr_number = None pytest.forwarded_pr_number = None @pytest.mark.dependency() def test_001_project_pr(gitea_env): """Forwarded PR correct title""" diff = "diff --git a/another_test.txt b/another_test.txt\nnew file mode 100644\nindex 0000000..e69de29\n" pytest.pr = gitea_env.create_gitea_pr("pool/pkgA", diff, "Test PR") pytest.initial_pr_number = pytest.pr["number"] time.sleep(5) # Give Gitea some time to process the PR and make the timeline available compose_dir = Path(__file__).parent.parent pytest.forwarded_pr_number = None print( f"Polling pool/pkgA PR #{pytest.initial_pr_number} timeline for forwarded PR event..." ) # Instead of polling timeline, check if forwarded PR exists directly for _ in range(20): time.sleep(1) timeline_events = gitea_env.get_timeline_events("pool/pkgA", pytest.initial_pr_number) for event in timeline_events: if event.get("type") == "pull_ref": if not (ref_issue := event.get("ref_issue")): continue url_to_check = ref_issue.get("html_url", "") match = re.search(r"products/SLFO/pulls/(\d+)", url_to_check) if match: pytest.forwarded_pr_number = match.group(1) break if pytest.forwarded_pr_number: break assert ( pytest.forwarded_pr_number is not None ), "Workflow bot did not create a forwarded PR." pytest.pr_details = gitea_env.get_pr_details("products/SLFO", pytest.forwarded_pr_number) assert ( pytest.pr_details["title"] == "Forwarded PRs: pkgA" ), "Forwarded PR correct title" @pytest.mark.dependency(depends=["test_001_project_pr"]) def test_002_updated_project_pr(gitea_env): """Forwarded PR head is updated""" diff = "diff --git a/another_test.txt b/another_test.txt\nnew file mode 100444\nindex 0000000..e69de21\n" gitea_env.modify_gitea_pr("pool/pkgA", pytest.initial_pr_number, diff, "Tweaks") sha_old = pytest.pr_details["head"]["sha"] sha_changed = False for _ in range(20): time.sleep(1) new_pr_details = gitea_env.get_pr_details("products/SLFO", pytest.forwarded_pr_number) sha_new = new_pr_details["head"]["sha"] if sha_new != sha_old: print(f"Sha changed from {sha_old} to {sha_new}") sha_changed = True break assert sha_changed, "Forwarded PR has sha updated" @pytest.mark.dependency(depends=["test_001_project_pr"]) def test_003_wip(gitea_env): """WIP flag set for PR""" # 1. set WIP flag in PR f"pool/pkgA#{pytest.initial_pr_number}" initial_pr_details = gitea_env.get_pr_details("pool/pkgA", pytest.initial_pr_number) wip_title = "WIP: " + initial_pr_details["title"] gitea_env.update_gitea_pr_properties("pool/pkgA", pytest.initial_pr_number, title=wip_title) # 2. in loop check whether WIP flag is set for PR f"products/SLFO #{pytest.forwarded_pr_number}" wip_flag_set = False for _ in range(20): time.sleep(1) forwarded_pr_details = gitea_env.get_pr_details( "products/SLFO", pytest.forwarded_pr_number ) if "WIP: " in forwarded_pr_details["title"]: wip_flag_set = True break assert wip_flag_set, "WIP flag was not set in the forwarded PR." # Remove WIP flag from PR f"pool/pkgA#{pytest.initial_pr_number}" initial_pr_details = gitea_env.get_pr_details("pool/pkgA", pytest.initial_pr_number) non_wip_title = initial_pr_details["title"].replace("WIP: ", "") gitea_env.update_gitea_pr_properties( "pool/pkgA", pytest.initial_pr_number, title=non_wip_title ) # In loop check whether WIP flag is removed for PR f"products/SLFO #{pytest.forwarded_pr_number}" wip_flag_removed = False for _ in range(20): time.sleep(1) forwarded_pr_details = gitea_env.get_pr_details( "products/SLFO", pytest.forwarded_pr_number ) if "WIP: " not in forwarded_pr_details["title"]: wip_flag_removed = True break assert wip_flag_removed, "WIP flag was not removed from the forwarded PR."