diff --git a/elementary/config/config.py b/elementary/config/config.py index 6919ef433..3eaefef46 100644 --- a/elementary/config/config.py +++ b/elementary/config/config.py @@ -10,6 +10,8 @@ from elementary.monitor.alerts.grouping_type import GroupingType from elementary.utils.ordered_yaml import OrderedYaml +DEFAULT_ENV = "dev" + class Config: _SLACK = "slack" @@ -68,7 +70,7 @@ def __init__( azure_container_name: Optional[str] = None, report_url: Optional[str] = None, teams_webhook: Optional[str] = None, - env: str = "dev", + env: str = DEFAULT_ENV, run_dbt_deps_if_needed: Optional[bool] = None, project_name: Optional[str] = None, ): @@ -249,6 +251,10 @@ def has_gcloud(self): def has_gcs(self): return self.gcs_bucket_name and self.has_gcloud + @property + def specified_env(self) -> Optional[str]: + return self.env if self.env != DEFAULT_ENV else None + def validate_monitor(self): provided_integrations = list( filter( diff --git a/elementary/messages/block_builders.py b/elementary/messages/block_builders.py index dbb6401f9..400e2910c 100644 --- a/elementary/messages/block_builders.py +++ b/elementary/messages/block_builders.py @@ -87,6 +87,24 @@ def SummaryLineBlock( return LineBlock(inlines=text_blocks) +def NonPrimaryFactBlock(fact: Tuple[LineBlock, LineBlock]) -> FactBlock: + title, value = fact + return FactBlock( + title=title, + value=value, + primary=False, + ) + + +def PrimaryFactBlock(fact: Tuple[LineBlock, LineBlock]) -> FactBlock: + title, value = fact + return FactBlock( + title=title, + value=value, + primary=True, + ) + + def FactsBlock( *, facts: Sequence[ diff --git a/elementary/monitor/alerts/alert.py b/elementary/monitor/alerts/alert.py index 982432f25..d96abbf59 100644 --- a/elementary/monitor/alerts/alert.py +++ b/elementary/monitor/alerts/alert.py @@ -31,6 +31,7 @@ def __init__( report_url: Optional[str] = None, alert_fields: Optional[List[str]] = None, elementary_database_and_schema: Optional[str] = None, + env: Optional[str] = None, **kwargs, ): self.id = id @@ -63,6 +64,7 @@ def __init__( self.report_url = report_url self.alert_fields = alert_fields self.elementary_database_and_schema = elementary_database_and_schema + self.env = env @property def unified_meta(self) -> Dict: diff --git a/elementary/monitor/alerts/alert_messages/__init__.py b/elementary/monitor/alerts/alert_messages/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/elementary/monitor/alerts/alert_messages/builder.py b/elementary/monitor/alerts/alert_messages/builder.py new file mode 100644 index 000000000..eedd17b7b --- /dev/null +++ b/elementary/monitor/alerts/alert_messages/builder.py @@ -0,0 +1,632 @@ +from datetime import timedelta +from typing import Any, Dict, List, Literal, Optional, Sequence, Tuple, Union + +from elementary.messages.block_builders import ( + BoldTextLineBlock, + BulletListBlock, + FactsBlock, + ItalicTextLineBlock, + JsonCodeBlock, + LinkLineBlock, + NonPrimaryFactBlock, + PrimaryFactBlock, + SummaryLineBlock, + TextLineBlock, +) +from elementary.messages.blocks import ( + CodeBlock, + DividerBlock, + ExpandableBlock, + FactListBlock, + HeaderBlock, + Icon, + InlineBlock, + LineBlock, + LinesBlock, + LinkBlock, + TextBlock, + TextStyle, +) +from elementary.messages.message_body import Color, MessageBlock, MessageBody +from elementary.monitor.alerts.alerts_groups.alerts_group import AlertsGroup +from elementary.monitor.alerts.alerts_groups.grouped_by_table import ( + GroupedByTableAlerts, +) +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.utils.report_link import ( + ReportLinkData, +) + +AlertType = Union[ + TestAlertModel, + ModelAlertModel, + SourceFreshnessAlertModel, + GroupedByTableAlerts, + AlertsGroup, +] + + +class AlertMessageBuilder: + STATUS_DISPLAYS: Dict[str, str] = { + "fail": "Failure", + "warn": "Warning", + "error": "Error", + "runtime error": "Runtime Error", + } + + STATUS_COLORS: Dict[str, Color] = { + "fail": Color.RED, + "warn": Color.YELLOW, + "error": Color.RED, + "runtime error": Color.RED, + } + + def _get_display_name(self, status: Optional[str]) -> Optional[str]: + if status is None: + return None + return self.STATUS_DISPLAYS.get(status, status.capitalize()) + + def _get_color(self, alert_status: Optional[str]) -> Optional[Color]: + if alert_status is None: + return None + return self.STATUS_COLORS.get(alert_status) + + def _get_alert_title( + self, summary: str, status: Optional[str], test_type: Optional[str] + ) -> str: + if test_type == "schema_change": + return summary + return f"{self._get_display_name(status)}: {summary}" if status else summary + + def _get_run_alert_subtitle_block( + self, + type: Literal["test", "snapshot", "model", "source"], + name: str, + status: Optional[str] = None, + detected_at_str: Optional[str] = None, + suppression_interval: Optional[int] = None, + env: Optional[str] = None, + report_link: Optional[ReportLinkData] = None, + ) -> LinesBlock: + summary = [] + summary.append((type.capitalize() + ":", name)) + if env: + summary.append(("Env:", env)) + summary.append(("Status:", status or "Unknown")) + if detected_at_str: + summary.append(("Time:", detected_at_str)) + if suppression_interval: + summary.append(("Suppression interval:", str(suppression_interval))) + subtitle_lines = [SummaryLineBlock(summary=summary)] + + if report_link: + subtitle_lines.append( + LinkLineBlock(text="View in Elementary", url=report_link.url) + ) + return LinesBlock(lines=subtitle_lines) + + def _get_run_alert_subtitle_blocks( + self, + alert: Union[TestAlertModel, SourceFreshnessAlertModel, ModelAlertModel], + ) -> List[MessageBlock]: + asset_type: Literal["test", "snapshot", "model", "source"] + asset_name: str + if isinstance(alert, TestAlertModel): + asset_type = "test" + asset_name = alert.concise_name + elif isinstance(alert, SourceFreshnessAlertModel): + asset_type = "source" + asset_name = f"{alert.source_name}.{alert.identifier}" + elif isinstance(alert, ModelAlertModel): + asset_type = "snapshot" if alert.materialization == "snapshot" else "model" + asset_name = alert.alias + return [ + self._get_run_alert_subtitle_block( + type=asset_type, + name=asset_name, + status=alert.status, + detected_at_str=alert.detected_at_str, + suppression_interval=alert.suppression_interval, + env=alert.env, + report_link=alert.get_report_link(), + ) + ] + + def _get_alert_counters_subtitle_block( + self, + model_errors_count: int = 0, + test_failures_count: int = 0, + test_warnings_count: int = 0, + test_errors_count: int = 0, + env: Optional[str] = None, + ) -> LinesBlock: + summary: List[Tuple[Union[Tuple[Icon, str], str], str]] = [] + if model_errors_count: + summary.append(((Icon.X, "Model Errors:"), str(model_errors_count))) + if test_failures_count: + summary.append( + ((Icon.RED_TRIANGLE, "Test Failures:"), str(test_failures_count)) + ) + if test_warnings_count: + summary.append(((Icon.WARNING, "Test Warnings:"), str(test_warnings_count))) + if test_errors_count: + summary.append(((Icon.EXCLAMATION, "Test Errors:"), str(test_errors_count))) + if env: + summary.append(("Env:", env)) + subtitle_lines = [SummaryLineBlock(summary=summary)] + + return LinesBlock(lines=subtitle_lines) + + def _get_alerts_group_subtitle_blocks( + self, + alert: Union[AlertsGroup, GroupedByTableAlerts], + ) -> List[MessageBlock]: + return [ + self._get_alert_counters_subtitle_block( + model_errors_count=len(alert.model_errors), + test_failures_count=len(alert.test_failures), + test_warnings_count=len(alert.test_warnings), + test_errors_count=len(alert.test_errors), + env=alert.env, + ) + ] + + def _get_details_blocks( + self, + table: Optional[str] = None, + column: Optional[str] = None, + tags: Optional[List[str]] = None, + owners: Optional[List[str]] = None, + subscribers: Optional[List[str]] = None, + description: Optional[str] = None, + path: Optional[str] = None, + ) -> List[MessageBlock]: + tags = sorted(list(set(tags))) if tags else None + owners = sorted(list(set(owners))) if owners else None + subscribers = sorted(list(set(subscribers))) if subscribers else None + + blocks: List[MessageBlock] = [] + if not ( + table or column or tags or owners or subscribers or description or path + ): + return blocks + blocks.append( + LinesBlock( + lines=[ + BoldTextLineBlock(text=[Icon.INFO, "Details"]), + ] + ) + ) + fact_blocks = [] + if table: + fact_blocks.append( + PrimaryFactBlock( + (TextLineBlock(text="Table"), TextLineBlock(text=table)) + ) + ) + if column: + fact_blocks.append( + NonPrimaryFactBlock( + (TextLineBlock(text="Column"), TextLineBlock(text=column)) + ) + ) + + tags_line = ( + TextLineBlock(text=", ".join(tags)) + if tags + else ItalicTextLineBlock(text="No tags") + ) + owners_line = ( + TextLineBlock(text=", ".join(owners)) + if owners + else ItalicTextLineBlock(text="No owners") + ) + subscribers_line = ( + TextLineBlock(text=", ".join(subscribers)) + if subscribers + else ItalicTextLineBlock(text="No subscribers") + ) + fact_blocks.append(NonPrimaryFactBlock((TextLineBlock(text="Tags"), tags_line))) + fact_blocks.append( + NonPrimaryFactBlock((TextLineBlock(text="Owners"), owners_line)) + ) + fact_blocks.append( + NonPrimaryFactBlock((TextLineBlock(text="Subscribers"), subscribers_line)) + ) + + if description: + fact_blocks.append( + PrimaryFactBlock( + (TextLineBlock(text="Description"), TextLineBlock(text=description)) + ) + ) + if path: + fact_blocks.append( + PrimaryFactBlock((TextLineBlock(text="Path"), TextLineBlock(text=path))) + ) + blocks.append(FactListBlock(facts=fact_blocks)) + return blocks + + def _get_result_blocks( + self, + result_message: Optional[str], + result_sample: Optional[Union[List[Dict[str, Any]], Dict[str, Any]]] = None, + result_query: Optional[str] = None, + anomalous_value: Optional[dict] = None, + time_elapsed: Optional[str] = None, + last_record_at: Optional[str] = None, + sampled_at: Optional[str] = None, + ) -> List[MessageBlock]: + result_blocks: List[MessageBlock] = [] + if result_message: + result_blocks.append( + LinesBlock( + lines=[ + BoldTextLineBlock(text="Result Message"), + ] + ) + ) + result_blocks.append( + CodeBlock(text=result_message.strip()), + ) + if result_sample: + result_blocks.append( + LinesBlock( + lines=[ + BoldTextLineBlock( + text=[Icon.MAGNIFYING_GLASS, "Test Results Sample"] + ), + ] + ) + ) + result_blocks.append( + JsonCodeBlock(content=result_sample), + ) + if result_query: + result_blocks.append( + LinesBlock( + lines=[ + BoldTextLineBlock(text=["Test Results Query"]), + ] + ) + ) + result_blocks.append(CodeBlock(text=result_query.strip())) + if anomalous_value: + result_blocks.append( + LinesBlock( + lines=[ + BoldTextLineBlock(text=["Anomalous Values"]), + ] + ) + ) + result_blocks.append( + JsonCodeBlock(content=anomalous_value), + ) + + # facts + facts = [] + if time_elapsed: + facts.append(("Time Elapsed", time_elapsed)) + if last_record_at: + facts.append(("Last Record At", last_record_at)) + if sampled_at: + facts.append(("Sampled At", sampled_at)) + + if facts: + result_blocks.append(FactsBlock(facts=facts)) + + return result_blocks + + def _get_test_alert_config_blocks( + self, test_params: Optional[Dict[str, Any]] + ) -> List[MessageBlock]: + config_blocks: List[MessageBlock] = [] + if test_params: + config_blocks.append( + LinesBlock( + lines=[ + BoldTextLineBlock( + text=[Icon.HAMMER_AND_WRENCH, "Test Parameters"] + ), + ] + ) + ) + config_blocks.append( + JsonCodeBlock(content=test_params), + ) + return config_blocks + + def _get_model_alert_config_blocks( + self, + materialization: Optional[str] = None, + full_refresh: Optional[bool] = None, + ) -> List[MessageBlock]: + facts = [] + if materialization: + facts.append(("Materialization", materialization)) + if full_refresh is not None: + facts.append(("Full Refresh", "Yes" if full_refresh else "No")) + return [FactsBlock(facts=facts)] + + def _get_source_freshness_alert_config_blocks( + self, + error_after: Optional[str] = None, + warn_after: Optional[str] = None, + filter: Optional[str] = None, + ) -> List[MessageBlock]: + facts = [] + if error_after: + facts.append(("Error after", error_after)) + if warn_after: + facts.append(("Warn after", warn_after)) + if filter: + facts.append(("Filter", filter)) + return [FactsBlock(facts=facts)] if facts else [] + + def _get_alert_list_line( + self, + alert: Union[ + TestAlertModel, + ModelAlertModel, + SourceFreshnessAlertModel, + ], + ) -> LineBlock: + inlines: List[InlineBlock] = [ + TextBlock(text=alert.summary, style=TextStyle.BOLD), + ] + if owners := list(set(alert.owners)): + inlines.append(TextBlock(text="-")) + if len(owners) == 1: + inlines.append(TextBlock(text=f"Owner: {owners.pop()}")) + else: + owners.sort() + inlines.append(TextBlock(text=f"Owners: {', '.join(owners)}")) + + if report_link := alert.get_report_link(): + inlines.append(TextBlock(text="-")) + inlines.append(LinkBlock(text=report_link.text, url=report_link.url)) + + return LineBlock(inlines=inlines) + + def _get_alert_list_blocks( + self, + title: str, + bullet_icon: Icon, + alerts: Sequence[ + Union[ + TestAlertModel, + ModelAlertModel, + SourceFreshnessAlertModel, + ] + ], + ) -> List[MessageBlock]: + blocks: List[MessageBlock] = [] + if not alerts: + return blocks + blocks.append(LinesBlock(lines=[BoldTextLineBlock(text=title)])) + lines = [self._get_alert_list_line(alert) for alert in alerts] + bullet_list = BulletListBlock(icon=bullet_icon, lines=lines) + blocks.append(bullet_list) + return blocks + + def _get_sub_alert_groups_blocks( + self, + test_errors: List[Union[TestAlertModel, SourceFreshnessAlertModel]], + test_warnings: List[Union[TestAlertModel, SourceFreshnessAlertModel]], + test_failures: List[Union[TestAlertModel, SourceFreshnessAlertModel]], + model_errors: List[ModelAlertModel], + ) -> List[MessageBlock]: + blocks: List[MessageBlock] = [] + model_errors_alert_list_blocks = self._get_alert_list_blocks( + title="Model Errors", + bullet_icon=Icon.X, + alerts=model_errors, + ) + + test_failures_alert_list_blocks = self._get_alert_list_blocks( + title="Test Failures", + bullet_icon=Icon.RED_TRIANGLE, + alerts=test_failures, + ) + + test_warnings_alert_list_blocks = self._get_alert_list_blocks( + title="Test Warnings", + bullet_icon=Icon.WARNING, + alerts=test_warnings, + ) + + test_errors_alert_list_blocks = self._get_alert_list_blocks( + title="Test Errors", + bullet_icon=Icon.EXCLAMATION, + alerts=test_errors, + ) + + blocks.extend(model_errors_alert_list_blocks) + if blocks: + blocks.append(DividerBlock()) + blocks.extend(test_failures_alert_list_blocks) + if blocks and not isinstance(blocks[-1], DividerBlock): + blocks.append(DividerBlock()) + blocks.extend(test_warnings_alert_list_blocks) + if blocks and not isinstance(blocks[-1], DividerBlock): + blocks.append(DividerBlock()) + blocks.extend(test_errors_alert_list_blocks) + + return blocks + + def _get_alert_title_blocks( + self, + alert: AlertType, + ) -> List[MessageBlock]: + test_type = alert.test_type if isinstance(alert, TestAlertModel) else None + title = self._get_alert_title(alert.summary, alert.status, test_type) + return [HeaderBlock(text=title)] + + def _get_alert_subtitle_blocks( + self, + alert: AlertType, + ) -> List[MessageBlock]: + if isinstance( + alert, (TestAlertModel, ModelAlertModel, SourceFreshnessAlertModel) + ): + return self._get_run_alert_subtitle_blocks(alert) + elif isinstance(alert, AlertsGroup): + return self._get_alerts_group_subtitle_blocks(alert) + + def _get_alert_details_blocks( + self, + alert: AlertType, + ) -> List[MessageBlock]: + if isinstance(alert, TestAlertModel): + return self._get_details_blocks( + table=alert.table_full_name, + column=alert.column_name, + tags=alert.tags, + owners=alert.owners, + subscribers=alert.subscribers, + description=alert.test_description, + ) + elif isinstance(alert, ModelAlertModel): + return self._get_details_blocks( + tags=alert.tags, + owners=alert.owners, + subscribers=alert.subscribers, + path=alert.original_path, + ) + elif isinstance(alert, SourceFreshnessAlertModel): + return self._get_details_blocks( + tags=alert.tags, + owners=alert.owners, + subscribers=alert.subscribers, + path=alert.path, + description=alert.freshness_description, + ) + elif isinstance(alert, GroupedByTableAlerts): + return self._get_details_blocks( + tags=alert.tags, + owners=alert.owners, + subscribers=alert.subscribers, + ) + return [] + + def _get_alert_result_blocks( + self, + alert: AlertType, + ) -> List[MessageBlock]: + result_blocks: List[MessageBlock] = [] + title = "Result" + + if isinstance(alert, TestAlertModel): + result_blocks = self._get_result_blocks( + result_message=alert.error_message, + result_sample=alert.test_rows_sample, + anomalous_value=( + alert.other if alert.test_type == "anomaly_detection" else None + ), + result_query=alert.test_results_query, + ) + title = "Test Result" + elif isinstance(alert, ModelAlertModel): + if alert.materialization == "snapshot": + result_blocks = self._get_result_blocks( + result_message=alert.message, + ) + elif isinstance(alert, SourceFreshnessAlertModel): + result_blocks = self._get_result_blocks( + result_message=alert.error_message, + time_elapsed=f"{timedelta(seconds=alert.max_loaded_at_time_ago_in_s) if alert.max_loaded_at_time_ago_in_s else 'N/A'}", + last_record_at=alert.max_loaded_at, + sampled_at=alert.snapshotted_at_str, + ) + + if result_blocks: + return [ExpandableBlock(title=title, body=result_blocks)] + return [] + + def _get_alert_config_blocks( + self, + alert: AlertType, + ) -> List[MessageBlock]: + config_blocks: List[MessageBlock] = [] + title = "Configuration" + expandable = False + + if isinstance(alert, TestAlertModel): + config_blocks = self._get_test_alert_config_blocks(alert.test_params) + title = "Test Configuration" + elif isinstance(alert, ModelAlertModel): + if alert.materialization != "snapshot": + config_blocks = self._get_model_alert_config_blocks( + materialization=alert.materialization, + full_refresh=alert.full_refresh, + ) + title = "Model Configuration" + expandable = True + elif isinstance(alert, SourceFreshnessAlertModel): + config_blocks = self._get_source_freshness_alert_config_blocks( + error_after=alert.error_after, + warn_after=alert.warn_after, + filter=alert.filter, + ) + title = "Source Freshness Configuration" + + if config_blocks: + return [ + ExpandableBlock(title=title, body=config_blocks, expanded=expandable) + ] + return [] + + def _get_alert_groups_blocks( + self, + alert: Union[AlertsGroup, GroupedByTableAlerts], + ) -> List[MessageBlock]: + if isinstance(alert, AlertsGroup): + return self._get_sub_alert_groups_blocks( + model_errors=alert.model_errors, + test_failures=alert.test_failures, + test_warnings=alert.test_warnings, + test_errors=alert.test_errors, + ) + return [] + + def build( + self, + alert: AlertType, + ) -> MessageBody: + color = self._get_color(alert.status) + + blocks: List[MessageBlock] = [] + + title_blocks = self._get_alert_title_blocks(alert) + blocks.extend(title_blocks) + + subtitle_blocks = self._get_alert_subtitle_blocks(alert) + blocks.extend(subtitle_blocks) + + blocks.append(DividerBlock()) + + details_blocks = self._get_alert_details_blocks(alert) + if details_blocks: + blocks.extend(details_blocks) + blocks.append(DividerBlock()) + + result_blocks = self._get_alert_result_blocks(alert) + blocks.extend(result_blocks) + + config_blocks = self._get_alert_config_blocks(alert) + blocks.extend(config_blocks) + + if isinstance(alert, (AlertsGroup, GroupedByTableAlerts)): + alert_groups_blocks = self._get_alert_groups_blocks(alert) + blocks.extend(alert_groups_blocks) + + if isinstance(blocks[-1], DividerBlock): + blocks.pop() + + message_body = MessageBody( + color=color, + blocks=blocks, + ) + return message_body diff --git a/elementary/monitor/alerts/alerts_groups/alerts_group.py b/elementary/monitor/alerts/alerts_groups/alerts_group.py index acba42c8d..b2c3ec34f 100644 --- a/elementary/monitor/alerts/alerts_groups/alerts_group.py +++ b/elementary/monitor/alerts/alerts_groups/alerts_group.py @@ -1,4 +1,4 @@ -from typing import List, Union +from typing import List, Optional, Union from elementary.monitor.alerts.alerts_groups.base_alerts_group import BaseAlertsGroup from elementary.monitor.alerts.model_alert import ModelAlertModel @@ -15,8 +15,9 @@ class AlertsGroup(BaseAlertsGroup): def __init__( self, alerts: List[Union[TestAlertModel, ModelAlertModel, SourceFreshnessAlertModel]], + env: Optional[str] = None, ) -> None: - super().__init__(alerts) + super().__init__(alerts, env=env) self.test_errors = [] self.test_warnings = [] self.test_failures = [] diff --git a/elementary/monitor/alerts/alerts_groups/base_alerts_group.py b/elementary/monitor/alerts/alerts_groups/base_alerts_group.py index 08e6dc1ef..1cc34d74a 100644 --- a/elementary/monitor/alerts/alerts_groups/base_alerts_group.py +++ b/elementary/monitor/alerts/alerts_groups/base_alerts_group.py @@ -1,6 +1,6 @@ from abc import ABC, abstractmethod from datetime import datetime -from typing import Dict, List, Sequence, Union +from typing import Dict, List, Optional, Sequence, Union from elementary.monitor.alerts.model_alert import ModelAlertModel from elementary.monitor.alerts.source_freshness_alert import SourceFreshnessAlertModel @@ -13,8 +13,10 @@ def __init__( alerts: Sequence[ Union[TestAlertModel, ModelAlertModel, SourceFreshnessAlertModel] ], + env: Optional[str] = None, ) -> None: self.alerts = alerts + self.env = env @property def summary(self) -> str: diff --git a/elementary/monitor/alerts/alerts_groups/grouped_by_table.py b/elementary/monitor/alerts/alerts_groups/grouped_by_table.py index c01cd62ff..c360d480e 100644 --- a/elementary/monitor/alerts/alerts_groups/grouped_by_table.py +++ b/elementary/monitor/alerts/alerts_groups/grouped_by_table.py @@ -1,4 +1,4 @@ -from typing import Dict, Optional +from typing import Dict, List, Optional, Set from elementary.monitor.alerts.alerts_groups.alerts_group import AlertsGroup from elementary.monitor.alerts.model_alert import ModelAlertModel @@ -12,10 +12,19 @@ class GroupedByTableAlerts(AlertsGroup): @property def model_unique_id(self) -> Optional[str]: - return self.alerts[0].model_unique_id + models_unique_ids = [ + alert.model_unique_id + for alert in self.alerts + if alert.model_unique_id is not None + ] + if not models_unique_ids: + return None + return models_unique_ids[0] @property - def model(self) -> str: + def model(self) -> Optional[str]: + if not self.model_unique_id: + return None return get_shortened_model_name(self.model_unique_id) @property @@ -24,7 +33,11 @@ def report_url(self) -> Optional[str]: @property def summary(self) -> str: - return f"{self.model}: {len(self.alerts)} issues detected" + return ( + f"{self.model}: {len(self.alerts)} issues detected" + if self.model + else f"{len(self.alerts)} Issues detected" + ) def get_report_link(self) -> Optional[ReportLinkData]: if not self.model_errors: @@ -45,3 +58,24 @@ def unified_meta(self) -> Dict: test_unified_meta = alert_unified_meta return model_unified_meta or test_unified_meta + + @property + def tags(self) -> List[str]: + tags: Set[str] = set() + for alert in self.alerts: + tags.update(alert.tags) + return list(tags) + + @property + def owners(self) -> List[str]: + owners: Set[str] = set() + for alert in self.alerts: + owners.update(alert.owners) + return list(owners) + + @property + def subscribers(self) -> List[str]: + subscribers: Set[str] = set() + for alert in self.alerts: + subscribers.update(alert.subscribers) + return list(subscribers) diff --git a/elementary/monitor/alerts/model_alert.py b/elementary/monitor/alerts/model_alert.py index f375c326a..10bb29027 100644 --- a/elementary/monitor/alerts/model_alert.py +++ b/elementary/monitor/alerts/model_alert.py @@ -36,6 +36,7 @@ def __init__( report_url: Optional[str] = None, alert_fields: Optional[List[str]] = None, elementary_database_and_schema: Optional[str] = None, + env: Optional[str] = None, **kwargs, ): super().__init__( @@ -55,6 +56,7 @@ def __init__( report_url, alert_fields, elementary_database_and_schema, + env=env, ) self.alias = alias self.path = path diff --git a/elementary/monitor/alerts/source_freshness_alert.py b/elementary/monitor/alerts/source_freshness_alert.py index 1d3454407..9da7d831a 100644 --- a/elementary/monitor/alerts/source_freshness_alert.py +++ b/elementary/monitor/alerts/source_freshness_alert.py @@ -45,6 +45,7 @@ def __init__( report_url: Optional[str] = None, alert_fields: Optional[List[str]] = None, elementary_database_and_schema: Optional[str] = None, + env: Optional[str] = None, **kwargs, ): super().__init__( @@ -64,6 +65,7 @@ def __init__( report_url, alert_fields, elementary_database_and_schema, + env=env, ) self.snapshotted_at_str = ( convert_datetime_utc_str_to_timezone_str( diff --git a/elementary/monitor/alerts/test_alert.py b/elementary/monitor/alerts/test_alert.py index f302e94a0..07b53518b 100644 --- a/elementary/monitor/alerts/test_alert.py +++ b/elementary/monitor/alerts/test_alert.py @@ -47,6 +47,7 @@ def __init__( report_url: Optional[str] = None, alert_fields: Optional[List[str]] = None, elementary_database_and_schema: Optional[str] = None, + env: Optional[str] = None, **kwargs, ): super().__init__( @@ -66,6 +67,7 @@ def __init__( report_url, alert_fields, elementary_database_and_schema, + env=env, ) self.table_name = table_name self.test_type = test_type @@ -148,6 +150,7 @@ def data(self) -> Dict: test_params=self.test_params, test_rows_sample=self.test_rows_sample, column_name=self.column_name, + env=self.env, ) @property diff --git a/elementary/monitor/data_monitoring/alerts/data_monitoring_alerts.py b/elementary/monitor/data_monitoring/alerts/data_monitoring_alerts.py index df203d076..eb5ccaeb4 100644 --- a/elementary/monitor/data_monitoring/alerts/data_monitoring_alerts.py +++ b/elementary/monitor/data_monitoring/alerts/data_monitoring_alerts.py @@ -202,6 +202,7 @@ def _format_alerts( global_suppression_interval=self.global_suppression_interval, override_config=self.override_config, disable_samples=self.disable_samples, + env=self.config.specified_env, ) try: grouping_type = GroupingType(group_alerts_by) @@ -218,7 +219,12 @@ def _format_alerts( ) for alerts_by_model in model_ids_to_alerts_map.values(): - grouped_by_table_alerts.append(GroupedByTableAlerts(alerts=alerts_by_model)) + grouped_by_table_alerts.append( + GroupedByTableAlerts( + alerts=alerts_by_model, + env=self.config.specified_env, + ) + ) self.execution_properties["had_group_by_table"] = ( len(grouped_by_table_alerts) > 0 diff --git a/elementary/monitor/data_monitoring/alerts/integrations/base_integration.py b/elementary/monitor/data_monitoring/alerts/integrations/base_integration.py index 4c6970c3e..1b076b4ec 100644 --- a/elementary/monitor/data_monitoring/alerts/integrations/base_integration.py +++ b/elementary/monitor/data_monitoring/alerts/integrations/base_integration.py @@ -135,16 +135,19 @@ def _group_alerts( flattened_alerts: List[ Union[TestAlertModel, ModelAlertModel, SourceFreshnessAlertModel] ] = [] + env = None for alert in alerts: if isinstance(alert, BaseAlertsGroup): flattened_alerts.extend(alert.alerts) + if env is None and alert.env is not None: + env = alert.env else: flattened_alerts.append(alert) if len(flattened_alerts) >= threshold: logger.info(f"Grouping {len(flattened_alerts)} alerts into one") return [ - AlertsGroup(alerts=flattened_alerts), + AlertsGroup(alerts=flattened_alerts, env=env), ] return alerts diff --git a/elementary/monitor/fetchers/alerts/schema/alert_data.py b/elementary/monitor/fetchers/alerts/schema/alert_data.py index 819673d6e..33c296b87 100644 --- a/elementary/monitor/fetchers/alerts/schema/alert_data.py +++ b/elementary/monitor/fetchers/alerts/schema/alert_data.py @@ -105,6 +105,7 @@ def format_alert( elementary_database_and_schema: Optional[str] = None, global_suppression_interval: int = 0, override_config: bool = False, + env: Optional[str] = None, *args, **kwargs ): @@ -185,6 +186,7 @@ def format_alert( elementary_database_and_schema: Optional[str] = None, global_suppression_interval: int = 0, override_config: bool = False, + env: Optional[str] = None, disable_samples: bool = False, *args, **kwargs @@ -224,6 +226,7 @@ def format_alert( report_url=report_url, alert_fields=self.alert_fields, elementary_database_and_schema=elementary_database_and_schema, + env=env, ) @@ -243,6 +246,7 @@ def format_alert( elementary_database_and_schema: Optional[str] = None, global_suppression_interval: int = 0, override_config: bool = False, + env: Optional[str] = None, *args, **kwargs ) -> ModelAlertModel: @@ -271,6 +275,7 @@ def format_alert( report_url=report_url, alert_fields=self.alert_fields, elementary_database_and_schema=elementary_database_and_schema, + env=env, ) @validator("full_refresh", pre=True, always=True) @@ -303,6 +308,7 @@ def format_alert( elementary_database_and_schema: Optional[str] = None, global_suppression_interval: int = 0, override_config: bool = False, + env: Optional[str] = None, *args, **kwargs ) -> SourceFreshnessAlertModel: @@ -338,4 +344,5 @@ def format_alert( report_url=report_url, alert_fields=self.alert_fields, elementary_database_and_schema=elementary_database_and_schema, + env=env, ) diff --git a/tests/conftest.py b/tests/conftest.py index 91bc16cc6..090f4893a 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,2 +1,26 @@ +import uuid + +import pytest + + def pytest_addoption(parser): parser.addoption("--warehouse-type", action="store", default=None) + + +@pytest.fixture(autouse=True) +def mock_uuid(monkeypatch): + """Mock UUID to ensure consistent UUIDs in tests.""" + + class MockUUID: + def __init__(self): + self.counter = 0 + + def __call__(self): + self.counter += 1 + return uuid.UUID( + f"00000000-0000-0000-0000-{self.counter:012d}" # noqa: E231 + ) + + mock = MockUUID() + monkeypatch.setattr(uuid, "uuid4", mock) + return mock 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 new file mode 100644 index 000000000..eb78f0df3 --- /dev/null +++ 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 @@ -0,0 +1,152 @@ +{ + "type": "AdaptiveCard", + "body": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "Container", + "items": [ + { + "type": "TextBlock", + "text": "Error: 20 issues detected", + "weight": "bolder", + "size": "large", + "wrap": true + } + ], + "style": "Attention" + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **Test Warnings:** 10 | \u2757 **Test Errors:** 10", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "**Test Warnings**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_1**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_2** - Owner: owner1", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_3** - Owners: owner1, owner2", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_4**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_5** - Owner: owner1", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_6** - Owners: owner1, owner2", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_7**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_8** - Owner: owner1", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_9** - Owners: owner1, owner2", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_10**", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "**Test Errors**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_1**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_2** - Owner: owner1", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_3** - Owners: owner1, owner2", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_4**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_5** - Owner: owner1", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_6** - Owners: owner1, owner2", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_7**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_8** - Owner: owner1", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_9** - Owners: owner1, owner2", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_10**", + "wrap": true + } + ] + } + ], + "version": "1.6" +} 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 new file mode 100644 index 000000000..1652912ef --- /dev/null +++ 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 @@ -0,0 +1,91 @@ +{ + "type": "AdaptiveCard", + "body": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "Container", + "items": [ + { + "type": "TextBlock", + "text": "Failure: 10 issues detected", + "weight": "bolder", + "size": "large", + "wrap": true + } + ], + "style": "Default" + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **Test Failures:** 10", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "**Test Failures**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_1**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_2** - Owner: owner1", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_3** - Owners: owner1, owner2", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_4**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_5** - Owner: owner1", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_6** - Owners: owner1, owner2", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_7**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_8** - Owner: owner1", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_9** - Owners: owner1, owner2", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_10**", + "wrap": true + } + ] + } + ], + "version": "1.6" +} 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 new file mode 100644 index 000000000..2e6c19c99 --- /dev/null +++ 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 @@ -0,0 +1,152 @@ +{ + "type": "AdaptiveCard", + "body": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "Container", + "items": [ + { + "type": "TextBlock", + "text": "Error: 20 issues detected", + "weight": "bolder", + "size": "large", + "wrap": true + } + ], + "style": "Attention" + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **Test Failures:** 10 | \u2757 **Test Errors:** 10", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "**Test Failures**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_1**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_2** - Owner: owner1", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_3** - Owners: owner1, owner2", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_4**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_5** - Owner: owner1", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_6** - Owners: owner1, owner2", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_7**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_8** - Owner: owner1", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_9** - Owners: owner1, owner2", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_10**", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "**Test Errors**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_1**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_2** - Owner: owner1", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_3** - Owners: owner1, owner2", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_4**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_5** - Owner: owner1", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_6** - Owners: owner1, owner2", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_7**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_8** - Owner: owner1", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_9** - Owners: owner1, owner2", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_10**", + "wrap": true + } + ] + } + ], + "version": "1.6" +} 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 new file mode 100644 index 000000000..1c30b9916 --- /dev/null +++ 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 @@ -0,0 +1,213 @@ +{ + "type": "AdaptiveCard", + "body": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "Container", + "items": [ + { + "type": "TextBlock", + "text": "Error: 30 issues detected", + "weight": "bolder", + "size": "large", + "wrap": true + } + ], + "style": "Attention" + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **Test Failures:** 10 | \u26a0\ufe0f **Test Warnings:** 10 | \u2757 **Test Errors:** 10 | **Env:** Test Env", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "**Test Failures**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_1** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_2** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_3** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_4** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_5** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_6** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_7** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_8** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_9** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_10** - [View Report](http://test.com)", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "**Test Warnings**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_1** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_2** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_3** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_4** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_5** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_6** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_7** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_8** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_9** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_10** - [View Report](http://test.com)", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "**Test Errors**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_1** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_2** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_3** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_4** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_5** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_6** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_7** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_8** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_9** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_10** - [View Report](http://test.com)", + "wrap": true + } + ] + } + ], + "version": "1.6" +} 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 new file mode 100644 index 000000000..c3f24cdd9 --- /dev/null +++ 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 @@ -0,0 +1,152 @@ +{ + "type": "AdaptiveCard", + "body": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "Container", + "items": [ + { + "type": "TextBlock", + "text": "Error: 20 issues detected", + "weight": "bolder", + "size": "large", + "wrap": true + } + ], + "style": "Attention" + }, + { + "type": "TextBlock", + "text": "\u274c **Model Errors:** 10 | \u2757 **Test Errors:** 10", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "**Model Errors**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - Owner: owner1", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - Owners: owner1, owner2", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - Owner: owner1", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - Owners: owner1, owner2", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - Owner: owner1", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - Owners: owner1, owner2", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"**", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "**Test Errors**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_1**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_2** - Owner: owner1", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_3** - Owners: owner1, owner2", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_4**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_5** - Owner: owner1", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_6** - Owners: owner1, owner2", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_7**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_8** - Owner: owner1", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_9** - Owners: owner1, owner2", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_10**", + "wrap": true + } + ] + } + ], + "version": "1.6" +} 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 new file mode 100644 index 000000000..6c607a794 --- /dev/null +++ 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 @@ -0,0 +1,152 @@ +{ + "type": "AdaptiveCard", + "body": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "Container", + "items": [ + { + "type": "TextBlock", + "text": "Error: 20 issues detected", + "weight": "bolder", + "size": "large", + "wrap": true + } + ], + "style": "Attention" + }, + { + "type": "TextBlock", + "text": "\u274c **Model Errors:** 10 | \u26a0\ufe0f **Test Warnings:** 10", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "**Model Errors**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - [View Report](http://test.com)", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "**Test Warnings**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_1** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_2** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_3** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_4** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_5** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_6** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_7** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_8** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_9** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_10** - [View Report](http://test.com)", + "wrap": true + } + ] + } + ], + "version": "1.6" +} 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 new file mode 100644 index 000000000..3e70a0b71 --- /dev/null +++ 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 @@ -0,0 +1,213 @@ +{ + "type": "AdaptiveCard", + "body": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "Container", + "items": [ + { + "type": "TextBlock", + "text": "Error: 30 issues detected", + "weight": "bolder", + "size": "large", + "wrap": true + } + ], + "style": "Attention" + }, + { + "type": "TextBlock", + "text": "\u274c **Model Errors:** 10 | \u26a0\ufe0f **Test Warnings:** 10 | \u2757 **Test Errors:** 10 | **Env:** Test Env", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "**Model Errors**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - [View Report](http://test.com)", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "**Test Warnings**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_1** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_2** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_3** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_4** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_5** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_6** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_7** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_8** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_9** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_10** - [View Report](http://test.com)", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "**Test Errors**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_1** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_2** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_3** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_4** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_5** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_6** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_7** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_8** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_9** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_10** - [View Report](http://test.com)", + "wrap": true + } + ] + } + ], + "version": "1.6" +} 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 new file mode 100644 index 000000000..71febc6c0 --- /dev/null +++ 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 @@ -0,0 +1,213 @@ +{ + "type": "AdaptiveCard", + "body": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "Container", + "items": [ + { + "type": "TextBlock", + "text": "Error: 30 issues detected", + "weight": "bolder", + "size": "large", + "wrap": true + } + ], + "style": "Attention" + }, + { + "type": "TextBlock", + "text": "\u274c **Model Errors:** 10 | \ud83d\udd3a **Test Failures:** 10 | \u2757 **Test Errors:** 10 | **Env:** Test Env", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "**Model Errors**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - [View Report](http://test.com)", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "**Test Failures**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_1** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_2** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_3** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_4** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_5** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_6** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_7** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_8** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_9** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_10** - [View Report](http://test.com)", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "**Test Errors**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_1** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_2** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_3** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_4** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_5** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_6** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_7** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_8** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_9** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_10** - [View Report](http://test.com)", + "wrap": true + } + ] + } + ], + "version": "1.6" +} 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 new file mode 100644 index 000000000..b0b786110 --- /dev/null +++ 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 @@ -0,0 +1,213 @@ +{ + "type": "AdaptiveCard", + "body": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "Container", + "items": [ + { + "type": "TextBlock", + "text": "Error: 30 issues detected", + "weight": "bolder", + "size": "large", + "wrap": true + } + ], + "style": "Attention" + }, + { + "type": "TextBlock", + "text": "\u274c **Model Errors:** 10 | \ud83d\udd3a **Test Failures:** 10 | \u26a0\ufe0f **Test Warnings:** 10 | **Env:** Test Env", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "**Model Errors**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - [View Report](http://test.com)", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "**Test Failures**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_1** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_2** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_3** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_4** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_5** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_6** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_7** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_8** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_9** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_10** - [View Report](http://test.com)", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "**Test Warnings**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_1** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_2** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_3** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_4** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_5** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_6** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_7** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_8** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_9** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_10** - [View Report](http://test.com)", + "wrap": true + } + ] + } + ], + "version": "1.6" +} 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 new file mode 100644 index 000000000..b1f592e11 --- /dev/null +++ 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 @@ -0,0 +1,274 @@ +{ + "type": "AdaptiveCard", + "body": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "Container", + "items": [ + { + "type": "TextBlock", + "text": "Error: 40 issues detected", + "weight": "bolder", + "size": "large", + "wrap": true + } + ], + "style": "Attention" + }, + { + "type": "TextBlock", + "text": "\u274c **Model Errors:** 10 | \ud83d\udd3a **Test Failures:** 10 | \u26a0\ufe0f **Test Warnings:** 10 | \u2757 **Test Errors:** 10 | **Env:** Test Env", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "**Model Errors**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - [View Report](http://test.com)", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "**Test Failures**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_1** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_2** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_3** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_4** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_5** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_6** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_7** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_8** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_9** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_10** - [View Report](http://test.com)", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "**Test Warnings**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_1** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_2** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_3** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_4** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_5** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_6** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_7** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_8** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_9** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_10** - [View Report](http://test.com)", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "**Test Errors**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_1** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_2** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_3** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_4** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_5** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_6** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_7** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_8** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_9** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_10** - [View Report](http://test.com)", + "wrap": true + } + ] + } + ], + "version": "1.6" +} 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 new file mode 100644 index 000000000..c4f7da701 --- /dev/null +++ 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 @@ -0,0 +1,30 @@ +{ + "type": "AdaptiveCard", + "body": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "Container", + "items": [ + { + "type": "TextBlock", + "text": "\"test_short_name\" test failed on ", + "weight": "bolder", + "size": "large", + "wrap": true + } + ], + "style": "Default" + }, + { + "type": "TextBlock", + "text": "**Test:** test_short_name | **Status:** Unknown | **Time:** N/A", + "wrap": true + } + ] + } + ], + "version": "1.6" +} 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 new file mode 100644 index 000000000..f5754d7ca --- /dev/null +++ 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 @@ -0,0 +1,123 @@ +{ + "type": "AdaptiveCard", + "body": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "Container", + "items": [ + { + "type": "TextBlock", + "text": "\"test_short_name\" test failed on test_table", + "weight": "bolder", + "size": "large", + "wrap": true + } + ], + "style": "Default" + }, + { + "type": "TextBlock", + "text": "**Test:** test_short_name | **Env:** Test Env | **Status:** Unknown | **Time:** N/A", + "wrap": true + }, + { + "type": "TextBlock", + "text": "[View in Elementary](http://test.com)", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "\u2139\ufe0f **Details**", + "wrap": true + }, + { + "type": "FactSet", + "facts": [ + { + "title": "Table", + "value": "test_table" + }, + { + "title": "Tags", + "value": "_No tags_" + }, + { + "title": "Owners", + "value": "_No owners_" + }, + { + "title": "Subscribers", + "value": "_No subscribers_" + }, + { + "title": "Description", + "value": "Test description" + } + ] + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "ActionSet", + "actions": [ + { + "type": "Action.ToggleVisibility", + "title": "Test Result", + "targetElements": [ + "expandable-00000000-0000-0000-0000-000000000001" + ] + } + ] + }, + { + "type": "Container", + "id": "expandable-00000000-0000-0000-0000-000000000001", + "items": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "**Result Message**", + "wrap": true + }, + { + "type": "Container", + "style": "emphasis", + "items": [ + { + "type": "RichTextBlock", + "inlines": [ + { + "type": "TextRun", + "text": "Test error message", + "fontType": "Monospace" + } + ] + } + ] + } + ] + } + ], + "isVisible": false + } + ] + } + ], + "version": "1.6" +} 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 new file mode 100644 index 000000000..ccbed8ebe --- /dev/null +++ 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 @@ -0,0 +1,114 @@ +{ + "type": "AdaptiveCard", + "body": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "Container", + "items": [ + { + "type": "TextBlock", + "text": "Error: \"test_short_name\" test failed on ", + "weight": "bolder", + "size": "large", + "wrap": true + } + ], + "style": "Attention" + }, + { + "type": "TextBlock", + "text": "**Test:** test_short_name | **Env:** Test Env | **Status:** error | **Time:** N/A", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "\u2139\ufe0f **Details**", + "wrap": true + }, + { + "type": "FactSet", + "facts": [ + { + "title": "Tags", + "value": "_No tags_" + }, + { + "title": "Owners", + "value": "owner1, owner2" + }, + { + "title": "Subscribers", + "value": "_No subscribers_" + }, + { + "title": "Description", + "value": "Test description" + } + ] + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "ActionSet", + "actions": [ + { + "type": "Action.ToggleVisibility", + "title": "Test Result", + "targetElements": [ + "expandable-00000000-0000-0000-0000-000000000001" + ] + } + ] + }, + { + "type": "Container", + "id": "expandable-00000000-0000-0000-0000-000000000001", + "items": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "**Result Message**", + "wrap": true + }, + { + "type": "Container", + "style": "emphasis", + "items": [ + { + "type": "RichTextBlock", + "inlines": [ + { + "type": "TextRun", + "text": "Test error message", + "fontType": "Monospace" + } + ] + } + ] + } + ] + } + ], + "isVisible": false + } + ] + } + ], + "version": "1.6" +} 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 new file mode 100644 index 000000000..9bb3bc075 --- /dev/null +++ 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 @@ -0,0 +1,144 @@ +{ + "type": "AdaptiveCard", + "body": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "Container", + "items": [ + { + "type": "TextBlock", + "text": "Error: \"test_short_name\" test failed on test_table", + "weight": "bolder", + "size": "large", + "wrap": true + } + ], + "style": "Attention" + }, + { + "type": "TextBlock", + "text": "**Test:** test_short_name | **Env:** Test Env | **Status:** error | **Time:** N/A", + "wrap": true + }, + { + "type": "TextBlock", + "text": "[View in Elementary](http://test.com)", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "\u2139\ufe0f **Details**", + "wrap": true + }, + { + "type": "FactSet", + "facts": [ + { + "title": "Table", + "value": "test_table" + }, + { + "title": "Tags", + "value": "tag1, tag2" + }, + { + "title": "Owners", + "value": "owner1, owner2" + }, + { + "title": "Subscribers", + "value": "_No subscribers_" + }, + { + "title": "Description", + "value": "Test description" + } + ] + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "ActionSet", + "actions": [ + { + "type": "Action.ToggleVisibility", + "title": "Test Result", + "targetElements": [ + "expandable-00000000-0000-0000-0000-000000000001" + ] + } + ] + }, + { + "type": "Container", + "id": "expandable-00000000-0000-0000-0000-000000000001", + "items": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "**Result Message**", + "wrap": true + }, + { + "type": "Container", + "style": "emphasis", + "items": [ + { + "type": "RichTextBlock", + "inlines": [ + { + "type": "TextRun", + "text": "Test error message", + "fontType": "Monospace" + } + ] + } + ] + }, + { + "type": "TextBlock", + "text": "\ud83d\udd0e **Test Results Sample**", + "wrap": true + }, + { + "type": "Container", + "style": "emphasis", + "items": [ + { + "type": "RichTextBlock", + "inlines": [ + { + "type": "TextRun", + "text": "{\n \"column1\": \"value1\",\n \"column2\": \"value2\"\n}", + "fontType": "Monospace" + } + ] + } + ] + } + ] + } + ], + "isVisible": false + } + ] + } + ], + "version": "1.6" +} 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 new file mode 100644 index 000000000..0216128df --- /dev/null +++ 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 @@ -0,0 +1,30 @@ +{ + "type": "AdaptiveCard", + "body": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "Container", + "items": [ + { + "type": "TextBlock", + "text": "Failure: \"test_short_name\" test failed on ", + "weight": "bolder", + "size": "large", + "wrap": true + } + ], + "style": "Attention" + }, + { + "type": "TextBlock", + "text": "**Test:** test_short_name | **Status:** fail | **Time:** N/A", + "wrap": true + } + ] + } + ], + "version": "1.6" +} 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 new file mode 100644 index 000000000..a710705bc --- /dev/null +++ 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 @@ -0,0 +1,144 @@ +{ + "type": "AdaptiveCard", + "body": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "Container", + "items": [ + { + "type": "TextBlock", + "text": "Failure: \"test_short_name\" test failed on test_table", + "weight": "bolder", + "size": "large", + "wrap": true + } + ], + "style": "Attention" + }, + { + "type": "TextBlock", + "text": "**Test:** test_short_name | **Status:** fail | **Time:** N/A", + "wrap": true + }, + { + "type": "TextBlock", + "text": "[View in Elementary](http://test.com)", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "\u2139\ufe0f **Details**", + "wrap": true + }, + { + "type": "FactSet", + "facts": [ + { + "title": "Table", + "value": "test_table" + }, + { + "title": "Tags", + "value": "tag1, tag2" + }, + { + "title": "Owners", + "value": "owner1, owner2" + }, + { + "title": "Subscribers", + "value": "_No subscribers_" + }, + { + "title": "Description", + "value": "Test description" + } + ] + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "ActionSet", + "actions": [ + { + "type": "Action.ToggleVisibility", + "title": "Test Result", + "targetElements": [ + "expandable-00000000-0000-0000-0000-000000000001" + ] + } + ] + }, + { + "type": "Container", + "id": "expandable-00000000-0000-0000-0000-000000000001", + "items": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "**Result Message**", + "wrap": true + }, + { + "type": "Container", + "style": "emphasis", + "items": [ + { + "type": "RichTextBlock", + "inlines": [ + { + "type": "TextRun", + "text": "Test error message", + "fontType": "Monospace" + } + ] + } + ] + }, + { + "type": "TextBlock", + "text": "\ud83d\udd0e **Test Results Sample**", + "wrap": true + }, + { + "type": "Container", + "style": "emphasis", + "items": [ + { + "type": "RichTextBlock", + "inlines": [ + { + "type": "TextRun", + "text": "{\n \"column1\": \"value1\",\n \"column2\": \"value2\"\n}", + "fontType": "Monospace" + } + ] + } + ] + } + ] + } + ], + "isVisible": false + } + ] + } + ], + "version": "1.6" +} 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 new file mode 100644 index 000000000..4035125ce --- /dev/null +++ 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 @@ -0,0 +1,119 @@ +{ + "type": "AdaptiveCard", + "body": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "Container", + "items": [ + { + "type": "TextBlock", + "text": "Warning: \"test_short_name\" test failed on test_table", + "weight": "bolder", + "size": "large", + "wrap": true + } + ], + "style": "Warning" + }, + { + "type": "TextBlock", + "text": "**Test:** test_short_name | **Status:** warn | **Time:** N/A", + "wrap": true + }, + { + "type": "TextBlock", + "text": "[View in Elementary](http://test.com)", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "\u2139\ufe0f **Details**", + "wrap": true + }, + { + "type": "FactSet", + "facts": [ + { + "title": "Table", + "value": "test_table" + }, + { + "title": "Tags", + "value": "tag1, tag2" + }, + { + "title": "Owners", + "value": "_No owners_" + }, + { + "title": "Subscribers", + "value": "_No subscribers_" + } + ] + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "ActionSet", + "actions": [ + { + "type": "Action.ToggleVisibility", + "title": "Test Result", + "targetElements": [ + "expandable-00000000-0000-0000-0000-000000000001" + ] + } + ] + }, + { + "type": "Container", + "id": "expandable-00000000-0000-0000-0000-000000000001", + "items": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "\ud83d\udd0e **Test Results Sample**", + "wrap": true + }, + { + "type": "Container", + "style": "emphasis", + "items": [ + { + "type": "RichTextBlock", + "inlines": [ + { + "type": "TextRun", + "text": "{\n \"column1\": \"value1\",\n \"column2\": \"value2\"\n}", + "fontType": "Monospace" + } + ] + } + ] + } + ] + } + ], + "isVisible": false + } + ] + } + ], + "version": "1.6" +} 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 new file mode 100644 index 000000000..e6559fd32 --- /dev/null +++ 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 @@ -0,0 +1,144 @@ +{ + "type": "AdaptiveCard", + "body": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "Container", + "items": [ + { + "type": "TextBlock", + "text": "Warning: \"test_short_name\" test failed on test_table", + "weight": "bolder", + "size": "large", + "wrap": true + } + ], + "style": "Warning" + }, + { + "type": "TextBlock", + "text": "**Test:** test_short_name | **Env:** Test Env | **Status:** warn | **Time:** N/A", + "wrap": true + }, + { + "type": "TextBlock", + "text": "[View in Elementary](http://test.com)", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "\u2139\ufe0f **Details**", + "wrap": true + }, + { + "type": "FactSet", + "facts": [ + { + "title": "Table", + "value": "test_table" + }, + { + "title": "Tags", + "value": "tag1, tag2" + }, + { + "title": "Owners", + "value": "owner1, owner2" + }, + { + "title": "Subscribers", + "value": "_No subscribers_" + }, + { + "title": "Description", + "value": "Test description" + } + ] + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "ActionSet", + "actions": [ + { + "type": "Action.ToggleVisibility", + "title": "Test Result", + "targetElements": [ + "expandable-00000000-0000-0000-0000-000000000001" + ] + } + ] + }, + { + "type": "Container", + "id": "expandable-00000000-0000-0000-0000-000000000001", + "items": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "**Result Message**", + "wrap": true + }, + { + "type": "Container", + "style": "emphasis", + "items": [ + { + "type": "RichTextBlock", + "inlines": [ + { + "type": "TextRun", + "text": "Test error message", + "fontType": "Monospace" + } + ] + } + ] + }, + { + "type": "TextBlock", + "text": "\ud83d\udd0e **Test Results Sample**", + "wrap": true + }, + { + "type": "Container", + "style": "emphasis", + "items": [ + { + "type": "RichTextBlock", + "inlines": [ + { + "type": "TextRun", + "text": "{\n \"column1\": \"value1\",\n \"column2\": \"value2\"\n}", + "fontType": "Monospace" + } + ] + } + ] + } + ] + } + ], + "isVisible": false + } + ] + } + ], + "version": "1.6" +} 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 new file mode 100644 index 000000000..660cd10e2 --- /dev/null +++ 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 @@ -0,0 +1,30 @@ +{ + "type": "AdaptiveCard", + "body": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "Container", + "items": [ + { + "type": "TextBlock", + "text": "Generic on ", + "weight": "bolder", + "size": "large", + "wrap": true + } + ], + "style": "Default" + }, + { + "type": "TextBlock", + "text": "**Test:** test_short_name | **Status:** Unknown | **Time:** N/A", + "wrap": true + } + ] + } + ], + "version": "1.6" +} 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 new file mode 100644 index 000000000..7ae53ecae --- /dev/null +++ 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 @@ -0,0 +1,135 @@ +{ + "type": "AdaptiveCard", + "body": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "Container", + "items": [ + { + "type": "TextBlock", + "text": "\"test_short_name\" test failed on ", + "weight": "bolder", + "size": "large", + "wrap": true + } + ], + "style": "Default" + }, + { + "type": "TextBlock", + "text": "**Test:** test_short_name | **Env:** Test Env | **Status:** Unknown | **Time:** N/A", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "\u2139\ufe0f **Details**", + "wrap": true + }, + { + "type": "FactSet", + "facts": [ + { + "title": "Tags", + "value": "_No tags_" + }, + { + "title": "Owners", + "value": "owner1, owner2" + }, + { + "title": "Subscribers", + "value": "_No subscribers_" + }, + { + "title": "Description", + "value": "Test description" + } + ] + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "ActionSet", + "actions": [ + { + "type": "Action.ToggleVisibility", + "title": "Test Result", + "targetElements": [ + "expandable-00000000-0000-0000-0000-000000000001" + ] + } + ] + }, + { + "type": "Container", + "id": "expandable-00000000-0000-0000-0000-000000000001", + "items": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "**Result Message**", + "wrap": true + }, + { + "type": "Container", + "style": "emphasis", + "items": [ + { + "type": "RichTextBlock", + "inlines": [ + { + "type": "TextRun", + "text": "Test error message", + "fontType": "Monospace" + } + ] + } + ] + }, + { + "type": "TextBlock", + "text": "**Anomalous Values**", + "wrap": true + }, + { + "type": "Container", + "style": "emphasis", + "items": [ + { + "type": "RichTextBlock", + "inlines": [ + { + "type": "TextRun", + "text": "{\n \"anomalous_value\": 42\n}", + "fontType": "Monospace" + } + ] + } + ] + } + ] + } + ], + "isVisible": false + } + ] + } + ], + "version": "1.6" +} 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 new file mode 100644 index 000000000..391268074 --- /dev/null +++ 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 @@ -0,0 +1,207 @@ +{ + "type": "AdaptiveCard", + "body": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "Container", + "items": [ + { + "type": "TextBlock", + "text": "\"test_short_name\" test failed on test_table", + "weight": "bolder", + "size": "large", + "wrap": true + } + ], + "style": "Default" + }, + { + "type": "TextBlock", + "text": "**Test:** test_short_name | **Env:** Test Env | **Status:** Unknown | **Time:** N/A", + "wrap": true + }, + { + "type": "TextBlock", + "text": "[View in Elementary](http://test.com)", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "\u2139\ufe0f **Details**", + "wrap": true + }, + { + "type": "FactSet", + "facts": [ + { + "title": "Table", + "value": "test_table" + }, + { + "title": "Tags", + "value": "tag1, tag2" + }, + { + "title": "Owners", + "value": "_No owners_" + }, + { + "title": "Subscribers", + "value": "_No subscribers_" + } + ] + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "ActionSet", + "actions": [ + { + "type": "Action.ToggleVisibility", + "title": "Test Result", + "targetElements": [ + "expandable-00000000-0000-0000-0000-000000000001" + ] + } + ] + }, + { + "type": "Container", + "id": "expandable-00000000-0000-0000-0000-000000000001", + "items": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "\ud83d\udd0e **Test Results Sample**", + "wrap": true + }, + { + "type": "Container", + "style": "emphasis", + "items": [ + { + "type": "RichTextBlock", + "inlines": [ + { + "type": "TextRun", + "text": "{\n \"column1\": \"value1\",\n \"column2\": \"value2\"\n}", + "fontType": "Monospace" + } + ] + } + ] + }, + { + "type": "TextBlock", + "text": "**Test Results Query**", + "wrap": true + }, + { + "type": "Container", + "style": "emphasis", + "items": [ + { + "type": "RichTextBlock", + "inlines": [ + { + "type": "TextRun", + "text": "SELECT * FROM test", + "fontType": "Monospace" + } + ] + } + ] + }, + { + "type": "TextBlock", + "text": "**Anomalous Values**", + "wrap": true + }, + { + "type": "Container", + "style": "emphasis", + "items": [ + { + "type": "RichTextBlock", + "inlines": [ + { + "type": "TextRun", + "text": "{\n \"anomalous_value\": 42\n}", + "fontType": "Monospace" + } + ] + } + ] + } + ] + } + ], + "isVisible": false + }, + { + "type": "ActionSet", + "actions": [ + { + "type": "Action.ToggleVisibility", + "title": "Test Configuration", + "targetElements": [ + "expandable-00000000-0000-0000-0000-000000000002" + ] + } + ] + }, + { + "type": "Container", + "id": "expandable-00000000-0000-0000-0000-000000000002", + "items": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "\ud83d\udee0\ufe0f **Test Parameters**", + "wrap": true + }, + { + "type": "Container", + "style": "emphasis", + "items": [ + { + "type": "RichTextBlock", + "inlines": [ + { + "type": "TextRun", + "text": "{\n \"param1\": \"value1\"\n}", + "fontType": "Monospace" + } + ] + } + ] + } + ] + } + ], + "isVisible": false + } + ] + } + ], + "version": "1.6" +} 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 new file mode 100644 index 000000000..328de4226 --- /dev/null +++ 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 @@ -0,0 +1,185 @@ +{ + "type": "AdaptiveCard", + "body": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "Container", + "items": [ + { + "type": "TextBlock", + "text": "Generic on test_table", + "weight": "bolder", + "size": "large", + "wrap": true + } + ], + "style": "Attention" + }, + { + "type": "TextBlock", + "text": "**Test:** test_short_name | **Env:** Test Env | **Status:** error | **Time:** N/A", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "\u2139\ufe0f **Details**", + "wrap": true + }, + { + "type": "FactSet", + "facts": [ + { + "title": "Table", + "value": "test_table" + }, + { + "title": "Tags", + "value": "tag1, tag2" + }, + { + "title": "Owners", + "value": "_No owners_" + }, + { + "title": "Subscribers", + "value": "_No subscribers_" + }, + { + "title": "Description", + "value": "Test description" + } + ] + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "ActionSet", + "actions": [ + { + "type": "Action.ToggleVisibility", + "title": "Test Result", + "targetElements": [ + "expandable-00000000-0000-0000-0000-000000000001" + ] + } + ] + }, + { + "type": "Container", + "id": "expandable-00000000-0000-0000-0000-000000000001", + "items": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "\ud83d\udd0e **Test Results Sample**", + "wrap": true + }, + { + "type": "Container", + "style": "emphasis", + "items": [ + { + "type": "RichTextBlock", + "inlines": [ + { + "type": "TextRun", + "text": "{\n \"column1\": \"value1\",\n \"column2\": \"value2\"\n}", + "fontType": "Monospace" + } + ] + } + ] + }, + { + "type": "TextBlock", + "text": "**Test Results Query**", + "wrap": true + }, + { + "type": "Container", + "style": "emphasis", + "items": [ + { + "type": "RichTextBlock", + "inlines": [ + { + "type": "TextRun", + "text": "SELECT * FROM test", + "fontType": "Monospace" + } + ] + } + ] + } + ] + } + ], + "isVisible": false + }, + { + "type": "ActionSet", + "actions": [ + { + "type": "Action.ToggleVisibility", + "title": "Test Configuration", + "targetElements": [ + "expandable-00000000-0000-0000-0000-000000000002" + ] + } + ] + }, + { + "type": "Container", + "id": "expandable-00000000-0000-0000-0000-000000000002", + "items": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "\ud83d\udee0\ufe0f **Test Parameters**", + "wrap": true + }, + { + "type": "Container", + "style": "emphasis", + "items": [ + { + "type": "RichTextBlock", + "inlines": [ + { + "type": "TextRun", + "text": "{\n \"param1\": \"value1\"\n}", + "fontType": "Monospace" + } + ] + } + ] + } + ] + } + ], + "isVisible": false + } + ] + } + ], + "version": "1.6" +} 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 new file mode 100644 index 000000000..140aaee5d --- /dev/null +++ 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 @@ -0,0 +1,140 @@ +{ + "type": "AdaptiveCard", + "body": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "Container", + "items": [ + { + "type": "TextBlock", + "text": "Error: \"test_short_name\" test failed on ", + "weight": "bolder", + "size": "large", + "wrap": true + } + ], + "style": "Attention" + }, + { + "type": "TextBlock", + "text": "**Test:** test_short_name | **Env:** Test Env | **Status:** error | **Time:** N/A", + "wrap": true + }, + { + "type": "TextBlock", + "text": "[View in Elementary](http://test.com)", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "\u2139\ufe0f **Details**", + "wrap": true + }, + { + "type": "FactSet", + "facts": [ + { + "title": "Tags", + "value": "_No tags_" + }, + { + "title": "Owners", + "value": "_No owners_" + }, + { + "title": "Subscribers", + "value": "_No subscribers_" + }, + { + "title": "Description", + "value": "Test description" + } + ] + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "ActionSet", + "actions": [ + { + "type": "Action.ToggleVisibility", + "title": "Test Result", + "targetElements": [ + "expandable-00000000-0000-0000-0000-000000000001" + ] + } + ] + }, + { + "type": "Container", + "id": "expandable-00000000-0000-0000-0000-000000000001", + "items": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "**Result Message**", + "wrap": true + }, + { + "type": "Container", + "style": "emphasis", + "items": [ + { + "type": "RichTextBlock", + "inlines": [ + { + "type": "TextRun", + "text": "Test error message", + "fontType": "Monospace" + } + ] + } + ] + }, + { + "type": "TextBlock", + "text": "**Anomalous Values**", + "wrap": true + }, + { + "type": "Container", + "style": "emphasis", + "items": [ + { + "type": "RichTextBlock", + "inlines": [ + { + "type": "TextRun", + "text": "{\n \"anomalous_value\": 42\n}", + "fontType": "Monospace" + } + ] + } + ] + } + ] + } + ], + "isVisible": false + } + ] + } + ], + "version": "1.6" +} 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 new file mode 100644 index 000000000..68d804c5d --- /dev/null +++ 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 @@ -0,0 +1,30 @@ +{ + "type": "AdaptiveCard", + "body": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "Container", + "items": [ + { + "type": "TextBlock", + "text": "Generic on ", + "weight": "bolder", + "size": "large", + "wrap": true + } + ], + "style": "Attention" + }, + { + "type": "TextBlock", + "text": "**Test:** test_short_name | **Status:** fail | **Time:** N/A", + "wrap": true + } + ] + } + ], + "version": "1.6" +} 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 new file mode 100644 index 000000000..4f5797633 --- /dev/null +++ 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 @@ -0,0 +1,232 @@ +{ + "type": "AdaptiveCard", + "body": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "Container", + "items": [ + { + "type": "TextBlock", + "text": "Failure: \"test_short_name\" test failed on test_table", + "weight": "bolder", + "size": "large", + "wrap": true + } + ], + "style": "Attention" + }, + { + "type": "TextBlock", + "text": "**Test:** test_short_name | **Env:** Test Env | **Status:** fail | **Time:** N/A", + "wrap": true + }, + { + "type": "TextBlock", + "text": "[View in Elementary](http://test.com)", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "\u2139\ufe0f **Details**", + "wrap": true + }, + { + "type": "FactSet", + "facts": [ + { + "title": "Table", + "value": "test_table" + }, + { + "title": "Tags", + "value": "tag1, tag2" + }, + { + "title": "Owners", + "value": "owner1, owner2" + }, + { + "title": "Subscribers", + "value": "_No subscribers_" + }, + { + "title": "Description", + "value": "Test description" + } + ] + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "ActionSet", + "actions": [ + { + "type": "Action.ToggleVisibility", + "title": "Test Result", + "targetElements": [ + "expandable-00000000-0000-0000-0000-000000000001" + ] + } + ] + }, + { + "type": "Container", + "id": "expandable-00000000-0000-0000-0000-000000000001", + "items": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "**Result Message**", + "wrap": true + }, + { + "type": "Container", + "style": "emphasis", + "items": [ + { + "type": "RichTextBlock", + "inlines": [ + { + "type": "TextRun", + "text": "Test error message", + "fontType": "Monospace" + } + ] + } + ] + }, + { + "type": "TextBlock", + "text": "\ud83d\udd0e **Test Results Sample**", + "wrap": true + }, + { + "type": "Container", + "style": "emphasis", + "items": [ + { + "type": "RichTextBlock", + "inlines": [ + { + "type": "TextRun", + "text": "{\n \"column1\": \"value1\",\n \"column2\": \"value2\"\n}", + "fontType": "Monospace" + } + ] + } + ] + }, + { + "type": "TextBlock", + "text": "**Test Results Query**", + "wrap": true + }, + { + "type": "Container", + "style": "emphasis", + "items": [ + { + "type": "RichTextBlock", + "inlines": [ + { + "type": "TextRun", + "text": "SELECT * FROM test", + "fontType": "Monospace" + } + ] + } + ] + }, + { + "type": "TextBlock", + "text": "**Anomalous Values**", + "wrap": true + }, + { + "type": "Container", + "style": "emphasis", + "items": [ + { + "type": "RichTextBlock", + "inlines": [ + { + "type": "TextRun", + "text": "{\n \"anomalous_value\": 42\n}", + "fontType": "Monospace" + } + ] + } + ] + } + ] + } + ], + "isVisible": false + }, + { + "type": "ActionSet", + "actions": [ + { + "type": "Action.ToggleVisibility", + "title": "Test Configuration", + "targetElements": [ + "expandable-00000000-0000-0000-0000-000000000002" + ] + } + ] + }, + { + "type": "Container", + "id": "expandable-00000000-0000-0000-0000-000000000002", + "items": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "\ud83d\udee0\ufe0f **Test Parameters**", + "wrap": true + }, + { + "type": "Container", + "style": "emphasis", + "items": [ + { + "type": "RichTextBlock", + "inlines": [ + { + "type": "TextRun", + "text": "{\n \"param1\": \"value1\"\n}", + "fontType": "Monospace" + } + ] + } + ] + } + ] + } + ], + "isVisible": false + } + ] + } + ], + "version": "1.6" +} 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 new file mode 100644 index 000000000..a51f1951b --- /dev/null +++ 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 @@ -0,0 +1,135 @@ +{ + "type": "AdaptiveCard", + "body": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "Container", + "items": [ + { + "type": "TextBlock", + "text": "Warning: \"test_short_name\" test failed on ", + "weight": "bolder", + "size": "large", + "wrap": true + } + ], + "style": "Warning" + }, + { + "type": "TextBlock", + "text": "**Test:** test_short_name | **Status:** warn | **Time:** N/A", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "\u2139\ufe0f **Details**", + "wrap": true + }, + { + "type": "FactSet", + "facts": [ + { + "title": "Tags", + "value": "_No tags_" + }, + { + "title": "Owners", + "value": "owner1, owner2" + }, + { + "title": "Subscribers", + "value": "_No subscribers_" + }, + { + "title": "Description", + "value": "Test description" + } + ] + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "ActionSet", + "actions": [ + { + "type": "Action.ToggleVisibility", + "title": "Test Result", + "targetElements": [ + "expandable-00000000-0000-0000-0000-000000000001" + ] + } + ] + }, + { + "type": "Container", + "id": "expandable-00000000-0000-0000-0000-000000000001", + "items": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "**Result Message**", + "wrap": true + }, + { + "type": "Container", + "style": "emphasis", + "items": [ + { + "type": "RichTextBlock", + "inlines": [ + { + "type": "TextRun", + "text": "Test error message", + "fontType": "Monospace" + } + ] + } + ] + }, + { + "type": "TextBlock", + "text": "**Anomalous Values**", + "wrap": true + }, + { + "type": "Container", + "style": "emphasis", + "items": [ + { + "type": "RichTextBlock", + "inlines": [ + { + "type": "TextRun", + "text": "{\n \"anomalous_value\": 42\n}", + "fontType": "Monospace" + } + ] + } + ] + } + ] + } + ], + "isVisible": false + } + ] + } + ], + "version": "1.6" +} 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 new file mode 100644 index 000000000..63e26a871 --- /dev/null +++ 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 @@ -0,0 +1,186 @@ +{ + "type": "AdaptiveCard", + "body": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "Container", + "items": [ + { + "type": "TextBlock", + "text": "Generic on test_table", + "weight": "bolder", + "size": "large", + "wrap": true + } + ], + "style": "Warning" + }, + { + "type": "TextBlock", + "text": "**Test:** test_short_name | **Env:** Test Env | **Status:** warn | **Time:** N/A", + "wrap": true + }, + { + "type": "TextBlock", + "text": "[View in Elementary](http://test.com)", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "\u2139\ufe0f **Details**", + "wrap": true + }, + { + "type": "FactSet", + "facts": [ + { + "title": "Table", + "value": "test_table" + }, + { + "title": "Tags", + "value": "tag1, tag2" + }, + { + "title": "Owners", + "value": "_No owners_" + }, + { + "title": "Subscribers", + "value": "_No subscribers_" + } + ] + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "ActionSet", + "actions": [ + { + "type": "Action.ToggleVisibility", + "title": "Test Result", + "targetElements": [ + "expandable-00000000-0000-0000-0000-000000000001" + ] + } + ] + }, + { + "type": "Container", + "id": "expandable-00000000-0000-0000-0000-000000000001", + "items": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "\ud83d\udd0e **Test Results Sample**", + "wrap": true + }, + { + "type": "Container", + "style": "emphasis", + "items": [ + { + "type": "RichTextBlock", + "inlines": [ + { + "type": "TextRun", + "text": "{\n \"column1\": \"value1\",\n \"column2\": \"value2\"\n}", + "fontType": "Monospace" + } + ] + } + ] + }, + { + "type": "TextBlock", + "text": "**Test Results Query**", + "wrap": true + }, + { + "type": "Container", + "style": "emphasis", + "items": [ + { + "type": "RichTextBlock", + "inlines": [ + { + "type": "TextRun", + "text": "SELECT * FROM test", + "fontType": "Monospace" + } + ] + } + ] + } + ] + } + ], + "isVisible": false + }, + { + "type": "ActionSet", + "actions": [ + { + "type": "Action.ToggleVisibility", + "title": "Test Configuration", + "targetElements": [ + "expandable-00000000-0000-0000-0000-000000000002" + ] + } + ] + }, + { + "type": "Container", + "id": "expandable-00000000-0000-0000-0000-000000000002", + "items": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "\ud83d\udee0\ufe0f **Test Parameters**", + "wrap": true + }, + { + "type": "Container", + "style": "emphasis", + "items": [ + { + "type": "RichTextBlock", + "inlines": [ + { + "type": "TextRun", + "text": "{\n \"param1\": \"value1\"\n}", + "fontType": "Monospace" + } + ] + } + ] + } + ] + } + ], + "isVisible": false + } + ] + } + ], + "version": "1.6" +} 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 new file mode 100644 index 000000000..130b936cc --- /dev/null +++ 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 @@ -0,0 +1,180 @@ +{ + "type": "AdaptiveCard", + "body": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "Container", + "items": [ + { + "type": "TextBlock", + "text": "Error: test_model_unique_id: 20 issues detected", + "weight": "bolder", + "size": "large", + "wrap": true + } + ], + "style": "Attention" + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **Test Warnings:** 10 | \u2757 **Test Errors:** 10", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "\u2139\ufe0f **Details**", + "wrap": true + }, + { + "type": "FactSet", + "facts": [ + { + "title": "Tags", + "value": "tag1" + }, + { + "title": "Owners", + "value": "owner1, owner2" + }, + { + "title": "Subscribers", + "value": "_No subscribers_" + } + ] + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "**Test Warnings**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_1**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_2** - Owner: owner1", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_3** - Owners: owner1, owner2", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_4**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_5** - Owner: owner1", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_6** - Owners: owner1, owner2", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_7**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_8** - Owner: owner1", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_9** - Owners: owner1, owner2", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_10**", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "**Test Errors**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_1**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_2** - Owner: owner1", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_3** - Owners: owner1, owner2", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_4**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_5** - Owner: owner1", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_6** - Owners: owner1, owner2", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_7**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_8** - Owner: owner1", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_9** - Owners: owner1, owner2", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_10**", + "wrap": true + } + ] + } + ], + "version": "1.6" +} 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 new file mode 100644 index 000000000..fe98c0589 --- /dev/null +++ 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 @@ -0,0 +1,119 @@ +{ + "type": "AdaptiveCard", + "body": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "Container", + "items": [ + { + "type": "TextBlock", + "text": "Failure: test_model_unique_id: 10 issues detected", + "weight": "bolder", + "size": "large", + "wrap": true + } + ], + "style": "Default" + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **Test Failures:** 10", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "\u2139\ufe0f **Details**", + "wrap": true + }, + { + "type": "FactSet", + "facts": [ + { + "title": "Tags", + "value": "tag1" + }, + { + "title": "Owners", + "value": "owner1, owner2" + }, + { + "title": "Subscribers", + "value": "_No subscribers_" + } + ] + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "**Test Failures**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_1**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_2** - Owner: owner1", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_3** - Owners: owner1, owner2", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_4**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_5** - Owner: owner1", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_6** - Owners: owner1, owner2", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_7**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_8** - Owner: owner1", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_9** - Owners: owner1, owner2", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_10**", + "wrap": true + } + ] + } + ], + "version": "1.6" +} 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 new file mode 100644 index 000000000..b546479bf --- /dev/null +++ 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 @@ -0,0 +1,180 @@ +{ + "type": "AdaptiveCard", + "body": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "Container", + "items": [ + { + "type": "TextBlock", + "text": "Error: test_model_unique_id: 20 issues detected", + "weight": "bolder", + "size": "large", + "wrap": true + } + ], + "style": "Attention" + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **Test Failures:** 10 | \u2757 **Test Errors:** 10", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "\u2139\ufe0f **Details**", + "wrap": true + }, + { + "type": "FactSet", + "facts": [ + { + "title": "Tags", + "value": "tag1" + }, + { + "title": "Owners", + "value": "owner1, owner2" + }, + { + "title": "Subscribers", + "value": "_No subscribers_" + } + ] + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "**Test Failures**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_1**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_2** - Owner: owner1", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_3** - Owners: owner1, owner2", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_4**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_5** - Owner: owner1", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_6** - Owners: owner1, owner2", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_7**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_8** - Owner: owner1", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_9** - Owners: owner1, owner2", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_10**", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "**Test Errors**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_1**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_2** - Owner: owner1", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_3** - Owners: owner1, owner2", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_4**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_5** - Owner: owner1", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_6** - Owners: owner1, owner2", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_7**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_8** - Owner: owner1", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_9** - Owners: owner1, owner2", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_10**", + "wrap": true + } + ] + } + ], + "version": "1.6" +} 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 new file mode 100644 index 000000000..3ccdf3703 --- /dev/null +++ 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 @@ -0,0 +1,241 @@ +{ + "type": "AdaptiveCard", + "body": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "Container", + "items": [ + { + "type": "TextBlock", + "text": "Error: test_model_unique_id: 30 issues detected", + "weight": "bolder", + "size": "large", + "wrap": true + } + ], + "style": "Attention" + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **Test Failures:** 10 | \u26a0\ufe0f **Test Warnings:** 10 | \u2757 **Test Errors:** 10", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "\u2139\ufe0f **Details**", + "wrap": true + }, + { + "type": "FactSet", + "facts": [ + { + "title": "Tags", + "value": "tag1" + }, + { + "title": "Owners", + "value": "owner1, owner2" + }, + { + "title": "Subscribers", + "value": "_No subscribers_" + } + ] + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "**Test Failures**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_1** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_2** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_3** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_4** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_5** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_6** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_7** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_8** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_9** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_10** - [View Report](http://test.com)", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "**Test Warnings**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_1** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_2** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_3** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_4** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_5** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_6** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_7** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_8** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_9** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_10** - [View Report](http://test.com)", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "**Test Errors**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_1** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_2** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_3** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_4** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_5** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_6** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_7** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_8** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_9** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_10** - [View Report](http://test.com)", + "wrap": true + } + ] + } + ], + "version": "1.6" +} 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 new file mode 100644 index 000000000..f59888558 --- /dev/null +++ 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 @@ -0,0 +1,180 @@ +{ + "type": "AdaptiveCard", + "body": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "Container", + "items": [ + { + "type": "TextBlock", + "text": "Error: test_model_unique_id: 20 issues detected", + "weight": "bolder", + "size": "large", + "wrap": true + } + ], + "style": "Attention" + }, + { + "type": "TextBlock", + "text": "\u274c **Model Errors:** 10 | \u2757 **Test Errors:** 10", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "\u2139\ufe0f **Details**", + "wrap": true + }, + { + "type": "FactSet", + "facts": [ + { + "title": "Tags", + "value": "tag1" + }, + { + "title": "Owners", + "value": "owner1, owner2" + }, + { + "title": "Subscribers", + "value": "_No subscribers_" + } + ] + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "**Model Errors**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - Owner: owner1", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - Owners: owner1, owner2", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - Owner: owner1", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - Owners: owner1, owner2", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - Owner: owner1", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - Owners: owner1, owner2", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"**", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "**Test Errors**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_1**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_2** - Owner: owner1", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_3** - Owners: owner1, owner2", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_4**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_5** - Owner: owner1", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_6** - Owners: owner1, owner2", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_7**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_8** - Owner: owner1", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_9** - Owners: owner1, owner2", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_10**", + "wrap": true + } + ] + } + ], + "version": "1.6" +} 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 new file mode 100644 index 000000000..98434261a --- /dev/null +++ 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 @@ -0,0 +1,180 @@ +{ + "type": "AdaptiveCard", + "body": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "Container", + "items": [ + { + "type": "TextBlock", + "text": "Error: test_model_unique_id: 20 issues detected", + "weight": "bolder", + "size": "large", + "wrap": true + } + ], + "style": "Attention" + }, + { + "type": "TextBlock", + "text": "\u274c **Model Errors:** 10 | \u26a0\ufe0f **Test Warnings:** 10", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "\u2139\ufe0f **Details**", + "wrap": true + }, + { + "type": "FactSet", + "facts": [ + { + "title": "Tags", + "value": "tag1" + }, + { + "title": "Owners", + "value": "owner1, owner2" + }, + { + "title": "Subscribers", + "value": "_No subscribers_" + } + ] + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "**Model Errors**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - [View Report](http://test.com)", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "**Test Warnings**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_1** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_2** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_3** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_4** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_5** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_6** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_7** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_8** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_9** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_10** - [View Report](http://test.com)", + "wrap": true + } + ] + } + ], + "version": "1.6" +} 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 new file mode 100644 index 000000000..c7b89f49a --- /dev/null +++ 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 @@ -0,0 +1,241 @@ +{ + "type": "AdaptiveCard", + "body": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "Container", + "items": [ + { + "type": "TextBlock", + "text": "Error: test_model_unique_id: 30 issues detected", + "weight": "bolder", + "size": "large", + "wrap": true + } + ], + "style": "Attention" + }, + { + "type": "TextBlock", + "text": "\u274c **Model Errors:** 10 | \u26a0\ufe0f **Test Warnings:** 10 | \u2757 **Test Errors:** 10", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "\u2139\ufe0f **Details**", + "wrap": true + }, + { + "type": "FactSet", + "facts": [ + { + "title": "Tags", + "value": "tag1" + }, + { + "title": "Owners", + "value": "owner1, owner2" + }, + { + "title": "Subscribers", + "value": "_No subscribers_" + } + ] + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "**Model Errors**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - [View Report](http://test.com)", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "**Test Warnings**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_1** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_2** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_3** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_4** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_5** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_6** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_7** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_8** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_9** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_10** - [View Report](http://test.com)", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "**Test Errors**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_1** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_2** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_3** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_4** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_5** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_6** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_7** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_8** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_9** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_10** - [View Report](http://test.com)", + "wrap": true + } + ] + } + ], + "version": "1.6" +} 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 new file mode 100644 index 000000000..67f59297b --- /dev/null +++ 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 @@ -0,0 +1,241 @@ +{ + "type": "AdaptiveCard", + "body": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "Container", + "items": [ + { + "type": "TextBlock", + "text": "Error: test_model_unique_id: 30 issues detected", + "weight": "bolder", + "size": "large", + "wrap": true + } + ], + "style": "Attention" + }, + { + "type": "TextBlock", + "text": "\u274c **Model Errors:** 10 | \ud83d\udd3a **Test Failures:** 10 | \u2757 **Test Errors:** 10", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "\u2139\ufe0f **Details**", + "wrap": true + }, + { + "type": "FactSet", + "facts": [ + { + "title": "Tags", + "value": "tag1" + }, + { + "title": "Owners", + "value": "owner1, owner2" + }, + { + "title": "Subscribers", + "value": "_No subscribers_" + } + ] + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "**Model Errors**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - [View Report](http://test.com)", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "**Test Failures**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_1** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_2** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_3** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_4** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_5** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_6** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_7** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_8** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_9** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_10** - [View Report](http://test.com)", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "**Test Errors**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_1** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_2** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_3** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_4** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_5** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_6** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_7** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_8** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_9** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_10** - [View Report](http://test.com)", + "wrap": true + } + ] + } + ], + "version": "1.6" +} 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 new file mode 100644 index 000000000..0c2235940 --- /dev/null +++ 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 @@ -0,0 +1,241 @@ +{ + "type": "AdaptiveCard", + "body": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "Container", + "items": [ + { + "type": "TextBlock", + "text": "Error: test_model_unique_id: 30 issues detected", + "weight": "bolder", + "size": "large", + "wrap": true + } + ], + "style": "Attention" + }, + { + "type": "TextBlock", + "text": "\u274c **Model Errors:** 10 | \ud83d\udd3a **Test Failures:** 10 | \u26a0\ufe0f **Test Warnings:** 10", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "\u2139\ufe0f **Details**", + "wrap": true + }, + { + "type": "FactSet", + "facts": [ + { + "title": "Tags", + "value": "tag1" + }, + { + "title": "Owners", + "value": "owner1, owner2" + }, + { + "title": "Subscribers", + "value": "_No subscribers_" + } + ] + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "**Model Errors**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - [View Report](http://test.com)", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "**Test Failures**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_1** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_2** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_3** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_4** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_5** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_6** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_7** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_8** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_9** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_10** - [View Report](http://test.com)", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "**Test Warnings**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_1** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_2** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_3** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_4** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_5** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_6** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_7** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_8** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_9** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_10** - [View Report](http://test.com)", + "wrap": true + } + ] + } + ], + "version": "1.6" +} 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 new file mode 100644 index 000000000..049f0b0a1 --- /dev/null +++ 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 @@ -0,0 +1,302 @@ +{ + "type": "AdaptiveCard", + "body": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "Container", + "items": [ + { + "type": "TextBlock", + "text": "Error: test_model_unique_id: 40 issues detected", + "weight": "bolder", + "size": "large", + "wrap": true + } + ], + "style": "Attention" + }, + { + "type": "TextBlock", + "text": "\u274c **Model Errors:** 10 | \ud83d\udd3a **Test Failures:** 10 | \u26a0\ufe0f **Test Warnings:** 10 | \u2757 **Test Errors:** 10", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "\u2139\ufe0f **Details**", + "wrap": true + }, + { + "type": "FactSet", + "facts": [ + { + "title": "Tags", + "value": "tag1" + }, + { + "title": "Owners", + "value": "owner1, owner2" + }, + { + "title": "Subscribers", + "value": "_No subscribers_" + } + ] + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "**Model Errors**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u274c **dbt failed to build table \"test_model\"** - [View Report](http://test.com)", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "**Test Failures**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_1** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_2** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_3** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_4** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_5** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_6** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_7** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_8** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_9** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\ud83d\udd3a **\"test_short_name\" test failed on test_table_10** - [View Report](http://test.com)", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "**Test Warnings**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_1** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_2** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_3** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_4** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_5** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_6** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_7** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_8** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_9** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u26a0\ufe0f **\"test_short_name\" test failed on test_table_10** - [View Report](http://test.com)", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "**Test Errors**", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_1** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_2** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_3** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_4** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_5** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_6** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_7** - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_8** - Owner: owner1 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_9** - Owners: owner1, owner2 - [View Report](http://test.com)", + "wrap": true + }, + { + "type": "TextBlock", + "text": "\u2757 **\"test_short_name\" test failed on test_table_10** - [View Report](http://test.com)", + "wrap": true + } + ] + } + ], + "version": "1.6" +} 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 new file mode 100644 index 000000000..0ef85a2cb --- /dev/null +++ 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 @@ -0,0 +1,106 @@ +{ + "type": "AdaptiveCard", + "body": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "Container", + "items": [ + { + "type": "TextBlock", + "text": "dbt failed to build table \"test_model\"", + "weight": "bolder", + "size": "large", + "wrap": true + } + ], + "style": "Default" + }, + { + "type": "TextBlock", + "text": "**Model:** test_model | **Env:** Test Env | **Status:** Unknown | **Time:** 2025-02-03 13:21:07 UTC | **Suppression interval:** 24", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "\u2139\ufe0f **Details**", + "wrap": true + }, + { + "type": "FactSet", + "facts": [ + { + "title": "Tags", + "value": "_No tags_" + }, + { + "title": "Owners", + "value": "owner1, owner2" + }, + { + "title": "Subscribers", + "value": "_No subscribers_" + }, + { + "title": "Path", + "value": "unknown_path" + } + ] + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "ActionSet", + "actions": [ + { + "type": "Action.ToggleVisibility", + "title": "Model Configuration", + "targetElements": [ + "expandable-00000000-0000-0000-0000-000000000001" + ] + } + ] + }, + { + "type": "Container", + "id": "expandable-00000000-0000-0000-0000-000000000001", + "items": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "FactSet", + "facts": [ + { + "title": "Materialization", + "value": "table" + }, + { + "title": "Full Refresh", + "value": "Yes" + } + ] + } + ] + } + ], + "isVisible": true + } + ] + } + ], + "version": "1.6" +} 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 new file mode 100644 index 000000000..9934ea69c --- /dev/null +++ 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 @@ -0,0 +1,111 @@ +{ + "type": "AdaptiveCard", + "body": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "Container", + "items": [ + { + "type": "TextBlock", + "text": "dbt failed to build table \"test_model\"", + "weight": "bolder", + "size": "large", + "wrap": true + } + ], + "style": "Default" + }, + { + "type": "TextBlock", + "text": "**Model:** test_model | **Env:** Test Env | **Status:** Unknown | **Time:** 2025-02-03 13:21:07 UTC | **Suppression interval:** 24", + "wrap": true + }, + { + "type": "TextBlock", + "text": "[View in Elementary](http://test.com)", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "\u2139\ufe0f **Details**", + "wrap": true + }, + { + "type": "FactSet", + "facts": [ + { + "title": "Tags", + "value": "_No tags_" + }, + { + "title": "Owners", + "value": "owner1, owner2" + }, + { + "title": "Subscribers", + "value": "_No subscribers_" + }, + { + "title": "Path", + "value": "models/test_model.sql" + } + ] + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "ActionSet", + "actions": [ + { + "type": "Action.ToggleVisibility", + "title": "Model Configuration", + "targetElements": [ + "expandable-00000000-0000-0000-0000-000000000001" + ] + } + ] + }, + { + "type": "Container", + "id": "expandable-00000000-0000-0000-0000-000000000001", + "items": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "FactSet", + "facts": [ + { + "title": "Materialization", + "value": "table" + }, + { + "title": "Full Refresh", + "value": "No" + } + ] + } + ] + } + ], + "isVisible": true + } + ] + } + ], + "version": "1.6" +} 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 new file mode 100644 index 000000000..44cb0efa1 --- /dev/null +++ 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 @@ -0,0 +1,106 @@ +{ + "type": "AdaptiveCard", + "body": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "Container", + "items": [ + { + "type": "TextBlock", + "text": "Error: dbt failed to build incremental \"test_model\"", + "weight": "bolder", + "size": "large", + "wrap": true + } + ], + "style": "Attention" + }, + { + "type": "TextBlock", + "text": "**Model:** test_model | **Status:** error | **Time:** 2025-02-03 13:21:07 UTC", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "\u2139\ufe0f **Details**", + "wrap": true + }, + { + "type": "FactSet", + "facts": [ + { + "title": "Tags", + "value": "tag1, tag2" + }, + { + "title": "Owners", + "value": "owner1, owner2" + }, + { + "title": "Subscribers", + "value": "_No subscribers_" + }, + { + "title": "Path", + "value": "models/test_model.sql" + } + ] + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "ActionSet", + "actions": [ + { + "type": "Action.ToggleVisibility", + "title": "Model Configuration", + "targetElements": [ + "expandable-00000000-0000-0000-0000-000000000001" + ] + } + ] + }, + { + "type": "Container", + "id": "expandable-00000000-0000-0000-0000-000000000001", + "items": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "FactSet", + "facts": [ + { + "title": "Materialization", + "value": "incremental" + }, + { + "title": "Full Refresh", + "value": "Yes" + } + ] + } + ] + } + ], + "isVisible": true + } + ] + } + ], + "version": "1.6" +} 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 new file mode 100644 index 000000000..0191c0a1f --- /dev/null +++ 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 @@ -0,0 +1,111 @@ +{ + "type": "AdaptiveCard", + "body": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "Container", + "items": [ + { + "type": "TextBlock", + "text": "Error: dbt failed to build view \"test_model\"", + "weight": "bolder", + "size": "large", + "wrap": true + } + ], + "style": "Attention" + }, + { + "type": "TextBlock", + "text": "**Model:** test_model | **Env:** Test Env | **Status:** error | **Time:** 2025-02-03 13:21:07 UTC | **Suppression interval:** 24", + "wrap": true + }, + { + "type": "TextBlock", + "text": "[View in Elementary](http://test.com)", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "\u2139\ufe0f **Details**", + "wrap": true + }, + { + "type": "FactSet", + "facts": [ + { + "title": "Tags", + "value": "tag1, tag2" + }, + { + "title": "Owners", + "value": "_No owners_" + }, + { + "title": "Subscribers", + "value": "_No subscribers_" + }, + { + "title": "Path", + "value": "unknown_path" + } + ] + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "ActionSet", + "actions": [ + { + "type": "Action.ToggleVisibility", + "title": "Model Configuration", + "targetElements": [ + "expandable-00000000-0000-0000-0000-000000000001" + ] + } + ] + }, + { + "type": "Container", + "id": "expandable-00000000-0000-0000-0000-000000000001", + "items": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "FactSet", + "facts": [ + { + "title": "Materialization", + "value": "view" + }, + { + "title": "Full Refresh", + "value": "Yes" + } + ] + } + ] + } + ], + "isVisible": true + } + ] + } + ], + "version": "1.6" +} 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 new file mode 100644 index 000000000..4d65c5e8d --- /dev/null +++ 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 @@ -0,0 +1,106 @@ +{ + "type": "AdaptiveCard", + "body": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "Container", + "items": [ + { + "type": "TextBlock", + "text": "Failure: dbt failed to build table \"test_model\"", + "weight": "bolder", + "size": "large", + "wrap": true + } + ], + "style": "Attention" + }, + { + "type": "TextBlock", + "text": "**Model:** test_model | **Status:** fail | **Time:** 2025-02-03 13:21:07 UTC", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "\u2139\ufe0f **Details**", + "wrap": true + }, + { + "type": "FactSet", + "facts": [ + { + "title": "Tags", + "value": "_No tags_" + }, + { + "title": "Owners", + "value": "_No owners_" + }, + { + "title": "Subscribers", + "value": "_No subscribers_" + }, + { + "title": "Path", + "value": "unknown_path" + } + ] + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "ActionSet", + "actions": [ + { + "type": "Action.ToggleVisibility", + "title": "Model Configuration", + "targetElements": [ + "expandable-00000000-0000-0000-0000-000000000001" + ] + } + ] + }, + { + "type": "Container", + "id": "expandable-00000000-0000-0000-0000-000000000001", + "items": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "FactSet", + "facts": [ + { + "title": "Materialization", + "value": "table" + }, + { + "title": "Full Refresh", + "value": "No" + } + ] + } + ] + } + ], + "isVisible": true + } + ] + } + ], + "version": "1.6" +} 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 new file mode 100644 index 000000000..5a11c86ee --- /dev/null +++ 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 @@ -0,0 +1,111 @@ +{ + "type": "AdaptiveCard", + "body": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "Container", + "items": [ + { + "type": "TextBlock", + "text": "Failure: dbt failed to build incremental \"test_model\"", + "weight": "bolder", + "size": "large", + "wrap": true + } + ], + "style": "Attention" + }, + { + "type": "TextBlock", + "text": "**Model:** test_model | **Status:** fail | **Time:** 2025-02-03 13:21:07 UTC", + "wrap": true + }, + { + "type": "TextBlock", + "text": "[View in Elementary](http://test.com)", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "\u2139\ufe0f **Details**", + "wrap": true + }, + { + "type": "FactSet", + "facts": [ + { + "title": "Tags", + "value": "_No tags_" + }, + { + "title": "Owners", + "value": "_No owners_" + }, + { + "title": "Subscribers", + "value": "_No subscribers_" + }, + { + "title": "Path", + "value": "models/test_model.sql" + } + ] + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "ActionSet", + "actions": [ + { + "type": "Action.ToggleVisibility", + "title": "Model Configuration", + "targetElements": [ + "expandable-00000000-0000-0000-0000-000000000001" + ] + } + ] + }, + { + "type": "Container", + "id": "expandable-00000000-0000-0000-0000-000000000001", + "items": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "FactSet", + "facts": [ + { + "title": "Materialization", + "value": "incremental" + }, + { + "title": "Full Refresh", + "value": "Yes" + } + ] + } + ] + } + ], + "isVisible": true + } + ] + } + ], + "version": "1.6" +} 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 new file mode 100644 index 000000000..220b8e121 --- /dev/null +++ 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 @@ -0,0 +1,111 @@ +{ + "type": "AdaptiveCard", + "body": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "Container", + "items": [ + { + "type": "TextBlock", + "text": "Failure: dbt failed to build table \"test_model\"", + "weight": "bolder", + "size": "large", + "wrap": true + } + ], + "style": "Attention" + }, + { + "type": "TextBlock", + "text": "**Model:** test_model | **Env:** Test Env | **Status:** fail | **Time:** 2025-02-03 13:21:07 UTC | **Suppression interval:** 24", + "wrap": true + }, + { + "type": "TextBlock", + "text": "[View in Elementary](http://test.com)", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "\u2139\ufe0f **Details**", + "wrap": true + }, + { + "type": "FactSet", + "facts": [ + { + "title": "Tags", + "value": "tag1, tag2" + }, + { + "title": "Owners", + "value": "owner1, owner2" + }, + { + "title": "Subscribers", + "value": "_No subscribers_" + }, + { + "title": "Path", + "value": "models/test_model.sql" + } + ] + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "ActionSet", + "actions": [ + { + "type": "Action.ToggleVisibility", + "title": "Model Configuration", + "targetElements": [ + "expandable-00000000-0000-0000-0000-000000000001" + ] + } + ] + }, + { + "type": "Container", + "id": "expandable-00000000-0000-0000-0000-000000000001", + "items": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "FactSet", + "facts": [ + { + "title": "Materialization", + "value": "table" + }, + { + "title": "Full Refresh", + "value": "Yes" + } + ] + } + ] + } + ], + "isVisible": true + } + ] + } + ], + "version": "1.6" +} 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 new file mode 100644 index 000000000..f65744938 --- /dev/null +++ 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 @@ -0,0 +1,106 @@ +{ + "type": "AdaptiveCard", + "body": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "Container", + "items": [ + { + "type": "TextBlock", + "text": "Warning: dbt failed to build incremental \"test_model\"", + "weight": "bolder", + "size": "large", + "wrap": true + } + ], + "style": "Warning" + }, + { + "type": "TextBlock", + "text": "**Model:** test_model | **Status:** warn | **Time:** 2025-02-03 13:21:07 UTC | **Suppression interval:** 24", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "\u2139\ufe0f **Details**", + "wrap": true + }, + { + "type": "FactSet", + "facts": [ + { + "title": "Tags", + "value": "tag1, tag2" + }, + { + "title": "Owners", + "value": "_No owners_" + }, + { + "title": "Subscribers", + "value": "_No subscribers_" + }, + { + "title": "Path", + "value": "models/test_model.sql" + } + ] + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "ActionSet", + "actions": [ + { + "type": "Action.ToggleVisibility", + "title": "Model Configuration", + "targetElements": [ + "expandable-00000000-0000-0000-0000-000000000001" + ] + } + ] + }, + { + "type": "Container", + "id": "expandable-00000000-0000-0000-0000-000000000001", + "items": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "FactSet", + "facts": [ + { + "title": "Materialization", + "value": "incremental" + }, + { + "title": "Full Refresh", + "value": "No" + } + ] + } + ] + } + ], + "isVisible": true + } + ] + } + ], + "version": "1.6" +} 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 new file mode 100644 index 000000000..77b83287c --- /dev/null +++ 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 @@ -0,0 +1,106 @@ +{ + "type": "AdaptiveCard", + "body": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "Container", + "items": [ + { + "type": "TextBlock", + "text": "Warning: dbt failed to build view \"test_model\"", + "weight": "bolder", + "size": "large", + "wrap": true + } + ], + "style": "Warning" + }, + { + "type": "TextBlock", + "text": "**Model:** test_model | **Status:** warn | **Time:** 2025-02-03 13:21:07 UTC | **Suppression interval:** 24", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "\u2139\ufe0f **Details**", + "wrap": true + }, + { + "type": "FactSet", + "facts": [ + { + "title": "Tags", + "value": "tag1, tag2" + }, + { + "title": "Owners", + "value": "owner1, owner2" + }, + { + "title": "Subscribers", + "value": "_No subscribers_" + }, + { + "title": "Path", + "value": "models/test_model.sql" + } + ] + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "ActionSet", + "actions": [ + { + "type": "Action.ToggleVisibility", + "title": "Model Configuration", + "targetElements": [ + "expandable-00000000-0000-0000-0000-000000000001" + ] + } + ] + }, + { + "type": "Container", + "id": "expandable-00000000-0000-0000-0000-000000000001", + "items": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "FactSet", + "facts": [ + { + "title": "Materialization", + "value": "view" + }, + { + "title": "Full Refresh", + "value": "No" + } + ] + } + ] + } + ], + "isVisible": true + } + ] + } + ], + "version": "1.6" +} 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 new file mode 100644 index 000000000..204d8957d --- /dev/null +++ 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 @@ -0,0 +1,111 @@ +{ + "type": "AdaptiveCard", + "body": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "Container", + "items": [ + { + "type": "TextBlock", + "text": "Warning: dbt failed to build view \"test_model\"", + "weight": "bolder", + "size": "large", + "wrap": true + } + ], + "style": "Warning" + }, + { + "type": "TextBlock", + "text": "**Model:** test_model | **Env:** Test Env | **Status:** warn | **Time:** 2025-02-03 13:21:07 UTC | **Suppression interval:** 24", + "wrap": true + }, + { + "type": "TextBlock", + "text": "[View in Elementary](http://test.com)", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "\u2139\ufe0f **Details**", + "wrap": true + }, + { + "type": "FactSet", + "facts": [ + { + "title": "Tags", + "value": "tag1, tag2" + }, + { + "title": "Owners", + "value": "owner1, owner2" + }, + { + "title": "Subscribers", + "value": "_No subscribers_" + }, + { + "title": "Path", + "value": "unknown_path" + } + ] + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "ActionSet", + "actions": [ + { + "type": "Action.ToggleVisibility", + "title": "Model Configuration", + "targetElements": [ + "expandable-00000000-0000-0000-0000-000000000001" + ] + } + ] + }, + { + "type": "Container", + "id": "expandable-00000000-0000-0000-0000-000000000001", + "items": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "FactSet", + "facts": [ + { + "title": "Materialization", + "value": "view" + }, + { + "title": "Full Refresh", + "value": "Yes" + } + ] + } + ] + } + ], + "isVisible": true + } + ] + } + ], + "version": "1.6" +} 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 new file mode 100644 index 000000000..cc3a6801c --- /dev/null +++ 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 @@ -0,0 +1,62 @@ +{ + "type": "AdaptiveCard", + "body": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "Container", + "items": [ + { + "type": "TextBlock", + "text": "dbt failed to build snapshot \"test_snapshot\"", + "weight": "bolder", + "size": "large", + "wrap": true + } + ], + "style": "Default" + }, + { + "type": "TextBlock", + "text": "**Snapshot:** test_snapshot | **Env:** Test Env | **Status:** Unknown | **Time:** 2025-02-03 13:21:07 UTC", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "\u2139\ufe0f **Details**", + "wrap": true + }, + { + "type": "FactSet", + "facts": [ + { + "title": "Tags", + "value": "_No tags_" + }, + { + "title": "Owners", + "value": "owner1, owner2" + }, + { + "title": "Subscribers", + "value": "_No subscribers_" + }, + { + "title": "Path", + "value": "models/test_snapshot.sql" + } + ] + } + ] + } + ], + "version": "1.6" +} 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 new file mode 100644 index 000000000..6739ad0d8 --- /dev/null +++ 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 @@ -0,0 +1,63 @@ +{ + "type": "AdaptiveCard", + "body": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "Container", + "items": [ + { + "type": "TextBlock", + "text": "dbt failed to build snapshot \"test_snapshot\"", + "weight": "bolder", + "size": "large", + "wrap": true + } + ], + "style": "Default" + }, + { + "type": "TextBlock", + "text": "**Snapshot:** test_snapshot | **Env:** Test Env | **Status:** Unknown | **Time:** 2025-02-03 13:21:07 UTC | **Suppression interval:** 24", + "wrap": true + }, + { + "type": "TextBlock", + "text": "[View in Elementary](http://test.com)", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "\u2139\ufe0f **Details**", + "wrap": true + }, + { + "type": "FactSet", + "facts": [ + { + "title": "Tags", + "value": "tag1, tag2" + }, + { + "title": "Owners", + "value": "_No owners_" + }, + { + "title": "Subscribers", + "value": "_No subscribers_" + } + ] + } + ] + } + ], + "version": "1.6" +} 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 new file mode 100644 index 000000000..81403614e --- /dev/null +++ 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 @@ -0,0 +1,110 @@ +{ + "type": "AdaptiveCard", + "body": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "Container", + "items": [ + { + "type": "TextBlock", + "text": "Error: dbt failed to build snapshot \"test_snapshot\"", + "weight": "bolder", + "size": "large", + "wrap": true + } + ], + "style": "Attention" + }, + { + "type": "TextBlock", + "text": "**Snapshot:** test_snapshot | **Status:** error | **Time:** 2025-02-03 13:21:07 UTC | **Suppression interval:** 24", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "\u2139\ufe0f **Details**", + "wrap": true + }, + { + "type": "FactSet", + "facts": [ + { + "title": "Tags", + "value": "tag1, tag2" + }, + { + "title": "Owners", + "value": "_No owners_" + }, + { + "title": "Subscribers", + "value": "_No subscribers_" + } + ] + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "ActionSet", + "actions": [ + { + "type": "Action.ToggleVisibility", + "title": "Result", + "targetElements": [ + "expandable-00000000-0000-0000-0000-000000000001" + ] + } + ] + }, + { + "type": "Container", + "id": "expandable-00000000-0000-0000-0000-000000000001", + "items": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "**Result Message**", + "wrap": true + }, + { + "type": "Container", + "style": "emphasis", + "items": [ + { + "type": "RichTextBlock", + "inlines": [ + { + "type": "TextRun", + "text": "Test message", + "fontType": "Monospace" + } + ] + } + ] + } + ] + } + ], + "isVisible": false + } + ] + } + ], + "version": "1.6" +} 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 new file mode 100644 index 000000000..d74da2423 --- /dev/null +++ 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 @@ -0,0 +1,119 @@ +{ + "type": "AdaptiveCard", + "body": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "Container", + "items": [ + { + "type": "TextBlock", + "text": "Error: dbt failed to build snapshot \"test_snapshot\"", + "weight": "bolder", + "size": "large", + "wrap": true + } + ], + "style": "Attention" + }, + { + "type": "TextBlock", + "text": "**Snapshot:** test_snapshot | **Env:** Test Env | **Status:** error | **Time:** 2025-02-03 13:21:07 UTC", + "wrap": true + }, + { + "type": "TextBlock", + "text": "[View in Elementary](http://test.com)", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "\u2139\ufe0f **Details**", + "wrap": true + }, + { + "type": "FactSet", + "facts": [ + { + "title": "Tags", + "value": "_No tags_" + }, + { + "title": "Owners", + "value": "owner1, owner2" + }, + { + "title": "Subscribers", + "value": "_No subscribers_" + }, + { + "title": "Path", + "value": "models/test_snapshot.sql" + } + ] + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "ActionSet", + "actions": [ + { + "type": "Action.ToggleVisibility", + "title": "Result", + "targetElements": [ + "expandable-00000000-0000-0000-0000-000000000001" + ] + } + ] + }, + { + "type": "Container", + "id": "expandable-00000000-0000-0000-0000-000000000001", + "items": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "**Result Message**", + "wrap": true + }, + { + "type": "Container", + "style": "emphasis", + "items": [ + { + "type": "RichTextBlock", + "inlines": [ + { + "type": "TextRun", + "text": "Test message", + "fontType": "Monospace" + } + ] + } + ] + } + ] + } + ], + "isVisible": false + } + ] + } + ], + "version": "1.6" +} 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 new file mode 100644 index 000000000..83b1bb9ec --- /dev/null +++ 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 @@ -0,0 +1,30 @@ +{ + "type": "AdaptiveCard", + "body": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "Container", + "items": [ + { + "type": "TextBlock", + "text": "Failure: dbt failed to build snapshot \"test_snapshot\"", + "weight": "bolder", + "size": "large", + "wrap": true + } + ], + "style": "Attention" + }, + { + "type": "TextBlock", + "text": "**Snapshot:** test_snapshot | **Status:** fail | **Time:** 2025-02-03 13:21:07 UTC", + "wrap": true + } + ] + } + ], + "version": "1.6" +} 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 new file mode 100644 index 000000000..56e8811e5 --- /dev/null +++ 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 @@ -0,0 +1,63 @@ +{ + "type": "AdaptiveCard", + "body": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "Container", + "items": [ + { + "type": "TextBlock", + "text": "Failure: dbt failed to build snapshot \"test_snapshot\"", + "weight": "bolder", + "size": "large", + "wrap": true + } + ], + "style": "Attention" + }, + { + "type": "TextBlock", + "text": "**Snapshot:** test_snapshot | **Status:** fail | **Time:** 2025-02-03 13:21:07 UTC | **Suppression interval:** 24", + "wrap": true + }, + { + "type": "TextBlock", + "text": "[View in Elementary](http://test.com)", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "\u2139\ufe0f **Details**", + "wrap": true + }, + { + "type": "FactSet", + "facts": [ + { + "title": "Tags", + "value": "tag1, tag2" + }, + { + "title": "Owners", + "value": "owner1, owner2" + }, + { + "title": "Subscribers", + "value": "_No subscribers_" + } + ] + } + ] + } + ], + "version": "1.6" +} 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 new file mode 100644 index 000000000..c02698233 --- /dev/null +++ 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 @@ -0,0 +1,119 @@ +{ + "type": "AdaptiveCard", + "body": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "Container", + "items": [ + { + "type": "TextBlock", + "text": "Failure: dbt failed to build snapshot \"test_snapshot\"", + "weight": "bolder", + "size": "large", + "wrap": true + } + ], + "style": "Attention" + }, + { + "type": "TextBlock", + "text": "**Snapshot:** test_snapshot | **Env:** Test Env | **Status:** fail | **Time:** 2025-02-03 13:21:07 UTC | **Suppression interval:** 24", + "wrap": true + }, + { + "type": "TextBlock", + "text": "[View in Elementary](http://test.com)", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "\u2139\ufe0f **Details**", + "wrap": true + }, + { + "type": "FactSet", + "facts": [ + { + "title": "Tags", + "value": "tag1, tag2" + }, + { + "title": "Owners", + "value": "owner1, owner2" + }, + { + "title": "Subscribers", + "value": "_No subscribers_" + }, + { + "title": "Path", + "value": "models/test_snapshot.sql" + } + ] + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "ActionSet", + "actions": [ + { + "type": "Action.ToggleVisibility", + "title": "Result", + "targetElements": [ + "expandable-00000000-0000-0000-0000-000000000001" + ] + } + ] + }, + { + "type": "Container", + "id": "expandable-00000000-0000-0000-0000-000000000001", + "items": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "**Result Message**", + "wrap": true + }, + { + "type": "Container", + "style": "emphasis", + "items": [ + { + "type": "RichTextBlock", + "inlines": [ + { + "type": "TextRun", + "text": "Test message", + "fontType": "Monospace" + } + ] + } + ] + } + ] + } + ], + "isVisible": false + } + ] + } + ], + "version": "1.6" +} 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 new file mode 100644 index 000000000..8c14b0f4c --- /dev/null +++ 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 @@ -0,0 +1,110 @@ +{ + "type": "AdaptiveCard", + "body": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "Container", + "items": [ + { + "type": "TextBlock", + "text": "Warning: dbt failed to build snapshot \"test_snapshot\"", + "weight": "bolder", + "size": "large", + "wrap": true + } + ], + "style": "Warning" + }, + { + "type": "TextBlock", + "text": "**Snapshot:** test_snapshot | **Status:** warn | **Time:** 2025-02-03 13:21:07 UTC | **Suppression interval:** 24", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "\u2139\ufe0f **Details**", + "wrap": true + }, + { + "type": "FactSet", + "facts": [ + { + "title": "Tags", + "value": "_No tags_" + }, + { + "title": "Owners", + "value": "owner1, owner2" + }, + { + "title": "Subscribers", + "value": "_No subscribers_" + } + ] + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "ActionSet", + "actions": [ + { + "type": "Action.ToggleVisibility", + "title": "Result", + "targetElements": [ + "expandable-00000000-0000-0000-0000-000000000001" + ] + } + ] + }, + { + "type": "Container", + "id": "expandable-00000000-0000-0000-0000-000000000001", + "items": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "**Result Message**", + "wrap": true + }, + { + "type": "Container", + "style": "emphasis", + "items": [ + { + "type": "RichTextBlock", + "inlines": [ + { + "type": "TextRun", + "text": "Test message", + "fontType": "Monospace" + } + ] + } + ] + } + ] + } + ], + "isVisible": false + } + ] + } + ], + "version": "1.6" +} 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 new file mode 100644 index 000000000..aec1677b0 --- /dev/null +++ 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 @@ -0,0 +1,114 @@ +{ + "type": "AdaptiveCard", + "body": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "Container", + "items": [ + { + "type": "TextBlock", + "text": "Warning: dbt failed to build snapshot \"test_snapshot\"", + "weight": "bolder", + "size": "large", + "wrap": true + } + ], + "style": "Warning" + }, + { + "type": "TextBlock", + "text": "**Snapshot:** test_snapshot | **Status:** warn | **Time:** 2025-02-03 13:21:07 UTC", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "\u2139\ufe0f **Details**", + "wrap": true + }, + { + "type": "FactSet", + "facts": [ + { + "title": "Tags", + "value": "tag1, tag2" + }, + { + "title": "Owners", + "value": "_No owners_" + }, + { + "title": "Subscribers", + "value": "_No subscribers_" + }, + { + "title": "Path", + "value": "models/test_snapshot.sql" + } + ] + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "ActionSet", + "actions": [ + { + "type": "Action.ToggleVisibility", + "title": "Result", + "targetElements": [ + "expandable-00000000-0000-0000-0000-000000000001" + ] + } + ] + }, + { + "type": "Container", + "id": "expandable-00000000-0000-0000-0000-000000000001", + "items": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "**Result Message**", + "wrap": true + }, + { + "type": "Container", + "style": "emphasis", + "items": [ + { + "type": "RichTextBlock", + "inlines": [ + { + "type": "TextRun", + "text": "Test message", + "fontType": "Monospace" + } + ] + } + ] + } + ] + } + ], + "isVisible": false + } + ] + } + ], + "version": "1.6" +} 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 new file mode 100644 index 000000000..ddf1f14d3 --- /dev/null +++ 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 @@ -0,0 +1,67 @@ +{ + "type": "AdaptiveCard", + "body": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "Container", + "items": [ + { + "type": "TextBlock", + "text": "Warning: dbt failed to build snapshot \"test_snapshot\"", + "weight": "bolder", + "size": "large", + "wrap": true + } + ], + "style": "Warning" + }, + { + "type": "TextBlock", + "text": "**Snapshot:** test_snapshot | **Env:** Test Env | **Status:** warn | **Time:** 2025-02-03 13:21:07 UTC", + "wrap": true + }, + { + "type": "TextBlock", + "text": "[View in Elementary](http://test.com)", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "\u2139\ufe0f **Details**", + "wrap": true + }, + { + "type": "FactSet", + "facts": [ + { + "title": "Tags", + "value": "tag1, tag2" + }, + { + "title": "Owners", + "value": "_No owners_" + }, + { + "title": "Subscribers", + "value": "_No subscribers_" + }, + { + "title": "Path", + "value": "models/test_snapshot.sql" + } + ] + } + ] + } + ], + "version": "1.6" +} 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 new file mode 100644 index 000000000..06a7a4fa0 --- /dev/null +++ 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 @@ -0,0 +1,127 @@ +{ + "type": "AdaptiveCard", + "body": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "Container", + "items": [ + { + "type": "TextBlock", + "text": "Error: Freshness exceeded the acceptable times on source \"test_source\"", + "weight": "bolder", + "size": "large", + "wrap": true + } + ], + "style": "Attention" + }, + { + "type": "TextBlock", + "text": "**Source:** test_source.test_identifier | **Status:** error | **Time:** 2025-02-03 13:21:07 UTC", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "\u2139\ufe0f **Details**", + "wrap": true + }, + { + "type": "FactSet", + "facts": [ + { + "title": "Tags", + "value": "tag1, tag2" + }, + { + "title": "Owners", + "value": "owner1, owner2" + }, + { + "title": "Subscribers", + "value": "_No subscribers_" + }, + { + "title": "Path", + "value": "sources/test_source.yml" + } + ] + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "ActionSet", + "actions": [ + { + "type": "Action.ToggleVisibility", + "title": "Result", + "targetElements": [ + "expandable-00000000-0000-0000-0000-000000000001" + ] + } + ] + }, + { + "type": "Container", + "id": "expandable-00000000-0000-0000-0000-000000000001", + "items": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "**Result Message**", + "wrap": true + }, + { + "type": "Container", + "style": "emphasis", + "items": [ + { + "type": "RichTextBlock", + "inlines": [ + { + "type": "TextRun", + "text": "Test error message", + "fontType": "Monospace" + } + ] + } + ] + }, + { + "type": "FactSet", + "facts": [ + { + "title": "Time Elapsed", + "value": "N/A" + }, + { + "title": "Sampled At", + "value": "2025-02-03 13:21:07" + } + ] + } + ] + } + ], + "isVisible": false + } + ] + } + ], + "version": "1.6" +} 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 new file mode 100644 index 000000000..7cc0fb217 --- /dev/null +++ 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 @@ -0,0 +1,173 @@ +{ + "type": "AdaptiveCard", + "body": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "Container", + "items": [ + { + "type": "TextBlock", + "text": "Error: Freshness exceeded the acceptable times on source \"test_source\"", + "weight": "bolder", + "size": "large", + "wrap": true + } + ], + "style": "Attention" + }, + { + "type": "TextBlock", + "text": "**Source:** test_source.test_identifier | **Env:** Test Env | **Status:** error | **Time:** 2025-02-03 13:21:07 UTC", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "\u2139\ufe0f **Details**", + "wrap": true + }, + { + "type": "FactSet", + "facts": [ + { + "title": "Tags", + "value": "tag1, tag2" + }, + { + "title": "Owners", + "value": "owner1, owner2" + }, + { + "title": "Subscribers", + "value": "_No subscribers_" + }, + { + "title": "Description", + "value": "Test freshness description" + } + ] + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "ActionSet", + "actions": [ + { + "type": "Action.ToggleVisibility", + "title": "Result", + "targetElements": [ + "expandable-00000000-0000-0000-0000-000000000001" + ] + } + ] + }, + { + "type": "Container", + "id": "expandable-00000000-0000-0000-0000-000000000001", + "items": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "**Result Message**", + "wrap": true + }, + { + "type": "Container", + "style": "emphasis", + "items": [ + { + "type": "RichTextBlock", + "inlines": [ + { + "type": "TextRun", + "text": "Test error message", + "fontType": "Monospace" + } + ] + } + ] + }, + { + "type": "FactSet", + "facts": [ + { + "title": "Time Elapsed", + "value": "2:00:00" + }, + { + "title": "Last Record At", + "value": "2025-02-03 11:21:07" + }, + { + "title": "Sampled At", + "value": "2025-02-03 13:21:07" + } + ] + } + ] + } + ], + "isVisible": false + }, + { + "type": "ActionSet", + "actions": [ + { + "type": "Action.ToggleVisibility", + "title": "Source Freshness Configuration", + "targetElements": [ + "expandable-00000000-0000-0000-0000-000000000002" + ] + } + ] + }, + { + "type": "Container", + "id": "expandable-00000000-0000-0000-0000-000000000002", + "items": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "FactSet", + "facts": [ + { + "title": "Error after", + "value": "2 hours" + }, + { + "title": "Warn after", + "value": "1 hour" + }, + { + "title": "Filter", + "value": "test_filter" + } + ] + } + ] + } + ], + "isVisible": false + } + ] + } + ], + "version": "1.6" +} 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 new file mode 100644 index 000000000..6ced8aef1 --- /dev/null +++ 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 @@ -0,0 +1,100 @@ +{ + "type": "AdaptiveCard", + "body": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "Container", + "items": [ + { + "type": "TextBlock", + "text": "Error: Freshness exceeded the acceptable times on source \"test_source\"", + "weight": "bolder", + "size": "large", + "wrap": true + } + ], + "style": "Attention" + }, + { + "type": "TextBlock", + "text": "**Source:** test_source.test_identifier | **Status:** error | **Time:** 2025-02-03 13:21:07 UTC | **Suppression interval:** 24", + "wrap": true + }, + { + "type": "TextBlock", + "text": "[View in Elementary](http://test.com)", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "ActionSet", + "actions": [ + { + "type": "Action.ToggleVisibility", + "title": "Result", + "targetElements": [ + "expandable-00000000-0000-0000-0000-000000000001" + ] + } + ] + }, + { + "type": "Container", + "id": "expandable-00000000-0000-0000-0000-000000000001", + "items": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "**Result Message**", + "wrap": true + }, + { + "type": "Container", + "style": "emphasis", + "items": [ + { + "type": "RichTextBlock", + "inlines": [ + { + "type": "TextRun", + "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).", + "fontType": "Monospace" + } + ] + } + ] + }, + { + "type": "FactSet", + "facts": [ + { + "title": "Time Elapsed", + "value": "N/A" + }, + { + "title": "Sampled At", + "value": "2025-02-03 13:21:07" + } + ] + } + ] + } + ], + "isVisible": false + } + ] + } + ], + "version": "1.6" +} 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 new file mode 100644 index 000000000..79d1f8741 --- /dev/null +++ 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 @@ -0,0 +1,132 @@ +{ + "type": "AdaptiveCard", + "body": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "Container", + "items": [ + { + "type": "TextBlock", + "text": "Error: Freshness exceeded the acceptable times on source \"test_source\"", + "weight": "bolder", + "size": "large", + "wrap": true + } + ], + "style": "Attention" + }, + { + "type": "TextBlock", + "text": "**Source:** test_source.test_identifier | **Status:** error | **Time:** 2025-02-03 13:21:07 UTC | **Suppression interval:** 24", + "wrap": true + }, + { + "type": "TextBlock", + "text": "[View in Elementary](http://test.com)", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "\u2139\ufe0f **Details**", + "wrap": true + }, + { + "type": "FactSet", + "facts": [ + { + "title": "Tags", + "value": "tag1, tag2" + }, + { + "title": "Owners", + "value": "owner1, owner2" + }, + { + "title": "Subscribers", + "value": "_No subscribers_" + }, + { + "title": "Path", + "value": "sources/test_source.yml" + } + ] + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "ActionSet", + "actions": [ + { + "type": "Action.ToggleVisibility", + "title": "Result", + "targetElements": [ + "expandable-00000000-0000-0000-0000-000000000001" + ] + } + ] + }, + { + "type": "Container", + "id": "expandable-00000000-0000-0000-0000-000000000001", + "items": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "**Result Message**", + "wrap": true + }, + { + "type": "Container", + "style": "emphasis", + "items": [ + { + "type": "RichTextBlock", + "inlines": [ + { + "type": "TextRun", + "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).", + "fontType": "Monospace" + } + ] + } + ] + }, + { + "type": "FactSet", + "facts": [ + { + "title": "Time Elapsed", + "value": "N/A" + }, + { + "title": "Sampled At", + "value": "2025-02-03 13:21:07" + } + ] + } + ] + } + ], + "isVisible": false + } + ] + } + ], + "version": "1.6" +} 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 new file mode 100644 index 000000000..3547bf382 --- /dev/null +++ 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 @@ -0,0 +1,182 @@ +{ + "type": "AdaptiveCard", + "body": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "Container", + "items": [ + { + "type": "TextBlock", + "text": "Error: Freshness exceeded the acceptable times on source \"test_source\"", + "weight": "bolder", + "size": "large", + "wrap": true + } + ], + "style": "Attention" + }, + { + "type": "TextBlock", + "text": "**Source:** test_source.test_identifier | **Env:** Test Env | **Status:** error | **Time:** 2025-02-03 13:21:07 UTC | **Suppression interval:** 24", + "wrap": true + }, + { + "type": "TextBlock", + "text": "[View in Elementary](http://test.com)", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "\u2139\ufe0f **Details**", + "wrap": true + }, + { + "type": "FactSet", + "facts": [ + { + "title": "Tags", + "value": "_No tags_" + }, + { + "title": "Owners", + "value": "_No owners_" + }, + { + "title": "Subscribers", + "value": "_No subscribers_" + }, + { + "title": "Description", + "value": "Test freshness description" + }, + { + "title": "Path", + "value": "sources/test_source.yml" + } + ] + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "ActionSet", + "actions": [ + { + "type": "Action.ToggleVisibility", + "title": "Result", + "targetElements": [ + "expandable-00000000-0000-0000-0000-000000000001" + ] + } + ] + }, + { + "type": "Container", + "id": "expandable-00000000-0000-0000-0000-000000000001", + "items": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "**Result Message**", + "wrap": true + }, + { + "type": "Container", + "style": "emphasis", + "items": [ + { + "type": "RichTextBlock", + "inlines": [ + { + "type": "TextRun", + "text": "Test error message", + "fontType": "Monospace" + } + ] + } + ] + }, + { + "type": "FactSet", + "facts": [ + { + "title": "Time Elapsed", + "value": "2:00:00" + }, + { + "title": "Last Record At", + "value": "2025-02-03 11:21:07" + }, + { + "title": "Sampled At", + "value": "2025-02-03 13:21:07" + } + ] + } + ] + } + ], + "isVisible": false + }, + { + "type": "ActionSet", + "actions": [ + { + "type": "Action.ToggleVisibility", + "title": "Source Freshness Configuration", + "targetElements": [ + "expandable-00000000-0000-0000-0000-000000000002" + ] + } + ] + }, + { + "type": "Container", + "id": "expandable-00000000-0000-0000-0000-000000000002", + "items": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "FactSet", + "facts": [ + { + "title": "Error after", + "value": "2 hours" + }, + { + "title": "Warn after", + "value": "1 hour" + }, + { + "title": "Filter", + "value": "test_filter" + } + ] + } + ] + } + ], + "isVisible": false + } + ] + } + ], + "version": "1.6" +} 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 new file mode 100644 index 000000000..02cb07489 --- /dev/null +++ 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 @@ -0,0 +1,95 @@ +{ + "type": "AdaptiveCard", + "body": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "Container", + "items": [ + { + "type": "TextBlock", + "text": "Runtime Error: Failed to calculate the source freshness of \"test_source\"", + "weight": "bolder", + "size": "large", + "wrap": true + } + ], + "style": "Attention" + }, + { + "type": "TextBlock", + "text": "**Source:** test_source.test_identifier | **Status:** runtime error | **Time:** 2025-02-03 13:21:07 UTC", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "ActionSet", + "actions": [ + { + "type": "Action.ToggleVisibility", + "title": "Result", + "targetElements": [ + "expandable-00000000-0000-0000-0000-000000000001" + ] + } + ] + }, + { + "type": "Container", + "id": "expandable-00000000-0000-0000-0000-000000000001", + "items": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "**Result Message**", + "wrap": true + }, + { + "type": "Container", + "style": "emphasis", + "items": [ + { + "type": "RichTextBlock", + "inlines": [ + { + "type": "TextRun", + "text": "Failed to calculate the source freshness\n```None```", + "fontType": "Monospace" + } + ] + } + ] + }, + { + "type": "FactSet", + "facts": [ + { + "title": "Time Elapsed", + "value": "N/A" + }, + { + "title": "Sampled At", + "value": "2025-02-03 13:21:07" + } + ] + } + ] + } + ], + "isVisible": false + } + ] + } + ], + "version": "1.6" +} 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 new file mode 100644 index 000000000..3fc640a54 --- /dev/null +++ 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 @@ -0,0 +1,173 @@ +{ + "type": "AdaptiveCard", + "body": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "Container", + "items": [ + { + "type": "TextBlock", + "text": "Runtime Error: Failed to calculate the source freshness of \"test_source\"", + "weight": "bolder", + "size": "large", + "wrap": true + } + ], + "style": "Attention" + }, + { + "type": "TextBlock", + "text": "**Source:** test_source.test_identifier | **Env:** Test Env | **Status:** runtime error | **Time:** 2025-02-03 13:21:07 UTC | **Suppression interval:** 24", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "\u2139\ufe0f **Details**", + "wrap": true + }, + { + "type": "FactSet", + "facts": [ + { + "title": "Tags", + "value": "tag1, tag2" + }, + { + "title": "Owners", + "value": "_No owners_" + }, + { + "title": "Subscribers", + "value": "_No subscribers_" + }, + { + "title": "Description", + "value": "Test freshness description" + } + ] + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "ActionSet", + "actions": [ + { + "type": "Action.ToggleVisibility", + "title": "Result", + "targetElements": [ + "expandable-00000000-0000-0000-0000-000000000001" + ] + } + ] + }, + { + "type": "Container", + "id": "expandable-00000000-0000-0000-0000-000000000001", + "items": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "**Result Message**", + "wrap": true + }, + { + "type": "Container", + "style": "emphasis", + "items": [ + { + "type": "RichTextBlock", + "inlines": [ + { + "type": "TextRun", + "text": "Failed to calculate the source freshness\n```Test error message```", + "fontType": "Monospace" + } + ] + } + ] + }, + { + "type": "FactSet", + "facts": [ + { + "title": "Time Elapsed", + "value": "2:00:00" + }, + { + "title": "Last Record At", + "value": "2025-02-03 11:21:07" + }, + { + "title": "Sampled At", + "value": "2025-02-03 13:21:07" + } + ] + } + ] + } + ], + "isVisible": false + }, + { + "type": "ActionSet", + "actions": [ + { + "type": "Action.ToggleVisibility", + "title": "Source Freshness Configuration", + "targetElements": [ + "expandable-00000000-0000-0000-0000-000000000002" + ] + } + ] + }, + { + "type": "Container", + "id": "expandable-00000000-0000-0000-0000-000000000002", + "items": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "FactSet", + "facts": [ + { + "title": "Error after", + "value": "2 hours" + }, + { + "title": "Warn after", + "value": "1 hour" + }, + { + "title": "Filter", + "value": "test_filter" + } + ] + } + ] + } + ], + "isVisible": false + } + ] + } + ], + "version": "1.6" +} 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 new file mode 100644 index 000000000..0a21aeb41 --- /dev/null +++ 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 @@ -0,0 +1,132 @@ +{ + "type": "AdaptiveCard", + "body": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "Container", + "items": [ + { + "type": "TextBlock", + "text": "Runtime Error: Failed to calculate the source freshness of \"test_source\"", + "weight": "bolder", + "size": "large", + "wrap": true + } + ], + "style": "Attention" + }, + { + "type": "TextBlock", + "text": "**Source:** test_source.test_identifier | **Env:** Test Env | **Status:** runtime error | **Time:** 2025-02-03 13:21:07 UTC | **Suppression interval:** 24", + "wrap": true + }, + { + "type": "TextBlock", + "text": "[View in Elementary](http://test.com)", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "\u2139\ufe0f **Details**", + "wrap": true + }, + { + "type": "FactSet", + "facts": [ + { + "title": "Tags", + "value": "tag1, tag2" + }, + { + "title": "Owners", + "value": "_No owners_" + }, + { + "title": "Subscribers", + "value": "_No subscribers_" + }, + { + "title": "Path", + "value": "sources/test_source.yml" + } + ] + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "ActionSet", + "actions": [ + { + "type": "Action.ToggleVisibility", + "title": "Result", + "targetElements": [ + "expandable-00000000-0000-0000-0000-000000000001" + ] + } + ] + }, + { + "type": "Container", + "id": "expandable-00000000-0000-0000-0000-000000000001", + "items": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "**Result Message**", + "wrap": true + }, + { + "type": "Container", + "style": "emphasis", + "items": [ + { + "type": "RichTextBlock", + "inlines": [ + { + "type": "TextRun", + "text": "Failed to calculate the source freshness\n```None```", + "fontType": "Monospace" + } + ] + } + ] + }, + { + "type": "FactSet", + "facts": [ + { + "title": "Time Elapsed", + "value": "N/A" + }, + { + "title": "Sampled At", + "value": "2025-02-03 13:21:07" + } + ] + } + ] + } + ], + "isVisible": false + } + ] + } + ], + "version": "1.6" +} 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 new file mode 100644 index 000000000..687f4a6d6 --- /dev/null +++ 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 @@ -0,0 +1,178 @@ +{ + "type": "AdaptiveCard", + "body": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "Container", + "items": [ + { + "type": "TextBlock", + "text": "Runtime Error: Failed to calculate the source freshness of \"test_source\"", + "weight": "bolder", + "size": "large", + "wrap": true + } + ], + "style": "Attention" + }, + { + "type": "TextBlock", + "text": "**Source:** test_source.test_identifier | **Env:** Test Env | **Status:** runtime error | **Time:** 2025-02-03 13:21:07 UTC", + "wrap": true + }, + { + "type": "TextBlock", + "text": "[View in Elementary](http://test.com)", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "\u2139\ufe0f **Details**", + "wrap": true + }, + { + "type": "FactSet", + "facts": [ + { + "title": "Tags", + "value": "_No tags_" + }, + { + "title": "Owners", + "value": "owner1, owner2" + }, + { + "title": "Subscribers", + "value": "_No subscribers_" + }, + { + "title": "Description", + "value": "Test freshness description" + } + ] + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "ActionSet", + "actions": [ + { + "type": "Action.ToggleVisibility", + "title": "Result", + "targetElements": [ + "expandable-00000000-0000-0000-0000-000000000001" + ] + } + ] + }, + { + "type": "Container", + "id": "expandable-00000000-0000-0000-0000-000000000001", + "items": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "**Result Message**", + "wrap": true + }, + { + "type": "Container", + "style": "emphasis", + "items": [ + { + "type": "RichTextBlock", + "inlines": [ + { + "type": "TextRun", + "text": "Failed to calculate the source freshness\n```Test error message```", + "fontType": "Monospace" + } + ] + } + ] + }, + { + "type": "FactSet", + "facts": [ + { + "title": "Time Elapsed", + "value": "2:00:00" + }, + { + "title": "Last Record At", + "value": "2025-02-03 11:21:07" + }, + { + "title": "Sampled At", + "value": "2025-02-03 13:21:07" + } + ] + } + ] + } + ], + "isVisible": false + }, + { + "type": "ActionSet", + "actions": [ + { + "type": "Action.ToggleVisibility", + "title": "Source Freshness Configuration", + "targetElements": [ + "expandable-00000000-0000-0000-0000-000000000002" + ] + } + ] + }, + { + "type": "Container", + "id": "expandable-00000000-0000-0000-0000-000000000002", + "items": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "FactSet", + "facts": [ + { + "title": "Error after", + "value": "2 hours" + }, + { + "title": "Warn after", + "value": "1 hour" + }, + { + "title": "Filter", + "value": "test_filter" + } + ] + } + ] + } + ], + "isVisible": false + } + ] + } + ], + "version": "1.6" +} 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 new file mode 100644 index 000000000..f69d5aa99 --- /dev/null +++ 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 @@ -0,0 +1,182 @@ +{ + "type": "AdaptiveCard", + "body": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "Container", + "items": [ + { + "type": "TextBlock", + "text": "Runtime Error: Failed to calculate the source freshness of \"test_source\"", + "weight": "bolder", + "size": "large", + "wrap": true + } + ], + "style": "Attention" + }, + { + "type": "TextBlock", + "text": "**Source:** test_source.test_identifier | **Env:** Test Env | **Status:** runtime error | **Time:** 2025-02-03 13:21:07 UTC | **Suppression interval:** 24", + "wrap": true + }, + { + "type": "TextBlock", + "text": "[View in Elementary](http://test.com)", + "wrap": true + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "\u2139\ufe0f **Details**", + "wrap": true + }, + { + "type": "FactSet", + "facts": [ + { + "title": "Tags", + "value": "tag1, tag2" + }, + { + "title": "Owners", + "value": "owner1, owner2" + }, + { + "title": "Subscribers", + "value": "_No subscribers_" + }, + { + "title": "Description", + "value": "Test freshness description" + }, + { + "title": "Path", + "value": "sources/test_source.yml" + } + ] + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "ActionSet", + "actions": [ + { + "type": "Action.ToggleVisibility", + "title": "Result", + "targetElements": [ + "expandable-00000000-0000-0000-0000-000000000001" + ] + } + ] + }, + { + "type": "Container", + "id": "expandable-00000000-0000-0000-0000-000000000001", + "items": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "TextBlock", + "text": "**Result Message**", + "wrap": true + }, + { + "type": "Container", + "style": "emphasis", + "items": [ + { + "type": "RichTextBlock", + "inlines": [ + { + "type": "TextRun", + "text": "Failed to calculate the source freshness\n```Test error message```", + "fontType": "Monospace" + } + ] + } + ] + }, + { + "type": "FactSet", + "facts": [ + { + "title": "Time Elapsed", + "value": "2:00:00" + }, + { + "title": "Last Record At", + "value": "2025-02-03 11:21:07" + }, + { + "title": "Sampled At", + "value": "2025-02-03 13:21:07" + } + ] + } + ] + } + ], + "isVisible": false + }, + { + "type": "ActionSet", + "actions": [ + { + "type": "Action.ToggleVisibility", + "title": "Source Freshness Configuration", + "targetElements": [ + "expandable-00000000-0000-0000-0000-000000000002" + ] + } + ] + }, + { + "type": "Container", + "id": "expandable-00000000-0000-0000-0000-000000000002", + "items": [ + { + "type": "Container", + "separator": true, + "items": [ + { + "type": "FactSet", + "facts": [ + { + "title": "Error after", + "value": "2 hours" + }, + { + "title": "Warn after", + "value": "1 hour" + }, + { + "title": "Filter", + "value": "test_filter" + } + ] + } + ] + } + ], + "isVisible": false + } + ] + } + ], + "version": "1.6" +} diff --git a/tests/unit/alerts/alert_messages/test_alert_utils.py b/tests/unit/alerts/alert_messages/test_alert_utils.py new file mode 100644 index 000000000..704f37b36 --- /dev/null +++ b/tests/unit/alerts/alert_messages/test_alert_utils.py @@ -0,0 +1,277 @@ +from datetime import datetime +from typing import Any, Dict, List, Optional, Union + +from elementary.messages.message_body import MessageBody +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 ( + GroupedByTableAlerts, +) +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.utils.report_link import ( + ReportLinkData as ReportLink, +) + + +def build_base_test_alert_model( + status: str, + table_name: Optional[str], + tags: Optional[List[str]], + owners: Optional[List[str]], + test_description: Optional[str], + error_message: Optional[str], + test_rows_sample: Optional[List[Dict[str, Any]]], + test_results_query: Optional[str], + test_params: Optional[dict], + test_type: str = "dbt_test", + test_sub_type: str = "generic", + other: Optional[dict] = None, + model_unique_id: Optional[str] = "test_model_unique_id", + env: Optional[str] = None, +) -> TestAlertModel: + return TestAlertModel( + id="test_id", + test_unique_id="test_unique_id", + elementary_unique_id="elementary_unique_id", + test_name="test_name", + severity="error", + test_type=test_type, + test_sub_type=test_sub_type, + test_short_name="test_short_name", + alert_class_id="test_alert_class_id", + test_results_description=error_message, + test_results_query=test_results_query, + table_name=table_name, + model_unique_id=model_unique_id, + test_description=test_description, + other=other, + test_params=test_params, + test_meta=None, + test_rows_sample=test_rows_sample, + column_name=None, + detected_at=None, + database_name=None, + schema_name=None, + owners=owners, + tags=tags, + subscribers=None, + status=status, + model_meta={}, + timezone="UTC", + report_url=None, + alert_fields=None, + elementary_database_and_schema="test_db.test_schema", + env=env, + ) + + +def build_base_model_alert_model( + status: str, + tags: Optional[List[str]], + owners: Optional[List[str]], + path: str, + materialization: str, + full_refresh: bool, + detected_at: datetime, + alias: str, + message: str, + suppression_interval: Optional[int] = None, + env: Optional[str] = None, +) -> ModelAlertModel: + return ModelAlertModel( + id="test_id", + model_unique_id="test_model_unique_id", + elementary_unique_id="elementary_unique_id", + status=status, + severity="error", + alert_class_id="test_alert_class_id", + model_name="test_model", + alias=alias, + message=message, + path=path, + original_path=path, + materialization=materialization, + full_refresh=full_refresh, + detected_at=detected_at, + database_name=None, + schema_name=None, + owners=owners, + tags=tags, + test_meta=None, + test_results_query=None, + test_rows_sample=None, + test_params=None, + test_name=None, + test_type=None, + test_sub_type=None, + test_results_description=None, + test_description=None, + column_name=None, + table_name=None, + other=None, + timezone="UTC", + report_url=None, + alert_fields=None, + elementary_database_and_schema="test_db.test_schema", + suppression_interval=suppression_interval, + env=env, + ) + + +def get_mock_report_link(has_link: bool) -> Optional[ReportLink]: + if has_link: + return ReportLink(url="http://test.com", text="View Report") + return None + + +def _get_owners_by_mod(i: int) -> List[str]: + mod_value = i % 3 + if mod_value == 0: + return [] + elif mod_value == 1: + return ["owner1"] + else: # mod_value == 2 + return ["owner1", "owner2"] + + +def create_test_alerts( + has_model_errors: bool, + has_test_failures: bool, + has_test_warnings: bool, + has_test_errors: bool, + detected_at: datetime, + count: int, + env: Optional[str] = None, +) -> List[Union[TestAlertModel, ModelAlertModel, SourceFreshnessAlertModel]]: + alerts: List[Union[TestAlertModel, ModelAlertModel, SourceFreshnessAlertModel]] = [] + + if has_model_errors: + for i in range(count): + owners = _get_owners_by_mod(i) + model_alert = build_base_model_alert_model( + status="error", + tags=["tag1"], + owners=owners, + path="models/test_model.sql", + materialization="table", + full_refresh=True, + detected_at=detected_at, + alias="test_model", + message="Test model error", + suppression_interval=None, + env=env, + ) + alerts.append(model_alert) + + if has_test_failures: + for i in range(count): + owners = _get_owners_by_mod(i) + test_alert = build_base_test_alert_model( + status="fail", + table_name=f"test_table_{i + 1}", + tags=["tag1"], + owners=owners, + test_description="Test failure description", + error_message="Test failure message", + test_rows_sample=None, + test_results_query=None, + test_params=None, + env=env, + ) + alerts.append(test_alert) + + if has_test_warnings: + for i in range(count): + owners = _get_owners_by_mod(i) + test_alert = build_base_test_alert_model( + status="warn", + table_name=f"test_table_{i + 1}", + tags=["tag1"], + owners=owners, + test_description=f"Test warning description {i + 1}", + error_message=f"Test warning message {i + 1}", + test_rows_sample=None, + test_results_query=None, + test_params=None, + env=env, + ) + alerts.append(test_alert) + + if has_test_errors: + for i in range(count): + owners = _get_owners_by_mod(i) + test_alert = build_base_test_alert_model( + status="error", + table_name=f"test_table_{i + 1}", + tags=["tag1"], + owners=owners, + test_description=f"Test error description {i + 1}", + error_message="Test error message", + test_rows_sample=None, + test_results_query=None, + test_params=None, + env=env, + ) + alerts.append(test_alert) + + return alerts + + +def build_base_source_freshness_alert_model( + status: str, + tags: Optional[List[str]], + owners: Optional[List[str]], + path: str, + has_error: bool, + has_message: bool, + detected_at: Optional[datetime], + snapshotted_at: Optional[datetime] = None, + max_loaded_at: Optional[datetime] = None, + max_loaded_at_time_ago_in_s: Optional[float] = None, + suppression_interval: Optional[int] = None, + env: Optional[str] = None, +) -> SourceFreshnessAlertModel: + return SourceFreshnessAlertModel( + id="test_id", + source_name="test_source", + identifier="test_identifier", + original_status=status, + path=path, + error="Test error message" if has_error else None, + alert_class_id="test_alert_class_id", + source_freshness_execution_id="test_execution_id", + error_after="2 hours" if has_message else None, + warn_after="1 hour" if has_message else None, + snapshotted_at=snapshotted_at, + max_loaded_at=max_loaded_at, + max_loaded_at_time_ago_in_s=max_loaded_at_time_ago_in_s, + filter="test_filter" if has_message else None, + freshness_description="Test freshness description" if has_message else None, + detected_at=detected_at, + owners=owners, + tags=tags, + subscribers=None, + status=status, + model_meta={}, + suppression_interval=suppression_interval, + timezone="UTC", + report_url=None, + alert_fields=None, + elementary_database_and_schema="test_db.test_schema", + env=env, + ) + + +def get_alert_message_body( + alert: Union[ + TestAlertModel, + ModelAlertModel, + SourceFreshnessAlertModel, + GroupedByTableAlerts, + AlertsGroup, + ], +) -> MessageBody: + alert_message_builder = AlertMessageBuilder() + return alert_message_builder.build(alert) diff --git a/tests/unit/alerts/alert_messages/test_alerts_group_message.py b/tests/unit/alerts/alert_messages/test_alerts_group_message.py new file mode 100644 index 000000000..584552b2d --- /dev/null +++ b/tests/unit/alerts/alert_messages/test_alerts_group_message.py @@ -0,0 +1,87 @@ +from datetime import datetime, timezone +from pathlib import Path +from unittest.mock import patch + +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 ( + 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" + + +@pytest.mark.parametrize( + "has_model_errors,has_test_failures,has_test_warnings,has_test_errors,has_link,has_env", + [ + (True, True, True, True, True, True), + (True, True, True, False, True, True), + (True, True, False, True, True, True), + (True, False, True, True, True, True), + (False, True, True, True, True, True), + (False, True, False, True, False, False), + (True, False, True, False, True, False), + (False, False, True, True, False, False), + (True, False, False, True, False, False), + (False, True, False, False, False, False), + ], +) +def test_get_alerts_group_message_body( + has_model_errors: bool, + has_test_failures: bool, + has_test_warnings: bool, + has_test_errors: bool, + has_link: bool, + has_env: bool, +): + + detected_at = datetime(2025, 2, 3, 13, 21, 7, tzinfo=timezone.utc) + + env = "Test Env" if has_env else None + alerts = create_test_alerts( + has_model_errors=has_model_errors, + has_test_failures=has_test_failures, + has_test_warnings=has_test_warnings, + has_test_errors=has_test_errors, + detected_at=detected_at, + count=10, + env=env, + ) + + # Create a list of patches for all alerts + patches = [ + patch.object(alert, "get_report_link", lambda: get_mock_report_link(has_link)) + for alert in alerts + ] + + # Apply all patches + for patcher in patches: + patcher.start() + + alerts_group = AlertsGroup(alerts=alerts, env=env) + + message_body = get_alert_message_body(alerts_group) + adaptive_card_filename = ( + f"adaptive_card_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) + + # Stop all patches + for patcher in patches: + patcher.stop() 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 new file mode 100644 index 000000000..9f72bf0c1 --- /dev/null +++ b/tests/unit/alerts/alert_messages/test_dbt_test_alert_message.py @@ -0,0 +1,108 @@ +from pathlib import Path + +import pytest + +from elementary.messages.formats.adaptive_cards import format_adaptive_card +from tests.unit.alerts.alert_messages.test_alert_utils import ( + 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" + + +def build_dbt_test_alert_model(*args, **kwargs): + kwargs.pop("test_type", None) # Remove test_type if present + return build_base_test_alert_model(*args, test_type="dbt_test", **kwargs) + + +def get_expected_adaptive_filename( + status: str, + has_link: bool, + has_description: bool, + has_tags: bool, + has_owners: bool, + has_table: bool, + has_error: bool, + has_sample: bool, + has_env: bool, +) -> str: + return ( + f"adaptive_card_dbt_test_alert" + f"_status-{status}" + f"_link-{has_link}" + f"_description-{has_description}" + f"_tags-{has_tags}" + f"_owners-{has_owners}" + f"_table-{has_table}" + f"_error-{has_error}" + f"_sample-{has_sample}" + f"_env-{has_env}" + ".json" + ) + + +@pytest.mark.parametrize( + "status,has_link,has_description,has_tags,has_owners,has_table,has_error,has_sample,has_env", + [ + (None, False, False, False, False, False, False, False, False), + ("fail", False, False, False, False, False, False, False, False), + ("fail", True, True, True, True, True, True, True, False), + ("warn", True, False, True, False, True, False, True, False), + ("error", False, True, False, True, False, True, False, True), + ("error", True, True, True, True, True, True, True, True), + ("warn", True, True, True, True, True, True, True, True), + (None, True, True, False, False, True, True, False, True), + ], +) +def test_get_dbt_test_alert_message_body( + monkeypatch, + status: str, + has_link: bool, + has_description: bool, + has_tags: bool, + has_owners: bool, + has_table: bool, + has_error: bool, + has_sample: bool, + has_env: bool, +): + env = "Test Env" if has_env else None + test_alert_model = build_dbt_test_alert_model( + status=status, + table_name=None if not has_table else "test_table", + tags=["tag1", "tag2"] if has_tags else None, + owners=["owner1", "owner2"] if has_owners else None, + test_description="Test description" if has_description else None, + error_message="Test error message" if has_error else None, + test_rows_sample=( + {"column1": "value1", "column2": "value2"} if has_sample else None + ), + test_results_query=None, + test_params=None, + env=env, + ) + + monkeypatch.setattr( + test_alert_model, "get_report_link", lambda: get_mock_report_link(has_link) + ) + + message_body = get_alert_message_body(test_alert_model) + adaptive_card_filename = get_expected_adaptive_filename( + status=status, + has_link=has_link, + has_description=has_description, + has_tags=has_tags, + has_owners=has_owners, + has_table=has_table, + has_error=has_error, + 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) 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 new file mode 100644 index 000000000..8f5c40820 --- /dev/null +++ b/tests/unit/alerts/alert_messages/test_elementary_test_alert_message.py @@ -0,0 +1,92 @@ +from pathlib import Path + +import pytest + +from elementary.messages.formats.adaptive_cards import format_adaptive_card +from tests.unit.alerts.alert_messages.test_alert_utils import ( + 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" + + +def build_elementary_test_alert_model(*args, **kwargs): + kwargs.pop("test_type", None) # Remove test_type if present + test_type = ( + "anomaly_detection" if kwargs.pop("has_anomaly", False) else "schema_change" + ) + return build_base_test_alert_model(*args, test_type=test_type, **kwargs) + + +@pytest.mark.parametrize( + "status,has_link,has_description,has_tags,has_owners,has_table,has_error,has_sample,has_anomaly,has_env", + [ + (None, False, False, False, False, False, False, False, False, False), + ("fail", True, True, True, True, True, True, True, True, True), + ("fail", False, False, False, False, False, False, False, False, False), + ("warn", True, False, True, False, True, False, True, False, True), + ("warn", False, True, False, True, False, True, False, True, False), + ("error", True, True, False, False, False, True, False, True, True), + ("error", False, True, True, False, True, False, True, False, True), + (None, True, False, True, False, True, False, True, True, True), + (None, False, True, False, True, False, True, False, True, True), + ], +) +def test_get_elementary_test_alert_message_body( + monkeypatch, + status: str, + has_link: bool, + has_description: bool, + has_tags: bool, + has_owners: bool, + has_table: bool, + has_error: bool, + has_sample: bool, + has_anomaly: bool, + has_env: bool, +): + env = "Test Env" if has_env else None + test_alert_model = build_elementary_test_alert_model( + status=status, + table_name=None if not has_table else "test_table", + tags=["tag1", "tag2"] if has_tags else None, + owners=["owner1", "owner2"] if has_owners else None, + test_description="Test description" if has_description else None, + error_message="Test error message" if has_error else None, + test_rows_sample=( + {"column1": "value1", "column2": "value2"} if has_sample else None + ), + test_results_query="SELECT * FROM test" if has_sample else None, + test_params={"param1": "value1"} if has_sample else None, + has_anomaly=has_anomaly, + other={"anomalous_value": 42} if has_anomaly else None, + env=env, + ) + + monkeypatch.setattr( + test_alert_model, "get_report_link", lambda: get_mock_report_link(has_link) + ) + + message_body = get_alert_message_body(test_alert_model) + adaptive_card_filename = ( + f"adaptive_card_elementary_test_alert" + f"_status-{status}" + f"_link-{has_link}" + f"_description-{has_description}" + f"_tags-{has_tags}" + f"_owners-{has_owners}" + f"_table-{has_table}" + f"_error-{has_error}" + 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) 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 new file mode 100644 index 000000000..8c040fc65 --- /dev/null +++ b/tests/unit/alerts/alert_messages/test_group_by_table_alert_message.py @@ -0,0 +1,88 @@ +from datetime import datetime, timezone +from pathlib import Path +from unittest.mock import patch + +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 ( + 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" + + +@pytest.mark.parametrize( + "has_model_errors,has_test_failures,has_test_warnings,has_test_errors,has_link,has_env", + [ + (True, True, True, True, True, True), + (True, True, True, False, True, True), + (True, True, False, True, True, True), + (True, False, True, True, True, True), + (False, True, True, True, True, True), + (False, True, False, True, False, False), + (True, False, True, False, True, False), + (False, False, True, True, False, False), + (True, False, False, True, False, False), + (False, True, False, False, False, False), + ], +) +def test_get_group_by_table_alert_message_body( + has_model_errors: bool, + has_test_failures: bool, + has_test_warnings: bool, + has_test_errors: bool, + has_link: bool, + has_env: bool, +): + detected_at = datetime(2025, 2, 3, 13, 21, 7, tzinfo=timezone.utc) + + env = "Test Env" if has_env else None + + alerts = create_test_alerts( + has_model_errors=has_model_errors, + has_test_failures=has_test_failures, + has_test_warnings=has_test_warnings, + has_test_errors=has_test_errors, + detected_at=detected_at, + count=10, + env=env, + ) + + # Create a list of patches for all alerts + patches = [ + patch.object(alert, "get_report_link", lambda: get_mock_report_link(has_link)) + for alert in alerts + ] + + # Apply all patches + for patcher in patches: + patcher.start() + + 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}" + 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) + + # Stop all patches + for patcher in patches: + patcher.stop() diff --git a/tests/unit/alerts/alert_messages/test_model_alert_message.py b/tests/unit/alerts/alert_messages/test_model_alert_message.py new file mode 100644 index 000000000..7f6457ea2 --- /dev/null +++ b/tests/unit/alerts/alert_messages/test_model_alert_message.py @@ -0,0 +1,82 @@ +from datetime import datetime, timezone +from pathlib import Path + +import pytest + +from elementary.messages.formats.adaptive_cards import format_adaptive_card +from tests.unit.alerts.alert_messages.test_alert_utils import ( + 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" + + +@pytest.mark.parametrize( + "status,has_link,has_tags,has_owners,has_path,has_suppression_interval,materialization,has_full_refresh,has_env", + [ + ("fail", True, True, True, True, True, "table", True, True), + ("fail", False, False, False, False, False, "table", False, False), + ("warn", True, True, True, False, True, "view", True, True), + ("error", False, True, True, True, False, "incremental", True, False), + (None, True, False, True, True, True, "table", False, True), + ("warn", False, True, False, True, True, "incremental", False, False), + ("error", True, True, False, False, True, "view", True, True), + (None, False, False, True, False, True, "table", True, True), + ("fail", True, False, False, True, False, "incremental", True, False), + ("warn", False, True, True, True, True, "view", False, False), + ], +) +def test_get_model_alert_message_body( + monkeypatch, + status: str, + has_link: bool, + has_tags: bool, + has_owners: bool, + has_path: bool, + has_suppression_interval: bool, + materialization: str, + has_full_refresh: bool, + has_env: bool, +): + env = "Test Env" if has_env else None + path = "models/test_model.sql" if has_path else "unknown_path" + model_alert_model = build_base_model_alert_model( + status=status, + tags=["tag1", "tag2"] if has_tags else None, + owners=["owner1", "owner2"] if has_owners else None, + path=path, + materialization=materialization, + full_refresh=has_full_refresh, + detected_at=datetime(2025, 2, 3, 13, 21, 7, tzinfo=timezone.utc), + alias="test_model", + message=None, + suppression_interval=24 if has_suppression_interval else None, + env=env, + ) + + monkeypatch.setattr( + model_alert_model, "get_report_link", lambda: get_mock_report_link(has_link) + ) + + message_body = get_alert_message_body(model_alert_model) + adaptive_card_filename = ( + f"adaptive_card_model_alert" + f"_status-{status}" + f"_link-{has_link}" + f"_tags-{has_tags}" + f"_owners-{has_owners}" + f"_path-{has_path}" + f"_suppression-{has_suppression_interval}" + 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) diff --git a/tests/unit/alerts/alert_messages/test_snapshot_alert_message.py b/tests/unit/alerts/alert_messages/test_snapshot_alert_message.py new file mode 100644 index 000000000..8ccfdde6f --- /dev/null +++ b/tests/unit/alerts/alert_messages/test_snapshot_alert_message.py @@ -0,0 +1,80 @@ +from datetime import datetime, timezone +from pathlib import Path + +import pytest + +from elementary.messages.formats.adaptive_cards import format_adaptive_card +from tests.unit.alerts.alert_messages.test_alert_utils import ( + 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" + + +@pytest.mark.parametrize( + "status,has_link,has_message,has_tags,has_owners,has_path,has_suppression_interval,has_env", + [ + ("fail", True, True, True, True, True, True, True), + ("fail", False, False, False, False, False, False, False), + ("warn", True, False, True, False, True, False, True), + ("warn", False, True, False, True, False, True, False), + ("error", True, True, False, True, True, False, True), + ("error", False, True, True, False, False, True, False), + (None, True, False, True, False, False, True, True), + (None, False, False, False, True, True, False, True), + ("fail", True, False, True, True, False, True, False), + ("warn", False, True, True, False, True, False, False), + ], +) +def test_get_snapshot_alert_message_body( + monkeypatch, + status: str, + has_link: bool, + has_message: bool, + has_tags: bool, + has_owners: bool, + has_path: bool, + has_suppression_interval: bool, + has_env: bool, +): + env = "Test Env" if has_env else None + path = "models/test_snapshot.sql" if has_path else "" + snapshot_alert_model = build_base_model_alert_model( + status=status, + tags=["tag1", "tag2"] if has_tags else None, + owners=["owner1", "owner2"] if has_owners else None, + path=path, + materialization="snapshot", # Always snapshot for this test + full_refresh=False, + detected_at=datetime(2025, 2, 3, 13, 21, 7, tzinfo=timezone.utc), + alias="test_snapshot", + message="Test message" if has_message else None, + suppression_interval=24 if has_suppression_interval else None, + env=env, + ) + + monkeypatch.setattr( + snapshot_alert_model, "get_report_link", lambda: get_mock_report_link(has_link) + ) + + message_body = get_alert_message_body(snapshot_alert_model) + adaptive_card_filename = ( + f"adaptive_card_snapshot_alert" + f"_status-{status}" + f"_link-{has_link}" + f"_message-{has_message}" + f"_tags-{has_tags}" + f"_owners-{has_owners}" + 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) 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 new file mode 100644 index 000000000..3b51a0695 --- /dev/null +++ b/tests/unit/alerts/alert_messages/test_source_freshness_alert_message.py @@ -0,0 +1,92 @@ +from datetime import datetime, timezone +from pathlib import Path + +import pytest + +from elementary.messages.formats.adaptive_cards import format_adaptive_card +from tests.unit.alerts.alert_messages.test_alert_utils import ( + 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" + + +@pytest.mark.parametrize( + "status,has_link,has_message,has_tags,has_owners,has_path,has_error,has_suppression_interval,has_env", + [ + ("runtime error", False, False, False, False, False, False, False, False), + ("runtime error", True, True, True, True, True, True, True, True), + ("runtime error", True, True, False, True, False, True, False, True), + ("runtime error", True, False, True, False, True, False, True, True), + ("runtime error", False, True, True, False, False, True, True, True), + ("error", False, True, True, True, False, True, False, True), + ("error", True, False, True, True, True, False, True, False), + ("error", True, True, False, False, True, True, True, True), + ("error", False, False, True, True, True, True, False, False), + ("error", True, False, False, False, False, False, True, False), + ], +) +def test_get_source_freshness_alert_message_body( + monkeypatch, + status: str, + has_link: bool, + has_message: bool, + has_tags: bool, + has_owners: bool, + has_path: bool, + has_error: bool, + has_suppression_interval: bool, + has_env: bool, +): + env = "Test Env" if has_env else None + path = "sources/test_source.yml" if has_path else "" + detected_at = datetime(2025, 2, 3, 13, 21, 7, tzinfo=timezone.utc) + snapshotted_at = detected_at + max_loaded_at = ( + datetime(2025, 2, 3, 11, 21, 7, tzinfo=timezone.utc) if has_message else None + ) + max_loaded_at_time_ago_in_s = 7200.0 if has_message else None + + source_freshness_alert_model = build_base_source_freshness_alert_model( + status=status, + tags=["tag1", "tag2"] if has_tags else None, + owners=["owner1", "owner2"] if has_owners else None, + path=path, + has_error=has_error, + has_message=has_message, + detected_at=detected_at, + snapshotted_at=snapshotted_at, + max_loaded_at=max_loaded_at, + max_loaded_at_time_ago_in_s=max_loaded_at_time_ago_in_s, + suppression_interval=24 if has_suppression_interval else None, + env=env, + ) + + monkeypatch.setattr( + source_freshness_alert_model, + "get_report_link", + lambda: get_mock_report_link(has_link), + ) + + message_body = get_alert_message_body(source_freshness_alert_model) + adaptive_card_filename = ( + f"adaptive_card_source_freshness_alert" + f"_status-{status}" + f"_link-{has_link}" + f"_message-{has_message}" + f"_tags-{has_tags}" + f"_owners-{has_owners}" + f"_path-{has_path}" + 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) diff --git a/tests/unit/messages/utils.py b/tests/unit/messages/utils.py index 9805eb6e1..b77c9ad55 100644 --- a/tests/unit/messages/utils.py +++ b/tests/unit/messages/utils.py @@ -20,9 +20,16 @@ def get_expected_json_path(fixture_dir: Path, filename: str) -> Path: def assert_expected_json(result: dict, expected_json_path: Path) -> None: + expected = json.loads(expected_json_path.read_text()) if OVERRIDE: logger.warning(f"Overriding expected JSON file: {expected_json_path}") - print("writing to file", OVERRIDE) - expected_json_path.write_text(json.dumps(result, indent=2)) - expected = json.loads(expected_json_path.read_text()) - assert json.dumps(result, indent=2) == json.dumps(expected, indent=2) + expected_json_path.write_text(json.dumps(result, indent=2) + "\n") + else: + try: + assert result == expected + except AssertionError as e: + error_message = ( + f"\nExpected JSON: \n{json.dumps(expected, indent=2)}\n" + f"\nActual JSON: \n{json.dumps(result, indent=2)}\n" + ) + raise AssertionError(error_message) from e