| # ============LICENSE_START======================================================= |
| # Copyright (c) 2018-2019 AT&T Intellectual Property. All rights reserved. |
| # ================================================================================ |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| # ============LICENSE_END========================================================= |
| # |
| """record all the messages going outside policy-handler during testing""" |
| |
| import copy |
| import json |
| |
| from policyhandler.config import Config |
| from policyhandler.onap.audit import REQUEST_X_ECOMP_REQUESTID |
| from policyhandler.utils import Utils |
| |
| RESPONSE = "res" |
| PEP_INSTANCE = "ONAPInstance" |
| _LOGGER = Utils.get_logger(__file__) |
| |
| class _MockHttpRequestInResponse(object): |
| """Mock http request in reponse object""" |
| def __init__(self, method, uri, **kwargs): |
| self.method = method |
| self.uri = uri |
| self.params = copy.deepcopy(kwargs.get("params")) |
| self.req_json = copy.deepcopy(kwargs.get("json")) |
| self.headers = copy.deepcopy(kwargs.get("headers")) |
| |
| def to_json(self): |
| """create json of the request""" |
| return { |
| "method": self.method, |
| "uri": self.uri, |
| "params": self.params, |
| "json": self.req_json, |
| "headers": self.headers |
| } |
| |
| |
| class MockHttpResponse(object): |
| """Mock http response based on request""" |
| def __init__(self, method, uri, res_json, **kwargs): |
| """create response based on request""" |
| self.request = _MockHttpRequestInResponse(method, uri, **kwargs) |
| |
| self.status_code = kwargs.get("status_code", 200) |
| self.res = copy.deepcopy(res_json) |
| self.text = json.dumps(self.res) |
| |
| self._track() |
| |
| def json(self): |
| """returns json of response""" |
| return self.res |
| |
| def raise_for_status(self): |
| """ignoring""" |
| pass |
| |
| def to_json(self): |
| """create json of the message""" |
| return { |
| "request": self.request.to_json(), |
| "status_code": self.status_code, |
| RESPONSE: self.res |
| } |
| |
| def _track(self): |
| """append the message to tracker's history""" |
| Tracker.track(self.to_json()) |
| |
| def __str__(self): |
| """stringify for logging""" |
| return json.dumps(self.to_json(), sort_keys=True) |
| |
| |
| class Tracker(object): |
| """record all the messages going outside policy-handler during testing""" |
| test_name = None |
| messages = [] |
| test_names = [] |
| validated_tests = {} |
| valid_tests = {} |
| |
| @staticmethod |
| def reset(test_name=None): |
| """remove all the messages from history""" |
| Tracker.test_name = test_name |
| Tracker.messages.clear() |
| Tracker.test_names.append(test_name) |
| |
| @staticmethod |
| def track(message): |
| """append the tracked message to the history""" |
| message = copy.deepcopy(message) |
| Tracker.messages.append(message) |
| if _LOGGER: |
| _LOGGER.info("tracked_message: %s", json.dumps(message, sort_keys=True)) |
| |
| @staticmethod |
| def to_string(): |
| """stringify message history for logging""" |
| return json.dumps(Tracker.messages, sort_keys=True) |
| |
| @staticmethod |
| def get_status(test_name=None): |
| """get the status of validation""" |
| if Tracker.valid_tests.get(test_name): |
| return "success" |
| if Tracker.validated_tests.get(test_name): |
| return "failed" |
| if test_name in Tracker.test_names: |
| return "covered" |
| return "unknown" |
| |
| @staticmethod |
| def log_all_tests(): |
| """log the covered and not covered test names""" |
| _LOGGER.info("-"*75) |
| _LOGGER.info("tracked test_names[%s]", len(Tracker.test_names)) |
| for idx, test_name in enumerate(Tracker.test_names): |
| _LOGGER.info("%s[%s]: %s", Tracker.get_status(test_name), (idx + 1), test_name) |
| |
| _LOGGER.info("not tracked test_names listed in main.mock_expected") |
| from .main.mock_expected import HISTORY_EXPECTED as main_history |
| for test_name in main_history: |
| if test_name not in Tracker.test_names: |
| _LOGGER.info("untracked: %s", test_name) |
| |
| _LOGGER.info("not tracked test_names listed in pdp_api_v0.mock_expected") |
| from .pdp_api_v0.mock_expected import HISTORY_EXPECTED as pdp_api_v0_history |
| for test_name in pdp_api_v0_history: |
| if test_name not in Tracker.test_names: |
| _LOGGER.info("untracked: %s", test_name) |
| |
| @staticmethod |
| def _hide_volatiles(obj): |
| """hides the volatile field values""" |
| if not isinstance(obj, dict): |
| return obj |
| |
| for key, value in obj.items(): |
| if key in [REQUEST_X_ECOMP_REQUESTID, RESPONSE, PEP_INSTANCE]: |
| obj[key] = "*" |
| elif isinstance(value, dict): |
| obj[key] = Tracker._hide_volatiles(value) |
| |
| return obj |
| |
| @staticmethod |
| def validate(): |
| """validate that the message history is as expected""" |
| _LOGGER.info("Tracker.validate(%s)", Tracker.test_name) |
| messages = [Tracker._hide_volatiles(copy.deepcopy(message)) |
| for message in Tracker.messages] |
| Tracker.validated_tests[Tracker.test_name] = True |
| |
| if Config.is_pdp_api_default(): |
| from .main.mock_expected import HISTORY_EXPECTED as main_history |
| expected = main_history.get(Tracker.test_name, []) |
| else: |
| from .pdp_api_v0.mock_expected import HISTORY_EXPECTED as pdp_api_v0_history |
| expected = pdp_api_v0_history.get(Tracker.test_name, []) |
| |
| _LOGGER.info("messages: %s", json.dumps(messages, sort_keys=True)) |
| _LOGGER.info("expected: %s", json.dumps(expected, sort_keys=True)) |
| assert Utils.are_the_same(messages, expected) |
| |
| _LOGGER.info("history valid for Tracker.validate(%s)", Tracker.test_name) |
| Tracker.valid_tests[Tracker.test_name] = True |