Skip to content

Commit 34b0fa9

Browse files
committed
Add test for preview endpoint
1 parent abee91d commit 34b0fa9

File tree

4 files changed

+65
-36
lines changed

4 files changed

+65
-36
lines changed

djangocms_rest/plugin_rendering.py

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -52,41 +52,33 @@ def serialize_cms_plugin(
5252
) -> Optional[dict[str, Any]]:
5353
if not instance or not hasattr(instance, "get_plugin_instance"):
5454
return None
55-
56-
try:
57-
plugin_instance, plugin = instance.get_plugin_instance()
58-
except (AttributeError, TypeError):
59-
return None
60-
61-
if not plugin_instance:
62-
return None
55+
plugin_instance, plugin = instance.get_plugin_instance()
6356

6457
model_cls = plugin_instance.__class__
6558
serializer_cls = getattr(plugin, "serializer_class", None)
6659
serializer_cls = serializer_cls or get_auto_model_serializer(model_cls)
60+
plugin.__class__.serializer_class = serializer_cls
6761

6862
return serializer_cls(plugin_instance, context=context).data
6963

7064

7165
# Template for a collapsable key-value pair
7266
DETAILS_TEMPLATE = (
7367
'<details open><summary><span class="key">"{key}"</span>: {open}</summary>'
74-
'<div class="indent">{value}</div></details>{close}<span class="sep">,</span>'
68+
'<div class="indent">{value}</div></details>{close}'
7569
)
7670

7771
# Template for a collapsable object/list
7872
OBJ_TEMPLATE = (
7973
"<details open><summary>{open}</summary>"
80-
'<div class="indent">{value}</div></details>{close}<span class="sep">,</span>'
74+
'<div class="indent">{value}</div></details>{close}'
8175
)
8276

8377
# Tempalte for a non-collasable object/list
84-
FIXED_TEMPLATE = (
85-
'{open}<div class="indent">{value}</div>{close}<span class="sep">,</span>'
86-
)
78+
FIXED_TEMPLATE = '{open}<div class="indent">{value}</div>{close}'
8779

8880
# Tempalte for a single line key-value pair
89-
SIMPLE_TEMPLATE = '<span class="key">"{key}"</span>: {value}<span class="sep">,</span>'
81+
SIMPLE_TEMPLATE = '<span class="key">"{key}"</span>: {value}'
9082

9183

9284
def escapestr(s: str) -> str:
@@ -147,15 +139,15 @@ def highlight_json(
147139
items.append(
148140
DETAILS_TEMPLATE.format(
149141
key=escape(field),
150-
value="".join(children),
142+
value=",".join(children),
151143
open="[",
152144
close="]",
153145
)
154146
)
155147
return {
156148
"open": "{",
157149
"close": "}",
158-
"value": "<br>".join(items),
150+
"value": ",<br>".join(items),
159151
}
160152

161153

@@ -164,7 +156,7 @@ def highlight_list(json_data: list) -> dict[str, str]:
164156
return {
165157
"open": "[",
166158
"close": "]",
167-
"value": "<br>".join(items),
159+
"value": ",<br>".join(items),
168160
}
169161

170162

djangocms_rest/static/djangocms_rest/highlight.css

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,4 @@
6262
width: fit-content;
6363
cursor: pointer;
6464
}
65-
& > .sep:last-child {
66-
display: none;
67-
}
6865
}

tests/test_app/serializers.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,12 @@ def to_representation(self, instance):
77
"id": instance.id,
88
"integer": 42,
99
"float": 3.14,
10+
"json": [
11+
{"key": "value"},
12+
{"another_key": "another_value"},
13+
[1, 2, 3, 4, 5],
14+
True,
15+
False,
16+
None,
17+
],
1018
}

tests/test_edit_endpoint.py renamed to tests/test_plugin_renderer.py

Lines changed: 48 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,25 @@
88

99
from cms import api
1010
from cms.models import PageContent
11-
from cms.toolbar.utils import get_object_edit_url
11+
from cms.toolbar.utils import get_object_edit_url, get_object_preview_url
1212

1313
from filer.models.imagemodels import Image
1414
from bs4 import BeautifulSoup
1515

1616

17+
def get_text_from_html(html, selector):
18+
soup = BeautifulSoup(html, "html.parser")
19+
element = soup.select_one(selector)
20+
if element:
21+
return (
22+
element.get_text(strip=True)
23+
.replace(",]", "]")
24+
.replace(",}", "}")
25+
.rstrip(",")
26+
)
27+
return None
28+
29+
1730
class PlaceholdersAPITestCase(BaseCMSRestTestCase):
1831
def setUp(self):
1932
super().setUp()
@@ -64,7 +77,6 @@ def setUp(self):
6477
plugin_type="DummyNumberPlugin",
6578
language="en",
6679
)
67-
self.endpoint = get_object_edit_url(self.page.get_admin_content("en"))
6880

6981
def create_image(self, filename=None, folder=None):
7082
filename = filename or "test_image.jpg"
@@ -80,23 +92,40 @@ def create_image(self, filename=None, folder=None):
8092
image_obj.save()
8193
return image_obj
8294

83-
def test_in_sync_with_api_endpoint(self):
95+
def test_edit_in_sync_with_api_endpoint(self):
8496
# Edit endpoint and api endpoint should return the same content
8597

86-
def get_text_from_html(html, selector):
87-
soup = BeautifulSoup(html, "html.parser")
88-
element = soup.select_one(selector)
89-
if element:
90-
return (
91-
element.get_text(strip=True)
92-
.replace(",]", "]")
93-
.replace(",}", "}")
94-
.rstrip(",")
95-
)
96-
return None
98+
self.client.force_login(self.user)
99+
response = self.client.get(
100+
get_object_edit_url(self.page.get_admin_content("en"))
101+
)
102+
api_response = self.client.get(
103+
reverse(
104+
"placeholder-detail",
105+
kwargs={
106+
"language": "en",
107+
"content_type_id": ContentType.objects.get_for_model(
108+
PageContent
109+
).id,
110+
"object_id": self.page.get_admin_content("en").id,
111+
"slot": "content",
112+
},
113+
)
114+
)
115+
self.assertEqual(response.status_code, 200)
116+
self.assertEqual(api_response.status_code, 200)
117+
content = response.content.decode("utf-8")
118+
json_content = json.loads(get_text_from_html(content, "div.rest-placeholder"))
119+
api_content = api_response.json()
120+
self.assertEqual(json_content, api_content)
121+
122+
def test_preview_in_sync_with_api_endpoint(self):
123+
# Edit endpoint and api endpoint should return the same content
97124

98125
self.client.force_login(self.user)
99-
response = self.client.get(self.endpoint)
126+
response = self.client.get(
127+
get_object_preview_url(self.page.get_admin_content("en"))
128+
)
100129
api_response = self.client.get(
101130
reverse(
102131
"placeholder-detail",
@@ -116,12 +145,15 @@ def get_text_from_html(html, selector):
116145

117146
json_content = json.loads(get_text_from_html(content, "div.rest-placeholder"))
118147
api_content = api_response.json()
148+
self.maxDiff = None # Allow large diffs for detailed comparison
119149
self.assertEqual(json_content, api_content)
120150

121151
def test_edit_endpoint(self):
122152
self.client.force_login(self.user)
123153

124-
response = self.client.get(self.endpoint)
154+
response = self.client.get(
155+
get_object_edit_url(self.page.get_admin_content("en"))
156+
)
125157
self.assertEqual(response.status_code, 200)
126158

127159
# Test for plugin markers

0 commit comments

Comments
 (0)