Home Assistant MCP
by allenporter
- tests
import pytest
from mcp_atlassian.preprocessing import TextPreprocessor
from tests.fixtures.confluence_mocks import MOCK_COMMENTS_RESPONSE, MOCK_PAGE_RESPONSE
from tests.fixtures.jira_mocks import MOCK_JIRA_ISSUE_RESPONSE
class MockConfluenceClient:
def get_user_details_by_accountid(self, account_id):
# Mock user details response based on the format in MOCK_PAGE_RESPONSE
return {
"displayName": f"Test User {account_id}",
"accountType": "atlassian",
"accountStatus": "active",
}
@pytest.fixture
def preprocessor():
return TextPreprocessor("https://example.atlassian.net", None)
@pytest.fixture
def preprocessor_with_confluence():
return TextPreprocessor("https://example.atlassian.net", MockConfluenceClient())
def test_init():
"""Test TextPreprocessor initialization."""
processor = TextPreprocessor("https://example.atlassian.net/")
assert processor.base_url == "https://example.atlassian.net"
assert processor.confluence_client is None
def test_process_confluence_page_content(preprocessor_with_confluence):
"""Test processing Confluence page content using mock data."""
html_content = MOCK_PAGE_RESPONSE["body"]["storage"]["value"]
processed_html, processed_markdown = preprocessor_with_confluence.process_html_content(html_content)
# Verify user mention is processed
assert "@Test User user123" in processed_markdown
# Verify basic HTML elements are converted
assert "Date" in processed_markdown
assert "Goals" in processed_markdown
assert "Example goal" in processed_markdown
def test_process_confluence_comment_content(preprocessor):
"""Test processing Confluence comment content using mock data."""
html_content = MOCK_COMMENTS_RESPONSE["results"][0]["body"]["view"]["value"]
processed_html, processed_markdown = preprocessor.process_html_content(html_content)
assert "Comment content here" in processed_markdown
def test_clean_jira_issue_content(preprocessor):
"""Test cleaning Jira issue content using mock data."""
description = MOCK_JIRA_ISSUE_RESPONSE["fields"]["description"]
cleaned_text = preprocessor.clean_jira_text(description)
assert "test issue description" in cleaned_text.lower()
# Test comment cleaning
comment = MOCK_JIRA_ISSUE_RESPONSE["fields"]["comment"]["comments"][0]["body"]
cleaned_comment = preprocessor.clean_jira_text(comment)
assert "test comment" in cleaned_comment.lower()
def test_process_html_content_basic(preprocessor):
"""Test basic HTML content processing."""
html = "<p>Simple text</p>"
processed_html, processed_markdown = preprocessor.process_html_content(html)
assert processed_html == "<p>Simple text</p>"
assert processed_markdown.strip() == "Simple text"
def test_process_html_content_with_user_mentions(preprocessor_with_confluence):
"""Test HTML content processing with user mentions."""
html = """
<ac:link>
<ri:user ri:account-id="123456"/>
</ac:link>
<p>Some text</p>
"""
processed_html, processed_markdown = preprocessor_with_confluence.process_html_content(html)
assert "@Test User 123456" in processed_html
assert "@Test User 123456" in processed_markdown
def test_clean_jira_text_empty(preprocessor):
"""Test cleaning empty Jira text."""
assert preprocessor.clean_jira_text("") == ""
assert preprocessor.clean_jira_text(None) == ""
def test_clean_jira_text_user_mentions(preprocessor):
"""Test cleaning Jira text with user mentions."""
text = "Hello [~accountid:123456]!"
cleaned = preprocessor.clean_jira_text(text)
assert cleaned == "Hello User:123456!"
def test_clean_jira_text_smart_links(preprocessor):
"""Test cleaning Jira text with smart links."""
base_url = "https://example.atlassian.net"
# Test Jira issue link
text = f"[Issue|{base_url}/browse/PROJ-123|smart-link]"
cleaned = preprocessor.clean_jira_text(text)
assert cleaned == f"[PROJ-123]({base_url}/browse/PROJ-123)"
# Test Confluence page link from mock data
confluence_url = f"{base_url}/wiki/spaces/PROJ/pages/987654321/Example+Meeting+Notes"
text = f"[Meeting Notes|{confluence_url}|smart-link]"
cleaned = preprocessor.clean_jira_text(text)
assert cleaned == f"[Example Meeting Notes]({confluence_url})"
def test_clean_jira_text_html_content(preprocessor):
"""Test cleaning Jira text with HTML content."""
text = "<p>This is <b>bold</b> text</p>"
cleaned = preprocessor.clean_jira_text(text)
assert cleaned.strip() == "This is **bold** text"
def test_clean_jira_text_combined(preprocessor):
"""Test cleaning Jira text with multiple elements."""
base_url = "https://example.atlassian.net"
text = f"""
<p>Hello [~accountid:123456]!</p>
<p>Check out [PROJ-123|{base_url}/browse/PROJ-123|smart-link]</p>
"""
cleaned = preprocessor.clean_jira_text(text)
assert "Hello User:123456!" in cleaned
assert f"[PROJ-123]({base_url}/browse/PROJ-123)" in cleaned
def test_process_html_content_error_handling(preprocessor):
"""Test error handling in process_html_content."""
with pytest.raises(Exception):
preprocessor.process_html_content(None)
def test_clean_jira_text_with_invalid_html(preprocessor):
"""Test cleaning Jira text with invalid HTML."""
text = "<p>Unclosed paragraph with <b>bold</b"
cleaned = preprocessor.clean_jira_text(text)
assert "Unclosed paragraph with **bold**" in cleaned
def test_process_mentions_error_handling(preprocessor):
"""Test error handling in _process_mentions."""
text = "[~accountid:invalid]"
processed = preprocessor._process_mentions(text, r"\[~accountid:(.*?)\]")
assert "User:invalid" in processed