diff --git a/dev-requirements.txt b/dev-requirements.txt index 3f2b022dc..195c5094b 100644 --- a/dev-requirements.txt +++ b/dev-requirements.txt @@ -2,7 +2,7 @@ pytest pytest-parametrization>=2022.2.1 pre-commit mypy - +deepdiff # MyPy stubs types-requests networkx-stubs diff --git a/elementary/messages/block_builders.py b/elementary/messages/block_builders.py index 400e2910c..c5207b2d1 100644 --- a/elementary/messages/block_builders.py +++ b/elementary/messages/block_builders.py @@ -11,6 +11,7 @@ LineBlock, LinesBlock, LinkBlock, + MentionBlock, TextBlock, TextStyle, ) @@ -41,7 +42,9 @@ def BulletListBlock( icon_inline: InlineBlock = ( IconBlock(icon=icon) if isinstance(icon, Icon) else TextBlock(text=icon) ) - lines = [LineBlock(inlines=[icon_inline] + line.inlines) for line in lines] + lines = [ + LineBlock(inlines=[icon_inline, *line.inlines], sep=line.sep) for line in lines + ] return LinesBlock(lines=lines) @@ -138,3 +141,7 @@ def TitledParagraphBlock( def JsonCodeBlock(*, content: Union[str, dict, list], indent: int = 2) -> CodeBlock: return CodeBlock(text=json.dumps(content, indent=indent)) + + +def MentionLineBlock(*users: str) -> LineBlock: + return LineBlock(inlines=[MentionBlock(user=user) for user in users], sep=", ") diff --git a/elementary/messages/blocks.py b/elementary/messages/blocks.py index a4ad8eda6..0ebe22e97 100644 --- a/elementary/messages/blocks.py +++ b/elementary/messages/blocks.py @@ -1,5 +1,5 @@ from enum import Enum -from typing import Any, Dict, List, Optional, Union +from typing import Any, Dict, List, Optional, Sequence, Union from pydantic import BaseModel from typing_extensions import Literal @@ -51,7 +51,32 @@ class IconBlock(BaseInlineTextBlock): icon: Icon -InlineBlock = Union[TextBlock, LinkBlock, IconBlock] +class InlineCodeBlock(BaseInlineTextBlock): + type: Literal["inline_code"] = "inline_code" + code: str + + +class MentionBlock(BaseInlineTextBlock): + type: Literal["mention"] = "mention" + user: str + + +class LineBlock(BaseBlock): + type: Literal["line"] = "line" + inlines: Sequence["InlineBlock"] + sep: str = " " + + +InlineBlock = Union[ + TextBlock, + LinkBlock, + IconBlock, + InlineCodeBlock, + MentionBlock, + "LineBlock", +] + +LineBlock.update_forward_refs() class HeaderBlock(BaseBlock): @@ -68,12 +93,6 @@ class DividerBlock(BaseBlock): type: Literal["divider"] = "divider" -class LineBlock(BaseBlock): - type: Literal["line"] = "line" - inlines: List[InlineBlock] - sep: str = " " - - class BaseLinesBlock(BaseBlock): lines: List[LineBlock] diff --git a/elementary/messages/formats/adaptive_cards.py b/elementary/messages/formats/adaptive_cards.py index 6d5837382..22f6b5dfe 100644 --- a/elementary/messages/formats/adaptive_cards.py +++ b/elementary/messages/formats/adaptive_cards.py @@ -10,9 +10,11 @@ Icon, IconBlock, InlineBlock, + InlineCodeBlock, LineBlock, LinesBlock, LinkBlock, + MentionBlock, TableBlock, TextBlock, TextStyle, @@ -47,6 +49,12 @@ def format_inline_block(block: InlineBlock) -> str: return format_text_block(block) elif isinstance(block, LinkBlock): return f"[{block.text}]({block.url})" + elif isinstance(block, InlineCodeBlock): + return block.code + elif isinstance(block, MentionBlock): + return block.user + elif isinstance(block, LineBlock): + return format_line_block_text(block) else: raise ValueError(f"Unsupported inline block type: {type(block)}") diff --git a/elementary/messages/formats/block_kit.py b/elementary/messages/formats/block_kit.py index 9765aeeeb..25fd77972 100644 --- a/elementary/messages/formats/block_kit.py +++ b/elementary/messages/formats/block_kit.py @@ -1,6 +1,7 @@ import json -from typing import Any, Dict, List, Optional, Tuple +from typing import Any, Callable, List, Optional, Tuple +from pydantic import BaseModel from slack_sdk.models import blocks as slack_blocks from tabulate import tabulate @@ -14,9 +15,11 @@ Icon, IconBlock, InlineBlock, + InlineCodeBlock, LineBlock, LinesBlock, LinkBlock, + MentionBlock, TableBlock, TextBlock, TextStyle, @@ -31,15 +34,26 @@ } +class FormattedBlockKitMessage(BaseModel): + blocks: List[dict] + attachments: List[dict] + + +ResolveMentionCallback = Callable[[str], Optional[str]] + + class BlockKitBuilder: _SECONDARY_FACT_CHUNK_SIZE = 2 _LONGEST_MARKDOWN_SUFFIX_LEN = 3 # length of markdown's code suffix (```) _MAX_CELL_LENGTH_BY_COLUMN_COUNT = {4: 11, 3: 14, 2: 22, 1: 40, 0: 40} - def __init__(self) -> None: + def __init__( + self, resolve_mention: Optional[ResolveMentionCallback] = None + ) -> None: self._blocks: List[dict] = [] self._attachment_blocks: List[dict] = [] self._is_divided = False + self._resolve_mention = resolve_mention or (lambda x: None) def _format_icon(self, icon: Icon) -> str: return ICON_TO_HTML[icon] @@ -59,6 +73,16 @@ def _format_inline_block(self, block: InlineBlock) -> str: return self._format_text_block(block) elif isinstance(block, LinkBlock): return f"<{block.url}|{block.text}>" + elif isinstance(block, InlineCodeBlock): + return f"`{block.code}`" + elif isinstance(block, MentionBlock): + resolved_user = self._resolve_mention(block.user) + if resolved_user: + return f"<@{resolved_user}>" + else: + return block.user + elif isinstance(block, LineBlock): + return self._format_line_block_text(block) else: raise ValueError(f"Unsupported inline block type: {type(block)}") @@ -192,12 +216,6 @@ def _add_expandable_block(self, block: ExpandableBlock) -> None: Expandable blocks are not supported in Slack Block Kit. However, slack automatically collapses a large section block into an expandable block. """ - self._add_block( - { - "type": "section", - "text": self._format_markdown_section_text(f"*{block.title}*"), - } - ) self._add_message_blocks(block.body) def _add_message_block(self, block: MessageBlock) -> None: @@ -239,25 +257,28 @@ def _get_final_blocks( else: return [], self._blocks - def build(self, message: MessageBody) -> Dict[str, Any]: + def build(self, message: MessageBody) -> FormattedBlockKitMessage: self._blocks = [] self._attachment_blocks = [] self._add_message_blocks(message.blocks) color_code = COLOR_MAP.get(message.color) if message.color else None blocks, attachment_blocks = self._get_final_blocks(message.color) - built_message = { - "blocks": blocks, - "attachments": [ + built_message = FormattedBlockKitMessage( + blocks=blocks, + attachments=[ { "blocks": attachment_blocks, } ], - } + ) if color_code: - built_message["attachments"][0]["color"] = color_code + for attachment in built_message.attachments: + attachment["color"] = color_code return built_message -def format_block_kit(message: MessageBody) -> Dict[str, Any]: - builder = BlockKitBuilder() +def format_block_kit( + message: MessageBody, resolve_mention: Optional[ResolveMentionCallback] = None +) -> FormattedBlockKitMessage: + builder = BlockKitBuilder(resolve_mention) return builder.build(message) diff --git a/elementary/messages/messaging_integrations/README.md b/elementary/messages/messaging_integrations/README.md index 8d34c99fb..196038da7 100644 --- a/elementary/messages/messaging_integrations/README.md +++ b/elementary/messages/messaging_integrations/README.md @@ -47,6 +47,8 @@ If your platform's message format is not yet supported: - LinesBlock: Plain text content - FactListBlock: Key-value pairs - ExpandableBlock: Collapsible sections + - MentionBlock: Mention a user + - TableBlock: Table of data ``` 3. Add tests in `tests/unit/messages/formats/` @@ -92,19 +94,6 @@ Once the message format is ready: - Make sure to get all required information from users to create your destination type - See Teams implementation for reference (webhook URL configuration) -## Migration Strategy - -The system currently supports both: - -- Legacy `BaseIntegration` implementations (e.g., Slack) -- New `BaseMessagingIntegration` implementations (e.g., Teams) - -This dual support allows for a gradual migration path where: - -1. New integrations are implemented using `BaseMessagingIntegration` -2. Existing integrations can be migrated one at a time -3. The legacy `BaseIntegration` will eventually be deprecated - ## Implementing a New Integration To add a new messaging platform integration: @@ -120,10 +109,9 @@ To add a new messaging platform integration: ## Current Implementations -- **Teams**: Uses the new `BaseMessagingIntegration` system with webhook support and Adaptive Cards format -- **Slack**: Currently uses the legacy `BaseIntegration` system (planned for migration) +- **Teams**: Webhook support, Adaptive Cards format +- **Slack**: Webhook and token support, Block Kit format ## Future Improvements -1. Complete migration of Slack to `BaseMessagingIntegration` -2. Add support for more messaging platforms +1. Add support for more messaging platforms diff --git a/elementary/messages/messaging_integrations/base_messaging_integration.py b/elementary/messages/messaging_integrations/base_messaging_integration.py index 169f18433..5bfb6f87c 100644 --- a/elementary/messages/messaging_integrations/base_messaging_integration.py +++ b/elementary/messages/messaging_integrations/base_messaging_integration.py @@ -45,5 +45,5 @@ def reply_to_message( body: MessageBody, ) -> MessageSendResult[MessageContextType]: if not self.supports_reply(): - raise MessageIntegrationReplyNotSupportedError + raise MessageIntegrationReplyNotSupportedError(type(self).__name__) raise NotImplementedError diff --git a/elementary/messages/messaging_integrations/exceptions.py b/elementary/messages/messaging_integrations/exceptions.py index dc1272423..e824577bb 100644 --- a/elementary/messages/messaging_integrations/exceptions.py +++ b/elementary/messages/messaging_integrations/exceptions.py @@ -3,4 +3,6 @@ class MessagingIntegrationError(Exception): class MessageIntegrationReplyNotSupportedError(MessagingIntegrationError): - pass + def __init__(self, integration_name: str): + self.integration_name = integration_name + super().__init__(f"{integration_name} does not support replying to messages") diff --git a/elementary/messages/messaging_integrations/slack_web.py b/elementary/messages/messaging_integrations/slack_web.py new file mode 100644 index 000000000..23dfb7433 --- /dev/null +++ b/elementary/messages/messaging_integrations/slack_web.py @@ -0,0 +1,165 @@ +import json +from typing import Dict, Iterator, Optional + +from pydantic import BaseModel +from ratelimit import limits, sleep_and_retry +from slack_sdk import WebClient +from slack_sdk.errors import SlackApiError +from slack_sdk.http_retry.builtin_handlers import RateLimitErrorRetryHandler +from typing_extensions import TypeAlias + +from elementary.messages.formats.block_kit import ( + FormattedBlockKitMessage, + format_block_kit, +) +from elementary.messages.message_body import MessageBody +from elementary.messages.messaging_integrations.base_messaging_integration import ( + BaseMessagingIntegration, + MessageSendResult, +) +from elementary.messages.messaging_integrations.exceptions import ( + MessagingIntegrationError, +) +from elementary.tracking.tracking_interface import Tracking +from elementary.utils.log import get_logger + +logger = get_logger(__name__) + +ONE_MINUTE = 60 +ONE_SECOND = 1 + + +Channel: TypeAlias = str + + +class SlackWebMessageContext(BaseModel): + id: str + channel: Channel + + +class SlackWebMessagingIntegration( + BaseMessagingIntegration[Channel, SlackWebMessageContext] +): + def __init__(self, client: WebClient, tracking: Optional[Tracking] = None) -> None: + self.client = client + self.tracking = tracking + self._email_to_user_id_cache: Dict[str, str] = {} + + @classmethod + def from_token( + cls, token: str, tracking: Optional[Tracking] = None + ) -> "SlackWebMessagingIntegration": + client = WebClient(token=token) + client.retry_handlers.append(RateLimitErrorRetryHandler(max_retry_count=5)) + return cls(client, tracking) + + def supports_reply(self) -> bool: + return True + + def send_message( + self, destination: Channel, body: MessageBody + ) -> MessageSendResult[SlackWebMessageContext]: + formatted_message = format_block_kit(body, self.get_user_id_from_email) + return self._send_message(destination, formatted_message) + + def reply_to_message( + self, + destination: Channel, + message_context: SlackWebMessageContext, + body: MessageBody, + ) -> MessageSendResult[SlackWebMessageContext]: + formatted_message = format_block_kit(body, self.get_user_id_from_email) + return self._send_message( + destination, formatted_message, thread_ts=message_context.id + ) + + @sleep_and_retry + @limits(calls=1, period=ONE_SECOND) + def _send_message( + self, + destination: Channel, + formatted_message: FormattedBlockKitMessage, + thread_ts: Optional[str] = None, + ) -> MessageSendResult[SlackWebMessageContext]: + try: + response = self.client.chat_postMessage( + channel=destination, + blocks=json.dumps(formatted_message.blocks), + attachments=json.dumps(formatted_message.attachments), + thread_ts=thread_ts, + ) + except SlackApiError as e: + self._handle_send_err(e, destination) + return self._send_message(destination, formatted_message, thread_ts) + + return MessageSendResult( + message_context=SlackWebMessageContext( + id=response["ts"], channel=response["channel"] + ), + timestamp=response["ts"], + ) + + def _handle_send_err(self, err: SlackApiError, channel_name: str): + if self.tracking: + self.tracking.record_internal_exception(err) + err_type = err.response.data["error"] + if err_type == "not_in_channel": + logger.info( + f'Elementary app is not in the channel "{channel_name}". Attempting to join.' + ) + channel_id = self._get_channel_id(channel_name) + self._join_channel(channel_id=channel_id) + logger.info(f"Joined channel {channel_name}") + elif err_type == "channel_not_found": + raise MessagingIntegrationError( + f"Channel {channel_name} was not found by the Elementary app. Please add the app to the channel." + ) + raise MessagingIntegrationError( + f"Failed to send a message to channel - {channel_name}" + ) + + @sleep_and_retry + @limits(calls=20, period=ONE_MINUTE) + def _iter_channels(self, cursor: Optional[str] = None) -> Iterator[dict]: + response = self.client.conversations_list( + cursor=cursor, + types="public_channel,private_channel", + exclude_archived=True, + limit=1000, + ) + channels = response["channels"] + yield from channels + response_metadata = response.get("response_metadata") or {} + next_cursor = response_metadata.get("next_cursor") + if next_cursor: + if not isinstance(next_cursor, str): + raise ValueError("Next cursor is not a string") + yield from self._iter_channels(next_cursor) + + def _get_channel_id(self, channel_name: str) -> str: + for channel in self._iter_channels(): + if channel["name"] == channel_name: + return channel["id"] + raise MessagingIntegrationError(f"Channel {channel_name} not found") + + def _join_channel(self, channel_id: str) -> None: + try: + self.client.conversations_join(channel=channel_id) + except SlackApiError as e: + if self.tracking: + self.tracking.record_internal_exception(e) + raise MessagingIntegrationError(f"Failed to join channel {channel_id}") + + @sleep_and_retry + @limits(calls=50, period=ONE_MINUTE) + def get_user_id_from_email(self, email: str) -> Optional[str]: + if email in self._email_to_user_id_cache: + return self._email_to_user_id_cache[email] + try: + user_id = self.client.users_lookupByEmail(email=email)["user"]["id"] + self._email_to_user_id_cache[email] = user_id + return user_id + except SlackApiError as err: + if err.response.data["error"] != "users_not_found": + logger.error(f"Unable to get Slack user ID from email: {err}.") + return None diff --git a/elementary/messages/messaging_integrations/slack_webhook.py b/elementary/messages/messaging_integrations/slack_webhook.py new file mode 100644 index 000000000..4cc6bad43 --- /dev/null +++ b/elementary/messages/messaging_integrations/slack_webhook.py @@ -0,0 +1,64 @@ +from datetime import datetime +from http import HTTPStatus +from typing import Optional + +from ratelimit import limits, sleep_and_retry +from slack_sdk import WebhookClient +from slack_sdk.http_retry.builtin_handlers import RateLimitErrorRetryHandler + +from elementary.messages.formats.block_kit import ( + FormattedBlockKitMessage, + format_block_kit, +) +from elementary.messages.message_body import MessageBody +from elementary.messages.messaging_integrations.base_messaging_integration import ( + BaseMessagingIntegration, + MessageSendResult, +) +from elementary.messages.messaging_integrations.exceptions import ( + MessagingIntegrationError, +) +from elementary.tracking.tracking_interface import Tracking + +ONE_SECOND = 1 + + +class SlackWebhookMessagingIntegration(BaseMessagingIntegration[None, None]): + def __init__( + self, client: WebhookClient, tracking: Optional[Tracking] = None + ) -> None: + self.client = client + self.tracking = tracking + + @classmethod + def from_url( + cls, url: str, tracking: Optional[Tracking] = None + ) -> "SlackWebhookMessagingIntegration": + client = WebhookClient(url) + client.retry_handlers.append(RateLimitErrorRetryHandler(max_retry_count=5)) + return cls(client, tracking) + + @sleep_and_retry + @limits(calls=1, period=ONE_SECOND) + def _send_message(self, formatted_message: FormattedBlockKitMessage) -> None: + response = self.client.send( + blocks=formatted_message.blocks, + attachments=formatted_message.attachments, + ) + if response.status_code != HTTPStatus.OK: + raise MessagingIntegrationError( + f"Could not post message to slack via webhook - {self.client.url}. Status code: {response.status_code}, Error: {response.body}" + ) + + def send_message( + self, destination: None, body: MessageBody + ) -> MessageSendResult[None]: + formatted_message = format_block_kit(body) + self._send_message(formatted_message) + return MessageSendResult( + message_context=destination, + timestamp=datetime.utcnow(), + ) + + def supports_reply(self) -> bool: + return False diff --git a/elementary/messages/messaging_integrations/teams_webhook.py b/elementary/messages/messaging_integrations/teams_webhook.py index d1ced03b5..b15bdd7af 100644 --- a/elementary/messages/messaging_integrations/teams_webhook.py +++ b/elementary/messages/messaging_integrations/teams_webhook.py @@ -2,7 +2,7 @@ from typing import Optional import requests -from pydantic import BaseModel +from typing_extensions import TypeAlias from elementary.messages.formats.adaptive_cards import format_adaptive_card from elementary.messages.message_body import MessageBody @@ -11,7 +11,6 @@ MessageSendResult, ) from elementary.messages.messaging_integrations.exceptions import ( - MessageIntegrationReplyNotSupportedError, MessagingIntegrationError, ) from elementary.utils.log import get_logger @@ -19,13 +18,10 @@ logger = get_logger(__name__) -class ChannelWebhook(BaseModel): - webhook: str - channel: Optional[str] = None +Channel: TypeAlias = Optional[str] def send_adaptive_card(webhook_url: str, card: dict) -> requests.Response: - """Sends an Adaptive Card to the specified webhook URL.""" payload = { "type": "message", "attachments": [ @@ -48,17 +44,18 @@ def send_adaptive_card(webhook_url: str, card: dict) -> requests.Response: return response -class TeamsWebhookMessagingIntegration( - BaseMessagingIntegration[ChannelWebhook, ChannelWebhook] -): +class TeamsWebhookMessagingIntegration(BaseMessagingIntegration[Channel, Channel]): + def __init__(self, url: str) -> None: + self.url = url + def send_message( self, - destination: ChannelWebhook, + destination: Channel, body: MessageBody, - ) -> MessageSendResult[ChannelWebhook]: + ) -> MessageSendResult[Channel]: card = format_adaptive_card(body) try: - send_adaptive_card(destination.webhook, card) + send_adaptive_card(self.url, card) return MessageSendResult( message_context=destination, timestamp=datetime.utcnow(), @@ -70,13 +67,3 @@ def send_message( def supports_reply(self) -> bool: return False - - def reply_to_message( - self, - destination: ChannelWebhook, - message_context: ChannelWebhook, - body: MessageBody, - ) -> MessageSendResult[ChannelWebhook]: - raise MessageIntegrationReplyNotSupportedError( - "Teams webhook message integration does not support replying to messages" - ) diff --git a/elementary/monitor/alerts/alert_messages/builder.py b/elementary/monitor/alerts/alert_messages/builder.py index 8d1e81be0..a8aff79aa 100644 --- a/elementary/monitor/alerts/alert_messages/builder.py +++ b/elementary/monitor/alerts/alert_messages/builder.py @@ -8,6 +8,7 @@ ItalicTextLineBlock, JsonCodeBlock, LinkLineBlock, + MentionLineBlock, NonPrimaryFactBlock, PrimaryFactBlock, SummaryLineBlock, @@ -21,9 +22,11 @@ HeaderBlock, Icon, InlineBlock, + InlineCodeBlock, LineBlock, LinesBlock, LinkBlock, + MentionBlock, TableBlock, TextBlock, TextStyle, @@ -225,12 +228,12 @@ def _get_details_blocks( else ItalicTextLineBlock(text="No tags") ) owners_line = ( - TextLineBlock(text=", ".join(owners)) + MentionLineBlock(*owners) if owners else ItalicTextLineBlock(text="No owners") ) subscribers_line = ( - TextLineBlock(text=", ".join(subscribers)) + MentionLineBlock(*subscribers) if subscribers else ItalicTextLineBlock(text="No subscribers") ) @@ -257,7 +260,12 @@ def _get_details_blocks( ) if path: fact_blocks.append( - PrimaryFactBlock((TextLineBlock(text="Path"), TextLineBlock(text=path))) + PrimaryFactBlock( + ( + TextLineBlock(text="Path"), + LineBlock(inlines=[InlineCodeBlock(code=path)]), + ) + ) ) blocks.append(FactListBlock(facts=fact_blocks)) return blocks @@ -408,10 +416,12 @@ def _get_alert_list_line( if owners := list(set(alert.owners)): inlines.append(TextBlock(text="-")) if len(owners) == 1: - inlines.append(TextBlock(text=f"Owner: {owners.pop()}")) + inlines.append(TextBlock(text="Owner:")) + inlines.append(MentionBlock(user=owners.pop())) else: owners.sort() - inlines.append(TextBlock(text=f"Owners: {', '.join(owners)}")) + inlines.append(TextBlock(text="Owners:")) + inlines.append(MentionLineBlock(*owners)) if report_link := alert.get_report_link(): inlines.append(TextBlock(text="-")) diff --git a/elementary/monitor/data_monitoring/alerts/data_monitoring_alerts.py b/elementary/monitor/data_monitoring/alerts/data_monitoring_alerts.py index 496dba5a8..f0cbbf9db 100644 --- a/elementary/monitor/data_monitoring/alerts/data_monitoring_alerts.py +++ b/elementary/monitor/data_monitoring/alerts/data_monitoring_alerts.py @@ -25,9 +25,6 @@ from elementary.monitor.alerts.test_alert import TestAlertModel from elementary.monitor.api.alerts.alert_filters import filter_alerts from elementary.monitor.api.alerts.alerts import AlertsAPI -from elementary.monitor.data_monitoring.alerts.integrations.base_integration import ( - BaseIntegration, -) from elementary.monitor.data_monitoring.alerts.integrations.integrations import ( Integrations, ) @@ -58,9 +55,7 @@ def get_health_check_message() -> MessageBody: class DataMonitoringAlerts(DataMonitoring): - # The alerts_integration field now supports both the legacy BaseIntegration and the new BaseMessagingIntegration - # This dual support allows for a gradual migration from the old integration system to the new messaging system - alerts_integration: Union[BaseIntegration, BaseMessagingIntegration] + alerts_integration: BaseMessagingIntegration def __init__( self, @@ -92,11 +87,10 @@ def __init__( def _get_integration_client( self, - ) -> Union[BaseIntegration, BaseMessagingIntegration]: + ) -> BaseMessagingIntegration: return Integrations.get_integration( config=self.config, tracking=self.tracking, - override_config_defaults=self.override_config_defaults, ) def _populate_data( @@ -279,23 +273,21 @@ def _format_alerts( ) def _send_message( - self, integration: BaseMessagingIntegration, body: MessageBody + self, integration: BaseMessagingIntegration, body: MessageBody, metadata: dict ) -> MessageSendResult: destination = Integrations.get_destination( - integration=integration, config=self.config + integration=integration, + config=self.config, + metadata=metadata, + override_config_defaults=self.override_config_defaults, ) return integration.send_message(destination=destination, body=body) - def _send_test_message(self): - if isinstance(self.alerts_integration, BaseIntegration): - self.alerts_integration.send_test_message( - channel_name=self.config.slack_channel_name - ) - else: - test_message = get_health_check_message() - return self._send_message( - integration=self.alerts_integration, body=test_message - ) + def _send_test_message(self) -> MessageSendResult: + test_message = get_health_check_message() + return self._send_message( + integration=self.alerts_integration, body=test_message, metadata={} + ) def _send_alert( self, @@ -307,25 +299,20 @@ def _send_alert( AlertsGroup, ], ): - # Support both legacy BaseIntegration and new BaseMessagingIntegration - # BaseIntegration will be deprecated in favor of BaseMessagingIntegration - if isinstance(self.alerts_integration, BaseIntegration): - return self.alerts_integration.send_alert(alert) - else: - # New messaging integration path - converts alerts to message bodies - alert_message_builder = AlertMessageBuilder() - alert_message_body = alert_message_builder.build( - alert=alert, + alert_message_builder = AlertMessageBuilder() + alert_message_body = alert_message_builder.build( + alert=alert, + ) + try: + self._send_message( + integration=self.alerts_integration, + body=alert_message_body, + metadata=alert.unified_meta, ) - try: - self._send_message( - integration=self.alerts_integration, - body=alert_message_body, - ) - return True - except MessagingIntegrationError: - logger.error(f"Could not send the alert - {type(alert)}.") - return False + return True + except MessagingIntegrationError: + logger.error(f"Could not send the alert - {type(alert)}.") + return False def _send_alerts( self, diff --git a/elementary/monitor/data_monitoring/alerts/integrations/integrations.py b/elementary/monitor/data_monitoring/alerts/integrations/integrations.py index 8a37b5bdf..89b0519b2 100644 --- a/elementary/monitor/data_monitoring/alerts/integrations/integrations.py +++ b/elementary/monitor/data_monitoring/alerts/integrations/integrations.py @@ -1,21 +1,24 @@ -from typing import Any, Optional, Union +from typing import Any, Optional, cast from elementary.config.config import Config from elementary.exceptions.exceptions import Error from elementary.messages.messaging_integrations.base_messaging_integration import ( BaseMessagingIntegration, + DestinationType, ) -from elementary.messages.messaging_integrations.teams_webhook import ( - ChannelWebhook, - TeamsWebhookMessagingIntegration, +from elementary.messages.messaging_integrations.slack_web import ( + SlackWebMessagingIntegration, ) -from elementary.monitor.data_monitoring.alerts.integrations.base_integration import ( - BaseIntegration, +from elementary.messages.messaging_integrations.slack_webhook import ( + SlackWebhookMessagingIntegration, ) -from elementary.monitor.data_monitoring.alerts.integrations.slack.slack import ( - SlackIntegration, +from elementary.messages.messaging_integrations.teams_webhook import ( + TeamsWebhookMessagingIntegration, ) from elementary.tracking.tracking_interface import Tracking +from elementary.utils.log import get_logger + +logger = get_logger(__name__) class UnsupportedAlertIntegrationError(Error): @@ -32,32 +35,44 @@ class Integrations: def get_integration( config: Config, tracking: Optional[Tracking] = None, - override_config_defaults: bool = False, - ) -> Union[BaseIntegration, BaseMessagingIntegration]: - # Factory method that returns either a legacy BaseIntegration or new BaseMessagingIntegration - # This allows for a gradual migration from the old integration system to the new messaging system - # - Slack currently uses the legacy BaseIntegration - # - Teams uses the new BaseMessagingIntegration + ) -> BaseMessagingIntegration: if config.has_slack: - return SlackIntegration( - config=config, - tracking=tracking, - override_config_defaults=override_config_defaults, - ) + if config.slack_token: + return SlackWebMessagingIntegration.from_token( + config.slack_token, tracking + ) + elif config.slack_webhook: + return SlackWebhookMessagingIntegration.from_url( + config.slack_webhook, tracking + ) + else: + raise UnsupportedAlertIntegrationError elif config.has_teams: - return TeamsWebhookMessagingIntegration() + return TeamsWebhookMessagingIntegration(config.teams_webhook) else: raise UnsupportedAlertIntegrationError @staticmethod - def get_destination(integration: BaseMessagingIntegration, config: Config) -> Any: - # Helper method to get the appropriate destination for BaseMessagingIntegration implementations - # Each messaging integration type may have different destination requirements - # Currently supports Teams webhook destinations + def get_destination( + integration: BaseMessagingIntegration[DestinationType, Any], + config: Config, + metadata: dict, + override_config_defaults: bool = False, + ) -> DestinationType: if ( isinstance(integration, TeamsWebhookMessagingIntegration) and config.has_teams and config.teams_webhook ): - return ChannelWebhook(webhook=config.teams_webhook) - return None + return cast(DestinationType, None) + elif isinstance(integration, SlackWebMessagingIntegration): + if override_config_defaults: + if "channel" in metadata: + logger.info( + f"ignoring channel from metadata: {metadata['channel']}" + ) + return config.slack_channel_name + return metadata.get("channel", config.slack_channel_name) + elif isinstance(integration, SlackWebhookMessagingIntegration): + return cast(DestinationType, None) + raise UnsupportedAlertIntegrationError diff --git a/tests/unit/alerts/alert_messages/fixtures/adaptive_card_alerts_group_model-errors-False_test-failures-False_test-warnings-True_test-errors-True_link-False_env-False.json b/tests/unit/alerts/alert_messages/fixtures/adaptive_card/alerts_group_model-errors-False_test-failures-False_test-warnings-True_test-errors-True_link-False_env-False.json similarity index 100% rename from tests/unit/alerts/alert_messages/fixtures/adaptive_card_alerts_group_model-errors-False_test-failures-False_test-warnings-True_test-errors-True_link-False_env-False.json rename to tests/unit/alerts/alert_messages/fixtures/adaptive_card/alerts_group_model-errors-False_test-failures-False_test-warnings-True_test-errors-True_link-False_env-False.json diff --git a/tests/unit/alerts/alert_messages/fixtures/adaptive_card_alerts_group_model-errors-False_test-failures-True_test-warnings-False_test-errors-False_link-False_env-False.json b/tests/unit/alerts/alert_messages/fixtures/adaptive_card/alerts_group_model-errors-False_test-failures-True_test-warnings-False_test-errors-False_link-False_env-False.json similarity index 100% rename from tests/unit/alerts/alert_messages/fixtures/adaptive_card_alerts_group_model-errors-False_test-failures-True_test-warnings-False_test-errors-False_link-False_env-False.json rename to tests/unit/alerts/alert_messages/fixtures/adaptive_card/alerts_group_model-errors-False_test-failures-True_test-warnings-False_test-errors-False_link-False_env-False.json diff --git a/tests/unit/alerts/alert_messages/fixtures/adaptive_card_alerts_group_model-errors-False_test-failures-True_test-warnings-False_test-errors-True_link-False_env-False.json b/tests/unit/alerts/alert_messages/fixtures/adaptive_card/alerts_group_model-errors-False_test-failures-True_test-warnings-False_test-errors-True_link-False_env-False.json similarity index 100% rename from tests/unit/alerts/alert_messages/fixtures/adaptive_card_alerts_group_model-errors-False_test-failures-True_test-warnings-False_test-errors-True_link-False_env-False.json rename to tests/unit/alerts/alert_messages/fixtures/adaptive_card/alerts_group_model-errors-False_test-failures-True_test-warnings-False_test-errors-True_link-False_env-False.json diff --git a/tests/unit/alerts/alert_messages/fixtures/adaptive_card_alerts_group_model-errors-False_test-failures-True_test-warnings-True_test-errors-True_link-True_env-True.json b/tests/unit/alerts/alert_messages/fixtures/adaptive_card/alerts_group_model-errors-False_test-failures-True_test-warnings-True_test-errors-True_link-True_env-True.json similarity index 100% rename from tests/unit/alerts/alert_messages/fixtures/adaptive_card_alerts_group_model-errors-False_test-failures-True_test-warnings-True_test-errors-True_link-True_env-True.json rename to tests/unit/alerts/alert_messages/fixtures/adaptive_card/alerts_group_model-errors-False_test-failures-True_test-warnings-True_test-errors-True_link-True_env-True.json diff --git a/tests/unit/alerts/alert_messages/fixtures/adaptive_card_alerts_group_model-errors-True_test-failures-False_test-warnings-False_test-errors-True_link-False_env-False.json b/tests/unit/alerts/alert_messages/fixtures/adaptive_card/alerts_group_model-errors-True_test-failures-False_test-warnings-False_test-errors-True_link-False_env-False.json similarity index 100% rename from tests/unit/alerts/alert_messages/fixtures/adaptive_card_alerts_group_model-errors-True_test-failures-False_test-warnings-False_test-errors-True_link-False_env-False.json rename to tests/unit/alerts/alert_messages/fixtures/adaptive_card/alerts_group_model-errors-True_test-failures-False_test-warnings-False_test-errors-True_link-False_env-False.json diff --git a/tests/unit/alerts/alert_messages/fixtures/adaptive_card_alerts_group_model-errors-True_test-failures-False_test-warnings-True_test-errors-False_link-True_env-False.json b/tests/unit/alerts/alert_messages/fixtures/adaptive_card/alerts_group_model-errors-True_test-failures-False_test-warnings-True_test-errors-False_link-True_env-False.json similarity index 100% rename from tests/unit/alerts/alert_messages/fixtures/adaptive_card_alerts_group_model-errors-True_test-failures-False_test-warnings-True_test-errors-False_link-True_env-False.json rename to tests/unit/alerts/alert_messages/fixtures/adaptive_card/alerts_group_model-errors-True_test-failures-False_test-warnings-True_test-errors-False_link-True_env-False.json diff --git a/tests/unit/alerts/alert_messages/fixtures/adaptive_card_alerts_group_model-errors-True_test-failures-False_test-warnings-True_test-errors-True_link-True_env-True.json b/tests/unit/alerts/alert_messages/fixtures/adaptive_card/alerts_group_model-errors-True_test-failures-False_test-warnings-True_test-errors-True_link-True_env-True.json similarity index 100% rename from tests/unit/alerts/alert_messages/fixtures/adaptive_card_alerts_group_model-errors-True_test-failures-False_test-warnings-True_test-errors-True_link-True_env-True.json rename to tests/unit/alerts/alert_messages/fixtures/adaptive_card/alerts_group_model-errors-True_test-failures-False_test-warnings-True_test-errors-True_link-True_env-True.json diff --git a/tests/unit/alerts/alert_messages/fixtures/adaptive_card_alerts_group_model-errors-True_test-failures-True_test-warnings-False_test-errors-True_link-True_env-True.json b/tests/unit/alerts/alert_messages/fixtures/adaptive_card/alerts_group_model-errors-True_test-failures-True_test-warnings-False_test-errors-True_link-True_env-True.json similarity index 100% rename from tests/unit/alerts/alert_messages/fixtures/adaptive_card_alerts_group_model-errors-True_test-failures-True_test-warnings-False_test-errors-True_link-True_env-True.json rename to tests/unit/alerts/alert_messages/fixtures/adaptive_card/alerts_group_model-errors-True_test-failures-True_test-warnings-False_test-errors-True_link-True_env-True.json diff --git a/tests/unit/alerts/alert_messages/fixtures/adaptive_card_alerts_group_model-errors-True_test-failures-True_test-warnings-True_test-errors-False_link-True_env-True.json b/tests/unit/alerts/alert_messages/fixtures/adaptive_card/alerts_group_model-errors-True_test-failures-True_test-warnings-True_test-errors-False_link-True_env-True.json similarity index 100% rename from tests/unit/alerts/alert_messages/fixtures/adaptive_card_alerts_group_model-errors-True_test-failures-True_test-warnings-True_test-errors-False_link-True_env-True.json rename to tests/unit/alerts/alert_messages/fixtures/adaptive_card/alerts_group_model-errors-True_test-failures-True_test-warnings-True_test-errors-False_link-True_env-True.json diff --git a/tests/unit/alerts/alert_messages/fixtures/adaptive_card_alerts_group_model-errors-True_test-failures-True_test-warnings-True_test-errors-True_link-True_env-True.json b/tests/unit/alerts/alert_messages/fixtures/adaptive_card/alerts_group_model-errors-True_test-failures-True_test-warnings-True_test-errors-True_link-True_env-True.json similarity index 100% rename from tests/unit/alerts/alert_messages/fixtures/adaptive_card_alerts_group_model-errors-True_test-failures-True_test-warnings-True_test-errors-True_link-True_env-True.json rename to tests/unit/alerts/alert_messages/fixtures/adaptive_card/alerts_group_model-errors-True_test-failures-True_test-warnings-True_test-errors-True_link-True_env-True.json diff --git a/tests/unit/alerts/alert_messages/fixtures/adaptive_card_dbt_test_alert_removed_field-column.json b/tests/unit/alerts/alert_messages/fixtures/adaptive_card/dbt_test_alert_removed_field-column.json similarity index 100% rename from tests/unit/alerts/alert_messages/fixtures/adaptive_card_dbt_test_alert_removed_field-column.json rename to tests/unit/alerts/alert_messages/fixtures/adaptive_card/dbt_test_alert_removed_field-column.json diff --git a/tests/unit/alerts/alert_messages/fixtures/adaptive_card_dbt_test_alert_removed_field-description.json b/tests/unit/alerts/alert_messages/fixtures/adaptive_card/dbt_test_alert_removed_field-description.json similarity index 100% rename from tests/unit/alerts/alert_messages/fixtures/adaptive_card_dbt_test_alert_removed_field-description.json rename to tests/unit/alerts/alert_messages/fixtures/adaptive_card/dbt_test_alert_removed_field-description.json diff --git a/tests/unit/alerts/alert_messages/fixtures/adaptive_card_dbt_test_alert_removed_field-owners.json b/tests/unit/alerts/alert_messages/fixtures/adaptive_card/dbt_test_alert_removed_field-owners.json similarity index 100% rename from tests/unit/alerts/alert_messages/fixtures/adaptive_card_dbt_test_alert_removed_field-owners.json rename to tests/unit/alerts/alert_messages/fixtures/adaptive_card/dbt_test_alert_removed_field-owners.json diff --git a/tests/unit/alerts/alert_messages/fixtures/adaptive_card_dbt_test_alert_removed_field-result_message.json b/tests/unit/alerts/alert_messages/fixtures/adaptive_card/dbt_test_alert_removed_field-result_message.json similarity index 100% rename from tests/unit/alerts/alert_messages/fixtures/adaptive_card_dbt_test_alert_removed_field-result_message.json rename to tests/unit/alerts/alert_messages/fixtures/adaptive_card/dbt_test_alert_removed_field-result_message.json diff --git a/tests/unit/alerts/alert_messages/fixtures/adaptive_card_dbt_test_alert_removed_field-subscribers.json b/tests/unit/alerts/alert_messages/fixtures/adaptive_card/dbt_test_alert_removed_field-subscribers.json similarity index 100% rename from tests/unit/alerts/alert_messages/fixtures/adaptive_card_dbt_test_alert_removed_field-subscribers.json rename to tests/unit/alerts/alert_messages/fixtures/adaptive_card/dbt_test_alert_removed_field-subscribers.json diff --git a/tests/unit/alerts/alert_messages/fixtures/adaptive_card_dbt_test_alert_removed_field-table.json b/tests/unit/alerts/alert_messages/fixtures/adaptive_card/dbt_test_alert_removed_field-table.json similarity index 100% rename from tests/unit/alerts/alert_messages/fixtures/adaptive_card_dbt_test_alert_removed_field-table.json rename to tests/unit/alerts/alert_messages/fixtures/adaptive_card/dbt_test_alert_removed_field-table.json diff --git a/tests/unit/alerts/alert_messages/fixtures/adaptive_card_dbt_test_alert_removed_field-tags.json b/tests/unit/alerts/alert_messages/fixtures/adaptive_card/dbt_test_alert_removed_field-tags.json similarity index 100% rename from tests/unit/alerts/alert_messages/fixtures/adaptive_card_dbt_test_alert_removed_field-tags.json rename to tests/unit/alerts/alert_messages/fixtures/adaptive_card/dbt_test_alert_removed_field-tags.json diff --git a/tests/unit/alerts/alert_messages/fixtures/adaptive_card_dbt_test_alert_removed_field-test_parameters.json b/tests/unit/alerts/alert_messages/fixtures/adaptive_card/dbt_test_alert_removed_field-test_parameters.json similarity index 100% rename from tests/unit/alerts/alert_messages/fixtures/adaptive_card_dbt_test_alert_removed_field-test_parameters.json rename to tests/unit/alerts/alert_messages/fixtures/adaptive_card/dbt_test_alert_removed_field-test_parameters.json diff --git a/tests/unit/alerts/alert_messages/fixtures/adaptive_card_dbt_test_alert_removed_field-test_query.json b/tests/unit/alerts/alert_messages/fixtures/adaptive_card/dbt_test_alert_removed_field-test_query.json similarity index 100% rename from tests/unit/alerts/alert_messages/fixtures/adaptive_card_dbt_test_alert_removed_field-test_query.json rename to tests/unit/alerts/alert_messages/fixtures/adaptive_card/dbt_test_alert_removed_field-test_query.json diff --git a/tests/unit/alerts/alert_messages/fixtures/adaptive_card_dbt_test_alert_removed_field-test_results_sample.json b/tests/unit/alerts/alert_messages/fixtures/adaptive_card/dbt_test_alert_removed_field-test_results_sample.json similarity index 100% rename from tests/unit/alerts/alert_messages/fixtures/adaptive_card_dbt_test_alert_removed_field-test_results_sample.json rename to tests/unit/alerts/alert_messages/fixtures/adaptive_card/dbt_test_alert_removed_field-test_results_sample.json diff --git a/tests/unit/alerts/alert_messages/fixtures/adaptive_card_dbt_test_alert_status-None_link-False_description-False_tags-False_owners-False_table-False_error-False_sample-False_env-False.json b/tests/unit/alerts/alert_messages/fixtures/adaptive_card/dbt_test_alert_status-None_link-False_description-False_tags-False_owners-False_table-False_error-False_sample-False_env-False.json similarity index 100% rename from tests/unit/alerts/alert_messages/fixtures/adaptive_card_dbt_test_alert_status-None_link-False_description-False_tags-False_owners-False_table-False_error-False_sample-False_env-False.json rename to tests/unit/alerts/alert_messages/fixtures/adaptive_card/dbt_test_alert_status-None_link-False_description-False_tags-False_owners-False_table-False_error-False_sample-False_env-False.json diff --git a/tests/unit/alerts/alert_messages/fixtures/adaptive_card_dbt_test_alert_status-None_link-True_description-True_tags-False_owners-False_table-True_error-True_sample-False_env-True.json b/tests/unit/alerts/alert_messages/fixtures/adaptive_card/dbt_test_alert_status-None_link-True_description-True_tags-False_owners-False_table-True_error-True_sample-False_env-True.json similarity index 100% rename from tests/unit/alerts/alert_messages/fixtures/adaptive_card_dbt_test_alert_status-None_link-True_description-True_tags-False_owners-False_table-True_error-True_sample-False_env-True.json rename to tests/unit/alerts/alert_messages/fixtures/adaptive_card/dbt_test_alert_status-None_link-True_description-True_tags-False_owners-False_table-True_error-True_sample-False_env-True.json diff --git a/tests/unit/alerts/alert_messages/fixtures/adaptive_card_dbt_test_alert_status-error_link-False_description-True_tags-False_owners-True_table-False_error-True_sample-False_env-True.json b/tests/unit/alerts/alert_messages/fixtures/adaptive_card/dbt_test_alert_status-error_link-False_description-True_tags-False_owners-True_table-False_error-True_sample-False_env-True.json similarity index 100% rename from tests/unit/alerts/alert_messages/fixtures/adaptive_card_dbt_test_alert_status-error_link-False_description-True_tags-False_owners-True_table-False_error-True_sample-False_env-True.json rename to tests/unit/alerts/alert_messages/fixtures/adaptive_card/dbt_test_alert_status-error_link-False_description-True_tags-False_owners-True_table-False_error-True_sample-False_env-True.json diff --git a/tests/unit/alerts/alert_messages/fixtures/adaptive_card_dbt_test_alert_status-error_link-True_description-True_tags-True_owners-True_table-True_error-True_sample-True_env-True.json b/tests/unit/alerts/alert_messages/fixtures/adaptive_card/dbt_test_alert_status-error_link-True_description-True_tags-True_owners-True_table-True_error-True_sample-True_env-True.json similarity index 100% rename from tests/unit/alerts/alert_messages/fixtures/adaptive_card_dbt_test_alert_status-error_link-True_description-True_tags-True_owners-True_table-True_error-True_sample-True_env-True.json rename to tests/unit/alerts/alert_messages/fixtures/adaptive_card/dbt_test_alert_status-error_link-True_description-True_tags-True_owners-True_table-True_error-True_sample-True_env-True.json diff --git a/tests/unit/alerts/alert_messages/fixtures/adaptive_card_dbt_test_alert_status-fail_link-False_description-False_tags-False_owners-False_table-False_error-False_sample-False_env-False.json b/tests/unit/alerts/alert_messages/fixtures/adaptive_card/dbt_test_alert_status-fail_link-False_description-False_tags-False_owners-False_table-False_error-False_sample-False_env-False.json similarity index 100% rename from tests/unit/alerts/alert_messages/fixtures/adaptive_card_dbt_test_alert_status-fail_link-False_description-False_tags-False_owners-False_table-False_error-False_sample-False_env-False.json rename to tests/unit/alerts/alert_messages/fixtures/adaptive_card/dbt_test_alert_status-fail_link-False_description-False_tags-False_owners-False_table-False_error-False_sample-False_env-False.json diff --git a/tests/unit/alerts/alert_messages/fixtures/adaptive_card_dbt_test_alert_status-fail_link-True_description-True_tags-True_owners-True_table-True_error-True_sample-True_env-False.json b/tests/unit/alerts/alert_messages/fixtures/adaptive_card/dbt_test_alert_status-fail_link-True_description-True_tags-True_owners-True_table-True_error-True_sample-True_env-False.json similarity index 100% rename from tests/unit/alerts/alert_messages/fixtures/adaptive_card_dbt_test_alert_status-fail_link-True_description-True_tags-True_owners-True_table-True_error-True_sample-True_env-False.json rename to tests/unit/alerts/alert_messages/fixtures/adaptive_card/dbt_test_alert_status-fail_link-True_description-True_tags-True_owners-True_table-True_error-True_sample-True_env-False.json diff --git a/tests/unit/alerts/alert_messages/fixtures/adaptive_card_dbt_test_alert_status-warn_link-True_description-False_tags-True_owners-False_table-True_error-False_sample-True_env-False.json b/tests/unit/alerts/alert_messages/fixtures/adaptive_card/dbt_test_alert_status-warn_link-True_description-False_tags-True_owners-False_table-True_error-False_sample-True_env-False.json similarity index 100% rename from tests/unit/alerts/alert_messages/fixtures/adaptive_card_dbt_test_alert_status-warn_link-True_description-False_tags-True_owners-False_table-True_error-False_sample-True_env-False.json rename to tests/unit/alerts/alert_messages/fixtures/adaptive_card/dbt_test_alert_status-warn_link-True_description-False_tags-True_owners-False_table-True_error-False_sample-True_env-False.json diff --git a/tests/unit/alerts/alert_messages/fixtures/adaptive_card_dbt_test_alert_status-warn_link-True_description-True_tags-True_owners-True_table-True_error-True_sample-True_env-True.json b/tests/unit/alerts/alert_messages/fixtures/adaptive_card/dbt_test_alert_status-warn_link-True_description-True_tags-True_owners-True_table-True_error-True_sample-True_env-True.json similarity index 100% rename from tests/unit/alerts/alert_messages/fixtures/adaptive_card_dbt_test_alert_status-warn_link-True_description-True_tags-True_owners-True_table-True_error-True_sample-True_env-True.json rename to tests/unit/alerts/alert_messages/fixtures/adaptive_card/dbt_test_alert_status-warn_link-True_description-True_tags-True_owners-True_table-True_error-True_sample-True_env-True.json diff --git a/tests/unit/alerts/alert_messages/fixtures/adaptive_card_elementary_test_alert_status-None_link-False_description-False_tags-False_owners-False_table-False_error-False_sample-False_anomaly-False_env-False.json b/tests/unit/alerts/alert_messages/fixtures/adaptive_card/elementary_test_alert_status-None_link-False_description-False_tags-False_owners-False_table-False_error-False_sample-False_anomaly-False_env-False.json similarity index 100% rename from tests/unit/alerts/alert_messages/fixtures/adaptive_card_elementary_test_alert_status-None_link-False_description-False_tags-False_owners-False_table-False_error-False_sample-False_anomaly-False_env-False.json rename to tests/unit/alerts/alert_messages/fixtures/adaptive_card/elementary_test_alert_status-None_link-False_description-False_tags-False_owners-False_table-False_error-False_sample-False_anomaly-False_env-False.json diff --git a/tests/unit/alerts/alert_messages/fixtures/adaptive_card_elementary_test_alert_status-None_link-False_description-True_tags-False_owners-True_table-False_error-True_sample-False_anomaly-True_env-True.json b/tests/unit/alerts/alert_messages/fixtures/adaptive_card/elementary_test_alert_status-None_link-False_description-True_tags-False_owners-True_table-False_error-True_sample-False_anomaly-True_env-True.json similarity index 100% rename from tests/unit/alerts/alert_messages/fixtures/adaptive_card_elementary_test_alert_status-None_link-False_description-True_tags-False_owners-True_table-False_error-True_sample-False_anomaly-True_env-True.json rename to tests/unit/alerts/alert_messages/fixtures/adaptive_card/elementary_test_alert_status-None_link-False_description-True_tags-False_owners-True_table-False_error-True_sample-False_anomaly-True_env-True.json diff --git a/tests/unit/alerts/alert_messages/fixtures/adaptive_card_elementary_test_alert_status-None_link-True_description-False_tags-True_owners-False_table-True_error-False_sample-True_anomaly-True_env-True.json b/tests/unit/alerts/alert_messages/fixtures/adaptive_card/elementary_test_alert_status-None_link-True_description-False_tags-True_owners-False_table-True_error-False_sample-True_anomaly-True_env-True.json similarity index 100% rename from tests/unit/alerts/alert_messages/fixtures/adaptive_card_elementary_test_alert_status-None_link-True_description-False_tags-True_owners-False_table-True_error-False_sample-True_anomaly-True_env-True.json rename to tests/unit/alerts/alert_messages/fixtures/adaptive_card/elementary_test_alert_status-None_link-True_description-False_tags-True_owners-False_table-True_error-False_sample-True_anomaly-True_env-True.json diff --git a/tests/unit/alerts/alert_messages/fixtures/adaptive_card_elementary_test_alert_status-error_link-False_description-True_tags-True_owners-False_table-True_error-False_sample-True_anomaly-False_env-True.json b/tests/unit/alerts/alert_messages/fixtures/adaptive_card/elementary_test_alert_status-error_link-False_description-True_tags-True_owners-False_table-True_error-False_sample-True_anomaly-False_env-True.json similarity index 100% rename from tests/unit/alerts/alert_messages/fixtures/adaptive_card_elementary_test_alert_status-error_link-False_description-True_tags-True_owners-False_table-True_error-False_sample-True_anomaly-False_env-True.json rename to tests/unit/alerts/alert_messages/fixtures/adaptive_card/elementary_test_alert_status-error_link-False_description-True_tags-True_owners-False_table-True_error-False_sample-True_anomaly-False_env-True.json diff --git a/tests/unit/alerts/alert_messages/fixtures/adaptive_card_elementary_test_alert_status-error_link-True_description-True_tags-False_owners-False_table-False_error-True_sample-False_anomaly-True_env-True.json b/tests/unit/alerts/alert_messages/fixtures/adaptive_card/elementary_test_alert_status-error_link-True_description-True_tags-False_owners-False_table-False_error-True_sample-False_anomaly-True_env-True.json similarity index 100% rename from tests/unit/alerts/alert_messages/fixtures/adaptive_card_elementary_test_alert_status-error_link-True_description-True_tags-False_owners-False_table-False_error-True_sample-False_anomaly-True_env-True.json rename to tests/unit/alerts/alert_messages/fixtures/adaptive_card/elementary_test_alert_status-error_link-True_description-True_tags-False_owners-False_table-False_error-True_sample-False_anomaly-True_env-True.json diff --git a/tests/unit/alerts/alert_messages/fixtures/adaptive_card_elementary_test_alert_status-fail_link-False_description-False_tags-False_owners-False_table-False_error-False_sample-False_anomaly-False_env-False.json b/tests/unit/alerts/alert_messages/fixtures/adaptive_card/elementary_test_alert_status-fail_link-False_description-False_tags-False_owners-False_table-False_error-False_sample-False_anomaly-False_env-False.json similarity index 100% rename from tests/unit/alerts/alert_messages/fixtures/adaptive_card_elementary_test_alert_status-fail_link-False_description-False_tags-False_owners-False_table-False_error-False_sample-False_anomaly-False_env-False.json rename to tests/unit/alerts/alert_messages/fixtures/adaptive_card/elementary_test_alert_status-fail_link-False_description-False_tags-False_owners-False_table-False_error-False_sample-False_anomaly-False_env-False.json diff --git a/tests/unit/alerts/alert_messages/fixtures/adaptive_card_elementary_test_alert_status-fail_link-True_description-True_tags-True_owners-True_table-True_error-True_sample-True_anomaly-True_env-True.json b/tests/unit/alerts/alert_messages/fixtures/adaptive_card/elementary_test_alert_status-fail_link-True_description-True_tags-True_owners-True_table-True_error-True_sample-True_anomaly-True_env-True.json similarity index 100% rename from tests/unit/alerts/alert_messages/fixtures/adaptive_card_elementary_test_alert_status-fail_link-True_description-True_tags-True_owners-True_table-True_error-True_sample-True_anomaly-True_env-True.json rename to tests/unit/alerts/alert_messages/fixtures/adaptive_card/elementary_test_alert_status-fail_link-True_description-True_tags-True_owners-True_table-True_error-True_sample-True_anomaly-True_env-True.json diff --git a/tests/unit/alerts/alert_messages/fixtures/adaptive_card_elementary_test_alert_status-warn_link-False_description-True_tags-False_owners-True_table-False_error-True_sample-False_anomaly-True_env-False.json b/tests/unit/alerts/alert_messages/fixtures/adaptive_card/elementary_test_alert_status-warn_link-False_description-True_tags-False_owners-True_table-False_error-True_sample-False_anomaly-True_env-False.json similarity index 100% rename from tests/unit/alerts/alert_messages/fixtures/adaptive_card_elementary_test_alert_status-warn_link-False_description-True_tags-False_owners-True_table-False_error-True_sample-False_anomaly-True_env-False.json rename to tests/unit/alerts/alert_messages/fixtures/adaptive_card/elementary_test_alert_status-warn_link-False_description-True_tags-False_owners-True_table-False_error-True_sample-False_anomaly-True_env-False.json diff --git a/tests/unit/alerts/alert_messages/fixtures/adaptive_card_elementary_test_alert_status-warn_link-True_description-False_tags-True_owners-False_table-True_error-False_sample-True_anomaly-False_env-True.json b/tests/unit/alerts/alert_messages/fixtures/adaptive_card/elementary_test_alert_status-warn_link-True_description-False_tags-True_owners-False_table-True_error-False_sample-True_anomaly-False_env-True.json similarity index 100% rename from tests/unit/alerts/alert_messages/fixtures/adaptive_card_elementary_test_alert_status-warn_link-True_description-False_tags-True_owners-False_table-True_error-False_sample-True_anomaly-False_env-True.json rename to tests/unit/alerts/alert_messages/fixtures/adaptive_card/elementary_test_alert_status-warn_link-True_description-False_tags-True_owners-False_table-True_error-False_sample-True_anomaly-False_env-True.json diff --git a/tests/unit/alerts/alert_messages/fixtures/adaptive_card_group_by_table_model-errors-False_test-failures-False_test-warnings-True_test-errors-True_link-False_env-False.json b/tests/unit/alerts/alert_messages/fixtures/adaptive_card/group_by_table_model-errors-False_test-failures-False_test-warnings-True_test-errors-True_link-False_env-False.json similarity index 100% rename from tests/unit/alerts/alert_messages/fixtures/adaptive_card_group_by_table_model-errors-False_test-failures-False_test-warnings-True_test-errors-True_link-False_env-False.json rename to tests/unit/alerts/alert_messages/fixtures/adaptive_card/group_by_table_model-errors-False_test-failures-False_test-warnings-True_test-errors-True_link-False_env-False.json diff --git a/tests/unit/alerts/alert_messages/fixtures/adaptive_card_group_by_table_model-errors-False_test-failures-True_test-warnings-False_test-errors-False_link-False_env-False.json b/tests/unit/alerts/alert_messages/fixtures/adaptive_card/group_by_table_model-errors-False_test-failures-True_test-warnings-False_test-errors-False_link-False_env-False.json similarity index 100% rename from tests/unit/alerts/alert_messages/fixtures/adaptive_card_group_by_table_model-errors-False_test-failures-True_test-warnings-False_test-errors-False_link-False_env-False.json rename to tests/unit/alerts/alert_messages/fixtures/adaptive_card/group_by_table_model-errors-False_test-failures-True_test-warnings-False_test-errors-False_link-False_env-False.json diff --git a/tests/unit/alerts/alert_messages/fixtures/adaptive_card_group_by_table_model-errors-False_test-failures-True_test-warnings-False_test-errors-True_link-False_env-False.json b/tests/unit/alerts/alert_messages/fixtures/adaptive_card/group_by_table_model-errors-False_test-failures-True_test-warnings-False_test-errors-True_link-False_env-False.json similarity index 100% rename from tests/unit/alerts/alert_messages/fixtures/adaptive_card_group_by_table_model-errors-False_test-failures-True_test-warnings-False_test-errors-True_link-False_env-False.json rename to tests/unit/alerts/alert_messages/fixtures/adaptive_card/group_by_table_model-errors-False_test-failures-True_test-warnings-False_test-errors-True_link-False_env-False.json diff --git a/tests/unit/alerts/alert_messages/fixtures/adaptive_card_group_by_table_model-errors-False_test-failures-True_test-warnings-True_test-errors-True_link-True_env-True.json b/tests/unit/alerts/alert_messages/fixtures/adaptive_card/group_by_table_model-errors-False_test-failures-True_test-warnings-True_test-errors-True_link-True_env-True.json similarity index 100% rename from tests/unit/alerts/alert_messages/fixtures/adaptive_card_group_by_table_model-errors-False_test-failures-True_test-warnings-True_test-errors-True_link-True_env-True.json rename to tests/unit/alerts/alert_messages/fixtures/adaptive_card/group_by_table_model-errors-False_test-failures-True_test-warnings-True_test-errors-True_link-True_env-True.json diff --git a/tests/unit/alerts/alert_messages/fixtures/adaptive_card_group_by_table_model-errors-True_test-failures-False_test-warnings-False_test-errors-True_link-False_env-False.json b/tests/unit/alerts/alert_messages/fixtures/adaptive_card/group_by_table_model-errors-True_test-failures-False_test-warnings-False_test-errors-True_link-False_env-False.json similarity index 100% rename from tests/unit/alerts/alert_messages/fixtures/adaptive_card_group_by_table_model-errors-True_test-failures-False_test-warnings-False_test-errors-True_link-False_env-False.json rename to tests/unit/alerts/alert_messages/fixtures/adaptive_card/group_by_table_model-errors-True_test-failures-False_test-warnings-False_test-errors-True_link-False_env-False.json diff --git a/tests/unit/alerts/alert_messages/fixtures/adaptive_card_group_by_table_model-errors-True_test-failures-False_test-warnings-True_test-errors-False_link-True_env-False.json b/tests/unit/alerts/alert_messages/fixtures/adaptive_card/group_by_table_model-errors-True_test-failures-False_test-warnings-True_test-errors-False_link-True_env-False.json similarity index 100% rename from tests/unit/alerts/alert_messages/fixtures/adaptive_card_group_by_table_model-errors-True_test-failures-False_test-warnings-True_test-errors-False_link-True_env-False.json rename to tests/unit/alerts/alert_messages/fixtures/adaptive_card/group_by_table_model-errors-True_test-failures-False_test-warnings-True_test-errors-False_link-True_env-False.json diff --git a/tests/unit/alerts/alert_messages/fixtures/adaptive_card_group_by_table_model-errors-True_test-failures-False_test-warnings-True_test-errors-True_link-True_env-True.json b/tests/unit/alerts/alert_messages/fixtures/adaptive_card/group_by_table_model-errors-True_test-failures-False_test-warnings-True_test-errors-True_link-True_env-True.json similarity index 100% rename from tests/unit/alerts/alert_messages/fixtures/adaptive_card_group_by_table_model-errors-True_test-failures-False_test-warnings-True_test-errors-True_link-True_env-True.json rename to tests/unit/alerts/alert_messages/fixtures/adaptive_card/group_by_table_model-errors-True_test-failures-False_test-warnings-True_test-errors-True_link-True_env-True.json diff --git a/tests/unit/alerts/alert_messages/fixtures/adaptive_card_group_by_table_model-errors-True_test-failures-True_test-warnings-False_test-errors-True_link-True_env-True.json b/tests/unit/alerts/alert_messages/fixtures/adaptive_card/group_by_table_model-errors-True_test-failures-True_test-warnings-False_test-errors-True_link-True_env-True.json similarity index 100% rename from tests/unit/alerts/alert_messages/fixtures/adaptive_card_group_by_table_model-errors-True_test-failures-True_test-warnings-False_test-errors-True_link-True_env-True.json rename to tests/unit/alerts/alert_messages/fixtures/adaptive_card/group_by_table_model-errors-True_test-failures-True_test-warnings-False_test-errors-True_link-True_env-True.json diff --git a/tests/unit/alerts/alert_messages/fixtures/adaptive_card_group_by_table_model-errors-True_test-failures-True_test-warnings-True_test-errors-False_link-True_env-True.json b/tests/unit/alerts/alert_messages/fixtures/adaptive_card/group_by_table_model-errors-True_test-failures-True_test-warnings-True_test-errors-False_link-True_env-True.json similarity index 100% rename from tests/unit/alerts/alert_messages/fixtures/adaptive_card_group_by_table_model-errors-True_test-failures-True_test-warnings-True_test-errors-False_link-True_env-True.json rename to tests/unit/alerts/alert_messages/fixtures/adaptive_card/group_by_table_model-errors-True_test-failures-True_test-warnings-True_test-errors-False_link-True_env-True.json diff --git a/tests/unit/alerts/alert_messages/fixtures/adaptive_card_group_by_table_model-errors-True_test-failures-True_test-warnings-True_test-errors-True_link-True_env-True.json b/tests/unit/alerts/alert_messages/fixtures/adaptive_card/group_by_table_model-errors-True_test-failures-True_test-warnings-True_test-errors-True_link-True_env-True.json similarity index 100% rename from tests/unit/alerts/alert_messages/fixtures/adaptive_card_group_by_table_model-errors-True_test-failures-True_test-warnings-True_test-errors-True_link-True_env-True.json rename to tests/unit/alerts/alert_messages/fixtures/adaptive_card/group_by_table_model-errors-True_test-failures-True_test-warnings-True_test-errors-True_link-True_env-True.json diff --git a/tests/unit/alerts/alert_messages/fixtures/adaptive_card_model_alert_status-None_link-False_tags-False_owners-True_path-False_suppression-True_materialization-table_full_refresh-True_env-True.json b/tests/unit/alerts/alert_messages/fixtures/adaptive_card/model_alert_status-None_link-False_tags-False_owners-True_path-False_suppression-True_materialization-table_full_refresh-True_env-True.json similarity index 100% rename from tests/unit/alerts/alert_messages/fixtures/adaptive_card_model_alert_status-None_link-False_tags-False_owners-True_path-False_suppression-True_materialization-table_full_refresh-True_env-True.json rename to tests/unit/alerts/alert_messages/fixtures/adaptive_card/model_alert_status-None_link-False_tags-False_owners-True_path-False_suppression-True_materialization-table_full_refresh-True_env-True.json diff --git a/tests/unit/alerts/alert_messages/fixtures/adaptive_card_model_alert_status-None_link-True_tags-False_owners-True_path-True_suppression-True_materialization-table_full_refresh-False_env-True.json b/tests/unit/alerts/alert_messages/fixtures/adaptive_card/model_alert_status-None_link-True_tags-False_owners-True_path-True_suppression-True_materialization-table_full_refresh-False_env-True.json similarity index 100% rename from tests/unit/alerts/alert_messages/fixtures/adaptive_card_model_alert_status-None_link-True_tags-False_owners-True_path-True_suppression-True_materialization-table_full_refresh-False_env-True.json rename to tests/unit/alerts/alert_messages/fixtures/adaptive_card/model_alert_status-None_link-True_tags-False_owners-True_path-True_suppression-True_materialization-table_full_refresh-False_env-True.json diff --git a/tests/unit/alerts/alert_messages/fixtures/adaptive_card_model_alert_status-error_link-False_tags-True_owners-True_path-True_suppression-False_materialization-incremental_full_refresh-True_env-False.json b/tests/unit/alerts/alert_messages/fixtures/adaptive_card/model_alert_status-error_link-False_tags-True_owners-True_path-True_suppression-False_materialization-incremental_full_refresh-True_env-False.json similarity index 100% rename from tests/unit/alerts/alert_messages/fixtures/adaptive_card_model_alert_status-error_link-False_tags-True_owners-True_path-True_suppression-False_materialization-incremental_full_refresh-True_env-False.json rename to tests/unit/alerts/alert_messages/fixtures/adaptive_card/model_alert_status-error_link-False_tags-True_owners-True_path-True_suppression-False_materialization-incremental_full_refresh-True_env-False.json diff --git a/tests/unit/alerts/alert_messages/fixtures/adaptive_card_model_alert_status-error_link-True_tags-True_owners-False_path-False_suppression-True_materialization-view_full_refresh-True_env-True.json b/tests/unit/alerts/alert_messages/fixtures/adaptive_card/model_alert_status-error_link-True_tags-True_owners-False_path-False_suppression-True_materialization-view_full_refresh-True_env-True.json similarity index 100% rename from tests/unit/alerts/alert_messages/fixtures/adaptive_card_model_alert_status-error_link-True_tags-True_owners-False_path-False_suppression-True_materialization-view_full_refresh-True_env-True.json rename to tests/unit/alerts/alert_messages/fixtures/adaptive_card/model_alert_status-error_link-True_tags-True_owners-False_path-False_suppression-True_materialization-view_full_refresh-True_env-True.json diff --git a/tests/unit/alerts/alert_messages/fixtures/adaptive_card_model_alert_status-fail_link-False_tags-False_owners-False_path-False_suppression-False_materialization-table_full_refresh-False_env-False.json b/tests/unit/alerts/alert_messages/fixtures/adaptive_card/model_alert_status-fail_link-False_tags-False_owners-False_path-False_suppression-False_materialization-table_full_refresh-False_env-False.json similarity index 100% rename from tests/unit/alerts/alert_messages/fixtures/adaptive_card_model_alert_status-fail_link-False_tags-False_owners-False_path-False_suppression-False_materialization-table_full_refresh-False_env-False.json rename to tests/unit/alerts/alert_messages/fixtures/adaptive_card/model_alert_status-fail_link-False_tags-False_owners-False_path-False_suppression-False_materialization-table_full_refresh-False_env-False.json diff --git a/tests/unit/alerts/alert_messages/fixtures/adaptive_card_model_alert_status-fail_link-True_tags-False_owners-False_path-True_suppression-False_materialization-incremental_full_refresh-True_env-False.json b/tests/unit/alerts/alert_messages/fixtures/adaptive_card/model_alert_status-fail_link-True_tags-False_owners-False_path-True_suppression-False_materialization-incremental_full_refresh-True_env-False.json similarity index 100% rename from tests/unit/alerts/alert_messages/fixtures/adaptive_card_model_alert_status-fail_link-True_tags-False_owners-False_path-True_suppression-False_materialization-incremental_full_refresh-True_env-False.json rename to tests/unit/alerts/alert_messages/fixtures/adaptive_card/model_alert_status-fail_link-True_tags-False_owners-False_path-True_suppression-False_materialization-incremental_full_refresh-True_env-False.json diff --git a/tests/unit/alerts/alert_messages/fixtures/adaptive_card_model_alert_status-fail_link-True_tags-True_owners-True_path-True_suppression-True_materialization-table_full_refresh-True_env-True.json b/tests/unit/alerts/alert_messages/fixtures/adaptive_card/model_alert_status-fail_link-True_tags-True_owners-True_path-True_suppression-True_materialization-table_full_refresh-True_env-True.json similarity index 100% rename from tests/unit/alerts/alert_messages/fixtures/adaptive_card_model_alert_status-fail_link-True_tags-True_owners-True_path-True_suppression-True_materialization-table_full_refresh-True_env-True.json rename to tests/unit/alerts/alert_messages/fixtures/adaptive_card/model_alert_status-fail_link-True_tags-True_owners-True_path-True_suppression-True_materialization-table_full_refresh-True_env-True.json diff --git a/tests/unit/alerts/alert_messages/fixtures/adaptive_card_model_alert_status-warn_link-False_tags-True_owners-False_path-True_suppression-True_materialization-incremental_full_refresh-False_env-False.json b/tests/unit/alerts/alert_messages/fixtures/adaptive_card/model_alert_status-warn_link-False_tags-True_owners-False_path-True_suppression-True_materialization-incremental_full_refresh-False_env-False.json similarity index 100% rename from tests/unit/alerts/alert_messages/fixtures/adaptive_card_model_alert_status-warn_link-False_tags-True_owners-False_path-True_suppression-True_materialization-incremental_full_refresh-False_env-False.json rename to tests/unit/alerts/alert_messages/fixtures/adaptive_card/model_alert_status-warn_link-False_tags-True_owners-False_path-True_suppression-True_materialization-incremental_full_refresh-False_env-False.json diff --git a/tests/unit/alerts/alert_messages/fixtures/adaptive_card_model_alert_status-warn_link-False_tags-True_owners-True_path-True_suppression-True_materialization-view_full_refresh-False_env-False.json b/tests/unit/alerts/alert_messages/fixtures/adaptive_card/model_alert_status-warn_link-False_tags-True_owners-True_path-True_suppression-True_materialization-view_full_refresh-False_env-False.json similarity index 100% rename from tests/unit/alerts/alert_messages/fixtures/adaptive_card_model_alert_status-warn_link-False_tags-True_owners-True_path-True_suppression-True_materialization-view_full_refresh-False_env-False.json rename to tests/unit/alerts/alert_messages/fixtures/adaptive_card/model_alert_status-warn_link-False_tags-True_owners-True_path-True_suppression-True_materialization-view_full_refresh-False_env-False.json diff --git a/tests/unit/alerts/alert_messages/fixtures/adaptive_card_model_alert_status-warn_link-True_tags-True_owners-True_path-False_suppression-True_materialization-view_full_refresh-True_env-True.json b/tests/unit/alerts/alert_messages/fixtures/adaptive_card/model_alert_status-warn_link-True_tags-True_owners-True_path-False_suppression-True_materialization-view_full_refresh-True_env-True.json similarity index 100% rename from tests/unit/alerts/alert_messages/fixtures/adaptive_card_model_alert_status-warn_link-True_tags-True_owners-True_path-False_suppression-True_materialization-view_full_refresh-True_env-True.json rename to tests/unit/alerts/alert_messages/fixtures/adaptive_card/model_alert_status-warn_link-True_tags-True_owners-True_path-False_suppression-True_materialization-view_full_refresh-True_env-True.json diff --git a/tests/unit/alerts/alert_messages/fixtures/adaptive_card_snapshot_alert_status-None_link-False_message-False_tags-False_owners-True_path-True_suppression-False_env-True.json b/tests/unit/alerts/alert_messages/fixtures/adaptive_card/snapshot_alert_status-None_link-False_message-False_tags-False_owners-True_path-True_suppression-False_env-True.json similarity index 100% rename from tests/unit/alerts/alert_messages/fixtures/adaptive_card_snapshot_alert_status-None_link-False_message-False_tags-False_owners-True_path-True_suppression-False_env-True.json rename to tests/unit/alerts/alert_messages/fixtures/adaptive_card/snapshot_alert_status-None_link-False_message-False_tags-False_owners-True_path-True_suppression-False_env-True.json diff --git a/tests/unit/alerts/alert_messages/fixtures/adaptive_card_snapshot_alert_status-None_link-True_message-False_tags-True_owners-False_path-False_suppression-True_env-True.json b/tests/unit/alerts/alert_messages/fixtures/adaptive_card/snapshot_alert_status-None_link-True_message-False_tags-True_owners-False_path-False_suppression-True_env-True.json similarity index 100% rename from tests/unit/alerts/alert_messages/fixtures/adaptive_card_snapshot_alert_status-None_link-True_message-False_tags-True_owners-False_path-False_suppression-True_env-True.json rename to tests/unit/alerts/alert_messages/fixtures/adaptive_card/snapshot_alert_status-None_link-True_message-False_tags-True_owners-False_path-False_suppression-True_env-True.json diff --git a/tests/unit/alerts/alert_messages/fixtures/adaptive_card_snapshot_alert_status-error_link-False_message-True_tags-True_owners-False_path-False_suppression-True_env-False.json b/tests/unit/alerts/alert_messages/fixtures/adaptive_card/snapshot_alert_status-error_link-False_message-True_tags-True_owners-False_path-False_suppression-True_env-False.json similarity index 100% rename from tests/unit/alerts/alert_messages/fixtures/adaptive_card_snapshot_alert_status-error_link-False_message-True_tags-True_owners-False_path-False_suppression-True_env-False.json rename to tests/unit/alerts/alert_messages/fixtures/adaptive_card/snapshot_alert_status-error_link-False_message-True_tags-True_owners-False_path-False_suppression-True_env-False.json diff --git a/tests/unit/alerts/alert_messages/fixtures/adaptive_card_snapshot_alert_status-error_link-True_message-True_tags-False_owners-True_path-True_suppression-False_env-True.json b/tests/unit/alerts/alert_messages/fixtures/adaptive_card/snapshot_alert_status-error_link-True_message-True_tags-False_owners-True_path-True_suppression-False_env-True.json similarity index 100% rename from tests/unit/alerts/alert_messages/fixtures/adaptive_card_snapshot_alert_status-error_link-True_message-True_tags-False_owners-True_path-True_suppression-False_env-True.json rename to tests/unit/alerts/alert_messages/fixtures/adaptive_card/snapshot_alert_status-error_link-True_message-True_tags-False_owners-True_path-True_suppression-False_env-True.json diff --git a/tests/unit/alerts/alert_messages/fixtures/adaptive_card_snapshot_alert_status-fail_link-False_message-False_tags-False_owners-False_path-False_suppression-False_env-False.json b/tests/unit/alerts/alert_messages/fixtures/adaptive_card/snapshot_alert_status-fail_link-False_message-False_tags-False_owners-False_path-False_suppression-False_env-False.json similarity index 100% rename from tests/unit/alerts/alert_messages/fixtures/adaptive_card_snapshot_alert_status-fail_link-False_message-False_tags-False_owners-False_path-False_suppression-False_env-False.json rename to tests/unit/alerts/alert_messages/fixtures/adaptive_card/snapshot_alert_status-fail_link-False_message-False_tags-False_owners-False_path-False_suppression-False_env-False.json diff --git a/tests/unit/alerts/alert_messages/fixtures/adaptive_card_snapshot_alert_status-fail_link-True_message-False_tags-True_owners-True_path-False_suppression-True_env-False.json b/tests/unit/alerts/alert_messages/fixtures/adaptive_card/snapshot_alert_status-fail_link-True_message-False_tags-True_owners-True_path-False_suppression-True_env-False.json similarity index 100% rename from tests/unit/alerts/alert_messages/fixtures/adaptive_card_snapshot_alert_status-fail_link-True_message-False_tags-True_owners-True_path-False_suppression-True_env-False.json rename to tests/unit/alerts/alert_messages/fixtures/adaptive_card/snapshot_alert_status-fail_link-True_message-False_tags-True_owners-True_path-False_suppression-True_env-False.json diff --git a/tests/unit/alerts/alert_messages/fixtures/adaptive_card_snapshot_alert_status-fail_link-True_message-True_tags-True_owners-True_path-True_suppression-True_env-True.json b/tests/unit/alerts/alert_messages/fixtures/adaptive_card/snapshot_alert_status-fail_link-True_message-True_tags-True_owners-True_path-True_suppression-True_env-True.json similarity index 100% rename from tests/unit/alerts/alert_messages/fixtures/adaptive_card_snapshot_alert_status-fail_link-True_message-True_tags-True_owners-True_path-True_suppression-True_env-True.json rename to tests/unit/alerts/alert_messages/fixtures/adaptive_card/snapshot_alert_status-fail_link-True_message-True_tags-True_owners-True_path-True_suppression-True_env-True.json diff --git a/tests/unit/alerts/alert_messages/fixtures/adaptive_card_snapshot_alert_status-warn_link-False_message-True_tags-False_owners-True_path-False_suppression-True_env-False.json b/tests/unit/alerts/alert_messages/fixtures/adaptive_card/snapshot_alert_status-warn_link-False_message-True_tags-False_owners-True_path-False_suppression-True_env-False.json similarity index 100% rename from tests/unit/alerts/alert_messages/fixtures/adaptive_card_snapshot_alert_status-warn_link-False_message-True_tags-False_owners-True_path-False_suppression-True_env-False.json rename to tests/unit/alerts/alert_messages/fixtures/adaptive_card/snapshot_alert_status-warn_link-False_message-True_tags-False_owners-True_path-False_suppression-True_env-False.json diff --git a/tests/unit/alerts/alert_messages/fixtures/adaptive_card_snapshot_alert_status-warn_link-False_message-True_tags-True_owners-False_path-True_suppression-False_env-False.json b/tests/unit/alerts/alert_messages/fixtures/adaptive_card/snapshot_alert_status-warn_link-False_message-True_tags-True_owners-False_path-True_suppression-False_env-False.json similarity index 100% rename from tests/unit/alerts/alert_messages/fixtures/adaptive_card_snapshot_alert_status-warn_link-False_message-True_tags-True_owners-False_path-True_suppression-False_env-False.json rename to tests/unit/alerts/alert_messages/fixtures/adaptive_card/snapshot_alert_status-warn_link-False_message-True_tags-True_owners-False_path-True_suppression-False_env-False.json diff --git a/tests/unit/alerts/alert_messages/fixtures/adaptive_card_snapshot_alert_status-warn_link-True_message-False_tags-True_owners-False_path-True_suppression-False_env-True.json b/tests/unit/alerts/alert_messages/fixtures/adaptive_card/snapshot_alert_status-warn_link-True_message-False_tags-True_owners-False_path-True_suppression-False_env-True.json similarity index 100% rename from tests/unit/alerts/alert_messages/fixtures/adaptive_card_snapshot_alert_status-warn_link-True_message-False_tags-True_owners-False_path-True_suppression-False_env-True.json rename to tests/unit/alerts/alert_messages/fixtures/adaptive_card/snapshot_alert_status-warn_link-True_message-False_tags-True_owners-False_path-True_suppression-False_env-True.json diff --git a/tests/unit/alerts/alert_messages/fixtures/adaptive_card_source_freshness_alert_status-error_link-False_message-False_tags-True_owners-True_path-True_error-True_suppression-False_env-False.json b/tests/unit/alerts/alert_messages/fixtures/adaptive_card/source_freshness_alert_status-error_link-False_message-False_tags-True_owners-True_path-True_error-True_suppression-False_env-False.json similarity index 100% rename from tests/unit/alerts/alert_messages/fixtures/adaptive_card_source_freshness_alert_status-error_link-False_message-False_tags-True_owners-True_path-True_error-True_suppression-False_env-False.json rename to tests/unit/alerts/alert_messages/fixtures/adaptive_card/source_freshness_alert_status-error_link-False_message-False_tags-True_owners-True_path-True_error-True_suppression-False_env-False.json diff --git a/tests/unit/alerts/alert_messages/fixtures/adaptive_card_source_freshness_alert_status-error_link-False_message-True_tags-True_owners-True_path-False_error-True_suppression-False_env-True.json b/tests/unit/alerts/alert_messages/fixtures/adaptive_card/source_freshness_alert_status-error_link-False_message-True_tags-True_owners-True_path-False_error-True_suppression-False_env-True.json similarity index 100% rename from tests/unit/alerts/alert_messages/fixtures/adaptive_card_source_freshness_alert_status-error_link-False_message-True_tags-True_owners-True_path-False_error-True_suppression-False_env-True.json rename to tests/unit/alerts/alert_messages/fixtures/adaptive_card/source_freshness_alert_status-error_link-False_message-True_tags-True_owners-True_path-False_error-True_suppression-False_env-True.json diff --git a/tests/unit/alerts/alert_messages/fixtures/adaptive_card_source_freshness_alert_status-error_link-True_message-False_tags-False_owners-False_path-False_error-False_suppression-True_env-False.json b/tests/unit/alerts/alert_messages/fixtures/adaptive_card/source_freshness_alert_status-error_link-True_message-False_tags-False_owners-False_path-False_error-False_suppression-True_env-False.json similarity index 100% rename from tests/unit/alerts/alert_messages/fixtures/adaptive_card_source_freshness_alert_status-error_link-True_message-False_tags-False_owners-False_path-False_error-False_suppression-True_env-False.json rename to tests/unit/alerts/alert_messages/fixtures/adaptive_card/source_freshness_alert_status-error_link-True_message-False_tags-False_owners-False_path-False_error-False_suppression-True_env-False.json diff --git a/tests/unit/alerts/alert_messages/fixtures/adaptive_card_source_freshness_alert_status-error_link-True_message-False_tags-True_owners-True_path-True_error-False_suppression-True_env-False.json b/tests/unit/alerts/alert_messages/fixtures/adaptive_card/source_freshness_alert_status-error_link-True_message-False_tags-True_owners-True_path-True_error-False_suppression-True_env-False.json similarity index 100% rename from tests/unit/alerts/alert_messages/fixtures/adaptive_card_source_freshness_alert_status-error_link-True_message-False_tags-True_owners-True_path-True_error-False_suppression-True_env-False.json rename to tests/unit/alerts/alert_messages/fixtures/adaptive_card/source_freshness_alert_status-error_link-True_message-False_tags-True_owners-True_path-True_error-False_suppression-True_env-False.json diff --git a/tests/unit/alerts/alert_messages/fixtures/adaptive_card_source_freshness_alert_status-error_link-True_message-True_tags-False_owners-False_path-True_error-True_suppression-True_env-True.json b/tests/unit/alerts/alert_messages/fixtures/adaptive_card/source_freshness_alert_status-error_link-True_message-True_tags-False_owners-False_path-True_error-True_suppression-True_env-True.json similarity index 100% rename from tests/unit/alerts/alert_messages/fixtures/adaptive_card_source_freshness_alert_status-error_link-True_message-True_tags-False_owners-False_path-True_error-True_suppression-True_env-True.json rename to tests/unit/alerts/alert_messages/fixtures/adaptive_card/source_freshness_alert_status-error_link-True_message-True_tags-False_owners-False_path-True_error-True_suppression-True_env-True.json diff --git a/tests/unit/alerts/alert_messages/fixtures/adaptive_card_source_freshness_alert_status-runtime error_link-False_message-False_tags-False_owners-False_path-False_error-False_suppression-False_env-False.json b/tests/unit/alerts/alert_messages/fixtures/adaptive_card/source_freshness_alert_status-runtime error_link-False_message-False_tags-False_owners-False_path-False_error-False_suppression-False_env-False.json similarity index 100% rename from tests/unit/alerts/alert_messages/fixtures/adaptive_card_source_freshness_alert_status-runtime error_link-False_message-False_tags-False_owners-False_path-False_error-False_suppression-False_env-False.json rename to tests/unit/alerts/alert_messages/fixtures/adaptive_card/source_freshness_alert_status-runtime error_link-False_message-False_tags-False_owners-False_path-False_error-False_suppression-False_env-False.json diff --git a/tests/unit/alerts/alert_messages/fixtures/adaptive_card_source_freshness_alert_status-runtime error_link-False_message-True_tags-True_owners-False_path-False_error-True_suppression-True_env-True.json b/tests/unit/alerts/alert_messages/fixtures/adaptive_card/source_freshness_alert_status-runtime error_link-False_message-True_tags-True_owners-False_path-False_error-True_suppression-True_env-True.json similarity index 100% rename from tests/unit/alerts/alert_messages/fixtures/adaptive_card_source_freshness_alert_status-runtime error_link-False_message-True_tags-True_owners-False_path-False_error-True_suppression-True_env-True.json rename to tests/unit/alerts/alert_messages/fixtures/adaptive_card/source_freshness_alert_status-runtime error_link-False_message-True_tags-True_owners-False_path-False_error-True_suppression-True_env-True.json diff --git a/tests/unit/alerts/alert_messages/fixtures/adaptive_card_source_freshness_alert_status-runtime error_link-True_message-False_tags-True_owners-False_path-True_error-False_suppression-True_env-True.json b/tests/unit/alerts/alert_messages/fixtures/adaptive_card/source_freshness_alert_status-runtime error_link-True_message-False_tags-True_owners-False_path-True_error-False_suppression-True_env-True.json similarity index 100% rename from tests/unit/alerts/alert_messages/fixtures/adaptive_card_source_freshness_alert_status-runtime error_link-True_message-False_tags-True_owners-False_path-True_error-False_suppression-True_env-True.json rename to tests/unit/alerts/alert_messages/fixtures/adaptive_card/source_freshness_alert_status-runtime error_link-True_message-False_tags-True_owners-False_path-True_error-False_suppression-True_env-True.json diff --git a/tests/unit/alerts/alert_messages/fixtures/adaptive_card_source_freshness_alert_status-runtime error_link-True_message-True_tags-False_owners-True_path-False_error-True_suppression-False_env-True.json b/tests/unit/alerts/alert_messages/fixtures/adaptive_card/source_freshness_alert_status-runtime error_link-True_message-True_tags-False_owners-True_path-False_error-True_suppression-False_env-True.json similarity index 100% rename from tests/unit/alerts/alert_messages/fixtures/adaptive_card_source_freshness_alert_status-runtime error_link-True_message-True_tags-False_owners-True_path-False_error-True_suppression-False_env-True.json rename to tests/unit/alerts/alert_messages/fixtures/adaptive_card/source_freshness_alert_status-runtime error_link-True_message-True_tags-False_owners-True_path-False_error-True_suppression-False_env-True.json diff --git a/tests/unit/alerts/alert_messages/fixtures/adaptive_card_source_freshness_alert_status-runtime error_link-True_message-True_tags-True_owners-True_path-True_error-True_suppression-True_env-True.json b/tests/unit/alerts/alert_messages/fixtures/adaptive_card/source_freshness_alert_status-runtime error_link-True_message-True_tags-True_owners-True_path-True_error-True_suppression-True_env-True.json similarity index 100% rename from tests/unit/alerts/alert_messages/fixtures/adaptive_card_source_freshness_alert_status-runtime error_link-True_message-True_tags-True_owners-True_path-True_error-True_suppression-True_env-True.json rename to tests/unit/alerts/alert_messages/fixtures/adaptive_card/source_freshness_alert_status-runtime error_link-True_message-True_tags-True_owners-True_path-True_error-True_suppression-True_env-True.json diff --git a/tests/unit/alerts/alert_messages/fixtures/block_kit/alerts_group_model-errors-False_test-failures-False_test-warnings-True_test-errors-True_link-False_env-False.json b/tests/unit/alerts/alert_messages/fixtures/block_kit/alerts_group_model-errors-False_test-failures-False_test-warnings-True_test-errors-True_link-False_env-False.json new file mode 100644 index 000000000..63d4ef4df --- /dev/null +++ b/tests/unit/alerts/alert_messages/fixtures/block_kit/alerts_group_model-errors-False_test-failures-False_test-warnings-True_test-errors-True_link-False_env-False.json @@ -0,0 +1,59 @@ +{ + "blocks": [ + { + "type": "header", + "text": { + "type": "plain_text", + "text": "Error: 20 issues detected" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u26a0\ufe0f *Test Warnings:* 10 | \u2757 *Test Errors:* 10" + } + }, + { + "type": "divider" + } + ], + "attachments": [ + { + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Test Warnings*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u26a0\ufe0f *\"test_short_name\" test failed on test_table_1*\n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_2* - Owner: <@resolved_owner1>\n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_3* - Owners: <@resolved_owner1>, <@resolved_owner2>\n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_4*\n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_5* - Owner: <@resolved_owner1>\n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_6* - Owners: <@resolved_owner1>, <@resolved_owner2>\n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_7*\n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_8* - Owner: <@resolved_owner1>\n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_9* - Owners: <@resolved_owner1>, <@resolved_owner2>\n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_10*" + } + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Test Errors*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u2757 *\"test_short_name\" test failed on test_table_1*\n\u2757 *\"test_short_name\" test failed on test_table_2* - Owner: <@resolved_owner1>\n\u2757 *\"test_short_name\" test failed on test_table_3* - Owners: <@resolved_owner1>, <@resolved_owner2>\n\u2757 *\"test_short_name\" test failed on test_table_4*\n\u2757 *\"test_short_name\" test failed on test_table_5* - Owner: <@resolved_owner1>\n\u2757 *\"test_short_name\" test failed on test_table_6* - Owners: <@resolved_owner1>, <@resolved_owner2>\n\u2757 *\"test_short_name\" test failed on test_table_7*\n\u2757 *\"test_short_name\" test failed on test_table_8* - Owner: <@resolved_owner1>\n\u2757 *\"test_short_name\" test failed on test_table_9* - Owners: <@resolved_owner1>, <@resolved_owner2>\n\u2757 *\"test_short_name\" test failed on test_table_10*" + } + } + ], + "color": "#ff0000" + } + ] +} diff --git a/tests/unit/alerts/alert_messages/fixtures/block_kit/alerts_group_model-errors-False_test-failures-True_test-warnings-False_test-errors-False_link-False_env-False.json b/tests/unit/alerts/alert_messages/fixtures/block_kit/alerts_group_model-errors-False_test-failures-True_test-warnings-False_test-errors-False_link-False_env-False.json new file mode 100644 index 000000000..08e9a86e1 --- /dev/null +++ b/tests/unit/alerts/alert_messages/fixtures/block_kit/alerts_group_model-errors-False_test-failures-True_test-warnings-False_test-errors-False_link-False_env-False.json @@ -0,0 +1,41 @@ +{ + "blocks": [ + { + "type": "header", + "text": { + "type": "plain_text", + "text": "Failure: 10 issues detected" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\ud83d\udd3a *Test Failures:* 10" + } + }, + { + "type": "divider" + } + ], + "attachments": [ + { + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Test Failures*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\ud83d\udd3a *\"test_short_name\" test failed on test_table_1*\n\ud83d\udd3a *\"test_short_name\" test failed on test_table_2* - Owner: <@resolved_owner1>\n\ud83d\udd3a *\"test_short_name\" test failed on test_table_3* - Owners: <@resolved_owner1>, <@resolved_owner2>\n\ud83d\udd3a *\"test_short_name\" test failed on test_table_4*\n\ud83d\udd3a *\"test_short_name\" test failed on test_table_5* - Owner: <@resolved_owner1>\n\ud83d\udd3a *\"test_short_name\" test failed on test_table_6* - Owners: <@resolved_owner1>, <@resolved_owner2>\n\ud83d\udd3a *\"test_short_name\" test failed on test_table_7*\n\ud83d\udd3a *\"test_short_name\" test failed on test_table_8* - Owner: <@resolved_owner1>\n\ud83d\udd3a *\"test_short_name\" test failed on test_table_9* - Owners: <@resolved_owner1>, <@resolved_owner2>\n\ud83d\udd3a *\"test_short_name\" test failed on test_table_10*" + } + } + ] + } + ] +} diff --git a/tests/unit/alerts/alert_messages/fixtures/block_kit/alerts_group_model-errors-False_test-failures-True_test-warnings-False_test-errors-True_link-False_env-False.json b/tests/unit/alerts/alert_messages/fixtures/block_kit/alerts_group_model-errors-False_test-failures-True_test-warnings-False_test-errors-True_link-False_env-False.json new file mode 100644 index 000000000..d6790ae0c --- /dev/null +++ b/tests/unit/alerts/alert_messages/fixtures/block_kit/alerts_group_model-errors-False_test-failures-True_test-warnings-False_test-errors-True_link-False_env-False.json @@ -0,0 +1,59 @@ +{ + "blocks": [ + { + "type": "header", + "text": { + "type": "plain_text", + "text": "Error: 20 issues detected" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\ud83d\udd3a *Test Failures:* 10 | \u2757 *Test Errors:* 10" + } + }, + { + "type": "divider" + } + ], + "attachments": [ + { + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Test Failures*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\ud83d\udd3a *\"test_short_name\" test failed on test_table_1*\n\ud83d\udd3a *\"test_short_name\" test failed on test_table_2* - Owner: <@resolved_owner1>\n\ud83d\udd3a *\"test_short_name\" test failed on test_table_3* - Owners: <@resolved_owner1>, <@resolved_owner2>\n\ud83d\udd3a *\"test_short_name\" test failed on test_table_4*\n\ud83d\udd3a *\"test_short_name\" test failed on test_table_5* - Owner: <@resolved_owner1>\n\ud83d\udd3a *\"test_short_name\" test failed on test_table_6* - Owners: <@resolved_owner1>, <@resolved_owner2>\n\ud83d\udd3a *\"test_short_name\" test failed on test_table_7*\n\ud83d\udd3a *\"test_short_name\" test failed on test_table_8* - Owner: <@resolved_owner1>\n\ud83d\udd3a *\"test_short_name\" test failed on test_table_9* - Owners: <@resolved_owner1>, <@resolved_owner2>\n\ud83d\udd3a *\"test_short_name\" test failed on test_table_10*" + } + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Test Errors*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u2757 *\"test_short_name\" test failed on test_table_1*\n\u2757 *\"test_short_name\" test failed on test_table_2* - Owner: <@resolved_owner1>\n\u2757 *\"test_short_name\" test failed on test_table_3* - Owners: <@resolved_owner1>, <@resolved_owner2>\n\u2757 *\"test_short_name\" test failed on test_table_4*\n\u2757 *\"test_short_name\" test failed on test_table_5* - Owner: <@resolved_owner1>\n\u2757 *\"test_short_name\" test failed on test_table_6* - Owners: <@resolved_owner1>, <@resolved_owner2>\n\u2757 *\"test_short_name\" test failed on test_table_7*\n\u2757 *\"test_short_name\" test failed on test_table_8* - Owner: <@resolved_owner1>\n\u2757 *\"test_short_name\" test failed on test_table_9* - Owners: <@resolved_owner1>, <@resolved_owner2>\n\u2757 *\"test_short_name\" test failed on test_table_10*" + } + } + ], + "color": "#ff0000" + } + ] +} diff --git a/tests/unit/alerts/alert_messages/fixtures/block_kit/alerts_group_model-errors-False_test-failures-True_test-warnings-True_test-errors-True_link-True_env-True.json b/tests/unit/alerts/alert_messages/fixtures/block_kit/alerts_group_model-errors-False_test-failures-True_test-warnings-True_test-errors-True_link-True_env-True.json new file mode 100644 index 000000000..1036da3c0 --- /dev/null +++ b/tests/unit/alerts/alert_messages/fixtures/block_kit/alerts_group_model-errors-False_test-failures-True_test-warnings-True_test-errors-True_link-True_env-True.json @@ -0,0 +1,76 @@ +{ + "blocks": [ + { + "type": "header", + "text": { + "type": "plain_text", + "text": "Error: 30 issues detected" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\ud83d\udd3a *Test Failures:* 10 | \u26a0\ufe0f *Test Warnings:* 10 | \u2757 *Test Errors:* 10 | *Env:* Test Env" + } + }, + { + "type": "divider" + } + ], + "attachments": [ + { + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Test Failures*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\ud83d\udd3a *\"test_short_name\" test failed on test_table_1* - \n\ud83d\udd3a *\"test_short_name\" test failed on test_table_2* - Owner: <@resolved_owner1> - \n\ud83d\udd3a *\"test_short_name\" test failed on test_table_3* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\ud83d\udd3a *\"test_short_name\" test failed on test_table_4* - \n\ud83d\udd3a *\"test_short_name\" test failed on test_table_5* - Owner: <@resolved_owner1> - \n\ud83d\udd3a *\"test_short_name\" test failed on test_table_6* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\ud83d\udd3a *\"test_short_name\" test failed on test_table_7* - \n\ud83d\udd3a *\"test_short_name\" test failed on test_table_8* - Owner: <@resolved_owner1> - \n\ud83d\udd3a *\"test_short_name\" test failed on test_table_9* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\ud83d\udd3a *\"test_short_name\" test failed on test_table_10* - " + } + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Test Warnings*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u26a0\ufe0f *\"test_short_name\" test failed on test_table_1* - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_2* - Owner: <@resolved_owner1> - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_3* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_4* - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_5* - Owner: <@resolved_owner1> - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_6* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_7* - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_8* - Owner: <@resolved_owner1> - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_9* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_10* - " + } + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Test Errors*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u2757 *\"test_short_name\" test failed on test_table_1* - \n\u2757 *\"test_short_name\" test failed on test_table_2* - Owner: <@resolved_owner1> - \n\u2757 *\"test_short_name\" test failed on test_table_3* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\u2757 *\"test_short_name\" test failed on test_table_4* - \n\u2757 *\"test_short_name\" test failed on test_table_5* - Owner: <@resolved_owner1> - \n\u2757 *\"test_short_name\" test failed on test_table_6* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\u2757 *\"test_short_name\" test failed on test_table_7* - \n\u2757 *\"test_short_name\" test failed on test_table_8* - Owner: <@resolved_owner1> - \n\u2757 *\"test_short_name\" test failed on test_table_9* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\u2757 *\"test_short_name\" test failed on test_table_10* - " + } + } + ], + "color": "#ff0000" + } + ] +} diff --git a/tests/unit/alerts/alert_messages/fixtures/block_kit/alerts_group_model-errors-True_test-failures-False_test-warnings-False_test-errors-True_link-False_env-False.json b/tests/unit/alerts/alert_messages/fixtures/block_kit/alerts_group_model-errors-True_test-failures-False_test-warnings-False_test-errors-True_link-False_env-False.json new file mode 100644 index 000000000..fe59f75e6 --- /dev/null +++ b/tests/unit/alerts/alert_messages/fixtures/block_kit/alerts_group_model-errors-True_test-failures-False_test-warnings-False_test-errors-True_link-False_env-False.json @@ -0,0 +1,59 @@ +{ + "blocks": [ + { + "type": "header", + "text": { + "type": "plain_text", + "text": "Error: 20 issues detected" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u274c *Model Errors:* 10 | \u2757 *Test Errors:* 10" + } + }, + { + "type": "divider" + } + ], + "attachments": [ + { + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Model Errors*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u274c *dbt failed to build table \"test_model\"*\n\u274c *dbt failed to build table \"test_model\"* - Owner: <@resolved_owner1>\n\u274c *dbt failed to build table \"test_model\"* - Owners: <@resolved_owner1>, <@resolved_owner2>\n\u274c *dbt failed to build table \"test_model\"*\n\u274c *dbt failed to build table \"test_model\"* - Owner: <@resolved_owner1>\n\u274c *dbt failed to build table \"test_model\"* - Owners: <@resolved_owner1>, <@resolved_owner2>\n\u274c *dbt failed to build table \"test_model\"*\n\u274c *dbt failed to build table \"test_model\"* - Owner: <@resolved_owner1>\n\u274c *dbt failed to build table \"test_model\"* - Owners: <@resolved_owner1>, <@resolved_owner2>\n\u274c *dbt failed to build table \"test_model\"*" + } + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Test Errors*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u2757 *\"test_short_name\" test failed on test_table_1*\n\u2757 *\"test_short_name\" test failed on test_table_2* - Owner: <@resolved_owner1>\n\u2757 *\"test_short_name\" test failed on test_table_3* - Owners: <@resolved_owner1>, <@resolved_owner2>\n\u2757 *\"test_short_name\" test failed on test_table_4*\n\u2757 *\"test_short_name\" test failed on test_table_5* - Owner: <@resolved_owner1>\n\u2757 *\"test_short_name\" test failed on test_table_6* - Owners: <@resolved_owner1>, <@resolved_owner2>\n\u2757 *\"test_short_name\" test failed on test_table_7*\n\u2757 *\"test_short_name\" test failed on test_table_8* - Owner: <@resolved_owner1>\n\u2757 *\"test_short_name\" test failed on test_table_9* - Owners: <@resolved_owner1>, <@resolved_owner2>\n\u2757 *\"test_short_name\" test failed on test_table_10*" + } + } + ], + "color": "#ff0000" + } + ] +} diff --git a/tests/unit/alerts/alert_messages/fixtures/block_kit/alerts_group_model-errors-True_test-failures-False_test-warnings-True_test-errors-False_link-True_env-False.json b/tests/unit/alerts/alert_messages/fixtures/block_kit/alerts_group_model-errors-True_test-failures-False_test-warnings-True_test-errors-False_link-True_env-False.json new file mode 100644 index 000000000..763ae0e31 --- /dev/null +++ b/tests/unit/alerts/alert_messages/fixtures/block_kit/alerts_group_model-errors-True_test-failures-False_test-warnings-True_test-errors-False_link-True_env-False.json @@ -0,0 +1,59 @@ +{ + "blocks": [ + { + "type": "header", + "text": { + "type": "plain_text", + "text": "Error: 20 issues detected" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u274c *Model Errors:* 10 | \u26a0\ufe0f *Test Warnings:* 10" + } + }, + { + "type": "divider" + } + ], + "attachments": [ + { + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Model Errors*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u274c *dbt failed to build table \"test_model\"* - \n\u274c *dbt failed to build table \"test_model\"* - Owner: <@resolved_owner1> - \n\u274c *dbt failed to build table \"test_model\"* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\u274c *dbt failed to build table \"test_model\"* - \n\u274c *dbt failed to build table \"test_model\"* - Owner: <@resolved_owner1> - \n\u274c *dbt failed to build table \"test_model\"* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\u274c *dbt failed to build table \"test_model\"* - \n\u274c *dbt failed to build table \"test_model\"* - Owner: <@resolved_owner1> - \n\u274c *dbt failed to build table \"test_model\"* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\u274c *dbt failed to build table \"test_model\"* - " + } + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Test Warnings*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u26a0\ufe0f *\"test_short_name\" test failed on test_table_1* - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_2* - Owner: <@resolved_owner1> - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_3* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_4* - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_5* - Owner: <@resolved_owner1> - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_6* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_7* - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_8* - Owner: <@resolved_owner1> - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_9* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_10* - " + } + } + ], + "color": "#ff0000" + } + ] +} diff --git a/tests/unit/alerts/alert_messages/fixtures/block_kit/alerts_group_model-errors-True_test-failures-False_test-warnings-True_test-errors-True_link-True_env-True.json b/tests/unit/alerts/alert_messages/fixtures/block_kit/alerts_group_model-errors-True_test-failures-False_test-warnings-True_test-errors-True_link-True_env-True.json new file mode 100644 index 000000000..1d060f861 --- /dev/null +++ b/tests/unit/alerts/alert_messages/fixtures/block_kit/alerts_group_model-errors-True_test-failures-False_test-warnings-True_test-errors-True_link-True_env-True.json @@ -0,0 +1,76 @@ +{ + "blocks": [ + { + "type": "header", + "text": { + "type": "plain_text", + "text": "Error: 30 issues detected" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u274c *Model Errors:* 10 | \u26a0\ufe0f *Test Warnings:* 10 | \u2757 *Test Errors:* 10 | *Env:* Test Env" + } + }, + { + "type": "divider" + } + ], + "attachments": [ + { + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Model Errors*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u274c *dbt failed to build table \"test_model\"* - \n\u274c *dbt failed to build table \"test_model\"* - Owner: <@resolved_owner1> - \n\u274c *dbt failed to build table \"test_model\"* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\u274c *dbt failed to build table \"test_model\"* - \n\u274c *dbt failed to build table \"test_model\"* - Owner: <@resolved_owner1> - \n\u274c *dbt failed to build table \"test_model\"* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\u274c *dbt failed to build table \"test_model\"* - \n\u274c *dbt failed to build table \"test_model\"* - Owner: <@resolved_owner1> - \n\u274c *dbt failed to build table \"test_model\"* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\u274c *dbt failed to build table \"test_model\"* - " + } + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Test Warnings*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u26a0\ufe0f *\"test_short_name\" test failed on test_table_1* - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_2* - Owner: <@resolved_owner1> - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_3* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_4* - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_5* - Owner: <@resolved_owner1> - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_6* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_7* - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_8* - Owner: <@resolved_owner1> - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_9* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_10* - " + } + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Test Errors*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u2757 *\"test_short_name\" test failed on test_table_1* - \n\u2757 *\"test_short_name\" test failed on test_table_2* - Owner: <@resolved_owner1> - \n\u2757 *\"test_short_name\" test failed on test_table_3* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\u2757 *\"test_short_name\" test failed on test_table_4* - \n\u2757 *\"test_short_name\" test failed on test_table_5* - Owner: <@resolved_owner1> - \n\u2757 *\"test_short_name\" test failed on test_table_6* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\u2757 *\"test_short_name\" test failed on test_table_7* - \n\u2757 *\"test_short_name\" test failed on test_table_8* - Owner: <@resolved_owner1> - \n\u2757 *\"test_short_name\" test failed on test_table_9* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\u2757 *\"test_short_name\" test failed on test_table_10* - " + } + } + ], + "color": "#ff0000" + } + ] +} diff --git a/tests/unit/alerts/alert_messages/fixtures/block_kit/alerts_group_model-errors-True_test-failures-True_test-warnings-False_test-errors-True_link-True_env-True.json b/tests/unit/alerts/alert_messages/fixtures/block_kit/alerts_group_model-errors-True_test-failures-True_test-warnings-False_test-errors-True_link-True_env-True.json new file mode 100644 index 000000000..ec9027cf8 --- /dev/null +++ b/tests/unit/alerts/alert_messages/fixtures/block_kit/alerts_group_model-errors-True_test-failures-True_test-warnings-False_test-errors-True_link-True_env-True.json @@ -0,0 +1,76 @@ +{ + "blocks": [ + { + "type": "header", + "text": { + "type": "plain_text", + "text": "Error: 30 issues detected" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u274c *Model Errors:* 10 | \ud83d\udd3a *Test Failures:* 10 | \u2757 *Test Errors:* 10 | *Env:* Test Env" + } + }, + { + "type": "divider" + } + ], + "attachments": [ + { + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Model Errors*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u274c *dbt failed to build table \"test_model\"* - \n\u274c *dbt failed to build table \"test_model\"* - Owner: <@resolved_owner1> - \n\u274c *dbt failed to build table \"test_model\"* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\u274c *dbt failed to build table \"test_model\"* - \n\u274c *dbt failed to build table \"test_model\"* - Owner: <@resolved_owner1> - \n\u274c *dbt failed to build table \"test_model\"* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\u274c *dbt failed to build table \"test_model\"* - \n\u274c *dbt failed to build table \"test_model\"* - Owner: <@resolved_owner1> - \n\u274c *dbt failed to build table \"test_model\"* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\u274c *dbt failed to build table \"test_model\"* - " + } + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Test Failures*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\ud83d\udd3a *\"test_short_name\" test failed on test_table_1* - \n\ud83d\udd3a *\"test_short_name\" test failed on test_table_2* - Owner: <@resolved_owner1> - \n\ud83d\udd3a *\"test_short_name\" test failed on test_table_3* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\ud83d\udd3a *\"test_short_name\" test failed on test_table_4* - \n\ud83d\udd3a *\"test_short_name\" test failed on test_table_5* - Owner: <@resolved_owner1> - \n\ud83d\udd3a *\"test_short_name\" test failed on test_table_6* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\ud83d\udd3a *\"test_short_name\" test failed on test_table_7* - \n\ud83d\udd3a *\"test_short_name\" test failed on test_table_8* - Owner: <@resolved_owner1> - \n\ud83d\udd3a *\"test_short_name\" test failed on test_table_9* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\ud83d\udd3a *\"test_short_name\" test failed on test_table_10* - " + } + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Test Errors*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u2757 *\"test_short_name\" test failed on test_table_1* - \n\u2757 *\"test_short_name\" test failed on test_table_2* - Owner: <@resolved_owner1> - \n\u2757 *\"test_short_name\" test failed on test_table_3* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\u2757 *\"test_short_name\" test failed on test_table_4* - \n\u2757 *\"test_short_name\" test failed on test_table_5* - Owner: <@resolved_owner1> - \n\u2757 *\"test_short_name\" test failed on test_table_6* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\u2757 *\"test_short_name\" test failed on test_table_7* - \n\u2757 *\"test_short_name\" test failed on test_table_8* - Owner: <@resolved_owner1> - \n\u2757 *\"test_short_name\" test failed on test_table_9* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\u2757 *\"test_short_name\" test failed on test_table_10* - " + } + } + ], + "color": "#ff0000" + } + ] +} diff --git a/tests/unit/alerts/alert_messages/fixtures/block_kit/alerts_group_model-errors-True_test-failures-True_test-warnings-True_test-errors-False_link-True_env-True.json b/tests/unit/alerts/alert_messages/fixtures/block_kit/alerts_group_model-errors-True_test-failures-True_test-warnings-True_test-errors-False_link-True_env-True.json new file mode 100644 index 000000000..c6ab4b0a7 --- /dev/null +++ b/tests/unit/alerts/alert_messages/fixtures/block_kit/alerts_group_model-errors-True_test-failures-True_test-warnings-True_test-errors-False_link-True_env-True.json @@ -0,0 +1,76 @@ +{ + "blocks": [ + { + "type": "header", + "text": { + "type": "plain_text", + "text": "Error: 30 issues detected" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u274c *Model Errors:* 10 | \ud83d\udd3a *Test Failures:* 10 | \u26a0\ufe0f *Test Warnings:* 10 | *Env:* Test Env" + } + }, + { + "type": "divider" + } + ], + "attachments": [ + { + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Model Errors*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u274c *dbt failed to build table \"test_model\"* - \n\u274c *dbt failed to build table \"test_model\"* - Owner: <@resolved_owner1> - \n\u274c *dbt failed to build table \"test_model\"* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\u274c *dbt failed to build table \"test_model\"* - \n\u274c *dbt failed to build table \"test_model\"* - Owner: <@resolved_owner1> - \n\u274c *dbt failed to build table \"test_model\"* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\u274c *dbt failed to build table \"test_model\"* - \n\u274c *dbt failed to build table \"test_model\"* - Owner: <@resolved_owner1> - \n\u274c *dbt failed to build table \"test_model\"* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\u274c *dbt failed to build table \"test_model\"* - " + } + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Test Failures*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\ud83d\udd3a *\"test_short_name\" test failed on test_table_1* - \n\ud83d\udd3a *\"test_short_name\" test failed on test_table_2* - Owner: <@resolved_owner1> - \n\ud83d\udd3a *\"test_short_name\" test failed on test_table_3* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\ud83d\udd3a *\"test_short_name\" test failed on test_table_4* - \n\ud83d\udd3a *\"test_short_name\" test failed on test_table_5* - Owner: <@resolved_owner1> - \n\ud83d\udd3a *\"test_short_name\" test failed on test_table_6* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\ud83d\udd3a *\"test_short_name\" test failed on test_table_7* - \n\ud83d\udd3a *\"test_short_name\" test failed on test_table_8* - Owner: <@resolved_owner1> - \n\ud83d\udd3a *\"test_short_name\" test failed on test_table_9* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\ud83d\udd3a *\"test_short_name\" test failed on test_table_10* - " + } + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Test Warnings*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u26a0\ufe0f *\"test_short_name\" test failed on test_table_1* - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_2* - Owner: <@resolved_owner1> - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_3* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_4* - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_5* - Owner: <@resolved_owner1> - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_6* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_7* - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_8* - Owner: <@resolved_owner1> - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_9* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_10* - " + } + } + ], + "color": "#ff0000" + } + ] +} diff --git a/tests/unit/alerts/alert_messages/fixtures/block_kit/alerts_group_model-errors-True_test-failures-True_test-warnings-True_test-errors-True_link-True_env-True.json b/tests/unit/alerts/alert_messages/fixtures/block_kit/alerts_group_model-errors-True_test-failures-True_test-warnings-True_test-errors-True_link-True_env-True.json new file mode 100644 index 000000000..019926ffb --- /dev/null +++ b/tests/unit/alerts/alert_messages/fixtures/block_kit/alerts_group_model-errors-True_test-failures-True_test-warnings-True_test-errors-True_link-True_env-True.json @@ -0,0 +1,93 @@ +{ + "blocks": [ + { + "type": "header", + "text": { + "type": "plain_text", + "text": "Error: 40 issues detected" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u274c *Model Errors:* 10 | \ud83d\udd3a *Test Failures:* 10 | \u26a0\ufe0f *Test Warnings:* 10 | \u2757 *Test Errors:* 10 | *Env:* Test Env" + } + }, + { + "type": "divider" + } + ], + "attachments": [ + { + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Model Errors*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u274c *dbt failed to build table \"test_model\"* - \n\u274c *dbt failed to build table \"test_model\"* - Owner: <@resolved_owner1> - \n\u274c *dbt failed to build table \"test_model\"* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\u274c *dbt failed to build table \"test_model\"* - \n\u274c *dbt failed to build table \"test_model\"* - Owner: <@resolved_owner1> - \n\u274c *dbt failed to build table \"test_model\"* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\u274c *dbt failed to build table \"test_model\"* - \n\u274c *dbt failed to build table \"test_model\"* - Owner: <@resolved_owner1> - \n\u274c *dbt failed to build table \"test_model\"* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\u274c *dbt failed to build table \"test_model\"* - " + } + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Test Failures*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\ud83d\udd3a *\"test_short_name\" test failed on test_table_1* - \n\ud83d\udd3a *\"test_short_name\" test failed on test_table_2* - Owner: <@resolved_owner1> - \n\ud83d\udd3a *\"test_short_name\" test failed on test_table_3* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\ud83d\udd3a *\"test_short_name\" test failed on test_table_4* - \n\ud83d\udd3a *\"test_short_name\" test failed on test_table_5* - Owner: <@resolved_owner1> - \n\ud83d\udd3a *\"test_short_name\" test failed on test_table_6* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\ud83d\udd3a *\"test_short_name\" test failed on test_table_7* - \n\ud83d\udd3a *\"test_short_name\" test failed on test_table_8* - Owner: <@resolved_owner1> - \n\ud83d\udd3a *\"test_short_name\" test failed on test_table_9* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\ud83d\udd3a *\"test_short_name\" test failed on test_table_10* - " + } + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Test Warnings*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u26a0\ufe0f *\"test_short_name\" test failed on test_table_1* - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_2* - Owner: <@resolved_owner1> - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_3* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_4* - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_5* - Owner: <@resolved_owner1> - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_6* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_7* - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_8* - Owner: <@resolved_owner1> - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_9* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_10* - " + } + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Test Errors*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u2757 *\"test_short_name\" test failed on test_table_1* - \n\u2757 *\"test_short_name\" test failed on test_table_2* - Owner: <@resolved_owner1> - \n\u2757 *\"test_short_name\" test failed on test_table_3* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\u2757 *\"test_short_name\" test failed on test_table_4* - \n\u2757 *\"test_short_name\" test failed on test_table_5* - Owner: <@resolved_owner1> - \n\u2757 *\"test_short_name\" test failed on test_table_6* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\u2757 *\"test_short_name\" test failed on test_table_7* - \n\u2757 *\"test_short_name\" test failed on test_table_8* - Owner: <@resolved_owner1> - \n\u2757 *\"test_short_name\" test failed on test_table_9* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\u2757 *\"test_short_name\" test failed on test_table_10* - " + } + } + ], + "color": "#ff0000" + } + ] +} diff --git a/tests/unit/alerts/alert_messages/fixtures/block_kit/dbt_test_alert_removed_field-column.json b/tests/unit/alerts/alert_messages/fixtures/block_kit/dbt_test_alert_removed_field-column.json new file mode 100644 index 000000000..53e60e356 --- /dev/null +++ b/tests/unit/alerts/alert_messages/fixtures/block_kit/dbt_test_alert_removed_field-column.json @@ -0,0 +1,130 @@ +{ + "blocks": [ + { + "type": "header", + "text": { + "type": "plain_text", + "text": "Failure: \"test_short_name\" test failed on test_table.test_column" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Test:* test_short_name | *Status:* fail | *Time:* N/A" + } + }, + { + "type": "divider" + } + ], + "attachments": [ + { + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u2139\ufe0f *Details*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Table*\ntest_table" + } + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Tags*\ntag1, tag2" + }, + { + "type": "mrkdwn", + "text": "*Owners*\n<@resolved_owner1>, <@resolved_owner2>" + } + ] + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Subscribers*\n_No subscribers_" + } + ] + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Description*\nTest description" + } + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Result Message*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```Test error message```" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\ud83d\udd0e *Test Results Sample*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```{\n \"column1\": \"value1\",\n \"column2\": \"value2\"\n}```" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Test Results Query*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```select 1```" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\ud83d\udee0\ufe0f *Test Parameters*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```{\n \"param1\": \"value1\",\n \"param2\": \"value2\"\n}```" + } + } + ], + "color": "#ff0000" + } + ] +} diff --git a/tests/unit/alerts/alert_messages/fixtures/block_kit/dbt_test_alert_removed_field-description.json b/tests/unit/alerts/alert_messages/fixtures/block_kit/dbt_test_alert_removed_field-description.json new file mode 100644 index 000000000..b2d678866 --- /dev/null +++ b/tests/unit/alerts/alert_messages/fixtures/block_kit/dbt_test_alert_removed_field-description.json @@ -0,0 +1,127 @@ +{ + "blocks": [ + { + "type": "header", + "text": { + "type": "plain_text", + "text": "Failure: \"test_short_name\" test failed on test_table.test_column" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Test:* test_short_name | *Status:* fail | *Time:* N/A" + } + }, + { + "type": "divider" + } + ], + "attachments": [ + { + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u2139\ufe0f *Details*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Table*\ntest_table" + } + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Column*\ntest_column" + }, + { + "type": "mrkdwn", + "text": "*Tags*\ntag1, tag2" + } + ] + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Owners*\n<@resolved_owner1>, <@resolved_owner2>" + }, + { + "type": "mrkdwn", + "text": "*Subscribers*\n_No subscribers_" + } + ] + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Result Message*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```Test error message```" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\ud83d\udd0e *Test Results Sample*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```{\n \"column1\": \"value1\",\n \"column2\": \"value2\"\n}```" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Test Results Query*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```select 1```" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\ud83d\udee0\ufe0f *Test Parameters*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```{\n \"param1\": \"value1\",\n \"param2\": \"value2\"\n}```" + } + } + ], + "color": "#ff0000" + } + ] +} diff --git a/tests/unit/alerts/alert_messages/fixtures/block_kit/dbt_test_alert_removed_field-owners.json b/tests/unit/alerts/alert_messages/fixtures/block_kit/dbt_test_alert_removed_field-owners.json new file mode 100644 index 000000000..a568eb9ac --- /dev/null +++ b/tests/unit/alerts/alert_messages/fixtures/block_kit/dbt_test_alert_removed_field-owners.json @@ -0,0 +1,130 @@ +{ + "blocks": [ + { + "type": "header", + "text": { + "type": "plain_text", + "text": "Failure: \"test_short_name\" test failed on test_table.test_column" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Test:* test_short_name | *Status:* fail | *Time:* N/A" + } + }, + { + "type": "divider" + } + ], + "attachments": [ + { + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u2139\ufe0f *Details*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Table*\ntest_table" + } + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Column*\ntest_column" + }, + { + "type": "mrkdwn", + "text": "*Tags*\ntag1, tag2" + } + ] + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Subscribers*\n_No subscribers_" + } + ] + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Description*\nTest description" + } + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Result Message*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```Test error message```" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\ud83d\udd0e *Test Results Sample*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```{\n \"column1\": \"value1\",\n \"column2\": \"value2\"\n}```" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Test Results Query*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```select 1```" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\ud83d\udee0\ufe0f *Test Parameters*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```{\n \"param1\": \"value1\",\n \"param2\": \"value2\"\n}```" + } + } + ], + "color": "#ff0000" + } + ] +} diff --git a/tests/unit/alerts/alert_messages/fixtures/block_kit/dbt_test_alert_removed_field-result_message.json b/tests/unit/alerts/alert_messages/fixtures/block_kit/dbt_test_alert_removed_field-result_message.json new file mode 100644 index 000000000..9b0256469 --- /dev/null +++ b/tests/unit/alerts/alert_messages/fixtures/block_kit/dbt_test_alert_removed_field-result_message.json @@ -0,0 +1,120 @@ +{ + "blocks": [ + { + "type": "header", + "text": { + "type": "plain_text", + "text": "Failure: \"test_short_name\" test failed on test_table.test_column" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Test:* test_short_name | *Status:* fail | *Time:* N/A" + } + }, + { + "type": "divider" + } + ], + "attachments": [ + { + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u2139\ufe0f *Details*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Table*\ntest_table" + } + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Column*\ntest_column" + }, + { + "type": "mrkdwn", + "text": "*Tags*\ntag1, tag2" + } + ] + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Owners*\n<@resolved_owner1>, <@resolved_owner2>" + }, + { + "type": "mrkdwn", + "text": "*Subscribers*\n_No subscribers_" + } + ] + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Description*\nTest description" + } + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\ud83d\udd0e *Test Results Sample*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```{\n \"column1\": \"value1\",\n \"column2\": \"value2\"\n}```" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Test Results Query*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```select 1```" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\ud83d\udee0\ufe0f *Test Parameters*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```{\n \"param1\": \"value1\",\n \"param2\": \"value2\"\n}```" + } + } + ], + "color": "#ff0000" + } + ] +} diff --git a/tests/unit/alerts/alert_messages/fixtures/block_kit/dbt_test_alert_removed_field-subscribers.json b/tests/unit/alerts/alert_messages/fixtures/block_kit/dbt_test_alert_removed_field-subscribers.json new file mode 100644 index 000000000..1a8af7a97 --- /dev/null +++ b/tests/unit/alerts/alert_messages/fixtures/block_kit/dbt_test_alert_removed_field-subscribers.json @@ -0,0 +1,130 @@ +{ + "blocks": [ + { + "type": "header", + "text": { + "type": "plain_text", + "text": "Failure: \"test_short_name\" test failed on test_table.test_column" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Test:* test_short_name | *Status:* fail | *Time:* N/A" + } + }, + { + "type": "divider" + } + ], + "attachments": [ + { + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u2139\ufe0f *Details*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Table*\ntest_table" + } + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Column*\ntest_column" + }, + { + "type": "mrkdwn", + "text": "*Tags*\ntag1, tag2" + } + ] + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Owners*\n<@resolved_owner1>, <@resolved_owner2>" + } + ] + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Description*\nTest description" + } + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Result Message*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```Test error message```" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\ud83d\udd0e *Test Results Sample*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```{\n \"column1\": \"value1\",\n \"column2\": \"value2\"\n}```" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Test Results Query*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```select 1```" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\ud83d\udee0\ufe0f *Test Parameters*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```{\n \"param1\": \"value1\",\n \"param2\": \"value2\"\n}```" + } + } + ], + "color": "#ff0000" + } + ] +} diff --git a/tests/unit/alerts/alert_messages/fixtures/block_kit/dbt_test_alert_removed_field-table.json b/tests/unit/alerts/alert_messages/fixtures/block_kit/dbt_test_alert_removed_field-table.json new file mode 100644 index 000000000..67c9a9b48 --- /dev/null +++ b/tests/unit/alerts/alert_messages/fixtures/block_kit/dbt_test_alert_removed_field-table.json @@ -0,0 +1,127 @@ +{ + "blocks": [ + { + "type": "header", + "text": { + "type": "plain_text", + "text": "Failure: \"test_short_name\" test failed on test_table.test_column" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Test:* test_short_name | *Status:* fail | *Time:* N/A" + } + }, + { + "type": "divider" + } + ], + "attachments": [ + { + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u2139\ufe0f *Details*" + } + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Column*\ntest_column" + }, + { + "type": "mrkdwn", + "text": "*Tags*\ntag1, tag2" + } + ] + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Owners*\n<@resolved_owner1>, <@resolved_owner2>" + }, + { + "type": "mrkdwn", + "text": "*Subscribers*\n_No subscribers_" + } + ] + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Description*\nTest description" + } + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Result Message*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```Test error message```" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\ud83d\udd0e *Test Results Sample*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```{\n \"column1\": \"value1\",\n \"column2\": \"value2\"\n}```" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Test Results Query*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```select 1```" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\ud83d\udee0\ufe0f *Test Parameters*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```{\n \"param1\": \"value1\",\n \"param2\": \"value2\"\n}```" + } + } + ], + "color": "#ff0000" + } + ] +} diff --git a/tests/unit/alerts/alert_messages/fixtures/block_kit/dbt_test_alert_removed_field-tags.json b/tests/unit/alerts/alert_messages/fixtures/block_kit/dbt_test_alert_removed_field-tags.json new file mode 100644 index 000000000..b383c302d --- /dev/null +++ b/tests/unit/alerts/alert_messages/fixtures/block_kit/dbt_test_alert_removed_field-tags.json @@ -0,0 +1,130 @@ +{ + "blocks": [ + { + "type": "header", + "text": { + "type": "plain_text", + "text": "Failure: \"test_short_name\" test failed on test_table.test_column" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Test:* test_short_name | *Status:* fail | *Time:* N/A" + } + }, + { + "type": "divider" + } + ], + "attachments": [ + { + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u2139\ufe0f *Details*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Table*\ntest_table" + } + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Column*\ntest_column" + }, + { + "type": "mrkdwn", + "text": "*Owners*\n<@resolved_owner1>, <@resolved_owner2>" + } + ] + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Subscribers*\n_No subscribers_" + } + ] + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Description*\nTest description" + } + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Result Message*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```Test error message```" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\ud83d\udd0e *Test Results Sample*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```{\n \"column1\": \"value1\",\n \"column2\": \"value2\"\n}```" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Test Results Query*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```select 1```" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\ud83d\udee0\ufe0f *Test Parameters*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```{\n \"param1\": \"value1\",\n \"param2\": \"value2\"\n}```" + } + } + ], + "color": "#ff0000" + } + ] +} diff --git a/tests/unit/alerts/alert_messages/fixtures/block_kit/dbt_test_alert_removed_field-test_parameters.json b/tests/unit/alerts/alert_messages/fixtures/block_kit/dbt_test_alert_removed_field-test_parameters.json new file mode 100644 index 000000000..27953b27b --- /dev/null +++ b/tests/unit/alerts/alert_messages/fixtures/block_kit/dbt_test_alert_removed_field-test_parameters.json @@ -0,0 +1,120 @@ +{ + "blocks": [ + { + "type": "header", + "text": { + "type": "plain_text", + "text": "Failure: \"test_short_name\" test failed on test_table.test_column" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Test:* test_short_name | *Status:* fail | *Time:* N/A" + } + }, + { + "type": "divider" + } + ], + "attachments": [ + { + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u2139\ufe0f *Details*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Table*\ntest_table" + } + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Column*\ntest_column" + }, + { + "type": "mrkdwn", + "text": "*Tags*\ntag1, tag2" + } + ] + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Owners*\n<@resolved_owner1>, <@resolved_owner2>" + }, + { + "type": "mrkdwn", + "text": "*Subscribers*\n_No subscribers_" + } + ] + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Description*\nTest description" + } + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Result Message*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```Test error message```" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\ud83d\udd0e *Test Results Sample*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```{\n \"column1\": \"value1\",\n \"column2\": \"value2\"\n}```" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Test Results Query*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```select 1```" + } + } + ], + "color": "#ff0000" + } + ] +} diff --git a/tests/unit/alerts/alert_messages/fixtures/block_kit/dbt_test_alert_removed_field-test_query.json b/tests/unit/alerts/alert_messages/fixtures/block_kit/dbt_test_alert_removed_field-test_query.json new file mode 100644 index 000000000..144b2e34a --- /dev/null +++ b/tests/unit/alerts/alert_messages/fixtures/block_kit/dbt_test_alert_removed_field-test_query.json @@ -0,0 +1,120 @@ +{ + "blocks": [ + { + "type": "header", + "text": { + "type": "plain_text", + "text": "Failure: \"test_short_name\" test failed on test_table.test_column" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Test:* test_short_name | *Status:* fail | *Time:* N/A" + } + }, + { + "type": "divider" + } + ], + "attachments": [ + { + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u2139\ufe0f *Details*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Table*\ntest_table" + } + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Column*\ntest_column" + }, + { + "type": "mrkdwn", + "text": "*Tags*\ntag1, tag2" + } + ] + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Owners*\n<@resolved_owner1>, <@resolved_owner2>" + }, + { + "type": "mrkdwn", + "text": "*Subscribers*\n_No subscribers_" + } + ] + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Description*\nTest description" + } + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Result Message*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```Test error message```" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\ud83d\udd0e *Test Results Sample*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```{\n \"column1\": \"value1\",\n \"column2\": \"value2\"\n}```" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\ud83d\udee0\ufe0f *Test Parameters*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```{\n \"param1\": \"value1\",\n \"param2\": \"value2\"\n}```" + } + } + ], + "color": "#ff0000" + } + ] +} diff --git a/tests/unit/alerts/alert_messages/fixtures/block_kit/dbt_test_alert_removed_field-test_results_sample.json b/tests/unit/alerts/alert_messages/fixtures/block_kit/dbt_test_alert_removed_field-test_results_sample.json new file mode 100644 index 000000000..e0a086e60 --- /dev/null +++ b/tests/unit/alerts/alert_messages/fixtures/block_kit/dbt_test_alert_removed_field-test_results_sample.json @@ -0,0 +1,120 @@ +{ + "blocks": [ + { + "type": "header", + "text": { + "type": "plain_text", + "text": "Failure: \"test_short_name\" test failed on test_table.test_column" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Test:* test_short_name | *Status:* fail | *Time:* N/A" + } + }, + { + "type": "divider" + } + ], + "attachments": [ + { + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u2139\ufe0f *Details*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Table*\ntest_table" + } + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Column*\ntest_column" + }, + { + "type": "mrkdwn", + "text": "*Tags*\ntag1, tag2" + } + ] + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Owners*\n<@resolved_owner1>, <@resolved_owner2>" + }, + { + "type": "mrkdwn", + "text": "*Subscribers*\n_No subscribers_" + } + ] + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Description*\nTest description" + } + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Result Message*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```Test error message```" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Test Results Query*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```select 1```" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\ud83d\udee0\ufe0f *Test Parameters*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```{\n \"param1\": \"value1\",\n \"param2\": \"value2\"\n}```" + } + } + ], + "color": "#ff0000" + } + ] +} diff --git a/tests/unit/alerts/alert_messages/fixtures/block_kit/dbt_test_alert_status-None_link-False_description-False_tags-False_owners-False_table-False_error-False_sample-False_env-False.json b/tests/unit/alerts/alert_messages/fixtures/block_kit/dbt_test_alert_status-None_link-False_description-False_tags-False_owners-False_table-False_error-False_sample-False_env-False.json new file mode 100644 index 000000000..238d8fed7 --- /dev/null +++ b/tests/unit/alerts/alert_messages/fixtures/block_kit/dbt_test_alert_status-None_link-False_description-False_tags-False_owners-False_table-False_error-False_sample-False_env-False.json @@ -0,0 +1,23 @@ +{ + "blocks": [ + { + "type": "header", + "text": { + "type": "plain_text", + "text": "\"test_short_name\" test failed" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Test:* test_short_name | *Status:* Unknown | *Time:* N/A" + } + } + ], + "attachments": [ + { + "blocks": [] + } + ] +} diff --git a/tests/unit/alerts/alert_messages/fixtures/block_kit/dbt_test_alert_status-None_link-True_description-True_tags-False_owners-False_table-True_error-True_sample-False_env-True.json b/tests/unit/alerts/alert_messages/fixtures/block_kit/dbt_test_alert_status-None_link-True_description-True_tags-False_owners-False_table-True_error-True_sample-False_env-True.json new file mode 100644 index 000000000..b6eb4cf9b --- /dev/null +++ b/tests/unit/alerts/alert_messages/fixtures/block_kit/dbt_test_alert_status-None_link-True_description-True_tags-False_owners-False_table-True_error-True_sample-False_env-True.json @@ -0,0 +1,87 @@ +{ + "blocks": [ + { + "type": "header", + "text": { + "type": "plain_text", + "text": "\"test_short_name\" test failed on test_table" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Test:* test_short_name | *Env:* Test Env | *Status:* Unknown | *Time:* N/A\n" + } + }, + { + "type": "divider" + } + ], + "attachments": [ + { + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u2139\ufe0f *Details*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Table*\ntest_table" + } + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Tags*\n_No tags_" + }, + { + "type": "mrkdwn", + "text": "*Owners*\n_No owners_" + } + ] + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Subscribers*\n_No subscribers_" + } + ] + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Description*\nTest description" + } + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Result Message*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```Test error message```" + } + } + ] + } + ] +} diff --git a/tests/unit/alerts/alert_messages/fixtures/block_kit/dbt_test_alert_status-error_link-False_description-True_tags-False_owners-True_table-False_error-True_sample-False_env-True.json b/tests/unit/alerts/alert_messages/fixtures/block_kit/dbt_test_alert_status-error_link-False_description-True_tags-False_owners-True_table-False_error-True_sample-False_env-True.json new file mode 100644 index 000000000..2af065839 --- /dev/null +++ b/tests/unit/alerts/alert_messages/fixtures/block_kit/dbt_test_alert_status-error_link-False_description-True_tags-False_owners-True_table-False_error-True_sample-False_env-True.json @@ -0,0 +1,81 @@ +{ + "blocks": [ + { + "type": "header", + "text": { + "type": "plain_text", + "text": "Error: \"test_short_name\" test failed" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Test:* test_short_name | *Env:* Test Env | *Status:* error | *Time:* N/A" + } + }, + { + "type": "divider" + } + ], + "attachments": [ + { + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u2139\ufe0f *Details*" + } + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Tags*\n_No tags_" + }, + { + "type": "mrkdwn", + "text": "*Owners*\n<@resolved_owner1>, <@resolved_owner2>" + } + ] + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Subscribers*\n_No subscribers_" + } + ] + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Description*\nTest description" + } + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Result Message*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```Test error message```" + } + } + ], + "color": "#ff0000" + } + ] +} diff --git a/tests/unit/alerts/alert_messages/fixtures/block_kit/dbt_test_alert_status-error_link-True_description-True_tags-True_owners-True_table-True_error-True_sample-True_env-True.json b/tests/unit/alerts/alert_messages/fixtures/block_kit/dbt_test_alert_status-error_link-True_description-True_tags-True_owners-True_table-True_error-True_sample-True_env-True.json new file mode 100644 index 000000000..188d7aa62 --- /dev/null +++ b/tests/unit/alerts/alert_messages/fixtures/block_kit/dbt_test_alert_status-error_link-True_description-True_tags-True_owners-True_table-True_error-True_sample-True_env-True.json @@ -0,0 +1,102 @@ +{ + "blocks": [ + { + "type": "header", + "text": { + "type": "plain_text", + "text": "Error: \"test_short_name\" test failed on test_table" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Test:* test_short_name | *Env:* Test Env | *Status:* error | *Time:* N/A\n" + } + }, + { + "type": "divider" + } + ], + "attachments": [ + { + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u2139\ufe0f *Details*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Table*\ntest_table" + } + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Tags*\ntag1, tag2" + }, + { + "type": "mrkdwn", + "text": "*Owners*\n<@resolved_owner1>, <@resolved_owner2>" + } + ] + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Subscribers*\n_No subscribers_" + } + ] + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Description*\nTest description" + } + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Result Message*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```Test error message```" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\ud83d\udd0e *Test Results Sample*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```column1 column2\n--------- ---------\nvalue1 value2```" + } + } + ], + "color": "#ff0000" + } + ] +} diff --git a/tests/unit/alerts/alert_messages/fixtures/block_kit/dbt_test_alert_status-fail_link-False_description-False_tags-False_owners-False_table-False_error-False_sample-False_env-False.json b/tests/unit/alerts/alert_messages/fixtures/block_kit/dbt_test_alert_status-fail_link-False_description-False_tags-False_owners-False_table-False_error-False_sample-False_env-False.json new file mode 100644 index 000000000..c2375ffd6 --- /dev/null +++ b/tests/unit/alerts/alert_messages/fixtures/block_kit/dbt_test_alert_status-fail_link-False_description-False_tags-False_owners-False_table-False_error-False_sample-False_env-False.json @@ -0,0 +1,24 @@ +{ + "blocks": [], + "attachments": [ + { + "blocks": [ + { + "type": "header", + "text": { + "type": "plain_text", + "text": "Failure: \"test_short_name\" test failed" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Test:* test_short_name | *Status:* fail | *Time:* N/A" + } + } + ], + "color": "#ff0000" + } + ] +} diff --git a/tests/unit/alerts/alert_messages/fixtures/block_kit/dbt_test_alert_status-fail_link-True_description-True_tags-True_owners-True_table-True_error-True_sample-True_env-False.json b/tests/unit/alerts/alert_messages/fixtures/block_kit/dbt_test_alert_status-fail_link-True_description-True_tags-True_owners-True_table-True_error-True_sample-True_env-False.json new file mode 100644 index 000000000..2910995f8 --- /dev/null +++ b/tests/unit/alerts/alert_messages/fixtures/block_kit/dbt_test_alert_status-fail_link-True_description-True_tags-True_owners-True_table-True_error-True_sample-True_env-False.json @@ -0,0 +1,102 @@ +{ + "blocks": [ + { + "type": "header", + "text": { + "type": "plain_text", + "text": "Failure: \"test_short_name\" test failed on test_table" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Test:* test_short_name | *Status:* fail | *Time:* N/A\n" + } + }, + { + "type": "divider" + } + ], + "attachments": [ + { + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u2139\ufe0f *Details*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Table*\ntest_table" + } + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Tags*\ntag1, tag2" + }, + { + "type": "mrkdwn", + "text": "*Owners*\n<@resolved_owner1>, <@resolved_owner2>" + } + ] + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Subscribers*\n_No subscribers_" + } + ] + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Description*\nTest description" + } + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Result Message*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```Test error message```" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\ud83d\udd0e *Test Results Sample*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```column1 column2\n--------- ---------\nvalue1 value2```" + } + } + ], + "color": "#ff0000" + } + ] +} diff --git a/tests/unit/alerts/alert_messages/fixtures/block_kit/dbt_test_alert_status-warn_link-True_description-False_tags-True_owners-False_table-True_error-False_sample-True_env-False.json b/tests/unit/alerts/alert_messages/fixtures/block_kit/dbt_test_alert_status-warn_link-True_description-False_tags-True_owners-False_table-True_error-False_sample-True_env-False.json new file mode 100644 index 000000000..0ecdbba46 --- /dev/null +++ b/tests/unit/alerts/alert_messages/fixtures/block_kit/dbt_test_alert_status-warn_link-True_description-False_tags-True_owners-False_table-True_error-False_sample-True_env-False.json @@ -0,0 +1,81 @@ +{ + "blocks": [ + { + "type": "header", + "text": { + "type": "plain_text", + "text": "Warning: \"test_short_name\" test failed on test_table" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Test:* test_short_name | *Status:* warn | *Time:* N/A\n" + } + }, + { + "type": "divider" + } + ], + "attachments": [ + { + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u2139\ufe0f *Details*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Table*\ntest_table" + } + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Tags*\ntag1, tag2" + }, + { + "type": "mrkdwn", + "text": "*Owners*\n_No owners_" + } + ] + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Subscribers*\n_No subscribers_" + } + ] + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\ud83d\udd0e *Test Results Sample*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```column1 column2\n--------- ---------\nvalue1 value2```" + } + } + ], + "color": "#ffcc00" + } + ] +} diff --git a/tests/unit/alerts/alert_messages/fixtures/block_kit/dbt_test_alert_status-warn_link-True_description-True_tags-True_owners-True_table-True_error-True_sample-True_env-True.json b/tests/unit/alerts/alert_messages/fixtures/block_kit/dbt_test_alert_status-warn_link-True_description-True_tags-True_owners-True_table-True_error-True_sample-True_env-True.json new file mode 100644 index 000000000..4675c7c1b --- /dev/null +++ b/tests/unit/alerts/alert_messages/fixtures/block_kit/dbt_test_alert_status-warn_link-True_description-True_tags-True_owners-True_table-True_error-True_sample-True_env-True.json @@ -0,0 +1,102 @@ +{ + "blocks": [ + { + "type": "header", + "text": { + "type": "plain_text", + "text": "Warning: \"test_short_name\" test failed on test_table" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Test:* test_short_name | *Env:* Test Env | *Status:* warn | *Time:* N/A\n" + } + }, + { + "type": "divider" + } + ], + "attachments": [ + { + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u2139\ufe0f *Details*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Table*\ntest_table" + } + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Tags*\ntag1, tag2" + }, + { + "type": "mrkdwn", + "text": "*Owners*\n<@resolved_owner1>, <@resolved_owner2>" + } + ] + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Subscribers*\n_No subscribers_" + } + ] + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Description*\nTest description" + } + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Result Message*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```Test error message```" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\ud83d\udd0e *Test Results Sample*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```column1 column2\n--------- ---------\nvalue1 value2```" + } + } + ], + "color": "#ffcc00" + } + ] +} diff --git a/tests/unit/alerts/alert_messages/fixtures/block_kit/elementary_test_alert_status-None_link-False_description-False_tags-False_owners-False_table-False_error-False_sample-False_anomaly-False_env-False.json b/tests/unit/alerts/alert_messages/fixtures/block_kit/elementary_test_alert_status-None_link-False_description-False_tags-False_owners-False_table-False_error-False_sample-False_anomaly-False_env-False.json new file mode 100644 index 000000000..aab98f52b --- /dev/null +++ b/tests/unit/alerts/alert_messages/fixtures/block_kit/elementary_test_alert_status-None_link-False_description-False_tags-False_owners-False_table-False_error-False_sample-False_anomaly-False_env-False.json @@ -0,0 +1,23 @@ +{ + "blocks": [ + { + "type": "header", + "text": { + "type": "plain_text", + "text": "Generic" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Test:* test_short_name | *Status:* Unknown | *Time:* N/A" + } + } + ], + "attachments": [ + { + "blocks": [] + } + ] +} diff --git a/tests/unit/alerts/alert_messages/fixtures/block_kit/elementary_test_alert_status-None_link-False_description-True_tags-False_owners-True_table-False_error-True_sample-False_anomaly-True_env-True.json b/tests/unit/alerts/alert_messages/fixtures/block_kit/elementary_test_alert_status-None_link-False_description-True_tags-False_owners-True_table-False_error-True_sample-False_anomaly-True_env-True.json new file mode 100644 index 000000000..a024bffec --- /dev/null +++ b/tests/unit/alerts/alert_messages/fixtures/block_kit/elementary_test_alert_status-None_link-False_description-True_tags-False_owners-True_table-False_error-True_sample-False_anomaly-True_env-True.json @@ -0,0 +1,94 @@ +{ + "blocks": [ + { + "type": "header", + "text": { + "type": "plain_text", + "text": "\"test_short_name\" test failed" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Test:* test_short_name | *Env:* Test Env | *Status:* Unknown | *Time:* N/A" + } + }, + { + "type": "divider" + } + ], + "attachments": [ + { + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u2139\ufe0f *Details*" + } + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Tags*\n_No tags_" + }, + { + "type": "mrkdwn", + "text": "*Owners*\n<@resolved_owner1>, <@resolved_owner2>" + } + ] + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Subscribers*\n_No subscribers_" + } + ] + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Description*\nTest description" + } + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Result Message*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```Test error message```" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\ud83d\udd0e *Test Results Sample*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Anomalous Value:* {'anomalous_value': 42}" + } + } + ] + } + ] +} diff --git a/tests/unit/alerts/alert_messages/fixtures/block_kit/elementary_test_alert_status-None_link-True_description-False_tags-True_owners-False_table-True_error-False_sample-True_anomaly-True_env-True.json b/tests/unit/alerts/alert_messages/fixtures/block_kit/elementary_test_alert_status-None_link-True_description-False_tags-True_owners-False_table-True_error-False_sample-True_anomaly-True_env-True.json new file mode 100644 index 000000000..d9f12bff8 --- /dev/null +++ b/tests/unit/alerts/alert_messages/fixtures/block_kit/elementary_test_alert_status-None_link-True_description-False_tags-True_owners-False_table-True_error-False_sample-True_anomaly-True_env-True.json @@ -0,0 +1,108 @@ +{ + "blocks": [ + { + "type": "header", + "text": { + "type": "plain_text", + "text": "\"test_short_name\" test failed on test_table" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Test:* test_short_name | *Env:* Test Env | *Status:* Unknown | *Time:* N/A\n" + } + }, + { + "type": "divider" + } + ], + "attachments": [ + { + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u2139\ufe0f *Details*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Table*\ntest_table" + } + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Tags*\ntag1, tag2" + }, + { + "type": "mrkdwn", + "text": "*Owners*\n_No owners_" + } + ] + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Subscribers*\n_No subscribers_" + } + ] + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\ud83d\udd0e *Test Results Sample*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Anomalous Value:* {'anomalous_value': 42}" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Test Results Query*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```SELECT * FROM test```" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\ud83d\udee0\ufe0f *Test Parameters*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```{\n \"param1\": \"value1\"\n}```" + } + } + ] + } + ] +} diff --git a/tests/unit/alerts/alert_messages/fixtures/block_kit/elementary_test_alert_status-error_link-False_description-True_tags-True_owners-False_table-True_error-False_sample-True_anomaly-False_env-True.json b/tests/unit/alerts/alert_messages/fixtures/block_kit/elementary_test_alert_status-error_link-False_description-True_tags-True_owners-False_table-True_error-False_sample-True_anomaly-False_env-True.json new file mode 100644 index 000000000..1caef7951 --- /dev/null +++ b/tests/unit/alerts/alert_messages/fixtures/block_kit/elementary_test_alert_status-error_link-False_description-True_tags-True_owners-False_table-True_error-False_sample-True_anomaly-False_env-True.json @@ -0,0 +1,116 @@ +{ + "blocks": [ + { + "type": "header", + "text": { + "type": "plain_text", + "text": "Generic on test_table" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Test:* test_short_name | *Env:* Test Env | *Status:* error | *Time:* N/A" + } + }, + { + "type": "divider" + } + ], + "attachments": [ + { + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u2139\ufe0f *Details*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Table*\ntest_table" + } + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Tags*\ntag1, tag2" + }, + { + "type": "mrkdwn", + "text": "*Owners*\n_No owners_" + } + ] + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Subscribers*\n_No subscribers_" + } + ] + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Description*\nTest description" + } + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\ud83d\udd0e *Test Results Sample*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```{\n \"column1\": \"value1\",\n \"column2\": \"value2\"\n}```" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Test Results Query*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```SELECT * FROM test```" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\ud83d\udee0\ufe0f *Test Parameters*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```{\n \"param1\": \"value1\"\n}```" + } + } + ], + "color": "#ff0000" + } + ] +} diff --git a/tests/unit/alerts/alert_messages/fixtures/block_kit/elementary_test_alert_status-error_link-True_description-True_tags-False_owners-False_table-False_error-True_sample-False_anomaly-True_env-True.json b/tests/unit/alerts/alert_messages/fixtures/block_kit/elementary_test_alert_status-error_link-True_description-True_tags-False_owners-False_table-False_error-True_sample-False_anomaly-True_env-True.json new file mode 100644 index 000000000..ac0a45241 --- /dev/null +++ b/tests/unit/alerts/alert_messages/fixtures/block_kit/elementary_test_alert_status-error_link-True_description-True_tags-False_owners-False_table-False_error-True_sample-False_anomaly-True_env-True.json @@ -0,0 +1,95 @@ +{ + "blocks": [ + { + "type": "header", + "text": { + "type": "plain_text", + "text": "Error: \"test_short_name\" test failed" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Test:* test_short_name | *Env:* Test Env | *Status:* error | *Time:* N/A\n" + } + }, + { + "type": "divider" + } + ], + "attachments": [ + { + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u2139\ufe0f *Details*" + } + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Tags*\n_No tags_" + }, + { + "type": "mrkdwn", + "text": "*Owners*\n_No owners_" + } + ] + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Subscribers*\n_No subscribers_" + } + ] + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Description*\nTest description" + } + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Result Message*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```Test error message```" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\ud83d\udd0e *Test Results Sample*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Anomalous Value:* {'anomalous_value': 42}" + } + } + ], + "color": "#ff0000" + } + ] +} diff --git a/tests/unit/alerts/alert_messages/fixtures/block_kit/elementary_test_alert_status-fail_link-False_description-False_tags-False_owners-False_table-False_error-False_sample-False_anomaly-False_env-False.json b/tests/unit/alerts/alert_messages/fixtures/block_kit/elementary_test_alert_status-fail_link-False_description-False_tags-False_owners-False_table-False_error-False_sample-False_anomaly-False_env-False.json new file mode 100644 index 000000000..a43eb0862 --- /dev/null +++ b/tests/unit/alerts/alert_messages/fixtures/block_kit/elementary_test_alert_status-fail_link-False_description-False_tags-False_owners-False_table-False_error-False_sample-False_anomaly-False_env-False.json @@ -0,0 +1,24 @@ +{ + "blocks": [], + "attachments": [ + { + "blocks": [ + { + "type": "header", + "text": { + "type": "plain_text", + "text": "Generic" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Test:* test_short_name | *Status:* fail | *Time:* N/A" + } + } + ], + "color": "#ff0000" + } + ] +} diff --git a/tests/unit/alerts/alert_messages/fixtures/block_kit/elementary_test_alert_status-fail_link-True_description-True_tags-True_owners-True_table-True_error-True_sample-True_anomaly-True_env-True.json b/tests/unit/alerts/alert_messages/fixtures/block_kit/elementary_test_alert_status-fail_link-True_description-True_tags-True_owners-True_table-True_error-True_sample-True_anomaly-True_env-True.json new file mode 100644 index 000000000..8611ec30c --- /dev/null +++ b/tests/unit/alerts/alert_messages/fixtures/block_kit/elementary_test_alert_status-fail_link-True_description-True_tags-True_owners-True_table-True_error-True_sample-True_anomaly-True_env-True.json @@ -0,0 +1,130 @@ +{ + "blocks": [ + { + "type": "header", + "text": { + "type": "plain_text", + "text": "Failure: \"test_short_name\" test failed on test_table" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Test:* test_short_name | *Env:* Test Env | *Status:* fail | *Time:* N/A\n" + } + }, + { + "type": "divider" + } + ], + "attachments": [ + { + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u2139\ufe0f *Details*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Table*\ntest_table" + } + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Tags*\ntag1, tag2" + }, + { + "type": "mrkdwn", + "text": "*Owners*\n<@resolved_owner1>, <@resolved_owner2>" + } + ] + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Subscribers*\n_No subscribers_" + } + ] + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Description*\nTest description" + } + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Result Message*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```Test error message```" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\ud83d\udd0e *Test Results Sample*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Anomalous Value:* {'anomalous_value': 42}" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Test Results Query*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```SELECT * FROM test```" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\ud83d\udee0\ufe0f *Test Parameters*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```{\n \"param1\": \"value1\"\n}```" + } + } + ], + "color": "#ff0000" + } + ] +} diff --git a/tests/unit/alerts/alert_messages/fixtures/block_kit/elementary_test_alert_status-warn_link-False_description-True_tags-False_owners-True_table-False_error-True_sample-False_anomaly-True_env-False.json b/tests/unit/alerts/alert_messages/fixtures/block_kit/elementary_test_alert_status-warn_link-False_description-True_tags-False_owners-True_table-False_error-True_sample-False_anomaly-True_env-False.json new file mode 100644 index 000000000..14f97e69d --- /dev/null +++ b/tests/unit/alerts/alert_messages/fixtures/block_kit/elementary_test_alert_status-warn_link-False_description-True_tags-False_owners-True_table-False_error-True_sample-False_anomaly-True_env-False.json @@ -0,0 +1,95 @@ +{ + "blocks": [ + { + "type": "header", + "text": { + "type": "plain_text", + "text": "Warning: \"test_short_name\" test failed" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Test:* test_short_name | *Status:* warn | *Time:* N/A" + } + }, + { + "type": "divider" + } + ], + "attachments": [ + { + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u2139\ufe0f *Details*" + } + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Tags*\n_No tags_" + }, + { + "type": "mrkdwn", + "text": "*Owners*\n<@resolved_owner1>, <@resolved_owner2>" + } + ] + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Subscribers*\n_No subscribers_" + } + ] + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Description*\nTest description" + } + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Result Message*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```Test error message```" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\ud83d\udd0e *Test Results Sample*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Anomalous Value:* {'anomalous_value': 42}" + } + } + ], + "color": "#ffcc00" + } + ] +} diff --git a/tests/unit/alerts/alert_messages/fixtures/block_kit/elementary_test_alert_status-warn_link-True_description-False_tags-True_owners-False_table-True_error-False_sample-True_anomaly-False_env-True.json b/tests/unit/alerts/alert_messages/fixtures/block_kit/elementary_test_alert_status-warn_link-True_description-False_tags-True_owners-False_table-True_error-False_sample-True_anomaly-False_env-True.json new file mode 100644 index 000000000..e0044ec9e --- /dev/null +++ b/tests/unit/alerts/alert_messages/fixtures/block_kit/elementary_test_alert_status-warn_link-True_description-False_tags-True_owners-False_table-True_error-False_sample-True_anomaly-False_env-True.json @@ -0,0 +1,109 @@ +{ + "blocks": [ + { + "type": "header", + "text": { + "type": "plain_text", + "text": "Generic on test_table" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Test:* test_short_name | *Env:* Test Env | *Status:* warn | *Time:* N/A\n" + } + }, + { + "type": "divider" + } + ], + "attachments": [ + { + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u2139\ufe0f *Details*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Table*\ntest_table" + } + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Tags*\ntag1, tag2" + }, + { + "type": "mrkdwn", + "text": "*Owners*\n_No owners_" + } + ] + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Subscribers*\n_No subscribers_" + } + ] + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\ud83d\udd0e *Test Results Sample*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```{\n \"column1\": \"value1\",\n \"column2\": \"value2\"\n}```" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Test Results Query*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```SELECT * FROM test```" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\ud83d\udee0\ufe0f *Test Parameters*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```{\n \"param1\": \"value1\"\n}```" + } + } + ], + "color": "#ffcc00" + } + ] +} diff --git a/tests/unit/alerts/alert_messages/fixtures/block_kit/group_by_table_model-errors-False_test-failures-False_test-warnings-True_test-errors-True_link-False_env-False.json b/tests/unit/alerts/alert_messages/fixtures/block_kit/group_by_table_model-errors-False_test-failures-False_test-warnings-True_test-errors-True_link-False_env-False.json new file mode 100644 index 000000000..ceb4fb54b --- /dev/null +++ b/tests/unit/alerts/alert_messages/fixtures/block_kit/group_by_table_model-errors-False_test-failures-False_test-warnings-True_test-errors-True_link-False_env-False.json @@ -0,0 +1,91 @@ +{ + "blocks": [ + { + "type": "header", + "text": { + "type": "plain_text", + "text": "Error: test_model_unique_id: 20 issues detected" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u26a0\ufe0f *Test Warnings:* 10 | \u2757 *Test Errors:* 10" + } + }, + { + "type": "divider" + } + ], + "attachments": [ + { + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u2139\ufe0f *Details*" + } + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Tags*\ntag1" + }, + { + "type": "mrkdwn", + "text": "*Owners*\n<@resolved_owner1>, <@resolved_owner2>" + } + ] + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Subscribers*\n_No subscribers_" + } + ] + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Test Warnings*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u26a0\ufe0f *\"test_short_name\" test failed on test_table_1*\n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_2* - Owner: <@resolved_owner1>\n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_3* - Owners: <@resolved_owner1>, <@resolved_owner2>\n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_4*\n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_5* - Owner: <@resolved_owner1>\n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_6* - Owners: <@resolved_owner1>, <@resolved_owner2>\n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_7*\n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_8* - Owner: <@resolved_owner1>\n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_9* - Owners: <@resolved_owner1>, <@resolved_owner2>\n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_10*" + } + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Test Errors*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u2757 *\"test_short_name\" test failed on test_table_1*\n\u2757 *\"test_short_name\" test failed on test_table_2* - Owner: <@resolved_owner1>\n\u2757 *\"test_short_name\" test failed on test_table_3* - Owners: <@resolved_owner1>, <@resolved_owner2>\n\u2757 *\"test_short_name\" test failed on test_table_4*\n\u2757 *\"test_short_name\" test failed on test_table_5* - Owner: <@resolved_owner1>\n\u2757 *\"test_short_name\" test failed on test_table_6* - Owners: <@resolved_owner1>, <@resolved_owner2>\n\u2757 *\"test_short_name\" test failed on test_table_7*\n\u2757 *\"test_short_name\" test failed on test_table_8* - Owner: <@resolved_owner1>\n\u2757 *\"test_short_name\" test failed on test_table_9* - Owners: <@resolved_owner1>, <@resolved_owner2>\n\u2757 *\"test_short_name\" test failed on test_table_10*" + } + } + ], + "color": "#ff0000" + } + ] +} diff --git a/tests/unit/alerts/alert_messages/fixtures/block_kit/group_by_table_model-errors-False_test-failures-True_test-warnings-False_test-errors-False_link-False_env-False.json b/tests/unit/alerts/alert_messages/fixtures/block_kit/group_by_table_model-errors-False_test-failures-True_test-warnings-False_test-errors-False_link-False_env-False.json new file mode 100644 index 000000000..80b3eaaee --- /dev/null +++ b/tests/unit/alerts/alert_messages/fixtures/block_kit/group_by_table_model-errors-False_test-failures-True_test-warnings-False_test-errors-False_link-False_env-False.json @@ -0,0 +1,73 @@ +{ + "blocks": [ + { + "type": "header", + "text": { + "type": "plain_text", + "text": "Failure: test_model_unique_id: 10 issues detected" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\ud83d\udd3a *Test Failures:* 10" + } + }, + { + "type": "divider" + } + ], + "attachments": [ + { + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u2139\ufe0f *Details*" + } + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Tags*\ntag1" + }, + { + "type": "mrkdwn", + "text": "*Owners*\n<@resolved_owner1>, <@resolved_owner2>" + } + ] + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Subscribers*\n_No subscribers_" + } + ] + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Test Failures*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\ud83d\udd3a *\"test_short_name\" test failed on test_table_1*\n\ud83d\udd3a *\"test_short_name\" test failed on test_table_2* - Owner: <@resolved_owner1>\n\ud83d\udd3a *\"test_short_name\" test failed on test_table_3* - Owners: <@resolved_owner1>, <@resolved_owner2>\n\ud83d\udd3a *\"test_short_name\" test failed on test_table_4*\n\ud83d\udd3a *\"test_short_name\" test failed on test_table_5* - Owner: <@resolved_owner1>\n\ud83d\udd3a *\"test_short_name\" test failed on test_table_6* - Owners: <@resolved_owner1>, <@resolved_owner2>\n\ud83d\udd3a *\"test_short_name\" test failed on test_table_7*\n\ud83d\udd3a *\"test_short_name\" test failed on test_table_8* - Owner: <@resolved_owner1>\n\ud83d\udd3a *\"test_short_name\" test failed on test_table_9* - Owners: <@resolved_owner1>, <@resolved_owner2>\n\ud83d\udd3a *\"test_short_name\" test failed on test_table_10*" + } + } + ] + } + ] +} diff --git a/tests/unit/alerts/alert_messages/fixtures/block_kit/group_by_table_model-errors-False_test-failures-True_test-warnings-False_test-errors-True_link-False_env-False.json b/tests/unit/alerts/alert_messages/fixtures/block_kit/group_by_table_model-errors-False_test-failures-True_test-warnings-False_test-errors-True_link-False_env-False.json new file mode 100644 index 000000000..f3a03d3f5 --- /dev/null +++ b/tests/unit/alerts/alert_messages/fixtures/block_kit/group_by_table_model-errors-False_test-failures-True_test-warnings-False_test-errors-True_link-False_env-False.json @@ -0,0 +1,91 @@ +{ + "blocks": [ + { + "type": "header", + "text": { + "type": "plain_text", + "text": "Error: test_model_unique_id: 20 issues detected" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\ud83d\udd3a *Test Failures:* 10 | \u2757 *Test Errors:* 10" + } + }, + { + "type": "divider" + } + ], + "attachments": [ + { + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u2139\ufe0f *Details*" + } + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Tags*\ntag1" + }, + { + "type": "mrkdwn", + "text": "*Owners*\n<@resolved_owner1>, <@resolved_owner2>" + } + ] + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Subscribers*\n_No subscribers_" + } + ] + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Test Failures*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\ud83d\udd3a *\"test_short_name\" test failed on test_table_1*\n\ud83d\udd3a *\"test_short_name\" test failed on test_table_2* - Owner: <@resolved_owner1>\n\ud83d\udd3a *\"test_short_name\" test failed on test_table_3* - Owners: <@resolved_owner1>, <@resolved_owner2>\n\ud83d\udd3a *\"test_short_name\" test failed on test_table_4*\n\ud83d\udd3a *\"test_short_name\" test failed on test_table_5* - Owner: <@resolved_owner1>\n\ud83d\udd3a *\"test_short_name\" test failed on test_table_6* - Owners: <@resolved_owner1>, <@resolved_owner2>\n\ud83d\udd3a *\"test_short_name\" test failed on test_table_7*\n\ud83d\udd3a *\"test_short_name\" test failed on test_table_8* - Owner: <@resolved_owner1>\n\ud83d\udd3a *\"test_short_name\" test failed on test_table_9* - Owners: <@resolved_owner1>, <@resolved_owner2>\n\ud83d\udd3a *\"test_short_name\" test failed on test_table_10*" + } + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Test Errors*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u2757 *\"test_short_name\" test failed on test_table_1*\n\u2757 *\"test_short_name\" test failed on test_table_2* - Owner: <@resolved_owner1>\n\u2757 *\"test_short_name\" test failed on test_table_3* - Owners: <@resolved_owner1>, <@resolved_owner2>\n\u2757 *\"test_short_name\" test failed on test_table_4*\n\u2757 *\"test_short_name\" test failed on test_table_5* - Owner: <@resolved_owner1>\n\u2757 *\"test_short_name\" test failed on test_table_6* - Owners: <@resolved_owner1>, <@resolved_owner2>\n\u2757 *\"test_short_name\" test failed on test_table_7*\n\u2757 *\"test_short_name\" test failed on test_table_8* - Owner: <@resolved_owner1>\n\u2757 *\"test_short_name\" test failed on test_table_9* - Owners: <@resolved_owner1>, <@resolved_owner2>\n\u2757 *\"test_short_name\" test failed on test_table_10*" + } + } + ], + "color": "#ff0000" + } + ] +} diff --git a/tests/unit/alerts/alert_messages/fixtures/block_kit/group_by_table_model-errors-False_test-failures-True_test-warnings-True_test-errors-True_link-True_env-True.json b/tests/unit/alerts/alert_messages/fixtures/block_kit/group_by_table_model-errors-False_test-failures-True_test-warnings-True_test-errors-True_link-True_env-True.json new file mode 100644 index 000000000..404765493 --- /dev/null +++ b/tests/unit/alerts/alert_messages/fixtures/block_kit/group_by_table_model-errors-False_test-failures-True_test-warnings-True_test-errors-True_link-True_env-True.json @@ -0,0 +1,108 @@ +{ + "blocks": [ + { + "type": "header", + "text": { + "type": "plain_text", + "text": "Error: test_model_unique_id: 30 issues detected" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\ud83d\udd3a *Test Failures:* 10 | \u26a0\ufe0f *Test Warnings:* 10 | \u2757 *Test Errors:* 10" + } + }, + { + "type": "divider" + } + ], + "attachments": [ + { + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u2139\ufe0f *Details*" + } + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Tags*\ntag1" + }, + { + "type": "mrkdwn", + "text": "*Owners*\n<@resolved_owner1>, <@resolved_owner2>" + } + ] + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Subscribers*\n_No subscribers_" + } + ] + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Test Failures*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\ud83d\udd3a *\"test_short_name\" test failed on test_table_1* - \n\ud83d\udd3a *\"test_short_name\" test failed on test_table_2* - Owner: <@resolved_owner1> - \n\ud83d\udd3a *\"test_short_name\" test failed on test_table_3* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\ud83d\udd3a *\"test_short_name\" test failed on test_table_4* - \n\ud83d\udd3a *\"test_short_name\" test failed on test_table_5* - Owner: <@resolved_owner1> - \n\ud83d\udd3a *\"test_short_name\" test failed on test_table_6* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\ud83d\udd3a *\"test_short_name\" test failed on test_table_7* - \n\ud83d\udd3a *\"test_short_name\" test failed on test_table_8* - Owner: <@resolved_owner1> - \n\ud83d\udd3a *\"test_short_name\" test failed on test_table_9* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\ud83d\udd3a *\"test_short_name\" test failed on test_table_10* - " + } + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Test Warnings*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u26a0\ufe0f *\"test_short_name\" test failed on test_table_1* - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_2* - Owner: <@resolved_owner1> - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_3* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_4* - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_5* - Owner: <@resolved_owner1> - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_6* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_7* - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_8* - Owner: <@resolved_owner1> - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_9* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_10* - " + } + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Test Errors*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u2757 *\"test_short_name\" test failed on test_table_1* - \n\u2757 *\"test_short_name\" test failed on test_table_2* - Owner: <@resolved_owner1> - \n\u2757 *\"test_short_name\" test failed on test_table_3* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\u2757 *\"test_short_name\" test failed on test_table_4* - \n\u2757 *\"test_short_name\" test failed on test_table_5* - Owner: <@resolved_owner1> - \n\u2757 *\"test_short_name\" test failed on test_table_6* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\u2757 *\"test_short_name\" test failed on test_table_7* - \n\u2757 *\"test_short_name\" test failed on test_table_8* - Owner: <@resolved_owner1> - \n\u2757 *\"test_short_name\" test failed on test_table_9* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\u2757 *\"test_short_name\" test failed on test_table_10* - " + } + } + ], + "color": "#ff0000" + } + ] +} diff --git a/tests/unit/alerts/alert_messages/fixtures/block_kit/group_by_table_model-errors-True_test-failures-False_test-warnings-False_test-errors-True_link-False_env-False.json b/tests/unit/alerts/alert_messages/fixtures/block_kit/group_by_table_model-errors-True_test-failures-False_test-warnings-False_test-errors-True_link-False_env-False.json new file mode 100644 index 000000000..2810f3251 --- /dev/null +++ b/tests/unit/alerts/alert_messages/fixtures/block_kit/group_by_table_model-errors-True_test-failures-False_test-warnings-False_test-errors-True_link-False_env-False.json @@ -0,0 +1,91 @@ +{ + "blocks": [ + { + "type": "header", + "text": { + "type": "plain_text", + "text": "Error: test_model_unique_id: 20 issues detected" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u274c *Model Errors:* 10 | \u2757 *Test Errors:* 10" + } + }, + { + "type": "divider" + } + ], + "attachments": [ + { + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u2139\ufe0f *Details*" + } + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Tags*\ntag1" + }, + { + "type": "mrkdwn", + "text": "*Owners*\n<@resolved_owner1>, <@resolved_owner2>" + } + ] + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Subscribers*\n_No subscribers_" + } + ] + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Model Errors*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u274c *dbt failed to build table \"test_model\"*\n\u274c *dbt failed to build table \"test_model\"* - Owner: <@resolved_owner1>\n\u274c *dbt failed to build table \"test_model\"* - Owners: <@resolved_owner1>, <@resolved_owner2>\n\u274c *dbt failed to build table \"test_model\"*\n\u274c *dbt failed to build table \"test_model\"* - Owner: <@resolved_owner1>\n\u274c *dbt failed to build table \"test_model\"* - Owners: <@resolved_owner1>, <@resolved_owner2>\n\u274c *dbt failed to build table \"test_model\"*\n\u274c *dbt failed to build table \"test_model\"* - Owner: <@resolved_owner1>\n\u274c *dbt failed to build table \"test_model\"* - Owners: <@resolved_owner1>, <@resolved_owner2>\n\u274c *dbt failed to build table \"test_model\"*" + } + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Test Errors*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u2757 *\"test_short_name\" test failed on test_table_1*\n\u2757 *\"test_short_name\" test failed on test_table_2* - Owner: <@resolved_owner1>\n\u2757 *\"test_short_name\" test failed on test_table_3* - Owners: <@resolved_owner1>, <@resolved_owner2>\n\u2757 *\"test_short_name\" test failed on test_table_4*\n\u2757 *\"test_short_name\" test failed on test_table_5* - Owner: <@resolved_owner1>\n\u2757 *\"test_short_name\" test failed on test_table_6* - Owners: <@resolved_owner1>, <@resolved_owner2>\n\u2757 *\"test_short_name\" test failed on test_table_7*\n\u2757 *\"test_short_name\" test failed on test_table_8* - Owner: <@resolved_owner1>\n\u2757 *\"test_short_name\" test failed on test_table_9* - Owners: <@resolved_owner1>, <@resolved_owner2>\n\u2757 *\"test_short_name\" test failed on test_table_10*" + } + } + ], + "color": "#ff0000" + } + ] +} diff --git a/tests/unit/alerts/alert_messages/fixtures/block_kit/group_by_table_model-errors-True_test-failures-False_test-warnings-True_test-errors-False_link-True_env-False.json b/tests/unit/alerts/alert_messages/fixtures/block_kit/group_by_table_model-errors-True_test-failures-False_test-warnings-True_test-errors-False_link-True_env-False.json new file mode 100644 index 000000000..41eee3000 --- /dev/null +++ b/tests/unit/alerts/alert_messages/fixtures/block_kit/group_by_table_model-errors-True_test-failures-False_test-warnings-True_test-errors-False_link-True_env-False.json @@ -0,0 +1,91 @@ +{ + "blocks": [ + { + "type": "header", + "text": { + "type": "plain_text", + "text": "Error: test_model_unique_id: 20 issues detected" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u274c *Model Errors:* 10 | \u26a0\ufe0f *Test Warnings:* 10" + } + }, + { + "type": "divider" + } + ], + "attachments": [ + { + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u2139\ufe0f *Details*" + } + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Tags*\ntag1" + }, + { + "type": "mrkdwn", + "text": "*Owners*\n<@resolved_owner1>, <@resolved_owner2>" + } + ] + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Subscribers*\n_No subscribers_" + } + ] + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Model Errors*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u274c *dbt failed to build table \"test_model\"* - \n\u274c *dbt failed to build table \"test_model\"* - Owner: <@resolved_owner1> - \n\u274c *dbt failed to build table \"test_model\"* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\u274c *dbt failed to build table \"test_model\"* - \n\u274c *dbt failed to build table \"test_model\"* - Owner: <@resolved_owner1> - \n\u274c *dbt failed to build table \"test_model\"* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\u274c *dbt failed to build table \"test_model\"* - \n\u274c *dbt failed to build table \"test_model\"* - Owner: <@resolved_owner1> - \n\u274c *dbt failed to build table \"test_model\"* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\u274c *dbt failed to build table \"test_model\"* - " + } + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Test Warnings*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u26a0\ufe0f *\"test_short_name\" test failed on test_table_1* - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_2* - Owner: <@resolved_owner1> - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_3* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_4* - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_5* - Owner: <@resolved_owner1> - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_6* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_7* - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_8* - Owner: <@resolved_owner1> - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_9* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_10* - " + } + } + ], + "color": "#ff0000" + } + ] +} diff --git a/tests/unit/alerts/alert_messages/fixtures/block_kit/group_by_table_model-errors-True_test-failures-False_test-warnings-True_test-errors-True_link-True_env-True.json b/tests/unit/alerts/alert_messages/fixtures/block_kit/group_by_table_model-errors-True_test-failures-False_test-warnings-True_test-errors-True_link-True_env-True.json new file mode 100644 index 000000000..3b09c3d00 --- /dev/null +++ b/tests/unit/alerts/alert_messages/fixtures/block_kit/group_by_table_model-errors-True_test-failures-False_test-warnings-True_test-errors-True_link-True_env-True.json @@ -0,0 +1,108 @@ +{ + "blocks": [ + { + "type": "header", + "text": { + "type": "plain_text", + "text": "Error: test_model_unique_id: 30 issues detected" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u274c *Model Errors:* 10 | \u26a0\ufe0f *Test Warnings:* 10 | \u2757 *Test Errors:* 10" + } + }, + { + "type": "divider" + } + ], + "attachments": [ + { + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u2139\ufe0f *Details*" + } + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Tags*\ntag1" + }, + { + "type": "mrkdwn", + "text": "*Owners*\n<@resolved_owner1>, <@resolved_owner2>" + } + ] + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Subscribers*\n_No subscribers_" + } + ] + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Model Errors*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u274c *dbt failed to build table \"test_model\"* - \n\u274c *dbt failed to build table \"test_model\"* - Owner: <@resolved_owner1> - \n\u274c *dbt failed to build table \"test_model\"* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\u274c *dbt failed to build table \"test_model\"* - \n\u274c *dbt failed to build table \"test_model\"* - Owner: <@resolved_owner1> - \n\u274c *dbt failed to build table \"test_model\"* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\u274c *dbt failed to build table \"test_model\"* - \n\u274c *dbt failed to build table \"test_model\"* - Owner: <@resolved_owner1> - \n\u274c *dbt failed to build table \"test_model\"* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\u274c *dbt failed to build table \"test_model\"* - " + } + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Test Warnings*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u26a0\ufe0f *\"test_short_name\" test failed on test_table_1* - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_2* - Owner: <@resolved_owner1> - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_3* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_4* - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_5* - Owner: <@resolved_owner1> - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_6* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_7* - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_8* - Owner: <@resolved_owner1> - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_9* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_10* - " + } + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Test Errors*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u2757 *\"test_short_name\" test failed on test_table_1* - \n\u2757 *\"test_short_name\" test failed on test_table_2* - Owner: <@resolved_owner1> - \n\u2757 *\"test_short_name\" test failed on test_table_3* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\u2757 *\"test_short_name\" test failed on test_table_4* - \n\u2757 *\"test_short_name\" test failed on test_table_5* - Owner: <@resolved_owner1> - \n\u2757 *\"test_short_name\" test failed on test_table_6* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\u2757 *\"test_short_name\" test failed on test_table_7* - \n\u2757 *\"test_short_name\" test failed on test_table_8* - Owner: <@resolved_owner1> - \n\u2757 *\"test_short_name\" test failed on test_table_9* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\u2757 *\"test_short_name\" test failed on test_table_10* - " + } + } + ], + "color": "#ff0000" + } + ] +} diff --git a/tests/unit/alerts/alert_messages/fixtures/block_kit/group_by_table_model-errors-True_test-failures-True_test-warnings-False_test-errors-True_link-True_env-True.json b/tests/unit/alerts/alert_messages/fixtures/block_kit/group_by_table_model-errors-True_test-failures-True_test-warnings-False_test-errors-True_link-True_env-True.json new file mode 100644 index 000000000..82fe64f5f --- /dev/null +++ b/tests/unit/alerts/alert_messages/fixtures/block_kit/group_by_table_model-errors-True_test-failures-True_test-warnings-False_test-errors-True_link-True_env-True.json @@ -0,0 +1,108 @@ +{ + "blocks": [ + { + "type": "header", + "text": { + "type": "plain_text", + "text": "Error: test_model_unique_id: 30 issues detected" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u274c *Model Errors:* 10 | \ud83d\udd3a *Test Failures:* 10 | \u2757 *Test Errors:* 10" + } + }, + { + "type": "divider" + } + ], + "attachments": [ + { + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u2139\ufe0f *Details*" + } + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Tags*\ntag1" + }, + { + "type": "mrkdwn", + "text": "*Owners*\n<@resolved_owner1>, <@resolved_owner2>" + } + ] + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Subscribers*\n_No subscribers_" + } + ] + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Model Errors*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u274c *dbt failed to build table \"test_model\"* - \n\u274c *dbt failed to build table \"test_model\"* - Owner: <@resolved_owner1> - \n\u274c *dbt failed to build table \"test_model\"* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\u274c *dbt failed to build table \"test_model\"* - \n\u274c *dbt failed to build table \"test_model\"* - Owner: <@resolved_owner1> - \n\u274c *dbt failed to build table \"test_model\"* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\u274c *dbt failed to build table \"test_model\"* - \n\u274c *dbt failed to build table \"test_model\"* - Owner: <@resolved_owner1> - \n\u274c *dbt failed to build table \"test_model\"* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\u274c *dbt failed to build table \"test_model\"* - " + } + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Test Failures*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\ud83d\udd3a *\"test_short_name\" test failed on test_table_1* - \n\ud83d\udd3a *\"test_short_name\" test failed on test_table_2* - Owner: <@resolved_owner1> - \n\ud83d\udd3a *\"test_short_name\" test failed on test_table_3* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\ud83d\udd3a *\"test_short_name\" test failed on test_table_4* - \n\ud83d\udd3a *\"test_short_name\" test failed on test_table_5* - Owner: <@resolved_owner1> - \n\ud83d\udd3a *\"test_short_name\" test failed on test_table_6* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\ud83d\udd3a *\"test_short_name\" test failed on test_table_7* - \n\ud83d\udd3a *\"test_short_name\" test failed on test_table_8* - Owner: <@resolved_owner1> - \n\ud83d\udd3a *\"test_short_name\" test failed on test_table_9* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\ud83d\udd3a *\"test_short_name\" test failed on test_table_10* - " + } + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Test Errors*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u2757 *\"test_short_name\" test failed on test_table_1* - \n\u2757 *\"test_short_name\" test failed on test_table_2* - Owner: <@resolved_owner1> - \n\u2757 *\"test_short_name\" test failed on test_table_3* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\u2757 *\"test_short_name\" test failed on test_table_4* - \n\u2757 *\"test_short_name\" test failed on test_table_5* - Owner: <@resolved_owner1> - \n\u2757 *\"test_short_name\" test failed on test_table_6* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\u2757 *\"test_short_name\" test failed on test_table_7* - \n\u2757 *\"test_short_name\" test failed on test_table_8* - Owner: <@resolved_owner1> - \n\u2757 *\"test_short_name\" test failed on test_table_9* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\u2757 *\"test_short_name\" test failed on test_table_10* - " + } + } + ], + "color": "#ff0000" + } + ] +} diff --git a/tests/unit/alerts/alert_messages/fixtures/block_kit/group_by_table_model-errors-True_test-failures-True_test-warnings-True_test-errors-False_link-True_env-True.json b/tests/unit/alerts/alert_messages/fixtures/block_kit/group_by_table_model-errors-True_test-failures-True_test-warnings-True_test-errors-False_link-True_env-True.json new file mode 100644 index 000000000..0496bda3d --- /dev/null +++ b/tests/unit/alerts/alert_messages/fixtures/block_kit/group_by_table_model-errors-True_test-failures-True_test-warnings-True_test-errors-False_link-True_env-True.json @@ -0,0 +1,108 @@ +{ + "blocks": [ + { + "type": "header", + "text": { + "type": "plain_text", + "text": "Error: test_model_unique_id: 30 issues detected" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u274c *Model Errors:* 10 | \ud83d\udd3a *Test Failures:* 10 | \u26a0\ufe0f *Test Warnings:* 10" + } + }, + { + "type": "divider" + } + ], + "attachments": [ + { + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u2139\ufe0f *Details*" + } + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Tags*\ntag1" + }, + { + "type": "mrkdwn", + "text": "*Owners*\n<@resolved_owner1>, <@resolved_owner2>" + } + ] + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Subscribers*\n_No subscribers_" + } + ] + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Model Errors*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u274c *dbt failed to build table \"test_model\"* - \n\u274c *dbt failed to build table \"test_model\"* - Owner: <@resolved_owner1> - \n\u274c *dbt failed to build table \"test_model\"* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\u274c *dbt failed to build table \"test_model\"* - \n\u274c *dbt failed to build table \"test_model\"* - Owner: <@resolved_owner1> - \n\u274c *dbt failed to build table \"test_model\"* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\u274c *dbt failed to build table \"test_model\"* - \n\u274c *dbt failed to build table \"test_model\"* - Owner: <@resolved_owner1> - \n\u274c *dbt failed to build table \"test_model\"* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\u274c *dbt failed to build table \"test_model\"* - " + } + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Test Failures*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\ud83d\udd3a *\"test_short_name\" test failed on test_table_1* - \n\ud83d\udd3a *\"test_short_name\" test failed on test_table_2* - Owner: <@resolved_owner1> - \n\ud83d\udd3a *\"test_short_name\" test failed on test_table_3* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\ud83d\udd3a *\"test_short_name\" test failed on test_table_4* - \n\ud83d\udd3a *\"test_short_name\" test failed on test_table_5* - Owner: <@resolved_owner1> - \n\ud83d\udd3a *\"test_short_name\" test failed on test_table_6* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\ud83d\udd3a *\"test_short_name\" test failed on test_table_7* - \n\ud83d\udd3a *\"test_short_name\" test failed on test_table_8* - Owner: <@resolved_owner1> - \n\ud83d\udd3a *\"test_short_name\" test failed on test_table_9* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\ud83d\udd3a *\"test_short_name\" test failed on test_table_10* - " + } + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Test Warnings*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u26a0\ufe0f *\"test_short_name\" test failed on test_table_1* - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_2* - Owner: <@resolved_owner1> - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_3* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_4* - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_5* - Owner: <@resolved_owner1> - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_6* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_7* - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_8* - Owner: <@resolved_owner1> - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_9* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_10* - " + } + } + ], + "color": "#ff0000" + } + ] +} diff --git a/tests/unit/alerts/alert_messages/fixtures/block_kit/group_by_table_model-errors-True_test-failures-True_test-warnings-True_test-errors-True_link-True_env-True.json b/tests/unit/alerts/alert_messages/fixtures/block_kit/group_by_table_model-errors-True_test-failures-True_test-warnings-True_test-errors-True_link-True_env-True.json new file mode 100644 index 000000000..458ffa4c1 --- /dev/null +++ b/tests/unit/alerts/alert_messages/fixtures/block_kit/group_by_table_model-errors-True_test-failures-True_test-warnings-True_test-errors-True_link-True_env-True.json @@ -0,0 +1,125 @@ +{ + "blocks": [ + { + "type": "header", + "text": { + "type": "plain_text", + "text": "Error: test_model_unique_id: 40 issues detected" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u274c *Model Errors:* 10 | \ud83d\udd3a *Test Failures:* 10 | \u26a0\ufe0f *Test Warnings:* 10 | \u2757 *Test Errors:* 10" + } + }, + { + "type": "divider" + } + ], + "attachments": [ + { + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u2139\ufe0f *Details*" + } + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Tags*\ntag1" + }, + { + "type": "mrkdwn", + "text": "*Owners*\n<@resolved_owner1>, <@resolved_owner2>" + } + ] + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Subscribers*\n_No subscribers_" + } + ] + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Model Errors*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u274c *dbt failed to build table \"test_model\"* - \n\u274c *dbt failed to build table \"test_model\"* - Owner: <@resolved_owner1> - \n\u274c *dbt failed to build table \"test_model\"* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\u274c *dbt failed to build table \"test_model\"* - \n\u274c *dbt failed to build table \"test_model\"* - Owner: <@resolved_owner1> - \n\u274c *dbt failed to build table \"test_model\"* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\u274c *dbt failed to build table \"test_model\"* - \n\u274c *dbt failed to build table \"test_model\"* - Owner: <@resolved_owner1> - \n\u274c *dbt failed to build table \"test_model\"* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\u274c *dbt failed to build table \"test_model\"* - " + } + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Test Failures*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\ud83d\udd3a *\"test_short_name\" test failed on test_table_1* - \n\ud83d\udd3a *\"test_short_name\" test failed on test_table_2* - Owner: <@resolved_owner1> - \n\ud83d\udd3a *\"test_short_name\" test failed on test_table_3* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\ud83d\udd3a *\"test_short_name\" test failed on test_table_4* - \n\ud83d\udd3a *\"test_short_name\" test failed on test_table_5* - Owner: <@resolved_owner1> - \n\ud83d\udd3a *\"test_short_name\" test failed on test_table_6* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\ud83d\udd3a *\"test_short_name\" test failed on test_table_7* - \n\ud83d\udd3a *\"test_short_name\" test failed on test_table_8* - Owner: <@resolved_owner1> - \n\ud83d\udd3a *\"test_short_name\" test failed on test_table_9* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\ud83d\udd3a *\"test_short_name\" test failed on test_table_10* - " + } + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Test Warnings*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u26a0\ufe0f *\"test_short_name\" test failed on test_table_1* - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_2* - Owner: <@resolved_owner1> - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_3* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_4* - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_5* - Owner: <@resolved_owner1> - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_6* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_7* - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_8* - Owner: <@resolved_owner1> - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_9* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\u26a0\ufe0f *\"test_short_name\" test failed on test_table_10* - " + } + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Test Errors*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u2757 *\"test_short_name\" test failed on test_table_1* - \n\u2757 *\"test_short_name\" test failed on test_table_2* - Owner: <@resolved_owner1> - \n\u2757 *\"test_short_name\" test failed on test_table_3* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\u2757 *\"test_short_name\" test failed on test_table_4* - \n\u2757 *\"test_short_name\" test failed on test_table_5* - Owner: <@resolved_owner1> - \n\u2757 *\"test_short_name\" test failed on test_table_6* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\u2757 *\"test_short_name\" test failed on test_table_7* - \n\u2757 *\"test_short_name\" test failed on test_table_8* - Owner: <@resolved_owner1> - \n\u2757 *\"test_short_name\" test failed on test_table_9* - Owners: <@resolved_owner1>, <@resolved_owner2> - \n\u2757 *\"test_short_name\" test failed on test_table_10* - " + } + } + ], + "color": "#ff0000" + } + ] +} diff --git a/tests/unit/alerts/alert_messages/fixtures/block_kit/model_alert_status-None_link-False_tags-False_owners-True_path-False_suppression-True_materialization-table_full_refresh-True_env-True.json b/tests/unit/alerts/alert_messages/fixtures/block_kit/model_alert_status-None_link-False_tags-False_owners-True_path-False_suppression-True_materialization-table_full_refresh-True_env-True.json new file mode 100644 index 000000000..8c6243f6c --- /dev/null +++ b/tests/unit/alerts/alert_messages/fixtures/block_kit/model_alert_status-None_link-False_tags-False_owners-True_path-False_suppression-True_materialization-table_full_refresh-True_env-True.json @@ -0,0 +1,93 @@ +{ + "blocks": [ + { + "type": "header", + "text": { + "type": "plain_text", + "text": "dbt failed to build table \"test_model\"" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Model:* test_model | *Env:* Test Env | *Status:* Unknown | *Time:* 2025-02-03 13:21:07 UTC | *Suppression interval:* 24" + } + }, + { + "type": "divider" + } + ], + "attachments": [ + { + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u2139\ufe0f *Details*" + } + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Tags*\n_No tags_" + }, + { + "type": "mrkdwn", + "text": "*Owners*\n<@resolved_owner1>, <@resolved_owner2>" + } + ] + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Subscribers*\n_No subscribers_" + } + ] + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Path*\n`unknown_path`" + } + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Result Message*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```Database Error in table my_failed_dbt_model\n(models/example/my_failed_dbt_model.sql)\n syntax error at or near \")\"\n LINE 19: \t); \n\t\t^```" + } + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Materialization*\ntable" + }, + { + "type": "mrkdwn", + "text": "*Full Refresh*\nYes" + } + ] + } + ] + } + ] +} diff --git a/tests/unit/alerts/alert_messages/fixtures/block_kit/model_alert_status-None_link-True_tags-False_owners-True_path-True_suppression-True_materialization-table_full_refresh-False_env-True.json b/tests/unit/alerts/alert_messages/fixtures/block_kit/model_alert_status-None_link-True_tags-False_owners-True_path-True_suppression-True_materialization-table_full_refresh-False_env-True.json new file mode 100644 index 000000000..697f35be2 --- /dev/null +++ b/tests/unit/alerts/alert_messages/fixtures/block_kit/model_alert_status-None_link-True_tags-False_owners-True_path-True_suppression-True_materialization-table_full_refresh-False_env-True.json @@ -0,0 +1,93 @@ +{ + "blocks": [ + { + "type": "header", + "text": { + "type": "plain_text", + "text": "dbt failed to build table \"test_model\"" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Model:* test_model | *Env:* Test Env | *Status:* Unknown | *Time:* 2025-02-03 13:21:07 UTC | *Suppression interval:* 24\n" + } + }, + { + "type": "divider" + } + ], + "attachments": [ + { + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u2139\ufe0f *Details*" + } + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Tags*\n_No tags_" + }, + { + "type": "mrkdwn", + "text": "*Owners*\n<@resolved_owner1>, <@resolved_owner2>" + } + ] + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Subscribers*\n_No subscribers_" + } + ] + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Path*\n`models/test_model.sql`" + } + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Result Message*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```Database Error in table my_failed_dbt_model\n(models/example/my_failed_dbt_model.sql)\n syntax error at or near \")\"\n LINE 19: \t); \n\t\t^```" + } + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Materialization*\ntable" + }, + { + "type": "mrkdwn", + "text": "*Full Refresh*\nNo" + } + ] + } + ] + } + ] +} diff --git a/tests/unit/alerts/alert_messages/fixtures/block_kit/model_alert_status-error_link-False_tags-True_owners-True_path-True_suppression-False_materialization-incremental_full_refresh-True_env-False.json b/tests/unit/alerts/alert_messages/fixtures/block_kit/model_alert_status-error_link-False_tags-True_owners-True_path-True_suppression-False_materialization-incremental_full_refresh-True_env-False.json new file mode 100644 index 000000000..172838a9f --- /dev/null +++ b/tests/unit/alerts/alert_messages/fixtures/block_kit/model_alert_status-error_link-False_tags-True_owners-True_path-True_suppression-False_materialization-incremental_full_refresh-True_env-False.json @@ -0,0 +1,94 @@ +{ + "blocks": [ + { + "type": "header", + "text": { + "type": "plain_text", + "text": "Error: dbt failed to build incremental \"test_model\"" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Model:* test_model | *Status:* error | *Time:* 2025-02-03 13:21:07 UTC" + } + }, + { + "type": "divider" + } + ], + "attachments": [ + { + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u2139\ufe0f *Details*" + } + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Tags*\ntag1, tag2" + }, + { + "type": "mrkdwn", + "text": "*Owners*\n<@resolved_owner1>, <@resolved_owner2>" + } + ] + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Subscribers*\n_No subscribers_" + } + ] + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Path*\n`models/test_model.sql`" + } + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Result Message*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```Database Error in incremental my_failed_dbt_model\n(models/example/my_failed_dbt_model.sql)\n syntax error at or near \")\"\n LINE 19: \t); \n\t\t^```" + } + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Materialization*\nincremental" + }, + { + "type": "mrkdwn", + "text": "*Full Refresh*\nYes" + } + ] + } + ], + "color": "#ff0000" + } + ] +} diff --git a/tests/unit/alerts/alert_messages/fixtures/block_kit/model_alert_status-error_link-True_tags-True_owners-False_path-False_suppression-True_materialization-view_full_refresh-True_env-True.json b/tests/unit/alerts/alert_messages/fixtures/block_kit/model_alert_status-error_link-True_tags-True_owners-False_path-False_suppression-True_materialization-view_full_refresh-True_env-True.json new file mode 100644 index 000000000..2d59c0247 --- /dev/null +++ b/tests/unit/alerts/alert_messages/fixtures/block_kit/model_alert_status-error_link-True_tags-True_owners-False_path-False_suppression-True_materialization-view_full_refresh-True_env-True.json @@ -0,0 +1,94 @@ +{ + "blocks": [ + { + "type": "header", + "text": { + "type": "plain_text", + "text": "Error: dbt failed to build view \"test_model\"" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Model:* test_model | *Env:* Test Env | *Status:* error | *Time:* 2025-02-03 13:21:07 UTC | *Suppression interval:* 24\n" + } + }, + { + "type": "divider" + } + ], + "attachments": [ + { + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u2139\ufe0f *Details*" + } + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Tags*\ntag1, tag2" + }, + { + "type": "mrkdwn", + "text": "*Owners*\n_No owners_" + } + ] + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Subscribers*\n_No subscribers_" + } + ] + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Path*\n`unknown_path`" + } + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Result Message*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```Database Error in view my_failed_dbt_model\n(models/example/my_failed_dbt_model.sql)\n syntax error at or near \")\"\n LINE 19: \t); \n\t\t^```" + } + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Materialization*\nview" + }, + { + "type": "mrkdwn", + "text": "*Full Refresh*\nYes" + } + ] + } + ], + "color": "#ff0000" + } + ] +} diff --git a/tests/unit/alerts/alert_messages/fixtures/block_kit/model_alert_status-fail_link-False_tags-False_owners-False_path-False_suppression-False_materialization-table_full_refresh-False_env-False.json b/tests/unit/alerts/alert_messages/fixtures/block_kit/model_alert_status-fail_link-False_tags-False_owners-False_path-False_suppression-False_materialization-table_full_refresh-False_env-False.json new file mode 100644 index 000000000..eb3aece24 --- /dev/null +++ b/tests/unit/alerts/alert_messages/fixtures/block_kit/model_alert_status-fail_link-False_tags-False_owners-False_path-False_suppression-False_materialization-table_full_refresh-False_env-False.json @@ -0,0 +1,80 @@ +{ + "blocks": [ + { + "type": "header", + "text": { + "type": "plain_text", + "text": "Failure: dbt failed to build table \"test_model\"" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Model:* test_model | *Status:* fail | *Time:* 2025-02-03 13:21:07 UTC" + } + }, + { + "type": "divider" + } + ], + "attachments": [ + { + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u2139\ufe0f *Details*" + } + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Tags*\n_No tags_" + }, + { + "type": "mrkdwn", + "text": "*Owners*\n_No owners_" + } + ] + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Subscribers*\n_No subscribers_" + } + ] + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Path*\n`unknown_path`" + } + }, + { + "type": "divider" + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Materialization*\ntable" + }, + { + "type": "mrkdwn", + "text": "*Full Refresh*\nNo" + } + ] + } + ], + "color": "#ff0000" + } + ] +} diff --git a/tests/unit/alerts/alert_messages/fixtures/block_kit/model_alert_status-fail_link-True_tags-False_owners-False_path-True_suppression-False_materialization-incremental_full_refresh-True_env-False.json b/tests/unit/alerts/alert_messages/fixtures/block_kit/model_alert_status-fail_link-True_tags-False_owners-False_path-True_suppression-False_materialization-incremental_full_refresh-True_env-False.json new file mode 100644 index 000000000..92855d78a --- /dev/null +++ b/tests/unit/alerts/alert_messages/fixtures/block_kit/model_alert_status-fail_link-True_tags-False_owners-False_path-True_suppression-False_materialization-incremental_full_refresh-True_env-False.json @@ -0,0 +1,94 @@ +{ + "blocks": [ + { + "type": "header", + "text": { + "type": "plain_text", + "text": "Failure: dbt failed to build incremental \"test_model\"" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Model:* test_model | *Status:* fail | *Time:* 2025-02-03 13:21:07 UTC\n" + } + }, + { + "type": "divider" + } + ], + "attachments": [ + { + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u2139\ufe0f *Details*" + } + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Tags*\n_No tags_" + }, + { + "type": "mrkdwn", + "text": "*Owners*\n_No owners_" + } + ] + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Subscribers*\n_No subscribers_" + } + ] + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Path*\n`models/test_model.sql`" + } + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Result Message*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```Database Error in incremental my_failed_dbt_model\n(models/example/my_failed_dbt_model.sql)\n syntax error at or near \")\"\n LINE 19: \t); \n\t\t^```" + } + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Materialization*\nincremental" + }, + { + "type": "mrkdwn", + "text": "*Full Refresh*\nYes" + } + ] + } + ], + "color": "#ff0000" + } + ] +} diff --git a/tests/unit/alerts/alert_messages/fixtures/block_kit/model_alert_status-fail_link-True_tags-True_owners-True_path-True_suppression-True_materialization-table_full_refresh-True_env-True.json b/tests/unit/alerts/alert_messages/fixtures/block_kit/model_alert_status-fail_link-True_tags-True_owners-True_path-True_suppression-True_materialization-table_full_refresh-True_env-True.json new file mode 100644 index 000000000..65965a12c --- /dev/null +++ b/tests/unit/alerts/alert_messages/fixtures/block_kit/model_alert_status-fail_link-True_tags-True_owners-True_path-True_suppression-True_materialization-table_full_refresh-True_env-True.json @@ -0,0 +1,94 @@ +{ + "blocks": [ + { + "type": "header", + "text": { + "type": "plain_text", + "text": "Failure: dbt failed to build table \"test_model\"" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Model:* test_model | *Env:* Test Env | *Status:* fail | *Time:* 2025-02-03 13:21:07 UTC | *Suppression interval:* 24\n" + } + }, + { + "type": "divider" + } + ], + "attachments": [ + { + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u2139\ufe0f *Details*" + } + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Tags*\ntag1, tag2" + }, + { + "type": "mrkdwn", + "text": "*Owners*\n<@resolved_owner1>, <@resolved_owner2>" + } + ] + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Subscribers*\n_No subscribers_" + } + ] + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Path*\n`models/test_model.sql`" + } + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Result Message*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```Database Error in table my_failed_dbt_model\n(models/example/my_failed_dbt_model.sql)\n syntax error at or near \")\"\n LINE 19: \t); \n\t\t^```" + } + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Materialization*\ntable" + }, + { + "type": "mrkdwn", + "text": "*Full Refresh*\nYes" + } + ] + } + ], + "color": "#ff0000" + } + ] +} diff --git a/tests/unit/alerts/alert_messages/fixtures/block_kit/model_alert_status-warn_link-False_tags-True_owners-False_path-True_suppression-True_materialization-incremental_full_refresh-False_env-False.json b/tests/unit/alerts/alert_messages/fixtures/block_kit/model_alert_status-warn_link-False_tags-True_owners-False_path-True_suppression-True_materialization-incremental_full_refresh-False_env-False.json new file mode 100644 index 000000000..c30881390 --- /dev/null +++ b/tests/unit/alerts/alert_messages/fixtures/block_kit/model_alert_status-warn_link-False_tags-True_owners-False_path-True_suppression-True_materialization-incremental_full_refresh-False_env-False.json @@ -0,0 +1,80 @@ +{ + "blocks": [ + { + "type": "header", + "text": { + "type": "plain_text", + "text": "Warning: dbt failed to build incremental \"test_model\"" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Model:* test_model | *Status:* warn | *Time:* 2025-02-03 13:21:07 UTC | *Suppression interval:* 24" + } + }, + { + "type": "divider" + } + ], + "attachments": [ + { + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u2139\ufe0f *Details*" + } + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Tags*\ntag1, tag2" + }, + { + "type": "mrkdwn", + "text": "*Owners*\n_No owners_" + } + ] + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Subscribers*\n_No subscribers_" + } + ] + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Path*\n`models/test_model.sql`" + } + }, + { + "type": "divider" + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Materialization*\nincremental" + }, + { + "type": "mrkdwn", + "text": "*Full Refresh*\nNo" + } + ] + } + ], + "color": "#ffcc00" + } + ] +} diff --git a/tests/unit/alerts/alert_messages/fixtures/block_kit/model_alert_status-warn_link-False_tags-True_owners-True_path-True_suppression-True_materialization-view_full_refresh-False_env-False.json b/tests/unit/alerts/alert_messages/fixtures/block_kit/model_alert_status-warn_link-False_tags-True_owners-True_path-True_suppression-True_materialization-view_full_refresh-False_env-False.json new file mode 100644 index 000000000..f42b62889 --- /dev/null +++ b/tests/unit/alerts/alert_messages/fixtures/block_kit/model_alert_status-warn_link-False_tags-True_owners-True_path-True_suppression-True_materialization-view_full_refresh-False_env-False.json @@ -0,0 +1,94 @@ +{ + "blocks": [ + { + "type": "header", + "text": { + "type": "plain_text", + "text": "Warning: dbt failed to build view \"test_model\"" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Model:* test_model | *Status:* warn | *Time:* 2025-02-03 13:21:07 UTC | *Suppression interval:* 24" + } + }, + { + "type": "divider" + } + ], + "attachments": [ + { + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u2139\ufe0f *Details*" + } + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Tags*\ntag1, tag2" + }, + { + "type": "mrkdwn", + "text": "*Owners*\n<@resolved_owner1>, <@resolved_owner2>" + } + ] + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Subscribers*\n_No subscribers_" + } + ] + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Path*\n`models/test_model.sql`" + } + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Result Message*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```Database Error in view my_failed_dbt_model\n(models/example/my_failed_dbt_model.sql)\n syntax error at or near \")\"\n LINE 19: \t); \n\t\t^```" + } + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Materialization*\nview" + }, + { + "type": "mrkdwn", + "text": "*Full Refresh*\nNo" + } + ] + } + ], + "color": "#ffcc00" + } + ] +} diff --git a/tests/unit/alerts/alert_messages/fixtures/block_kit/model_alert_status-warn_link-True_tags-True_owners-True_path-False_suppression-True_materialization-view_full_refresh-True_env-True.json b/tests/unit/alerts/alert_messages/fixtures/block_kit/model_alert_status-warn_link-True_tags-True_owners-True_path-False_suppression-True_materialization-view_full_refresh-True_env-True.json new file mode 100644 index 000000000..a8f00b2d2 --- /dev/null +++ b/tests/unit/alerts/alert_messages/fixtures/block_kit/model_alert_status-warn_link-True_tags-True_owners-True_path-False_suppression-True_materialization-view_full_refresh-True_env-True.json @@ -0,0 +1,94 @@ +{ + "blocks": [ + { + "type": "header", + "text": { + "type": "plain_text", + "text": "Warning: dbt failed to build view \"test_model\"" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Model:* test_model | *Env:* Test Env | *Status:* warn | *Time:* 2025-02-03 13:21:07 UTC | *Suppression interval:* 24\n" + } + }, + { + "type": "divider" + } + ], + "attachments": [ + { + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u2139\ufe0f *Details*" + } + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Tags*\ntag1, tag2" + }, + { + "type": "mrkdwn", + "text": "*Owners*\n<@resolved_owner1>, <@resolved_owner2>" + } + ] + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Subscribers*\n_No subscribers_" + } + ] + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Path*\n`unknown_path`" + } + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Result Message*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```Database Error in view my_failed_dbt_model\n(models/example/my_failed_dbt_model.sql)\n syntax error at or near \")\"\n LINE 19: \t); \n\t\t^```" + } + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Materialization*\nview" + }, + { + "type": "mrkdwn", + "text": "*Full Refresh*\nYes" + } + ] + } + ], + "color": "#ffcc00" + } + ] +} diff --git a/tests/unit/alerts/alert_messages/fixtures/block_kit/snapshot_alert_status-None_link-False_message-False_tags-False_owners-True_path-True_suppression-False_env-True.json b/tests/unit/alerts/alert_messages/fixtures/block_kit/snapshot_alert_status-None_link-False_message-False_tags-False_owners-True_path-True_suppression-False_env-True.json new file mode 100644 index 000000000..1669bf415 --- /dev/null +++ b/tests/unit/alerts/alert_messages/fixtures/block_kit/snapshot_alert_status-None_link-False_message-False_tags-False_owners-True_path-True_suppression-False_env-True.json @@ -0,0 +1,63 @@ +{ + "blocks": [ + { + "type": "header", + "text": { + "type": "plain_text", + "text": "dbt failed to build snapshot \"test_snapshot\"" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Snapshot:* test_snapshot | *Env:* Test Env | *Status:* Unknown | *Time:* 2025-02-03 13:21:07 UTC" + } + }, + { + "type": "divider" + } + ], + "attachments": [ + { + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u2139\ufe0f *Details*" + } + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Tags*\n_No tags_" + }, + { + "type": "mrkdwn", + "text": "*Owners*\n<@resolved_owner1>, <@resolved_owner2>" + } + ] + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Subscribers*\n_No subscribers_" + } + ] + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Path*\n`models/test_snapshot.sql`" + } + } + ] + } + ] +} diff --git a/tests/unit/alerts/alert_messages/fixtures/block_kit/snapshot_alert_status-None_link-True_message-False_tags-True_owners-False_path-False_suppression-True_env-True.json b/tests/unit/alerts/alert_messages/fixtures/block_kit/snapshot_alert_status-None_link-True_message-False_tags-True_owners-False_path-False_suppression-True_env-True.json new file mode 100644 index 000000000..761100961 --- /dev/null +++ b/tests/unit/alerts/alert_messages/fixtures/block_kit/snapshot_alert_status-None_link-True_message-False_tags-True_owners-False_path-False_suppression-True_env-True.json @@ -0,0 +1,56 @@ +{ + "blocks": [ + { + "type": "header", + "text": { + "type": "plain_text", + "text": "dbt failed to build snapshot \"test_snapshot\"" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Snapshot:* test_snapshot | *Env:* Test Env | *Status:* Unknown | *Time:* 2025-02-03 13:21:07 UTC | *Suppression interval:* 24\n" + } + }, + { + "type": "divider" + } + ], + "attachments": [ + { + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u2139\ufe0f *Details*" + } + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Tags*\ntag1, tag2" + }, + { + "type": "mrkdwn", + "text": "*Owners*\n_No owners_" + } + ] + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Subscribers*\n_No subscribers_" + } + ] + } + ] + } + ] +} diff --git a/tests/unit/alerts/alert_messages/fixtures/block_kit/snapshot_alert_status-error_link-False_message-True_tags-True_owners-False_path-False_suppression-True_env-False.json b/tests/unit/alerts/alert_messages/fixtures/block_kit/snapshot_alert_status-error_link-False_message-True_tags-True_owners-False_path-False_suppression-True_env-False.json new file mode 100644 index 000000000..c384dd3d2 --- /dev/null +++ b/tests/unit/alerts/alert_messages/fixtures/block_kit/snapshot_alert_status-error_link-False_message-True_tags-True_owners-False_path-False_suppression-True_env-False.json @@ -0,0 +1,74 @@ +{ + "blocks": [ + { + "type": "header", + "text": { + "type": "plain_text", + "text": "Error: dbt failed to build snapshot \"test_snapshot\"" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Snapshot:* test_snapshot | *Status:* error | *Time:* 2025-02-03 13:21:07 UTC | *Suppression interval:* 24" + } + }, + { + "type": "divider" + } + ], + "attachments": [ + { + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u2139\ufe0f *Details*" + } + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Tags*\ntag1, tag2" + }, + { + "type": "mrkdwn", + "text": "*Owners*\n_No owners_" + } + ] + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Subscribers*\n_No subscribers_" + } + ] + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Result Message*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```Test message```" + } + } + ], + "color": "#ff0000" + } + ] +} diff --git a/tests/unit/alerts/alert_messages/fixtures/block_kit/snapshot_alert_status-error_link-True_message-True_tags-False_owners-True_path-True_suppression-False_env-True.json b/tests/unit/alerts/alert_messages/fixtures/block_kit/snapshot_alert_status-error_link-True_message-True_tags-False_owners-True_path-True_suppression-False_env-True.json new file mode 100644 index 000000000..11ea2b24a --- /dev/null +++ b/tests/unit/alerts/alert_messages/fixtures/block_kit/snapshot_alert_status-error_link-True_message-True_tags-False_owners-True_path-True_suppression-False_env-True.json @@ -0,0 +1,81 @@ +{ + "blocks": [ + { + "type": "header", + "text": { + "type": "plain_text", + "text": "Error: dbt failed to build snapshot \"test_snapshot\"" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Snapshot:* test_snapshot | *Env:* Test Env | *Status:* error | *Time:* 2025-02-03 13:21:07 UTC\n" + } + }, + { + "type": "divider" + } + ], + "attachments": [ + { + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u2139\ufe0f *Details*" + } + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Tags*\n_No tags_" + }, + { + "type": "mrkdwn", + "text": "*Owners*\n<@resolved_owner1>, <@resolved_owner2>" + } + ] + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Subscribers*\n_No subscribers_" + } + ] + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Path*\n`models/test_snapshot.sql`" + } + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Result Message*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```Test message```" + } + } + ], + "color": "#ff0000" + } + ] +} diff --git a/tests/unit/alerts/alert_messages/fixtures/block_kit/snapshot_alert_status-fail_link-False_message-False_tags-False_owners-False_path-False_suppression-False_env-False.json b/tests/unit/alerts/alert_messages/fixtures/block_kit/snapshot_alert_status-fail_link-False_message-False_tags-False_owners-False_path-False_suppression-False_env-False.json new file mode 100644 index 000000000..6650710d8 --- /dev/null +++ b/tests/unit/alerts/alert_messages/fixtures/block_kit/snapshot_alert_status-fail_link-False_message-False_tags-False_owners-False_path-False_suppression-False_env-False.json @@ -0,0 +1,24 @@ +{ + "blocks": [], + "attachments": [ + { + "blocks": [ + { + "type": "header", + "text": { + "type": "plain_text", + "text": "Failure: dbt failed to build snapshot \"test_snapshot\"" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Snapshot:* test_snapshot | *Status:* fail | *Time:* 2025-02-03 13:21:07 UTC" + } + } + ], + "color": "#ff0000" + } + ] +} diff --git a/tests/unit/alerts/alert_messages/fixtures/block_kit/snapshot_alert_status-fail_link-True_message-False_tags-True_owners-True_path-False_suppression-True_env-False.json b/tests/unit/alerts/alert_messages/fixtures/block_kit/snapshot_alert_status-fail_link-True_message-False_tags-True_owners-True_path-False_suppression-True_env-False.json new file mode 100644 index 000000000..b79827b61 --- /dev/null +++ b/tests/unit/alerts/alert_messages/fixtures/block_kit/snapshot_alert_status-fail_link-True_message-False_tags-True_owners-True_path-False_suppression-True_env-False.json @@ -0,0 +1,57 @@ +{ + "blocks": [ + { + "type": "header", + "text": { + "type": "plain_text", + "text": "Failure: dbt failed to build snapshot \"test_snapshot\"" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Snapshot:* test_snapshot | *Status:* fail | *Time:* 2025-02-03 13:21:07 UTC | *Suppression interval:* 24\n" + } + }, + { + "type": "divider" + } + ], + "attachments": [ + { + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u2139\ufe0f *Details*" + } + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Tags*\ntag1, tag2" + }, + { + "type": "mrkdwn", + "text": "*Owners*\n<@resolved_owner1>, <@resolved_owner2>" + } + ] + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Subscribers*\n_No subscribers_" + } + ] + } + ], + "color": "#ff0000" + } + ] +} diff --git a/tests/unit/alerts/alert_messages/fixtures/block_kit/snapshot_alert_status-fail_link-True_message-True_tags-True_owners-True_path-True_suppression-True_env-True.json b/tests/unit/alerts/alert_messages/fixtures/block_kit/snapshot_alert_status-fail_link-True_message-True_tags-True_owners-True_path-True_suppression-True_env-True.json new file mode 100644 index 000000000..b335afd9f --- /dev/null +++ b/tests/unit/alerts/alert_messages/fixtures/block_kit/snapshot_alert_status-fail_link-True_message-True_tags-True_owners-True_path-True_suppression-True_env-True.json @@ -0,0 +1,81 @@ +{ + "blocks": [ + { + "type": "header", + "text": { + "type": "plain_text", + "text": "Failure: dbt failed to build snapshot \"test_snapshot\"" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Snapshot:* test_snapshot | *Env:* Test Env | *Status:* fail | *Time:* 2025-02-03 13:21:07 UTC | *Suppression interval:* 24\n" + } + }, + { + "type": "divider" + } + ], + "attachments": [ + { + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u2139\ufe0f *Details*" + } + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Tags*\ntag1, tag2" + }, + { + "type": "mrkdwn", + "text": "*Owners*\n<@resolved_owner1>, <@resolved_owner2>" + } + ] + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Subscribers*\n_No subscribers_" + } + ] + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Path*\n`models/test_snapshot.sql`" + } + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Result Message*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```Test message```" + } + } + ], + "color": "#ff0000" + } + ] +} diff --git a/tests/unit/alerts/alert_messages/fixtures/block_kit/snapshot_alert_status-warn_link-False_message-True_tags-False_owners-True_path-False_suppression-True_env-False.json b/tests/unit/alerts/alert_messages/fixtures/block_kit/snapshot_alert_status-warn_link-False_message-True_tags-False_owners-True_path-False_suppression-True_env-False.json new file mode 100644 index 000000000..84d77c3bd --- /dev/null +++ b/tests/unit/alerts/alert_messages/fixtures/block_kit/snapshot_alert_status-warn_link-False_message-True_tags-False_owners-True_path-False_suppression-True_env-False.json @@ -0,0 +1,74 @@ +{ + "blocks": [ + { + "type": "header", + "text": { + "type": "plain_text", + "text": "Warning: dbt failed to build snapshot \"test_snapshot\"" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Snapshot:* test_snapshot | *Status:* warn | *Time:* 2025-02-03 13:21:07 UTC | *Suppression interval:* 24" + } + }, + { + "type": "divider" + } + ], + "attachments": [ + { + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u2139\ufe0f *Details*" + } + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Tags*\n_No tags_" + }, + { + "type": "mrkdwn", + "text": "*Owners*\n<@resolved_owner1>, <@resolved_owner2>" + } + ] + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Subscribers*\n_No subscribers_" + } + ] + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Result Message*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```Test message```" + } + } + ], + "color": "#ffcc00" + } + ] +} diff --git a/tests/unit/alerts/alert_messages/fixtures/block_kit/snapshot_alert_status-warn_link-False_message-True_tags-True_owners-False_path-True_suppression-False_env-False.json b/tests/unit/alerts/alert_messages/fixtures/block_kit/snapshot_alert_status-warn_link-False_message-True_tags-True_owners-False_path-True_suppression-False_env-False.json new file mode 100644 index 000000000..1109a845d --- /dev/null +++ b/tests/unit/alerts/alert_messages/fixtures/block_kit/snapshot_alert_status-warn_link-False_message-True_tags-True_owners-False_path-True_suppression-False_env-False.json @@ -0,0 +1,81 @@ +{ + "blocks": [ + { + "type": "header", + "text": { + "type": "plain_text", + "text": "Warning: dbt failed to build snapshot \"test_snapshot\"" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Snapshot:* test_snapshot | *Status:* warn | *Time:* 2025-02-03 13:21:07 UTC" + } + }, + { + "type": "divider" + } + ], + "attachments": [ + { + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u2139\ufe0f *Details*" + } + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Tags*\ntag1, tag2" + }, + { + "type": "mrkdwn", + "text": "*Owners*\n_No owners_" + } + ] + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Subscribers*\n_No subscribers_" + } + ] + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Path*\n`models/test_snapshot.sql`" + } + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Result Message*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```Test message```" + } + } + ], + "color": "#ffcc00" + } + ] +} diff --git a/tests/unit/alerts/alert_messages/fixtures/block_kit/snapshot_alert_status-warn_link-True_message-False_tags-True_owners-False_path-True_suppression-False_env-True.json b/tests/unit/alerts/alert_messages/fixtures/block_kit/snapshot_alert_status-warn_link-True_message-False_tags-True_owners-False_path-True_suppression-False_env-True.json new file mode 100644 index 000000000..70e64bc9e --- /dev/null +++ b/tests/unit/alerts/alert_messages/fixtures/block_kit/snapshot_alert_status-warn_link-True_message-False_tags-True_owners-False_path-True_suppression-False_env-True.json @@ -0,0 +1,64 @@ +{ + "blocks": [ + { + "type": "header", + "text": { + "type": "plain_text", + "text": "Warning: dbt failed to build snapshot \"test_snapshot\"" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Snapshot:* test_snapshot | *Env:* Test Env | *Status:* warn | *Time:* 2025-02-03 13:21:07 UTC\n" + } + }, + { + "type": "divider" + } + ], + "attachments": [ + { + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u2139\ufe0f *Details*" + } + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Tags*\ntag1, tag2" + }, + { + "type": "mrkdwn", + "text": "*Owners*\n_No owners_" + } + ] + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Subscribers*\n_No subscribers_" + } + ] + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Path*\n`models/test_snapshot.sql`" + } + } + ], + "color": "#ffcc00" + } + ] +} diff --git a/tests/unit/alerts/alert_messages/fixtures/block_kit/source_freshness_alert_status-error_link-False_message-False_tags-True_owners-True_path-True_error-True_suppression-False_env-False.json b/tests/unit/alerts/alert_messages/fixtures/block_kit/source_freshness_alert_status-error_link-False_message-False_tags-True_owners-True_path-True_error-True_suppression-False_env-False.json new file mode 100644 index 000000000..ed584f87d --- /dev/null +++ b/tests/unit/alerts/alert_messages/fixtures/block_kit/source_freshness_alert_status-error_link-False_message-False_tags-True_owners-True_path-True_error-True_suppression-False_env-False.json @@ -0,0 +1,94 @@ +{ + "blocks": [ + { + "type": "header", + "text": { + "type": "plain_text", + "text": "Error: Freshness exceeded the acceptable times on source \"test_source\"" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Source:* test_source.test_identifier | *Status:* error | *Time:* 2025-02-03 13:21:07 UTC" + } + }, + { + "type": "divider" + } + ], + "attachments": [ + { + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u2139\ufe0f *Details*" + } + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Tags*\ntag1, tag2" + }, + { + "type": "mrkdwn", + "text": "*Owners*\n<@resolved_owner1>, <@resolved_owner2>" + } + ] + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Subscribers*\n_No subscribers_" + } + ] + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Path*\n`sources/test_source.yml`" + } + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Result Message*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```Test error message```" + } + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Time Elapsed*\nN/A" + }, + { + "type": "mrkdwn", + "text": "*Sampled At*\n2025-02-03 13:21:07" + } + ] + } + ], + "color": "#ff0000" + } + ] +} diff --git a/tests/unit/alerts/alert_messages/fixtures/block_kit/source_freshness_alert_status-error_link-False_message-True_tags-True_owners-True_path-False_error-True_suppression-False_env-True.json b/tests/unit/alerts/alert_messages/fixtures/block_kit/source_freshness_alert_status-error_link-False_message-True_tags-True_owners-True_path-False_error-True_suppression-False_env-True.json new file mode 100644 index 000000000..6d05deb80 --- /dev/null +++ b/tests/unit/alerts/alert_messages/fixtures/block_kit/source_freshness_alert_status-error_link-False_message-True_tags-True_owners-True_path-False_error-True_suppression-False_env-True.json @@ -0,0 +1,125 @@ +{ + "blocks": [ + { + "type": "header", + "text": { + "type": "plain_text", + "text": "Error: Freshness exceeded the acceptable times on source \"test_source\"" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Source:* test_source.test_identifier | *Env:* Test Env | *Status:* error | *Time:* 2025-02-03 13:21:07 UTC" + } + }, + { + "type": "divider" + } + ], + "attachments": [ + { + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u2139\ufe0f *Details*" + } + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Tags*\ntag1, tag2" + }, + { + "type": "mrkdwn", + "text": "*Owners*\n<@resolved_owner1>, <@resolved_owner2>" + } + ] + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Subscribers*\n_No subscribers_" + } + ] + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Description*\nTest freshness description" + } + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Result Message*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```Test error message```" + } + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Time Elapsed*\n2:00:00" + }, + { + "type": "mrkdwn", + "text": "*Last Record At*\n2025-02-03 11:21:07" + } + ] + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Sampled At*\n2025-02-03 13:21:07" + } + ] + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Error after*\n2 hours" + }, + { + "type": "mrkdwn", + "text": "*Warn after*\n1 hour" + } + ] + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Filter*\ntest_filter" + } + ] + } + ], + "color": "#ff0000" + } + ] +} diff --git a/tests/unit/alerts/alert_messages/fixtures/block_kit/source_freshness_alert_status-error_link-True_message-False_tags-False_owners-False_path-False_error-False_suppression-True_env-False.json b/tests/unit/alerts/alert_messages/fixtures/block_kit/source_freshness_alert_status-error_link-True_message-False_tags-False_owners-False_path-False_error-False_suppression-True_env-False.json new file mode 100644 index 000000000..f56e3e70e --- /dev/null +++ b/tests/unit/alerts/alert_messages/fixtures/block_kit/source_freshness_alert_status-error_link-True_message-False_tags-False_owners-False_path-False_error-False_suppression-True_env-False.json @@ -0,0 +1,55 @@ +{ + "blocks": [ + { + "type": "header", + "text": { + "type": "plain_text", + "text": "Error: Freshness exceeded the acceptable times on source \"test_source\"" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Source:* test_source.test_identifier | *Status:* error | *Time:* 2025-02-03 13:21:07 UTC | *Suppression interval:* 24\n" + } + }, + { + "type": "divider" + } + ], + "attachments": [ + { + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Result Message*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```When the test ran at 2025-02-03 13:21:07 UTC, the most recent record found in the table was 0 seconds earlier (None).```" + } + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Time Elapsed*\nN/A" + }, + { + "type": "mrkdwn", + "text": "*Sampled At*\n2025-02-03 13:21:07" + } + ] + } + ], + "color": "#ff0000" + } + ] +} diff --git a/tests/unit/alerts/alert_messages/fixtures/block_kit/source_freshness_alert_status-error_link-True_message-False_tags-True_owners-True_path-True_error-False_suppression-True_env-False.json b/tests/unit/alerts/alert_messages/fixtures/block_kit/source_freshness_alert_status-error_link-True_message-False_tags-True_owners-True_path-True_error-False_suppression-True_env-False.json new file mode 100644 index 000000000..9ffdc9614 --- /dev/null +++ b/tests/unit/alerts/alert_messages/fixtures/block_kit/source_freshness_alert_status-error_link-True_message-False_tags-True_owners-True_path-True_error-False_suppression-True_env-False.json @@ -0,0 +1,94 @@ +{ + "blocks": [ + { + "type": "header", + "text": { + "type": "plain_text", + "text": "Error: Freshness exceeded the acceptable times on source \"test_source\"" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Source:* test_source.test_identifier | *Status:* error | *Time:* 2025-02-03 13:21:07 UTC | *Suppression interval:* 24\n" + } + }, + { + "type": "divider" + } + ], + "attachments": [ + { + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u2139\ufe0f *Details*" + } + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Tags*\ntag1, tag2" + }, + { + "type": "mrkdwn", + "text": "*Owners*\n<@resolved_owner1>, <@resolved_owner2>" + } + ] + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Subscribers*\n_No subscribers_" + } + ] + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Path*\n`sources/test_source.yml`" + } + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Result Message*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```When the test ran at 2025-02-03 13:21:07 UTC, the most recent record found in the table was 0 seconds earlier (None).```" + } + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Time Elapsed*\nN/A" + }, + { + "type": "mrkdwn", + "text": "*Sampled At*\n2025-02-03 13:21:07" + } + ] + } + ], + "color": "#ff0000" + } + ] +} diff --git a/tests/unit/alerts/alert_messages/fixtures/block_kit/source_freshness_alert_status-error_link-True_message-True_tags-False_owners-False_path-True_error-True_suppression-True_env-True.json b/tests/unit/alerts/alert_messages/fixtures/block_kit/source_freshness_alert_status-error_link-True_message-True_tags-False_owners-False_path-True_error-True_suppression-True_env-True.json new file mode 100644 index 000000000..b80b1d9c8 --- /dev/null +++ b/tests/unit/alerts/alert_messages/fixtures/block_kit/source_freshness_alert_status-error_link-True_message-True_tags-False_owners-False_path-True_error-True_suppression-True_env-True.json @@ -0,0 +1,132 @@ +{ + "blocks": [ + { + "type": "header", + "text": { + "type": "plain_text", + "text": "Error: Freshness exceeded the acceptable times on source \"test_source\"" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Source:* test_source.test_identifier | *Env:* Test Env | *Status:* error | *Time:* 2025-02-03 13:21:07 UTC | *Suppression interval:* 24\n" + } + }, + { + "type": "divider" + } + ], + "attachments": [ + { + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u2139\ufe0f *Details*" + } + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Tags*\n_No tags_" + }, + { + "type": "mrkdwn", + "text": "*Owners*\n_No owners_" + } + ] + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Subscribers*\n_No subscribers_" + } + ] + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Description*\nTest freshness description" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Path*\n`sources/test_source.yml`" + } + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Result Message*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```Test error message```" + } + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Time Elapsed*\n2:00:00" + }, + { + "type": "mrkdwn", + "text": "*Last Record At*\n2025-02-03 11:21:07" + } + ] + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Sampled At*\n2025-02-03 13:21:07" + } + ] + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Error after*\n2 hours" + }, + { + "type": "mrkdwn", + "text": "*Warn after*\n1 hour" + } + ] + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Filter*\ntest_filter" + } + ] + } + ], + "color": "#ff0000" + } + ] +} diff --git a/tests/unit/alerts/alert_messages/fixtures/block_kit/source_freshness_alert_status-runtime error_link-False_message-False_tags-False_owners-False_path-False_error-False_suppression-False_env-False.json b/tests/unit/alerts/alert_messages/fixtures/block_kit/source_freshness_alert_status-runtime error_link-False_message-False_tags-False_owners-False_path-False_error-False_suppression-False_env-False.json new file mode 100644 index 000000000..a95be5a7a --- /dev/null +++ b/tests/unit/alerts/alert_messages/fixtures/block_kit/source_freshness_alert_status-runtime error_link-False_message-False_tags-False_owners-False_path-False_error-False_suppression-False_env-False.json @@ -0,0 +1,55 @@ +{ + "blocks": [ + { + "type": "header", + "text": { + "type": "plain_text", + "text": "Runtime Error: Failed to calculate the source freshness of \"test_source\"" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Source:* test_source.test_identifier | *Status:* runtime error | *Time:* 2025-02-03 13:21:07 UTC" + } + }, + { + "type": "divider" + } + ], + "attachments": [ + { + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Result Message*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```Failed to calculate the source freshness\n```None``````" + } + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Time Elapsed*\nN/A" + }, + { + "type": "mrkdwn", + "text": "*Sampled At*\n2025-02-03 13:21:07" + } + ] + } + ], + "color": "#ff0000" + } + ] +} diff --git a/tests/unit/alerts/alert_messages/fixtures/block_kit/source_freshness_alert_status-runtime error_link-False_message-True_tags-True_owners-False_path-False_error-True_suppression-True_env-True.json b/tests/unit/alerts/alert_messages/fixtures/block_kit/source_freshness_alert_status-runtime error_link-False_message-True_tags-True_owners-False_path-False_error-True_suppression-True_env-True.json new file mode 100644 index 000000000..51d707f2b --- /dev/null +++ b/tests/unit/alerts/alert_messages/fixtures/block_kit/source_freshness_alert_status-runtime error_link-False_message-True_tags-True_owners-False_path-False_error-True_suppression-True_env-True.json @@ -0,0 +1,125 @@ +{ + "blocks": [ + { + "type": "header", + "text": { + "type": "plain_text", + "text": "Runtime Error: Failed to calculate the source freshness of \"test_source\"" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Source:* test_source.test_identifier | *Env:* Test Env | *Status:* runtime error | *Time:* 2025-02-03 13:21:07 UTC | *Suppression interval:* 24" + } + }, + { + "type": "divider" + } + ], + "attachments": [ + { + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u2139\ufe0f *Details*" + } + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Tags*\ntag1, tag2" + }, + { + "type": "mrkdwn", + "text": "*Owners*\n_No owners_" + } + ] + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Subscribers*\n_No subscribers_" + } + ] + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Description*\nTest freshness description" + } + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Result Message*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```Failed to calculate the source freshness\n```Test error message``````" + } + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Time Elapsed*\n2:00:00" + }, + { + "type": "mrkdwn", + "text": "*Last Record At*\n2025-02-03 11:21:07" + } + ] + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Sampled At*\n2025-02-03 13:21:07" + } + ] + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Error after*\n2 hours" + }, + { + "type": "mrkdwn", + "text": "*Warn after*\n1 hour" + } + ] + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Filter*\ntest_filter" + } + ] + } + ], + "color": "#ff0000" + } + ] +} diff --git a/tests/unit/alerts/alert_messages/fixtures/block_kit/source_freshness_alert_status-runtime error_link-True_message-False_tags-True_owners-False_path-True_error-False_suppression-True_env-True.json b/tests/unit/alerts/alert_messages/fixtures/block_kit/source_freshness_alert_status-runtime error_link-True_message-False_tags-True_owners-False_path-True_error-False_suppression-True_env-True.json new file mode 100644 index 000000000..ad81d2a32 --- /dev/null +++ b/tests/unit/alerts/alert_messages/fixtures/block_kit/source_freshness_alert_status-runtime error_link-True_message-False_tags-True_owners-False_path-True_error-False_suppression-True_env-True.json @@ -0,0 +1,94 @@ +{ + "blocks": [ + { + "type": "header", + "text": { + "type": "plain_text", + "text": "Runtime Error: Failed to calculate the source freshness of \"test_source\"" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Source:* test_source.test_identifier | *Env:* Test Env | *Status:* runtime error | *Time:* 2025-02-03 13:21:07 UTC | *Suppression interval:* 24\n" + } + }, + { + "type": "divider" + } + ], + "attachments": [ + { + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u2139\ufe0f *Details*" + } + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Tags*\ntag1, tag2" + }, + { + "type": "mrkdwn", + "text": "*Owners*\n_No owners_" + } + ] + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Subscribers*\n_No subscribers_" + } + ] + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Path*\n`sources/test_source.yml`" + } + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Result Message*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```Failed to calculate the source freshness\n```None``````" + } + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Time Elapsed*\nN/A" + }, + { + "type": "mrkdwn", + "text": "*Sampled At*\n2025-02-03 13:21:07" + } + ] + } + ], + "color": "#ff0000" + } + ] +} diff --git a/tests/unit/alerts/alert_messages/fixtures/block_kit/source_freshness_alert_status-runtime error_link-True_message-True_tags-False_owners-True_path-False_error-True_suppression-False_env-True.json b/tests/unit/alerts/alert_messages/fixtures/block_kit/source_freshness_alert_status-runtime error_link-True_message-True_tags-False_owners-True_path-False_error-True_suppression-False_env-True.json new file mode 100644 index 000000000..0dbca6a0b --- /dev/null +++ b/tests/unit/alerts/alert_messages/fixtures/block_kit/source_freshness_alert_status-runtime error_link-True_message-True_tags-False_owners-True_path-False_error-True_suppression-False_env-True.json @@ -0,0 +1,125 @@ +{ + "blocks": [ + { + "type": "header", + "text": { + "type": "plain_text", + "text": "Runtime Error: Failed to calculate the source freshness of \"test_source\"" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Source:* test_source.test_identifier | *Env:* Test Env | *Status:* runtime error | *Time:* 2025-02-03 13:21:07 UTC\n" + } + }, + { + "type": "divider" + } + ], + "attachments": [ + { + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u2139\ufe0f *Details*" + } + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Tags*\n_No tags_" + }, + { + "type": "mrkdwn", + "text": "*Owners*\n<@resolved_owner1>, <@resolved_owner2>" + } + ] + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Subscribers*\n_No subscribers_" + } + ] + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Description*\nTest freshness description" + } + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Result Message*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```Failed to calculate the source freshness\n```Test error message``````" + } + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Time Elapsed*\n2:00:00" + }, + { + "type": "mrkdwn", + "text": "*Last Record At*\n2025-02-03 11:21:07" + } + ] + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Sampled At*\n2025-02-03 13:21:07" + } + ] + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Error after*\n2 hours" + }, + { + "type": "mrkdwn", + "text": "*Warn after*\n1 hour" + } + ] + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Filter*\ntest_filter" + } + ] + } + ], + "color": "#ff0000" + } + ] +} diff --git a/tests/unit/alerts/alert_messages/fixtures/block_kit/source_freshness_alert_status-runtime error_link-True_message-True_tags-True_owners-True_path-True_error-True_suppression-True_env-True.json b/tests/unit/alerts/alert_messages/fixtures/block_kit/source_freshness_alert_status-runtime error_link-True_message-True_tags-True_owners-True_path-True_error-True_suppression-True_env-True.json new file mode 100644 index 000000000..ab9a790d0 --- /dev/null +++ b/tests/unit/alerts/alert_messages/fixtures/block_kit/source_freshness_alert_status-runtime error_link-True_message-True_tags-True_owners-True_path-True_error-True_suppression-True_env-True.json @@ -0,0 +1,132 @@ +{ + "blocks": [ + { + "type": "header", + "text": { + "type": "plain_text", + "text": "Runtime Error: Failed to calculate the source freshness of \"test_source\"" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Source:* test_source.test_identifier | *Env:* Test Env | *Status:* runtime error | *Time:* 2025-02-03 13:21:07 UTC | *Suppression interval:* 24\n" + } + }, + { + "type": "divider" + } + ], + "attachments": [ + { + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u2139\ufe0f *Details*" + } + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Tags*\ntag1, tag2" + }, + { + "type": "mrkdwn", + "text": "*Owners*\n<@resolved_owner1>, <@resolved_owner2>" + } + ] + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Subscribers*\n_No subscribers_" + } + ] + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Description*\nTest freshness description" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Path*\n`sources/test_source.yml`" + } + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Result Message*" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```Failed to calculate the source freshness\n```Test error message``````" + } + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Time Elapsed*\n2:00:00" + }, + { + "type": "mrkdwn", + "text": "*Last Record At*\n2025-02-03 11:21:07" + } + ] + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Sampled At*\n2025-02-03 13:21:07" + } + ] + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Error after*\n2 hours" + }, + { + "type": "mrkdwn", + "text": "*Warn after*\n1 hour" + } + ] + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Filter*\ntest_filter" + } + ] + } + ], + "color": "#ff0000" + } + ] +} diff --git a/tests/unit/alerts/alert_messages/test_alert_fields.py b/tests/unit/alerts/alert_messages/test_alert_fields.py index db2977049..c1f25a81b 100644 --- a/tests/unit/alerts/alert_messages/test_alert_fields.py +++ b/tests/unit/alerts/alert_messages/test_alert_fields.py @@ -2,13 +2,12 @@ import pytest -from elementary.messages.formats.adaptive_cards import format_adaptive_card from elementary.monitor.alerts.alert_messages.alert_fields import AlertField from tests.unit.alerts.alert_messages.test_alert_utils import ( + assert_expected_json_on_all_formats, build_base_test_alert_model, get_alert_message_body, ) -from tests.unit.messages.utils import assert_expected_json, get_expected_json_path FIXTURES_DIR = Path(__file__).resolve().parent / "fixtures" @@ -43,11 +42,5 @@ def test_get_dbt_test_alert_message_body( ] message_body = get_alert_message_body(test_alert_model) - adaptive_card_filename = ( - f"adaptive_card_dbt_test_alert_removed_field-{removed_field.value}.json" - ) - adaptive_card_json = format_adaptive_card(message_body) - expected_adaptive_card_json_path = get_expected_json_path( - FIXTURES_DIR, adaptive_card_filename - ) - assert_expected_json(adaptive_card_json, expected_adaptive_card_json_path) + filename = f"dbt_test_alert_removed_field-{removed_field.value}" + assert_expected_json_on_all_formats(filename, message_body) diff --git a/tests/unit/alerts/alert_messages/test_alert_utils.py b/tests/unit/alerts/alert_messages/test_alert_utils.py index e0ac96470..55b84b32d 100644 --- a/tests/unit/alerts/alert_messages/test_alert_utils.py +++ b/tests/unit/alerts/alert_messages/test_alert_utils.py @@ -1,7 +1,14 @@ +import os from datetime import datetime +from pathlib import Path from typing import Any, Dict, List, Optional, Union +from elementary.messages.formats.adaptive_cards import format_adaptive_card +from elementary.messages.formats.block_kit import format_block_kit from elementary.messages.message_body import MessageBody +from elementary.messages.messaging_integrations.slack_web import ( + SlackWebMessagingIntegration, +) from elementary.monitor.alerts.alert_messages.builder import AlertMessageBuilder from elementary.monitor.alerts.alerts_groups.alerts_group import AlertsGroup from elementary.monitor.alerts.alerts_groups.grouped_by_table import ( @@ -13,6 +20,9 @@ from elementary.monitor.data_monitoring.alerts.integrations.utils.report_link import ( ReportLinkData as ReportLink, ) +from tests.unit.messages.utils import assert_expected_json, get_expected_json_path + +FIXTURES_DIR = Path(__file__).resolve().parent / "fixtures" def build_base_test_alert_model( @@ -276,3 +286,53 @@ def get_alert_message_body( ) -> MessageBody: alert_message_builder = AlertMessageBuilder() return alert_message_builder.build(alert) + + +def assert_expected_json_adaptive_card( + filename: str, + message_body: MessageBody, +): + adaptive_card_filename = f"{filename}.json" + adaptive_card_json = format_adaptive_card(message_body) + expected_adaptive_card_json_path = get_expected_json_path( + FIXTURES_DIR / "adaptive_card", adaptive_card_filename + ) + assert_expected_json(adaptive_card_json, expected_adaptive_card_json_path) + + +def assert_expected_json_block_kit( + filename: str, + message_body: MessageBody, +): + block_kit_filename = f"{filename}.json" + formatted_block_kit_message = format_block_kit( + message_body, resolve_mention=lambda x: f"resolved_{x}" + ) + if "TEST_SLACK_TOKEN" in os.environ and "TEST_SLACK_CHANNEL" in os.environ: + """ + For testing purposes, add the ability to send messages to Slack channels to see how the message looks. + """ + messaging_integration = SlackWebMessagingIntegration.from_token( + token=os.environ["TEST_SLACK_TOKEN"], + ) + messaging_integration._send_message( + os.environ["TEST_SLACK_CHANNEL"], + formatted_block_kit_message, + ) + expected_block_kit_json_path = get_expected_json_path( + FIXTURES_DIR / "block_kit", block_kit_filename + ) + assert_expected_json( + formatted_block_kit_message.dict(), expected_block_kit_json_path + ) + + +def assert_expected_json_on_all_formats( + filename: str, + message_body: MessageBody, +): + for validator in [ + assert_expected_json_adaptive_card, + assert_expected_json_block_kit, + ]: + validator(filename, message_body) diff --git a/tests/unit/alerts/alert_messages/test_alerts_group_message.py b/tests/unit/alerts/alert_messages/test_alerts_group_message.py index 584552b2d..bd261c2ba 100644 --- a/tests/unit/alerts/alert_messages/test_alerts_group_message.py +++ b/tests/unit/alerts/alert_messages/test_alerts_group_message.py @@ -4,14 +4,13 @@ import pytest -from elementary.messages.formats.adaptive_cards import format_adaptive_card from elementary.monitor.alerts.alerts_groups.alerts_group import AlertsGroup from tests.unit.alerts.alert_messages.test_alert_utils import ( + assert_expected_json_on_all_formats, create_test_alerts, get_alert_message_body, get_mock_report_link, ) -from tests.unit.messages.utils import assert_expected_json, get_expected_json_path FIXTURES_DIR = Path(__file__).resolve().parent / "fixtures" @@ -67,20 +66,15 @@ def test_get_alerts_group_message_body( message_body = get_alert_message_body(alerts_group) adaptive_card_filename = ( - f"adaptive_card_alerts_group" + "alerts_group" f"_model-errors-{has_model_errors}" f"_test-failures-{has_test_failures}" f"_test-warnings-{has_test_warnings}" f"_test-errors-{has_test_errors}" f"_link-{has_link}" f"_env-{has_env}" - ".json" ) - adaptive_card_json = format_adaptive_card(message_body) - expected_adaptive_card_json_path = get_expected_json_path( - FIXTURES_DIR, adaptive_card_filename - ) - assert_expected_json(adaptive_card_json, expected_adaptive_card_json_path) + assert_expected_json_on_all_formats(adaptive_card_filename, message_body) # Stop all patches for patcher in patches: diff --git a/tests/unit/alerts/alert_messages/test_dbt_test_alert_message.py b/tests/unit/alerts/alert_messages/test_dbt_test_alert_message.py index 34947f6d5..b75dc26b8 100644 --- a/tests/unit/alerts/alert_messages/test_dbt_test_alert_message.py +++ b/tests/unit/alerts/alert_messages/test_dbt_test_alert_message.py @@ -2,13 +2,12 @@ import pytest -from elementary.messages.formats.adaptive_cards import format_adaptive_card from tests.unit.alerts.alert_messages.test_alert_utils import ( + assert_expected_json_on_all_formats, build_base_test_alert_model, get_alert_message_body, get_mock_report_link, ) -from tests.unit.messages.utils import assert_expected_json, get_expected_json_path FIXTURES_DIR = Path(__file__).resolve().parent / "fixtures" @@ -18,7 +17,7 @@ def build_dbt_test_alert_model(*args, **kwargs): return build_base_test_alert_model(*args, test_type="dbt_test", **kwargs) -def get_expected_adaptive_filename( +def get_expected_filename( status: str, has_link: bool, has_description: bool, @@ -30,7 +29,7 @@ def get_expected_adaptive_filename( has_env: bool, ) -> str: return ( - f"adaptive_card_dbt_test_alert" + f"dbt_test_alert" f"_status-{status}" f"_link-{has_link}" f"_description-{has_description}" @@ -40,7 +39,6 @@ def get_expected_adaptive_filename( f"_error-{has_error}" f"_sample-{has_sample}" f"_env-{has_env}" - ".json" ) @@ -90,7 +88,7 @@ def test_get_dbt_test_alert_message_body( ) message_body = get_alert_message_body(test_alert_model) - adaptive_card_filename = get_expected_adaptive_filename( + filename = get_expected_filename( status=status, has_link=has_link, has_description=has_description, @@ -101,8 +99,4 @@ def test_get_dbt_test_alert_message_body( has_sample=has_sample, has_env=has_env, ) - adaptive_card_json = format_adaptive_card(message_body) - expected_adaptive_card_json_path = get_expected_json_path( - FIXTURES_DIR, adaptive_card_filename - ) - assert_expected_json(adaptive_card_json, expected_adaptive_card_json_path) + assert_expected_json_on_all_formats(filename, message_body) diff --git a/tests/unit/alerts/alert_messages/test_elementary_test_alert_message.py b/tests/unit/alerts/alert_messages/test_elementary_test_alert_message.py index 8f5c40820..4fb769ad7 100644 --- a/tests/unit/alerts/alert_messages/test_elementary_test_alert_message.py +++ b/tests/unit/alerts/alert_messages/test_elementary_test_alert_message.py @@ -2,13 +2,12 @@ import pytest -from elementary.messages.formats.adaptive_cards import format_adaptive_card from tests.unit.alerts.alert_messages.test_alert_utils import ( + assert_expected_json_on_all_formats, build_base_test_alert_model, get_alert_message_body, get_mock_report_link, ) -from tests.unit.messages.utils import assert_expected_json, get_expected_json_path FIXTURES_DIR = Path(__file__).resolve().parent / "fixtures" @@ -71,8 +70,8 @@ def test_get_elementary_test_alert_message_body( ) message_body = get_alert_message_body(test_alert_model) - adaptive_card_filename = ( - f"adaptive_card_elementary_test_alert" + filename = ( + f"elementary_test_alert" f"_status-{status}" f"_link-{has_link}" f"_description-{has_description}" @@ -83,10 +82,5 @@ def test_get_elementary_test_alert_message_body( f"_sample-{has_sample}" f"_anomaly-{has_anomaly}" f"_env-{has_env}" - ".json" ) - adaptive_card_json = format_adaptive_card(message_body) - expected_adaptive_card_json_path = get_expected_json_path( - FIXTURES_DIR, adaptive_card_filename - ) - assert_expected_json(adaptive_card_json, expected_adaptive_card_json_path) + assert_expected_json_on_all_formats(filename, message_body) diff --git a/tests/unit/alerts/alert_messages/test_group_by_table_alert_message.py b/tests/unit/alerts/alert_messages/test_group_by_table_alert_message.py index 8c040fc65..b4db2c3cb 100644 --- a/tests/unit/alerts/alert_messages/test_group_by_table_alert_message.py +++ b/tests/unit/alerts/alert_messages/test_group_by_table_alert_message.py @@ -4,16 +4,15 @@ import pytest -from elementary.messages.formats.adaptive_cards import format_adaptive_card from elementary.monitor.alerts.alerts_groups.grouped_by_table import ( GroupedByTableAlerts, ) from tests.unit.alerts.alert_messages.test_alert_utils import ( + assert_expected_json_on_all_formats, create_test_alerts, get_alert_message_body, get_mock_report_link, ) -from tests.unit.messages.utils import assert_expected_json, get_expected_json_path FIXTURES_DIR = Path(__file__).resolve().parent / "fixtures" @@ -68,20 +67,15 @@ def test_get_group_by_table_alert_message_body( alerts_group = GroupedByTableAlerts(alerts=alerts) message_body = get_alert_message_body(alerts_group) - adaptive_card_filename = ( - f"adaptive_card_group_by_table_model-errors-{has_model_errors}" + filename = ( + f"group_by_table_model-errors-{has_model_errors}" f"_test-failures-{has_test_failures}" f"_test-warnings-{has_test_warnings}" f"_test-errors-{has_test_errors}" f"_link-{has_link}" f"_env-{has_env}" - ".json" ) - adaptive_card_json = format_adaptive_card(message_body) - expected_adaptive_card_json_path = get_expected_json_path( - FIXTURES_DIR, adaptive_card_filename - ) - assert_expected_json(adaptive_card_json, expected_adaptive_card_json_path) + assert_expected_json_on_all_formats(filename, message_body) # Stop all patches for patcher in patches: diff --git a/tests/unit/alerts/alert_messages/test_model_alert_message.py b/tests/unit/alerts/alert_messages/test_model_alert_message.py index 21fb2c6fa..a027db55d 100644 --- a/tests/unit/alerts/alert_messages/test_model_alert_message.py +++ b/tests/unit/alerts/alert_messages/test_model_alert_message.py @@ -3,13 +3,12 @@ import pytest -from elementary.messages.formats.adaptive_cards import format_adaptive_card from tests.unit.alerts.alert_messages.test_alert_utils import ( + assert_expected_json_on_all_formats, build_base_model_alert_model, get_alert_message_body, get_mock_report_link, ) -from tests.unit.messages.utils import assert_expected_json, get_expected_json_path FIXTURES_DIR = Path(__file__).resolve().parent / "fixtures" @@ -71,8 +70,8 @@ def test_get_model_alert_message_body( ) message_body = get_alert_message_body(model_alert_model) - adaptive_card_filename = ( - f"adaptive_card_model_alert" + filename = ( + f"model_alert" f"_status-{status}" f"_link-{has_link}" f"_tags-{has_tags}" @@ -82,10 +81,5 @@ def test_get_model_alert_message_body( f"_materialization-{materialization}" f"_full_refresh-{has_full_refresh}" f"_env-{has_env}" - ".json" ) - adaptive_card_json = format_adaptive_card(message_body) - expected_adaptive_card_json_path = get_expected_json_path( - FIXTURES_DIR, adaptive_card_filename - ) - assert_expected_json(adaptive_card_json, expected_adaptive_card_json_path) + assert_expected_json_on_all_formats(filename, message_body) diff --git a/tests/unit/alerts/alert_messages/test_snapshot_alert_message.py b/tests/unit/alerts/alert_messages/test_snapshot_alert_message.py index 8ccfdde6f..ee361a6e8 100644 --- a/tests/unit/alerts/alert_messages/test_snapshot_alert_message.py +++ b/tests/unit/alerts/alert_messages/test_snapshot_alert_message.py @@ -3,13 +3,12 @@ import pytest -from elementary.messages.formats.adaptive_cards import format_adaptive_card from tests.unit.alerts.alert_messages.test_alert_utils import ( + assert_expected_json_on_all_formats, build_base_model_alert_model, get_alert_message_body, get_mock_report_link, ) -from tests.unit.messages.utils import assert_expected_json, get_expected_json_path FIXTURES_DIR = Path(__file__).resolve().parent / "fixtures" @@ -61,8 +60,8 @@ def test_get_snapshot_alert_message_body( ) message_body = get_alert_message_body(snapshot_alert_model) - adaptive_card_filename = ( - f"adaptive_card_snapshot_alert" + filename = ( + f"snapshot_alert" f"_status-{status}" f"_link-{has_link}" f"_message-{has_message}" @@ -71,10 +70,5 @@ def test_get_snapshot_alert_message_body( f"_path-{has_path}" f"_suppression-{has_suppression_interval}" f"_env-{has_env}" - ".json" ) - adaptive_card_json = format_adaptive_card(message_body) - expected_adaptive_card_json_path = get_expected_json_path( - FIXTURES_DIR, adaptive_card_filename - ) - assert_expected_json(adaptive_card_json, expected_adaptive_card_json_path) + assert_expected_json_on_all_formats(filename, message_body) diff --git a/tests/unit/alerts/alert_messages/test_source_freshness_alert_message.py b/tests/unit/alerts/alert_messages/test_source_freshness_alert_message.py index 3b51a0695..9ed7c0afa 100644 --- a/tests/unit/alerts/alert_messages/test_source_freshness_alert_message.py +++ b/tests/unit/alerts/alert_messages/test_source_freshness_alert_message.py @@ -3,13 +3,12 @@ import pytest -from elementary.messages.formats.adaptive_cards import format_adaptive_card from tests.unit.alerts.alert_messages.test_alert_utils import ( + assert_expected_json_on_all_formats, build_base_source_freshness_alert_model, get_alert_message_body, get_mock_report_link, ) -from tests.unit.messages.utils import assert_expected_json, get_expected_json_path FIXTURES_DIR = Path(__file__).resolve().parent / "fixtures" @@ -72,8 +71,8 @@ def test_get_source_freshness_alert_message_body( ) message_body = get_alert_message_body(source_freshness_alert_model) - adaptive_card_filename = ( - f"adaptive_card_source_freshness_alert" + filename = ( + f"source_freshness_alert" f"_status-{status}" f"_link-{has_link}" f"_message-{has_message}" @@ -83,10 +82,5 @@ def test_get_source_freshness_alert_message_body( f"_error-{has_error}" f"_suppression-{has_suppression_interval}" f"_env-{has_env}" - ".json" ) - adaptive_card_json = format_adaptive_card(message_body) - expected_adaptive_card_json_path = get_expected_json_path( - FIXTURES_DIR, adaptive_card_filename - ) - assert_expected_json(adaptive_card_json, expected_adaptive_card_json_path) + assert_expected_json_on_all_formats(filename, message_body) diff --git a/tests/unit/messages/formats/adaptive_cards/fixtures/all_blocks_green.json b/tests/unit/messages/formats/adaptive_cards/fixtures/all_blocks_green.json index 3e9e41d7c..d5475e5ac 100644 --- a/tests/unit/messages/formats/adaptive_cards/fixtures/all_blocks_green.json +++ b/tests/unit/messages/formats/adaptive_cards/fixtures/all_blocks_green.json @@ -85,6 +85,11 @@ } ], "isVisible": false + }, + { + "type": "TextBlock", + "text": "user1 select 1", + "wrap": true } ] } diff --git a/tests/unit/messages/formats/adaptive_cards/fixtures/all_blocks_no_color.json b/tests/unit/messages/formats/adaptive_cards/fixtures/all_blocks_no_color.json index a5728be12..8bb6c6e61 100644 --- a/tests/unit/messages/formats/adaptive_cards/fixtures/all_blocks_no_color.json +++ b/tests/unit/messages/formats/adaptive_cards/fixtures/all_blocks_no_color.json @@ -85,6 +85,11 @@ } ], "isVisible": false + }, + { + "type": "TextBlock", + "text": "user1 select 1", + "wrap": true } ] } diff --git a/tests/unit/messages/formats/adaptive_cards/fixtures/all_blocks_red.json b/tests/unit/messages/formats/adaptive_cards/fixtures/all_blocks_red.json index 782127877..8d14a8ecf 100644 --- a/tests/unit/messages/formats/adaptive_cards/fixtures/all_blocks_red.json +++ b/tests/unit/messages/formats/adaptive_cards/fixtures/all_blocks_red.json @@ -85,6 +85,11 @@ } ], "isVisible": false + }, + { + "type": "TextBlock", + "text": "user1 select 1", + "wrap": true } ] } diff --git a/tests/unit/messages/formats/adaptive_cards/fixtures/all_blocks_yellow.json b/tests/unit/messages/formats/adaptive_cards/fixtures/all_blocks_yellow.json index 91289a75f..407dbf21f 100644 --- a/tests/unit/messages/formats/adaptive_cards/fixtures/all_blocks_yellow.json +++ b/tests/unit/messages/formats/adaptive_cards/fixtures/all_blocks_yellow.json @@ -85,6 +85,11 @@ } ], "isVisible": false + }, + { + "type": "TextBlock", + "text": "user1 select 1", + "wrap": true } ] } diff --git a/tests/unit/messages/formats/base_test_format.py b/tests/unit/messages/formats/base_test_format.py index aaaa8109b..cf18d61e1 100644 --- a/tests/unit/messages/formats/base_test_format.py +++ b/tests/unit/messages/formats/base_test_format.py @@ -14,9 +14,11 @@ HeaderBlock, Icon, IconBlock, + InlineCodeBlock, LineBlock, LinesBlock, LinkBlock, + MentionBlock, TableBlock, TextBlock, TextStyle, @@ -279,6 +281,16 @@ def test_format_message_body_all_blocks(self, color, expected_file): ], expanded=False, ), + LinesBlock( + lines=[ + LineBlock( + inlines=[ + MentionBlock(user="user1"), + InlineCodeBlock(code="select 1"), + ] + ) + ] + ), ], color=color, ) diff --git a/tests/unit/messages/formats/block_kit/fixtures/all_blocks_green.json b/tests/unit/messages/formats/block_kit/fixtures/all_blocks_green.json index 38ccfb652..dac1badef 100644 --- a/tests/unit/messages/formats/block_kit/fixtures/all_blocks_green.json +++ b/tests/unit/messages/formats/block_kit/fixtures/all_blocks_green.json @@ -48,14 +48,14 @@ "type": "section", "text": { "type": "mrkdwn", - "text": "*Show Details*" + "text": "\ud83d\udd0e *Details Section*\nHere's some content with a " } }, { "type": "section", "text": { "type": "mrkdwn", - "text": "\ud83d\udd0e *Details Section*\nHere's some content with a " + "text": "<@resolved_user1> `select 1`" } } ], diff --git a/tests/unit/messages/formats/block_kit/fixtures/all_blocks_no_color.json b/tests/unit/messages/formats/block_kit/fixtures/all_blocks_no_color.json index 6abd6c88f..7cdfd3cc5 100644 --- a/tests/unit/messages/formats/block_kit/fixtures/all_blocks_no_color.json +++ b/tests/unit/messages/formats/block_kit/fixtures/all_blocks_no_color.json @@ -45,14 +45,14 @@ "type": "section", "text": { "type": "mrkdwn", - "text": "*Show Details*" + "text": "\ud83d\udd0e *Details Section*\nHere's some content with a " } }, { "type": "section", "text": { "type": "mrkdwn", - "text": "\ud83d\udd0e *Details Section*\nHere's some content with a " + "text": "<@resolved_user1> `select 1`" } } ], diff --git a/tests/unit/messages/formats/block_kit/fixtures/all_blocks_red.json b/tests/unit/messages/formats/block_kit/fixtures/all_blocks_red.json index 662122826..cebd1e720 100644 --- a/tests/unit/messages/formats/block_kit/fixtures/all_blocks_red.json +++ b/tests/unit/messages/formats/block_kit/fixtures/all_blocks_red.json @@ -48,14 +48,14 @@ "type": "section", "text": { "type": "mrkdwn", - "text": "*Show Details*" + "text": "\ud83d\udd0e *Details Section*\nHere's some content with a " } }, { "type": "section", "text": { "type": "mrkdwn", - "text": "\ud83d\udd0e *Details Section*\nHere's some content with a " + "text": "<@resolved_user1> `select 1`" } } ], diff --git a/tests/unit/messages/formats/block_kit/fixtures/all_blocks_yellow.json b/tests/unit/messages/formats/block_kit/fixtures/all_blocks_yellow.json index b645c946f..37f2cd39d 100644 --- a/tests/unit/messages/formats/block_kit/fixtures/all_blocks_yellow.json +++ b/tests/unit/messages/formats/block_kit/fixtures/all_blocks_yellow.json @@ -48,14 +48,14 @@ "type": "section", "text": { "type": "mrkdwn", - "text": "*Show Details*" + "text": "\ud83d\udd0e *Details Section*\nHere's some content with a " } }, { "type": "section", "text": { "type": "mrkdwn", - "text": "\ud83d\udd0e *Details Section*\nHere's some content with a " + "text": "<@resolved_user1> `select 1`" } } ], diff --git a/tests/unit/messages/formats/block_kit/fixtures/expandable_block.json b/tests/unit/messages/formats/block_kit/fixtures/expandable_block.json index e1887d53a..6044fb3dc 100644 --- a/tests/unit/messages/formats/block_kit/fixtures/expandable_block.json +++ b/tests/unit/messages/formats/block_kit/fixtures/expandable_block.json @@ -1,12 +1,5 @@ { "blocks": [ - { - "type": "section", - "text": { - "type": "mrkdwn", - "text": "*Show More*" - } - }, { "type": "section", "text": { diff --git a/tests/unit/messages/formats/block_kit/fixtures/nested_expandable.json b/tests/unit/messages/formats/block_kit/fixtures/nested_expandable.json index 6897b2de3..749e1a555 100644 --- a/tests/unit/messages/formats/block_kit/fixtures/nested_expandable.json +++ b/tests/unit/messages/formats/block_kit/fixtures/nested_expandable.json @@ -1,12 +1,5 @@ { "blocks": [ - { - "type": "section", - "text": { - "type": "mrkdwn", - "text": "*Outer Block*" - } - }, { "type": "section", "text": { @@ -14,13 +7,6 @@ "text": "\ud83d\udd0e *Title with Icon*\nSome content with a " } }, - { - "type": "section", - "text": { - "type": "mrkdwn", - "text": "*Inner Block*" - } - }, { "type": "section", "text": { diff --git a/tests/unit/messages/formats/block_kit/test_block_kit.py b/tests/unit/messages/formats/block_kit/test_block_kit.py index fd63d2f48..53ec0e63c 100644 --- a/tests/unit/messages/formats/block_kit/test_block_kit.py +++ b/tests/unit/messages/formats/block_kit/test_block_kit.py @@ -1,19 +1,38 @@ +import os from pathlib import Path -from elementary.messages.formats.block_kit import format_block_kit +from elementary.messages.formats.block_kit import ( + FormattedBlockKitMessage, + format_block_kit, +) from elementary.messages.message_body import MessageBody +from elementary.messages.messaging_integrations.slack_web import ( + SlackWebMessagingIntegration, +) from tests.unit.messages.formats.base_test_format import BaseTestFormat from tests.unit.messages.utils import assert_expected_json, get_expected_json_path FIXTURES_DIR = Path(__file__).parent / "fixtures" -class TestBlockKit(BaseTestFormat[dict]): - def format(self, message_body: MessageBody) -> dict: - return format_block_kit(message_body) +class TestBlockKit(BaseTestFormat[FormattedBlockKitMessage]): + def format(self, message_body: MessageBody) -> FormattedBlockKitMessage: + return format_block_kit(message_body, resolve_mention=lambda x: "resolved_" + x) - def get_expected_file_path(self, name: str) -> str: + def get_expected_file_path(self, name: str) -> Path: return get_expected_json_path(FIXTURES_DIR, f"{name}.json") - def assert_expected_value(self, result: dict, expected_file_path: Path) -> None: - assert_expected_json(result, expected_file_path) + def assert_expected_value( + self, result: FormattedBlockKitMessage, expected_file_path: Path + ) -> None: + if "TEST_SLACK_TOKEN" in os.environ and "TEST_SLACK_CHANNEL" in os.environ: + """ + For testing purposes, add the ability to send messages to Slack channels to see how the message looks. + """ + messaging_integration = SlackWebMessagingIntegration.from_token( + token=os.environ["TEST_SLACK_TOKEN"], + ) + messaging_integration._send_message( + os.environ["TEST_SLACK_CHANNEL"], result + ) + assert_expected_json(result.dict(), expected_file_path) diff --git a/tests/unit/messages/utils.py b/tests/unit/messages/utils.py index b77c9ad55..21e96cae0 100644 --- a/tests/unit/messages/utils.py +++ b/tests/unit/messages/utils.py @@ -2,6 +2,8 @@ import os from pathlib import Path +from deepdiff import DeepDiff + from elementary.utils.log import get_logger logger = get_logger(__name__) @@ -28,8 +30,10 @@ def assert_expected_json(result: dict, expected_json_path: Path) -> None: try: assert result == expected except AssertionError as e: + diff = DeepDiff(expected, result) error_message = ( f"\nExpected JSON: \n{json.dumps(expected, indent=2)}\n" f"\nActual JSON: \n{json.dumps(result, indent=2)}\n" + f"\nDiff: \n{diff.to_json(indent=2)}\n" ) raise AssertionError(error_message) from e diff --git a/tests/unit/monitor/data_monitoring/alerts/test_data_monitoring_alerts.py b/tests/unit/monitor/data_monitoring/alerts/test_data_monitoring_alerts.py index efbe720a6..d607c34f9 100644 --- a/tests/unit/monitor/data_monitoring/alerts/test_data_monitoring_alerts.py +++ b/tests/unit/monitor/data_monitoring/alerts/test_data_monitoring_alerts.py @@ -3,12 +3,12 @@ import pytest +from elementary.messages.messaging_integrations.slack_web import ( + SlackWebMessagingIntegration, +) from elementary.monitor.alerts.model_alert import ModelAlertModel from elementary.monitor.alerts.source_freshness_alert import SourceFreshnessAlertModel from elementary.monitor.alerts.test_alert import TestAlertModel -from elementary.monitor.data_monitoring.alerts.integrations.slack.slack import ( - SlackIntegration, -) from elementary.monitor.fetchers.alerts.schema.alert_data import ( ModelAlertDataSchema, SourceFreshnessAlertDataSchema, @@ -23,7 +23,7 @@ def test_get_integration_client(data_monitoring_alerts_mock: DataMonitoringAlertsMock): integration = data_monitoring_alerts_mock._get_integration_client() - assert isinstance(integration, SlackIntegration) + assert isinstance(integration, SlackWebMessagingIntegration) def test_fetch_data(data_monitoring_alerts_mock: DataMonitoringAlertsMock):