diff --git a/doc/testing/testplan/api_publish_service/service_api_description_patch_example.json b/doc/testing/testplan/api_publish_service/service_api_description_patch_example.json new file mode 100644 index 0000000000000000000000000000000000000000..482d06403f6274131eddf909af246573954e5dfc --- /dev/null +++ b/doc/testing/testplan/api_publish_service/service_api_description_patch_example.json @@ -0,0 +1,336 @@ +{ + "apiStatus": { + "aefIds": [ + "string" + ] + }, + "aefProfiles": [ + { + "aefId": "string", + "versions": [ + { + "apiVersion": "string", + "expiry": "2024-12-18T13:36:19.754Z", + "resources": [ + { + "resourceName": "string", + "commType": "REQUEST_RESPONSE", + "uri": "string", + "custOpName": "string", + "custOperations": [ + { + "commType": "REQUEST_RESPONSE", + "custOpName": "string", + "operations": [ + "GET", + "string" + ], + "description": "string" + } + ], + "operations": [ + "GET", + "string" + ], + "description": "string" + } + ], + "custOperations": [ + { + "commType": "REQUEST_RESPONSE", + "custOpName": "string", + "operations": [ + "GET", + "string" + ], + "description": "string" + } + ] + } + ], + "protocol": "HTTP_1_1", + "dataFormat": "JSON", + "securityMethods": [ + "PSK", + "string" + ], + "domainName": "string", + "interfaceDescriptions": [ + { + "ipv4Addr": "string", + "ipv6Addr": "string", + "fqdn": "string", + "port": 65535, + "apiPrefix": "string", + "securityMethods": [ + "PSK", + "string" + ] + }, + { + "ipv4Addr": "string", + "ipv6Addr": "string", + "fqdn": "string", + "port": 65535, + "apiPrefix": "string", + "securityMethods": [ + "PSK", + "string" + ] + }, + { + "ipv4Addr": "string", + "ipv6Addr": "string", + "fqdn": "string", + "port": 65535, + "apiPrefix": "string", + "securityMethods": [ + "PSK", + "string" + ] + } + ], + "aefLocation": { + "civicAddr": { + "country": "string", + "A1": "string", + "A2": "string", + "A3": "string", + "A4": "string", + "A5": "string", + "A6": "string", + "PRD": "string", + "POD": "string", + "STS": "string", + "HNO": "string", + "HNS": "string", + "LMK": "string", + "LOC": "string", + "NAM": "string", + "PC": "string", + "BLD": "string", + "UNIT": "string", + "FLR": "string", + "ROOM": "string", + "PLC": "string", + "PCN": "string", + "POBOX": "string", + "ADDCODE": "string", + "SEAT": "string", + "RD": "string", + "RDSEC": "string", + "RDBR": "string", + "RDSUBBR": "string", + "PRM": "string", + "POM": "string", + "usageRules": "string", + "method": "string", + "providedBy": "string" + }, + "geoArea": { + "shape": "POINT", + "point": { + "lon": 180, + "lat": 90 + } + }, + "dcId": "string" + }, + "serviceKpis": { + "maxReqRate": 0, + "maxRestime": 0, + "availability": 0, + "avalComp": "string", + "avalGraComp": "string", + "avalMem": "string", + "avalStor": "string", + "conBand": 0 + }, + "ueIpRange": { + "ueIpv4AddrRanges": [ + { + "start": "198.51.100.1", + "end": "198.51.100.1" + } + ], + "ueIpv6AddrRanges": [ + { + "start": "2001:db8:85a3::8a2e:370:7334", + "end": "2001:db8:85a3::8a2e:370:7334" + } + ] + } + }, + { + "aefId": "string", + "versions": [ + { + "apiVersion": "string", + "expiry": "2024-12-18T13:36:19.754Z", + "resources": [ + { + "resourceName": "string", + "commType": "REQUEST_RESPONSE", + "uri": "string", + "custOpName": "string", + "custOperations": [ + { + "commType": "REQUEST_RESPONSE", + "custOpName": "string", + "operations": [ + "GET", + "string" + ], + "description": "string" + } + ], + "operations": [ + "GET", + "string" + ], + "description": "string" + } + ], + "custOperations": [ + { + "commType": "REQUEST_RESPONSE", + "custOpName": "string", + "operations": [ + "GET", + "string" + ], + "description": "string" + } + ] + } + ], + "protocol": "HTTP_1_1", + "dataFormat": "JSON", + "securityMethods": [ + "PSK", + "string" + ], + "domainName": "string", + "interfaceDescriptions": [ + { + "ipv4Addr": "string", + "ipv6Addr": "string", + "fqdn": "string", + "port": 65535, + "apiPrefix": "string", + "securityMethods": [ + "PSK", + "string" + ] + }, + { + "ipv4Addr": "string", + "ipv6Addr": "string", + "fqdn": "string", + "port": 65535, + "apiPrefix": "string", + "securityMethods": [ + "PSK", + "string" + ] + }, + { + "ipv4Addr": "string", + "ipv6Addr": "string", + "fqdn": "string", + "port": 65535, + "apiPrefix": "string", + "securityMethods": [ + "PSK", + "string" + ] + } + ], + "aefLocation": { + "civicAddr": { + "country": "string", + "A1": "string", + "A2": "string", + "A3": "string", + "A4": "string", + "A5": "string", + "A6": "string", + "PRD": "string", + "POD": "string", + "STS": "string", + "HNO": "string", + "HNS": "string", + "LMK": "string", + "LOC": "string", + "NAM": "string", + "PC": "string", + "BLD": "string", + "UNIT": "string", + "FLR": "string", + "ROOM": "string", + "PLC": "string", + "PCN": "string", + "POBOX": "string", + "ADDCODE": "string", + "SEAT": "string", + "RD": "string", + "RDSEC": "string", + "RDBR": "string", + "RDSUBBR": "string", + "PRM": "string", + "POM": "string", + "usageRules": "string", + "method": "string", + "providedBy": "string" + }, + "geoArea": { + "shape": "POINT", + "point": { + "lon": 180, + "lat": 90 + } + }, + "dcId": "string" + }, + "serviceKpis": { + "maxReqRate": 0, + "maxRestime": 0, + "availability": 0, + "avalComp": "string", + "avalGraComp": "string", + "avalMem": "string", + "avalStor": "string", + "conBand": 0 + }, + "ueIpRange": { + "ueIpv4AddrRanges": [ + { + "start": "198.51.100.1", + "end": "198.51.100.1" + } + ], + "ueIpv6AddrRanges": [ + { + "start": "2001:db8:85a3::8a2e:370:7334", + "end": "2001:db8:85a3::8a2e:370:7334" + } + ] + } + } + ], + "description": "string", + "shareableInfo": { + "isShareable": true, + "capifProvDoms": [ + "string" + ] + }, + "serviceAPICategory": "string", + "apiSuppFeats": "string", + "pubApiPath": { + "ccfIds": [ + "string" + ] + }, + "ccfId": "string" +} \ No newline at end of file diff --git a/doc/testing/testplan/api_status/README.md b/doc/testing/testplan/api_status/README.md index 5ea2cd854e4067b04007dfe9f7f072dd3ead773c..42fe3261d5c59b9cfffd27ea2ad51fde0aa940e4 100644 --- a/doc/testing/testplan/api_status/README.md +++ b/doc/testing/testplan/api_status/README.md @@ -255,7 +255,290 @@ At this documentation you will have all information and related files and exampl 1. One should be **SERVICE_API_AVAILABLE** apiId of published API without **eventDetails**. 2. The other one must be **SERVICE_API_UNAVAILABLE** apiId of published API without **eventDetails**. - [service api description]: ../api_publish_service/service_api_description_post_example.json "Service API **Description** Request" + +## ------------------------------------- + + +## Test Case 12: Update published API without apiStatus and apiStatusMonitoring inactive + +**Test ID**: ***api_status-12*** + +**Description**: + + This test case will check if an invoker subscribed to events **SERVICE_API_AVAILABLE**, **SERVICE_API_UNAVAILABLE** and **SERVICE_API_UPDATE** with ***apiStatusMonitoring*** and **Enhanced_event_report** active, receive SERVICE_API_AVAILABLE in mockserver when api is published by a provider, containing eventDetails, and SERVICE_API_UPDATE after update apiStatus to not present. + +**Pre-Conditions**: + + * CAPIF subscriber is pre-authorised (has valid InvokerId or apfId from CAPIF Authority) + * CAPIF provider is correctly registered with 2 aefs. + * **Mock Server is up and running to receive requests.** + * **Mock Server is clean.** + +**Execution Steps**: + 1. Register Invoker and Onboard Invoker at CCF. + 2. Register Provider at CCF with 2 aefs. + 3. Subscribe to **SERVICE_API_AVAILABLE**, **SERVICE_API_UNAVAILABLE** and **SERVICE_API_UPDATE**. **apiStatusMonitoring** and **Enhanced_event_report** **active** at supported features (binary 1100-> string **C**) + 4. Publish Service API at CCF: + 1. Supported Features with apiStatusMonitoring flag active (binary 0 0010 0000 -> string **020**) + 2. This API includes "API Status" information at **service API Description** with only aefId1. + 5. Discover Service APIs by Invoker + 1. includes filter by query parameter **aef-id** + 6. Update Published API: + 1. apiStatus Not present + 2. aipStatusMonitoring feature not active (binary 0 0000 0000 -> string **0**) + +**Information of Test**: + + 1. Perform [Invoker Onboarding] + 2. Perform [Provider Registration] with 2 aefs + 3. Event Subscription to SERVICE_API_AVAILABLE and SERVICE_API_UNAVAILABLE of provider previously registered: + 1. Send **POST** to **https://{CAPIF_HOSTNAME}/capif-events/v1/{subscriberId}/subscriptions** + 2. body [event subscription request body] with: + 1. events: **['SERVICE_API_AVAILABLE','SERVICE_API_UNAVAILABLE']** + 2. supportedFeatures: binary 1100 -> string **C** + 3. Use **Invoker Certificate** + 4. Publish Service API at CCF: + * Send **POST** to ccf_publish_url **https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis** + * body [service api description] with **service_1** and **service_2** apiNames and realted with aefId1 and aefId2. + * supportedFeatures **020** + * 2 profiles, one with each aef. + * apiStatus with aefId1 inside array + * Use **APF Certificate** + 5. Request Discover Published APIs: + * Send **GET** to **https://{CAPIF_HOSTNAME}/service-apis/v1/allServiceAPIs?api-invoker-id={apiInvokerId}&aef-id=${aefId}** + * Param api-invoker-id is mandatory + * Use **Invoker Certificate** + 6. Update published Service API: + * Send **PUT** to resource URL **https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis/{SERVICE_API_ID}** + * Use **APF Certificate** + * body [service api description] with **service_1** and **service_2** apiNames and realted with aefId1 and aefId2. + * supportedFeatures **0** + * 2 profiles, one with each aef. + * apiStatus not present. + +**Expected Result**: + + 1. Response to Onboard request must accomplish: + 1. **201 Created** + 2. Response Body must follow **APIInvokerEnrolmentDetails** data structure with: + * apiInvokerId + * onboardingInformation->apiInvokerCertificate must contain the public key signed. + 3. Response Header **Location** must be received with URI to new resource created, following this structure: **{apiRoot}/api-invoker-management/{apiVersion}/onboardedInvokers/{onboardingId}** + 2. Response to Event Subscription must accomplish: + 1. **201 Created** + 2. The URI of the created resource shall be returned in the "Location" HTTP header, following this structure: **{apiRoot}/capif-events/{apiVersion}/{subscriberId}/subscriptions/{subscriptionId}** + 3. Response Body must follow **EventSubscription** data structure. + 3. Response to Publish request must accomplish: + 1. **201 Created** + 2. Response Body must follow **ServiceAPIDescription** data structure with: + * apiId + * 2 profiles with: + * resourceName resource_1 and aefId1 + * resourceName resource_2 and aefId2 + 3. Response Header **Location** must be received with URI to new resource created, following this structure: **{apiRoot}/published-apis/v1/{apfId}/service-apis/{serviceApiId}** + 4. Response without **"apiStatus"** parameter. + 4. Response to Discover Request By Invoker: + 1. **200 OK** response. + 2. Response body must follow **DiscoveredAPIs** data structure: + * Check if DiscoveredAPIs contains the API Published previously + * Check if contains the **apiStatus** with aefId1 + 5. Response to Update published Service API at CCF: + 1. **200 OK** + 2. Store response with updated serviceAPIDescription. + 6. Mock Server received messages must accomplish: + 1. **Two Events have been received**. + 2. Validate received events follow **EventNotification** data structure, with **apiIds** in **eventDetail** parameter. + 1. One should be **SERVICE_API_AVAILABLE** apiId of published API with **eventDetails** with apiIds and serviceAPIDescription. + 2. The other one must be **SERVICE_API_UPDATE** apiId published API with **eventDetails** containing serviceAPIDescription updated. + +## Test Case 13: Update published API with apiStatus empty and apiStatusMonitoring inactive + +**Test ID**: ***api_status-13*** + +**Description**: + + This test case will check if an invoker subscribed to events **SERVICE_API_AVAILABLE**, **SERVICE_API_UNAVAILABLE** and **SERVICE_API_UPDATE** with ***apiStatusMonitoring*** and **Enhanced_event_report** active, receive SERVICE_API_AVAILABLE in mockserver when api is published by a provider, containing eventDetails, and SERVICE_API_UPDATE after update apiStatus to empty aefIds array qith **ApiStatusMonitoring inactive. + +**Pre-Conditions**: + + * CAPIF subscriber is pre-authorised (has valid InvokerId or apfId from CAPIF Authority) + * CAPIF provider is correctly registered with 2 aefs. + * **Mock Server is up and running to receive requests.** + * **Mock Server is clean.** + +**Execution Steps**: + 1. Register Invoker and Onboard Invoker at CCF. + 2. Register Provider at CCF with 2 aefs. + 3. Subscribe to **SERVICE_API_AVAILABLE**, **SERVICE_API_UNAVAILABLE** and **SERVICE_API_UPDATE**. **apiStatusMonitoring** and **Enhanced_event_report** **active** at supported features (binary 1100-> string **C**) + 4. Publish Service API at CCF: + 1. Supported Features with apiStatusMonitoring flag active (binary 0 0010 0000 -> string **020**) + 2. This API includes "API Status" information at **service API Description** with only aefId1. + 5. Discover Service APIs by Invoker + 1. includes filter by query parameter **aef-id** + 6. Update Published API: + 1. apiStatus present with empty aefIds array. + 2. aipStatusMonitoring feature not active (binary 0 0000 0000 -> string **0**) + +**Information of Test**: + + 1. Perform [Invoker Onboarding] + 2. Perform [Provider Registration] with 2 aefs + 3. Event Subscription to SERVICE_API_AVAILABLE and SERVICE_API_UNAVAILABLE of provider previously registered: + 1. Send **POST** to **https://{CAPIF_HOSTNAME}/capif-events/v1/{subscriberId}/subscriptions** + 2. body [event subscription request body] with: + 1. events: **['SERVICE_API_AVAILABLE','SERVICE_API_UNAVAILABLE']** + 2. supportedFeatures: binary 1100 -> string **C** + 3. Use **Invoker Certificate** + 4. Publish Service API at CCF: + * Send **POST** to ccf_publish_url **https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis** + * body [service api description] with **service_1** and **service_2** apiNames and realted with aefId1 and aefId2. + * supportedFeatures **020** + * 2 profiles, one with each aef. + * apiStatus with aefId1 inside array + * Use **APF Certificate** + 5. Request Discover Published APIs: + * Send **GET** to **https://{CAPIF_HOSTNAME}/service-apis/v1/allServiceAPIs?api-invoker-id={apiInvokerId}&aef-id=${aefId}** + * Param api-invoker-id is mandatory + * Use **Invoker Certificate** + 6. Update published Service API: + * Send **PUT** to resource URL **https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis/{SERVICE_API_ID}** + * Use **APF Certificate** + * body [service api description] with **service_1** and **service_2** apiNames and realted with aefId1 and aefId2. + * supportedFeatures **0** + * 2 profiles, one with each aef. + * apiStatus not present. + +**Expected Result**: + + 1. Response to Onboard request must accomplish: + 1. **201 Created** + 2. Response Body must follow **APIInvokerEnrolmentDetails** data structure with: + * apiInvokerId + * onboardingInformation->apiInvokerCertificate must contain the public key signed. + 3. Response Header **Location** must be received with URI to new resource created, following this structure: **{apiRoot}/api-invoker-management/{apiVersion}/onboardedInvokers/{onboardingId}** + 2. Response to Event Subscription must accomplish: + 1. **201 Created** + 2. The URI of the created resource shall be returned in the "Location" HTTP header, following this structure: **{apiRoot}/capif-events/{apiVersion}/{subscriberId}/subscriptions/{subscriptionId}** + 3. Response Body must follow **EventSubscription** data structure. + 3. Response to Publish request must accomplish: + 1. **201 Created** + 2. Response Body must follow **ServiceAPIDescription** data structure with: + * apiId + * 2 profiles with: + * resourceName resource_1 and aefId1 + * resourceName resource_2 and aefId2 + 3. Response Header **Location** must be received with URI to new resource created, following this structure: **{apiRoot}/published-apis/v1/{apfId}/service-apis/{serviceApiId}** + 4. Response without **"apiStatus"** parameter. + 4. Response to Discover Request By Invoker: + 1. **200 OK** response. + 2. Response body must follow **DiscoveredAPIs** data structure: + * Check if DiscoveredAPIs contains the API Published previously + * Check if contains the **apiStatus** with aefId1 + 5. Response to Update published Service API at CCF: + 1. **200 OK** + 2. Store response with updated serviceAPIDescription. + 6. Mock Server received messages must accomplish: + 1. **Two Events have been received**. + 2. Validate received events follow **EventNotification** data structure, with **apiIds** in **eventDetail** parameter. + 1. One should be **SERVICE_API_AVAILABLE** apiId of published API with **eventDetails** with apiIds and serviceAPIDescription. + 2. The other one must be **SERVICE_API_UPDATE** apiId published API with **eventDetails** containing serviceAPIDescription updated. + + +## -------------------- + +## Test Case 17: Patch published (apiStatusMonitoring active) API with apiStatus only aefId2 + +**Test ID**: ***api_status-17*** + +**Description**: + + This test case will check if an invoker subscribed to events **SERVICE_API_AVAILABLE**, **SERVICE_API_UNAVAILABLE** and **SERVICE_API_UPDATE** with ***apiStatusMonitoring*** and **Enhanced_event_report** active, receive SERVICE_API_AVAILABLE in mockserver when api is published by a provider (with apiStatusMonitoring active), containing eventDetails, and SERVICE_API_UPDATE after patch with apfId2 in apiStatus array. + +**Pre-Conditions**: + + * CAPIF subscriber is pre-authorised (has valid InvokerId or apfId from CAPIF Authority) + * CAPIF provider is correctly registered with 2 aefs. + * **Mock Server is up and running to receive requests.** + * **Mock Server is clean.** + +**Execution Steps**: + 1. Register Invoker and Onboard Invoker at CCF. + 2. Register Provider at CCF with 2 aefs. + 3. Subscribe to **SERVICE_API_AVAILABLE**, **SERVICE_API_UNAVAILABLE** and **SERVICE_API_UPDATE**. **apiStatusMonitoring** and **Enhanced_event_report** **active** at supported features (binary 1100-> string **C**) + 4. Publish Service API at CCF: + 1. Supported Features with apiStatusMonitoring flag active (binary 0 0010 0000 -> string **020**) + 2. This API includes "API Status" information at **service API Description** with only aefId1. + 5. Discover Service APIs by Invoker + 1. includes filter by query parameter **aef-id** + 6. Patch Published API: + 1. apiStatus present with aefId2 in array. + +**Information of Test**: + + 1. Perform [Invoker Onboarding] + 2. Perform [Provider Registration] with 2 aefs + 3. Event Subscription to SERVICE_API_AVAILABLE and SERVICE_API_UNAVAILABLE of provider previously registered: + 1. Send **POST** to **https://{CAPIF_HOSTNAME}/capif-events/v1/{subscriberId}/subscriptions** + 2. body [event subscription request body] with: + 1. events: **['SERVICE_API_AVAILABLE','SERVICE_API_UNAVAILABLE']** + 2. supportedFeatures: binary 1100 -> string **C** + 3. Use **Invoker Certificate** + 4. Publish Service API at CCF: + * Send **POST** to ccf_publish_url **https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis** + * body [service api description] with **service_1** and **service_2** apiNames and realted with aefId1 and aefId2. + * supportedFeatures **020** + * 2 profiles, one with each aef. + * apiStatus with aefId1 inside array + * Use **APF Certificate** + 5. Request Discover Published APIs: + * Send **GET** to **https://{CAPIF_HOSTNAME}/service-apis/v1/allServiceAPIs?api-invoker-id={apiInvokerId}&aef-id=${aefId}** + * Param api-invoker-id is mandatory + * Use **Invoker Certificate** + 6. Update published Service API: + * Send **PATCH** to resource URL **https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis/{SERVICE_API_ID}** + * Use **APF Certificate** + * body [service api description patch] and realted with aefId1 and aefId2. + * apiStatus present with aefId2. + +**Expected Result**: + + 1. Response to Onboard request must accomplish: + 1. **201 Created** + 2. Response Body must follow **APIInvokerEnrolmentDetails** data structure with: + * apiInvokerId + * onboardingInformation->apiInvokerCertificate must contain the public key signed. + 3. Response Header **Location** must be received with URI to new resource created, following this structure: **{apiRoot}/api-invoker-management/{apiVersion}/onboardedInvokers/{onboardingId}** + 2. Response to Event Subscription must accomplish: + 1. **201 Created** + 2. The URI of the created resource shall be returned in the "Location" HTTP header, following this structure: **{apiRoot}/capif-events/{apiVersion}/{subscriberId}/subscriptions/{subscriptionId}** + 3. Response Body must follow **EventSubscription** data structure. + 3. Response to Publish request must accomplish: + 1. **201 Created** + 2. Response Body must follow **ServiceAPIDescription** data structure with: + * apiId + * 2 profiles with: + * resourceName resource_1 and aefId1 + * resourceName resource_2 and aefId2 + 3. Response Header **Location** must be received with URI to new resource created, following this structure: **{apiRoot}/published-apis/v1/{apfId}/service-apis/{serviceApiId}** + 4. Response without **"apiStatus"** parameter. + 4. Response to Discover Request By Invoker: + 1. **200 OK** response. + 2. Response body must follow **DiscoveredAPIs** data structure: + * Check if DiscoveredAPIs contains the API Published previously + * Check if contains the **apiStatus** with aefId1 + 5. Response to Patch published Service API at CCF: + 1. **200 OK** + 2. Store response with updated serviceAPIDescription. + 6. Mock Server received messages must accomplish: + 1. **Two Events have been received**. + 2. Validate received events follow **EventNotification** data structure, with **apiIds** in **eventDetail** parameter. + 1. One should be **SERVICE_API_AVAILABLE** apiId of published API with **eventDetails** with apiIds and serviceAPIDescription. + 2. The other one must be **SERVICE_API_UPDATE** apiId published API with **eventDetails** containing serviceAPIDescription patched. + + + + [service api description]: ../api_publish_service/service_api_description_post_example.json "Service API Description Request" + [service api description patch]: ../api_publish_service/service_api_description_patch_example.json "Service API Description Patch Request" [publisher register body]: ../api_publish_service/publisher_register_body.json "Publish register Body" [invoker onboarding body]: ../api_invoker_management/invoker_details_post_example.json "API Invoker Request" [provider request body]: ../api_provider_management/provider_details_post_example.json "API Provider Enrolment Request"