diff --git a/code/API_definitions/webrtc-call-handling.yaml b/code/API_definitions/webrtc-call-handling.yaml index 5ff01ab..873fa2f 100644 --- a/code/API_definitions/webrtc-call-handling.yaml +++ b/code/API_definitions/webrtc-call-handling.yaml @@ -390,9 +390,9 @@ paths: Update ringing (status update without SDP): $ref: '#/components/examples/exampleStatusChangeRinging' Answer with location (callee accepts and shares location): - $ref: '#/components/examples/exampleSessionStatusConnectedWithLocation' + $ref: '#/components/examples/exampleStatusChangeConnectedWithLocation' Location update (post-setup location sharing): - $ref: '#/components/examples/exampleSessionStatusLocationUpdate' + $ref: '#/components/examples/exampleStatusChangeLocationUpdate' responses: '200': description: | @@ -475,7 +475,7 @@ components: maxLength: 256 example: "b4333c46-49c0-4f62-80d7-f0ef930f1c46" MediaSessionInformation: - description: Information about a WebRTC media session including originator and receiver identities, SDP offer/answer, and call status + description: Information about a WebRTC media session including originator and receiver identities, SDP offer, call type and location type: object properties: originatorAddress: @@ -492,12 +492,8 @@ components: maxLength: 256 description: Friendly name of the call terminator example: 'Bob' - status: - $ref: '#/components/schemas/SessionStatus' offer: $ref: '#/components/schemas/WrtcSdpDescriptor' - answer: - $ref: '#/components/schemas/WrtcSdpDescriptor' callType: type: string description: Type of call. When set to EMERGENCY, the client MAY provide locationDetails. If omitted, treated as REGULAR. @@ -534,6 +530,10 @@ components: - $ref: '#/components/schemas/MediaSessionInformation' - type: object properties: + status: + $ref: '#/components/schemas/SessionStatus' + answer: + $ref: '#/components/schemas/WrtcSdpDescriptor' mediaSessionId: type: string maxLength: 256 @@ -563,9 +563,7 @@ components: **ANSWER**: This type represents an answer in WebRTC Signaling. This element is not present in case there is no answer yet, or the session invitation has - been declined by the Terminating Participant.This element MUST NOT be - present in a request from the application to the server to create a - session. + been declined by the Terminating Participant. properties: sdp: type: string @@ -574,7 +572,7 @@ components: An inlined session description in SDP format [RFC4566].If XML syntax is used, the content of this element SHALL be embedded in a CDATA section SessionStatus: type: string - description: Provides the status of the media session. During the session creation, this attribute SHALL NOT be included in the request. + description: Provides the status of the media session. enum: - Initial - InProgress @@ -766,6 +764,40 @@ components: description: Example request body used to notify that the receiver endpoint is ringing value: status: Ringing + exampleStatusChangeConnectedWithLocation: + summary: Answering party accepts the call and shares their device location + description: Example request body used to answer the call with the SDP answer and the answering party's device location + value: + status: Connected + answer: + sdp: "v=0\r\no=- 4576312012535546667 4 IN IP4 127.0.0.1\r\ns=-\r\nt=0 0\r\nm=audio 47510 RTP/SAVPF 102 113\r\nc=IN IP6 2001:e0:410:243a:a344:cee7:7b39:bb1e\r\nb=AS:64\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=rtpmap:102 AMR-WB/16000\r\na=fmtp:102 octet-align=0; mode-set=0,1,2; mode-change-capability=2\r\na=rtpmap:113 telephone-event/16000\r\na=ptime:20\r\n" + locationDetails: + shape: Circle + coordinates: + latitude: 40.7128 + longitude: -74.0060 + radius: 50 + method: GPS + confidence: + pdf: normal + value: 88 + timestamp: '2025-10-06T19:32:10Z' + exampleStatusChangeLocationUpdate: + summary: Post-setup location update by either party + description: Example request body used by either call party to share an updated device location after the session is established + value: + status: Connected + locationDetails: + shape: Circle + coordinates: + latitude: 40.7148 + longitude: -74.0075 + radius: 30 + method: GPS + confidence: + pdf: normal + value: 95 + timestamp: '2025-10-06T19:45:00Z' exampleSessionStatus183InProgress: description: Session status update indicating the call is in progress (183 Session Progress) value: diff --git a/code/API_definitions/webrtc-events-subscriptions.yaml b/code/API_definitions/webrtc-events-subscriptions.yaml index a9ad6c2..8d21cae 100644 --- a/code/API_definitions/webrtc-events-subscriptions.yaml +++ b/code/API_definitions/webrtc-events-subscriptions.yaml @@ -233,11 +233,6 @@ paths: To subscribe and receive notifications about new calls, a `session-invitation` subscription is required using the `deviceId` related to a valid registration. - For WebRTC calling subscription scenarios, developers should not use - `initialEvent` or `subscriptionMaxEvents`. These attributes remain in - the schema for CAMARA compatibility, but they are not used by this API - for WebRTC calling subscriptions. - operationId: createNotificationChannelSubscription parameters: - $ref: "#/components/parameters/x-correlator" @@ -269,7 +264,7 @@ paths: consumer. The webrtc-events server will call this endpoint whenever a webrtc-events event occurs. `operationId` value will have to be replaced accordingly with WG API specific semantic. - operationId: createNotificationChannelSubscription + operationId: postNotification parameters: - $ref: "#/components/parameters/x-correlator" requestBody: @@ -406,61 +401,6 @@ paths: $ref: "../common/CAMARA_common.yaml#/components/responses/PermissionDenied403" "404": $ref: "../common/CAMARA_common.yaml#/components/responses/NotFound404" - put: - tags: - - Webrtc Events Subscription - summary: "Update a webrtc-events event subscription" - description: |- - Update a given webrtc-events subscription without changing its identity. - - This operation is idempotent. Repeating the same update request results - in the same final subscription state. - - Either or both of the following attributes may be updated: - - `sinkCredential` - - `config.subscriptionExpireTime` - - The subscription `sink`, event types, and `config.subscriptionDetail` - are not modified by this operation. - operationId: updateNotificationChannelSubscription - security: - - openId: - - webrtc-events-subscriptions:update - parameters: - - $ref: "#/components/parameters/SubscriptionId" - - $ref: "#/components/parameters/x-correlator" - requestBody: - required: true - content: - application/json: - schema: - $ref: "#/components/schemas/SubscriptionUpdateRequest" - examples: - UPDATE_SUBSCRIPTION: - $ref: "#/components/examples/UPDATE_SUBSCRIPTION" - responses: - "200": - description: Updated - headers: - x-correlator: - $ref: "#/components/headers/x-correlator" - content: - application/json: - schema: - $ref: "#/components/schemas/Subscription" - examples: - UPDATED_SUBSCRIPTION: - $ref: "#/components/examples/UPDATED_SUBSCRIPTION" - "400": - $ref: "#/components/responses/UpdateSubscriptionBadRequest400" - "401": - $ref: "../common/CAMARA_common.yaml#/components/responses/Unauthenticated401" - "403": - $ref: "../common/CAMARA_event_common.yaml#/components/responses/SubscriptionPermissionDenied403" - "404": - $ref: "../common/CAMARA_common.yaml#/components/responses/NotFound404" - "429": - $ref: "../common/CAMARA_common.yaml#/components/responses/TooManyRequests429" delete: tags: - Webrtc Events Subscription @@ -570,33 +510,13 @@ components: config: $ref: "#/components/schemas/Config" - SubscriptionUpdateRequest: - description: |- - The request for updating an existing event subscription. - - Either or both of `sinkCredential` and `config.subscriptionExpireTime` - may be updated. - type: object - properties: - sinkCredential: - $ref: "#/components/schemas/SinkCredential" - config: - $ref: "#/components/schemas/SubscriptionUpdateConfig" - additionalProperties: false - Config: description: |- Implementation-specific configuration parameters needed by the subscription manager for acquiring - events. `subscriptionExpireTime`, `subscriptionMaxEvents`, `initialEvent` are predefined for CAMARA - specifications. + events. `subscriptionExpireTime` is predefined for CAMARA specifications. WebRTC specific event type attributes are included into `WebrtcSubscriptionDetail` schema. - For WebRTC calling subscriptions in this API, developers should use `subscriptionDetail` - and, optionally, `subscriptionExpireTime`. The predefined CAMARA attributes - `subscriptionMaxEvents` and `initialEvent` are kept for schema alignment and compatibility, - but they are not used for WebRTC calling subscription scenarios. - Note: if a request is performed for several event type, all subscribed event will use same `config` parameters. type: object @@ -613,38 +533,6 @@ components: description: |- The subscription expiration time (in date-time format) requested by the API consumer. It must follow [RFC 3339](https://datatracker.ietf.org/doc/html/rfc3339#section-5.6) and must have time zone. - subscriptionMaxEvents: - type: integer - format: int32 - description: Identifies the maximum number of event reports to be generated (>=1) requested by the API consumer - Once this number is reached, the subscription ends. Up to API project decision to keep it. - minimum: 1 - maximum: 1000000 - example: 5 - initialEvent: - type: boolean - description: |- - Set to `true` by API consumer if consumer wants to get an event as soon as the subscription is created and current situation reflects event request. - Example: Consumer request Roaming event. If consumer sets initialEvent to true and device is in roaming situation, an event is triggered - Up to API project decision to keep it. - - SubscriptionUpdateConfig: - description: |- - Configuration parameters that may be updated for an existing subscription. - - For this API, only `subscriptionExpireTime` may be updated through - `PUT /subscriptions/{subscriptionId}`. - type: object - properties: - subscriptionExpireTime: - type: string - format: date-time - maxLength: 64 - example: "2023-01-17T13:18:23.682Z" - description: |- - The updated subscription expiration time requested by the API consumer. - It must follow [RFC 3339](https://datatracker.ietf.org/doc/html/rfc3339#section-5.6) - and must have time zone. - additionalProperties: false Protocol: type: string @@ -763,7 +651,7 @@ components: Camara Event types eligible to be delivered by this subscription. type: array minItems: 1 - maxItems: 1 + maxItems: 3 items: $ref: "#/components/schemas/SubscriptionEventType" config: @@ -889,6 +777,7 @@ components: A prototype for media session infomration on Webrtc events. Used as event data schemas for session updates. type: object required: + - subscriptionId - mediaSessionId properties: subscriptionId: @@ -896,7 +785,7 @@ components: originatorAddress: type: string description: Sender (originator) address - pattern: '^(tel:\+[0-9]{5,15}|sip:[A-Za-z0-9_.!%+\-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,})$' + pattern: '^(tel:\+[1-9][0-9]{4,14}|tel:[0-9*#]{1,15};phone-context=(?:\+[1-9][0-9]{0,14}|[A-Za-z0-9](?:[A-Za-z0-9\-]*[A-Za-z0-9])?(?:\.[A-Za-z0-9](?:[A-Za-z0-9\-]*[A-Za-z0-9])?)+)|sip:[A-Za-z0-9_.!%+\-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}|sip:[0-9*#]{1,15};phone-context=(?:\+[1-9][0-9]{0,14}|[A-Za-z0-9](?:[A-Za-z0-9\-]*[A-Za-z0-9])?(?:\.[A-Za-z0-9](?:[A-Za-z0-9\-]*[A-Za-z0-9])?)+)@[A-Za-z0-9.-]+\.[A-Za-z]{2,};user=phone|urn:service:sos(?:\.[a-z0-9](?:[a-z0-9\-]{0,30}[a-z0-9])?)*|sip:anonymous@anonymous\.invalid)$' maxLength: 256 example: 'tel:+11234567899' originatorName: @@ -907,7 +796,7 @@ components: receiverAddress: type: string description: Receiver (terminator) address - pattern: '^(tel:\+[0-9]{5,15}|sip:[A-Za-z0-9_.!%+\-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,})$' + pattern: '^(tel:\+[1-9][0-9]{4,14}|tel:[0-9*#]{1,15};phone-context=(?:\+[1-9][0-9]{0,14}|[A-Za-z0-9](?:[A-Za-z0-9\-]*[A-Za-z0-9])?(?:\.[A-Za-z0-9](?:[A-Za-z0-9\-]*[A-Za-z0-9])?)+)|sip:[A-Za-z0-9_.!%+\-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}|sip:[0-9*#]{1,15};phone-context=(?:\+[1-9][0-9]{0,14}|[A-Za-z0-9](?:[A-Za-z0-9\-]*[A-Za-z0-9])?(?:\.[A-Za-z0-9](?:[A-Za-z0-9\-]*[A-Za-z0-9])?)+)@[A-Za-z0-9.-]+\.[A-Za-z]{2,};user=phone|urn:service:sos(?:\.[a-z0-9](?:[a-z0-9\-]{0,30}[a-z0-9])?)*|sip:anonymous@anonymous\.invalid)$' maxLength: 256 example: 'tel:+11234567899' receiverName: @@ -1025,11 +914,9 @@ components: description: |- - NETWORK_TERMINATED - API server stopped sending notification - SUBSCRIPTION_EXPIRED - Subscription expire time (optionally set by the requester) has been reached - - MAX_EVENTS_REACHED - Maximum number of events (optionally set by the requester) has been reached - ACCESS_TOKEN_EXPIRED - Access Token sinkCredential (optionally set by the requester) expiration time has been reached - SUBSCRIPTION_DELETED - Subscription was deleted by the requester enum: - - MAX_EVENTS_REACHED - NETWORK_TERMINATED - SUBSCRIPTION_EXPIRED - ACCESS_TOKEN_EXPIRED @@ -1054,9 +941,12 @@ components: description: Event detail structure for REGISTRATION_ENDS event. registrationExpireTime is absolute UTC. Clients SHOULD refresh in advance; otherwise a REGISTRATION_EXPIRED terminationReason will be emitted. type: object required: + - subscriptionId - registrationId - terminationReason properties: + subscriptionId: + $ref: "#/components/schemas/SubscriptionId" registrationId: $ref: "#/components/schemas/RegistrationId" terminationDescription: @@ -1193,36 +1083,6 @@ components: description: Orientation of the ellipsoid in degrees. responses: - UpdateSubscriptionBadRequest400: - description: Problem with the client request - headers: - x-correlator: - $ref: "#/components/headers/x-correlator" - content: - application/json: - schema: - allOf: - - $ref: "../common/CAMARA_common.yaml#/components/schemas/ErrorInfo" - - type: object - properties: - status: - enum: - - 400 - code: - enum: - - INVALID_ARGUMENT - - OUT_OF_RANGE - - INVALID_CREDENTIAL - - INVALID_TOKEN - examples: - GENERIC_400_INVALID_ARGUMENT: - $ref: "../common/CAMARA_common.yaml#/components/examples/GENERIC_400_INVALID_ARGUMENT" - GENERIC_400_OUT_OF_RANGE: - $ref: "../common/CAMARA_common.yaml#/components/examples/GENERIC_400_OUT_OF_RANGE" - GENERIC_400_INVALID_CREDENTIAL: - $ref: "../common/CAMARA_event_common.yaml#/components/examples/GENERIC_400_INVALID_CREDENTIAL" - GENERIC_400_INVALID_TOKEN: - $ref: "../common/CAMARA_event_common.yaml#/components/examples/GENERIC_400_INVALID_TOKEN" CreateSubscriptionUnprocessableEntity422: description: Unprocessable Content headers: @@ -1334,35 +1194,6 @@ components: subscriptionDetail: deviceId: "7d444840-9dc0-11d1-b245-5ffdce74fad2" subscriptionExpireTime: "2024-11-17T13:18:23.682Z" - UPDATE_SUBSCRIPTION: - description: |- - Example of updating an existing subscription. Either `sinkCredential`, - `config.subscriptionExpireTime`, or both may be updated. - value: - sinkCredential: - credentialType: "ACCESSTOKEN" - accessToken: "eyJ2ZXIiOiIxLjAiLCJ0eXAiOiJKV1QiL..updated" - accessTokenExpiresUtc: "2025-05-01T14:37:56.147Z" - accessTokenType: "bearer" - config: - subscriptionExpireTime: "2025-05-01T13:18:23.682Z" - UPDATED_SUBSCRIPTION: - description: |- - Example of the updated subscription returned after a successful - subscription update operation. - value: - protocol: HTTP - sink: https://endpoint.example.com/sink - types: - - org.camaraproject.webrtc-events-subscriptions.v0.session-status - config: - subscriptionDetail: - deviceId: "3fa85f64-5717-4562-b3fc-2c963f66afa6" - subscriptionExpireTime: "2023-01-17T13:18:23.682Z" - id: "qs15-h556-rt89-1298" - startsAt: "2023-07-03T12:27:08.312Z" - expiresAt: "2023-07-03T12:27:08.312Z" - status: "ACTIVE" # Event examples NEW_SESSION_INCOMING: description: |- diff --git a/code/Test_definitions/webrtc-events-subscriptions-createNotificationChannelSubscription.feature b/code/Test_definitions/webrtc-events-subscriptions-createNotificationChannelSubscription.feature index e42a014..ddf74cb 100644 --- a/code/Test_definitions/webrtc-events-subscriptions-createNotificationChannelSubscription.feature +++ b/code/Test_definitions/webrtc-events-subscriptions-createNotificationChannelSubscription.feature @@ -22,7 +22,6 @@ Feature: CAMARA WebRTC Events Subscriptions, vwip - Operation createNotification And the request body is set by default to a request body compliant with the schema at "#/components/schemas/SubscriptionRequest" And the request body property "$.sink" is set to "callbackUrl" And the request body property "$.config.subscriptionDetail.deviceId" is set to the testing asset deviceId - And the request body properties "$.config.initialEvent" and "$.config.subscriptionMaxEvents" are not included ############################ Happy Path Scenarios ############################################# diff --git a/code/Test_definitions/webrtc-events-subscriptions-updateNotificationChannelSubscription.feature b/code/Test_definitions/webrtc-events-subscriptions-updateNotificationChannelSubscription.feature deleted file mode 100644 index 4b6f4c7..0000000 --- a/code/Test_definitions/webrtc-events-subscriptions-updateNotificationChannelSubscription.feature +++ /dev/null @@ -1,234 +0,0 @@ -Feature: CAMARA WebRTC Events Subscriptions, vwip - Operation updateNotificationChannelSubscription - # Input to be provided by the implementation to the tester - # - # Implementation indications: - # * apiRoot: API root of the server URL - # * Access token type (2-legged or 3-legged) agreed during onboarding - # - # Testing assets: - # * A subscription created by operation "createNotificationChannelSubscription" - # - # References to OAS spec schemas refer to schemas specified in webrtc-events-subscriptions.yaml - - Background: Common updateNotificationChannelSubscription setup - Given an environment at "apiRoot" - And the resource "/webrtc-events-subscriptions/vwip/subscriptions/{subscriptionId}" - And the header "Content-Type" is set to "application/json" - And the header "Authorization" is set to a valid access token - And the header "x-correlator" complies with the schema at "#/components/schemas/XCorrelator" - And the request body is set by default to a request body compliant with the schema at "#/components/schemas/SubscriptionUpdateRequest" - And the path parameter "subscriptionId" is set by default to the identifier of an existing subscription - -############################ Happy Path Scenarios ############################################# - - @webrtc_events_subscriptions_updateNotificationChannelSubscription_01_update_expire_time - Scenario: Update the subscription expire time - Given an existing subscription created by operation "createNotificationChannelSubscription" - And the path parameter "subscriptionId" is set to the value of "$.id" for that subscription - And the request body property "$.config.subscriptionExpireTime" is set to a date-time in the future different from the current one - When the request "updateNotificationChannelSubscription" is sent - Then the response status code is 200 - And the response header "Content-Type" is "application/json" - And the response header "x-correlator" has same value as the request header "x-correlator" - And the response body complies with the OAS schema at "#/components/schemas/Subscription" - And the response property "$.id" is the value of the path parameter "subscriptionId" - And the response property "$.config.subscriptionExpireTime" is the value of the request body property "$.config.subscriptionExpireTime" - And the response properties "$.types", "$.sink" and "$.config.subscriptionDetail" are unchanged - - @webrtc_events_subscriptions_updateNotificationChannelSubscription_02_update_sink_credential - Scenario: Update the subscription sinkCredential - Given an existing subscription created by operation "createNotificationChannelSubscription" - And the path parameter "subscriptionId" is set to the value of "$.id" for that subscription - And the request body property "$.sinkCredential.credentialType" is set to "ACCESSTOKEN" - And the request body property "$.sinkCredential.accessTokenType" is set to "bearer" - And the request body property "$.sinkCredential.accessToken" is set to a valid access token - And the request body property "$.sinkCredential.accessTokenExpiresUtc" is set to a date-time in the future - When the request "updateNotificationChannelSubscription" is sent - Then the response status code is 200 - And the response header "Content-Type" is "application/json" - And the response header "x-correlator" has same value as the request header "x-correlator" - And the response body complies with the OAS schema at "#/components/schemas/Subscription" - - @webrtc_events_subscriptions_updateNotificationChannelSubscription_03_update_reflected_on_retrieval - Scenario: Updated subscription is returned by retrieval - Given an existing subscription created by operation "createNotificationChannelSubscription" - And the path parameter "subscriptionId" is set to the value of "$.id" for that subscription - And the request "updateNotificationChannelSubscription" has been sent with "$.config.subscriptionExpireTime" set to a date-time in the future and the response status code is 200 - When the request "retrieveNotificationChannelSubscription" is sent - Then the response status code is 200 - And the response body complies with the OAS schema at "#/components/schemas/Subscription" - And the response property "$.config.subscriptionExpireTime" is the value sent in the update request - -############################ Error Scenarios ############################################# - - @webrtc_events_subscriptions_updateNotificationChannelSubscription_400.01_schema_not_compliant - Scenario: Invalid Argument. Generic Syntax Exception - Given the request body is included but is not compliant with the schema at "#/components/schemas/SubscriptionUpdateRequest" - When the request "updateNotificationChannelSubscription" is sent - Then the response status code is 400 - And the response header "x-correlator" has same value as the request header "x-correlator" - And the response header "Content-Type" is "application/json" - And the response property "$.status" is 400 - And the response property "$.code" is "INVALID_ARGUMENT" - And the response property "$.message" contains a user friendly text - - @webrtc_events_subscriptions_updateNotificationChannelSubscription_400.02_no_request_body - Scenario: Missing request body - Given the request body is not included - When the request "updateNotificationChannelSubscription" is sent - Then the response status code is 400 - And the response header "x-correlator" has same value as the request header "x-correlator" - And the response header "Content-Type" is "application/json" - And the response property "$.status" is 400 - And the response property "$.code" is "INVALID_ARGUMENT" - And the response property "$.message" contains a user friendly text - - @webrtc_events_subscriptions_updateNotificationChannelSubscription_400.03_non_updatable_property - Scenario Outline: Request body with a property that cannot be updated - Given the request body property "" is set to a value compliant with the schema at "#/components/schemas/SubscriptionRequest" - When the request "updateNotificationChannelSubscription" is sent - Then the response status code is 400 - And the response header "x-correlator" has same value as the request header "x-correlator" - And the response header "Content-Type" is "application/json" - And the response property "$.status" is 400 - And the response property "$.code" is "INVALID_ARGUMENT" - And the response property "$.message" contains a user friendly text - - Examples: - | property | - | $.sink | - | $.types | - | $.config.subscriptionDetail | - - @webrtc_events_subscriptions_updateNotificationChannelSubscription_400.04_expire_time_in_past - Scenario: Update with expire time in the past - Given the request body property "$.config.subscriptionExpireTime" is set to a date-time in the past - When the request "updateNotificationChannelSubscription" is sent - Then the response status code is 400 - And the response header "x-correlator" has same value as the request header "x-correlator" - And the response header "Content-Type" is "application/json" - And the response property "$.status" is 400 - And the response property "$.code" is "INVALID_ARGUMENT" - And the response property "$.message" contains a user friendly text - - @webrtc_events_subscriptions_updateNotificationChannelSubscription_400.05_invalid_path_parameter - Scenario: Path parameter subscriptionId not compliant with the schema - Given the path parameter "subscriptionId" is set to a value not compliant with the schema at "#/components/schemas/SubscriptionId" - When the request "updateNotificationChannelSubscription" is sent - Then the response status code is 400 - And the response header "x-correlator" has same value as the request header "x-correlator" - And the response header "Content-Type" is "application/json" - And the response property "$.status" is 400 - And the response property "$.code" is "INVALID_ARGUMENT" - And the response property "$.message" contains a user friendly text - - @webrtc_events_subscriptions_updateNotificationChannelSubscription_400.06_invalid_x-correlator - Scenario: Invalid x-correlator header - Given the header "x-correlator" does not comply with the schema at "#/components/schemas/XCorrelator" - When the request "updateNotificationChannelSubscription" is sent - Then the response status code is 400 - And the response property "$.status" is 400 - And the response property "$.code" is "INVALID_ARGUMENT" - And the response property "$.message" contains a user friendly text - - @webrtc_events_subscriptions_updateNotificationChannelSubscription_400.07_out_of_range - Scenario: Update with expire time beyond the allowed range - Given the request body property "$.config.subscriptionExpireTime" is set to a date-time beyond the maximum subscription duration allowed by the implementation - When the request "updateNotificationChannelSubscription" is sent - Then the response status code is 400 - And the response header "x-correlator" has same value as the request header "x-correlator" - And the response header "Content-Type" is "application/json" - And the response property "$.status" is 400 - And the response property "$.code" is "OUT_OF_RANGE" - And the response property "$.message" contains a user friendly text - - @webrtc_events_subscriptions_updateNotificationChannelSubscription_400.08_invalid_credential - Scenario: Update with invalid credential type - Given the request body property "$.sinkCredential.credentialType" is not set to "ACCESSTOKEN" - When the request "updateNotificationChannelSubscription" is sent - Then the response status code is 400 - And the response header "x-correlator" has same value as the request header "x-correlator" - And the response header "Content-Type" is "application/json" - And the response property "$.status" is 400 - And the response property "$.code" is "INVALID_CREDENTIAL" - And the response property "$.message" contains a user friendly text - - @webrtc_events_subscriptions_updateNotificationChannelSubscription_400.09_invalid_token - Scenario: Update with invalid sink credential token - Given the request body property "$.sinkCredential.credentialType" is set to "ACCESSTOKEN" - And the request body property "$.sinkCredential.accessTokenType" is not set to "bearer" - And the request body property "$.sinkCredential.accessToken" is set to a valid access token - And the request body property "$.sinkCredential.accessTokenExpiresUtc" is set to a date-time in the future - When the request "updateNotificationChannelSubscription" is sent - Then the response status code is 400 - And the response header "x-correlator" has same value as the request header "x-correlator" - And the response header "Content-Type" is "application/json" - And the response property "$.status" is 400 - And the response property "$.code" is "INVALID_TOKEN" - And the response property "$.message" contains a user friendly text - - @webrtc_events_subscriptions_updateNotificationChannelSubscription_401.01_no_authorization_header - Scenario: Error response for no header "Authorization" - Given the header "Authorization" is not sent - When the request "updateNotificationChannelSubscription" is sent - Then the response status code is 401 - And the response header "x-correlator" has same value as the request header "x-correlator" - And the response header "Content-Type" is "application/json" - And the response property "$.status" is 401 - And the response property "$.code" is "UNAUTHENTICATED" - And the response property "$.message" contains a user friendly text - - @webrtc_events_subscriptions_updateNotificationChannelSubscription_401.02_expired_access_token - Scenario: Error response for expired access token - Given the header "Authorization" is set to an expired access token - When the request "updateNotificationChannelSubscription" is sent - Then the response status code is 401 - And the response header "x-correlator" has same value as the request header "x-correlator" - And the response header "Content-Type" is "application/json" - And the response property "$.status" is 401 - And the response property "$.code" is "UNAUTHENTICATED" - And the response property "$.message" contains a user friendly text - - @webrtc_events_subscriptions_updateNotificationChannelSubscription_401.03_invalid_access_token - Scenario: Error response for invalid access token - Given the header "Authorization" is set to an invalid access token - When the request "updateNotificationChannelSubscription" is sent - Then the response status code is 401 - And the response header "x-correlator" has same value as the request header "x-correlator" - And the response header "Content-Type" is "application/json" - And the response property "$.status" is 401 - And the response property "$.code" is "UNAUTHENTICATED" - And the response property "$.message" contains a user friendly text - - @webrtc_events_subscriptions_updateNotificationChannelSubscription_403.01_missing_access_token_scope - Scenario: Missing access token scope - Given the header "Authorization" is set to an access token that does not include scope "webrtc-events-subscriptions:update" - When the request "updateNotificationChannelSubscription" is sent - Then the response status code is 403 - And the response header "x-correlator" has same value as the request header "x-correlator" - And the response header "Content-Type" is "application/json" - And the response property "$.status" is 403 - And the response property "$.code" is "PERMISSION_DENIED" - And the response property "$.message" contains a user friendly text - - @webrtc_events_subscriptions_updateNotificationChannelSubscription_404.01_not_found - Scenario: Non-existing subscriptionId - Given the path parameter "subscriptionId" is set to a value compliant with the schema that does not identify an existing subscription - When the request "updateNotificationChannelSubscription" is sent - Then the response status code is 404 - And the response header "x-correlator" has same value as the request header "x-correlator" - And the response header "Content-Type" is "application/json" - And the response property "$.status" is 404 - And the response property "$.code" is "NOT_FOUND" - And the response property "$.message" contains a user friendly text - - @webrtc_events_subscriptions_updateNotificationChannelSubscription_429.01_too_many_requests - Scenario: Request is rejected due to threshold policy - Given the threshold of requests has been reached - When the request "updateNotificationChannelSubscription" is sent - Then the response status code is 429 - And the response header "x-correlator" has same value as the request header "x-correlator" - And the response header "Content-Type" is "application/json" - And the response property "$.status" is 429 - And the response property "$.code" is "TOO_MANY_REQUESTS" - And the response property "$.message" contains a user friendly text