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 e0798b0e50 Added Api contract test case for delivery services sslkeys 
generate endpoint (#7651)
e0798b0e50 is described below

commit e0798b0e50cc462b61c48d9cbd53dc43354e23ca
Author: Gokula Krishnan <[email protected]>
AuthorDate: Wed Jul 19 00:23:29 2023 +0530

    Added Api contract test case for delivery services sslkeys generate 
endpoint (#7651)
    
    * Added Api contract test case for delivery_service_sslkeys endpoint
    
    * Added Api contract test for delivery_services_sslkeys_generate endpoint
    
    * Added traffic vault to GHA
    
    * Update conftest.py
    
    * Update response_template.json
---
 .github/workflows/to.api.contract.tests.yml        |  3 +
 traffic_ops/testing/api_contract/v4/conftest.py    | 30 +++++++++
 .../api_contract/v4/data/request_template.json     | 13 ++++
 .../api_contract/v4/data/response_template.json    | 67 +++++++++++++++++++
 .../v4/test_delivery_services_sslkeys.py           | 76 ++++++++++++++++++++++
 5 files changed, 189 insertions(+)

diff --git a/.github/workflows/to.api.contract.tests.yml 
b/.github/workflows/to.api.contract.tests.yml
index ae60e60a72..a709289967 100644
--- a/.github/workflows/to.api.contract.tests.yml
+++ b/.github/workflows/to.api.contract.tests.yml
@@ -75,6 +75,9 @@ jobs:
     - name: Initialize Traffic Ops Database
       id: todb
       uses: ./.github/actions/todb-init
+    - name: Initialize Traffic Vault Database
+      id: tvdb
+      uses: ./.github/actions/tvdb-init
     - name: Check Go Version
       run: echo "::set-output name=value::$(cat GO_VERSION)"
       id: go-version
diff --git a/traffic_ops/testing/api_contract/v4/conftest.py 
b/traffic_ops/testing/api_contract/v4/conftest.py
index a214a32804..74849b5ff1 100644
--- a/traffic_ops/testing/api_contract/v4/conftest.py
+++ b/traffic_ops/testing/api_contract/v4/conftest.py
@@ -1578,6 +1578,36 @@ def steering_data_post(to_session: TOSession, 
request_template_data: list[JSONDa
                pytest.fail("Response from delete request is empty, Failing 
test_case")
 
 
[email protected](name="delivery_service_sslkeys_post_data")
+def delivery_service_sslkeys_data_post(to_session: TOSession, 
request_template_data: list[JSONData],
+               cdn_post_data:dict[str, object], 
delivery_services_post_data:dict[str, object]
+               ) -> dict[str, object]:
+       """
+       PyTest Fixture to create POST data for 
delivery_service_sslkeys_post_data endpoint.
+       :param to_session: Fixture to get Traffic Ops session.
+       :param request_template_data: Fixture to get delivery_service_sslkeys 
request template.
+       :returns: Sample POST data and the actual API response.
+       """
+
+       delivery_service_sslkeys = check_template_data(
+               request_template_data["delivery_service_sslkeys"], 
"delivery_service_sslkeys")
+
+       # Return new post data and post response from delivery_service_sslkeys 
POST request
+       delivery_service_sslkeys["key"] = delivery_services_post_data["xmlId"]
+       delivery_service_sslkeys["cdn"] = cdn_post_data["name"]
+       logger.info("New delivery_service_sslkeys data to hit POST method %s", 
delivery_service_sslkeys)
+       # Hitting delivery_service_sslkeys POST methed
+       response: tuple[JSONData, requests.Response] = 
to_session.generate_deliveryservice_ssl_keys(
+               data=delivery_service_sslkeys)
+       yield delivery_service_sslkeys
+       deliveryservice_xml_id = delivery_service_sslkeys["key"]
+       msg = 
to_session.delete_deliveryservice_ssl_keys_by_xml_id(xml_id=deliveryservice_xml_id)
+       logger.info("Deleting delivery_service_sslkeys data... %s", msg)
+       if msg is None:
+               logger.error("delivery_service_sslkeys returned by Traffic Ops 
is missing an 'xmlId' property")
+               pytest.fail("Response from delete request is empty, Failing 
test_case")
+
+
 @pytest.fixture(name="delivery_services_regex_post_data")
 def delivery_services_regex_data_post(to_session: TOSession, 
request_template_data: list[JSONData],
                  delivery_services_post_data:dict[str, object]) -> dict[str, 
object]:
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 988c13ef4a..3ad04676bc 100644
--- a/traffic_ops/testing/api_contract/v4/data/request_template.json
+++ b/traffic_ops/testing/api_contract/v4/data/request_template.json
@@ -376,6 +376,19 @@
                        }
                }
        ],
+       "delivery_service_sslkeys": [
+               {
+                       "key": "demo1",
+                       "businessUnit": "CDN Engineering",
+                       "version": 3,
+                       "cdn": "CDN-in-a-Box",
+                       "hostname": "tr.ds-01.ott.kabletown.com",
+                       "country": "US",
+                       "organization": "Kabletown",
+                       "city": "Denver",
+                       "state": "Colorado"
+    }
+  ],
        "delivery_services_regex": [
                {
                        "pattern": ".*\\.foo-bar\\..*",
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 ee7939abf2..84f1fca2a6 100644
--- a/traffic_ops/testing/api_contract/v4/data/response_template.json
+++ b/traffic_ops/testing/api_contract/v4/data/response_template.json
@@ -1589,6 +1589,73 @@
             }
         }
     },
+    "delivery_service_sslkeys": {
+        "type": "object",
+        "required": [
+            "certificate",
+            "deliveryservice",
+            "cdn",
+            "businessUnit",
+            "city",
+            "organization",
+            "hostname",
+            "country",
+            "state",
+            "version",
+            "expiration"
+        ],
+        "properties": {
+            "certificate": {
+                "type": "object",
+                "required": [
+                    "crt",
+                    "key",
+                    "csr"
+                ],
+                "properties": {
+                    "crt": {
+                        "type": "string"
+                    },
+                    "key": {
+                        "type": "string"
+                    },
+                    "csr": {
+                        "type": "string"
+                    }
+                }
+            },
+            "deliveryservice": {
+                "type": "string"
+            },
+            "cdn": {
+                "type": "string"
+            },
+            "businessUnit": {
+                "type": "string"
+            },
+            "city": {
+                "type": "string"
+            },
+            "organization": {
+                "type": "string"
+            },
+            "hostname": {
+                "type": "string"
+            },
+            "country": {
+                "type": "string"
+            },
+            "state": {
+                "type": "string"
+            },
+            "version": {
+                "type": "integer"
+            },
+            "expiration": {
+                "type": "string"
+            }
+        }
+    },
     "delivery_services_regex": {
         "type": "object",
         "required": [
diff --git 
a/traffic_ops/testing/api_contract/v4/test_delivery_services_sslkeys.py 
b/traffic_ops/testing/api_contract/v4/test_delivery_services_sslkeys.py
new file mode 100644
index 0000000000..f0744f4f27
--- /dev/null
+++ b/traffic_ops/testing/api_contract/v4/test_delivery_services_sslkeys.py
@@ -0,0 +1,76 @@
+#
+# 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_sslkeys_generate 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_sslkeys_contract(to_session: TOSession,
+       response_template_data: dict[str, Union[Primitive, list[Union[Primitive,
+                                                       dict[str, object], 
list[object]]], dict[object, object]]],
+       delivery_service_sslkeys_post_data: dict[str, object]
+) -> None:
+       """
+       Test step to validate keys, values and data types from 
delivery_service_sslkeys 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_sslkeys_post_data: Fixture to get delivery 
services sslkeys data.
+       """
+       # validate delivery_service_sslkeys keys from api get response
+       logger.info("Accessing /delivery_service_sslkeys endpoint through 
Traffic ops session.")
+
+       delivery_service_sslkeys_xml_id = 
delivery_service_sslkeys_post_data["key"]
+       if not isinstance(delivery_service_sslkeys_xml_id, str):
+               raise TypeError("malformed API response; 'xmlId' property not a 
string")
+
+       delivery_service_sslkeys_get_response: tuple[
+               Union[dict[str, object], list[Union[dict[str, object], 
list[object], Primitive]], Primitive],
+               requests.Response
+       ] = 
to_session.get_deliveryservice_ssl_keys_by_xml_id(xml_id=delivery_service_sslkeys_xml_id)
+       try:
+               first_delivery_service_sslkeys = 
delivery_service_sslkeys_get_response[0]
+               if not isinstance(first_delivery_service_sslkeys, dict):
+                       raise TypeError(
+                               "malformed API response; first 
delivery_service_sslkeys in response is not an dict")
+               logger.info("delivery_service_sslkeys Api get response %s", 
first_delivery_service_sslkeys)
+
+               delivery_service_sslkeys_response_template = 
response_template_data.get(
+                       "delivery_service_sslkeys")
+               if not isinstance(delivery_service_sslkeys_response_template, 
dict):
+                       raise TypeError(f"delivery_service_sslkeys response 
template data must be a dict, not '"
+                                                       
f"{type(delivery_service_sslkeys_response_template)}'")
+
+               keys = ["key", "version"]
+               prereq_values = [delivery_service_sslkeys_post_data[key] for 
key in keys]
+               get_values = [first_delivery_service_sslkeys[key] for key in 
keys]
+
+               assert validate(instance=first_delivery_service_sslkeys,
+                 schema=delivery_service_sslkeys_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_sslkeys 
endpoint: API response was malformed")

Reply via email to