Skip to content

Commit 98ba50a

Browse files
committed
Add tests for fk serialization
1 parent 6711164 commit 98ba50a

File tree

5 files changed

+97
-5
lines changed

5 files changed

+97
-5
lines changed

djangocms_rest/plugin_rendering.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
from cms.utils.plugins import get_plugins
1111

1212
from djangocms_rest.serializers.placeholders import PlaceholderSerializer
13-
from djangocms_rest.serializers.plugins import base_exclude, GenericPluginSerializer
13+
from djangocms_rest.serializers.plugins import GenericPluginSerializer, base_exclude
1414
from djangocms_rest.serializers.utils.cache import (
1515
get_placeholder_rest_cache,
1616
set_placeholder_rest_cache,

djangocms_rest/serializers/plugins.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,10 @@
99
from cms.models import CMSPlugin
1010
from cms.plugin_pool import plugin_pool
1111

12-
from djangocms_rest.utils import get_absolute_frontend_url
1312
from rest_framework import serializers
1413

14+
from djangocms_rest.utils import get_absolute_frontend_url
15+
1516

1617
def serialize_fk(
1718
request: HttpRequest,
@@ -39,13 +40,14 @@ def serialize_fk(
3940
if hasattr(related_model, "get_api_endpoint"):
4041
if obj is None:
4142
obj = related_model.objects.filter(pk=pk).first()
42-
return get_absolute_frontend_url(request, obj.get_api_endpoint())
43+
if obj:
44+
return get_absolute_frontend_url(request, obj.get_api_endpoint())
4345

4446
# Second choice: Use DRF naming conventions to build the default API URL for the related model
4547
model_name = related_model._meta.model_name
4648
try:
4749
return get_absolute_frontend_url(
48-
request, reverse(f"{model_name}_details", args=(pk,))
50+
request, reverse(f"{model_name}-detail", args=(pk,))
4951
)
5052
except NoReverseMatch:
5153
pass

djangocms_rest/views.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@
2020
)
2121
from djangocms_rest.serializers.placeholders import PlaceholderSerializer
2222
from djangocms_rest.serializers.plugins import (
23-
generate_plugin_definitions,
2423
PluginDefinitionSerializer,
24+
generate_plugin_definitions,
2525
)
2626
from djangocms_rest.utils import get_object, get_site_filtered_queryset
2727
from djangocms_rest.views_base import BaseAPIView, BaseListAPIView

tests/test_fk_serializer.py

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
from django.urls import reverse
2+
from django.utils import translation
3+
from djangocms_rest.serializers.plugins import serialize_fk, serialize_soft_refs
4+
from tests.base import BaseCMSRestTestCase
5+
from tests.test_app.models import Pizza, Topping
6+
7+
8+
# patch function
9+
def get_api_endpoint(self, language=None):
10+
if language is None:
11+
language = translation.get_language()
12+
return f"/api/{language}/pizza/{self.pk}/"
13+
14+
15+
class PlaceholdersAPITestCase(BaseCMSRestTestCase):
16+
def test_serialize_fk(self):
17+
request = self.get_request(reverse("page-root", kwargs={"language": "en"}))
18+
19+
# No get_api_endpoint method, no default api name registered
20+
fk = serialize_fk(request, Topping, pk="1")
21+
self.assertEqual(fk, "test_app.topping:1")
22+
23+
# No get_api_endpoint method, but default api name registered
24+
self.assertEqual(
25+
reverse(f"{Pizza._meta.model_name}-detail", kwargs={"pk": 1}),
26+
"/api/pizza/1/",
27+
)
28+
fk = serialize_fk(request, Pizza, pk="1")
29+
self.assertEqual(fk, "http://testserver/api/pizza/1/")
30+
31+
# With get_api_endpoint method
32+
try:
33+
Pizza.get_api_endpoint = get_api_endpoint
34+
35+
pizza = Pizza.objects.create(description="Delicious pizza")
36+
fk = serialize_fk(request, Pizza, pk=pizza.pk)
37+
self.assertEqual(fk, f"http://testserver{pizza.get_api_endpoint('en')}")
38+
39+
fk = serialize_fk(request, Pizza, pk=pizza.pk, obj=pizza)
40+
self.assertEqual(fk, f"http://testserver{pizza.get_api_endpoint('en')}")
41+
finally:
42+
del Pizza.get_api_endpoint
43+
44+
def test_serialize_soft_refs(self):
45+
request = self.get_request(reverse("page-root", kwargs={"language": "en"}))
46+
47+
pk = Pizza.objects.create(description="Delicious pizza").pk
48+
49+
# Serialize a single soft reference
50+
fk = serialize_soft_refs(
51+
request, dict(ref={"model": "test_app.pizza", "pk": pk})
52+
)
53+
self.assertEqual(fk, {"ref": f"http://testserver/api/pizza/{pk}/"})
54+
55+
fk = serialize_soft_refs(
56+
request, dict(link={"internal_link": f"test_app.pizza:{pk}"})
57+
)
58+
self.assertEqual(fk, {"link": f"http://testserver/api/pizza/{pk}/"})
59+
60+
fk = serialize_soft_refs(
61+
request, dict(attrs={"data-cms-href": f"test_app.pizza:{pk}"})
62+
)
63+
self.assertEqual(
64+
fk, {"attrs": {"data-cms-href": f"http://testserver/api/pizza/{pk}/"}}
65+
)
66+
67+
def test_serialize_soft_refs_non_resolvable(self):
68+
request = self.get_request(reverse("page-root", kwargs={"language": "en"}))
69+
70+
# Serialize a single soft reference
71+
fk = serialize_soft_refs(
72+
request, dict(ref={"model": "test_app.topping", "pk": 314})
73+
)
74+
self.assertEqual(fk, {"ref": "test_app.topping:314"})
75+
76+
fk = serialize_soft_refs(
77+
request, dict(link={"internal_link": "test_app.topping:314"})
78+
)
79+
self.assertEqual(fk, {"link": "test_app.topping:314"})
80+
81+
fk = serialize_soft_refs(request, dict(link={"file_link": "314"}))
82+
self.assertEqual(fk, {"link": "filer.file:314"})
83+
84+
fk = serialize_soft_refs(
85+
request, dict(attrs={"data-cms-href": "test_app.topping:314"})
86+
)
87+
self.assertEqual(fk, {"attrs": {"data-cms-href": "test_app.topping:314"}})

tests/urls.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@
99
"api/",
1010
include("djangocms_rest.urls"),
1111
),
12+
path(
13+
"api/pizza/<int:pk>/", lambda request, pk: f"<Pizza: {pk}>", name="pizza-detail"
14+
),
1215
path("admin/", admin.site.urls),
1316
path("", include("cms.urls")),
1417
]

0 commit comments

Comments
 (0)