Skip to content

Commit 7efea43

Browse files
slivercn2ygk
andauthored
Stopped SparseFieldsetsMixin interpretting invalid fields parameter (#842)
Co-authored-by: Alan Crosswell <[email protected]>
1 parent e09b85d commit 7efea43

File tree

3 files changed

+33
-6
lines changed

3 files changed

+33
-6
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@ This release is not backwards compatible. For easy migration best upgrade first
2727
* Removed obsolete `source` argument of `SerializerMethodResourceRelatedField`
2828
* Removed obsolete setting `JSON_API_SERIALIZE_NESTED_SERIALIZERS_AS_ATTRIBUTE` to render nested serializers as relationships. Default is as attribute now.
2929

30+
### Fixed
31+
32+
* Stopped `SparseFieldsetsMixin` interpretting invalid fields query parameter (e.g. invalidfields[entries]=blog,headline)
3033

3134
## [3.2.0] - 2020-08-26
3235

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,36 @@
11
import pytest
22
from django.urls import reverse
3+
from rest_framework import status
34

45
pytestmark = pytest.mark.django_db
56

67

7-
def test_sparse_fieldset_ordered_dict_error(multiple_entries, client):
8+
def test_sparse_fieldset_valid_fields(client, entry):
89
base_url = reverse('entry-list')
9-
querystring = '?fields[entries]=blog,headline'
10-
# RuntimeError: OrderedDict mutated during iteration
11-
response = client.get(base_url + querystring)
12-
assert response.status_code == 200 # succeed if we didn't fail due to the above RuntimeError
10+
response = client.get(base_url, data={'fields[entries]': 'blog,headline'})
11+
assert response.status_code == status.HTTP_200_OK
12+
data = response.json()['data']
13+
14+
assert len(data) == 1
15+
entry = data[0]
16+
assert entry['attributes'].keys() == {'headline'}
17+
assert entry['relationships'].keys() == {'blog'}
18+
19+
20+
@pytest.mark.parametrize("fields_param", ['invalidfields[entries]', 'fieldsinvalid[entries'])
21+
def test_sparse_fieldset_invalid_fields_parameter(client, entry, fields_param):
22+
"""
23+
Test that invalid fields query parameter is not processed by sparse fieldset.
24+
25+
rest_framework_json_api.filters.QueryParameterValidationFilter takes care of error
26+
handling in such a case.
27+
"""
28+
base_url = reverse('entry-list')
29+
response = client.get(base_url, data={'invalidfields[entries]': 'blog,headline'})
30+
assert response.status_code == status.HTTP_200_OK
31+
data = response.json()['data']
32+
33+
assert len(data) == 1
34+
entry = data[0]
35+
assert entry['attributes'].keys() != {'headline'}
36+
assert entry['relationships'].keys() != {'blog'}

rest_framework_json_api/serializers.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ def __init__(self, *args, **kwargs):
7171
)
7272
try:
7373
param_name = next(
74-
key for key in request.query_params if sparse_fieldset_query_param in key
74+
key for key in request.query_params if sparse_fieldset_query_param == key
7575
)
7676
except StopIteration:
7777
pass

0 commit comments

Comments
 (0)