From 926d086537f7aad8e41f462234e9abe8ce1c0175 Mon Sep 17 00:00:00 2001 From: Roxie Gibson Date: Fri, 22 Jan 2021 14:11:50 +0000 Subject: [PATCH] feat: improved looping over the hardcoded terms --- .pylintrc | 3 +- main.py | 120 ++++++++++++++++++++++++++++++++---------------------- 2 files changed, 73 insertions(+), 50 deletions(-) diff --git a/.pylintrc b/.pylintrc index 7d86e39..652186d 100644 --- a/.pylintrc +++ b/.pylintrc @@ -139,7 +139,8 @@ disable=print-statement, deprecated-sys-function, exception-escape, comprehension-escape, - C0103 + C0103, + arguments-differ # Enable the message, report, category or checker with the given id(s). You can # either give multiple identifier separated by comma (,) or put this option diff --git a/main.py b/main.py index 0ebeb78..dd014b1 100644 --- a/main.py +++ b/main.py @@ -18,7 +18,14 @@ from selenium.webdriver.support.select import Select class BaseTester: - """Base class for all test suites""" + """ + Base class for all test suites + + One caveat: This class defines a pseudo function "_test" which is called by "_test_all" + Overloading classes are to define their own tests to be run by selenium after logging in + Then they are to call "_test_all" which will run these tests in a loop with given variables + This allows the test to be run multiple times with different terms to make sure the test covers all bases. + """ def __init__(self, user: str, passwd: str, dev: bool, show_browser: bool): self.console = Console() logging.basicConfig( @@ -110,6 +117,19 @@ class BaseTester: EC.visibility_of_element_located((By.ID, "tabs-wrapper")) ) + def _test(self, *args): + """Placeholder to be overwritten by overloading classes""" + + def _test_all(self, test_strings: tuple[str]): + """Loops testing over the given terms""" + try: + self.login() + for term in test_strings: + self._test(term) + finally: + self.logout() + self.browser.close() + def find_element_by_id(self, *args, **kwargs): """Alias for browser.find_element_by_id""" return self.browser.find_element_by_id(*args, **kwargs) @@ -206,47 +226,56 @@ class ContactExport(BaseTester): self.debug("got qf_key '%s' from url" % qf_key) return qf_key - def test(self, search_term: str): - try: - self.login() - self.browser.get(self.search_url) - search_box = self.find_element_by_id("sort_name") - search_box.send_keys(search_term) - search_box.send_keys(Keys.ENTER) - self.debug("searching for contacts with term '%s'" % search_term) - self.wait_until_visible( - (By.ID, "alpha-filter") - ) #wait for table to load - self.debug("table of results has loaded") + def _test(self, search_term: str): + """ + Test Description: + Go to the contact search url + Search for the search term + Select all contacts and set them to export + Get the login cookie and search ID and download the export manually with requests + Save the file in tmp + Read it to check the number of exported contacts is the same as reported in the UI + """ + self.browser.get(self.search_url) + search_box = self.find_element_by_id("sort_name") + search_box.send_keys(search_term) + search_box.send_keys(Keys.ENTER) + self.debug("searching for contacts with term '%s'" % search_term) + self.wait_until_visible( + (By.ID, "alpha-filter") + ) #wait for table to load + self.debug("table of results has loaded") - results_text = self.find_element_by_css_selector( - ".form-layout-compressed > tbody:nth-child(1) > tr:nth-child(2) > td:nth-child(2) > label:nth-child(2)" - ).text - matches = re.findall( - r"(\d+)", results_text - ) # Should just be one match in normal cases - result_no = int(matches[0]) + results_text = self.find_element_by_css_selector( + ".form-layout-compressed > tbody:nth-child(1) > tr:nth-child(2) > td:nth-child(2) > label:nth-child(2)" + ).text + matches = re.findall( + r"(\d+)", results_text + ) # Should just be one match in normal cases + result_no = int(matches[0]) - self.debug("exporting results using the magic dropdown") - self.find_element_by_id(self.contact_selectall_id).click() - self.find_element_by_id(self.contact_dropdown_id).click() - self.find_element_by_id(self.contact_exportoption_id).click() - self.wait_until_visible((By.CSS_SELECTOR, ".crm-block")) + self.debug("exporting results using the magic dropdown") + self.find_element_by_id(self.contact_selectall_id).click() + self.find_element_by_id(self.contact_dropdown_id).click() + self.find_element_by_id(self.contact_exportoption_id).click() + self.wait_until_visible((By.CSS_SELECTOR, ".crm-block")) - exported_number_exports = self.calculate_exported_contacts_number() - if exported_number_exports == (result_no): - self.passed( - "Number of expected contact exports for '%s' matches actual number of exports - Expected: %d, Actual: %d" - % (search_term, result_no, exported_number_exports) - ) - else: - self.failed( - "Number of expected contact exports for '%s' WAS NOT EQUAL to actual number of exports - Expected: %d, Actual: %d" - % (search_term, result_no, exported_number_exports) - ) - finally: - self.logout() - self.browser.close() + exported_number_exports = self.calculate_exported_contacts_number() + if exported_number_exports == (result_no): + self.passed( + "Number of expected contact exports for '%s' matches actual number of exports - Expected: %d, Actual: %d" + % (search_term, result_no, exported_number_exports) + ) + else: + self.failed( + "Number of expected contact exports for '%s' WAS NOT EQUAL to actual number of exports - Expected: %d, Actual: %d" + % (search_term, result_no, exported_number_exports) + ) + + def test_hardcoded_search_terms(self): + """Loops over the test with three hardcoded search terms""" + search_terms = ("John", "e", "Smith") + self._test_all(search_terms) class ActivitiesTab(BaseTester): @@ -256,7 +285,7 @@ class ActivitiesTab(BaseTester): self.desc("Testing if a contacts activities tab displays all activies") self.contact_page = self.base_url + "/civicrm/contact/view/?reset=1&cid={}" - def test(self, cid: str): + def _test(self, cid: str): self.debug("loading contact page for CID %s" % cid) self.browser.get(self.contact_page.format(cid)) self.wait_until_visible((By.ID, "ui-id-10")) @@ -309,13 +338,7 @@ class ActivitiesTab(BaseTester): cid_na = "42269" # Nigel Addams #cid_db = "43193" Use to test 100 max limit cid_tuple = (cid_da, cid_kh, cid_na) - try: - self.login() - for cid in cid_tuple: - self.test(cid) - finally: - self.logout() - self.browser.close() + self._test_all(cid_tuple) if __name__ == "__main__": @@ -347,8 +370,7 @@ if __name__ == "__main__": ).test_all_hardcoded_contacts() ContactExport( arguments.user, arguments.passwd, arguments.dev, arguments.show_browser - ).test("John") - #ContactExport(arguments.user, arguments.passwd, arguments.dev).test("e") + ).test_hardcoded_search_terms() # Mailing list # Load mailing list test and enter test data