Ilya Menkov | ad23403 | 2019-10-22 13:43:54 +0400 | [diff] [blame] | 1 | import config |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 2 | from testrail import APIClient |
Ilya Menkov | ad23403 | 2019-10-22 13:43:54 +0400 | [diff] [blame] | 3 | |
| 4 | |
| 5 | class Base: |
| 6 | def __init__(self): |
| 7 | self.client = APIClient(config.URL) |
| 8 | self.client.user = config.USER |
| 9 | self.client.password = config.PASSWORD |
| 10 | self.project = self._get_project(config.PROJECT) |
| 11 | |
| 12 | def _get_project(self, project_name): |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 13 | projects_uri = "get_projects" |
| 14 | projects = self.client.send_get(uri=projects_uri)["projects"] |
Ilya Menkov | ad23403 | 2019-10-22 13:43:54 +0400 | [diff] [blame] | 15 | for project in projects: |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 16 | if project["name"] == project_name: |
Ilya Menkov | ad23403 | 2019-10-22 13:43:54 +0400 | [diff] [blame] | 17 | return project |
| 18 | return None |
| 19 | |
| 20 | def send_post_add_result(self, some_id, bug, status_id, add_result): |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 21 | add_result["status_id"] = status_id |
| 22 | add_result["custom_launchpad_bug"] = bug |
| 23 | send_add_result = "add_result/" + str(some_id) |
Ilya Menkov | ad23403 | 2019-10-22 13:43:54 +0400 | [diff] [blame] | 24 | return self.client.send_post(send_add_result, add_result) |
| 25 | |
| 26 | def get_plans(self, project_id): # ! |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 27 | return self.client.send_get("get_plans/{0}".format(project_id)) |
Ilya Menkov | ad23403 | 2019-10-22 13:43:54 +0400 | [diff] [blame] | 28 | |
| 29 | def get_plan(self, plan_id): # ! |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 30 | return self.client.send_get("get_plan/{0}".format(plan_id)) |
Ilya Menkov | ad23403 | 2019-10-22 13:43:54 +0400 | [diff] [blame] | 31 | |
| 32 | def is_test_plan_exist(self, test_plan_name): |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 33 | runs = self.get_plans(self.project["id"]) |
| 34 | if True in map(lambda item: item["name"] == test_plan_name, runs): |
Ilya Menkov | ad23403 | 2019-10-22 13:43:54 +0400 | [diff] [blame] | 35 | return True |
| 36 | return False |
| 37 | |
| 38 | def get_tests(self, plan_id): # ! |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 39 | return self.client.send_get("get_tests/{0}".format(plan_id)) |
Ilya Menkov | ad23403 | 2019-10-22 13:43:54 +0400 | [diff] [blame] | 40 | |
| 41 | def get_test_runs(self, plan_id, pattern=None): |
| 42 | plans_runs = self.get_plan(plan_id) # !get_plans |
| 43 | runs = [] |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 44 | for run in plans_runs["entries"]: |
Ilya Menkov | ad23403 | 2019-10-22 13:43:54 +0400 | [diff] [blame] | 45 | if pattern: |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 46 | if pattern in run["name"]: |
Ilya Menkov | ad23403 | 2019-10-22 13:43:54 +0400 | [diff] [blame] | 47 | runs.append(run) |
| 48 | else: |
| 49 | runs.append(run) |
| 50 | return runs |
| 51 | |
| 52 | def get_tempest_runs(self, plan_id): |
| 53 | runs = self.get_plan(plan_id) # !get_plans |
| 54 | tempest_runs = [] |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 55 | for run in runs["entries"]: |
| 56 | if "Tempest" in run["name"]: |
Ilya Menkov | ad23403 | 2019-10-22 13:43:54 +0400 | [diff] [blame] | 57 | tempest_runs.append(run) |
| 58 | return tempest_runs |
| 59 | |
| 60 | def get_id_of_failed_tests(self, run_id): # ! |
| 61 | all_tests = self.get_tests(run_id) |
| 62 | test_ids = [] |
| 63 | for test in all_tests: |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 64 | if test["status_id"] == 5: |
| 65 | test_ids.append(test["id"]) |
Ilya Menkov | ad23403 | 2019-10-22 13:43:54 +0400 | [diff] [blame] | 66 | return test_ids |
| 67 | |
| 68 | def get_test_result(self, test_id): |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 69 | return self.client.send_get("get_results/{0}".format(test_id)) |
Ilya Menkov | ad23403 | 2019-10-22 13:43:54 +0400 | [diff] [blame] | 70 | |
| 71 | def get_test_results_for_run(self, run_id): |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 72 | return self.client.send_get("get_results_for_run/{0}".format(run_id)) |
Ilya Menkov | ad23403 | 2019-10-22 13:43:54 +0400 | [diff] [blame] | 73 | |
| 74 | def get_results_for_case(self, run_id, case_id): |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 75 | return self.client.send_get( |
| 76 | "get_results_for_case/{0}/{1}".format(run_id, case_id) |
| 77 | ) |
Ilya Menkov | ad23403 | 2019-10-22 13:43:54 +0400 | [diff] [blame] | 78 | |
| 79 | def get_test(self, test_id): |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 80 | return self.client.send_get("get_test/{0}".format(test_id)) |
Ilya Menkov | ad23403 | 2019-10-22 13:43:54 +0400 | [diff] [blame] | 81 | |
| 82 | def get_runs(self, run_id): |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 83 | return self.client.send_get("get_runs/{0}".format(run_id)) |
Ilya Menkov | ad23403 | 2019-10-22 13:43:54 +0400 | [diff] [blame] | 84 | |
| 85 | def get_run(self, run_id): |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 86 | return self.client.send_get("get_run/{0}".format(run_id)) |
Ilya Menkov | ad23403 | 2019-10-22 13:43:54 +0400 | [diff] [blame] | 87 | |
| 88 | def get_milestones(self): |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 89 | milestones_uri = "get_milestones/{project_id}".format( |
| 90 | project_id=self.project["id"] |
| 91 | ) |
| 92 | return self.client.send_get(uri=milestones_uri)["milestones"] |
Ilya Menkov | ad23403 | 2019-10-22 13:43:54 +0400 | [diff] [blame] | 93 | |
| 94 | def get_milestone(self, milestone_id): |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 95 | milestone_uri = "get_milestone/{milestone_id}".format( |
| 96 | milestone_id=milestone_id |
| 97 | ) |
Ilya Menkov | ad23403 | 2019-10-22 13:43:54 +0400 | [diff] [blame] | 98 | return self.client.send_get(uri=milestone_uri) |
| 99 | |
| 100 | def get_milestone_by_name(self, name): |
| 101 | for milestone in self.get_milestones(): |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 102 | if milestone["name"] == name: |
| 103 | return self.get_milestone(milestone_id=milestone["id"]) |
Ilya Menkov | ad23403 | 2019-10-22 13:43:54 +0400 | [diff] [blame] | 104 | |
| 105 | def add_plan(self, name, description, milestone_id, entries): |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 106 | add_plan_uri = "add_plan/{project_id}".format( |
| 107 | project_id=self.project["id"] |
| 108 | ) |
Ilya Menkov | ad23403 | 2019-10-22 13:43:54 +0400 | [diff] [blame] | 109 | new_plan = { |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 110 | "name": name, |
| 111 | "description": description, |
| 112 | "milestone_id": milestone_id, |
| 113 | "entries": entries, # entries=[] |
Ilya Menkov | ad23403 | 2019-10-22 13:43:54 +0400 | [diff] [blame] | 114 | } |
| 115 | return self.client.send_post(add_plan_uri, new_plan) |
| 116 | |
| 117 | def add_plan_entry(self, project_id, new_run): |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 118 | add_plan_uri = "add_plan_entry/{project_id}".format( |
| 119 | project_id=project_id |
| 120 | ) |
Ilya Menkov | ad23403 | 2019-10-22 13:43:54 +0400 | [diff] [blame] | 121 | return self.client.send_post(add_plan_uri, new_run) |
| 122 | |
| 123 | def get_suites(self): |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 124 | suites_uri = "get_suites/{project_id}".format( |
| 125 | project_id=self.project["id"] |
| 126 | ) |
Ilya Menkov | ad23403 | 2019-10-22 13:43:54 +0400 | [diff] [blame] | 127 | return self.client.send_get(uri=suites_uri) |
| 128 | |
| 129 | def get_suite(self, suite_id): |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 130 | suite_uri = "get_suite/{suite_id}".format(suite_id=suite_id) |
Ilya Menkov | ad23403 | 2019-10-22 13:43:54 +0400 | [diff] [blame] | 131 | return self.client.send_get(uri=suite_uri) |
| 132 | |
| 133 | def get_suite_by_name(self, name): |
| 134 | for suite in self.get_suites(): |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 135 | if suite["name"] == name: |
| 136 | return self.get_suite(suite_id=suite["id"]) |
Ilya Menkov | ad23403 | 2019-10-22 13:43:54 +0400 | [diff] [blame] | 137 | |
| 138 | def get_plan_by_name(self, name): |
| 139 | for plan in self.get_plans(13): |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 140 | if plan["name"] == name: |
| 141 | return self.get_plan(plan["id"]) |
Ilya Menkov | ad23403 | 2019-10-22 13:43:54 +0400 | [diff] [blame] | 142 | |
| 143 | def add_result(self, test_id, result_to_add): |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 144 | return self.client.send_post( |
| 145 | "add_result/{0}".format(test_id["id"]), result_to_add |
| 146 | ) |
Ilya Menkov | ad23403 | 2019-10-22 13:43:54 +0400 | [diff] [blame] | 147 | |
| 148 | def add_suite(self, name, description=None): |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 149 | return self.client.send_post( |
| 150 | "add_suite/" + str(self.project["id"]), |
| 151 | dict(name=name, description=description), |
| 152 | ) |
Ilya Menkov | ad23403 | 2019-10-22 13:43:54 +0400 | [diff] [blame] | 153 | |
| 154 | def get_sections(self, suite_id): |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 155 | sections_uri = "get_sections/{project_id}&suite_id={suite_id}".format( |
| 156 | project_id=self.project["id"], suite_id=suite_id |
Ilya Menkov | ad23403 | 2019-10-22 13:43:54 +0400 | [diff] [blame] | 157 | ) |
| 158 | return self.client.send_get(sections_uri) |
| 159 | |
| 160 | def get_section(self, section_id): |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 161 | section_uri = "get_section/{section_id}".format(section_id=section_id) |
Ilya Menkov | ad23403 | 2019-10-22 13:43:54 +0400 | [diff] [blame] | 162 | return self.client.send_get(section_uri) |
| 163 | |
| 164 | def get_section_by_name(self, suite_id, section_name): |
| 165 | for section in self.get_sections(suite_id=suite_id): |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 166 | if section["name"] == section_name: |
| 167 | return self.get_section(section_id=section["id"]) |
Ilya Menkov | ad23403 | 2019-10-22 13:43:54 +0400 | [diff] [blame] | 168 | |
| 169 | def add_section(self, suite_id, name, parent_id=None): |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 170 | return self.client.send_post( |
| 171 | "add_section/" + str(self.project["id"]), |
| 172 | dict(suite_id=suite_id, name=name, parent_id=parent_id), |
| 173 | ) |
Ilya Menkov | ad23403 | 2019-10-22 13:43:54 +0400 | [diff] [blame] | 174 | |
| 175 | def delete_section(self, section_id): |
| 176 | # Not working bug in testrail |
| 177 | section = self.get_section(section_id) |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 178 | print("SECTION", section) |
Ilya Menkov | ad23403 | 2019-10-22 13:43:54 +0400 | [diff] [blame] | 179 | try: |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 180 | deleted = self.client.send_post( |
| 181 | "delete_section/{}".format(section_id), section |
| 182 | ) |
| 183 | print("DELETED", deleted) |
Ilya Menkov | ad23403 | 2019-10-22 13:43:54 +0400 | [diff] [blame] | 184 | except Exception: |
| 185 | pass |
| 186 | return |
| 187 | |
| 188 | def add_case(self, section_id, case): |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 189 | add_case_uri = "add_case/{section_id}".format(section_id=section_id) |
Ilya Menkov | ad23403 | 2019-10-22 13:43:54 +0400 | [diff] [blame] | 190 | return self.client.send_post(add_case_uri, case) |
| 191 | |
| 192 | @staticmethod |
| 193 | def prepare_common_results(tests, status_id): |
| 194 | results = {"results": []} |
| 195 | |
| 196 | for test in tests: |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 197 | results["results"].append( |
| 198 | { |
| 199 | "test_id": test["id"], |
| 200 | "status_id": status_id, |
| 201 | "comment": "Deploy failed", |
| 202 | } |
| 203 | ) |
Ilya Menkov | ad23403 | 2019-10-22 13:43:54 +0400 | [diff] [blame] | 204 | return results |
| 205 | |
| 206 | @staticmethod |
| 207 | def get_result_by_name(): |
| 208 | result = config.RESULT |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 209 | if result == "Blocked": |
Ilya Menkov | ad23403 | 2019-10-22 13:43:54 +0400 | [diff] [blame] | 210 | return 2 |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 211 | elif result == "Passed": |
Ilya Menkov | ad23403 | 2019-10-22 13:43:54 +0400 | [diff] [blame] | 212 | return 1 |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 213 | elif result == "Failed": |
Ilya Menkov | ad23403 | 2019-10-22 13:43:54 +0400 | [diff] [blame] | 214 | return 5 |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 215 | elif result == "ProdFailed": |
Ilya Menkov | ad23403 | 2019-10-22 13:43:54 +0400 | [diff] [blame] | 216 | return 8 |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 217 | elif result == "Skipped": |
Ilya Menkov | ad23403 | 2019-10-22 13:43:54 +0400 | [diff] [blame] | 218 | return 6 |
| 219 | |
| 220 | @staticmethod |
| 221 | def get_id_of_tempest_runs(tempest_runs): |
| 222 | tempest_runs_ids = {} # [] |
| 223 | for i in tempest_runs: |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 224 | for item in i["runs"]: |
| 225 | tempest_runs_ids.update({item["id"]: item["name"]}) |
Ilya Menkov | ad23403 | 2019-10-22 13:43:54 +0400 | [diff] [blame] | 226 | return tempest_runs_ids |
| 227 | |
| 228 | @staticmethod |
| 229 | def get_last_tempest_run(get_plans): |
| 230 | for plans in get_plans: |
| 231 | # print dict |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 232 | if ( |
| 233 | plans.get("passed_count") > 1000 |
| 234 | or plans.get("blocked_count") > 1000 |
| 235 | ) and "9.1" in plans.get("name"): |
| 236 | return plans.get("id") |