-
-
Notifications
You must be signed in to change notification settings - Fork 69
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'main' into Improve-NestBot-/users-command
- Loading branch information
Showing
28 changed files
with
1,810 additions
and
970 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
12 changes: 12 additions & 0 deletions
12
backend/apps/github/graphql/nodes/repository_contributor.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
"""GitHub repository GraphQL node.""" | ||
|
||
import graphene | ||
|
||
|
||
class RepositoryContributorNode(graphene.ObjectType): | ||
"""Repository contributor node.""" | ||
|
||
avatar_url = graphene.String() | ||
contributions_count = graphene.Int() | ||
login = graphene.String() | ||
name = graphene.String() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
"""GitHub GraphQL queries.""" | ||
|
||
from apps.github.graphql.queries.repository import RepositoryQuery | ||
|
||
|
||
class GithubQuery(RepositoryQuery): | ||
"""GitHub query.""" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
"""OWASP project GraphQL queries.""" | ||
|
||
import graphene | ||
|
||
from apps.common.graphql.queries import BaseQuery | ||
from apps.github.graphql.nodes.repository import RepositoryNode | ||
from apps.owasp.models.project import Project | ||
|
||
|
||
class RepositoryQuery(BaseQuery): | ||
"""Repository queries.""" | ||
|
||
repository = graphene.Field( | ||
RepositoryNode, | ||
project_key=graphene.String(required=True), | ||
repository_key=graphene.String(required=True), | ||
) | ||
|
||
def resolve_repository(root, info, project_key, repository_key): | ||
"""Resolve project.""" | ||
try: | ||
return ( | ||
Project.objects.get(key=project_key) | ||
.repositories.filter(key=repository_key) | ||
.first() | ||
) | ||
except Project.DoesNotExist: | ||
return None |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,33 +1,69 @@ | ||
"""Test cases for RepositoryNode.""" | ||
|
||
from graphene import List | ||
|
||
from apps.common.graphql.nodes import BaseNode | ||
from apps.github.graphql.nodes.issue import IssueNode | ||
from apps.github.graphql.nodes.release import ReleaseNode | ||
from apps.github.graphql.nodes.repository import RepositoryNode | ||
from apps.github.models.repository import Repository | ||
|
||
|
||
class TestRepositoryNode: | ||
"""Test cases for RepositoryNode class.""" | ||
|
||
def test_repository_node_inheritance(self): | ||
"""Test if RepositoryNode inherits from BaseNode.""" | ||
assert issubclass(RepositoryNode, BaseNode) | ||
|
||
def test_meta_configuration(self): | ||
"""Test if Meta is properly configured.""" | ||
assert RepositoryNode._meta.model == Repository | ||
expected_fields = { | ||
"commits_count", | ||
"contributors_count", | ||
"created_at", | ||
"description", | ||
"forks_count", | ||
"issues", | ||
"key", | ||
"languages", | ||
"license", | ||
"name", | ||
"open_issues_count", | ||
"releases", | ||
"size", | ||
"stars_count", | ||
"subscribers_count", | ||
"top_contributors", | ||
"topics", | ||
"updated_at", | ||
"url", | ||
} | ||
assert set(RepositoryNode._meta.fields) == expected_fields | ||
|
||
def test_resolve_url_field(self, mocker): | ||
"""Test if URL field is properly defined.""" | ||
field = RepositoryNode._meta.fields.get("url") | ||
def test_resolve_languages(self, mocker): | ||
field = RepositoryNode._meta.fields.get("languages") | ||
assert field is not None | ||
assert str(field.type) == "[String]" | ||
|
||
def test_resolve_topics(self, mocker): | ||
field = RepositoryNode._meta.fields.get("topics") | ||
assert field is not None | ||
assert str(field.type) == "[String]" | ||
|
||
def test_resolve_issues(self, mocker): | ||
field = RepositoryNode._meta.fields.get("issues") | ||
assert field is not None | ||
assert str(field.type) == "String" | ||
assert field.type == List(IssueNode) | ||
|
||
def test_resolve_releases(self, mocker): | ||
field = RepositoryNode._meta.fields.get("releases") | ||
assert field is not None | ||
assert field.type == List(ReleaseNode) | ||
|
||
def test_resolve_top_contributors(self, mocker): | ||
field = RepositoryNode._meta.fields.get("top_contributors") | ||
assert field is not None | ||
assert str(field.type) == "[RepositoryContributorNode]" | ||
|
||
def test_resolve_url(self, mocker): | ||
url = RepositoryNode._meta.fields.get("url") | ||
assert url is not None | ||
assert str(url.type) == "String" |
Empty file.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,65 @@ | ||
"""Test cases for RepositoryQuery.""" | ||
|
||
from unittest.mock import Mock, patch | ||
|
||
import pytest | ||
|
||
from apps.github.graphql.queries.repository import RepositoryQuery | ||
from apps.owasp.models.project import Project | ||
|
||
|
||
class TestRepositoryQuery: | ||
"""Test cases for RepositoryQuery class.""" | ||
|
||
@pytest.fixture() | ||
def mock_info(self): | ||
"""GraphQL info mock fixture.""" | ||
return Mock() | ||
|
||
@pytest.fixture() | ||
def mock_project(self): | ||
"""Project mock fixture.""" | ||
return Mock(spec=Project) | ||
|
||
def test_resolve_repository_existing(self, mock_project, mock_info): | ||
"""Test resolving an existing repository.""" | ||
mock_repository = Mock() | ||
mock_project.repositories.filter.return_value.first.return_value = mock_repository | ||
|
||
with patch("apps.owasp.models.project.Project.objects.get") as mock_get: | ||
mock_get.return_value = mock_project | ||
|
||
result = RepositoryQuery.resolve_repository( | ||
None, mock_info, project_key="test-project", repository_key="test-repo" | ||
) | ||
|
||
assert result == mock_repository | ||
mock_get.assert_called_once_with(key="test-project") | ||
mock_project.repositories.filter.assert_called_once_with(key="test-repo") | ||
|
||
def test_resolve_repository_not_found_project(self, mock_info): | ||
"""Test resolving a non-existent project.""" | ||
with patch("apps.owasp.models.project.Project.objects.get") as mock_get: | ||
mock_get.side_effect = Project.DoesNotExist | ||
|
||
result = RepositoryQuery.resolve_repository( | ||
None, mock_info, project_key="non-existent-project", repository_key="test-repo" | ||
) | ||
|
||
assert result is None | ||
mock_get.assert_called_once_with(key="non-existent-project") | ||
|
||
def test_resolve_repository_not_found_repository(self, mock_project, mock_info): | ||
"""Test resolving a non-existent repository in an existing project.""" | ||
mock_project.repositories.filter.return_value.first.return_value = None | ||
|
||
with patch("apps.owasp.models.project.Project.objects.get") as mock_get: | ||
mock_get.return_value = mock_project | ||
|
||
result = RepositoryQuery.resolve_repository( | ||
None, mock_info, project_key="test-project", repository_key="non-existent-repo" | ||
) | ||
|
||
assert result is None | ||
mock_get.assert_called_once_with(key="test-project") | ||
mock_project.repositories.filter.assert_called_once_with(key="non-existent-repo") |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,49 @@ | ||
export const mockRepositoryData = { | ||
repository: { | ||
name: 'Test Repo', | ||
updatedAt: '2024-01-01T00:00:00Z', | ||
license: 'MIT', | ||
size: 1200, | ||
url: 'https://github.com/test-repo', | ||
commitsCount: 10, | ||
contributorsCount: 5, | ||
forksCount: 3, | ||
openIssuesCount: 2, | ||
starsCount: 50, | ||
topContributors: Array.from({ length: 15 }, (_, i) => ({ | ||
avatarUrl: `https://example.com/avatar${i + 1}.jpg`, | ||
contributionsCount: 30 - i, | ||
login: `contributor${i + 1}`, | ||
name: `Contributor ${i + 1}`, | ||
})), | ||
languages: ['JavaScript', 'TypeScript'], | ||
topics: ['web', 'security'], | ||
description: 'A sample test repository', | ||
createdAt: '2023-12-15T00:00:00Z', | ||
issues: [ | ||
{ | ||
title: 'Bug fix required', | ||
commentsCount: 4, | ||
createdAt: '2024-01-02T10:00:00Z', | ||
author: { | ||
avatarUrl: 'https://example.com/avatar.jpg', | ||
name: 'Test User 1', | ||
login: 'user1', | ||
}, | ||
}, | ||
], | ||
releases: [ | ||
{ | ||
name: 'v1.0.0', | ||
tagName: 'v1.0.0', | ||
isPreRelease: false, | ||
publishedAt: '2024-01-01T12:00:00Z', | ||
author: { | ||
avatarUrl: 'https://example.com/avatar.jpg', | ||
name: 'Test User 2', | ||
login: 'user2', | ||
}, | ||
}, | ||
], | ||
}, | ||
} |
Oops, something went wrong.