Skip to content
Closed
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
23 changes: 23 additions & 0 deletions backend/apps/github/api/internal/queries/user.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import strawberry
import strawberry_django
from django.db.models import Case, IntegerField, Value, When

from apps.github.api.internal.nodes.repository import RepositoryNode
from apps.github.api.internal.nodes.user import UserNode
Expand Down Expand Up @@ -52,3 +53,25 @@ def user(

"""
return User.objects.filter(has_public_member_page=True, login=login).first()

@strawberry_django.field
def users(self, logins: list[str]) -> list[UserNode]:
"""Resolve users by their logins.

Args:
logins (list[str]): List of user logins.

Returns:
list[User]: List of user objects.

"""
if not logins:
return []
qs = User.objects.filter(login__in=logins, has_public_member_page=True)
if logins:
order = Case(
*[When(login=login, then=Value(pos)) for pos, login in enumerate(logins)],
output_field=IntegerField(),
)
qs = qs.order_by(order)
return qs
52 changes: 52 additions & 0 deletions backend/tests/apps/github/api/internal/queries/user_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -79,3 +79,55 @@ def test_top_contributed_repositories(self):
mock_queryset.filter.return_value.order_by.assert_called_once_with(
"-contributions_count"
)

def test_resolve_users_with_logins(self, mock_user):
"""Test resolving multiple users by their logins."""
with patch("apps.github.models.user.User.objects.filter") as mock_filter:
mock_queryset = mock_filter.return_value
mock_queryset.order_by.return_value = [mock_user]

result = UserQuery().users(logins=["user1", "user2"])

assert result == [mock_user]
mock_filter.assert_called_once_with(
login__in=["user1", "user2"], has_public_member_page=True
)
mock_queryset.order_by.assert_called_once()

def test_resolve_users_empty_list(self):
"""Test resolving users with an empty logins list."""
with patch("apps.github.models.user.User.objects.filter") as mock_filter:
mock_queryset = mock_filter.return_value
mock_queryset.order_by.return_value = []

result = UserQuery().users(logins=[])

assert result == []

def test_resolve_users_filters_by_public_member_page_and_login_in(self):
"""Test that users query filters by both has_public_member_page and login__in."""
with patch("apps.github.models.user.User.objects.filter") as mock_filter:
mock_queryset = mock_filter.return_value
mock_queryset.order_by.return_value = []

UserQuery().users(logins=["user1", "user2", "user3"])

mock_filter.assert_called_once_with(
login__in=["user1", "user2", "user3"], has_public_member_page=True
)

def test_resolve_users_preserves_order(self, mock_user):
"""Test that users are returned in the order of input logins."""
mock_user1 = Mock(spec=User, login="user1")
mock_user2 = Mock(spec=User, login="user2")

with patch("apps.github.models.user.User.objects.filter") as mock_filter:
mock_queryset = mock_filter.return_value
mock_queryset.order_by.return_value = [mock_user1, mock_user2]

logins = ["user1", "user2"]
result = UserQuery().users(logins=logins)

assert result == [mock_user1, mock_user2]
mock_filter.assert_called_once_with(login__in=logins, has_public_member_page=True)
mock_queryset.order_by.assert_called_once()
26 changes: 13 additions & 13 deletions docker-compose/local/compose.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ services:
- 8000:8000
volumes:
- ../../backend:/home/owasp
- backend-venv:/home/owasp/.venv
- backend-venv_3592:/home/owasp/.venv

cache:
command: >
Expand All @@ -50,7 +50,7 @@ services:
networks:
- nest-network
volumes:
- cache-data:/data
- cache-data_3592:/data

db:
container_name: nest-db
Expand All @@ -67,7 +67,7 @@ services:
networks:
- nest-network
volumes:
- db-data:/var/lib/postgresql/data
- db-data_3592:/var/lib/postgresql/data

docs:
container_name: nest-docs
Expand All @@ -84,7 +84,7 @@ services:
- 8001:8001
volumes:
- ../../docs:/home/owasp/docs
- docs-venv:/home/owasp/.venv
- docs-venv_3592:/home/owasp/.venv

frontend:
container_name: nest-frontend
Expand All @@ -106,8 +106,8 @@ services:
- 3000:3000
volumes:
- ../../frontend:/home/owasp
- frontend-next:/home/owasp/.next
- frontend-node-modules:/home/owasp/node_modules
- frontend-next_3592:/home/owasp/.next
- frontend-node-modules_3592:/home/owasp/node_modules

worker:
container_name: nest-worker
Expand Down Expand Up @@ -136,15 +136,15 @@ services:
- nest-network
volumes:
- ../../backend:/home/owasp
- backend-venv:/home/owasp/.venv
- backend-venv_3592:/home/owasp/.venv

networks:
nest-network:

volumes:
backend-venv:
cache-data:
db-data:
docs-venv:
frontend-next:
frontend-node-modules:
backend-venv_3592:
cache-data_3592:
db-data_3592:
docs-venv_3592:
frontend-next_3592:
frontend-node-modules_3592:
16 changes: 8 additions & 8 deletions frontend/__tests__/e2e/pages/About.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,17 +8,17 @@ test.describe('About Page', () => {
const request = route.request()
const postData = request.postDataJSON()

if (postData.query?.includes('user')) {
const username = postData.variables.key
const userData = mockAboutData.users[username]
await route.fulfill({ status: 200, json: { data: { user: userData } } })
} else if (postData.query?.includes('topContributors')) {
if (postData.operationName === 'GetAboutPageData') {
await route.fulfill({
status: 200,
json: { data: { topContributors: mockAboutData.topContributors } },
json: {
data: {
project: mockAboutData.project,
topContributors: mockAboutData.topContributors,
users: mockAboutData.users,
},
},
})
} else {
await route.fulfill({ status: 200, json: { data: { project: mockAboutData.project } } })
}
})

Expand Down
10 changes: 5 additions & 5 deletions frontend/__tests__/mockData/mockAboutData.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,21 +42,21 @@ export const mockAboutData = {
login: `contributor${i + 1}`,
name: `Contributor ${i + 1}`,
})),
users: {
arkid15r: {
users: [
{
avatarUrl: 'https://avatars.githubusercontent.com/u/2201626?v=4',
login: 'arkid15r',
name: 'Arkadii Yakovets',
},
kasya: {
{
avatarUrl: 'https://avatars.githubusercontent.com/u/5873153?v=4',
login: 'kasya',
name: 'Kate Golovanova',
},
mamicidal: {
{
avatarUrl: 'https://avatars.githubusercontent.com/u/112129498?v=4',
login: 'mamicidal',
name: 'Starr Brown',
},
},
],
}
Loading