|
14 | 14 | ApiErrorResponse, |
15 | 15 | CreateHtmlCssImageRequest, |
16 | 16 | CreateTemplatedImageRequest, |
| 17 | + TemplatedBatchImageOptions, |
17 | 18 | CreateUrlImageRequest, |
18 | 19 | DeleteImageSuccessResponse, |
19 | 20 | HtmlCssToImageClient, |
@@ -48,6 +49,57 @@ def make_client(self, handler): |
48 | 49 | http_client=http_client, |
49 | 50 | ) |
50 | 51 |
|
| 52 | + def test_template_batch_preserves_inheritance_and_nested_null(self): |
| 53 | + defaults = TemplatedBatchImageOptions( |
| 54 | + template_id="t-card", template_version=3, format="webp", |
| 55 | + template_values={"brand": {"name": "Acme", "color": "red"}}, |
| 56 | + ) |
| 57 | + variation = TemplatedBatchImageOptions( |
| 58 | + template_id="t-other", |
| 59 | + template_values={"brand": {"color": None}, "tags": [], "active": False}, |
| 60 | + ) |
| 61 | + |
| 62 | + def handler(request): |
| 63 | + self.assertEqual(str(request.url), "https://hcti.io/v1/image/batch/templated") |
| 64 | + self.assertEqual(request.method, "POST") |
| 65 | + self.assertEqual(json.loads(request.content), { |
| 66 | + "default_options": { |
| 67 | + "template_id": "t-card", "template_version": 3, "format": "webp", |
| 68 | + "template_values": {"brand": {"name": "Acme", "color": "red"}}, |
| 69 | + }, |
| 70 | + "variations": [{}, { |
| 71 | + "template_id": "t-other", |
| 72 | + "template_values": {"brand": {"color": None}, "tags": [], "active": False}, |
| 73 | + }], |
| 74 | + }) |
| 75 | + return httpx.Response(200, json={"images": [ |
| 76 | + {"id": "two", "url": "two"}, {"id": "one", "url": "one"}, |
| 77 | + ]}) |
| 78 | + |
| 79 | + client = self.make_client(handler) |
| 80 | + result = client.create_templated_image_batch([TemplatedBatchImageOptions(), variation], defaults) |
| 81 | + self.assertTrue(result.success) |
| 82 | + self.assertEqual([image.id for image in result.images], ["two", "one"]) |
| 83 | + self.assertEqual(variation.template_version, None) |
| 84 | + self.assertEqual(defaults.template_values["brand"]["color"], "red") |
| 85 | + |
| 86 | + def test_template_batch_empty_and_error(self): |
| 87 | + calls = [] |
| 88 | + |
| 89 | + def handler(request): |
| 90 | + calls.append(request) |
| 91 | + self.assertNotIn("default_options", json.loads(request.content)) |
| 92 | + return httpx.Response(400, json={"error": "Bad Request", "message": "Invalid template"}) |
| 93 | + |
| 94 | + client = self.make_client(handler) |
| 95 | + self.assertTrue(client.create_templated_image_batch([]).success) |
| 96 | + self.assertEqual(calls, []) |
| 97 | + result = client.create_templated_image_batch([TemplatedBatchImageOptions(template_id="t-missing")]) |
| 98 | + self.assertFalse(result.success) |
| 99 | + self.assertEqual(result.message, "Invalid template") |
| 100 | + with self.assertRaises(TypeError): |
| 101 | + client.create_templated_image_batch([CreateUrlImageRequest(url="https://example.com")]) |
| 102 | + |
51 | 103 | def test_request_overrides_serialize_enums_and_stay_out_of_signed_urls(self): |
52 | 104 | rules = [RequestOverride( |
53 | 105 | action=RequestOverrideAction.BLOCK, |
|
0 commit comments