Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
59 changes: 59 additions & 0 deletions backend/tests/apps/github/api/internal/nodes/issue_test.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
"""Test cases for IssueNode."""

from unittest.mock import Mock

from apps.github.api.internal.nodes.issue import IssueNode


Expand All @@ -22,3 +24,60 @@ def test_issue_node_fields(self):
"repository_name",
}
assert field_names == expected_field_names

def test_author_field(self):
"""Test author field resolution."""
mock_issue = Mock()
mock_author = Mock()
mock_issue.author = mock_author

result = IssueNode.author(mock_issue)
assert result == mock_author

def test_organization_name_with_organization(self):
"""Test organization_name field when organization exists."""
mock_issue = Mock()
mock_repository = Mock()
mock_organization = Mock()
mock_organization.login = "test-org"
mock_repository.organization = mock_organization
mock_issue.repository = mock_repository

result = IssueNode.organization_name(mock_issue)
assert result == "test-org"

def test_organization_name_without_organization(self):
"""Test organization_name field when organization doesn't exist."""
mock_issue = Mock()
mock_repository = Mock()
mock_repository.organization = None
mock_issue.repository = mock_repository

result = IssueNode.organization_name(mock_issue)
assert result is None

def test_organization_name_without_repository(self):
"""Test organization_name field when repository doesn't exist."""
mock_issue = Mock()
mock_issue.repository = None

result = IssueNode.organization_name(mock_issue)
assert result is None

def test_repository_name_with_repository(self):
"""Test repository_name field when repository exists."""
mock_issue = Mock()
mock_repository = Mock()
mock_repository.name = "test-repo"
mock_issue.repository = mock_repository

result = IssueNode.repository_name(mock_issue)
assert result == "test-repo"

def test_repository_name_without_repository(self):
"""Test repository_name field when repository doesn't exist."""
mock_issue = Mock()
mock_issue.repository = None

result = IssueNode.repository_name(mock_issue)
assert result is None
79 changes: 79 additions & 0 deletions backend/tests/apps/github/api/internal/nodes/milestone_test.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
"""Test cases for MilestoneNode."""

from unittest.mock import Mock

import pytest

from apps.github.api.internal.nodes.milestone import MilestoneNode


Expand All @@ -26,3 +30,78 @@ def test_milestone_node_fields(self):
"url",
}
assert field_names == expected_field_names

def test_author_field(self):
"""Test author field resolution."""
mock_milestone = Mock()
mock_author = Mock()
mock_milestone.author = mock_author

result = MilestoneNode.author(mock_milestone)
assert result == mock_author

def test_organization_name_with_organization(self):
"""Test organization_name field when organization exists."""
mock_milestone = Mock()
mock_repository = Mock()
mock_organization = Mock()
mock_organization.login = "test-org"
mock_repository.organization = mock_organization
mock_milestone.repository = mock_repository

result = MilestoneNode.organization_name(mock_milestone)
assert result == "test-org"

def test_organization_name_without_organization(self):
"""Test organization_name field when organization doesn't exist."""
mock_milestone = Mock()
mock_repository = Mock()
mock_repository.organization = None
mock_milestone.repository = mock_repository

result = MilestoneNode.organization_name(mock_milestone)
assert result is None

def test_organization_name_without_repository(self):
"""Test organization_name field when repository doesn't exist."""
mock_milestone = Mock()
mock_milestone.repository = None

result = MilestoneNode.organization_name(mock_milestone)
assert result is None

def test_progress_with_issues(self):
"""Test progress calculation with issues."""
mock_milestone = Mock()
mock_milestone.closed_issues_count = 7
mock_milestone.open_issues_count = 3

result = MilestoneNode.progress(mock_milestone)
assert result == pytest.approx(70.0)

def test_progress_without_issues(self):
"""Test progress calculation without issues."""
mock_milestone = Mock()
mock_milestone.closed_issues_count = 0
mock_milestone.open_issues_count = 0

result = MilestoneNode.progress(mock_milestone)
assert result == pytest.approx(0.0)

def test_repository_name_with_repository(self):
"""Test repository_name field when repository exists."""
mock_milestone = Mock()
mock_repository = Mock()
mock_repository.name = "test-repo"
mock_milestone.repository = mock_repository

result = MilestoneNode.repository_name(mock_milestone)
assert result == "test-repo"

def test_repository_name_without_repository(self):
"""Test repository_name field when repository doesn't exist."""
mock_milestone = Mock()
mock_milestone.repository = None

result = MilestoneNode.repository_name(mock_milestone)
assert result is None
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
"""Test cases for OrganizationNode."""

from unittest.mock import Mock, patch

from apps.github.api.internal.nodes.organization import (
OrganizationNode,
OrganizationStatsNode,
Expand Down Expand Up @@ -45,6 +47,82 @@ def test_resolve_url(self):
assert url_field is not None
assert url_field.type is str

@patch("apps.github.models.repository.Repository.objects")
@patch("apps.github.models.repository_contributor.RepositoryContributor.objects")
def test_stats_method_with_data(self, mock_repo_contributor_objects, mock_repository_objects):
"""Test stats method with actual data."""
# Mock repository queryset
mock_repositories = Mock()
mock_repositories.count.return_value = 5
mock_repositories.aggregate.return_value = {
"total_stars": 100,
"total_forks": 50,
"total_issues": 25,
}
mock_repository_objects.filter.return_value = mock_repositories

# Mock repository contributor queryset
mock_contributors = Mock()
mock_contributors.values.return_value.distinct.return_value.count.return_value = 15
mock_repo_contributor_objects.filter.return_value = mock_contributors

# Create mock organization
mock_organization = Mock()

# Call stats method
result = OrganizationNode.stats(mock_organization)

# Verify result
assert isinstance(result, OrganizationStatsNode)
assert result.total_repositories == 5
assert result.total_contributors == 15
assert result.total_stars == 100
assert result.total_forks == 50
assert result.total_issues == 25

@patch("apps.github.models.repository.Repository.objects")
@patch("apps.github.models.repository_contributor.RepositoryContributor.objects")
def test_stats_method_with_none_values(
self, mock_repo_contributor_objects, mock_repository_objects
):
"""Test stats method when aggregate returns None values."""
# Mock repository queryset
mock_repositories = Mock()
mock_repositories.count.return_value = 3
mock_repositories.aggregate.return_value = {
"total_stars": None,
"total_forks": None,
"total_issues": None,
}
mock_repository_objects.filter.return_value = mock_repositories

# Mock repository contributor queryset
mock_contributors = Mock()
mock_contributors.values.return_value.distinct.return_value.count.return_value = 8
mock_repo_contributor_objects.filter.return_value = mock_contributors

# Create mock organization
mock_organization = Mock()

# Call stats method
result = OrganizationNode.stats(mock_organization)

# Verify result with default values
assert isinstance(result, OrganizationStatsNode)
assert result.total_repositories == 3
assert result.total_contributors == 8
assert result.total_stars == 0
assert result.total_forks == 0
assert result.total_issues == 0

def test_url_method(self):
"""Test url method."""
mock_organization = Mock()
mock_organization.url = "https://github.com/test-org"

result = OrganizationNode.url(mock_organization)
assert result == "https://github.com/test-org"


class TestOrganizationStatsNode:
def test_organization_stats_node(self):
Expand All @@ -59,3 +137,19 @@ def test_organization_stats_node(self):
field.name for field in OrganizationStatsNode.__strawberry_definition__.fields
}
assert field_names == expected_fields

def test_organization_stats_node_creation(self):
"""Test creating OrganizationStatsNode with values."""
stats = OrganizationStatsNode(
total_repositories=10,
total_contributors=25,
total_stars=150,
total_forks=75,
total_issues=30,
)

assert stats.total_repositories == 10
assert stats.total_contributors == 25
assert stats.total_stars == 150
assert stats.total_forks == 75
assert stats.total_issues == 30
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
"""Test cases for PullRequestNode."""

from unittest.mock import Mock

from apps.github.api.internal.nodes.pull_request import PullRequestNode


class TestPullRequestNode:
"""Test cases for PullRequestNode class."""

def test_pull_request_node_type(self):
assert hasattr(PullRequestNode, "__strawberry_definition__")

def test_meta_configuration(self):
field_names = {field.name for field in PullRequestNode.__strawberry_definition__.fields}
expected_field_names = {
"_id",
"author",
"created_at",
"organization_name",
"repository_name",
"title",
"url",
}
assert field_names == expected_field_names

def test_author_field(self):
"""Test author field resolution."""
mock_pr = Mock()
mock_author = Mock()
mock_pr.author = mock_author

result = PullRequestNode.author(mock_pr)
assert result == mock_author

def test_organization_name_with_organization(self):
"""Test organization_name field when organization exists."""
mock_pr = Mock()
mock_repository = Mock()
mock_organization = Mock()
mock_organization.login = "test-org"
mock_repository.organization = mock_organization
mock_pr.repository = mock_repository

result = PullRequestNode.organization_name(mock_pr)
assert result == "test-org"

def test_organization_name_without_organization(self):
"""Test organization_name field when organization doesn't exist."""
mock_pr = Mock()
mock_repository = Mock()
mock_repository.organization = None
mock_pr.repository = mock_repository

result = PullRequestNode.organization_name(mock_pr)
assert result is None

def test_organization_name_without_repository(self):
"""Test organization_name field when repository doesn't exist."""
mock_pr = Mock()
mock_pr.repository = None

result = PullRequestNode.organization_name(mock_pr)
assert result is None

def test_repository_name_with_repository(self):
"""Test repository_name field when repository exists."""
mock_pr = Mock()
mock_repository = Mock()
mock_repository.name = "test-repo"
mock_pr.repository = mock_repository

result = PullRequestNode.repository_name(mock_pr)
assert result == "test-repo"

def test_repository_name_without_repository(self):
"""Test repository_name field when repository doesn't exist."""
mock_pr = Mock()
mock_pr.repository = None

result = PullRequestNode.repository_name(mock_pr)
assert result is None

def test_url_with_url(self):
"""Test url field when URL exists."""
mock_pr = Mock()
mock_pr.url = "https://github.com/test-org/test-repo/pull/123"

result = PullRequestNode.url(mock_pr)
assert result == "https://github.com/test-org/test-repo/pull/123"

def test_url_without_url(self):
"""Test url field when URL doesn't exist."""
mock_pr = Mock()
mock_pr.url = None

result = PullRequestNode.url(mock_pr)
assert result == ""
Loading