diff --git a/elementary/messages/formats/html.py b/elementary/messages/formats/html.py new file mode 100644 index 000000000..221f5e44e --- /dev/null +++ b/elementary/messages/formats/html.py @@ -0,0 +1,416 @@ +from __future__ import annotations + +from html import escape +from typing import Sequence + +from elementary.messages.blocks import ( + ActionsBlock, + CodeBlock, + DividerBlock, + ExpandableBlock, + FactBlock, + FactListBlock, + HeaderBlock, + Icon, + IconBlock, + InlineBlock, + InlineCodeBlock, + LineBlock, + LinesBlock, + LinkBlock, + MentionBlock, + TableBlock, + TextBlock, + TextStyle, + WhitespaceBlock, +) +from elementary.messages.formats.unicode import ICON_TO_UNICODE +from elementary.messages.message_body import Color, MessageBlock, MessageBody + +COLOR_MAP = { + Color.RED: "#ff0000", + Color.YELLOW: "#ffcc00", + Color.GREEN: "#33b989", +} + + +class HTMLFormatter: + # Container styles + _CONTAINER_STYLES = [ + "font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif", + "font-size:14px", + "line-height:1.5", + "color:#1f2937", + "background-color:#ffffff", + "border:1px solid #e5e7eb", + "border-radius:6px", + "padding:24px 32px 32px 32px", + "max-width:800px", + ] + + # Common margin/padding styles + _SECTION_MARGIN = "margin:0 0 12px" + _LINE_MARGIN = "margin:0;" + _LIST_ITEM_MARGIN = "margin:0 0 4px;" + _FACT_LIST_MARGIN = "margin:8px 0 20px" + + # Header styles + _HEADER_STYLE = "margin:0;font-size:18px;line-height:1.4;" + + # Code block styles + _CODE_BLOCK_STYLE = ( + "margin:0;padding:12px;" + "background-color:#f8fafc;border-radius:4px;" + "font-family:'SFMono-Regular',Consolas,'Liberation Mono',Menlo,monospace;" + "font-size:13px;line-height:1.5;white-space:pre-wrap;" + "max-height:400px;overflow-y:auto;" + ) + + # Inline code styles + _INLINE_CODE_STYLE = ( + "font-family:'SFMono-Regular',Consolas,'Liberation Mono',Menlo,monospace;" + "background-color:#eef2ff;border-radius:3px;padding:1px 4px;font-size:12px;" + ) + + # Link styles + _LINK_STYLE = "color:#2563eb;text-decoration:none;" + _MENTION_STYLE = "color:#0ea5e9;" + _ICON_MARGIN = "margin-right:4px;" + + # Divider styles + _DIVIDER_STYLE = "border:none;border-top:1px solid #e5e7eb;margin:16px 0;" + + # List styles + _UL_STYLE = "margin:0;padding-left:24px;list-style-position:outside;" + _LIST_ITEM_ICON_STYLE = "margin:0 0 4px;list-style:none;" + _BULLET_ICON_WRAPPER_STYLE = "margin-right:6px;" + + # Table styles + _TABLE_STYLE = ( + "width:100%;border-collapse:collapse;margin:0 0 12px;" + "border:1px solid #e5e7eb;border-radius:6px;overflow:hidden;" + ) + _TABLE_HEADER_STYLE = ( + "text-align:left;padding:8px;border-bottom:1px solid #e5e7eb;" + "font-weight:600;font-size:14px;background-color:#f8fafc;" + ) + _TABLE_CELL_STYLE = ( + "padding:8px;border-bottom:1px solid #f3f4f6;" + "vertical-align:top;font-size:14px;" + ) + + # Fact list styles + _FACT_LIST_TABLE_STYLE = "width:100%;border-collapse:collapse;" + _FACT_TITLE_STYLE = ( + "padding:4px 12px;font-weight:600;font-size:14px;color:#111827;" + "width:160px;white-space:nowrap;" + ) + + # Expandable block styles + _EXPANDABLE_CONTAINER_STYLE = ( + "border:1px solid #e5e7eb;border-radius:6px;margin:16px 0;" + ) + _EXPANDABLE_SUMMARY_STYLE = ( + "padding:12px 16px;font-weight:600;background-color:#f8fafc;" + "cursor:pointer;font-size:14px;user-select:none;-webkit-user-select:none;" + "list-style:none;" + ) + _EXPANDABLE_ARROW_STYLE = ( + "display:inline-block;margin-right:8px;color:#6b7280;font-size:10px;" + "transition:transform 0.2s ease;" + ) + _EXPANDABLE_BODY_STYLE = "padding:12px 16px;border-top:1px solid #e5e7eb;" + _EXPANDABLE_CSS = ( + "" + ) + + def format(self, message: MessageBody) -> str: + body_html = self.format_message_blocks(message.blocks) + container_style = self._build_container_style(message.color) + return f'
{body_html}
' + + def format_message_blocks(self, blocks: Sequence[MessageBlock]) -> str: + rendered: list[str] = [] + for block in blocks: + formatted = self.format_message_block(block) + if formatted: + rendered.append(formatted) + return "".join(rendered) + + def format_message_block(self, block: MessageBlock | ExpandableBlock) -> str: + if isinstance(block, HeaderBlock): + return self._format_header_block(block) + elif isinstance(block, CodeBlock): + return self._format_code_block(block) + elif isinstance(block, LinesBlock): + return self._format_lines_block(block) + elif isinstance(block, FactListBlock): + return self._format_fact_list_block(block) + elif isinstance(block, TableBlock): + return self._format_table_block(block) + elif isinstance(block, ExpandableBlock): + return self._format_expandable_block(block) + elif isinstance(block, DividerBlock): + return self._format_divider_block() + elif isinstance(block, ActionsBlock): + # Not supported in HTML emails (no interactivity without JavaScript) + return "" + else: + raise ValueError(f"Unsupported message block type: {type(block)}") + + def _format_header_block(self, block: HeaderBlock) -> str: + return self._wrap_section( + f'

{escape(block.text)}

' + ) + + def _format_code_block(self, block: CodeBlock) -> str: + code_html = escape(block.text) + return self._wrap_section( + f'
{code_html}
' + ) + + def _format_divider_block(self) -> str: + return f'
' + + def _wrap_section(self, html: str) -> str: + return f'
{html}
' + + def _format_icon(self, icon: Icon) -> str: + return ( + f'{escape(ICON_TO_UNICODE[icon])}' + ) + + def _format_text_block(self, block: TextBlock) -> str: + text = escape(block.text) + if block.style == TextStyle.BOLD: + return f"{text}" + elif block.style == TextStyle.ITALIC: + return f"{text}" + else: + return text + + def _format_inline_block(self, block: InlineBlock) -> str: + if isinstance(block, IconBlock): + return self._format_icon(block.icon) + elif isinstance(block, TextBlock): + return self._format_text_block(block) + elif isinstance(block, LinkBlock): + return self._format_link_block(block) + elif isinstance(block, InlineCodeBlock): + return self._format_inline_code_block(block) + elif isinstance(block, MentionBlock): + return self._format_mention_block(block) + elif isinstance(block, LineBlock): + return self._format_line_block(block) + elif isinstance(block, WhitespaceBlock): + return " " + else: + raise ValueError(f"Unsupported inline block type: {type(block)}") + + def _format_link_block(self, block: LinkBlock) -> str: + url = escape(block.url, quote=True) + text = escape(block.text) + return ( + f'{text}' + ) + + def _format_inline_code_block(self, block: InlineCodeBlock) -> str: + return f'{escape(block.code)}' + + def _format_mention_block(self, block: MentionBlock) -> str: + return f'{escape(block.user)}' + + def _format_line_block(self, block: LineBlock) -> str: + inlines = [self._format_inline_block(inline) for inline in block.inlines] + separator = escape(block.sep, quote=False) + return separator.join(inlines) + + def _format_lines_block(self, block: LinesBlock) -> str: + if not block.lines: + return "" + + if self._is_bullet_list(block): + return self._format_as_bullet_list(block) + + lines_html = [ + f'
{self._format_line_block(line_block)}
' + for line_block in block.lines + ] + return self._wrap_section("".join(lines_html)) + + def _skip_whitespace(self, inlines: Sequence[InlineBlock], start_idx: int) -> int: + idx = start_idx + while idx < len(inlines) and isinstance(inlines[idx], WhitespaceBlock): + idx += 1 + return idx + + def _is_bullet_marker(self, inline: InlineBlock) -> bool: + if isinstance(inline, IconBlock): + return True + if isinstance(inline, TextBlock) and len(inline.text) <= 2: + return True + return False + + def _is_bullet_list(self, block: LinesBlock) -> bool: + if not block.lines: + return False + + for line in block.lines: + if len(line.inlines) < 3: + return False + + idx = self._skip_whitespace(line.inlines, 0) + if idx >= len(line.inlines): + return False + + if not self._is_bullet_marker(line.inlines[idx]): + return False + + return True + + def _extract_bullet_parts( + self, line: LineBlock + ) -> tuple[InlineBlock, Sequence[InlineBlock]]: + idx = self._skip_whitespace(line.inlines, 0) + + bullet_inline = line.inlines[idx] + idx += 1 + + if idx < len(line.inlines): + space_inline = line.inlines[idx] + if isinstance(space_inline, TextBlock) and space_inline.text == " ": + idx += 1 + + content_inlines = line.inlines[idx:] + return bullet_inline, content_inlines + + def _format_bullet_list_item( + self, bullet_inline: InlineBlock, content_inlines: Sequence[InlineBlock] + ) -> str: + content_html = "".join( + self._format_inline_block(inline) for inline in content_inlines + ) + + if isinstance(bullet_inline, IconBlock): + bullet_html = self._format_icon(bullet_inline.icon) + return ( + f'
  • ' + f'{bullet_html}' + f"{content_html}
  • " + ) + else: + return f'
  • {content_html}
  • ' + + def _format_as_bullet_list(self, block: LinesBlock) -> str: + list_items = [] + for line in block.lines: + bullet_inline, content_inlines = self._extract_bullet_parts(line) + list_item = self._format_bullet_list_item(bullet_inline, content_inlines) + list_items.append(list_item) + + return self._wrap_section( + f'' + ) + + def _format_fact_list_block(self, block: FactListBlock) -> str: + if not block.facts: + return "" + + rows = [self._format_fact_row(fact) for fact in block.facts] + table_html = ( + f'' + f'{"".join(rows)}' + f"
    " + ) + return f'
    {table_html}
    ' + + def _format_fact_row(self, fact: FactBlock) -> str: + title_html = self._format_line_block(fact.title) + value_html = self._format_line_block(fact.value) + + value_weight = "700" if fact.primary else "400" + value_style = f"padding:4px 12px;font-weight:{value_weight};font-size:14px;" # noqa: E231,E702 + + return ( + "" + f'{title_html}' + f'{value_html}' + "" + ) + + def _format_table_block(self, block: TableBlock) -> str: + header_html = self._format_table_header(block.headers) if block.headers else "" + body_html = self._format_table_body(block.rows) + return f'{header_html}{body_html}
    ' + + def _format_table_header(self, headers: Sequence[str]) -> str: + header_cells = "".join( + f'{escape(header)}' + for header in headers + ) + return f"{header_cells}" + + def _format_table_body(self, rows: Sequence[Sequence[object]]) -> str: + body_rows = [self._format_table_row(row) for row in rows] + return f'{"".join(body_rows)}' + + def _format_table_row(self, row: Sequence[object]) -> str: + cells = "".join( + f'{escape(self._coerce_table_cell(cell))}' + for cell in row + ) + return f"{cells}" + + def _format_expandable_block(self, block: ExpandableBlock) -> str: + body_html = self.format_message_blocks(block.body) + title_html = escape(block.title) + open_attr = " open" if block.expanded else "" + + summary_html = self._build_expandable_summary(title_html) + + return ( + f'
    ' + f"{summary_html}" + f'
    {body_html}
    ' + "
    " + ) + + def _build_expandable_summary(self, title_html: str) -> str: + arrow = "▶" + return ( + f'' + f'{arrow}' + f"{title_html}" + "" + f"{self._EXPANDABLE_CSS}" + ) + + def _coerce_table_cell(self, cell: object) -> str: + if cell is None: + return "" + return str(cell) + + def _build_container_style(self, color: Color | None) -> str: + styles: list[str] = list(self._CONTAINER_STYLES) + if color and color in COLOR_MAP: + # Replace the default border color with the status color + styles = [ + ( + s + if not s.startswith("border:") + else f"border:1px solid {COLOR_MAP[color]}" + ) + for s in styles + ] + styles.append(f"border-left:4px solid {COLOR_MAP[color]}") # noqa: E231 + styles.append("padding-left:28px") # noqa: E231 + return ";".join(styles) + + +def format_html(message: MessageBody) -> str: + formatter = HTMLFormatter() + return formatter.format(message) diff --git a/tests/unit/messages/formats/adaptive_cards/fixtures/all_blocks_green.json b/tests/unit/messages/formats/adaptive_cards/fixtures/all_blocks_green.json index 46353ea55..a73fa836f 100644 --- a/tests/unit/messages/formats/adaptive_cards/fixtures/all_blocks_green.json +++ b/tests/unit/messages/formats/adaptive_cards/fixtures/all_blocks_green.json @@ -23,6 +23,28 @@ "text": "Normal text **Bold text** _Italic text_", "wrap": true }, + { + "type": "Container", + "style": "emphasis", + "items": [ + { + "type": "RichTextBlock", + "inlines": [ + { + "type": "TextRun", + "text": "def hello_world():\n print('Hello, World!')", + "fontType": "Monospace" + } + ] + } + ] + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ { "type": "TextBlock", "text": "- First bullet point", @@ -51,6 +73,127 @@ } ] }, + { + "type": "Table", + "columns": [ + { + "width": 1 + }, + { + "width": 1 + }, + { + "width": 1 + } + ], + "rows": [ + { + "type": "TableRow", + "cells": [ + { + "type": "TableCell", + "items": [ + { + "type": "TextBlock", + "text": "Column 1", + "wrap": true + } + ] + }, + { + "type": "TableCell", + "items": [ + { + "type": "TextBlock", + "text": "Column 2", + "wrap": true + } + ] + }, + { + "type": "TableCell", + "items": [ + { + "type": "TextBlock", + "text": "Column 3", + "wrap": true + } + ] + } + ] + }, + { + "type": "TableRow", + "cells": [ + { + "type": "TableCell", + "items": [ + { + "type": "TextBlock", + "text": "Row 1 Col 1", + "wrap": true + } + ] + }, + { + "type": "TableCell", + "items": [ + { + "type": "TextBlock", + "text": "Row 1 Col 2", + "wrap": true + } + ] + }, + { + "type": "TableCell", + "items": [ + { + "type": "TextBlock", + "text": "Row 1 Col 3", + "wrap": true + } + ] + } + ] + }, + { + "type": "TableRow", + "cells": [ + { + "type": "TableCell", + "items": [ + { + "type": "TextBlock", + "text": "Row 2 Col 1", + "wrap": true + } + ] + }, + { + "type": "TableCell", + "items": [ + { + "type": "TextBlock", + "text": "Row 2 Col 2", + "wrap": true + } + ] + }, + { + "type": "TableCell", + "items": [ + { + "type": "TextBlock", + "text": "Row 2 Col 3", + "wrap": true + } + ] + } + ] + } + ] + }, { "type": "ActionSet", "actions": [ diff --git a/tests/unit/messages/formats/adaptive_cards/fixtures/all_blocks_no_color.json b/tests/unit/messages/formats/adaptive_cards/fixtures/all_blocks_no_color.json index a5a6b77d7..51a9694d4 100644 --- a/tests/unit/messages/formats/adaptive_cards/fixtures/all_blocks_no_color.json +++ b/tests/unit/messages/formats/adaptive_cards/fixtures/all_blocks_no_color.json @@ -23,6 +23,28 @@ "text": "Normal text **Bold text** _Italic text_", "wrap": true }, + { + "type": "Container", + "style": "emphasis", + "items": [ + { + "type": "RichTextBlock", + "inlines": [ + { + "type": "TextRun", + "text": "def hello_world():\n print('Hello, World!')", + "fontType": "Monospace" + } + ] + } + ] + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ { "type": "TextBlock", "text": "- First bullet point", @@ -51,6 +73,127 @@ } ] }, + { + "type": "Table", + "columns": [ + { + "width": 1 + }, + { + "width": 1 + }, + { + "width": 1 + } + ], + "rows": [ + { + "type": "TableRow", + "cells": [ + { + "type": "TableCell", + "items": [ + { + "type": "TextBlock", + "text": "Column 1", + "wrap": true + } + ] + }, + { + "type": "TableCell", + "items": [ + { + "type": "TextBlock", + "text": "Column 2", + "wrap": true + } + ] + }, + { + "type": "TableCell", + "items": [ + { + "type": "TextBlock", + "text": "Column 3", + "wrap": true + } + ] + } + ] + }, + { + "type": "TableRow", + "cells": [ + { + "type": "TableCell", + "items": [ + { + "type": "TextBlock", + "text": "Row 1 Col 1", + "wrap": true + } + ] + }, + { + "type": "TableCell", + "items": [ + { + "type": "TextBlock", + "text": "Row 1 Col 2", + "wrap": true + } + ] + }, + { + "type": "TableCell", + "items": [ + { + "type": "TextBlock", + "text": "Row 1 Col 3", + "wrap": true + } + ] + } + ] + }, + { + "type": "TableRow", + "cells": [ + { + "type": "TableCell", + "items": [ + { + "type": "TextBlock", + "text": "Row 2 Col 1", + "wrap": true + } + ] + }, + { + "type": "TableCell", + "items": [ + { + "type": "TextBlock", + "text": "Row 2 Col 2", + "wrap": true + } + ] + }, + { + "type": "TableCell", + "items": [ + { + "type": "TextBlock", + "text": "Row 2 Col 3", + "wrap": true + } + ] + } + ] + } + ] + }, { "type": "ActionSet", "actions": [ diff --git a/tests/unit/messages/formats/adaptive_cards/fixtures/all_blocks_red.json b/tests/unit/messages/formats/adaptive_cards/fixtures/all_blocks_red.json index 1321406a8..3ec1c4eec 100644 --- a/tests/unit/messages/formats/adaptive_cards/fixtures/all_blocks_red.json +++ b/tests/unit/messages/formats/adaptive_cards/fixtures/all_blocks_red.json @@ -23,6 +23,28 @@ "text": "Normal text **Bold text** _Italic text_", "wrap": true }, + { + "type": "Container", + "style": "emphasis", + "items": [ + { + "type": "RichTextBlock", + "inlines": [ + { + "type": "TextRun", + "text": "def hello_world():\n print('Hello, World!')", + "fontType": "Monospace" + } + ] + } + ] + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ { "type": "TextBlock", "text": "- First bullet point", @@ -51,6 +73,127 @@ } ] }, + { + "type": "Table", + "columns": [ + { + "width": 1 + }, + { + "width": 1 + }, + { + "width": 1 + } + ], + "rows": [ + { + "type": "TableRow", + "cells": [ + { + "type": "TableCell", + "items": [ + { + "type": "TextBlock", + "text": "Column 1", + "wrap": true + } + ] + }, + { + "type": "TableCell", + "items": [ + { + "type": "TextBlock", + "text": "Column 2", + "wrap": true + } + ] + }, + { + "type": "TableCell", + "items": [ + { + "type": "TextBlock", + "text": "Column 3", + "wrap": true + } + ] + } + ] + }, + { + "type": "TableRow", + "cells": [ + { + "type": "TableCell", + "items": [ + { + "type": "TextBlock", + "text": "Row 1 Col 1", + "wrap": true + } + ] + }, + { + "type": "TableCell", + "items": [ + { + "type": "TextBlock", + "text": "Row 1 Col 2", + "wrap": true + } + ] + }, + { + "type": "TableCell", + "items": [ + { + "type": "TextBlock", + "text": "Row 1 Col 3", + "wrap": true + } + ] + } + ] + }, + { + "type": "TableRow", + "cells": [ + { + "type": "TableCell", + "items": [ + { + "type": "TextBlock", + "text": "Row 2 Col 1", + "wrap": true + } + ] + }, + { + "type": "TableCell", + "items": [ + { + "type": "TextBlock", + "text": "Row 2 Col 2", + "wrap": true + } + ] + }, + { + "type": "TableCell", + "items": [ + { + "type": "TextBlock", + "text": "Row 2 Col 3", + "wrap": true + } + ] + } + ] + } + ] + }, { "type": "ActionSet", "actions": [ diff --git a/tests/unit/messages/formats/adaptive_cards/fixtures/all_blocks_yellow.json b/tests/unit/messages/formats/adaptive_cards/fixtures/all_blocks_yellow.json index e7c7d1508..34a6b3b3e 100644 --- a/tests/unit/messages/formats/adaptive_cards/fixtures/all_blocks_yellow.json +++ b/tests/unit/messages/formats/adaptive_cards/fixtures/all_blocks_yellow.json @@ -23,6 +23,28 @@ "text": "Normal text **Bold text** _Italic text_", "wrap": true }, + { + "type": "Container", + "style": "emphasis", + "items": [ + { + "type": "RichTextBlock", + "inlines": [ + { + "type": "TextRun", + "text": "def hello_world():\n print('Hello, World!')", + "fontType": "Monospace" + } + ] + } + ] + } + ] + }, + { + "type": "Container", + "separator": true, + "items": [ { "type": "TextBlock", "text": "- First bullet point", @@ -51,6 +73,127 @@ } ] }, + { + "type": "Table", + "columns": [ + { + "width": 1 + }, + { + "width": 1 + }, + { + "width": 1 + } + ], + "rows": [ + { + "type": "TableRow", + "cells": [ + { + "type": "TableCell", + "items": [ + { + "type": "TextBlock", + "text": "Column 1", + "wrap": true + } + ] + }, + { + "type": "TableCell", + "items": [ + { + "type": "TextBlock", + "text": "Column 2", + "wrap": true + } + ] + }, + { + "type": "TableCell", + "items": [ + { + "type": "TextBlock", + "text": "Column 3", + "wrap": true + } + ] + } + ] + }, + { + "type": "TableRow", + "cells": [ + { + "type": "TableCell", + "items": [ + { + "type": "TextBlock", + "text": "Row 1 Col 1", + "wrap": true + } + ] + }, + { + "type": "TableCell", + "items": [ + { + "type": "TextBlock", + "text": "Row 1 Col 2", + "wrap": true + } + ] + }, + { + "type": "TableCell", + "items": [ + { + "type": "TextBlock", + "text": "Row 1 Col 3", + "wrap": true + } + ] + } + ] + }, + { + "type": "TableRow", + "cells": [ + { + "type": "TableCell", + "items": [ + { + "type": "TextBlock", + "text": "Row 2 Col 1", + "wrap": true + } + ] + }, + { + "type": "TableCell", + "items": [ + { + "type": "TextBlock", + "text": "Row 2 Col 2", + "wrap": true + } + ] + }, + { + "type": "TableCell", + "items": [ + { + "type": "TextBlock", + "text": "Row 2 Col 3", + "wrap": true + } + ] + } + ] + } + ] + }, { "type": "ActionSet", "actions": [ diff --git a/tests/unit/messages/formats/base_test_format.py b/tests/unit/messages/formats/base_test_format.py index 0cc3ee63d..133b63679 100644 --- a/tests/unit/messages/formats/base_test_format.py +++ b/tests/unit/messages/formats/base_test_format.py @@ -6,8 +6,11 @@ from elementary.messages.block_builders import BulletListBlock from elementary.messages.blocks import ( + ActionsBlock, CodeBlock, DividerBlock, + DropdownActionBlock, + DropdownOptionBlock, ExpandableBlock, FactBlock, FactListBlock, @@ -22,6 +25,7 @@ TableBlock, TextBlock, TextStyle, + UserSelectActionBlock, WhitespaceBlock, ) from elementary.messages.message_body import Color, MessageBody @@ -233,6 +237,8 @@ def test_format_message_body_all_blocks(self, color, expected_file): ) ] ), + CodeBlock(text="def hello_world():\n print('Hello, World!')"), + DividerBlock(), BulletListBlock( icon="-", lines=[ @@ -256,6 +262,13 @@ def test_format_message_body_all_blocks(self, color, expected_file): ), ] ), + TableBlock( + headers=["Column 1", "Column 2", "Column 3"], + rows=[ + ["Row 1 Col 1", "Row 1 Col 2", "Row 1 Col 3"], + ["Row 2 Col 1", "Row 2 Col 2", "Row 2 Col 3"], + ], + ), ExpandableBlock( title="Show Details", body=[ @@ -282,6 +295,23 @@ def test_format_message_body_all_blocks(self, color, expected_file): ], expanded=False, ), + ActionsBlock( + actions=[ + DropdownActionBlock( + action_id="priority_dropdown", + placeholder="Select priority", + options=[ + DropdownOptionBlock(text="High", value="high"), + DropdownOptionBlock(text="Medium", value="medium"), + DropdownOptionBlock(text="Low", value="low"), + ], + ), + UserSelectActionBlock( + action_id="assign_user", + placeholder="Assign to user", + ), + ] + ), LinesBlock( lines=[ LineBlock( diff --git a/tests/unit/messages/formats/block_kit/fixtures/all_blocks_green.json b/tests/unit/messages/formats/block_kit/fixtures/all_blocks_green.json index dac1badef..bcf2d3ff9 100644 --- a/tests/unit/messages/formats/block_kit/fixtures/all_blocks_green.json +++ b/tests/unit/messages/formats/block_kit/fixtures/all_blocks_green.json @@ -1,22 +1,33 @@ { - "blocks": [], + "blocks": [ + { + "type": "header", + "text": { + "type": "plain_text", + "text": "Main Header" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "Normal text *Bold text* _Italic text_" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```def hello_world():\n print('Hello, World!')```" + } + }, + { + "type": "divider" + } + ], "attachments": [ { "blocks": [ - { - "type": "header", - "text": { - "type": "plain_text", - "text": "Main Header" - } - }, - { - "type": "section", - "text": { - "type": "mrkdwn", - "text": "Normal text *Bold text* _Italic text_" - } - }, { "type": "section", "text": { @@ -44,6 +55,13 @@ } ] }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```Column 1 Column 2 Column 3\n----------- ----------- -----------\nRow 1 Col 1 Row 1 Col 2 Row 1 Col 3\nRow 2 Col 1 Row 2 Col 2 Row 2 Col 3```" + } + }, { "type": "section", "text": { @@ -51,6 +69,55 @@ "text": "\ud83d\udd0e *Details Section*\nHere's some content with a " } }, + { + "type": "actions", + "elements": [ + { + "type": "static_select", + "placeholder": { + "type": "plain_text", + "text": "Select priority", + "emoji": true + }, + "options": [ + { + "text": { + "type": "plain_text", + "text": "High", + "emoji": true + }, + "value": "high" + }, + { + "text": { + "type": "plain_text", + "text": "Medium", + "emoji": true + }, + "value": "medium" + }, + { + "text": { + "type": "plain_text", + "text": "Low", + "emoji": true + }, + "value": "low" + } + ], + "action_id": "priority_dropdown" + }, + { + "type": "users_select", + "placeholder": { + "type": "plain_text", + "text": "Assign to user", + "emoji": true + }, + "action_id": "assign_user" + } + ] + }, { "type": "section", "text": { diff --git a/tests/unit/messages/formats/block_kit/fixtures/all_blocks_no_color.json b/tests/unit/messages/formats/block_kit/fixtures/all_blocks_no_color.json index 7cdfd3cc5..428e3bae1 100644 --- a/tests/unit/messages/formats/block_kit/fixtures/all_blocks_no_color.json +++ b/tests/unit/messages/formats/block_kit/fixtures/all_blocks_no_color.json @@ -18,47 +18,114 @@ "type": "section", "text": { "type": "mrkdwn", - "text": "- First bullet point\n- Second bullet point" + "text": "```def hello_world():\n print('Hello, World!')```" } }, { - "type": "section", - "text": { - "type": "mrkdwn", - "text": "\u2705 Check item" - } - }, + "type": "divider" + } + ], + "attachments": [ { - "type": "section", - "fields": [ + "blocks": [ { - "type": "mrkdwn", - "text": "*Status*\nPassed" + "type": "section", + "text": { + "type": "mrkdwn", + "text": "- First bullet point\n- Second bullet point" + } }, { - "type": "mrkdwn", - "text": "*Tags*\ntest, example" + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\u2705 Check item" + } + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Status*\nPassed" + }, + { + "type": "mrkdwn", + "text": "*Tags*\ntest, example" + } + ] + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```Column 1 Column 2 Column 3\n----------- ----------- -----------\nRow 1 Col 1 Row 1 Col 2 Row 1 Col 3\nRow 2 Col 1 Row 2 Col 2 Row 2 Col 3```" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "\ud83d\udd0e *Details Section*\nHere's some content with a " + } + }, + { + "type": "actions", + "elements": [ + { + "type": "static_select", + "placeholder": { + "type": "plain_text", + "text": "Select priority", + "emoji": true + }, + "options": [ + { + "text": { + "type": "plain_text", + "text": "High", + "emoji": true + }, + "value": "high" + }, + { + "text": { + "type": "plain_text", + "text": "Medium", + "emoji": true + }, + "value": "medium" + }, + { + "text": { + "type": "plain_text", + "text": "Low", + "emoji": true + }, + "value": "low" + } + ], + "action_id": "priority_dropdown" + }, + { + "type": "users_select", + "placeholder": { + "type": "plain_text", + "text": "Assign to user", + "emoji": true + }, + "action_id": "assign_user" + } + ] + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "<@resolved_user1> `select 1`" + } } ] - }, - { - "type": "section", - "text": { - "type": "mrkdwn", - "text": "\ud83d\udd0e *Details Section*\nHere's some content with a " - } - }, - { - "type": "section", - "text": { - "type": "mrkdwn", - "text": "<@resolved_user1> `select 1`" - } - } - ], - "attachments": [ - { - "blocks": [] } ] } diff --git a/tests/unit/messages/formats/block_kit/fixtures/all_blocks_red.json b/tests/unit/messages/formats/block_kit/fixtures/all_blocks_red.json index cebd1e720..b0cf27e8a 100644 --- a/tests/unit/messages/formats/block_kit/fixtures/all_blocks_red.json +++ b/tests/unit/messages/formats/block_kit/fixtures/all_blocks_red.json @@ -1,22 +1,33 @@ { - "blocks": [], + "blocks": [ + { + "type": "header", + "text": { + "type": "plain_text", + "text": "Main Header" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "Normal text *Bold text* _Italic text_" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```def hello_world():\n print('Hello, World!')```" + } + }, + { + "type": "divider" + } + ], "attachments": [ { "blocks": [ - { - "type": "header", - "text": { - "type": "plain_text", - "text": "Main Header" - } - }, - { - "type": "section", - "text": { - "type": "mrkdwn", - "text": "Normal text *Bold text* _Italic text_" - } - }, { "type": "section", "text": { @@ -44,6 +55,13 @@ } ] }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```Column 1 Column 2 Column 3\n----------- ----------- -----------\nRow 1 Col 1 Row 1 Col 2 Row 1 Col 3\nRow 2 Col 1 Row 2 Col 2 Row 2 Col 3```" + } + }, { "type": "section", "text": { @@ -51,6 +69,55 @@ "text": "\ud83d\udd0e *Details Section*\nHere's some content with a " } }, + { + "type": "actions", + "elements": [ + { + "type": "static_select", + "placeholder": { + "type": "plain_text", + "text": "Select priority", + "emoji": true + }, + "options": [ + { + "text": { + "type": "plain_text", + "text": "High", + "emoji": true + }, + "value": "high" + }, + { + "text": { + "type": "plain_text", + "text": "Medium", + "emoji": true + }, + "value": "medium" + }, + { + "text": { + "type": "plain_text", + "text": "Low", + "emoji": true + }, + "value": "low" + } + ], + "action_id": "priority_dropdown" + }, + { + "type": "users_select", + "placeholder": { + "type": "plain_text", + "text": "Assign to user", + "emoji": true + }, + "action_id": "assign_user" + } + ] + }, { "type": "section", "text": { diff --git a/tests/unit/messages/formats/block_kit/fixtures/all_blocks_yellow.json b/tests/unit/messages/formats/block_kit/fixtures/all_blocks_yellow.json index 37f2cd39d..63df6a92b 100644 --- a/tests/unit/messages/formats/block_kit/fixtures/all_blocks_yellow.json +++ b/tests/unit/messages/formats/block_kit/fixtures/all_blocks_yellow.json @@ -1,22 +1,33 @@ { - "blocks": [], + "blocks": [ + { + "type": "header", + "text": { + "type": "plain_text", + "text": "Main Header" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "Normal text *Bold text* _Italic text_" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```def hello_world():\n print('Hello, World!')```" + } + }, + { + "type": "divider" + } + ], "attachments": [ { "blocks": [ - { - "type": "header", - "text": { - "type": "plain_text", - "text": "Main Header" - } - }, - { - "type": "section", - "text": { - "type": "mrkdwn", - "text": "Normal text *Bold text* _Italic text_" - } - }, { "type": "section", "text": { @@ -44,6 +55,13 @@ } ] }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "```Column 1 Column 2 Column 3\n----------- ----------- -----------\nRow 1 Col 1 Row 1 Col 2 Row 1 Col 3\nRow 2 Col 1 Row 2 Col 2 Row 2 Col 3```" + } + }, { "type": "section", "text": { @@ -51,6 +69,55 @@ "text": "\ud83d\udd0e *Details Section*\nHere's some content with a " } }, + { + "type": "actions", + "elements": [ + { + "type": "static_select", + "placeholder": { + "type": "plain_text", + "text": "Select priority", + "emoji": true + }, + "options": [ + { + "text": { + "type": "plain_text", + "text": "High", + "emoji": true + }, + "value": "high" + }, + { + "text": { + "type": "plain_text", + "text": "Medium", + "emoji": true + }, + "value": "medium" + }, + { + "text": { + "type": "plain_text", + "text": "Low", + "emoji": true + }, + "value": "low" + } + ], + "action_id": "priority_dropdown" + }, + { + "type": "users_select", + "placeholder": { + "type": "plain_text", + "text": "Assign to user", + "emoji": true + }, + "action_id": "assign_user" + } + ] + }, { "type": "section", "text": { diff --git a/tests/unit/messages/formats/html/fixtures/all_blocks_green.html b/tests/unit/messages/formats/html/fixtures/all_blocks_green.html new file mode 100644 index 000000000..123e0f7df --- /dev/null +++ b/tests/unit/messages/formats/html/fixtures/all_blocks_green.html @@ -0,0 +1,2 @@ +

    Main Header

    Normal text Bold text Italic text
    def hello_world():
    +    print('Hello, World!')

    • First bullet point
    • Second bullet point
    • Check item
    StatusPassed
    Tagstest, example
    Column 1Column 2Column 3
    Row 1 Col 1Row 1 Col 2Row 1 Col 3
    Row 2 Col 1Row 2 Col 2Row 2 Col 3
    Show Details
    🔎 Details Section
    Here's some content with a link
    user1 select 1
    diff --git a/tests/unit/messages/formats/html/fixtures/all_blocks_no_color.html b/tests/unit/messages/formats/html/fixtures/all_blocks_no_color.html new file mode 100644 index 000000000..21dbc4051 --- /dev/null +++ b/tests/unit/messages/formats/html/fixtures/all_blocks_no_color.html @@ -0,0 +1,2 @@ +

    Main Header

    Normal text Bold text Italic text
    def hello_world():
    +    print('Hello, World!')

    • First bullet point
    • Second bullet point
    • Check item
    StatusPassed
    Tagstest, example
    Column 1Column 2Column 3
    Row 1 Col 1Row 1 Col 2Row 1 Col 3
    Row 2 Col 1Row 2 Col 2Row 2 Col 3
    Show Details
    🔎 Details Section
    Here's some content with a link
    user1 select 1
    diff --git a/tests/unit/messages/formats/html/fixtures/all_blocks_red.html b/tests/unit/messages/formats/html/fixtures/all_blocks_red.html new file mode 100644 index 000000000..8fe0eb5e8 --- /dev/null +++ b/tests/unit/messages/formats/html/fixtures/all_blocks_red.html @@ -0,0 +1,2 @@ +

    Main Header

    Normal text Bold text Italic text
    def hello_world():
    +    print('Hello, World!')

    • First bullet point
    • Second bullet point
    • Check item
    StatusPassed
    Tagstest, example
    Column 1Column 2Column 3
    Row 1 Col 1Row 1 Col 2Row 1 Col 3
    Row 2 Col 1Row 2 Col 2Row 2 Col 3
    Show Details
    🔎 Details Section
    Here's some content with a link
    user1 select 1
    diff --git a/tests/unit/messages/formats/html/fixtures/all_blocks_yellow.html b/tests/unit/messages/formats/html/fixtures/all_blocks_yellow.html new file mode 100644 index 000000000..571f1919e --- /dev/null +++ b/tests/unit/messages/formats/html/fixtures/all_blocks_yellow.html @@ -0,0 +1,2 @@ +

    Main Header

    Normal text Bold text Italic text
    def hello_world():
    +    print('Hello, World!')

    • First bullet point
    • Second bullet point
    • Check item
    StatusPassed
    Tagstest, example
    Column 1Column 2Column 3
    Row 1 Col 1Row 1 Col 2Row 1 Col 3
    Row 2 Col 1Row 2 Col 2Row 2 Col 3
    Show Details
    🔎 Details Section
    Here's some content with a link
    user1 select 1
    diff --git a/tests/unit/messages/formats/html/fixtures/all_icons.html b/tests/unit/messages/formats/html/fixtures/all_icons.html new file mode 100644 index 000000000..ddccf999c --- /dev/null +++ b/tests/unit/messages/formats/html/fixtures/all_icons.html @@ -0,0 +1 @@ +
    RED_TRIANGLE 🔺 X WARNING ⚠️ EXCLAMATION CHECK MAGNIFYING_GLASS 🔎 HAMMER_AND_WRENCH 🛠️ POLICE_LIGHT 🚨 INFO ℹ️ EYE 👁️ GEAR ⚙️ BELL 🔔 GEM 💎 SPARKLES
    diff --git a/tests/unit/messages/formats/html/fixtures/bullet_list.html b/tests/unit/messages/formats/html/fixtures/bullet_list.html new file mode 100644 index 000000000..4f38f3aa4 --- /dev/null +++ b/tests/unit/messages/formats/html/fixtures/bullet_list.html @@ -0,0 +1 @@ +
    • First bullet
    • Second bullet
    • Check item 1
    • Check item 2
    diff --git a/tests/unit/messages/formats/html/fixtures/code_block_200.html b/tests/unit/messages/formats/html/fixtures/code_block_200.html new file mode 100644 index 000000000..d3423f834 --- /dev/null +++ b/tests/unit/messages/formats/html/fixtures/code_block_200.html @@ -0,0 +1 @@ +
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, c
    diff --git a/tests/unit/messages/formats/html/fixtures/code_block_50.html b/tests/unit/messages/formats/html/fixtures/code_block_50.html new file mode 100644 index 000000000..23f338ad7 --- /dev/null +++ b/tests/unit/messages/formats/html/fixtures/code_block_50.html @@ -0,0 +1 @@ +
    Lorem ipsum dolor sit amet, consectetur adipiscing
    diff --git a/tests/unit/messages/formats/html/fixtures/code_block_500.html b/tests/unit/messages/formats/html/fixtures/code_block_500.html new file mode 100644 index 000000000..f2c5f219b --- /dev/null +++ b/tests/unit/messages/formats/html/fixtures/code_block_500.html @@ -0,0 +1 @@ +
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adip
    diff --git a/tests/unit/messages/formats/html/fixtures/code_block_long.html b/tests/unit/messages/formats/html/fixtures/code_block_long.html new file mode 100644 index 000000000..b6baf5ba9 --- /dev/null +++ b/tests/unit/messages/formats/html/fixtures/code_block_long.html @@ -0,0 +1,30 @@ +

    Long Code Block Test

    line_0 = 'This is a long line of code number 0'
    +line_1 = 'This is a long line of code number 1'
    +line_2 = 'This is a long line of code number 2'
    +line_3 = 'This is a long line of code number 3'
    +line_4 = 'This is a long line of code number 4'
    +line_5 = 'This is a long line of code number 5'
    +line_6 = 'This is a long line of code number 6'
    +line_7 = 'This is a long line of code number 7'
    +line_8 = 'This is a long line of code number 8'
    +line_9 = 'This is a long line of code number 9'
    +line_10 = 'This is a long line of code number 10'
    +line_11 = 'This is a long line of code number 11'
    +line_12 = 'This is a long line of code number 12'
    +line_13 = 'This is a long line of code number 13'
    +line_14 = 'This is a long line of code number 14'
    +line_15 = 'This is a long line of code number 15'
    +line_16 = 'This is a long line of code number 16'
    +line_17 = 'This is a long line of code number 17'
    +line_18 = 'This is a long line of code number 18'
    +line_19 = 'This is a long line of code number 19'
    +line_20 = 'This is a long line of code number 20'
    +line_21 = 'This is a long line of code number 21'
    +line_22 = 'This is a long line of code number 22'
    +line_23 = 'This is a long line of code number 23'
    +line_24 = 'This is a long line of code number 24'
    +line_25 = 'This is a long line of code number 25'
    +line_26 = 'This is a long line of code number 26'
    +line_27 = 'This is a long line of code number 27'
    +line_28 = 'This is a long line of code number 28'
    +line_29 = 'This is a long line of code number 29'
    \ No newline at end of file diff --git a/tests/unit/messages/formats/html/fixtures/colored_header.html b/tests/unit/messages/formats/html/fixtures/colored_header.html new file mode 100644 index 000000000..4eb94788d --- /dev/null +++ b/tests/unit/messages/formats/html/fixtures/colored_header.html @@ -0,0 +1 @@ +

    Test Header

    diff --git a/tests/unit/messages/formats/html/fixtures/divider_blocks.html b/tests/unit/messages/formats/html/fixtures/divider_blocks.html new file mode 100644 index 000000000..37c9c077e --- /dev/null +++ b/tests/unit/messages/formats/html/fixtures/divider_blocks.html @@ -0,0 +1 @@ +

    First Section


    Second Section

    diff --git a/tests/unit/messages/formats/html/fixtures/expandable_block.html b/tests/unit/messages/formats/html/fixtures/expandable_block.html new file mode 100644 index 000000000..304e84165 --- /dev/null +++ b/tests/unit/messages/formats/html/fixtures/expandable_block.html @@ -0,0 +1 @@ +
    Show More
    Hidden content
    diff --git a/tests/unit/messages/formats/html/fixtures/fact_list.html b/tests/unit/messages/formats/html/fixtures/fact_list.html new file mode 100644 index 000000000..483c38306 --- /dev/null +++ b/tests/unit/messages/formats/html/fixtures/fact_list.html @@ -0,0 +1 @@ +
    StatusPassed
    diff --git a/tests/unit/messages/formats/html/fixtures/nested_expandable.html b/tests/unit/messages/formats/html/fixtures/nested_expandable.html new file mode 100644 index 000000000..fb93ac312 --- /dev/null +++ b/tests/unit/messages/formats/html/fixtures/nested_expandable.html @@ -0,0 +1 @@ +
    Outer Block
    🔎 Title with Icon
    Some content with a link
    Inner Block
    Inner content
    diff --git a/tests/unit/messages/formats/html/fixtures/simple_header.html b/tests/unit/messages/formats/html/fixtures/simple_header.html new file mode 100644 index 000000000..33e2002fe --- /dev/null +++ b/tests/unit/messages/formats/html/fixtures/simple_header.html @@ -0,0 +1 @@ +

    Test Header

    diff --git a/tests/unit/messages/formats/html/fixtures/table_block_200_1.html b/tests/unit/messages/formats/html/fixtures/table_block_200_1.html new file mode 100644 index 000000000..ee9dacfaa --- /dev/null +++ b/tests/unit/messages/formats/html/fixtures/table_block_200_1.html @@ -0,0 +1 @@ +
    Column 0
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, c
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, c
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, c
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, c
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, c
    diff --git a/tests/unit/messages/formats/html/fixtures/table_block_200_2.html b/tests/unit/messages/formats/html/fixtures/table_block_200_2.html new file mode 100644 index 000000000..a69e3a794 --- /dev/null +++ b/tests/unit/messages/formats/html/fixtures/table_block_200_2.html @@ -0,0 +1 @@ +
    Column 0Column 1
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, cLorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, c
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, cLorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, c
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, cLorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, c
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, cLorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, c
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, cLorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, c
    diff --git a/tests/unit/messages/formats/html/fixtures/table_block_200_3.html b/tests/unit/messages/formats/html/fixtures/table_block_200_3.html new file mode 100644 index 000000000..bb7cbab39 --- /dev/null +++ b/tests/unit/messages/formats/html/fixtures/table_block_200_3.html @@ -0,0 +1 @@ +
    Column 0Column 1Column 2
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, cLorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, cLorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, c
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, cLorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, cLorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, c
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, cLorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, cLorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, c
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, cLorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, cLorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, c
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, cLorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, cLorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, c
    diff --git a/tests/unit/messages/formats/html/fixtures/table_block_200_4.html b/tests/unit/messages/formats/html/fixtures/table_block_200_4.html new file mode 100644 index 000000000..e5065ede4 --- /dev/null +++ b/tests/unit/messages/formats/html/fixtures/table_block_200_4.html @@ -0,0 +1 @@ +
    Column 0Column 1Column 2Column 3
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, cLorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, cLorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, cLorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, c
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, cLorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, cLorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, cLorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, c
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, cLorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, cLorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, cLorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, c
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, cLorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, cLorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, cLorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, c
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, cLorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, cLorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, cLorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, c
    diff --git a/tests/unit/messages/formats/html/fixtures/table_block_200_5.html b/tests/unit/messages/formats/html/fixtures/table_block_200_5.html new file mode 100644 index 000000000..ede370bf7 --- /dev/null +++ b/tests/unit/messages/formats/html/fixtures/table_block_200_5.html @@ -0,0 +1 @@ +
    Column 0Column 1Column 2Column 3Column 4
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, cLorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, cLorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, cLorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, cLorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, c
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, cLorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, cLorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, cLorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, cLorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, c
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, cLorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, cLorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, cLorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, cLorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, c
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, cLorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, cLorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, cLorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, cLorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, c
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, cLorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, cLorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, cLorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, cLorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, c
    diff --git a/tests/unit/messages/formats/html/fixtures/table_block_30_1.html b/tests/unit/messages/formats/html/fixtures/table_block_30_1.html new file mode 100644 index 000000000..870d1594a --- /dev/null +++ b/tests/unit/messages/formats/html/fixtures/table_block_30_1.html @@ -0,0 +1 @@ +
    Column 0
    Lorem ipsum dolor sit amet, co
    Lorem ipsum dolor sit amet, co
    Lorem ipsum dolor sit amet, co
    Lorem ipsum dolor sit amet, co
    Lorem ipsum dolor sit amet, co
    diff --git a/tests/unit/messages/formats/html/fixtures/table_block_30_2.html b/tests/unit/messages/formats/html/fixtures/table_block_30_2.html new file mode 100644 index 000000000..1e4826f5b --- /dev/null +++ b/tests/unit/messages/formats/html/fixtures/table_block_30_2.html @@ -0,0 +1 @@ +
    Column 0Column 1
    Lorem ipsum dolor sit amet, coLorem ipsum dolor sit amet, co
    Lorem ipsum dolor sit amet, coLorem ipsum dolor sit amet, co
    Lorem ipsum dolor sit amet, coLorem ipsum dolor sit amet, co
    Lorem ipsum dolor sit amet, coLorem ipsum dolor sit amet, co
    Lorem ipsum dolor sit amet, coLorem ipsum dolor sit amet, co
    diff --git a/tests/unit/messages/formats/html/fixtures/table_block_30_3.html b/tests/unit/messages/formats/html/fixtures/table_block_30_3.html new file mode 100644 index 000000000..44bfffd5a --- /dev/null +++ b/tests/unit/messages/formats/html/fixtures/table_block_30_3.html @@ -0,0 +1 @@ +
    Column 0Column 1Column 2
    Lorem ipsum dolor sit amet, coLorem ipsum dolor sit amet, coLorem ipsum dolor sit amet, co
    Lorem ipsum dolor sit amet, coLorem ipsum dolor sit amet, coLorem ipsum dolor sit amet, co
    Lorem ipsum dolor sit amet, coLorem ipsum dolor sit amet, coLorem ipsum dolor sit amet, co
    Lorem ipsum dolor sit amet, coLorem ipsum dolor sit amet, coLorem ipsum dolor sit amet, co
    Lorem ipsum dolor sit amet, coLorem ipsum dolor sit amet, coLorem ipsum dolor sit amet, co
    diff --git a/tests/unit/messages/formats/html/fixtures/table_block_30_4.html b/tests/unit/messages/formats/html/fixtures/table_block_30_4.html new file mode 100644 index 000000000..0ae14dce4 --- /dev/null +++ b/tests/unit/messages/formats/html/fixtures/table_block_30_4.html @@ -0,0 +1 @@ +
    Column 0Column 1Column 2Column 3
    Lorem ipsum dolor sit amet, coLorem ipsum dolor sit amet, coLorem ipsum dolor sit amet, coLorem ipsum dolor sit amet, co
    Lorem ipsum dolor sit amet, coLorem ipsum dolor sit amet, coLorem ipsum dolor sit amet, coLorem ipsum dolor sit amet, co
    Lorem ipsum dolor sit amet, coLorem ipsum dolor sit amet, coLorem ipsum dolor sit amet, coLorem ipsum dolor sit amet, co
    Lorem ipsum dolor sit amet, coLorem ipsum dolor sit amet, coLorem ipsum dolor sit amet, coLorem ipsum dolor sit amet, co
    Lorem ipsum dolor sit amet, coLorem ipsum dolor sit amet, coLorem ipsum dolor sit amet, coLorem ipsum dolor sit amet, co
    diff --git a/tests/unit/messages/formats/html/fixtures/table_block_30_5.html b/tests/unit/messages/formats/html/fixtures/table_block_30_5.html new file mode 100644 index 000000000..83313fd79 --- /dev/null +++ b/tests/unit/messages/formats/html/fixtures/table_block_30_5.html @@ -0,0 +1 @@ +
    Column 0Column 1Column 2Column 3Column 4
    Lorem ipsum dolor sit amet, coLorem ipsum dolor sit amet, coLorem ipsum dolor sit amet, coLorem ipsum dolor sit amet, coLorem ipsum dolor sit amet, co
    Lorem ipsum dolor sit amet, coLorem ipsum dolor sit amet, coLorem ipsum dolor sit amet, coLorem ipsum dolor sit amet, coLorem ipsum dolor sit amet, co
    Lorem ipsum dolor sit amet, coLorem ipsum dolor sit amet, coLorem ipsum dolor sit amet, coLorem ipsum dolor sit amet, coLorem ipsum dolor sit amet, co
    Lorem ipsum dolor sit amet, coLorem ipsum dolor sit amet, coLorem ipsum dolor sit amet, coLorem ipsum dolor sit amet, coLorem ipsum dolor sit amet, co
    Lorem ipsum dolor sit amet, coLorem ipsum dolor sit amet, coLorem ipsum dolor sit amet, coLorem ipsum dolor sit amet, coLorem ipsum dolor sit amet, co
    diff --git a/tests/unit/messages/formats/html/fixtures/table_block_8_1.html b/tests/unit/messages/formats/html/fixtures/table_block_8_1.html new file mode 100644 index 000000000..4ced8c9e7 --- /dev/null +++ b/tests/unit/messages/formats/html/fixtures/table_block_8_1.html @@ -0,0 +1 @@ +
    Column 0
    Lorem ip
    Lorem ip
    Lorem ip
    Lorem ip
    Lorem ip
    diff --git a/tests/unit/messages/formats/html/fixtures/table_block_8_2.html b/tests/unit/messages/formats/html/fixtures/table_block_8_2.html new file mode 100644 index 000000000..9616a92bb --- /dev/null +++ b/tests/unit/messages/formats/html/fixtures/table_block_8_2.html @@ -0,0 +1 @@ +
    Column 0Column 1
    Lorem ipLorem ip
    Lorem ipLorem ip
    Lorem ipLorem ip
    Lorem ipLorem ip
    Lorem ipLorem ip
    diff --git a/tests/unit/messages/formats/html/fixtures/table_block_8_3.html b/tests/unit/messages/formats/html/fixtures/table_block_8_3.html new file mode 100644 index 000000000..1cb35c910 --- /dev/null +++ b/tests/unit/messages/formats/html/fixtures/table_block_8_3.html @@ -0,0 +1 @@ +
    Column 0Column 1Column 2
    Lorem ipLorem ipLorem ip
    Lorem ipLorem ipLorem ip
    Lorem ipLorem ipLorem ip
    Lorem ipLorem ipLorem ip
    Lorem ipLorem ipLorem ip
    diff --git a/tests/unit/messages/formats/html/fixtures/table_block_8_4.html b/tests/unit/messages/formats/html/fixtures/table_block_8_4.html new file mode 100644 index 000000000..32f375310 --- /dev/null +++ b/tests/unit/messages/formats/html/fixtures/table_block_8_4.html @@ -0,0 +1 @@ +
    Column 0Column 1Column 2Column 3
    Lorem ipLorem ipLorem ipLorem ip
    Lorem ipLorem ipLorem ipLorem ip
    Lorem ipLorem ipLorem ipLorem ip
    Lorem ipLorem ipLorem ipLorem ip
    Lorem ipLorem ipLorem ipLorem ip
    diff --git a/tests/unit/messages/formats/html/fixtures/table_block_8_5.html b/tests/unit/messages/formats/html/fixtures/table_block_8_5.html new file mode 100644 index 000000000..fffc5d69d --- /dev/null +++ b/tests/unit/messages/formats/html/fixtures/table_block_8_5.html @@ -0,0 +1 @@ +
    Column 0Column 1Column 2Column 3Column 4
    Lorem ipLorem ipLorem ipLorem ipLorem ip
    Lorem ipLorem ipLorem ipLorem ipLorem ip
    Lorem ipLorem ipLorem ipLorem ipLorem ip
    Lorem ipLorem ipLorem ipLorem ipLorem ip
    Lorem ipLorem ipLorem ipLorem ipLorem ip
    diff --git a/tests/unit/messages/formats/html/fixtures/text_length_1000.html b/tests/unit/messages/formats/html/fixtures/text_length_1000.html new file mode 100644 index 000000000..c98622161 --- /dev/null +++ b/tests/unit/messages/formats/html/fixtures/text_length_1000.html @@ -0,0 +1 @@ +
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, con
    diff --git a/tests/unit/messages/formats/html/fixtures/text_length_200.html b/tests/unit/messages/formats/html/fixtures/text_length_200.html new file mode 100644 index 000000000..e303e1db1 --- /dev/null +++ b/tests/unit/messages/formats/html/fixtures/text_length_200.html @@ -0,0 +1 @@ +
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, c
    diff --git a/tests/unit/messages/formats/html/fixtures/text_length_50.html b/tests/unit/messages/formats/html/fixtures/text_length_50.html new file mode 100644 index 000000000..8a1a80a5e --- /dev/null +++ b/tests/unit/messages/formats/html/fixtures/text_length_50.html @@ -0,0 +1 @@ +
    Lorem ipsum dolor sit amet, consectetur adipiscing
    diff --git a/tests/unit/messages/formats/html/fixtures/text_length_500.html b/tests/unit/messages/formats/html/fixtures/text_length_500.html new file mode 100644 index 000000000..9c2e79a06 --- /dev/null +++ b/tests/unit/messages/formats/html/fixtures/text_length_500.html @@ -0,0 +1 @@ +
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adip
    diff --git a/tests/unit/messages/formats/html/fixtures/text_styles.html b/tests/unit/messages/formats/html/fixtures/text_styles.html new file mode 100644 index 000000000..cf1c6ffcc --- /dev/null +++ b/tests/unit/messages/formats/html/fixtures/text_styles.html @@ -0,0 +1 @@ +
    Normal text Bold text Italic text
    diff --git a/tests/unit/messages/formats/html/fixtures/whitespace_block.html b/tests/unit/messages/formats/html/fixtures/whitespace_block.html new file mode 100644 index 000000000..bbf354806 --- /dev/null +++ b/tests/unit/messages/formats/html/fixtures/whitespace_block.html @@ -0,0 +1 @@ +
    This should not be indented
      This should be indented
    diff --git a/tests/unit/messages/formats/html/test_html.py b/tests/unit/messages/formats/html/test_html.py new file mode 100644 index 000000000..7ae3059b4 --- /dev/null +++ b/tests/unit/messages/formats/html/test_html.py @@ -0,0 +1,19 @@ +from pathlib import Path + +from elementary.messages.formats.html import format_html +from elementary.messages.message_body import MessageBody +from tests.unit.messages.formats.base_test_format import BaseTestFormat +from tests.unit.messages.utils import assert_expected_text, get_expected_file_path + +FIXTURES_DIR = Path(__file__).parent / "fixtures" + + +class TestHTML(BaseTestFormat[str]): + def format(self, message_body: MessageBody) -> str: + return format_html(message_body) + + def get_expected_file_path(self, name: str) -> Path: + return get_expected_file_path(FIXTURES_DIR, f"{name}.html") + + def assert_expected_value(self, result: str, expected_file_path: Path) -> None: + assert_expected_text(result, expected_file_path) diff --git a/tests/unit/messages/formats/markdown/fixtures/all_blocks_green.md b/tests/unit/messages/formats/markdown/fixtures/all_blocks_green.md index c663e1ae2..4d17606aa 100644 --- a/tests/unit/messages/formats/markdown/fixtures/all_blocks_green.md +++ b/tests/unit/messages/formats/markdown/fixtures/all_blocks_green.md @@ -2,6 +2,13 @@ Normal text **Bold text** _Italic text_ +``` +def hello_world(): + print('Hello, World!') +``` + +--- + - First bullet point - Second bullet point @@ -9,8 +16,17 @@ Normal text **Bold text** _Italic text_ Status: Passed | Tags: test, example +``` +Column 1 Column 2 Column 3 +----------- ----------- ----------- +Row 1 Col 1 Row 1 Col 2 Row 1 Col 3 +Row 2 Col 1 Row 2 Col 2 Row 2 Col 3 +``` + > **Show Details**\ > 🔎 **Details Section**\ > Here's some content with a [link](https://example.com) + + user1 `select 1` diff --git a/tests/unit/messages/formats/markdown/fixtures/all_blocks_no_color.md b/tests/unit/messages/formats/markdown/fixtures/all_blocks_no_color.md index c663e1ae2..4d17606aa 100644 --- a/tests/unit/messages/formats/markdown/fixtures/all_blocks_no_color.md +++ b/tests/unit/messages/formats/markdown/fixtures/all_blocks_no_color.md @@ -2,6 +2,13 @@ Normal text **Bold text** _Italic text_ +``` +def hello_world(): + print('Hello, World!') +``` + +--- + - First bullet point - Second bullet point @@ -9,8 +16,17 @@ Normal text **Bold text** _Italic text_ Status: Passed | Tags: test, example +``` +Column 1 Column 2 Column 3 +----------- ----------- ----------- +Row 1 Col 1 Row 1 Col 2 Row 1 Col 3 +Row 2 Col 1 Row 2 Col 2 Row 2 Col 3 +``` + > **Show Details**\ > 🔎 **Details Section**\ > Here's some content with a [link](https://example.com) + + user1 `select 1` diff --git a/tests/unit/messages/formats/markdown/fixtures/all_blocks_red.md b/tests/unit/messages/formats/markdown/fixtures/all_blocks_red.md index c663e1ae2..4d17606aa 100644 --- a/tests/unit/messages/formats/markdown/fixtures/all_blocks_red.md +++ b/tests/unit/messages/formats/markdown/fixtures/all_blocks_red.md @@ -2,6 +2,13 @@ Normal text **Bold text** _Italic text_ +``` +def hello_world(): + print('Hello, World!') +``` + +--- + - First bullet point - Second bullet point @@ -9,8 +16,17 @@ Normal text **Bold text** _Italic text_ Status: Passed | Tags: test, example +``` +Column 1 Column 2 Column 3 +----------- ----------- ----------- +Row 1 Col 1 Row 1 Col 2 Row 1 Col 3 +Row 2 Col 1 Row 2 Col 2 Row 2 Col 3 +``` + > **Show Details**\ > 🔎 **Details Section**\ > Here's some content with a [link](https://example.com) + + user1 `select 1` diff --git a/tests/unit/messages/formats/markdown/fixtures/all_blocks_yellow.md b/tests/unit/messages/formats/markdown/fixtures/all_blocks_yellow.md index c663e1ae2..4d17606aa 100644 --- a/tests/unit/messages/formats/markdown/fixtures/all_blocks_yellow.md +++ b/tests/unit/messages/formats/markdown/fixtures/all_blocks_yellow.md @@ -2,6 +2,13 @@ Normal text **Bold text** _Italic text_ +``` +def hello_world(): + print('Hello, World!') +``` + +--- + - First bullet point - Second bullet point @@ -9,8 +16,17 @@ Normal text **Bold text** _Italic text_ Status: Passed | Tags: test, example +``` +Column 1 Column 2 Column 3 +----------- ----------- ----------- +Row 1 Col 1 Row 1 Col 2 Row 1 Col 3 +Row 2 Col 1 Row 2 Col 2 Row 2 Col 3 +``` + > **Show Details**\ > 🔎 **Details Section**\ > Here's some content with a [link](https://example.com) + + user1 `select 1` diff --git a/tests/unit/messages/formats/markdown/fixtures/nested_expandable.md b/tests/unit/messages/formats/markdown/fixtures/nested_expandable.md index 1b53e8313..44cc4a24c 100644 --- a/tests/unit/messages/formats/markdown/fixtures/nested_expandable.md +++ b/tests/unit/messages/formats/markdown/fixtures/nested_expandable.md @@ -4,4 +4,3 @@ > > > **Inner Block**\ > > Inner content - diff --git a/tests/unit/messages/formats/text/fixtures/all_blocks_green.txt b/tests/unit/messages/formats/text/fixtures/all_blocks_green.txt index 9a7c72685..965872801 100644 --- a/tests/unit/messages/formats/text/fixtures/all_blocks_green.txt +++ b/tests/unit/messages/formats/text/fixtures/all_blocks_green.txt @@ -1,10 +1,18 @@ Main Header Normal text Bold text Italic text +def hello_world(): + print('Hello, World!') +-------------------------------- - First bullet point - Second bullet point ✅ Check item Status: Passed | Tags: test, example +Column 1 Column 2 Column 3 +----------- ----------- ----------- +Row 1 Col 1 Row 1 Col 2 Row 1 Col 3 +Row 2 Col 1 Row 2 Col 2 Row 2 Col 3 Show Details 🔎 Details Section Here's some content with a link (https://example.com) + user1 select 1 diff --git a/tests/unit/messages/formats/text/fixtures/all_blocks_no_color.txt b/tests/unit/messages/formats/text/fixtures/all_blocks_no_color.txt index 9a7c72685..965872801 100644 --- a/tests/unit/messages/formats/text/fixtures/all_blocks_no_color.txt +++ b/tests/unit/messages/formats/text/fixtures/all_blocks_no_color.txt @@ -1,10 +1,18 @@ Main Header Normal text Bold text Italic text +def hello_world(): + print('Hello, World!') +-------------------------------- - First bullet point - Second bullet point ✅ Check item Status: Passed | Tags: test, example +Column 1 Column 2 Column 3 +----------- ----------- ----------- +Row 1 Col 1 Row 1 Col 2 Row 1 Col 3 +Row 2 Col 1 Row 2 Col 2 Row 2 Col 3 Show Details 🔎 Details Section Here's some content with a link (https://example.com) + user1 select 1 diff --git a/tests/unit/messages/formats/text/fixtures/all_blocks_red.txt b/tests/unit/messages/formats/text/fixtures/all_blocks_red.txt index 9a7c72685..965872801 100644 --- a/tests/unit/messages/formats/text/fixtures/all_blocks_red.txt +++ b/tests/unit/messages/formats/text/fixtures/all_blocks_red.txt @@ -1,10 +1,18 @@ Main Header Normal text Bold text Italic text +def hello_world(): + print('Hello, World!') +-------------------------------- - First bullet point - Second bullet point ✅ Check item Status: Passed | Tags: test, example +Column 1 Column 2 Column 3 +----------- ----------- ----------- +Row 1 Col 1 Row 1 Col 2 Row 1 Col 3 +Row 2 Col 1 Row 2 Col 2 Row 2 Col 3 Show Details 🔎 Details Section Here's some content with a link (https://example.com) + user1 select 1 diff --git a/tests/unit/messages/formats/text/fixtures/all_blocks_yellow.txt b/tests/unit/messages/formats/text/fixtures/all_blocks_yellow.txt index 9a7c72685..965872801 100644 --- a/tests/unit/messages/formats/text/fixtures/all_blocks_yellow.txt +++ b/tests/unit/messages/formats/text/fixtures/all_blocks_yellow.txt @@ -1,10 +1,18 @@ Main Header Normal text Bold text Italic text +def hello_world(): + print('Hello, World!') +-------------------------------- - First bullet point - Second bullet point ✅ Check item Status: Passed | Tags: test, example +Column 1 Column 2 Column 3 +----------- ----------- ----------- +Row 1 Col 1 Row 1 Col 2 Row 1 Col 3 +Row 2 Col 1 Row 2 Col 2 Row 2 Col 3 Show Details 🔎 Details Section Here's some content with a link (https://example.com) + user1 select 1