aboutsummaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorTrygve Aaberge <trygveaa@gmail.com>2023-10-15 14:15:50 +0200
committerTrygve Aaberge <trygveaa@gmail.com>2024-02-18 11:32:54 +0100
commitf8fc75bc34565364591515eb8c87cacc8ddeb35f (patch)
treeb7512baa50c0becfd863217fbca37bbd1dbb7bfd /tests
parentcbef2d00b12ea4b72b382508ff9b044e96f44f4a (diff)
downloadwee-slack-f8fc75bc34565364591515eb8c87cacc8ddeb35f.tar.gz
Add tests for attachments and fix rendering bugs
Diffstat (limited to 'tests')
-rw-r--r--tests/conftest.py41
-rw-r--r--tests/test_render_attachments.py642
-rw-r--r--tests/test_render_blocks.py2
3 files changed, 680 insertions, 5 deletions
diff --git a/tests/conftest.py b/tests/conftest.py
index 33e44de..d1cf16a 100644
--- a/tests/conftest.py
+++ b/tests/conftest.py
@@ -4,7 +4,7 @@ import importlib
import importlib.machinery
import json
import sys
-from typing import TYPE_CHECKING, Union
+from typing import TYPE_CHECKING, Dict, Union
import pytest
@@ -49,6 +49,10 @@ from slack.slack_user import SlackUser
from slack.slack_workspace import SlackWorkspace
from slack.task import Future
+config_values: Dict[str, str] = {
+ "replace_space_in_nicks_with": "_",
+}
+
def config_new_option(
config_file: str,
@@ -69,15 +73,30 @@ def config_new_option(
callback_delete: str,
callback_delete_data: str,
) -> str:
+ if name not in config_values and default_value is not None:
+ config_values[name] = default_value
return name
+def config_option_set(option: str, value: str, run_callback: int) -> int:
+ # TODO: special values
+ old_value = config_values.get(option)
+ if value == old_value:
+ return weechat.WEECHAT_CONFIG_OPTION_SET_OK_SAME_VALUE
+ config_values[option] = value
+ return weechat.WEECHAT_CONFIG_OPTION_SET_OK_CHANGED
+
+
+def config_boolean(option: str) -> int:
+ return config_values.get(option) == "True"
+
+
def config_integer(option: str) -> int:
- return 1
+ return int(config_values.get(option, 0))
def config_string(option: str) -> str:
- return "_"
+ return config_values.get(option, "")
def config_color(option: str) -> str:
@@ -88,11 +107,23 @@ def color(option: str) -> str:
return f"<[color:{option}]>"
+def info_get(info_name: str, arguments: str):
+ if info_name == "color_rgb2term":
+ return arguments
+ elif info_name == "weechat_data_dir":
+ return "."
+ else:
+ return ""
+
+
weechat.config_new_option = config_new_option
+weechat.config_option_set = config_option_set
+weechat.config_boolean = config_boolean
weechat.config_integer = config_integer
weechat.config_string = config_string
weechat.config_color = config_color
weechat.color = color
+weechat.info_get = info_get
shared.weechat_version = 0x03080000
shared.weechat_callbacks = {}
@@ -103,6 +134,8 @@ color_user_mention = "<[color:<[config_color:user_mention]>]>"
color_usergroup_mention = "<[color:<[config_color:usergroup_mention]>]>"
color_reset = "<[color:reset]>"
+workspace_id = "T0FC8BFQR"
+
with open("mock_data/slack_users_info_person.json") as f:
user_test1_info_response: SlackUserInfoSuccessResponse[SlackUserInfo] = json.loads(
f.read()
@@ -122,7 +155,7 @@ with open("mock_data/slack_conversations_info_channel_public.json") as f:
def workspace():
shared.config = SlackConfig()
w = SlackWorkspace("workspace_name")
- w.id = "T0FC8BFQR"
+ w.id = workspace_id
user_test1 = SlackUser(w, user_test1_info)
user_test1_future = Future[SlackUser]()
diff --git a/tests/test_render_attachments.py b/tests/test_render_attachments.py
new file mode 100644
index 0000000..4a23b5a
--- /dev/null
+++ b/tests/test_render_attachments.py
@@ -0,0 +1,642 @@
+from __future__ import annotations
+
+from typing import TYPE_CHECKING, Any, List
+
+import pytest
+
+from slack.shared import shared
+from slack.slack_message import SlackMessage
+from tests.conftest import (
+ channel_public_id,
+ color_reset,
+ color_user_mention,
+ resolve_pending_message_item,
+ user_test1_id,
+ workspace_id,
+)
+
+if TYPE_CHECKING:
+ from typing_extensions import NotRequired, TypedDict
+else:
+ TypedDict = object
+
+
+class Case(TypedDict):
+ input_message: Any
+ input_text_before: str
+ output: str
+ link_previews: NotRequired[bool]
+
+
+cases: List[Case] = [
+ {
+ "input_message": {
+ "attachments": [
+ {
+ "title": "Title",
+ }
+ ]
+ },
+ "input_text_before": "",
+ "output": "| Title",
+ },
+ {
+ "input_message": {
+ "attachments": [
+ {
+ "title": "Title",
+ }
+ ]
+ },
+ "input_text_before": "Text before",
+ "output": "\n".join(
+ [
+ "",
+ "| Title",
+ ]
+ ),
+ },
+ {
+ "input_message": {
+ "attachments": [
+ {
+ "title": "Title1",
+ },
+ {
+ "title": "Title2",
+ },
+ ]
+ },
+ "input_text_before": "Text before",
+ "output": "\n".join(
+ [
+ "",
+ "| Title1",
+ "| Title2",
+ ]
+ ),
+ },
+ {
+ "input_message": {
+ "attachments": [
+ {
+ "title": "Title",
+ "text": "Attachment text",
+ "title_link": "http://title.link",
+ "from_url": "http://from.url",
+ "fallback": "Fallback",
+ }
+ ]
+ },
+ "input_text_before": "",
+ "output": "\n".join(
+ [
+ "| Title (http://title.link)",
+ "| http://from.url",
+ "| Attachment text",
+ ]
+ ),
+ },
+ {
+ "input_message": {
+ "attachments": [
+ {
+ "title": "Title",
+ "text": "Attachment text",
+ "title_link": "http://title.link",
+ "image_url": "http://image.url",
+ "fallback": "Fallback",
+ }
+ ]
+ },
+ "input_text_before": "",
+ "output": "\n".join(
+ [
+ "| Title (http://title.link)",
+ "| Attachment text",
+ "| http://image.url",
+ ]
+ ),
+ },
+ {
+ "input_message": {
+ "attachments": [
+ {
+ "title": "Title",
+ "text": "Attachment text",
+ "title_link": "http://link1",
+ "from_url": "http://link2",
+ "image_url": "http://link3",
+ }
+ ]
+ },
+ "input_text_before": "http://link1 http://link2 http://link3",
+ "output": "\n".join(
+ [
+ "",
+ "| Title",
+ "| Attachment text",
+ ]
+ ),
+ },
+ {
+ "input_message": {
+ "attachments": [
+ {
+ "title": "Title",
+ "text": "Attachment text",
+ "title_link": "http://link",
+ "from_url": "http://link",
+ "image_url": "http://link",
+ }
+ ]
+ },
+ "input_text_before": "",
+ "output": "\n".join(
+ [
+ "| Title (http://link)",
+ "| Attachment text",
+ ]
+ ),
+ },
+ {
+ "input_message": {
+ "attachments": [
+ {
+ "title": "Title",
+ "text": "Attachment text",
+ "from_url": "http://link",
+ "image_url": "http://link",
+ }
+ ]
+ },
+ "input_text_before": "",
+ "output": "\n".join(
+ [
+ "| Title",
+ "| http://link",
+ "| Attachment text",
+ ]
+ ),
+ },
+ {
+ "input_message": {
+ "attachments": [
+ {
+ "title": "Title",
+ "text": "Attachment text\n\n\nWith multiple lines",
+ }
+ ]
+ },
+ "input_text_before": "",
+ "output": "\n".join(
+ [
+ "| Title",
+ "| Attachment text",
+ "| With multiple lines",
+ ]
+ ),
+ },
+ {
+ "input_message": {
+ "attachments": [
+ {
+ "title": "Title",
+ "author_name": "Author",
+ "pretext": "Pretext",
+ "text": "Attachment text",
+ "title_link": "http://title.link",
+ "from_url": "http://from.url",
+ }
+ ]
+ },
+ "input_text_before": "",
+ "output": "\n".join(
+ [
+ "| Pretext",
+ "| Author: Title (http://title.link)",
+ "| http://from.url",
+ "| Attachment text",
+ ]
+ ),
+ },
+ {
+ "input_message": {
+ "attachments": [
+ {
+ "author_name": "Author",
+ "text": "Attachment text",
+ "title_link": "http://title.link",
+ "from_url": "http://from.url",
+ }
+ ]
+ },
+ "input_text_before": "",
+ "output": "\n".join(
+ [
+ "| http://from.url",
+ "| Author: Attachment text",
+ ]
+ ),
+ },
+ {
+ "input_message": {
+ "attachments": [
+ {
+ "fallback": "Fallback",
+ }
+ ]
+ },
+ "input_text_before": "",
+ "output": "| Fallback",
+ },
+ {
+ "input_message": {
+ "attachments": [
+ {
+ "fallback": "Fallback",
+ "title_link": "http://link",
+ }
+ ]
+ },
+ "input_text_before": "http://link",
+ "output": "",
+ },
+ {
+ "input_message": {
+ "attachments": [
+ {
+ "fallback": "Fallback",
+ "from_url": "http://link",
+ }
+ ]
+ },
+ "input_text_before": "http://link",
+ "output": "",
+ },
+ {
+ "input_message": {
+ "attachments": [
+ {
+ "fallback": "Fallback",
+ "image_url": "http://link",
+ }
+ ]
+ },
+ "input_text_before": "http://link",
+ "output": "",
+ },
+ {
+ "input_message": {
+ "attachments": [{"text": "Some message", "footer": "Thread in #general"}]
+ },
+ "input_text_before": "",
+ "output": "\n".join(
+ [
+ "| Some message",
+ "| Thread in #general",
+ ]
+ ),
+ },
+ {
+ "input_message": {
+ "attachments": [
+ {
+ "ts": 1584986782,
+ "text": "Some message",
+ "footer": "Thread in #general",
+ }
+ ]
+ },
+ "input_text_before": "",
+ "output": "\n".join(
+ [
+ "| Some message",
+ "| Thread in #general | Mar 23, 2020",
+ ]
+ ),
+ },
+ {
+ "input_message": {
+ "attachments": [
+ {
+ "ts": "1584986782.261400",
+ "text": "Some message",
+ "footer": "Thread in #general",
+ }
+ ]
+ },
+ "input_text_before": "",
+ "output": "\n".join(
+ [
+ "| Some message",
+ "| Thread in #general | Mar 23, 2020",
+ ]
+ ),
+ },
+ {
+ "input_message": {
+ "attachments": [
+ {
+ "text": "Original message",
+ "files": [
+ {
+ "title": "File",
+ "url_private": "http://link",
+ }
+ ],
+ }
+ ]
+ },
+ "input_text_before": "",
+ "output": "\n".join(
+ [
+ "| Original message",
+ "| http://link (File)",
+ ]
+ ),
+ },
+ {
+ "input_message": {
+ "attachments": [
+ {
+ "title": "Title",
+ "fields": [
+ {
+ "title": "First field title",
+ "value": "First field value",
+ },
+ {
+ "title": "",
+ "value": "Second field value",
+ },
+ ],
+ }
+ ]
+ },
+ "input_text_before": "",
+ "output": "\n".join(
+ [
+ "| Title",
+ "| First field title: First field value",
+ "| Second field value",
+ ]
+ ),
+ },
+ {
+ "input_message": {
+ "attachments": [
+ {
+ "title": "First attachment title",
+ "text": "First attachment text",
+ "title_link": "http://title.link.1",
+ "from_url": "http://from.url.1",
+ },
+ {
+ "title": "Second attachment title",
+ "text": "Second attachment text",
+ "title_link": "http://title.link.2",
+ "from_url": "http://from.url.2",
+ },
+ ]
+ },
+ "input_text_before": "",
+ "output": "\n".join(
+ [
+ "| First attachment title (http://title.link.1)",
+ "| http://from.url.1",
+ "| First attachment text",
+ "| Second attachment title (http://title.link.2)",
+ "| http://from.url.2",
+ "| Second attachment text",
+ ]
+ ),
+ },
+ {
+ "input_message": {
+ "attachments": [
+ {
+ "title": "Title",
+ "color": "ff0000",
+ }
+ ]
+ },
+ "input_text_before": "",
+ "output": "\n".join(
+ [
+ "<[color:16711680]>|<[color:reset]> Title",
+ ]
+ ),
+ },
+ {
+ "input_message": {
+ "attachments": [
+ {
+ "title": "Title",
+ "color": "#ff0000",
+ }
+ ]
+ },
+ "input_text_before": "",
+ "output": "\n".join(
+ [
+ "<[color:16711680]>|<[color:reset]> Title",
+ ]
+ ),
+ },
+ {
+ "input_message": {
+ "attachments": [{"text": "Attachment text", "is_app_unfurl": True}]
+ },
+ "input_text_before": "",
+ "output": "| Attachment text",
+ "link_previews": True,
+ },
+ {
+ "input_message": {"attachments": [{"text": "Attachment text"}]},
+ "input_text_before": "",
+ "output": "| Attachment text",
+ "link_previews": False,
+ },
+ {
+ "input_message": {
+ "attachments": [{"text": "Attachment text", "is_app_unfurl": True}]
+ },
+ "input_text_before": "",
+ "output": "",
+ "link_previews": False,
+ },
+ {
+ "input_message": {
+ "attachments": [
+ {
+ "id": 1,
+ "ts": 1697480778,
+ "fallback": "title &amp; &lt;asd&gt;",
+ "text": "text &amp; &lt;asd&gt;",
+ "pretext": "pretext &amp; &lt;asd&gt;",
+ "title": "title &amp; &lt;asd&gt;",
+ "title_link": "https://title.link/?x=<x>&z=z",
+ "author_name": "author_name &amp; &lt;asd&gt;",
+ "from_url": "https://from.url/?x=<x>&z=z",
+ "image_url": "https://image.url/?x=<x>&z=z",
+ "footer": "footer &amp; &lt;asd&gt;",
+ "fields": [
+ {
+ "value": "field value &amp; &lt;asd&gt;",
+ "title": "field title &amp; &lt;asd&gt;",
+ "short": False,
+ },
+ {
+ "value": f"field value mention <@{user_test1_id}>",
+ "title": f"field title mention &lt;@{user_test1_id}&gt;",
+ "short": False,
+ },
+ ],
+ },
+ {
+ "id": 2,
+ "blocks": [
+ {
+ "type": "rich_text",
+ "block_id": "IQm+Q",
+ "elements": [
+ {
+ "type": "rich_text_preformatted",
+ "elements": [
+ {
+ "type": "text",
+ "text": "block rich_text_preformatted & <asd>",
+ }
+ ],
+ }
+ ],
+ },
+ {
+ "type": "rich_text",
+ "block_id": "a5bVo",
+ "elements": [
+ {
+ "type": "rich_text_section",
+ "elements": [
+ {
+ "type": "text",
+ "text": "block rich_text_section & <asd> ",
+ },
+ {
+ "type": "link",
+ "url": "https://block.link?x=<x>&z=z",
+ "style": {"code": True},
+ },
+ ],
+ }
+ ],
+ },
+ {
+ "type": "rich_text",
+ "block_id": "FeChA",
+ "elements": [
+ {
+ "type": "rich_text_section",
+ "elements": [
+ {"type": "user", "user_id": user_test1_id},
+ {"type": "text", "text": ": <@ASD>"},
+ ],
+ }
+ ],
+ },
+ ],
+ "fallback": "[no preview available]",
+ },
+ ]
+ },
+ "input_text_before": "",
+ "output": "\n".join(
+ [
+ "| pretext & <asd>",
+ "| author_name & <asd>: title & <asd> (https://title.link/?x=<x>&z=z)",
+ "| https://from.url/?x=<x>&z=z",
+ "| text & <asd>",
+ "| https://image.url/?x=<x>&z=z",
+ "| field title & <asd>: field value & <asd>",
+ f"| field title mention <@{user_test1_id}>: field value mention {color_user_mention}@Test_1{color_reset}",
+ "| footer & <asd> | Oct 16, 2023",
+ "| ```",
+ "| block rich_text_preformatted & <asd>",
+ "| ```",
+ "| block rich_text_section & <asd> `https://block.link?x=<x>&z=z`",
+ f"| {color_user_mention}@Test_1{color_reset}: <@ASD>",
+ ]
+ ),
+ },
+ {
+ "input_message": {
+ "attachments": [
+ {
+ "from_url": "https://from.url",
+ "ts": "1697393234.859799",
+ "author_id": user_test1_id,
+ "channel_id": channel_public_id,
+ "channel_team": workspace_id,
+ "is_msg_unfurl": True,
+ "id": 1,
+ "fallback": "[October 15th, 2023 11:07 AM] username: fallback text",
+ "text": "text",
+ "author_name": "Author name",
+ "author_link": f"https://wee-slack-test.slack.com/team/{user_test1_id}",
+ "mrkdwn_in": ["text"],
+ "footer": "Slack Conversation",
+ }
+ ]
+ },
+ "input_text_before": "",
+ "output": "\n".join(
+ [
+ "| https://from.url",
+ "| Author name: text",
+ "| Posted in <[color:chat_channel]>#channel1<[color:reset]> | Oct 15, 2023",
+ ]
+ ),
+ },
+ {
+ "input_message": {
+ "attachments": [
+ {
+ "from_url": "https://from.url",
+ "ts": "1697393234.859799",
+ "author_id": user_test1_id,
+ "channel_id": channel_public_id,
+ "channel_team": workspace_id,
+ "is_msg_unfurl": True,
+ "is_reply_unfurl": True,
+ "id": 1,
+ "fallback": "[October 15th, 2023 11:07 AM] username: fallback text",
+ "text": "text",
+ "author_name": "Author name",
+ "author_link": f"https://wee-slack-test.slack.com/team/{user_test1_id}",
+ "mrkdwn_in": ["text"],
+ "footer": "Thread in Slack Conversation",
+ }
+ ]
+ },
+ "input_text_before": "",
+ "output": "\n".join(
+ [
+ "| https://from.url",
+ "| Author name: text",
+ "| From a thread in <[color:chat_channel]>#channel1<[color:reset]> | Oct 15, 2023",
+ ]
+ ),
+ },
+]
+
+
+@pytest.mark.parametrize("case", cases)
+def test_render_attachments(case: Case, message1_in_channel_public: SlackMessage):
+ shared.config.look.display_link_previews.value = case.get("link_previews", True)
+ message1_in_channel_public.update_message_json(case["input_message"])
+ parsed = message1_in_channel_public._render_attachments( # pyright: ignore [reportPrivateUsage]
+ [case["input_text_before"]]
+ )
+ resolved = "".join(resolve_pending_message_item(item) for item in parsed)
+ assert resolved == case["output"]
diff --git a/tests/test_render_blocks.py b/tests/test_render_blocks.py
index fedbab6..cd5442e 100644
--- a/tests/test_render_blocks.py
+++ b/tests/test_render_blocks.py
@@ -138,7 +138,7 @@ cases: List[Case] = [
"block code",
"more code",
"```",
- f"{color_user_mention}@Test_1{color_reset}: :open_mouth:",
+ f"{color_user_mention}@Test_1{color_reset}: 😮",
],
},
{