-
Notifications
You must be signed in to change notification settings - Fork 7.3k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
fix(http_request): improve parameter initialization and reorganize tests
- Refactor parameter template conversion in the HTTP request executor for efficiency. - Migrate and add unit tests for HTTP request executor to a dedicated test file. - Clean up redundant imports and rearrange the HTTP request node tests directory.
- Loading branch information
Showing
3 changed files
with
203 additions
and
170 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
198 changes: 198 additions & 0 deletions
198
api/tests/unit_tests/core/workflow/nodes/http_request/test_http_request_executor.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,198 @@ | ||
from core.workflow.entities.variable_pool import VariablePool | ||
from core.workflow.nodes.http_request import ( | ||
BodyData, | ||
HttpRequestNodeAuthorization, | ||
HttpRequestNodeBody, | ||
HttpRequestNodeData, | ||
) | ||
from core.workflow.nodes.http_request.entities import HttpRequestNodeTimeout | ||
from core.workflow.nodes.http_request.executor import Executor | ||
|
||
|
||
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": "[email protected]"}) | ||
|
||
# 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": "[email protected]"} | ||
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": "[email protected]"' 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": "[email protected]"}) | ||
|
||
# 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": "[email protected]"}} | ||
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": "[email protected]"' in raw_request | ||
|
||
|
||
def test_extract_selectors_from_template_with_newline(): | ||
variable_pool = VariablePool() | ||
variable_pool.add(("node_id", "custom_query"), "line1\nline2") | ||
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="test: {{#node_id.custom_query#}}", | ||
body=HttpRequestNodeBody( | ||
type="none", | ||
data=[], | ||
), | ||
) | ||
|
||
executor = Executor( | ||
node_data=node_data, | ||
timeout=HttpRequestNodeTimeout(connect=10, read=30, write=30), | ||
variable_pool=variable_pool, | ||
) | ||
|
||
assert executor.params == {"test": "line1\nline2"} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,5 +1,3 @@ | ||
import json | ||
|
||
import httpx | ||
|
||
from core.app.entities.app_invoke_entities import InvokeFrom | ||
|
@@ -16,8 +14,7 @@ | |
HttpRequestNodeBody, | ||
HttpRequestNodeData, | ||
) | ||
from core.workflow.nodes.http_request.entities import HttpRequestNodeTimeout | ||
from core.workflow.nodes.http_request.executor import Executor, _plain_text_to_dict | ||
from core.workflow.nodes.http_request.executor import _plain_text_to_dict | ||
from models.enums import UserFrom | ||
from models.workflow import WorkflowNodeExecutionStatus, WorkflowType | ||
|
||
|
@@ -203,167 +200,3 @@ def attr_checker(*args, **kwargs): | |
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": "[email protected]"}) | ||
|
||
# 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": "[email protected]"} | ||
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": "[email protected]"' 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": "[email protected]"}) | ||
|
||
# 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": "[email protected]"}} | ||
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": "[email protected]"' in raw_request |