feat(api): implement test form delivery & submission logic (vibe-kanban 89cd6a22)

This ensures that user can receive & submit form while using email
delivery test.
This commit is contained in:
QuantumGhost
2026-01-19 09:49:05 +08:00
parent 2db638b992
commit 6bf6bf6a2a
13 changed files with 224 additions and 28 deletions

View File

@ -194,6 +194,7 @@ def test_human_input_delivery_test_calls_service(
account=account,
node_id="node-7",
delivery_method_id="delivery-123",
inputs={},
)

View File

@ -15,6 +15,7 @@ from core.workflow.nodes.human_input.entities import (
)
from core.workflow.nodes.human_input.enums import (
FormInputType,
HumanInputFormKind,
HumanInputFormStatus,
TimeoutUnit,
)
@ -42,6 +43,7 @@ def sample_form_record():
node_id="node-id",
tenant_id="tenant-id",
app_id="app-id",
form_kind=HumanInputFormKind.RUNTIME,
definition=FormDefinition(
form_content="hello",
inputs=[],
@ -187,6 +189,28 @@ def test_submit_form_by_token_calls_repository_and_enqueue(sample_form_record, m
enqueue_spy.assert_called_once_with(sample_form_record.workflow_run_id)
def test_submit_form_by_token_skips_enqueue_for_delivery_test(sample_form_record, mock_session_factory, mocker):
session_factory, _ = mock_session_factory
repo = MagicMock(spec=HumanInputFormSubmissionRepository)
test_record = dataclasses.replace(
sample_form_record,
form_kind=HumanInputFormKind.DELIVERY_TEST,
workflow_run_id=None,
)
repo.get_by_token.return_value = test_record
repo.mark_submitted.return_value = test_record
service = HumanInputService(session_factory, form_repository=repo)
enqueue_spy = mocker.patch.object(service, "_enqueue_resume")
service.submit_form_by_token(
recipient_type=RecipientType.STANDALONE_WEB_APP,
form_token="token",
selected_action_id="submit",
form_data={"field": "value"},
)
enqueue_spy.assert_not_called()
def test_submit_form_by_token_passes_submission_user_id(sample_form_record, mock_session_factory, mocker):
session_factory, _ = mock_session_factory
repo = MagicMock(spec=HumanInputFormSubmissionRepository)

View File

@ -92,7 +92,14 @@ def test_human_input_delivery_dispatches_to_test_service(monkeypatch: pytest.Mon
workflow = MagicMock()
workflow.get_node_config_by_id.return_value = node_config
service.get_draft_workflow = MagicMock(return_value=workflow) # type: ignore[method-assign]
service._render_human_input_content_for_test = MagicMock(return_value="rendered") # type: ignore[attr-defined]
service._build_human_input_variable_pool = MagicMock(return_value=MagicMock()) # type: ignore[attr-defined]
node_stub = MagicMock()
node_stub._render_form_content_before_submission.return_value = "rendered"
node_stub._resolve_inputs.return_value = {}
service._build_human_input_node = MagicMock(return_value=node_stub) # type: ignore[attr-defined]
service._create_human_input_delivery_test_form = MagicMock( # type: ignore[attr-defined]
return_value=("form-1", {})
)
test_service_instance = MagicMock()
monkeypatch.setattr(
@ -109,8 +116,11 @@ def test_human_input_delivery_dispatches_to_test_service(monkeypatch: pytest.Mon
account=account,
node_id="node-1",
delivery_method_id=str(delivery_method.id),
inputs={"#node-1.output#": "value"},
)
pool_args = service._build_human_input_variable_pool.call_args.kwargs
assert pool_args["manual_inputs"] == {"#node-1.output#": "value"}
test_service_instance.send_test.assert_called_once()
@ -121,7 +131,14 @@ def test_human_input_delivery_debug_mode_overrides_recipients(monkeypatch: pytes
workflow = MagicMock()
workflow.get_node_config_by_id.return_value = node_config
service.get_draft_workflow = MagicMock(return_value=workflow) # type: ignore[method-assign]
service._render_human_input_content_for_test = MagicMock(return_value="rendered") # type: ignore[attr-defined]
service._build_human_input_variable_pool = MagicMock(return_value=MagicMock()) # type: ignore[attr-defined]
node_stub = MagicMock()
node_stub._render_form_content_before_submission.return_value = "rendered"
node_stub._resolve_inputs.return_value = {}
service._build_human_input_node = MagicMock(return_value=node_stub) # type: ignore[attr-defined]
service._create_human_input_delivery_test_form = MagicMock( # type: ignore[attr-defined]
return_value=("form-1", {})
)
test_service_instance = MagicMock()
monkeypatch.setattr(