forked from django-json-api/django-rest-framework-json-api
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathtest_renderer_class_methods.py
149 lines (116 loc) · 4.29 KB
/
test_renderer_class_methods.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
import pytest
from django.contrib.auth import get_user_model
from rest_framework_json_api import serializers
from rest_framework_json_api.renderers import JSONRenderer
from rest_framework_json_api.utils import get_serializer_fields
pytestmark = pytest.mark.django_db
class ResourceSerializer(serializers.ModelSerializer):
version = serializers.SerializerMethodField()
def get_version(self, obj):
return "1.0.0"
class Meta:
fields = ("username",)
meta_fields = ("version",)
model = get_user_model()
def test_build_json_resource_obj():
resource = {"username": "Alice", "version": "1.0.0"}
serializer = ResourceSerializer(data={"username": "Alice"})
serializer.is_valid()
resource_instance = serializer.save()
output = {
"type": "user",
"id": "1",
"attributes": {"username": "Alice"},
"meta": {"version": "1.0.0"},
}
assert (
JSONRenderer.build_json_resource_obj(
get_serializer_fields(serializer),
resource,
resource_instance,
"user",
serializer,
)
== output
)
def test_can_override_methods():
"""
Make sure extract_attributes and extract_relationships can be overriden.
"""
resource = {"username": "Alice", "version": "1.0.0"}
serializer = ResourceSerializer(data={"username": "Alice"})
serializer.is_valid()
resource_instance = serializer.save()
output = {
"type": "user",
"id": "1",
"attributes": {"username": "Alice"},
"meta": {"version": "1.0.0"},
}
class CustomRenderer(JSONRenderer):
extract_attributes_was_overriden = False
extract_relationships_was_overriden = False
@classmethod
def extract_attributes(cls, fields, resource):
cls.extract_attributes_was_overriden = True
return super().extract_attributes(fields, resource)
@classmethod
def extract_relationships(cls, fields, resource, resource_instance):
cls.extract_relationships_was_overriden = True
return super().extract_relationships(fields, resource, resource_instance)
assert (
CustomRenderer.build_json_resource_obj(
get_serializer_fields(serializer),
resource,
resource_instance,
"user",
serializer,
)
== output
)
assert CustomRenderer.extract_attributes_was_overriden
assert CustomRenderer.extract_relationships_was_overriden
def test_extract_attributes():
fields = {
"id": serializers.Field(),
"username": serializers.Field(),
"deleted": serializers.ReadOnlyField(),
}
resource = {"id": 1, "deleted": None, "username": "jerel"}
expected = {"username": "jerel", "deleted": None}
assert sorted(JSONRenderer.extract_attributes(fields, resource)) == sorted(
expected
), "Regular fields should be extracted"
assert (
JSONRenderer.extract_attributes(fields, {}) == {}
), "Should not extract read_only fields on empty serializer"
def test_extract_meta():
serializer = ResourceSerializer(data={"username": "jerel", "version": "1.0.0"})
serializer.is_valid()
expected = {
"version": "1.0.0",
}
assert JSONRenderer.extract_meta(serializer, serializer.data) == expected
class ExtractRootMetaResourceSerializer(ResourceSerializer):
def get_root_meta(self, resource, many):
if many:
return {"foo": "meta-many-value"}
else:
return {"foo": "meta-value"}
class InvalidExtractRootMetaResourceSerializer(ResourceSerializer):
def get_root_meta(self, resource, many):
return "not a dict"
def test_extract_root_meta():
serializer = ExtractRootMetaResourceSerializer()
expected = {
"foo": "meta-value",
}
assert JSONRenderer.extract_root_meta(serializer, {}) == expected
def test_extract_root_meta_many():
serializer = ExtractRootMetaResourceSerializer(many=True)
expected = {"foo": "meta-many-value"}
assert JSONRenderer.extract_root_meta(serializer, {}) == expected
def test_extract_root_meta_invalid_meta():
serializer = InvalidExtractRootMetaResourceSerializer()
with pytest.raises(AssertionError):
JSONRenderer.extract_root_meta(serializer, {})