mirror of https://github.com/langgenius/dify.git
Feature add test containers mail inner task (#26622)
Signed-off-by: NeatGuyCoding <15627489+NeatGuyCoding@users.noreply.github.com> Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
This commit is contained in:
parent
517726da3a
commit
dc0f053925
|
|
@ -0,0 +1,261 @@
|
|||
from unittest.mock import MagicMock, patch
|
||||
|
||||
import pytest
|
||||
from faker import Faker
|
||||
|
||||
from tasks.mail_inner_task import send_inner_email_task
|
||||
|
||||
|
||||
class TestMailInnerTask:
|
||||
"""Integration tests for send_inner_email_task using testcontainers."""
|
||||
|
||||
@pytest.fixture
|
||||
def mock_external_service_dependencies(self):
|
||||
"""Mock setup for external service dependencies."""
|
||||
with (
|
||||
patch("tasks.mail_inner_task.mail") as mock_mail,
|
||||
patch("tasks.mail_inner_task.get_email_i18n_service") as mock_get_email_i18n_service,
|
||||
patch("tasks.mail_inner_task._render_template_with_strategy") as mock_render_template,
|
||||
):
|
||||
# Setup mock mail service
|
||||
mock_mail.is_inited.return_value = True
|
||||
|
||||
# Setup mock email i18n service
|
||||
mock_email_service = MagicMock()
|
||||
mock_get_email_i18n_service.return_value = mock_email_service
|
||||
|
||||
# Setup mock template rendering
|
||||
mock_render_template.return_value = "<html>Test email content</html>"
|
||||
|
||||
yield {
|
||||
"mail": mock_mail,
|
||||
"email_service": mock_email_service,
|
||||
"render_template": mock_render_template,
|
||||
}
|
||||
|
||||
def _create_test_email_data(self, fake: Faker) -> dict:
|
||||
"""
|
||||
Helper method to create test email data for testing.
|
||||
|
||||
Args:
|
||||
fake: Faker instance for generating test data
|
||||
|
||||
Returns:
|
||||
dict: Test email data including recipients, subject, body, and substitutions
|
||||
"""
|
||||
return {
|
||||
"to": [fake.email() for _ in range(3)],
|
||||
"subject": fake.sentence(nb_words=4),
|
||||
"body": "Hello {{name}}, this is a test email from {{company}}.",
|
||||
"substitutions": {
|
||||
"name": fake.name(),
|
||||
"company": fake.company(),
|
||||
"date": fake.date(),
|
||||
},
|
||||
}
|
||||
|
||||
def test_send_inner_email_success(self, db_session_with_containers, mock_external_service_dependencies):
|
||||
"""
|
||||
Test successful email sending with valid data.
|
||||
|
||||
This test verifies:
|
||||
- Proper email service initialization check
|
||||
- Template rendering with substitutions
|
||||
- Email service integration
|
||||
- Multiple recipient handling
|
||||
"""
|
||||
# Arrange: Create test data
|
||||
fake = Faker()
|
||||
email_data = self._create_test_email_data(fake)
|
||||
|
||||
# Act: Execute the task
|
||||
send_inner_email_task(
|
||||
to=email_data["to"],
|
||||
subject=email_data["subject"],
|
||||
body=email_data["body"],
|
||||
substitutions=email_data["substitutions"],
|
||||
)
|
||||
|
||||
# Assert: Verify the expected outcomes
|
||||
# Verify mail service was checked for initialization
|
||||
mock_external_service_dependencies["mail"].is_inited.assert_called_once()
|
||||
|
||||
# Verify template rendering was called with correct parameters
|
||||
mock_external_service_dependencies["render_template"].assert_called_once_with(
|
||||
email_data["body"], email_data["substitutions"]
|
||||
)
|
||||
|
||||
# Verify email service was called once with the full recipient list
|
||||
mock_email_service = mock_external_service_dependencies["email_service"]
|
||||
mock_email_service.send_raw_email.assert_called_once_with(
|
||||
to=email_data["to"],
|
||||
subject=email_data["subject"],
|
||||
html_content="<html>Test email content</html>",
|
||||
)
|
||||
|
||||
def test_send_inner_email_single_recipient(self, db_session_with_containers, mock_external_service_dependencies):
|
||||
"""
|
||||
Test email sending with single recipient.
|
||||
|
||||
This test verifies:
|
||||
- Single recipient handling
|
||||
- Template rendering
|
||||
- Email service integration
|
||||
"""
|
||||
# Arrange: Create test data with single recipient
|
||||
fake = Faker()
|
||||
email_data = {
|
||||
"to": [fake.email()],
|
||||
"subject": fake.sentence(nb_words=3),
|
||||
"body": "Welcome {{user_name}}!",
|
||||
"substitutions": {
|
||||
"user_name": fake.name(),
|
||||
},
|
||||
}
|
||||
|
||||
# Act: Execute the task
|
||||
send_inner_email_task(
|
||||
to=email_data["to"],
|
||||
subject=email_data["subject"],
|
||||
body=email_data["body"],
|
||||
substitutions=email_data["substitutions"],
|
||||
)
|
||||
|
||||
# Assert: Verify the expected outcomes
|
||||
mock_email_service = mock_external_service_dependencies["email_service"]
|
||||
mock_email_service.send_raw_email.assert_called_once_with(
|
||||
to=email_data["to"],
|
||||
subject=email_data["subject"],
|
||||
html_content="<html>Test email content</html>",
|
||||
)
|
||||
|
||||
def test_send_inner_email_empty_substitutions(self, db_session_with_containers, mock_external_service_dependencies):
|
||||
"""
|
||||
Test email sending with empty substitutions.
|
||||
|
||||
This test verifies:
|
||||
- Template rendering with empty substitutions
|
||||
- Email service integration
|
||||
- Handling of minimal template context
|
||||
"""
|
||||
# Arrange: Create test data with empty substitutions
|
||||
fake = Faker()
|
||||
email_data = {
|
||||
"to": [fake.email()],
|
||||
"subject": fake.sentence(nb_words=3),
|
||||
"body": "This is a simple email without variables.",
|
||||
"substitutions": {},
|
||||
}
|
||||
|
||||
# Act: Execute the task
|
||||
send_inner_email_task(
|
||||
to=email_data["to"],
|
||||
subject=email_data["subject"],
|
||||
body=email_data["body"],
|
||||
substitutions=email_data["substitutions"],
|
||||
)
|
||||
|
||||
# Assert: Verify the expected outcomes
|
||||
mock_external_service_dependencies["render_template"].assert_called_once_with(email_data["body"], {})
|
||||
|
||||
mock_email_service = mock_external_service_dependencies["email_service"]
|
||||
mock_email_service.send_raw_email.assert_called_once_with(
|
||||
to=email_data["to"],
|
||||
subject=email_data["subject"],
|
||||
html_content="<html>Test email content</html>",
|
||||
)
|
||||
|
||||
def test_send_inner_email_mail_not_initialized(
|
||||
self, db_session_with_containers, mock_external_service_dependencies
|
||||
):
|
||||
"""
|
||||
Test email sending when mail service is not initialized.
|
||||
|
||||
This test verifies:
|
||||
- Early return when mail service is not initialized
|
||||
- No template rendering occurs
|
||||
- No email service calls
|
||||
- No exceptions raised
|
||||
"""
|
||||
# Arrange: Setup mail service as not initialized
|
||||
mock_external_service_dependencies["mail"].is_inited.return_value = False
|
||||
|
||||
fake = Faker()
|
||||
email_data = self._create_test_email_data(fake)
|
||||
|
||||
# Act: Execute the task
|
||||
send_inner_email_task(
|
||||
to=email_data["to"],
|
||||
subject=email_data["subject"],
|
||||
body=email_data["body"],
|
||||
substitutions=email_data["substitutions"],
|
||||
)
|
||||
|
||||
# Assert: Verify no processing occurred
|
||||
mock_external_service_dependencies["render_template"].assert_not_called()
|
||||
mock_external_service_dependencies["email_service"].send_raw_email.assert_not_called()
|
||||
|
||||
def test_send_inner_email_template_rendering_error(
|
||||
self, db_session_with_containers, mock_external_service_dependencies
|
||||
):
|
||||
"""
|
||||
Test email sending when template rendering fails.
|
||||
|
||||
This test verifies:
|
||||
- Exception handling during template rendering
|
||||
- No email service calls when template fails
|
||||
"""
|
||||
# Arrange: Setup template rendering to raise an exception
|
||||
mock_external_service_dependencies["render_template"].side_effect = Exception("Template rendering failed")
|
||||
|
||||
fake = Faker()
|
||||
email_data = self._create_test_email_data(fake)
|
||||
|
||||
# Act: Execute the task
|
||||
send_inner_email_task(
|
||||
to=email_data["to"],
|
||||
subject=email_data["subject"],
|
||||
body=email_data["body"],
|
||||
substitutions=email_data["substitutions"],
|
||||
)
|
||||
|
||||
# Assert: Verify template rendering was attempted
|
||||
mock_external_service_dependencies["render_template"].assert_called_once()
|
||||
|
||||
# Verify no email service calls due to exception
|
||||
mock_external_service_dependencies["email_service"].send_raw_email.assert_not_called()
|
||||
|
||||
def test_send_inner_email_service_error(self, db_session_with_containers, mock_external_service_dependencies):
|
||||
"""
|
||||
Test email sending when email service fails.
|
||||
|
||||
This test verifies:
|
||||
- Exception handling during email sending
|
||||
- Graceful error handling
|
||||
"""
|
||||
# Arrange: Setup email service to raise an exception
|
||||
mock_external_service_dependencies["email_service"].send_raw_email.side_effect = Exception(
|
||||
"Email service failed"
|
||||
)
|
||||
|
||||
fake = Faker()
|
||||
email_data = self._create_test_email_data(fake)
|
||||
|
||||
# Act: Execute the task
|
||||
send_inner_email_task(
|
||||
to=email_data["to"],
|
||||
subject=email_data["subject"],
|
||||
body=email_data["body"],
|
||||
substitutions=email_data["substitutions"],
|
||||
)
|
||||
|
||||
# Assert: Verify template rendering occurred
|
||||
mock_external_service_dependencies["render_template"].assert_called_once()
|
||||
|
||||
# Verify email service was called (and failed)
|
||||
mock_email_service = mock_external_service_dependencies["email_service"]
|
||||
mock_email_service.send_raw_email.assert_called_once_with(
|
||||
to=email_data["to"],
|
||||
subject=email_data["subject"],
|
||||
html_content="<html>Test email content</html>",
|
||||
)
|
||||
Loading…
Reference in New Issue