import pytest
from unittest.mock import Mock, patch
from steps.api.utils.request import Request, AUTHORIZATION_KEY, JSON_HEADER_KEY, FORM_HEADER_KEY, CONTENT_TYPE_KEY
[docs]
def test_request_initialization():
mock_api = Mock()
request = Request(api=mock_api, timeout=5)
assert request.api == mock_api
assert request.method == ""
assert 'Accept' in request.headers
assert request.headers['Accept'] == JSON_HEADER_KEY
assert request.params == {}
assert request.body == {}
assert request.timeout == 5
assert request.expected_status_code == "200"
assert request.response is None
[docs]
def test_set_body():
request = Request()
request.set_body("test_key", "test_value")
assert request.body["test_key"] == "test_value"
[docs]
def test_set_param():
request = Request()
request.set_param("test_param", "test_value")
assert request.params["test_param"] == "test_value"
[docs]
def test_set_json_content_type():
request = Request()
request.set_json_content_type()
assert request.headers[CONTENT_TYPE_KEY] == JSON_HEADER_KEY
[docs]
def test_set_form_content_type():
request = Request()
request.set_form_content_type()
assert request.headers[CONTENT_TYPE_KEY] == FORM_HEADER_KEY
[docs]
def test_set_url():
mock_api = Mock()
mock_api.url = "https://api.example.com"
request = Request(api=mock_api)
# Test without parameters
request.set_url("/test/path")
assert request.original_path_url == "/test/path"
assert request.path_parameters == {}
assert request.path_url == "/test/path"
assert request.url == "https://api.example.com/test/path"
# Test with parameters
request.set_url("/user/{user_id}", {"user_id": "123"})
assert request.original_path_url == "/user/{user_id}"
assert request.path_parameters == {"user_id": "123"}
assert request.path_url == "/user/123"
assert request.url == "https://api.example.com/user/123"
[docs]
def test_set_method():
request = Request()
request.set_method("GET")
assert request.method == "GET"
request.set_method("POST")
assert request.method == "POST"
@patch("steps.api.utils.request.requests.Session")
[docs]
def test_send_json_body(mock_session):
mock_api = Mock()
mock_api.url = "https://api.example.com"
mock_response = Mock()
mock_response.status_code = 200
mock_session_instance = Mock()
mock_session_instance.send.return_value = mock_response
mock_session.return_value = mock_session_instance
request = Request(api=mock_api)
request.set_url("/test")
request.set_method("POST")
request.set_json_content_type()
request.set_body("test_key", "test_value")
request.send()
assert request.response == mock_response
mock_session_instance.send.assert_called_once()
@patch("steps.api.utils.request.requests.Session")
[docs]
def test_send_form_body(mock_session):
mock_api = Mock()
mock_api.url = "https://api.example.com"
mock_response = Mock()
mock_response.status_code = 200
mock_session_instance = Mock()
mock_session_instance.send.return_value = mock_response
mock_session.return_value = mock_session_instance
request = Request(api=mock_api)
request.set_url("/test")
request.set_method("POST")
request.set_form_content_type()
request.set_body("test_key", "test_value")
request.send()
assert request.response == mock_response
mock_session_instance.send.assert_called_once()
@patch("steps.api.utils.request.requests.Session")
[docs]
def test_send_unknown_content_type(mock_session):
mock_api = Mock()
mock_api.url = "https://api.example.com"
request = Request(api=mock_api)
request.set_url("/test")
request.set_method("POST")
request.set_header(CONTENT_TYPE_KEY, "unknown/content-type")
request.set_body("test_key", "test_value")
with pytest.raises(NotImplementedError, match="Unknown request type unknown/content-type"):
request.send()
[docs]
def test_str_representation():
mock_api = Mock()
mock_api.url = "https://api.example.com"
request = Request(api=mock_api)
request.set_url("/test/path")
request.set_method("GET")
str_representation = str(request)
assert "GET" in str_representation
assert "/test/path" in str_representation
# Test with path parameters
request.set_url("/user/{user_id}", {"user_id": "123"})
str_representation = str(request)
assert "/user/{user_id}" in str_representation
assert "123" in str_representation
# Test with authorization header (should be hidden)
request.set_authorization_header("secret_token")
str_representation = str(request)
assert "xxxxxxxxxx" in str_representation
assert "secret_token" not in str_representation
# Test with body
request.set_body("test_key", "test_value")
str_representation = str(request)
assert "test_key" in str_representation
assert "test_value" in str_representation
[docs]
def test_hide_secret():
# Test with dictionary
test_dict = {
"username": "test_user",
"password": "secret_password",
"token": "secret_token",
"nested": {
"password_hash": "hashed_secret",
"normal_field": "normal_value"
}
}
result = Request._hide_secret(test_dict)
assert result["username"] == "test_user"
assert result["password"] == "xxxxxxxxxx"
assert result["token"] == "xxxxxxxxxx"
assert result["nested"]["password_hash"] == "xxxxxxxxxx"
assert result["nested"]["normal_field"] == "normal_value"
[docs]
def test_copy():
mock_api = Mock()
mock_api.url = "https://api.example.com"
request = Request(api=mock_api)
request.set_url("/test/path")
request.set_method("GET")
request.set_header("Test-Header", "test-value")
request.set_param("test_param", "test_value")
request.set_body("test_key", "test_value")
request.log = False
request.timeout = 10
request.expected_status_code = "201"
copied_request = request.copy()
assert copied_request.api == request.api
assert copied_request.method == request.method
assert copied_request.headers == request.headers
assert copied_request.params == request.params
assert copied_request.body == request.body
assert copied_request.original_path_url == request.original_path_url
assert copied_request.path_parameters == request.path_parameters
assert copied_request.log == request.log
assert copied_request.timeout == request.timeout
assert copied_request.expected_status_code == request.expected_status_code
# Verify that changes to the copy don't affect the original
copied_request.set_method("POST")
assert request.method == "GET"
assert copied_request.method == "POST"