Skip to content

Commit 79eb65b

Browse files
committed
fix(BA-4280): Prevent scoped_query from overriding project param with group_id (#8628)
Backported-from: main (26.1) Backported-to: 26.1 Backport-of: 8628
1 parent c0f3bb0 commit 79eb65b

File tree

3 files changed

+55
-2
lines changed

3 files changed

+55
-2
lines changed

changes/8628.fix.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Prevent `scoped_query` from overriding `project` param with `group_id`

src/ai/backend/manager/api/gql_legacy/base.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -613,8 +613,6 @@ async def wrapped(
613613
kwargs["domain_name"] = domain_name
614614
if group_id is not None:
615615
kwargs["group_id"] = group_id
616-
if kwargs.get("project") is not None:
617-
kwargs["project"] = group_id
618616
kwargs[user_key] = user_id
619617
return await resolve_func(root, info, *args, **kwargs)
620618

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
"""
2+
Regression test for scoped_query: the `project` parameter must not be
3+
silently overridden by `group_id`. (BA-4280)
4+
"""
5+
6+
from __future__ import annotations
7+
8+
import uuid
9+
from typing import Any
10+
from unittest.mock import MagicMock
11+
12+
import graphene
13+
import pytest
14+
15+
from ai.backend.manager.api.gql_legacy.base import scoped_query
16+
from ai.backend.manager.models.user import UserRole
17+
18+
19+
class TestScopedQuery:
20+
"""Test fixes for scoped_query bugs BA-4280."""
21+
22+
@pytest.fixture
23+
def mock_graphene_info(self) -> MagicMock:
24+
"""Mock GraphQL ResolveInfo with SUPERADMIN context."""
25+
ctx = MagicMock()
26+
ctx.user = {"role": UserRole.SUPERADMIN, "domain_name": "default", "uuid": uuid.uuid4()}
27+
ctx.access_key = "test-key"
28+
info = MagicMock(spec=graphene.ResolveInfo)
29+
info.context = ctx
30+
return info
31+
32+
@pytest.mark.asyncio
33+
async def test_project_param_preserved(self, mock_graphene_info: MagicMock) -> None:
34+
"""Regression: project was silently overridden by group_id in scoped_query."""
35+
project_id = uuid.uuid4()
36+
group_id = uuid.uuid4()
37+
received: dict[str, Any] = {}
38+
39+
@scoped_query(autofill_user=False, user_key="user_uuid")
40+
async def _mock_resolver(
41+
_root: Any,
42+
_info: graphene.ResolveInfo,
43+
*,
44+
project: uuid.UUID | None = None,
45+
group_id: uuid.UUID | None = None,
46+
domain_name: str | None = None,
47+
user_uuid: uuid.UUID | None = None,
48+
) -> None:
49+
received.update(project=project, group_id=group_id)
50+
51+
await _mock_resolver(None, mock_graphene_info, project=project_id, group_id=group_id)
52+
53+
assert received["project"] == project_id
54+
assert received["group_id"] == group_id

0 commit comments

Comments
 (0)