|
19 | 19 | import Missing |
20 | 20 | import pytz |
21 | 21 | import unittest |
| 22 | +from unittest import mock |
22 | 23 |
|
23 | 24 |
|
24 | 25 | try: |
@@ -202,6 +203,36 @@ def test_brain_summary_includes_all_metadata_fields(self): |
202 | 203 | summary.items(), |
203 | 204 | ) |
204 | 205 |
|
| 206 | + def test_request_metadata_cache_is_reused(self): |
| 207 | + # The per-request metadata cache must take effect, so the metadata is |
| 208 | + # only computed once even when many items are serialized in the same |
| 209 | + # request (e.g. a search result or folder listing with many items). |
| 210 | + from plone.restapi.serializer import summary as summary_module |
| 211 | + |
| 212 | + self.request.other.pop("summary_serializer_metadata", None) |
| 213 | + |
| 214 | + with mock.patch.object( |
| 215 | + summary_module, |
| 216 | + "merge_serializer_metadata_utilities_data", |
| 217 | + wraps=summary_module.merge_serializer_metadata_utilities_data, |
| 218 | + ) as merge_mock: |
| 219 | + getMultiAdapter((self.doc1, self.request), ISerializeToJsonSummary)() |
| 220 | + getMultiAdapter((self.doc1, self.request), ISerializeToJsonSummary)() |
| 221 | + |
| 222 | + self.assertEqual(merge_mock.call_count, 1) |
| 223 | + |
| 224 | + def test_request_parameter_does_not_break_serialization(self): |
| 225 | + self.request.other.pop("summary_serializer_metadata", None) |
| 226 | + self.request.form["summary_serializer_metadata"] = "injected" |
| 227 | + try: |
| 228 | + summary = getMultiAdapter( |
| 229 | + (self.doc1, self.request), ISerializeToJsonSummary |
| 230 | + )() |
| 231 | + finally: |
| 232 | + del self.request.form["summary_serializer_metadata"] |
| 233 | + |
| 234 | + self.assertEqual(summary["@type"], "DXTestDocument") |
| 235 | + |
205 | 236 | def test_dx_type_summary(self): |
206 | 237 | summary = getMultiAdapter((self.doc1, self.request), ISerializeToJsonSummary)() |
207 | 238 |
|
|
0 commit comments