aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tests/conftest.py2
-rw-r--r--tests/test_render_blocks.py384
-rw-r--r--typings/slack_api/slack_conversations_history.pyi13
3 files changed, 393 insertions, 6 deletions
diff --git a/tests/conftest.py b/tests/conftest.py
index 4a5a762..33e44de 100644
--- a/tests/conftest.py
+++ b/tests/conftest.py
@@ -43,6 +43,7 @@ import weechat
from slack.config import SlackConfig
from slack.shared import shared
from slack.slack_conversation import SlackConversation
+from slack.slack_emoji import load_standard_emojis
from slack.slack_message import PendingMessageItem, SlackMessage
from slack.slack_user import SlackUser
from slack.slack_workspace import SlackWorkspace
@@ -95,6 +96,7 @@ weechat.color = color
shared.weechat_version = 0x03080000
shared.weechat_callbacks = {}
+shared.standard_emojis = load_standard_emojis()
color_channel_mention = "<[color:<[config_color:channel_mention]>]>"
color_user_mention = "<[color:<[config_color:user_mention]>]>"
diff --git a/tests/test_render_blocks.py b/tests/test_render_blocks.py
new file mode 100644
index 0000000..a8f918c
--- /dev/null
+++ b/tests/test_render_blocks.py
@@ -0,0 +1,384 @@
+from __future__ import annotations
+
+from typing import TYPE_CHECKING, List
+
+import pytest
+
+from slack.slack_message import SlackMessage
+from tests.conftest import (
+ color_reset,
+ color_user_mention,
+ resolve_pending_message_item,
+ user_test1_id,
+)
+
+if TYPE_CHECKING:
+ from slack_api.slack_conversations_history import SlackMessageBlock
+ from typing_extensions import TypedDict
+else:
+ TypedDict = object
+
+
+class Case(TypedDict):
+ blocks: List[SlackMessageBlock]
+ rendered: List[str]
+
+
+cases: List[Case] = [
+ {
+ "blocks": [
+ {
+ "type": "rich_text",
+ "block_id": "dhGA",
+ "elements": [
+ {
+ "type": "rich_text_section",
+ "elements": [
+ {"type": "text", "text": "normal "},
+ {
+ "type": "text",
+ "text": "bold",
+ "style": {"bold": True},
+ },
+ {"type": "text", "text": " "},
+ {
+ "type": "text",
+ "text": "italic",
+ "style": {"italic": True},
+ },
+ {"type": "text", "text": " "},
+ {
+ "type": "text",
+ "text": "strikethrough",
+ "style": {"strike": True},
+ },
+ {"type": "text", "text": " "},
+ {
+ "type": "text",
+ "text": "bold-italic-strikethrough",
+ "style": {
+ "bold": True,
+ "italic": True,
+ "strike": True,
+ },
+ },
+ {"type": "text", "text": " "},
+ {
+ "type": "link",
+ "url": "https://vg.no",
+ "text": "link",
+ },
+ {"type": "text", "text": "\n"},
+ ],
+ },
+ {
+ "type": "rich_text_list",
+ "elements": [
+ {
+ "type": "rich_text_section",
+ "elements": [{"type": "text", "text": "number"}],
+ },
+ {
+ "type": "rich_text_section",
+ "elements": [{"type": "text", "text": "list"}],
+ },
+ ],
+ "style": "ordered",
+ "indent": 0,
+ "border": 0,
+ },
+ {
+ "type": "rich_text_quote",
+ "elements": [
+ {"type": "text", "text": "some quote\nmore quote"}
+ ],
+ },
+ {
+ "type": "rich_text_section",
+ "elements": [
+ {
+ "type": "text",
+ "text": "inline code",
+ "style": {"code": True},
+ },
+ {"type": "text", "text": "\n"},
+ ],
+ },
+ {
+ "type": "rich_text_preformatted",
+ "elements": [{"type": "text", "text": "block code\nmore code"}],
+ "border": 0,
+ },
+ {
+ "type": "rich_text_section",
+ "elements": [
+ {"type": "user", "user_id": user_test1_id},
+ {"type": "text", "text": ": "},
+ {
+ "type": "emoji",
+ "name": "open_mouth",
+ "unicode": "1f62e",
+ },
+ ],
+ },
+ ],
+ }
+ ],
+ "rendered": [
+ "normal <[color:bold]>*bold*<[color:-bold]> <[color:italic]>_italic_"
+ "<[color:-italic]> ~strikethrough~ <[color:bold]><[color:italic]>"
+ "*_~bold-italic-strikethrough~_*<[color:-italic]><[color:-bold]> "
+ "https://vg.no (link)",
+ "1. number",
+ "2. list",
+ "> some quote",
+ "> more quote",
+ "`inline code`",
+ "```",
+ "block code",
+ "more code",
+ "```",
+ f"{color_user_mention}@Test_1{color_reset}: :open_mouth:",
+ ],
+ },
+ {
+ "blocks": [
+ {
+ "type": "rich_text",
+ "block_id": "D=pkP",
+ "elements": [
+ {
+ "type": "rich_text_list",
+ "elements": [
+ {
+ "type": "rich_text_section",
+ "elements": [{"type": "text", "text": "number"}],
+ }
+ ],
+ "style": "ordered",
+ "indent": 0,
+ "border": 0,
+ },
+ {
+ "type": "rich_text_list",
+ "elements": [
+ {
+ "type": "rich_text_section",
+ "elements": [{"type": "text", "text": "list"}],
+ }
+ ],
+ "style": "ordered",
+ "indent": 1,
+ "border": 0,
+ },
+ {
+ "type": "rich_text_list",
+ "elements": [
+ {
+ "type": "rich_text_section",
+ "elements": [{"type": "text", "text": "third"}],
+ }
+ ],
+ "style": "ordered",
+ "indent": 2,
+ "border": 0,
+ },
+ {
+ "type": "rich_text_list",
+ "elements": [
+ {
+ "type": "rich_text_section",
+ "elements": [
+ {"type": "text", "text": "end number list"}
+ ],
+ }
+ ],
+ "style": "ordered",
+ "indent": 0,
+ "offset": 1,
+ "border": 0,
+ },
+ {
+ "type": "rich_text_list",
+ "elements": [
+ {
+ "type": "rich_text_section",
+ "elements": [{"type": "text", "text": "bullet"}],
+ }
+ ],
+ "style": "bullet",
+ "indent": 0,
+ "border": 0,
+ },
+ {
+ "type": "rich_text_list",
+ "elements": [
+ {
+ "type": "rich_text_section",
+ "elements": [{"type": "text", "text": "list"}],
+ }
+ ],
+ "style": "bullet",
+ "indent": 1,
+ "border": 0,
+ },
+ {
+ "type": "rich_text_list",
+ "elements": [
+ {
+ "type": "rich_text_section",
+ "elements": [{"type": "text", "text": "third"}],
+ }
+ ],
+ "style": "bullet",
+ "indent": 2,
+ "border": 0,
+ },
+ {
+ "type": "rich_text_list",
+ "elements": [
+ {
+ "type": "rich_text_section",
+ "elements": [
+ {"type": "text", "text": "end bullet list"}
+ ],
+ }
+ ],
+ "style": "bullet",
+ "indent": 0,
+ "border": 0,
+ },
+ ],
+ }
+ ],
+ "rendered": [
+ "1. number",
+ " a. list",
+ " i. third",
+ "2. end number list",
+ "• bullet",
+ " ◦ list",
+ " ▪︎ third",
+ "• end bullet list",
+ ],
+ },
+ {
+ "blocks": [
+ {
+ "type": "rich_text",
+ "block_id": "usQpu",
+ "elements": [
+ {
+ "type": "rich_text_section",
+ "elements": [
+ {
+ "type": "text",
+ "text": "test ",
+ "style": {"code": True},
+ },
+ {
+ "type": "link",
+ "url": "http://asdf.de",
+ "text": "asdf.de",
+ "style": {"code": True},
+ },
+ {
+ "type": "text",
+ "text": " asdf.de:443",
+ "style": {"code": True},
+ },
+ {"type": "text", "text": "\n"},
+ ],
+ },
+ {
+ "type": "rich_text_preformatted",
+ "elements": [{"type": "text", "text": "asdf.de\nasdf.de:443"}],
+ "border": 0,
+ },
+ ],
+ }
+ ],
+ "rendered": [
+ "`test asdf.de asdf.de:443`",
+ "```",
+ "asdf.de",
+ "asdf.de:443",
+ "```",
+ ],
+ },
+ {
+ "blocks": [
+ {
+ "type": "rich_text",
+ "block_id": "vLtn",
+ "elements": [
+ {
+ "type": "rich_text_section",
+ "elements": [
+ {
+ "type": "text",
+ "text": "bold ",
+ "style": {"bold": True},
+ },
+ {
+ "type": "text",
+ "text": "code ",
+ "style": {"bold": True, "code": True},
+ },
+ {
+ "type": "text",
+ "text": "not bold ",
+ "style": {"code": True},
+ },
+ {
+ "type": "text",
+ "text": "italic",
+ "style": {"italic": True, "code": True},
+ },
+ {
+ "type": "text",
+ "text": " text",
+ "style": {"italic": True},
+ },
+ ],
+ }
+ ],
+ }
+ ],
+ "rendered": [
+ "<[color:bold]>*bold `code *<[color:-bold]>not bold <[color:italic]>_italic` text_<[color:-italic]>",
+ ],
+ },
+ {
+ "blocks": [
+ {
+ "type": "rich_text",
+ "block_id": "28L",
+ "elements": [
+ {
+ "type": "rich_text_section",
+ "elements": [
+ {
+ "type": "text",
+ "text": "bold and italic combined",
+ "style": {"bold": True, "italic": True},
+ }
+ ],
+ }
+ ],
+ }
+ ],
+ "rendered": [
+ "<[color:bold]><[color:italic]>*_bold and italic combined_*<[color:-italic]><[color:-bold]>"
+ ],
+ },
+]
+
+
+@pytest.mark.parametrize("case", cases)
+def test_unfurl_refs(case: Case, message1_in_channel_public: SlackMessage):
+ parsed = message1_in_channel_public._render_blocks( # pyright: ignore [reportPrivateUsage]
+ case["blocks"]
+ )
+ resolved = "".join(resolve_pending_message_item(item) for item in parsed)
+ assert resolved.split("\n") == case["rendered"]
diff --git a/typings/slack_api/slack_conversations_history.pyi b/typings/slack_api/slack_conversations_history.pyi
index 4f0cfa8..6799f02 100644
--- a/typings/slack_api/slack_conversations_history.pyi
+++ b/typings/slack_api/slack_conversations_history.pyi
@@ -9,10 +9,10 @@ from typing_extensions import Literal, NotRequired, TypedDict, final
@final
class SlackMessageBlockRichTextElementTextStyle(TypedDict):
- bold: bool
- italic: bool
- strike: bool
- code: bool
+ bold: NotRequired[bool]
+ italic: NotRequired[bool]
+ strike: NotRequired[bool]
+ code: NotRequired[bool]
@final
class SlackMessageBlockRichTextElementText(TypedDict):
@@ -32,7 +32,7 @@ class SlackMessageBlockRichTextElementEmoji(TypedDict):
type: Literal["emoji"]
name: str
unicode: str
- skin_tone: int
+ skin_tone: NotRequired[int]
@final
class SlackMessageBlockRichTextElementChannel(TypedDict):
@@ -75,6 +75,7 @@ class SlackMessageBlockRichTextPreformatted(TypedDict):
elements: List[
SlackMessageBlockRichTextElementText | SlackMessageBlockRichTextElementLink
]
+ border: int
@final
class SlackMessageBlockRichTextQuote(TypedDict):
@@ -87,7 +88,7 @@ class SlackMessageBlockRichTextList(TypedDict):
elements: List[SlackMessageBlockRichTextSection]
style: Literal["ordered", "bullet"]
indent: int
- offset: int
+ offset: NotRequired[int]
border: int
@final