WIP: huamninput email sending

This commit is contained in:
QuantumGhost
2025-12-08 09:26:41 +08:00
parent e6fbf3a198
commit 203a3a68af
10 changed files with 532 additions and 31 deletions

View File

@ -0,0 +1,115 @@
from datetime import UTC, datetime
import uuid
from unittest.mock import patch
import pytest
from configs import dify_config
from core.repositories.human_input_reposotiry import FormCreateParams, HumanInputFormRepositoryImpl
from core.workflow.nodes.human_input.entities import (
EmailDeliveryConfig,
EmailDeliveryMethod,
EmailRecipients,
ExternalRecipient,
HumanInputNodeData,
MemberRecipient,
)
from models.account import Account, AccountStatus, Tenant, TenantAccountJoin, TenantAccountRole
from models.human_input import HumanInputDelivery, HumanInputForm, HumanInputFormRecipient
from tasks.mail_human_input_delivery_task import dispatch_human_input_email_task
@pytest.fixture(autouse=True)
def cleanup_database(db_session_with_containers):
db_session_with_containers.query(HumanInputFormRecipient).delete()
db_session_with_containers.query(HumanInputDelivery).delete()
db_session_with_containers.query(HumanInputForm).delete()
db_session_with_containers.query(TenantAccountJoin).delete()
db_session_with_containers.query(Tenant).delete()
db_session_with_containers.query(Account).delete()
db_session_with_containers.commit()
def _create_workspace_member(db_session_with_containers):
account = Account(
email="owner@example.com",
name="Owner",
password="password",
interface_language="en-US",
status=AccountStatus.ACTIVE,
)
account.created_at = datetime.now(UTC)
account.updated_at = datetime.now(UTC)
db_session_with_containers.add(account)
db_session_with_containers.commit()
db_session_with_containers.refresh(account)
tenant = Tenant(name="Test Tenant")
tenant.created_at = datetime.now(UTC)
tenant.updated_at = datetime.now(UTC)
db_session_with_containers.add(tenant)
db_session_with_containers.commit()
db_session_with_containers.refresh(tenant)
tenant_join = TenantAccountJoin(
tenant_id=tenant.id,
account_id=account.id,
role=TenantAccountRole.OWNER,
)
tenant_join.created_at = datetime.now(UTC)
tenant_join.updated_at = datetime.now(UTC)
db_session_with_containers.add(tenant_join)
db_session_with_containers.commit()
return tenant, account
def _build_form(db_session_with_containers, tenant, account):
delivery_method = EmailDeliveryMethod(
config=EmailDeliveryConfig(
recipients=EmailRecipients(
whole_workspace=False,
items=[
MemberRecipient(user_id=account.id),
ExternalRecipient(email="external@example.com"),
],
),
subject="Action needed {{ node_title }}",
body="Token {{ form_token }} link {{ form_link }} content {{ form_content }}",
)
)
node_data = HumanInputNodeData(
title="Review",
form_content="Form content",
delivery_methods=[delivery_method],
)
engine = db_session_with_containers.get_bind()
repo = HumanInputFormRepositoryImpl(session_factory=engine, tenant_id=tenant.id)
params = FormCreateParams(
workflow_execution_id=str(uuid.uuid4()),
node_id="node-1",
form_config=node_data,
rendered_content="Rendered",
resolved_placeholder_values={},
)
return repo.create_form(params)
def test_dispatch_human_input_email_task_integration(monkeypatch: pytest.MonkeyPatch, db_session_with_containers):
tenant, account = _create_workspace_member(db_session_with_containers)
form_entity = _build_form(db_session_with_containers, tenant, account)
monkeypatch.setattr(dify_config, "CONSOLE_WEB_URL", "https://console.example.com")
with patch("tasks.mail_human_input_delivery_task.mail") as mock_mail:
mock_mail.is_inited.return_value = True
dispatch_human_input_email_task(form_id=form_entity.id, node_title="Approval")
assert mock_mail.send.call_count == 2
send_args = [call.kwargs for call in mock_mail.send.call_args_list]
recipients = {kwargs["to"] for kwargs in send_args}
assert recipients == {"owner@example.com", "external@example.com"}
assert all("console.example.com/api/form/human_input/" in kwargs["html"] for kwargs in send_args)

View File

@ -15,7 +15,7 @@ class TestMailInnerTask:
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,
patch("tasks.mail_inner_task.render_email_template") as mock_render_template,
):
# Setup mock mail service
mock_mail.is_inited.return_value = True