Skip to content

Commit 1aace88

Browse files
committed
Improve trust
1 parent d38d09b commit 1aace88

2 files changed

Lines changed: 40 additions & 1 deletion

File tree

api/features/feature_segments/permissions.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,10 @@ def has_permission(self, request, view): # type: ignore[no-untyped-def]
2020
return True
2121

2222
if view.action == "create":
23-
if not (environment_pk := request.data.get("environment")):
23+
try:
24+
# Validate here because this evaluates prior to the serializer layer
25+
environment_pk = int(request.data.get("environment"))
26+
except (TypeError, ValueError):
2427
return False
2528

2629
try:
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
from typing import Any, Callable
2+
3+
import pytest
4+
from pytest_mock import MockerFixture
5+
6+
from environments.models import Environment
7+
from features.feature_segments import permissions
8+
9+
10+
@pytest.mark.parametrize(
11+
"get_payload, expected",
12+
[
13+
(lambda environment: {}, False),
14+
(lambda environment: {"environment": "invalid"}, False),
15+
(lambda environment: {"environment": environment.pk}, True),
16+
],
17+
)
18+
def test_FeatureSegmentPermissions_has_permission__create_action__handles_environment_arg(
19+
environment: Environment,
20+
expected: bool,
21+
mocker: MockerFixture,
22+
get_payload: Callable[[Environment], dict[str, Any]],
23+
) -> None:
24+
# Given
25+
view = mocker.Mock(action="create", detail=False)
26+
request = mocker.Mock(data=get_payload(environment))
27+
request.user.has_environment_permission.return_value = True
28+
29+
# When
30+
permission = mocker.Mock(spec=permissions.FeatureSegmentPermissions)
31+
result = permissions.FeatureSegmentPermissions.has_permission( # type: ignore[no-untyped-call]
32+
permission, request, view
33+
)
34+
35+
# Then
36+
assert result is expected

0 commit comments

Comments
 (0)