From 91a7b9172ea859e23e6d69eb316a93223e9fd1e2 Mon Sep 17 00:00:00 2001 From: Martin Kourim Date: Tue, 10 Sep 2019 14:49:25 +0200 Subject: [PATCH] Configurable fields for requirements; more complete fields mapping --- .../exporters/requirements_exporter.py | 40 ++++++++++++++----- dump2polarion/exporters/testcases_exporter.py | 20 ++++++---- polarion_tools.yaml.template | 30 ++++++++++---- tests/conftest.py | 3 ++ tests/data/polarion_tools.yaml | 14 +++---- tests/data/requirement_complete.xml | 6 +-- tests/test_requirement_exporter.py | 14 +++---- 7 files changed, 84 insertions(+), 43 deletions(-) diff --git a/dump2polarion/exporters/requirements_exporter.py b/dump2polarion/exporters/requirements_exporter.py index e494afb..954d1a5 100644 --- a/dump2polarion/exporters/requirements_exporter.py +++ b/dump2polarion/exporters/requirements_exporter.py @@ -7,14 +7,14 @@ "title": "requirement_complete", "description": "Complete Requirement", "approver-ids": "mkourim:approved", - "assignee-id": "mkourim", + "assignee": "mkourim", "category-ids": "category_id1, category_id2", - "due-date": "2018-09-30", - "planned-in-ids": "planned_id1, planned_id2", - "initial-estimate": "1/4h", - "priority-id": "high", - "severity-id": "should_have", - "status-id": "status_id", + "dueDate": "2018-09-30", + "plannedIn": "planned_id1, planned_id2", + "initialEstimate": "1/4h", + "priority": "high", + "severity": "should_have", + "status": "status_id", "reqtype": "functional", }, { @@ -53,7 +53,9 @@ class RequirementTransform: FIELD_MAPPING = { "assignee-id": "assignee", + "due-date": "dueDate", "initial-estimate": "initialEstimate", + "planned-in-ids": "plannedIn", "priority-id": "priority", "severity-id": "severity", "status-id": "status", @@ -67,6 +69,15 @@ def __init__(self, config, transform_func=None): config ) + default_fields = self.config.get("requirements_default_fields") or {} + default_fields = {k: utils.get_unicode_str(v) for k, v in default_fields.items() if v} + self.default_fields = utils.sorted_dict(default_fields) + + def _fill_project_defaults(self, testcase_data): + filled = self.default_fields.copy() + filled.update(testcase_data) + return filled + def _run_transform_func(self, result): """Calls transform function on result.""" if self._transform_func: @@ -91,6 +102,7 @@ def _fill_defaults(self, req_data): def transform(self, req_data): """Transforms requirement data.""" + req_data = self._fill_project_defaults(req_data) req_data = self._fill_polarion_fields(req_data) req_data = self._run_transform_func(req_data) if not req_data: @@ -114,6 +126,9 @@ def __init__(self, requirements_data, config, transform_func=None): self._lookup_prop = "" self.requirement_transform = RequirementTransform(config, transform_func) + self.known_custom_fields = set(self.requirement_transform.CUSTOM_FIELDS) + self.known_custom_fields.update(self.config.get("requirements_custom_fields") or ()) + def _top_element(self): """Returns top XML element.""" attrs = {"project-id": self.config["polarion-project-id"]} @@ -173,10 +188,13 @@ def _classify_data(self, req_data): if not value: continue conv_key = key.replace("_", "-") # convert pythonic key_param to polarion 'key-param' - if conv_key in self.requirement_transform.REQ_DATA: - attrs[conv_key] = value - elif conv_key in self.requirement_transform.CUSTOM_FIELDS: - custom_fields[conv_key] = value + for key_variant in (conv_key, key): + if key_variant in self.requirement_transform.REQ_DATA: + attrs[key_variant] = value + elif key_variant in self.known_custom_fields: + custom_fields[key_variant] = value + if conv_key == key: + break return attrs, custom_fields diff --git a/dump2polarion/exporters/testcases_exporter.py b/dump2polarion/exporters/testcases_exporter.py index 2205a22..4f629ee 100644 --- a/dump2polarion/exporters/testcases_exporter.py +++ b/dump2polarion/exporters/testcases_exporter.py @@ -8,9 +8,9 @@ "title": "test_manual", "description": "Manual tests with all supported fields.", "approver-ids": "bossman mkourim:approved", - "assignee-id": "mkourim", - "due-date": "2018-09-30", - "initial-estimate": "1/4h", + "assignee": "mkourim", + "dueDate": "2018-09-30", + "initialEstimate": "1/4h", "caseautomation": "manualonly", "caseimportance": "high", "caselevel": "component", @@ -25,13 +25,13 @@ "automation_script": "https://gitlab.com/foo", "testSteps": ["step1", "step2"], "expectedResults": ["result1", "result2"], - "linked-items": "ITEM01", - "status-id": "proposed", + "linkedWorkItems": "ITEM01", + "status": "proposed", }, { "title": "test_minimal_param", "params": ["param1", "param2"], - "linked-items": [{"id": "ITEM01", "role": "derived_from"}], + "linkedWorkItems": [{"id": "ITEM01", "role": "derived_from"}], }, ] """ @@ -62,7 +62,13 @@ class TestcaseTransform: "status-id": None, } - FIELD_MAPPING = {"assignee-id": "assignee", "initial-estimate": "initialEstimate"} + FIELD_MAPPING = { + "assignee-id": "assignee", + "due-date": "dueDate", + "initial-estimate": "initialEstimate", + "status-id": "status", + "linked-items": "linkedWorkItems", + } CUSTOM_FIELDS = { "arch": None, diff --git a/polarion_tools.yaml.template b/polarion_tools.yaml.template index 19f3a2b..a73a4c3 100644 --- a/polarion_tools.yaml.template +++ b/polarion_tools.yaml.template @@ -15,22 +15,23 @@ repo_address: https://github.com/project/repo default_fields: assignee: "" - casecomponent: "" - initialEstimate: 1m + caseautomation: automated + casecomponent: "-" caseimportance: high caselevel: component caseposneg: positive - caseautomation: automated - testtype: functional + description: "" + expectedResults: "" + initialEstimate: "" + linkedWorkItems: "" + setup: "" + status: "" subtype1: "-" subtype2: "-" tags: "" - setup: "" teardown: "" - description: "" - linkedWorkItems: "" testSteps: "" - expectedResults: "" + testtype: functional title: "" work_item_id: "" @@ -48,6 +49,19 @@ custom_fields: - testtype - upstream +requirements_default_fields: + assignee: "" + dueDate: "" + initialEstimate: "" + plannedIn: "" + priority: "" + reqtype: "functional" + severity: "" + status: "" + +requirements_custom_fields: + - reqtype + blacklisted_tests: - 'cfme/tests/containers/' - 'cfme/tests/openstack/' diff --git a/tests/conftest.py b/tests/conftest.py index 6463230..dea7e74 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -58,6 +58,8 @@ ) ) +REQUIREMENTS_DEFAULT_FIELDS = OrderedDict((("reqtype", "system"),)) + RHCF3_TESTCASE_PROPS = OrderedDict((("lookup-method", "name"),)) RHCF3_CONF = GENERIC_CONF.copy() @@ -65,6 +67,7 @@ RHCF3_CONF["xunit_import_properties"] = RHCF3_XUNIT_PROPS RHCF3_CONF["testcase_import_properties"] = RHCF3_TESTCASE_PROPS RHCF3_CONF["default_fields"] = POLARION_DEFAULT_FIELDS +RHCF3_CONF["requirements_default_fields"] = REQUIREMENTS_DEFAULT_FIELDS RHCF3_CONF["docstrings"] = VALID_CASELEVELS CMP_CONF = GENERIC_CONF.copy() diff --git a/tests/data/polarion_tools.yaml b/tests/data/polarion_tools.yaml index 33ace08..332267f 100644 --- a/tests/data/polarion_tools.yaml +++ b/tests/data/polarion_tools.yaml @@ -1,8 +1,8 @@ -polarion-project-id : RHCF3 +polarion-project-id: RHCF3 xunit_import_properties: - polarion-dry-run : false - polarion-testrun-status-id : inprogress - polarion-response-test : test -polarion_url : https://polarion.example.com/ -username : user1 -password : password1 + polarion-dry-run: false + polarion-testrun-status-id: inprogress + polarion-response-test: test +polarion_url: https://polarion.example.com/ +username: user1 +password: password1 diff --git a/tests/data/requirement_complete.xml b/tests/data/requirement_complete.xml index 8a6ad07..c8a7c3b 100644 --- a/tests/data/requirement_complete.xml +++ b/tests/data/requirement_complete.xml @@ -5,7 +5,7 @@ - + req01 @@ -15,13 +15,13 @@ req02 requirement description - + req03 - + diff --git a/tests/test_requirement_exporter.py b/tests/test_requirement_exporter.py index f636b6a..834fc20 100644 --- a/tests/test_requirement_exporter.py +++ b/tests/test_requirement_exporter.py @@ -15,14 +15,14 @@ ( ("title", "req01"), ("approver-ids", "sbulage:approved"), - ("assignee-id", "mkourim"), + ("assignee", "mkourim"), ("category-ids", "CAT-01"), - ("due-date", "2018-05-30"), - ("planned-in-ids", "PROJ-01"), - ("initial-estimate", "1/4h"), - ("priority-id", "medium"), - ("severity-id", "good_to_have"), - ("status-id", "STAT-01"), + ("dueDate", "2018-05-30"), + ("plannedIn", "PROJ-01"), + ("initialEstimate", "1/4h"), + ("priority", "medium"), + ("severity", "nice_to_have"), + ("status", "STAT-01"), ("reqtype", "functional"), ) ),