Skip to main content
Glama
test_data_structures.py9.25 kB
"""Tests for data structures and edge cases.""" class TestDataStructures: """Test data structure handling and edge cases.""" def test_thread_data_structure(self): """Test review thread data structure.""" # This represents the expected structure from GitHub GraphQL API thread = { "id": "PRRT_kwDOABC123", "isResolved": False, "path": "src/main.py", "line": 42, "startLine": 40, "diffSide": "RIGHT", "comments": { "nodes": [ { "id": "PRRC_kwDOABC456", "author": {"login": "reviewer1"}, "body": "Please add type hints", "createdAt": "2025-12-10T12:00:00Z", }, { "id": "PRRC_kwDOABC789", "author": {"login": "contributor"}, "body": "Will do!", "createdAt": "2025-12-10T12:30:00Z", }, ] }, } # Validate structure assert "id" in thread assert "isResolved" in thread assert isinstance(thread["isResolved"], bool) assert "path" in thread assert "comments" in thread assert "nodes" in thread["comments"] assert len(thread["comments"]["nodes"]) == 2 # Validate comment structure comment = thread["comments"]["nodes"][0] assert "id" in comment assert "author" in comment assert "login" in comment["author"] assert "body" in comment assert "createdAt" in comment def test_thread_without_comments(self): """Test thread with no comments (edge case).""" thread = { "id": "PRRT_123", "isResolved": False, "path": "test.py", "line": 10, "startLine": None, "diffSide": "RIGHT", "comments": {"nodes": []}, } # Should be able to handle empty comments comments = thread.get("comments", {}).get("nodes", []) assert comments == [] # First comment should be empty dict when no comments exist first_comment = comments[0] if comments else {} assert first_comment == {} def test_thread_multiline_comment(self): """Test thread with multi-line comment range.""" thread = { "id": "PRRT_123", "isResolved": False, "path": "src/complex.py", "line": 100, "startLine": 95, # Multi-line comment from line 95 to 100 "diffSide": "RIGHT", "comments": { "nodes": [ { "id": "PRRC_1", "author": {"login": "reviewer"}, "body": "This entire block needs refactoring", "createdAt": "2025-12-10T10:00:00Z", } ] }, } # Validate multi-line range assert thread["line"] == 100 assert thread["startLine"] == 95 assert thread["line"] > thread["startLine"] def test_resolved_thread(self): """Test resolved thread structure.""" thread = { "id": "PRRT_123", "isResolved": True, "path": "src/fixed.py", "line": 50, "startLine": None, "diffSide": "RIGHT", "comments": { "nodes": [ { "id": "PRRC_1", "author": {"login": "reviewer"}, "body": "Fix this bug", "createdAt": "2025-12-09T10:00:00Z", }, { "id": "PRRC_2", "author": {"login": "contributor"}, "body": "Fixed!", "createdAt": "2025-12-10T09:00:00Z", }, ] }, } assert thread["isResolved"] is True assert len(thread["comments"]["nodes"]) == 2 def test_comment_with_markdown(self): """Test comment body with Markdown.""" comment = { "id": "PRRC_1", "author": {"login": "reviewer"}, "body": "Please fix:\n\n```python\ndef foo():\n pass\n```\n\nThanks!", "createdAt": "2025-12-10T10:00:00Z", } # Should preserve Markdown formatting assert "```python" in comment["body"] assert "\n" in comment["body"] def test_left_side_comment(self): """Test comment on the LEFT side of diff (old file).""" thread = { "id": "PRRT_123", "isResolved": False, "path": "src/old.py", "line": 30, "startLine": None, "diffSide": "LEFT", # Comment on old version "comments": { "nodes": [ { "id": "PRRC_1", "author": {"login": "reviewer"}, "body": "Why was this removed?", "createdAt": "2025-12-10T11:00:00Z", } ] }, } assert thread["diffSide"] == "LEFT" def test_pr_id_structure(self): """Test pull request ID format.""" # PR IDs typically start with PR_ or other prefixes pr_id = "PR_kwDOABCDEF" assert isinstance(pr_id, str) assert len(pr_id) > 0 def test_thread_id_structure(self): """Test review thread ID format.""" # Thread IDs typically start with PRRT_ thread_id = "PRRT_kwDOABCDEF" assert isinstance(thread_id, str) assert len(thread_id) > 0 # Note: Actual format may vary, but it should be a non-empty string def test_comment_id_structure(self): """Test comment ID format.""" # Comment IDs typically start with PRRC_ comment_id = "PRRC_kwDOABCDEF" assert isinstance(comment_id, str) assert len(comment_id) > 0 def test_datetime_format(self): """Test datetime string format from GitHub.""" # GitHub returns ISO 8601 format created_at = "2025-12-10T12:34:56Z" assert "T" in created_at assert created_at.endswith("Z") # Basic validation that it looks like a timestamp parts = created_at.split("T") assert len(parts) == 2 assert len(parts[0]) == 10 # YYYY-MM-DD def test_api_response_with_null_values(self): """Test handling of null values in API response.""" thread = { "id": "PRRT_123", "isResolved": False, "path": "test.py", "line": 10, "startLine": None, # Can be null for single-line comments "diffSide": "RIGHT", "comments": { "nodes": [ { "id": "PRRC_1", "author": {"login": "reviewer"}, "body": "Comment", "createdAt": "2025-12-10T10:00:00Z", } ] }, } # Should handle None values gracefully assert thread["startLine"] is None def test_deleted_file_comment(self): """Test comment on a deleted file.""" thread = { "id": "PRRT_123", "isResolved": False, "path": "deleted_file.py", "line": 10, "startLine": None, "diffSide": "LEFT", # Comment on deleted content "comments": { "nodes": [ { "id": "PRRC_1", "author": {"login": "reviewer"}, "body": "Was this needed?", "createdAt": "2025-12-10T10:00:00Z", } ] }, } # Should be able to reference deleted files assert thread["path"] == "deleted_file.py" assert thread["diffSide"] == "LEFT" def test_outdated_comment(self): """Test outdated comment (after code changes).""" # Note: The API structure doesn't explicitly mark outdated comments # but they're still valid threads that can be resolved thread = { "id": "PRRT_123", "isResolved": False, # Can still be unresolved even if outdated "path": "src/changed.py", "line": 50, "startLine": None, "diffSide": "RIGHT", "comments": { "nodes": [ { "id": "PRRC_1", "author": {"login": "reviewer"}, "body": "This needs fixing", "createdAt": "2025-12-09T10:00:00Z", } ] }, } # Outdated comments are still valid review threads assert "id" in thread assert "isResolved" in thread

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/UtakataKyosui/PR-Review-Resolve-MCP'

If you have feedback or need assistance with the MCP directory API, please join our Discord server