diff --git a/tests/test_pr_review_merge_scheduler.py b/tests/test_pr_review_merge_scheduler.py index 3087b88..f83db9e 100644 --- a/tests/test_pr_review_merge_scheduler.py +++ b/tests/test_pr_review_merge_scheduler.py @@ -1,10 +1,16 @@ +import runpy +from pathlib import Path +from unittest.mock import MagicMock, patch + +import pytest + +from scripts.ci import pr_review_merge_scheduler from scripts.ci.pr_review_merge_scheduler import opencode_in_progress + def test_empty_pr_context(): - # Empty PR dict assert opencode_in_progress({}) is False - # PR with no context nodes pr = { "statusCheckRollup": { "contexts": { @@ -14,8 +20,8 @@ def test_empty_pr_context(): } assert opencode_in_progress(pr) is False + def test_no_opencode_context(): - # PR with irrelevant context nodes pr = { "statusCheckRollup": { "contexts": { @@ -28,6 +34,7 @@ def test_no_opencode_context(): } assert opencode_in_progress(pr) is False + def test_opencode_completed_status(): pr = { "statusCheckRollup": { @@ -43,6 +50,7 @@ def test_opencode_completed_status(): } assert opencode_in_progress(pr) is False + def test_opencode_in_progress_status(): pr1 = { "statusCheckRollup": { @@ -77,6 +85,7 @@ def test_opencode_in_progress_status(): } assert opencode_in_progress(pr3) is False + def test_opencode_workflow_name_in_progress(): pr = { "statusCheckRollup": { @@ -100,6 +109,7 @@ def test_opencode_workflow_name_in_progress(): } assert opencode_in_progress(pr) is True + def test_multiple_contexts_one_in_progress(): pr = { "statusCheckRollup": { @@ -113,3 +123,139 @@ def test_multiple_contexts_one_in_progress(): } } assert opencode_in_progress(pr) is True + + +def test_split_repo_success(): + assert pr_review_merge_scheduler.split_repo("owner/repo") == ("owner", "repo") + + +def test_split_repo_success_multiple_slashes(): + assert pr_review_merge_scheduler.split_repo("owner/repo/extra") == ("owner", "repo/extra") + + +def test_split_repo_invalid(): + with pytest.raises(ValueError, match="repo must be owner/name, got 'invalid'"): + pr_review_merge_scheduler.split_repo("invalid") + + +def test_split_repo_empty_owner(): + with pytest.raises(ValueError, match="repo must be owner/name, got '/repo'"): + pr_review_merge_scheduler.split_repo("/repo") + + +def test_split_repo_empty_repo(): + with pytest.raises(ValueError, match="repo must be owner/name, got 'owner/'"): + pr_review_merge_scheduler.split_repo("owner/") + + +def test_split_repo_wraps_split_value_error(): + repo = MagicMock() + repo.split.side_effect = ValueError("mocked split error") + + with pytest.raises(ValueError, match=r"repo must be owner/name, got