Skip to content

Commit 0b2432a

Browse files
committed
test- inmproved test coverage of github internal nodes more than 80% updated
1 parent e137c07 commit 0b2432a

File tree

7 files changed

+626
-47
lines changed

7 files changed

+626
-47
lines changed

backend/tests/apps/github/api/internal/nodes/issue_test.py

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
"""Test cases for IssueNode."""
22

3+
from unittest.mock import Mock
4+
35
from apps.github.api.internal.nodes.issue import IssueNode
46

57

@@ -21,3 +23,60 @@ def test_issue_node_fields(self):
2123
"repository_name",
2224
}
2325
assert field_names == expected_field_names
26+
27+
def test_author_field(self):
28+
"""Test author field resolution."""
29+
mock_issue = Mock()
30+
mock_author = Mock()
31+
mock_issue.author = mock_author
32+
33+
result = IssueNode.author(mock_issue)
34+
assert result == mock_author
35+
36+
def test_organization_name_with_organization(self):
37+
"""Test organization_name field when organization exists."""
38+
mock_issue = Mock()
39+
mock_repository = Mock()
40+
mock_organization = Mock()
41+
mock_organization.login = "test-org"
42+
mock_repository.organization = mock_organization
43+
mock_issue.repository = mock_repository
44+
45+
result = IssueNode.organization_name(mock_issue)
46+
assert result == "test-org"
47+
48+
def test_organization_name_without_organization(self):
49+
"""Test organization_name field when organization doesn't exist."""
50+
mock_issue = Mock()
51+
mock_repository = Mock()
52+
mock_repository.organization = None
53+
mock_issue.repository = mock_repository
54+
55+
result = IssueNode.organization_name(mock_issue)
56+
assert result is None
57+
58+
def test_organization_name_without_repository(self):
59+
"""Test organization_name field when repository doesn't exist."""
60+
mock_issue = Mock()
61+
mock_issue.repository = None
62+
63+
result = IssueNode.organization_name(mock_issue)
64+
assert result is None
65+
66+
def test_repository_name_with_repository(self):
67+
"""Test repository_name field when repository exists."""
68+
mock_issue = Mock()
69+
mock_repository = Mock()
70+
mock_repository.name = "test-repo"
71+
mock_issue.repository = mock_repository
72+
73+
result = IssueNode.repository_name(mock_issue)
74+
assert result == "test-repo"
75+
76+
def test_repository_name_without_repository(self):
77+
"""Test repository_name field when repository doesn't exist."""
78+
mock_issue = Mock()
79+
mock_issue.repository = None
80+
81+
result = IssueNode.repository_name(mock_issue)
82+
assert result is None

backend/tests/apps/github/api/internal/nodes/milestone_test.py

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
"""Test cases for MilestoneNode."""
22

3+
from unittest.mock import Mock
4+
5+
import pytest
6+
37
from apps.github.api.internal.nodes.milestone import MilestoneNode
48

59

@@ -25,3 +29,78 @@ def test_milestone_node_fields(self):
2529
"url",
2630
}
2731
assert field_names == expected_field_names
32+
33+
def test_author_field(self):
34+
"""Test author field resolution."""
35+
mock_milestone = Mock()
36+
mock_author = Mock()
37+
mock_milestone.author = mock_author
38+
39+
result = MilestoneNode.author(mock_milestone)
40+
assert result == mock_author
41+
42+
def test_organization_name_with_organization(self):
43+
"""Test organization_name field when organization exists."""
44+
mock_milestone = Mock()
45+
mock_repository = Mock()
46+
mock_organization = Mock()
47+
mock_organization.login = "test-org"
48+
mock_repository.organization = mock_organization
49+
mock_milestone.repository = mock_repository
50+
51+
result = MilestoneNode.organization_name(mock_milestone)
52+
assert result == "test-org"
53+
54+
def test_organization_name_without_organization(self):
55+
"""Test organization_name field when organization doesn't exist."""
56+
mock_milestone = Mock()
57+
mock_repository = Mock()
58+
mock_repository.organization = None
59+
mock_milestone.repository = mock_repository
60+
61+
result = MilestoneNode.organization_name(mock_milestone)
62+
assert result is None
63+
64+
def test_organization_name_without_repository(self):
65+
"""Test organization_name field when repository doesn't exist."""
66+
mock_milestone = Mock()
67+
mock_milestone.repository = None
68+
69+
result = MilestoneNode.organization_name(mock_milestone)
70+
assert result is None
71+
72+
def test_progress_with_issues(self):
73+
"""Test progress calculation with issues."""
74+
mock_milestone = Mock()
75+
mock_milestone.closed_issues_count = 7
76+
mock_milestone.open_issues_count = 3
77+
78+
result = MilestoneNode.progress(mock_milestone)
79+
assert result == pytest.approx(70.0)
80+
81+
def test_progress_without_issues(self):
82+
"""Test progress calculation without issues."""
83+
mock_milestone = Mock()
84+
mock_milestone.closed_issues_count = 0
85+
mock_milestone.open_issues_count = 0
86+
87+
result = MilestoneNode.progress(mock_milestone)
88+
assert result == pytest.approx(0.0)
89+
90+
def test_repository_name_with_repository(self):
91+
"""Test repository_name field when repository exists."""
92+
mock_milestone = Mock()
93+
mock_repository = Mock()
94+
mock_repository.name = "test-repo"
95+
mock_milestone.repository = mock_repository
96+
97+
result = MilestoneNode.repository_name(mock_milestone)
98+
assert result == "test-repo"
99+
100+
def test_repository_name_without_repository(self):
101+
"""Test repository_name field when repository doesn't exist."""
102+
mock_milestone = Mock()
103+
mock_milestone.repository = None
104+
105+
result = MilestoneNode.repository_name(mock_milestone)
106+
assert result is None

backend/tests/apps/github/api/internal/nodes/organization_test.py

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
"""Test cases for OrganizationNode."""
22

3+
from unittest.mock import Mock, patch
4+
35
from apps.github.api.internal.nodes.organization import (
46
OrganizationNode,
57
OrganizationStatsNode,
@@ -44,6 +46,82 @@ def test_resolve_url(self):
4446
assert url_field is not None
4547
assert url_field.type is str
4648

49+
@patch("apps.github.models.repository.Repository.objects")
50+
@patch("apps.github.models.repository_contributor.RepositoryContributor.objects")
51+
def test_stats_method_with_data(self, mock_repo_contributor_objects, mock_repository_objects):
52+
"""Test stats method with actual data."""
53+
# Mock repository queryset
54+
mock_repositories = Mock()
55+
mock_repositories.count.return_value = 5
56+
mock_repositories.aggregate.return_value = {
57+
"total_stars": 100,
58+
"total_forks": 50,
59+
"total_issues": 25,
60+
}
61+
mock_repository_objects.filter.return_value = mock_repositories
62+
63+
# Mock repository contributor queryset
64+
mock_contributors = Mock()
65+
mock_contributors.values.return_value.distinct.return_value.count.return_value = 15
66+
mock_repo_contributor_objects.filter.return_value = mock_contributors
67+
68+
# Create mock organization
69+
mock_organization = Mock()
70+
71+
# Call stats method
72+
result = OrganizationNode.stats(mock_organization)
73+
74+
# Verify result
75+
assert isinstance(result, OrganizationStatsNode)
76+
assert result.total_repositories == 5
77+
assert result.total_contributors == 15
78+
assert result.total_stars == 100
79+
assert result.total_forks == 50
80+
assert result.total_issues == 25
81+
82+
@patch("apps.github.models.repository.Repository.objects")
83+
@patch("apps.github.models.repository_contributor.RepositoryContributor.objects")
84+
def test_stats_method_with_none_values(
85+
self, mock_repo_contributor_objects, mock_repository_objects
86+
):
87+
"""Test stats method when aggregate returns None values."""
88+
# Mock repository queryset
89+
mock_repositories = Mock()
90+
mock_repositories.count.return_value = 3
91+
mock_repositories.aggregate.return_value = {
92+
"total_stars": None,
93+
"total_forks": None,
94+
"total_issues": None,
95+
}
96+
mock_repository_objects.filter.return_value = mock_repositories
97+
98+
# Mock repository contributor queryset
99+
mock_contributors = Mock()
100+
mock_contributors.values.return_value.distinct.return_value.count.return_value = 8
101+
mock_repo_contributor_objects.filter.return_value = mock_contributors
102+
103+
# Create mock organization
104+
mock_organization = Mock()
105+
106+
# Call stats method
107+
result = OrganizationNode.stats(mock_organization)
108+
109+
# Verify result with default values
110+
assert isinstance(result, OrganizationStatsNode)
111+
assert result.total_repositories == 3
112+
assert result.total_contributors == 8
113+
assert result.total_stars == 0
114+
assert result.total_forks == 0
115+
assert result.total_issues == 0
116+
117+
def test_url_method(self):
118+
"""Test url method."""
119+
mock_organization = Mock()
120+
mock_organization.url = "https://github.com/test-org"
121+
122+
result = OrganizationNode.url(mock_organization)
123+
assert result == "https://github.com/test-org"
124+
47125

48126
class TestOrganizationStatsNode:
49127
def test_organization_stats_node(self):
@@ -58,3 +136,19 @@ def test_organization_stats_node(self):
58136
field.name for field in OrganizationStatsNode.__strawberry_definition__.fields
59137
}
60138
assert field_names == expected_fields
139+
140+
def test_organization_stats_node_creation(self):
141+
"""Test creating OrganizationStatsNode with values."""
142+
stats = OrganizationStatsNode(
143+
total_repositories=10,
144+
total_contributors=25,
145+
total_stars=150,
146+
total_forks=75,
147+
total_issues=30,
148+
)
149+
150+
assert stats.total_repositories == 10
151+
assert stats.total_contributors == 25
152+
assert stats.total_stars == 150
153+
assert stats.total_forks == 75
154+
assert stats.total_issues == 30
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
"""Test cases for PullRequestNode."""
2+
3+
from unittest.mock import Mock
4+
5+
from apps.github.api.internal.nodes.pull_request import PullRequestNode
6+
7+
8+
class TestPullRequestNode:
9+
"""Test cases for PullRequestNode class."""
10+
11+
def test_pull_request_node_type(self):
12+
assert hasattr(PullRequestNode, "__strawberry_definition__")
13+
14+
def test_pull_request_node_fields(self):
15+
field_names = {field.name for field in PullRequestNode.__strawberry_definition__.fields}
16+
expected_field_names = {
17+
"author",
18+
"created_at",
19+
"organization_name",
20+
"repository_name",
21+
"title",
22+
"url",
23+
}
24+
assert field_names == expected_field_names
25+
26+
def test_author_field(self):
27+
"""Test author field resolution."""
28+
mock_pr = Mock()
29+
mock_author = Mock()
30+
mock_pr.author = mock_author
31+
32+
result = PullRequestNode.author(mock_pr)
33+
assert result == mock_author
34+
35+
def test_organization_name_with_organization(self):
36+
"""Test organization_name field when organization exists."""
37+
mock_pr = Mock()
38+
mock_repository = Mock()
39+
mock_organization = Mock()
40+
mock_organization.login = "test-org"
41+
mock_repository.organization = mock_organization
42+
mock_pr.repository = mock_repository
43+
44+
result = PullRequestNode.organization_name(mock_pr)
45+
assert result == "test-org"
46+
47+
def test_organization_name_without_organization(self):
48+
"""Test organization_name field when organization doesn't exist."""
49+
mock_pr = Mock()
50+
mock_repository = Mock()
51+
mock_repository.organization = None
52+
mock_pr.repository = mock_repository
53+
54+
result = PullRequestNode.organization_name(mock_pr)
55+
assert result is None
56+
57+
def test_organization_name_without_repository(self):
58+
"""Test organization_name field when repository doesn't exist."""
59+
mock_pr = Mock()
60+
mock_pr.repository = None
61+
62+
result = PullRequestNode.organization_name(mock_pr)
63+
assert result is None
64+
65+
def test_repository_name_with_repository(self):
66+
"""Test repository_name field when repository exists."""
67+
mock_pr = Mock()
68+
mock_repository = Mock()
69+
mock_repository.name = "test-repo"
70+
mock_pr.repository = mock_repository
71+
72+
result = PullRequestNode.repository_name(mock_pr)
73+
assert result == "test-repo"
74+
75+
def test_repository_name_without_repository(self):
76+
"""Test repository_name field when repository doesn't exist."""
77+
mock_pr = Mock()
78+
mock_pr.repository = None
79+
80+
result = PullRequestNode.repository_name(mock_pr)
81+
assert result is None
82+
83+
def test_url_with_url(self):
84+
"""Test url field when URL exists."""
85+
mock_pr = Mock()
86+
mock_pr.url = "https://github.com/test-org/test-repo/pull/123"
87+
88+
result = PullRequestNode.url(mock_pr)
89+
assert result == "https://github.com/test-org/test-repo/pull/123"
90+
91+
def test_url_without_url(self):
92+
"""Test url field when URL doesn't exist."""
93+
mock_pr = Mock()
94+
mock_pr.url = None
95+
96+
result = PullRequestNode.url(mock_pr)
97+
assert result == ""

0 commit comments

Comments
 (0)