Skip to content

Commit 61cf84b

Browse files
committed
Add tests
1 parent 88954e9 commit 61cf84b

File tree

4 files changed

+162
-5
lines changed

4 files changed

+162
-5
lines changed

backend/apps/owasp/graphql/nodes/project_health_metrics.py

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,11 @@
99
@strawberry_django.type(
1010
ProjectHealthMetrics,
1111
fields=[
12-
"age_days",
1312
"contributors_count",
1413
"forks_count",
1514
"is_funding_requirements_compliant",
1615
"is_project_leaders_requirements_compliant",
17-
"last_commit_days",
18-
"last_pull_request_days",
19-
"last_release_days",
2016
"open_issues_count",
21-
"owasp_page_last_update_days",
2217
"recent_releases_count",
2318
"score",
2419
"stars_count",
@@ -29,6 +24,31 @@
2924
class ProjectHealthMetricsNode:
3025
"""Project health metrics node."""
3126

27+
@strawberry.field
28+
def age_days(self) -> int:
29+
"""Resolve project age in days."""
30+
return self.age_days
31+
32+
@strawberry.field
33+
def last_commit_days(self) -> int:
34+
"""Resolve last commit age in days."""
35+
return self.last_commit_days
36+
37+
@strawberry.field
38+
def last_pull_request_days(self) -> int:
39+
"""Resolve last pull request age in days."""
40+
return self.last_pull_request_days
41+
42+
@strawberry.field
43+
def last_release_days(self) -> int:
44+
"""Resolve last release age in days."""
45+
return self.last_release_days
46+
47+
@strawberry.field
48+
def owasp_page_last_update_days(self) -> int:
49+
"""Resolve OWASP page last update age in days."""
50+
return self.owasp_page_last_update_days
51+
3252
@strawberry.field
3353
def project_name(self) -> str:
3454
"""Resolve project node."""
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
"""Test cases for ProjectHealthMetricsNode."""
2+
3+
import pytest
4+
5+
from apps.owasp.graphql.nodes.project_health_metrics import ProjectHealthMetricsNode
6+
7+
8+
class TestProjectHealthMetricsNode:
9+
def test_project_health_metrics_node_inheritance(self):
10+
assert hasattr(ProjectHealthMetricsNode, "__strawberry_definition__")
11+
12+
def test_meta_configuration(self):
13+
field_names = {
14+
field.name for field in ProjectHealthMetricsNode.__strawberry_definition__.fields
15+
}
16+
expected_field_names = {
17+
"age_days",
18+
"contributors_count",
19+
"forks_count",
20+
"is_funding_requirements_compliant",
21+
"is_project_leaders_requirements_compliant",
22+
"last_commit_days",
23+
"last_pull_request_days",
24+
"last_release_days",
25+
"open_issues_count",
26+
"owasp_page_last_update_days",
27+
"recent_releases_count",
28+
"score",
29+
"stars_count",
30+
"unanswered_issues_count",
31+
"unassigned_issues_count",
32+
}
33+
assert expected_field_names.issubset(field_names)
34+
35+
def _get_field_by_name(self, name):
36+
return next(
37+
(
38+
f
39+
for f in ProjectHealthMetricsNode.__strawberry_definition__.fields
40+
if f.name == name
41+
),
42+
None,
43+
)
44+
45+
@pytest.mark.parametrize(
46+
("field_name", "expected_type"),
47+
[
48+
("project_name", str),
49+
("age_days", int),
50+
("contributors_count", int),
51+
("forks_count", int),
52+
("is_funding_requirements_compliant", bool),
53+
("is_project_leaders_requirements_compliant", bool),
54+
("last_commit_days", int),
55+
("last_pull_request_days", int),
56+
("last_release_days", int),
57+
("open_issues_count", int),
58+
("owasp_page_last_update_days", int),
59+
("recent_releases_count", int),
60+
("unanswered_issues_count", int),
61+
("unassigned_issues_count", int),
62+
],
63+
)
64+
def test_field_types(self, field_name, expected_type):
65+
field = self._get_field_by_name(field_name)
66+
assert field is not None
67+
assert field.type is expected_type

backend/tests/apps/owasp/graphql/nodes/project_test.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from apps.github.graphql.nodes.release import ReleaseNode
77
from apps.github.graphql.nodes.repository import RepositoryNode
88
from apps.owasp.graphql.nodes.project import ProjectNode
9+
from apps.owasp.graphql.nodes.project_health_metrics import ProjectHealthMetricsNode
910

1011

1112
class TestProjectNode:
@@ -43,6 +44,11 @@ def _get_field_by_name(self, name):
4344
(f for f in ProjectNode.__strawberry_definition__.fields if f.name == name), None
4445
)
4546

47+
def test_resolve_health(self):
48+
field = self._get_field_by_name("health")
49+
assert field is not None
50+
assert field.type.of_type is ProjectHealthMetricsNode
51+
4652
def test_resolve_issues_count(self):
4753
field = self._get_field_by_name("issues_count")
4854
assert field is not None
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
from unittest.mock import Mock, patch
2+
3+
from apps.owasp.graphql.nodes.project_health_metrics import ProjectHealthMetricsNode
4+
from apps.owasp.graphql.queries.project_health_metrics import ProjectHealthMetricsQuery
5+
from apps.owasp.models.project_health_metrics import ProjectHealthMetrics
6+
7+
8+
class ProjectHealthMetricsQueryTest:
9+
"""Test cases for ProjectHealthMetricsQuery class."""
10+
11+
def test_project_health_metrics_query_has_strawberry_definition(self):
12+
"""Check if ProjectHealthMetricsQuery has valid Strawberry definition."""
13+
assert hasattr(ProjectHealthMetricsQuery, "__strawberry_definition__")
14+
15+
field_names = [
16+
field.name for field in ProjectHealthMetricsQuery.__strawberry_definition__.fields
17+
]
18+
assert "project_health_metrics" in field_names
19+
20+
def test_project_health_metrics_field_configuration(self):
21+
"""Test if 'project_health_metrics' field is configured properly."""
22+
health_metrics_field = next(
23+
field
24+
for field in ProjectHealthMetricsQuery.__strawberry_definition__.fields
25+
if field.name == "project_health_metrics"
26+
)
27+
28+
assert health_metrics_field.type.of_type is ProjectHealthMetricsNode
29+
30+
arg_names = [arg.python_name for arg in health_metrics_field.arguments]
31+
assert "key" in arg_names
32+
33+
key_arg = next(arg for arg in health_metrics_field.arguments if arg.python_name == "key")
34+
assert key_arg.type_annotation.annotation is str
35+
36+
37+
class ProjectHealthMetricsResolutionTest:
38+
"""Test cases for resolving the project_health_metrics field."""
39+
40+
@patch("apps.owasp.models.project_health_metrics.ProjectHealthMetrics.objects")
41+
def test_resolve_unhealthy_projects(self, mocked_objects):
42+
"""Test the resolution of unhealthy projects."""
43+
# Mock the queryset
44+
mock_queryset = Mock(spec=ProjectHealthMetrics.objects)
45+
mocked_objects.select_related.return_value.order_by.return_value = mock_queryset
46+
47+
# Create a mock instance of ProjectHealthMetricsNode
48+
mock_node = Mock(spec=ProjectHealthMetricsNode)
49+
mock_queryset.all.return_value = [mock_node]
50+
51+
# Create an instance of the query class
52+
query_instance = ProjectHealthMetricsQuery()
53+
54+
# Call the method
55+
result = query_instance.unhealthy_projects()
56+
57+
# Assert that the mocked queryset was called correctly
58+
mocked_objects.select_related.assert_called_with("project")
59+
mocked_objects.select_related.return_value.order_by.assert_called_with(
60+
"project__key", "-nest_created_at", "-score"
61+
)
62+
63+
# Assert that the result is as expected
64+
assert result == [mock_node]

0 commit comments

Comments
 (0)