diff --git a/ate/response.py b/ate/response.py index 83caedb9..15e08f45 100644 --- a/ate/response.py +++ b/ate/response.py @@ -23,7 +23,36 @@ class ResponseObject(object): 'body': self.parsed_body() } - def extract_response(self, extract_binds, delimiter='.'): + def extract_field(self, field, delimiter='.'): + """ extract field from requests.Response + @param (str) field of requests.Response object, and may be joined by delimiter + "status_code" + "content" + "headers.content-type" + "content.person.name.first_name" + """ + try: + field += "." + # string.split(sep=None, maxsplit=-1) -> list of strings + # e.g. "content.person.name" => ["content", "person.name"] + top_query, sub_query = field.split(delimiter, 1) + + if top_query in ["body", "content", "text"]: + json_content = self.parsed_body() + else: + json_content = getattr(self.resp_obj, top_query) + + if sub_query: + # e.g. key: resp_headers_content_type, sub_query = "content-type" + return utils.query_json(json_content, sub_query) + else: + # e.g. key: resp_status_code, resp_content + return json_content + + except AttributeError: + raise exception.ParamsError("invalid extract_binds!") + + def extract_response(self, extract_binds): """ extract content from requests.Response @param (dict) extract_binds { @@ -33,35 +62,15 @@ class ResponseObject(object): "resp_content_person_first_name": "content.person.name.first_name" } """ - extract_binds_dict = {} + extracted_variables_mapping = {} - for key, value in extract_binds.items(): - if not isinstance(value, utils.string_type): + for key, field in extract_binds.items(): + if not isinstance(field, utils.string_type): raise exception.ParamsError("invalid extract_binds!") - try: - value += "." - # string.split(sep=None, maxsplit=-1) -> list of strings - # e.g. "content.person.name" => ["content", "person.name"] - top_query, sub_query = value.split(delimiter, 1) + extracted_variables_mapping[key] = self.extract_field(field) - if top_query in ["body", "content", "text"]: - json_content = self.parsed_body() - else: - json_content = getattr(self.resp_obj, top_query) - - if sub_query: - # e.g. key: resp_headers_content_type, sub_query = "content-type" - answer = utils.query_json(json_content, sub_query) - extract_binds_dict[key] = answer - else: - # e.g. key: resp_status_code, resp_content - extract_binds_dict[key] = json_content - - except AttributeError: - raise exception.ParamsError("invalid extract_binds!") - - return extract_binds_dict + return extracted_variables_mapping def validate(self, validators, variables_mapping): """ Bind named validators to value within the context. @@ -87,15 +96,16 @@ class ResponseObject(object): for validator_key, validator_dict in validators.items(): try: - value = variables_mapping[validator_key] - validator_dict["value"] = value - expected_value = validator_dict["expected"] + validator_dict["value"] = variables_mapping[validator_key] except KeyError: - raise exception.ParamsError("invalid validator %s" % validator_key) + validator_dict["value"] = self.extract_field(validator_key) + + if "expected" not in validator_dict: + raise exception.ParamsError("expected not specified in validator") match_expected = utils.match_expected( - value, - expected_value, + validator_dict["value"], + validator_dict["expected"], validator_dict.get("comparator", "eq") ) diff --git a/ate/runner.py b/ate/runner.py index 1b58996a..2c3b4f00 100644 --- a/ate/runner.py +++ b/ate/runner.py @@ -77,8 +77,8 @@ class TestRunner(object): resp_obj = response.ResponseObject(resp) extract_binds = testcase.get("extract_binds", {}) - extract_binds_dict = resp_obj.extract_response(extract_binds) - self.context.update_variables(extract_binds_dict) + extracted_variables_mapping = resp_obj.extract_response(extract_binds) + self.context.update_variables(extracted_variables_mapping) validators = testcase.get("validators", {}) diff_content_dict = resp_obj.validate(validators, self.context.variables) diff --git a/test/data/demo_template_separate.yml b/test/data/demo_template_separate.yml index 27a999c7..6a1b351e 100644 --- a/test/data/demo_template_separate.yml +++ b/test/data/demo_template_separate.yml @@ -21,12 +21,9 @@ authorization: "${authorization}" random: "${random}" data: "${data}" - extract_binds: - resp_status_code: status_code - resp_body_success: content.success validators: - resp_status_code: {"comparator": "eq", "expected": 201} - resp_body_success: {"comparator": "eq", "expected": true} + status_code: {"comparator": "eq", "expected": 201} + content.success: {"comparator": "eq", "expected": true} - test: name: create user which does not exist @@ -50,9 +47,6 @@ authorization: "${authorization}" random: "${random}" data: "${data}" - extract_binds: - resp_status_code: status_code - resp_body_success: content.success validators: - resp_status_code: {"comparator": "eq", "expected": 500} - resp_body_success: {"comparator": "eq", "expected": false} + status_code: {"comparator": "eq", "expected": 500} + content.success: {"comparator": "eq", "expected": false} diff --git a/test/data/demo_template_sets.yml b/test/data/demo_template_sets.yml index 2f4cbb74..754433a4 100644 --- a/test/data/demo_template_sets.yml +++ b/test/data/demo_template_sets.yml @@ -25,12 +25,9 @@ authorization: "${authorization}" random: "${random}" data: "${data}" - extract_binds: - resp_status_code: status_code - resp_body_success: content.success validators: - resp_status_code: {"comparator": "eq", "expected": 201} - resp_body_success: {"comparator": "eq", "expected": true} + status_code: {"comparator": "eq", "expected": 201} + content.success: {"comparator": "eq", "expected": true} - test: name: create user which does not exist @@ -45,9 +42,6 @@ authorization: "${authorization}" random: "${random}" data: "${data}" - extract_binds: - resp_status_code: status_code - resp_body_success: content.success validators: - resp_status_code: {"comparator": "eq", "expected": 500} - resp_body_success: {"comparator": "eq", "expected": false} + status_code: {"comparator": "eq", "expected": 500} + content.success: {"comparator": "eq", "expected": false} diff --git a/test/data/simple_demo_auth_hardcode.json b/test/data/simple_demo_auth_hardcode.json index 27d191ab..840288dc 100644 --- a/test/data/simple_demo_auth_hardcode.json +++ b/test/data/simple_demo_auth_hardcode.json @@ -15,14 +15,9 @@ "password": "123456" } }, - "extract_binds": { - "resp_status_code": "status_code", - "resp_body_success": "content.success", - "resp_body_msg": "content.msg" - }, "validators": { - "resp_status_code": {"comparator": "eq", "expected": 201}, - "resp_body_success": {"comparator": "eq", "expected": true} + "status_code": {"comparator": "eq", "expected": 201}, + "content.success": {"comparator": "eq", "expected": true} } } }, @@ -42,13 +37,9 @@ "password": "123456" } }, - "extract_binds": { - "resp_status_code": "status_code", - "resp_body_success": "content.success" - }, "validators": { - "resp_status_code": {"comparator": "eq", "expected": 500}, - "resp_body_success": {"comparator": "eq", "expected": false} + "status_code": {"comparator": "eq", "expected": 500}, + "content.success": {"comparator": "eq", "expected": false} } } } diff --git a/test/data/simple_demo_auth_hardcode.yml b/test/data/simple_demo_auth_hardcode.yml index 8d0c0204..15f66e06 100644 --- a/test/data/simple_demo_auth_hardcode.yml +++ b/test/data/simple_demo_auth_hardcode.yml @@ -10,13 +10,9 @@ json: name: "user1" password: "123456" - extract_binds: - resp_status_code: status_code - resp_body_success: content.success - resp_body_msg: content.msg validators: - resp_status_code: {"comparator": "eq", "expected": 201} - resp_body_success: {"comparator": "eq", "expected": true} + status_code: {"comparator": "eq", "expected": 201} + content.success: {"comparator": "eq", "expected": true} - test: name: create user which existed @@ -30,9 +26,6 @@ json: name: "user1" password: "123456" - extract_binds: - resp_status_code: status_code - resp_body_success: content.success validators: - resp_status_code: {"comparator": "eq", "expected": 500} - resp_body_success: {"comparator": "eq", "expected": false} \ No newline at end of file + status_code: {"comparator": "eq", "expected": 500} + content.success: {"comparator": "eq", "expected": false} \ No newline at end of file diff --git a/test/data/simple_demo_no_auth.json b/test/data/simple_demo_no_auth.json index a076ddcf..ae6c2aaa 100644 --- a/test/data/simple_demo_no_auth.json +++ b/test/data/simple_demo_no_auth.json @@ -14,14 +14,9 @@ "password": "123456" } }, - "extract_binds": { - "resp_status_code": "status_code", - "resp_body_success": "content.success", - "resp_body_msg": "content.msg" - }, "validators": { - "resp_status_code": {"comparator": "eq", "expected": 201}, - "resp_body_success": {"comparator": "eq", "expected": true} + "status_code": {"comparator": "eq", "expected": 201}, + "content.success": {"comparator": "eq", "expected": true} } } }, @@ -39,13 +34,9 @@ "password": "123456" } }, - "extract_binds": { - "resp_status_code": "status_code", - "resp_body_success": "content.success" - }, "validators": { - "resp_status_code": {"comparator": "eq", "expected": 500}, - "resp_body_success": {"comparator": "eq", "expected": false} + "status_code": {"comparator": "eq", "expected": 500}, + "content.success": {"comparator": "eq", "expected": false} } } } diff --git a/test/data/simple_demo_no_auth.yml b/test/data/simple_demo_no_auth.yml index 4be5460e..7a6bf078 100644 --- a/test/data/simple_demo_no_auth.yml +++ b/test/data/simple_demo_no_auth.yml @@ -8,14 +8,10 @@ json: name: user1 password: 123456 - extract_binds: - resp_status_code: status_code - resp_body_success: content.success - resp_headers_content_type: headers.content-type validators: - resp_status_code: {"comparator": "eq", "expected": 201} - resp_headers_content_type: {"comparator": "eq", "expected": "application/json"} - resp_body_success: {"comparator": "eq", "expected": true} + status_code: {"comparator": "eq", "expected": 201} + headers.content-type: {"comparator": "eq", "expected": "application/json"} + content.success: {"comparator": "eq", "expected": true} - test: name: create user which existed @@ -27,11 +23,7 @@ json: name: user1 password: 123456 - extract_binds: - resp_status_code: status_code - resp_body_success: content.success - resp_headers_content_type: headers.content-type validators: - resp_status_code: {"comparator": "eq", "expected": 500} - resp_headers_content_type: {"comparator": "eq", "expected": "application/json"} - resp_body_success: {"comparator": "eq", "expected": false} \ No newline at end of file + status_code: {"comparator": "eq", "expected": 500} + headers.content-type: {"comparator": "eq", "expected": "application/json"} + content.success: {"comparator": "eq", "expected": false} \ No newline at end of file