|
@@ -1,3 +1,5 @@
|
|
|
+import json
|
|
|
+
|
|
|
import httpx
|
|
|
|
|
|
from core.app.entities.app_invoke_entities import InvokeFrom
|
|
@@ -14,7 +16,8 @@ from core.workflow.nodes.http_request import (
|
|
|
HttpRequestNodeBody,
|
|
|
HttpRequestNodeData,
|
|
|
)
|
|
|
-from core.workflow.nodes.http_request.executor import _plain_text_to_dict
|
|
|
+from core.workflow.nodes.http_request.entities import HttpRequestNodeTimeout
|
|
|
+from core.workflow.nodes.http_request.executor import Executor, _plain_text_to_dict
|
|
|
from models.enums import UserFrom
|
|
|
from models.workflow import WorkflowNodeExecutionStatus, WorkflowType
|
|
|
|
|
@@ -200,3 +203,167 @@ def test_http_request_node_form_with_file(monkeypatch):
|
|
|
assert result.status == WorkflowNodeExecutionStatus.SUCCEEDED
|
|
|
assert result.outputs is not None
|
|
|
assert result.outputs["body"] == ""
|
|
|
+
|
|
|
+
|
|
|
+def test_executor_with_json_body_and_number_variable():
|
|
|
+ # Prepare the variable pool
|
|
|
+ variable_pool = VariablePool(
|
|
|
+ system_variables={},
|
|
|
+ user_inputs={},
|
|
|
+ )
|
|
|
+ variable_pool.add(["pre_node_id", "number"], 42)
|
|
|
+
|
|
|
+ # Prepare the node data
|
|
|
+ node_data = HttpRequestNodeData(
|
|
|
+ title="Test JSON Body with Number Variable",
|
|
|
+ method="post",
|
|
|
+ url="https://api.example.com/data",
|
|
|
+ authorization=HttpRequestNodeAuthorization(type="no-auth"),
|
|
|
+ headers="Content-Type: application/json",
|
|
|
+ params="",
|
|
|
+ body=HttpRequestNodeBody(
|
|
|
+ type="json",
|
|
|
+ data=[
|
|
|
+ BodyData(
|
|
|
+ key="",
|
|
|
+ type="text",
|
|
|
+ value='{"number": {{#pre_node_id.number#}}}',
|
|
|
+ )
|
|
|
+ ],
|
|
|
+ ),
|
|
|
+ )
|
|
|
+
|
|
|
+ # Initialize the Executor
|
|
|
+ executor = Executor(
|
|
|
+ node_data=node_data,
|
|
|
+ timeout=HttpRequestNodeTimeout(connect=10, read=30, write=30),
|
|
|
+ variable_pool=variable_pool,
|
|
|
+ )
|
|
|
+
|
|
|
+ # Check the executor's data
|
|
|
+ assert executor.method == "post"
|
|
|
+ assert executor.url == "https://api.example.com/data"
|
|
|
+ assert executor.headers == {"Content-Type": "application/json"}
|
|
|
+ assert executor.params == {}
|
|
|
+ assert executor.json == {"number": 42}
|
|
|
+ assert executor.data is None
|
|
|
+ assert executor.files is None
|
|
|
+ assert executor.content is None
|
|
|
+
|
|
|
+ # Check the raw request (to_log method)
|
|
|
+ raw_request = executor.to_log()
|
|
|
+ assert "POST /data HTTP/1.1" in raw_request
|
|
|
+ assert "Host: api.example.com" in raw_request
|
|
|
+ assert "Content-Type: application/json" in raw_request
|
|
|
+ assert '{"number": 42}' in raw_request
|
|
|
+
|
|
|
+
|
|
|
+def test_executor_with_json_body_and_object_variable():
|
|
|
+ # Prepare the variable pool
|
|
|
+ variable_pool = VariablePool(
|
|
|
+ system_variables={},
|
|
|
+ user_inputs={},
|
|
|
+ )
|
|
|
+ variable_pool.add(["pre_node_id", "object"], {"name": "John Doe", "age": 30, "email": "john@example.com"})
|
|
|
+
|
|
|
+ # Prepare the node data
|
|
|
+ node_data = HttpRequestNodeData(
|
|
|
+ title="Test JSON Body with Object Variable",
|
|
|
+ method="post",
|
|
|
+ url="https://api.example.com/data",
|
|
|
+ authorization=HttpRequestNodeAuthorization(type="no-auth"),
|
|
|
+ headers="Content-Type: application/json",
|
|
|
+ params="",
|
|
|
+ body=HttpRequestNodeBody(
|
|
|
+ type="json",
|
|
|
+ data=[
|
|
|
+ BodyData(
|
|
|
+ key="",
|
|
|
+ type="text",
|
|
|
+ value="{{#pre_node_id.object#}}",
|
|
|
+ )
|
|
|
+ ],
|
|
|
+ ),
|
|
|
+ )
|
|
|
+
|
|
|
+ # Initialize the Executor
|
|
|
+ executor = Executor(
|
|
|
+ node_data=node_data,
|
|
|
+ timeout=HttpRequestNodeTimeout(connect=10, read=30, write=30),
|
|
|
+ variable_pool=variable_pool,
|
|
|
+ )
|
|
|
+
|
|
|
+ # Check the executor's data
|
|
|
+ assert executor.method == "post"
|
|
|
+ assert executor.url == "https://api.example.com/data"
|
|
|
+ assert executor.headers == {"Content-Type": "application/json"}
|
|
|
+ assert executor.params == {}
|
|
|
+ assert executor.json == {"name": "John Doe", "age": 30, "email": "john@example.com"}
|
|
|
+ assert executor.data is None
|
|
|
+ assert executor.files is None
|
|
|
+ assert executor.content is None
|
|
|
+
|
|
|
+ # Check the raw request (to_log method)
|
|
|
+ raw_request = executor.to_log()
|
|
|
+ assert "POST /data HTTP/1.1" in raw_request
|
|
|
+ assert "Host: api.example.com" in raw_request
|
|
|
+ assert "Content-Type: application/json" in raw_request
|
|
|
+ assert '"name": "John Doe"' in raw_request
|
|
|
+ assert '"age": 30' in raw_request
|
|
|
+ assert '"email": "john@example.com"' in raw_request
|
|
|
+
|
|
|
+
|
|
|
+def test_executor_with_json_body_and_nested_object_variable():
|
|
|
+ # Prepare the variable pool
|
|
|
+ variable_pool = VariablePool(
|
|
|
+ system_variables={},
|
|
|
+ user_inputs={},
|
|
|
+ )
|
|
|
+ variable_pool.add(["pre_node_id", "object"], {"name": "John Doe", "age": 30, "email": "john@example.com"})
|
|
|
+
|
|
|
+ # Prepare the node data
|
|
|
+ node_data = HttpRequestNodeData(
|
|
|
+ title="Test JSON Body with Nested Object Variable",
|
|
|
+ method="post",
|
|
|
+ url="https://api.example.com/data",
|
|
|
+ authorization=HttpRequestNodeAuthorization(type="no-auth"),
|
|
|
+ headers="Content-Type: application/json",
|
|
|
+ params="",
|
|
|
+ body=HttpRequestNodeBody(
|
|
|
+ type="json",
|
|
|
+ data=[
|
|
|
+ BodyData(
|
|
|
+ key="",
|
|
|
+ type="text",
|
|
|
+ value='{"object": {{#pre_node_id.object#}}}',
|
|
|
+ )
|
|
|
+ ],
|
|
|
+ ),
|
|
|
+ )
|
|
|
+
|
|
|
+ # Initialize the Executor
|
|
|
+ executor = Executor(
|
|
|
+ node_data=node_data,
|
|
|
+ timeout=HttpRequestNodeTimeout(connect=10, read=30, write=30),
|
|
|
+ variable_pool=variable_pool,
|
|
|
+ )
|
|
|
+
|
|
|
+ # Check the executor's data
|
|
|
+ assert executor.method == "post"
|
|
|
+ assert executor.url == "https://api.example.com/data"
|
|
|
+ assert executor.headers == {"Content-Type": "application/json"}
|
|
|
+ assert executor.params == {}
|
|
|
+ assert executor.json == {"object": {"name": "John Doe", "age": 30, "email": "john@example.com"}}
|
|
|
+ assert executor.data is None
|
|
|
+ assert executor.files is None
|
|
|
+ assert executor.content is None
|
|
|
+
|
|
|
+ # Check the raw request (to_log method)
|
|
|
+ raw_request = executor.to_log()
|
|
|
+ assert "POST /data HTTP/1.1" in raw_request
|
|
|
+ assert "Host: api.example.com" in raw_request
|
|
|
+ assert "Content-Type: application/json" in raw_request
|
|
|
+ assert '"object": {' in raw_request
|
|
|
+ assert '"name": "John Doe"' in raw_request
|
|
|
+ assert '"age": 30' in raw_request
|
|
|
+ assert '"email": "john@example.com"' in raw_request
|