PyGithub MCP Server

"""Update issue integration tests. This module tests the update_issue operation using the real GitHub API. """ import pytest from datetime import datetime from pygithub_mcp_server.operations.issues import create_issue, get_issue, update_issue from pygithub_mcp_server.schemas.issues import ( CreateIssueParams, GetIssueParams, UpdateIssueParams, ) @pytest.mark.integration def test_update_issue_title(test_owner, test_repo_name, unique_id, with_retry): """Test updating an issue's title.""" # Setup owner = test_owner repo = test_repo_name title = f"Test Issue (Update Title) {unique_id}" # Create issue @with_retry def create_test_issue(): return create_issue(CreateIssueParams( owner=owner, repo=repo, title=title )) issue = create_test_issue() try: # Update issue title updated_title = f"Updated Title {unique_id}" @with_retry def update_test_issue(): return update_issue(UpdateIssueParams( owner=owner, repo=repo, issue_number=issue["issue_number"], title=updated_title )) updated = update_test_issue() # Verify assert updated["title"] == updated_title assert updated["issue_number"] == issue["issue_number"] assert updated["state"] == "open" # State should not change # Verify with get_issue @with_retry def get_test_issue(): return get_issue(GetIssueParams( owner=owner, repo=repo, issue_number=issue["issue_number"] )) fetched = get_test_issue() assert fetched["title"] == updated_title finally: # Cleanup try: @with_retry def close_issue(): return update_issue(UpdateIssueParams( owner=owner, repo=repo, issue_number=issue["issue_number"], state="closed" )) close_issue() except Exception as e: print(f"Failed to close issue during cleanup: {e}") @pytest.mark.integration def test_update_issue_body(test_owner, test_repo_name, unique_id, with_retry): """Test updating an issue's body.""" # Setup owner = test_owner repo = test_repo_name title = f"Test Issue (Update Body) {unique_id}" body = "Initial body" # Create issue @with_retry def create_test_issue(): return create_issue(CreateIssueParams( owner=owner, repo=repo, title=title, body=body )) issue = create_test_issue() try: # Update issue body updated_body = f"Updated body at {datetime.now().isoformat()}" @with_retry def update_test_issue(): return update_issue(UpdateIssueParams( owner=owner, repo=repo, issue_number=issue["issue_number"], body=updated_body )) updated = update_test_issue() # Verify assert updated["body"] == updated_body assert updated["title"] == title # Title should not change assert updated["issue_number"] == issue["issue_number"] # Verify with get_issue @with_retry def get_test_issue(): return get_issue(GetIssueParams( owner=owner, repo=repo, issue_number=issue["issue_number"] )) fetched = get_test_issue() assert fetched["body"] == updated_body finally: # Cleanup try: @with_retry def close_issue(): return update_issue(UpdateIssueParams( owner=owner, repo=repo, issue_number=issue["issue_number"], state="closed" )) close_issue() except Exception as e: print(f"Failed to close issue during cleanup: {e}") @pytest.mark.integration def test_update_issue_state(test_owner, test_repo_name, unique_id, with_retry): """Test updating an issue's state (open/closed).""" # Setup owner = test_owner repo = test_repo_name title = f"Test Issue (Update State) {unique_id}" # Create issue @with_retry def create_test_issue(): return create_issue(CreateIssueParams( owner=owner, repo=repo, title=title )) issue = create_test_issue() assert issue["state"] == "open" try: # Close the issue @with_retry def close_test_issue(): return update_issue(UpdateIssueParams( owner=owner, repo=repo, issue_number=issue["issue_number"], state="closed" )) closed = close_test_issue() # Verify assert closed["state"] == "closed" assert closed["title"] == title # Title should not change # Verify with get_issue @with_retry def get_closed_issue(): return get_issue(GetIssueParams( owner=owner, repo=repo, issue_number=issue["issue_number"] )) fetched_closed = get_closed_issue() assert fetched_closed["state"] == "closed" # Reopen the issue @with_retry def reopen_test_issue(): return update_issue(UpdateIssueParams( owner=owner, repo=repo, issue_number=issue["issue_number"], state="open" )) reopened = reopen_test_issue() # Verify assert reopened["state"] == "open" # Verify with get_issue @with_retry def get_reopened_issue(): return get_issue(GetIssueParams( owner=owner, repo=repo, issue_number=issue["issue_number"] )) fetched_reopened = get_reopened_issue() assert fetched_reopened["state"] == "open" finally: # Cleanup try: @with_retry def ensure_closed(): return update_issue(UpdateIssueParams( owner=owner, repo=repo, issue_number=issue["issue_number"], state="closed" )) ensure_closed() except Exception as e: print(f"Failed to close issue during cleanup: {e}") @pytest.mark.integration def test_update_issue_labels(test_owner, test_repo_name, unique_id, with_retry): """Test updating an issue's labels.""" # Setup owner = test_owner repo = test_repo_name title = f"Test Issue (Update Labels) {unique_id}" # Create issue @with_retry def create_test_issue(): return create_issue(CreateIssueParams( owner=owner, repo=repo, title=title )) issue = create_test_issue() try: # Update issue labels @with_retry def update_test_issue_labels(): return update_issue(UpdateIssueParams( owner=owner, repo=repo, issue_number=issue["issue_number"], labels=["test-label", "bug"] )) updated = update_test_issue_labels() # Verify assert len(updated["labels"]) == 2 label_names = [label["name"] for label in updated["labels"]] assert "test-label" in label_names assert "bug" in label_names # Update with different labels (should replace, not add) @with_retry def update_test_issue_labels_again(): return update_issue(UpdateIssueParams( owner=owner, repo=repo, issue_number=issue["issue_number"], labels=["enhancement"] )) updated_again = update_test_issue_labels_again() # Verify assert len(updated_again["labels"]) == 1 assert updated_again["labels"][0]["name"] == "enhancement" finally: # Cleanup try: @with_retry def close_issue(): return update_issue(UpdateIssueParams( owner=owner, repo=repo, issue_number=issue["issue_number"], state="closed" )) close_issue() except Exception as e: print(f"Failed to close issue during cleanup: {e}") @pytest.mark.integration def test_update_issue_multiple_fields(test_owner, test_repo_name, unique_id, with_retry): """Test updating multiple issue fields at once.""" # Setup owner = test_owner repo = test_repo_name title = f"Test Issue (Update Multiple) {unique_id}" # Create issue @with_retry def create_test_issue(): return create_issue(CreateIssueParams( owner=owner, repo=repo, title=title )) issue = create_test_issue() try: # Update multiple fields updated_title = f"Updated Title {unique_id}" updated_body = f"Updated body at {datetime.now().isoformat()}" @with_retry def update_test_issue_multiple(): return update_issue(UpdateIssueParams( owner=owner, repo=repo, issue_number=issue["issue_number"], title=updated_title, body=updated_body, labels=["test-label"], assignees=[owner] # Assign to the repo owner )) updated = update_test_issue_multiple() # Verify assert updated["title"] == updated_title assert updated["body"] == updated_body assert any(label["name"] == "test-label" for label in updated["labels"]) assert any(assignee["login"] == owner for assignee in updated["assignees"]) finally: # Cleanup try: @with_retry def close_issue(): return update_issue(UpdateIssueParams( owner=owner, repo=repo, issue_number=issue["issue_number"], state="closed" )) close_issue() except Exception as e: print(f"Failed to close issue during cleanup: {e}") @pytest.mark.integration def test_update_issue_no_changes(test_owner, test_repo_name, unique_id, with_retry): """Test update_issue with no changes.""" # Setup owner = test_owner repo = test_repo_name title = f"Test Issue (No Changes) {unique_id}" # Create issue @with_retry def create_test_issue(): return create_issue(CreateIssueParams( owner=owner, repo=repo, title=title )) issue = create_test_issue() try: # Update with no changes @with_retry def update_test_issue_no_changes(): return update_issue(UpdateIssueParams( owner=owner, repo=repo, issue_number=issue["issue_number"] )) updated = update_test_issue_no_changes() # Verify assert updated["title"] == title assert updated["issue_number"] == issue["issue_number"] assert updated["state"] == "open" finally: # Cleanup try: @with_retry def close_issue(): return update_issue(UpdateIssueParams( owner=owner, repo=repo, issue_number=issue["issue_number"], state="closed" )) close_issue() except Exception as e: print(f"Failed to close issue during cleanup: {e}")