From 3ce956a9654436dc9c77eba63e1aae3a816c48bc Mon Sep 17 00:00:00 2001 From: alufers Date: Sat, 15 Apr 2023 15:26:03 +0200 Subject: [PATCH] Add more advanced tests --- mitmproxy2swagger/mitmproxy2swagger.py | 1 - mitmproxy2swagger/swagger_util.py | 31 ++++---- mitmproxy2swagger/test_mitmproxy2swagger.py | 78 +++++++++++++++++---- testcase/commands.sh | 8 +++ 4 files changed, 87 insertions(+), 31 deletions(-) create mode 100755 testcase/commands.sh diff --git a/mitmproxy2swagger/mitmproxy2swagger.py b/mitmproxy2swagger/mitmproxy2swagger.py index 244d2c5..69232d7 100644 --- a/mitmproxy2swagger/mitmproxy2swagger.py +++ b/mitmproxy2swagger/mitmproxy2swagger.py @@ -280,7 +280,6 @@ def main(override_args: Sequence[str] | None = None): if response_json is not None: resp_data_to_set = { "description": req.get_response_reason(), - "headers": None, "content": { "application/json": { "schema": swagger_util.value_to_schema(response_json) diff --git a/mitmproxy2swagger/swagger_util.py b/mitmproxy2swagger/swagger_util.py index 67628b9..19b4793 100644 --- a/mitmproxy2swagger/swagger_util.py +++ b/mitmproxy2swagger/swagger_util.py @@ -1,5 +1,6 @@ # -*- coding: utf-8 -*- import urllib +from typing import Any, List VERBS = [ "add", @@ -79,24 +80,22 @@ def url_to_params(url, path_template): return params -# when given an url and its path template, generates the parameters section of the request -def request_to_headers(headers): - header = [] +def request_to_headers(headers: dict[str, List[Any]], add_example: bool = False): + """When given an url and its path template, generates the parameters + section of the request.""" + params = [] if headers: for key in headers: - header.append( - { - "name": key, - "value": headers[key][0], - "default": headers[key][0], - "in": "header", - "required": True, - "schema": { - "type": "number" if headers[key][0].isdigit() else "string" - }, - } - ) - return header + h = { + "name": key, + "in": "header", + "required": False, + "schema": {"type": "number" if headers[key][0].isdigit() else "string"}, + } + if add_example: + h["example"] = headers[key][0] + params.append(h) + return params def response_to_headers(headers): diff --git a/mitmproxy2swagger/test_mitmproxy2swagger.py b/mitmproxy2swagger/test_mitmproxy2swagger.py index 6c1d662..5c8a652 100644 --- a/mitmproxy2swagger/test_mitmproxy2swagger.py +++ b/mitmproxy2swagger/test_mitmproxy2swagger.py @@ -1,17 +1,30 @@ -import os -from .mitmproxy2swagger import main +# -*- coding: utf-8 -*- +import sys import tempfile -import ruamel.yaml as ruamel from typing import Any, List +import ruamel.yaml as ruamel + +from .mitmproxy2swagger import main + + +def get_nested_key(obj: Any, path: str) -> Any: + """Gets a nested key from a dict.""" + keys = path.split(".") + for key in keys: + if not isinstance(obj, dict): + return None + if key not in obj: + return None + obj = obj[key] + return obj + def mitmproxy2swagger_e2e_test( input_file: str, url_prefix: str, extra_args: List[str] | None = None ) -> Any: - """ - Runs mitmproxy2swagger on the given input file twice, - and returns the detected endpoints. - """ + """Runs mitmproxy2swagger on the given input file twice, and returns the + detected endpoints.""" yaml_tmp_path = tempfile.mktemp(suffix=".yaml", prefix="sklep.lisek.") main( [ @@ -62,7 +75,6 @@ def mitmproxy2swagger_e2e_test( def test_mitmproxy2swagger_generates_swagger_from_har(): - data = mitmproxy2swagger_e2e_test( "testdata/sklep.lisek.app.har", "https://sklep.lisek.app/" ) @@ -77,13 +89,51 @@ def test_mitmproxy2swagger_generates_swagger_from_har(): def test_mitmproxy2swagger_generates_swagger_from_mitmproxy_flow_file(): - data = mitmproxy2swagger_e2e_test("testdata/test_flows", "https://httpbin.org/", [ - "--format", - "flow", - "--headers", - ]) + data = mitmproxy2swagger_e2e_test( + "testdata/test_flows", + "https://httpbin.org/", + [ + "--format", + "flow", + ], + ) assert data is not None assert "paths" in data + yaml = ruamel.YAML() + yaml.dump(data, sys.stdout) assert len(data["paths"]) == 3 # 4 paths in the test file + assert get_nested_key(data, "paths./get.get.responses.200.content") is not None - + +def test_mitmproxy2swagger_generates_swagger_from_mitmproxy_flow_file_with_form_data(): + data = mitmproxy2swagger_e2e_test( + "testdata/form_data_flows", + "https://httpbin.org/", + [ + "--format", + "flow", + ], + ) + assert data is not None + + assert ( + get_nested_key( + data, + "paths./post.post.requestBody.content.application/x-www-form-urlencoded.schema", + ) + is not None + ) + + +def test_mitmproxy2swagger_generates_headers_for_flow_files(): + data = mitmproxy2swagger_e2e_test( + "testdata/form_data_flows", + "https://httpbin.org/", + [ + "--format", + "flow", + "--headers", + ], + ) + assert data is not None + assert get_nested_key(data, "paths./post.post.responses.200.headers.content-type") is not None diff --git a/testcase/commands.sh b/testcase/commands.sh new file mode 100755 index 0000000..7f7f6c6 --- /dev/null +++ b/testcase/commands.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +python3.9 -m venv env +source env/bin/activate +pip install mitmproxy mitmproxy2swagger +mitmproxy2swagger -i flows -o specs.yml -p https://api.ah.nl +cat specs.yml +