This is an automated email from the ASF dual-hosted git repository.

ericholguin pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/trafficcontrol.git


The following commit(s) were added to refs/heads/master by this push:
     new e3240c30c4 Added API contract test case for 
delivery_service_request_comments en… (#7666)
e3240c30c4 is described below

commit e3240c30c404a0966c475e9a4cdfa484405bfff6
Author: Gokula Krishnan <[email protected]>
AuthorDate: Thu Jul 27 21:43:37 2023 +0530

    Added API contract test case for delivery_service_request_comments en… 
(#7666)
    
    * Added API contract test case for delivery_service_request_comments 
endpoint
    
    * Update test_delivery_service_request_comments.py
    
    * Update conftest.py
    
    * updated conftest
---
 .../clients/python/trafficops/tosession.py         | 44 ++++++++++++
 traffic_ops/testing/api_contract/v4/conftest.py    | 33 +++++++++
 .../api_contract/v4/data/request_template.json     | 10 ++-
 .../api_contract/v4/data/response_template.json    | 35 +++++++++
 .../v4/test_delivery_service_request_comments.py   | 82 ++++++++++++++++++++++
 5 files changed, 202 insertions(+), 2 deletions(-)

diff --git a/traffic_control/clients/python/trafficops/tosession.py 
b/traffic_control/clients/python/trafficops/tosession.py
index 083b6480ae..7707967c88 100644
--- a/traffic_control/clients/python/trafficops/tosession.py
+++ b/traffic_control/clients/python/trafficops/tosession.py
@@ -818,6 +818,50 @@ class TOSession(RestApiSession):
                :rtype: Tuple[Dict[str, Any], requests.Response]
                :raises: Union[LoginError, OperationError]
                """
+       
+
+       #
+       # Delivery Service Request Comments
+       #
+       @api_request('get', 'deliveryservice_request_comments', ('3.0', '4.0', 
'4.1', '5.0'))
+       def get_deliveryservice_request_comments(self, query_params=None):
+               """
+               Retrieves all delivery service reuest comments.
+               :ref:`to-api-deliveryservice-request-comments`
+               :rtype: Tuple[Union[Dict[str, Any], List[Dict[str, Any]]], 
requests.Response]
+               :raises: Union[LoginError, OperationError]
+               """
+
+       @api_request('post', 'deliveryservice_request_comments', ('3.0', '4.0', 
'4.1', '5.0'))
+       def create_deliveryservice_request_comment(self, data=None):
+               """
+               Creates a new delivery service request comment.
+               :ref:`to-api-deliveryservice-request-comments`
+               :param data: The request data structure for the API request
+               :type data: Dict[str, Any]
+               :rtype: Tuple[Dict[str, Any], requests.Response]
+               :raises: Union[LoginError, OperationError]
+               """
+
+       @api_request('put', 'deliveryservice_request_comments', ('3.0', '4.0', 
'4.1', '5.0'))
+       def update_deliveryservice_request_comment(self, query_params=None, 
data=None):
+               """
+               Updates an existing Delivery Service Request comment.
+               :ref:`to-api-deliveryservice-request-comments`
+               :param data: The request data structure for the API request
+               :type data: Dict[str, Any]
+               :rtype: Tuple[Union[Dict[str, Any], List[Dict[str, Any]]], 
requests.Response]
+               :raises: Union[LoginError, OperationError]
+               """
+
+       @api_request('delete', 'deliveryservice_request_comments', ('3.0', 
'4.0', '4.1', '5.0'))
+       def delete_deliveryservice_request_comment(self, query_params=None):
+               """
+               Deletes a Delivery Service Request comment.
+               :ref:`to-api-deliveryservice-request-comments`
+               :rtype: Tuple[Dict[str, Any], requests.Response]
+               :raises: Union[LoginError, OperationError]
+               """
 
        #
        # Delivery Service Health
diff --git a/traffic_ops/testing/api_contract/v4/conftest.py 
b/traffic_ops/testing/api_contract/v4/conftest.py
index 9a073dd5aa..ef80b89bd0 100644
--- a/traffic_ops/testing/api_contract/v4/conftest.py
+++ b/traffic_ops/testing/api_contract/v4/conftest.py
@@ -1644,6 +1644,39 @@ def delivery_services_regex_data_post(to_session: 
TOSession, request_template_da
                logger.error("delivery_services_regex returned by Traffic Ops 
is missing an 'id' property")
                pytest.fail("Response from delete request is empty, Failing 
test_case")
 
+
[email protected](name="delivery_service_request_comments_post_data")
+def delivery_service_request_comments_data_post(to_session: TOSession,
+               request_template_data: list[JSONData],
+               deliveryservice_request_post_data:dict[str, object]) -> 
dict[str, object]:
+       """
+       PyTest Fixture to create POST data for 
delivery_service_request_comments endpoint.
+       :param to_session: Fixture to get Traffic Ops session.
+       :param request_template_data: Fixture to get 
delivery_service_request_comments request template.
+       :returns: Sample POST data and the actual API response.
+       """
+
+       delivery_service_request_comments = check_template_data(
+               request_template_data["delivery_service_request_comments"], 
"delivery_service_request_comments")
+
+       # Return new post data and post response from 
delivery_service_request_comments POST request
+       delivery_service_request_id = deliveryservice_request_post_data["id"]
+       delivery_service_request_comments["deliveryServiceRequestId"]= 
delivery_service_request_id
+
+       logger.info("New delivery_service_request_comments data to hit POST 
method %s",
+            delivery_service_request_comments)
+       # Hitting delivery_service_request_comments POST methed
+       response: tuple[JSONData, requests.Response] = 
to_session.create_deliveryservice_request_comment(
+               data=delivery_service_request_comments)
+       resp_obj = check_template_data(response, 
"delivery_service_request_comments")
+       yield resp_obj
+       request_comment_id = resp_obj.get("id")
+       msg = 
to_session.delete_deliveryservice_request_comment(query_params={"id":request_comment_id})
+       logger.info("Deleting delivery_service_request_comments data... %s", 
msg)
+       if msg is None:
+               logger.error("delivery_service_request_comments returned by 
Traffic Ops is missing an 'id' property")
+               pytest.fail("Response from delete request is empty, Failing 
test_case")
+
   
 @pytest.fixture(name="profile_parameters_post_data")
 def profile_parameters_post_data(to_session: TOSession, request_template_data: 
list[JSONData],
diff --git a/traffic_ops/testing/api_contract/v4/data/request_template.json 
b/traffic_ops/testing/api_contract/v4/data/request_template.json
index 98c054a361..078fea5a24 100644
--- a/traffic_ops/testing/api_contract/v4/data/request_template.json
+++ b/traffic_ops/testing/api_contract/v4/data/request_template.json
@@ -387,8 +387,8 @@
                        "organization": "Kabletown",
                        "city": "Denver",
                        "state": "Colorado"
-    }
-  ],
+               }
+       ],
        "delivery_services_regex": [
                {
                        "pattern": ".*\\.foo-bar\\..*",
@@ -396,6 +396,12 @@
                        "setNumber": 1
                }
        ],
+       "delivery_service_request_comments": [
+               {
+                       "deliveryServiceRequestId": 2,
+                       "value": "Does anyone have time to review my delivery 
service request?"
+     }
+       ],
        "profile_parameters": [
                {
                        "profileId": 18,
diff --git a/traffic_ops/testing/api_contract/v4/data/response_template.json 
b/traffic_ops/testing/api_contract/v4/data/response_template.json
index e66a309537..e04ae17af4 100644
--- a/traffic_ops/testing/api_contract/v4/data/response_template.json
+++ b/traffic_ops/testing/api_contract/v4/data/response_template.json
@@ -1703,5 +1703,40 @@
                 "type": "integer"
             }
         }
+    },
+    "delivery_service_request_comments": {
+        "type": "object",
+        "required": [
+            "authorId",
+            "author",
+            "deliveryServiceRequestId",
+            "id",
+            "lastUpdated",
+            "value",
+            "xmlId"
+        ],
+        "properties": {
+            "authorId": {
+                "type": "integer"
+            },
+            "author": {
+                "type": "string"
+            },
+            "deliveryServiceRequestId": {
+                "type": "integer"
+            },
+            "id": {
+                "type": "integer"
+            },
+            "lastUpdated": {
+                "type": "string"
+            },
+            "value": {
+                "type": "string"
+            },
+            "xmlId": {
+                "type": "string"
+            }
+        }
     }
 }
diff --git 
a/traffic_ops/testing/api_contract/v4/test_delivery_service_request_comments.py 
b/traffic_ops/testing/api_contract/v4/test_delivery_service_request_comments.py
new file mode 100644
index 0000000000..191ac55ae6
--- /dev/null
+++ 
b/traffic_ops/testing/api_contract/v4/test_delivery_service_request_comments.py
@@ -0,0 +1,82 @@
+#
+# 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.
+#
+
+"""API Contract Test Case for delivery_service_request_comments endpoint."""
+import logging
+from typing import Union
+import pytest
+import requests
+from jsonschema import validate
+
+from trafficops.tosession import TOSession
+
+# Create and configure logger
+logger = logging.getLogger()
+
+Primitive = Union[bool, int, float, str, None]
+
+
+def test_delivery_service_request_comments_contract(to_session: TOSession,
+       response_template_data: dict[str, Union[Primitive, list[Union[Primitive,
+                                                       dict[str, object], 
list[object]]], dict[object, object]]],
+       delivery_service_request_comments_post_data: dict[str, object]
+) -> None:
+       """
+       Test step to validate keys, values and data types from 
delivery_service_request_comments endpoint
+       response.
+       :param to_session: Fixture to get Traffic Ops session.
+       :param response_template_data: Fixture to get response template data 
from a prerequisites file.
+       :param delivery_service_request_comments_post_data: Fixture to get 
sample data and response.
+       """
+       # validate delivery_service_request_comments keys from api get response
+       logger.info("Accessing /delivery_service_request_comments endpoint 
through Traffic ops session.")
+
+       delivery_service_request_comments_id = 
delivery_service_request_comments_post_data["id"]
+       if not isinstance(delivery_service_request_comments_id, int):
+               raise TypeError("malformed API response; 'id' property not a 
integer")
+
+       delivery_service_request_comments_get_response: tuple[
+               Union[dict[str, object], list[Union[dict[str, object], 
list[object], Primitive]], Primitive],
+               requests.Response
+       ] = to_session.get_deliveryservice_request_comments(
+               query_params={"id": delivery_service_request_comments_id})
+       try:
+               delivery_service_request_comments_data = 
delivery_service_request_comments_get_response[0]
+               if not isinstance(delivery_service_request_comments_data, list):
+                       raise TypeError("malformed API response; 'response' 
property not an array")
+
+               first_delivery_service_request_comments = 
delivery_service_request_comments_data[0]
+               if not isinstance(first_delivery_service_request_comments, 
dict):
+                       raise TypeError(
+                               "malformed API response; first 
delivery_service_request_comments in response is not an dict")
+               logger.info(
+                       "delivery_service_request_comments Api response %s", 
first_delivery_service_request_comments)
+
+               delivery_service_request_comments_response_template = 
response_template_data.get(
+                       "delivery_service_request_comments")
+               if not 
isinstance(delivery_service_request_comments_response_template, dict):
+                       raise TypeError(f"delivery_service_request_comments 
response template data must be a dict, not '"
+                                                       
f"{type(delivery_service_request_comments_response_template)}'")
+
+               keys = ["deliveryServiceRequestId", "value"]
+               prereq_values = 
[delivery_service_request_comments_post_data[key] for key in keys]
+               get_values = [first_delivery_service_request_comments[key] for 
key in keys]
+
+               assert 
validate(instance=first_delivery_service_request_comments,
+                 schema=delivery_service_request_comments_response_template) 
is None
+               assert get_values == prereq_values
+       except IndexError:
+               logger.error("Either prerequisite data or API response was 
malformed")
+               pytest.fail("API contract test failed for 
delivery_service_request_comments endpoint:"
+               "API response was malformed")

Reply via email to