From 2cd601e46686aff5276f738f7aaaae8d07cd22bd Mon Sep 17 00:00:00 2001 From: srivatsakanchi <42274646+srivatsakanchi@users.noreply.github.com> Date: Sun, 12 Aug 2018 22:48:04 +0530 Subject: [PATCH 1/5] Add support to run on python3 --- setup.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/setup.py b/setup.py index de88f82..3b55ce5 100644 --- a/setup.py +++ b/setup.py @@ -1,4 +1,5 @@ from setuptools import setup +import sys setup(name='Rester', version='1.0.1', @@ -14,4 +15,6 @@ description='Rest API Testing', long_description=open('README.md').read(), install_requires=["requests", "testfixtures", "PyYAML>=3.9"], + use_2to3= sys.version_info.major >= 3, ) + From 19e0d84407760c46792892c4863ee00548c60344 Mon Sep 17 00:00:00 2001 From: srivatsakanchi <42274646+srivatsakanchi@users.noreply.github.com> Date: Sun, 12 Aug 2018 23:04:27 +0530 Subject: [PATCH 2/5] Updated the changes section with the loop construct --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index d250ae4..49d1c36 100644 --- a/README.md +++ b/README.md @@ -541,7 +541,10 @@ Nino Walker - nino@livefyre.com - Breaking change: `__raw__` to `raw` on the *TestStep*. - Feature: `status` to *TestStep.asserts*, allowing for non-200 replies. - +- Added `loop` to the *TestStep*. `loop` takes a list of two values [, ] + The loop is run until the `payload` assert is `True` or the loop times is over. On every loop, waits for `loop_interval` + seconds. + #TODO - Use meta-programming to allow direct integration into unittest frameworks, and run with tests a la `nose`, to leverage all the things. From 63e2c6e2111b4cab97074482ac85f823a52fb580 Mon Sep 17 00:00:00 2001 From: srivatsakanchi <42274646+srivatsakanchi@users.noreply.github.com> Date: Sun, 12 Aug 2018 23:06:57 +0530 Subject: [PATCH 3/5] Added the loop logic --- rester/exc.py | 62 ++++++++++++++++++++++++++++++++++----------------- 1 file changed, 41 insertions(+), 21 deletions(-) diff --git a/rester/exc.py b/rester/exc.py index 5f3c7d7..4cde82e 100644 --- a/rester/exc.py +++ b/rester/exc.py @@ -5,6 +5,7 @@ import collections import re import traceback +from time import sleep Failure = collections.namedtuple("Failure", "errors output") @@ -61,7 +62,8 @@ def _format_logs(self, lc): def _build_param_dict(self, test_step): params = {} if hasattr(test_step, 'params') and test_step.params is not None: - for key, value in test_step.params.items().items(): + dct= test_step.params.items() + for key, value in dct.items(): params[key] = self.case.variables.expand(value) return params @@ -77,7 +79,8 @@ def _execute_test_step(self, test_step): headers = {} if hasattr(test_step, 'headers') and test_step.headers is not None: self.logger.debug('Found Headers') - for key, value in test_step.headers.items().items(): + dct= test_step.headers.items() + for key, value in dct.items(): headers[key] = self.case.variables.expand(value) # process and set up params @@ -85,23 +88,37 @@ def _execute_test_step(self, test_step): url = self.case.variables.expand(test_step.apiUrl) self.logger.debug('Evaluated URL : %s', url) - response_wrapper = http_client.request(url, method, headers, params, is_raw) - - # expected_status = getattr(getattr(test_step, 'asserts'), 'status', 200) - # if response_wrapper.status != expected_status: - # failures.errors.append("status(%s) != expected status(%s)" % (response_wrapper.status, expected_status)) - - if hasattr(test_step, "asserts"): - asserts = test_step.asserts - if hasattr(asserts, "headers"): - self._assert_element_list('Header', failures, test_step, response_wrapper.headers, test_step.asserts.headers.items().items()) - - if hasattr(asserts, "payload"): - self.logger.debug('Evaluating Response Payload') - self._assert_element_list('Payload', failures, test_step, response_wrapper.body, test_step.asserts.payload.items().items()) - else: - self.logger.warn('\n=======> No "asserts" element found in TestStep %s', test_step.name) - + + loop_times, loop_interval = (1, 0) + if hasattr(test_step, 'loop') and test_step.loop is not None: + loop_times, loop_interval = test_step.loop + + for times in range(loop_times): + response_wrapper = http_client.request(url, method, headers, params, is_raw) + + # expected_status = getattr(getattr(test_step, 'asserts'), 'status', 200) + # if response_wrapper.status != expected_status: + # failures.errors.append("status(%s) != expected status(%s)" % (response_wrapper.status, expected_status)) + + if hasattr(test_step, "asserts"): + asserts = test_step.asserts + if hasattr(asserts, "headers"): + dct= test_step.asserts.headers.items() + if not self._assert_element_list('Header', failures, test_step, response_wrapper.headers, dct.items()): + break + + if hasattr(asserts, "payload"): + dct= test_step.asserts.payload.items() + self.logger.debug('Evaluating Response Payload') + if self._assert_element_list('Payload', failures, test_step, response_wrapper.body, dct.items()): + break + + else: + self.logger.warn('\n=======> No "asserts" element found in TestStep %s', test_step.name) + break + + sleep(loop_interval) + except Exception as inst: failures.errors.append(traceback.format_exc()) self.logger.error('ERROR !!! TestStep %s Failed to execute !!! %s \ @@ -112,8 +129,9 @@ def _execute_test_step(self, test_step): return failures # execute all the assignment statements - if hasattr(test_step, 'postAsserts') and test_step.postAsserts is not None: - for key, value in test_step.postAsserts.items().items(): + if hasattr(test_step, 'postAsserts') and test_step.postAsserts is not None: + dct= test_step.postAsserts.items() + for key, value in dct.items(): self._process_post_asserts(response_wrapper.body, key, value) return None @@ -193,6 +211,8 @@ def _assert_element_list(self, section, failures, test_step, response, assert_li else: assert_message = '{} Assert Statement : {} ----> Pass!'.format(section, assert_literal_expr) self.logger.info('%s', assert_message) + + return assert_result def _process_post_asserts(self, response, key, value): self.logger.debug("evaled value: {}".format(getattr(response, value, ''))) From c8ae63ee95decdc38f205edbead5aba8d8ce0ed0 Mon Sep 17 00:00:00 2001 From: srivatsakanchi <42274646+srivatsakanchi@users.noreply.github.com> Date: Sun, 12 Aug 2018 23:24:46 +0530 Subject: [PATCH 4/5] changed the author, author_email and url --- setup.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/setup.py b/setup.py index 3b55ce5..7c57d69 100644 --- a/setup.py +++ b/setup.py @@ -3,9 +3,9 @@ setup(name='Rester', version='1.0.1', - author='Rajeev Chitamoor', - author_email='rajeev@chitamoor.com', - url='https://github.com/chitamoor/rester', + author='Srivatsa Kanchi', + author_email='srivatsa.kanchiv@yahoo.com', + url='https://github.com/srivatsakanchi/rester', license='LICENSE.txt', packages=['rester'], entry_points={ From bb0f9a2cd06a3a55ab180971f1b3386c753b37e3 Mon Sep 17 00:00:00 2001 From: srivatsakanchi <42274646+srivatsakanchi@users.noreply.github.com> Date: Sun, 12 Aug 2018 23:25:54 +0530 Subject: [PATCH 5/5] corrected the email address --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 7c57d69..cd35036 100644 --- a/setup.py +++ b/setup.py @@ -4,7 +4,7 @@ setup(name='Rester', version='1.0.1', author='Srivatsa Kanchi', - author_email='srivatsa.kanchiv@yahoo.com', + author_email='srivatsa.kanchi@yahoo.com', url='https://github.com/srivatsakanchi/rester', license='LICENSE.txt', packages=['rester'],