from __future__ import annotations
from typing import TYPE_CHECKING, List
import pytest
from slack.shared import shared
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]> "
"link (https://vg.no)",
"1. number",
"2. list",
"> some quote",
"> more quote",
"`inline code`",
"```",
"block code",
"more code",
"```",
f"{color_user_mention}@Test_1{color_reset}: 😮",
],
},
{
"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]>"
],
},
{
"blocks": [
{
"type": "rich_text",
"block_id": "tm5d+",
"elements": [
{
"type": "rich_text_section",
"elements": [
{
"type": "text",
"text": "foo",
"style": {"italic": True, "code": True},
},
{
"type": "text",
"text": "bar",
"style": {"bold": True, "code": True},
},
],
}
],
}
],
"rendered": [
"<[color:italic]>`_foo_<[color:-italic]><[color:bold]>*bar*`<[color:-bold]>"
],
},
{
"blocks": [
{
"type": "rich_text",
"block_id": "A+l5x",
"elements": [
{
"type": "rich_text_section",
"elements": [
{
"type": "text",
"text": "all styles",
"style": {
"bold": True,
"italic": True,
"strike": True,
"code": True,
},
}
],
}
],
}
],
"rendered": [
"<[color:bold]><[color:italic]>`*_~all styles~_*`<[color:-italic]><[color:-bold]>"
],
},
{
"blocks": [
{
"type": "rich_text",
"block_id": "M23r4",
"elements": [
{
"type": "rich_text_section",
"elements": [{"type": "color", "value": "#FFAA00"}],
}
],
}
],
"rendered": ["#FFAA00 <[color:16755200]>■<[color:reset]>"],
},
]
@pytest.mark.parametrize("case", cases)
def test_render_blocks(case: Case, message1_in_channel_public: SlackMessage):
shared.config.look.render_url_as.value = "${text} (${url})"
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"]