From 027a287a7d93c3657eb0beb946fba52ac2964b41 Mon Sep 17 00:00:00 2001 From: Kazuhiro Sera Date: Sat, 27 May 2023 09:38:36 +0900 Subject: [PATCH] Fix #1369 ImageBlock title parsing defaults to incorrect behaviour when given a string (#1374) --- slack_sdk/models/blocks/blocks.py | 17 ++++++++- tests/slack_sdk/models/test_blocks.py | 54 +++++++++++++++++++++++++++ 2 files changed, 69 insertions(+), 2 deletions(-) diff --git a/slack_sdk/models/blocks/blocks.py b/slack_sdk/models/blocks/blocks.py index c38ecb0c0..22ed4f31f 100644 --- a/slack_sdk/models/blocks/blocks.py +++ b/slack_sdk/models/blocks/blocks.py @@ -15,6 +15,7 @@ from .block_elements import ImageElement from .block_elements import InputInteractiveElement from .block_elements import InteractiveElement +from ...errors import SlackObjectFormationError # ------------------------------------------------- @@ -216,7 +217,7 @@ def __init__( *, image_url: str, alt_text: str, - title: Optional[Union[str, dict, TextObject]] = None, + title: Optional[Union[str, dict, PlainTextObject]] = None, block_id: Optional[str] = None, **others: dict, ): @@ -240,7 +241,19 @@ def __init__( self.image_url = image_url self.alt_text = alt_text - self.title = TextObject.parse(title) + parsed_title = None + if title is not None: + if isinstance(title, str): + parsed_title = PlainTextObject(text=title) + elif isinstance(title, dict): + if title.get("type") != PlainTextObject.type: + raise SlackObjectFormationError(f"Unsupported type for title in an image block: {title.get('type')}") + parsed_title = PlainTextObject(text=title.get("text"), emoji=title.get("emoji")) + elif isinstance(title, PlainTextObject): + parsed_title = title + else: + raise SlackObjectFormationError(f"Unsupported type for title in an image block: {type(title)}") + self.title = parsed_title @JsonValidator(f"image_url attribute cannot exceed {image_url_max_length} characters") def _validate_image_url_length(self): diff --git a/tests/slack_sdk/models/test_blocks.py b/tests/slack_sdk/models/test_blocks.py index 9eb12a8a1..5461ba8d3 100644 --- a/tests/slack_sdk/models/test_blocks.py +++ b/tests/slack_sdk/models/test_blocks.py @@ -251,6 +251,60 @@ def test_document(self): } self.assertDictEqual(input, ImageBlock(**input).to_dict()) + def test_issue_1369_title_type(self): + self.assertEqual( + "plain_text", + ImageBlock( + image_url="https://example.com/", + alt_text="example", + title="example", + ).title.type, + ) + + self.assertEqual( + "plain_text", + ImageBlock( + image_url="https://example.com/", + alt_text="example", + title={ + "type": "plain_text", + "text": "Please enjoy this photo of a kitten", + }, + ).title.type, + ) + + self.assertEqual( + "plain_text", + ImageBlock( + image_url="https://example.com/", + alt_text="example", + title=PlainTextObject(text="example"), + ).title.type, + ) + + with self.assertRaises(SlackObjectFormationError): + self.assertEqual( + "plain_text", + ImageBlock( + image_url="https://example.com/", + alt_text="example", + title={ + "type": "mrkdwn", + "text": "Please enjoy this photo of a kitten", + }, + ).title.type, + ) + + with self.assertRaises(SlackObjectFormationError): + self.assertEqual( + "plain_text", + ImageBlock( + image_url="https://example.com/", + alt_text="example", + title=MarkdownTextObject(text="example"), + ).title.type, + ) + def test_json(self): self.assertDictEqual( {