import pytest
import requests
import requests_mock
MOCK_ADDR = "mock://"
def custom_matcher(request: requests.Request) -> requests.Response | None:
if request.url == f"{MOCK_ADDR}http://example.com":
first_history = requests.Response()
first_history.url = "http://example.com/"
first_history.status_code = 301
second_history = requests.Response()
second_history.url = "https://example.com/"
second_history.status_code = 301
resp = requests.Response()
resp.status_code = 200
resp.url = "https://www.example.org/"
resp.history = [first_history, second_history]
return resp
return None
REDIRECTED_URL_CASES = [
(
{"url": "http://example.com", "useHead": "true"},
[
{"Data": "http://example.com/", "Status": 301},
{"Data": "https://example.com/", "Status": 301},
{"Data": "https://www.example.org/", "Status": 200},
],
),
(
{"url": "http://example.com", "useHead": "false"},
[
{"Data": "http://example.com/", "Status": 301},
{"Data": "https://example.com/", "Status": 301},
{"Data": "https://www.example.org/", "Status": 200},
],
),
]
@pytest.mark.parametrize("params, expected_results", REDIRECTED_URL_CASES)
def test_valid_response_history(params, expected_results):
"""
Given:
- A url and whether to use requests.head or requests.get
When:
- Running function get_response_history to retrieve the response's history
Then:
- Validating the structure of the returned array
"""
from HTTPListRedirects import get_response_history
url = params["url"]
use_head = params["useHead"]
request_using_head = use_head == "true"
adapter = requests_mock.Adapter()
adapter.add_matcher(custom_matcher)
session = requests.Session()
session.mount(prefix=MOCK_ADDR, adapter=adapter)
if request_using_head:
response = session.head(f"{MOCK_ADDR}{url}")
else:
response = session.get(f"{MOCK_ADDR}{url}")
urls = get_response_history(response=response)
assert urls == expected_results
HISTORY_URLS_CASES = [
(
[
{"Data": "http://example.com/", "Status": 301},
{"Data": "https://example.com/", "Status": 301},
{"Data": "https://www.example.org/", "Status": 200},
]
)
]
@pytest.mark.parametrize("history_urls", HISTORY_URLS_CASES)
def test_valid_command_result(history_urls):
"""
Given:
- A valid parsed response history
When:
- Running the function create_command_result to create the output for the command
Then:
- Validating the structure of the returned result to the user
"""
from CommonServerPython import entryTypes, formats, tableToMarkdown
from HTTPListRedirects import create_command_result
ec = {"URL(val.Data == obj.Data)": [{"Data": history_url["Data"]} for history_url in history_urls]}
expected_command_result = {
"ContentsFormat": formats["json"],
"Type": entryTypes["note"],
"Contents": history_urls,
"ReadableContentsFormat": formats["markdown"],
"HumanReadable": tableToMarkdown("URLs", history_urls, ["Data", "Status"]),
"EntryContext": ec,
}
command_result = create_command_result(history_urls=history_urls)
assert command_result == expected_command_result
SYSTEM_PROXY_CASES = [({"use_system_proxy": "false"})]
@pytest.mark.parametrize("params", SYSTEM_PROXY_CASES)
def test_environment_variables(params):
"""
Given:
- The condition where we don't want to use the system's proxy
When:
- Running the function delete_environment_variables to delete specific environment variables
Then:
- Validating that the specific environment variables got deleted
"""
import os
from HTTPListRedirects import delete_environment_variables
use_system_proxy = params["use_system_proxy"]
delete_environment_variables(use_system_proxy=use_system_proxy)
env_variables = ["HTTP_PROXY", "HTTPS_PROXY", "http_proxy", "https_proxy"]
for env_var in env_variables:
with pytest.raises(KeyError):
os.environ[env_var]
USE_HEAD_CASES = [({"useHead": "false"}), ({"useHead": "true"})]
@pytest.mark.parametrize("params", USE_HEAD_CASES)
def test_use_head_variable(requests_mock, params):
"""
Given:
- The argument that states if we want to use requests.head or requests.get
When:
- Running the function get_response to retrieve the response of a url
Then:
- Validating that the request used was requests.head if useHead is true and requests.get otherwise
"""
from HTTPListRedirects import get_response
use_head = params["useHead"]
requests_mock.get("http://examples.test.com")
requests_mock.head("http://examples.test.com")
get_response(url="http://examples.test.com", use_head=use_head, verify_ssl=False)
assert (
requests_mock.request_history[0].method == "HEAD"
if use_head == "true"
else requests_mock.request_history[0].method == "GET"
)