diff --git a/client/src/main/com/sinch/sdk/domains/voice/models/v1/svaml/action/ManagedCallSvamlAction.java b/client/src/main/com/sinch/sdk/domains/voice/models/v1/svaml/action/ManagedCallSvamlAction.java new file mode 100644 index 000000000..dbc22d00a --- /dev/null +++ b/client/src/main/com/sinch/sdk/domains/voice/models/v1/svaml/action/ManagedCallSvamlAction.java @@ -0,0 +1,12 @@ +package com.sinch.sdk.domains.voice.models.v1.svaml.action; + +/** + * Base class related to SVAML actions available for managing ongoing, connected calls (updateCall + * and manageCallWithCallLeg). + * + * @see SvamlActionHangup + * @see SvamlActionContinue + * @see SvamlActionPark + * @since 2.1 + */ +public interface ManagedCallSvamlAction {} diff --git a/client/src/test/java/com/sinch/sdk/domains/voice/api/v1/adapters/CallsServiceTest.java b/client/src/test/java/com/sinch/sdk/domains/voice/api/v1/adapters/CallsServiceTest.java index 3d158a320..22e11c14d 100644 --- a/client/src/test/java/com/sinch/sdk/domains/voice/api/v1/adapters/CallsServiceTest.java +++ b/client/src/test/java/com/sinch/sdk/domains/voice/api/v1/adapters/CallsServiceTest.java @@ -22,8 +22,8 @@ import com.sinch.sdk.domains.voice.api.v1.CallsService; import com.sinch.sdk.domains.voice.models.v1.calls.CallInformationTest; import com.sinch.sdk.domains.voice.models.v1.calls.request.CallLeg; +import com.sinch.sdk.domains.voice.models.v1.calls.request.CallUpdateRequestTest; import com.sinch.sdk.domains.voice.models.v1.calls.response.CallInformation; -import com.sinch.sdk.domains.voice.models.v1.svaml.SvamlControlTest; import java.util.Arrays; import java.util.Collection; import java.util.Collections; @@ -38,8 +38,8 @@ public class CallsServiceTest extends BaseTest { @GivenTextResource("/domains/voice/v1/calls/GetCallInformationResponseDto.json") String getCallInformationResponseDto; - @GivenTextResource("/domains/voice/v1/svaml/SvamlControlDto.json") - String svamlControlDto; + @GivenTextResource("/domains/voice/v1/calls/request/CallUpdateRequestDto.json") + String callUpdateRequestDto; static final Collection AUTH_NAMES = Arrays.asList("Basic", "Signed"); @@ -95,7 +95,7 @@ void update() throws ApiException { "/calling/v1/calls/id/" + URLPathUtils.encodePathSegment("call/id"), HttpMethod.PATCH, Collections.emptyList(), - svamlControlDto, + callUpdateRequestDto, Collections.emptyMap(), Collections.emptyList(), Collections.singletonList(HttpContentType.APPLICATION_JSON), @@ -108,7 +108,7 @@ void update() throws ApiException { argThat(new HttpRequestMatcher(httpRequest)))) .thenReturn(httpResponse); - service.update("call/id", SvamlControlTest.expectedSvamlControl); + service.update("call/id", CallUpdateRequestTest.expectedCallUpdateRequest); } @Test @@ -119,7 +119,7 @@ void manageWithCallLeg() throws ApiException { "/calling/v1/calls/id/" + URLPathUtils.encodePathSegment("call/id") + "/leg/both", HttpMethod.PATCH, Collections.emptyList(), - svamlControlDto, + callUpdateRequestDto, Collections.emptyMap(), Collections.singletonList(HttpContentType.APPLICATION_JSON), Collections.singletonList(HttpContentType.APPLICATION_JSON), @@ -132,6 +132,7 @@ void manageWithCallLeg() throws ApiException { argThat(new HttpRequestMatcher(httpRequest)))) .thenReturn(httpResponse); - service.manageWithCallLeg("call/id", CallLeg.BOTH, SvamlControlTest.expectedSvamlControl); + service.manageWithCallLeg( + "call/id", CallLeg.BOTH, CallUpdateRequestTest.expectedCallUpdateRequest); } } diff --git a/client/src/test/java/com/sinch/sdk/e2e/domains/voice/v1/CallsSteps.java b/client/src/test/java/com/sinch/sdk/e2e/domains/voice/v1/CallsSteps.java index 6e32a5dbf..f371e2c8f 100644 --- a/client/src/test/java/com/sinch/sdk/e2e/domains/voice/v1/CallsSteps.java +++ b/client/src/test/java/com/sinch/sdk/e2e/domains/voice/v1/CallsSteps.java @@ -5,13 +5,13 @@ import com.sinch.sdk.domains.voice.api.v1.CallsService; import com.sinch.sdk.domains.voice.models.v1.Price; import com.sinch.sdk.domains.voice.models.v1.calls.request.CallLeg; +import com.sinch.sdk.domains.voice.models.v1.calls.request.CallUpdateRequest; import com.sinch.sdk.domains.voice.models.v1.calls.response.CallInformation; import com.sinch.sdk.domains.voice.models.v1.calls.response.CallInformation.DomainEnum; import com.sinch.sdk.domains.voice.models.v1.calls.response.CallInformation.ReasonEnum; import com.sinch.sdk.domains.voice.models.v1.calls.response.CallInformation.StatusEnum; import com.sinch.sdk.domains.voice.models.v1.calls.response.CallResult; import com.sinch.sdk.domains.voice.models.v1.destination.DestinationPstn; -import com.sinch.sdk.domains.voice.models.v1.svaml.SvamlControl; import com.sinch.sdk.domains.voice.models.v1.svaml.action.SvamlActionContinue; import com.sinch.sdk.domains.voice.models.v1.svaml.action.SvamlActionHangup; import com.sinch.sdk.domains.voice.models.v1.svaml.instruction.SvamlInstructionPlayFiles; @@ -46,8 +46,8 @@ public void getCall() { @When("^I send a request to update a call$") public void updateCall() { - SvamlControl request = - SvamlControl.builder() + CallUpdateRequest request = + CallUpdateRequest.builder() .setInstructions( Arrays.asList( SvamlInstructionSay.builder() @@ -63,8 +63,8 @@ public void updateCall() { @When("^I send a request to update a call that doesn't exist$") public void updateCallNotExits() { - SvamlControl request = - SvamlControl.builder() + CallUpdateRequest request = + CallUpdateRequest.builder() .setInstructions( Arrays.asList( SvamlInstructionSay.builder() @@ -83,8 +83,8 @@ public void updateCallNotExits() { @When("^I send a request to manage a call with callLeg$") public void manageCallWithCallLeg() { - SvamlControl request = - SvamlControl.builder() + CallUpdateRequest request = + CallUpdateRequest.builder() .setInstructions( Arrays.asList( SvamlInstructionPlayFiles.builder() diff --git a/examples/snippets/src/main/java/voice/calls/ManageWithCallLeg.java b/examples/snippets/src/main/java/voice/calls/ManageWithCallLeg.java index 47c74a033..56207a989 100644 --- a/examples/snippets/src/main/java/voice/calls/ManageWithCallLeg.java +++ b/examples/snippets/src/main/java/voice/calls/ManageWithCallLeg.java @@ -10,8 +10,8 @@ import com.sinch.sdk.SinchClient; import com.sinch.sdk.domains.voice.api.v1.CallsService; import com.sinch.sdk.domains.voice.models.v1.calls.request.CallLeg; -import com.sinch.sdk.domains.voice.models.v1.svaml.SvamlControl; -import com.sinch.sdk.domains.voice.models.v1.svaml.action.SvamlAction; +import com.sinch.sdk.domains.voice.models.v1.calls.request.CallUpdateRequest; +import com.sinch.sdk.domains.voice.models.v1.svaml.action.ManagedCallSvamlAction; import com.sinch.sdk.domains.voice.models.v1.svaml.action.SvamlActionHangup; import com.sinch.sdk.domains.voice.models.v1.svaml.instruction.SvamlInstruction; import com.sinch.sdk.domains.voice.models.v1.svaml.instruction.SvamlInstructionSay; @@ -47,7 +47,7 @@ public static void main(String[] args) { LOGGER.info(String.format("Manage call with ID '%s'", callId)); - SvamlAction action = SvamlActionHangup.SVAML_ACTION_HANGUP; + ManagedCallSvamlAction action = SvamlActionHangup.SVAML_ACTION_HANGUP; Collection instructions = Collections.singletonList( @@ -55,8 +55,8 @@ public static void main(String[] args) { .setText("Hello, the call is over, hanging up now. Goodbye") .build()); - SvamlControl request = - SvamlControl.builder().setInstructions(instructions).setAction(action).build(); + CallUpdateRequest request = + CallUpdateRequest.builder().setInstructions(instructions).setAction(action).build(); callsService.manageWithCallLeg(callId, callLeg, request); diff --git a/examples/snippets/src/main/java/voice/calls/Update.java b/examples/snippets/src/main/java/voice/calls/Update.java index 9d5cbad45..bcd6c03c2 100644 --- a/examples/snippets/src/main/java/voice/calls/Update.java +++ b/examples/snippets/src/main/java/voice/calls/Update.java @@ -9,8 +9,8 @@ import com.sinch.sdk.SinchClient; import com.sinch.sdk.domains.voice.api.v1.CallsService; -import com.sinch.sdk.domains.voice.models.v1.svaml.SvamlControl; -import com.sinch.sdk.domains.voice.models.v1.svaml.action.SvamlAction; +import com.sinch.sdk.domains.voice.models.v1.calls.request.CallUpdateRequest; +import com.sinch.sdk.domains.voice.models.v1.svaml.action.ManagedCallSvamlAction; import com.sinch.sdk.domains.voice.models.v1.svaml.action.SvamlActionHangup; import com.sinch.sdk.domains.voice.models.v1.svaml.instruction.SvamlInstruction; import com.sinch.sdk.domains.voice.models.v1.svaml.instruction.SvamlInstructionSay; @@ -34,7 +34,7 @@ public static void main(String[] args) { // The instruction to be performed SvamlInstruction instruction = SvamlInstructionSay.builder().setText("Goodbye").build(); // The instruction to add to the call - SvamlAction action = SvamlActionHangup.SVAML_ACTION_HANGUP; + ManagedCallSvamlAction action = SvamlActionHangup.SVAML_ACTION_HANGUP; Configuration configuration = Configuration.builder() @@ -50,8 +50,8 @@ public static void main(String[] args) { Collection instructions = Collections.singletonList(instruction); - SvamlControl request = - SvamlControl.builder().setInstructions(instructions).setAction(action).build(); + CallUpdateRequest request = + CallUpdateRequest.builder().setInstructions(instructions).setAction(action).build(); callsService.update(callId, request); diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/voice/api/v1/CallsService.java b/openapi-contracts/src/main/com/sinch/sdk/domains/voice/api/v1/CallsService.java index 6aa50ceb5..680128532 100644 --- a/openapi-contracts/src/main/com/sinch/sdk/domains/voice/api/v1/CallsService.java +++ b/openapi-contracts/src/main/com/sinch/sdk/domains/voice/api/v1/CallsService.java @@ -12,6 +12,7 @@ import com.sinch.sdk.core.exceptions.ApiException; import com.sinch.sdk.domains.voice.models.v1.calls.request.CallLeg; +import com.sinch.sdk.domains.voice.models.v1.calls.request.CallUpdateRequest; import com.sinch.sdk.domains.voice.models.v1.calls.response.CallInformation; import com.sinch.sdk.domains.voice.models.v1.svaml.SvamlControl; @@ -53,10 +54,10 @@ public interface CallsService { * `caller`.<br><Warning>The `callLeg` identifier is ignored * for calls that are part of a conference and calls initiated using the Callout * API.</Warning> (required) - * @param svamlControl (optional) + * @param callUpdateRequest (optional) * @throws ApiException if fails to make API call */ - void manageWithCallLeg(String callId, CallLeg callLeg, SvamlControl svamlControl) + void manageWithCallLeg(String callId, CallLeg callLeg, CallUpdateRequest callUpdateRequest) throws ApiException; /** @@ -70,8 +71,43 @@ void manageWithCallLeg(String callId, CallLeg callLeg, SvamlControl svamlControl * * @param callId The unique identifier of the call. This value is generated by the system. * (required) + * @param callUpdateRequest (optional) + * @throws ApiException if fails to make API call + */ + void update(String callId, CallUpdateRequest callUpdateRequest) throws ApiException; + + /** + * Manage Call with `callLeg` + * + *

This method is deprecated replaced by {@link #manageWithCallLeg(String, CallLeg, + * CallUpdateRequest)} + * + * @param callId The unique identifier of the call. This value is generated by the system. + * (required) + * @param callLeg Specifies which part of the call will be managed. This option is used only by + * the `PlayFiles` and `Say` instructions to indicate which channel the + * sound will be played on. Valid options are `caller`, `callee` or + * `both`. If not specified, the default value is + * `caller`.<br><Warning>The `callLeg` identifier is ignored + * for calls that are part of a conference and calls initiated using the Callout + * API.</Warning> (required) + * @param svamlControl (optional) + * @throws ApiException if fails to make API call + * @deprecated + */ + void manageWithCallLeg(String callId, CallLeg callLeg, SvamlControl svamlControl) + throws ApiException; + + /** + * Update a call in progress + * + *

This method is deprecated replaced by {@link #update(String, CallUpdateRequest)} + * + * @param callId The unique identifier of the call. This value is generated by the system. + * (required) * @param svamlControl (optional) * @throws ApiException if fails to make API call + * @deprecated */ void update(String callId, SvamlControl svamlControl) throws ApiException; } diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/voice/api/v1/adapters/CallsServiceImpl.java b/openapi-contracts/src/main/com/sinch/sdk/domains/voice/api/v1/adapters/CallsServiceImpl.java index afd380188..5eabae47c 100644 --- a/openapi-contracts/src/main/com/sinch/sdk/domains/voice/api/v1/adapters/CallsServiceImpl.java +++ b/openapi-contracts/src/main/com/sinch/sdk/domains/voice/api/v1/adapters/CallsServiceImpl.java @@ -24,6 +24,7 @@ import com.sinch.sdk.core.http.URLPathUtils; import com.sinch.sdk.core.models.ServerConfiguration; import com.sinch.sdk.domains.voice.models.v1.calls.request.CallLeg; +import com.sinch.sdk.domains.voice.models.v1.calls.request.CallUpdateRequest; import com.sinch.sdk.domains.voice.models.v1.calls.response.CallInformation; import com.sinch.sdk.domains.voice.models.v1.svaml.SvamlControl; import java.util.ArrayList; @@ -108,6 +109,137 @@ private HttpRequest getRequestBuilder(String callId) throws ApiException { localVarAuthNames); } + @Override + public void manageWithCallLeg(String callId, CallLeg callLeg, CallUpdateRequest callUpdateRequest) + throws ApiException { + + LOGGER.finest( + "[manageWithCallLeg]" + + " " + + "callId: " + + callId + + ", " + + "callLeg: " + + callLeg + + ", " + + "callUpdateRequest: " + + callUpdateRequest); + + HttpRequest httpRequest = manageWithCallLegRequestBuilder(callId, callLeg, callUpdateRequest); + HttpResponse response = + httpClient.invokeAPI( + this.serverConfiguration, this.authManagersByOasSecuritySchemes, httpRequest); + + if (HttpStatus.isSuccessfulStatus(response.getCode())) { + return; + } + // fallback to default errors handling: + // all error cases definition are not required from specs: will try some "hardcoded" content + // parsing + throw ApiExceptionBuilder.build( + response.getMessage(), + response.getCode(), + mapper.deserialize(response, new TypeReference>() {})); + } + + private HttpRequest manageWithCallLegRequestBuilder( + String callId, CallLeg callLeg, CallUpdateRequest callUpdateRequest) throws ApiException { + // verify the required parameter 'callId' is set + if (callId == null) { + throw new ApiException( + 400, "Missing the required parameter 'callId' when calling manageWithCallLeg"); + } + // verify the required parameter 'callLeg' is set + if (callLeg == null) { + throw new ApiException( + 400, "Missing the required parameter 'callLeg' when calling manageWithCallLeg"); + } + + String localVarPath = + "/calling/v1/calls/id/{callId}/leg/{callLeg}" + .replaceAll("\\{" + "callId" + "\\}", URLPathUtils.encodePathSegment(callId.toString())) + .replaceAll( + "\\{" + "callLeg" + "\\}", URLPathUtils.encodePathSegment(callLeg.toString())); + + List localVarQueryParams = new ArrayList<>(); + + Map localVarHeaderParams = new HashMap<>(); + + final Collection localVarAccepts = Arrays.asList("application/json"); + + final Collection localVarContentTypes = Arrays.asList("application/json"); + + final Collection localVarAuthNames = Arrays.asList("Basic", "Signed"); + final String serializedBody = mapper.serialize(localVarContentTypes, callUpdateRequest); + + return new HttpRequest( + localVarPath, + HttpMethod.PATCH, + localVarQueryParams, + serializedBody, + localVarHeaderParams, + localVarAccepts, + localVarContentTypes, + localVarAuthNames); + } + + @Override + public void update(String callId, CallUpdateRequest callUpdateRequest) throws ApiException { + + LOGGER.finest( + "[update]" + " " + "callId: " + callId + ", " + "callUpdateRequest: " + callUpdateRequest); + + HttpRequest httpRequest = updateRequestBuilder(callId, callUpdateRequest); + HttpResponse response = + httpClient.invokeAPI( + this.serverConfiguration, this.authManagersByOasSecuritySchemes, httpRequest); + + if (HttpStatus.isSuccessfulStatus(response.getCode())) { + return; + } + // fallback to default errors handling: + // all error cases definition are not required from specs: will try some "hardcoded" content + // parsing + throw ApiExceptionBuilder.build( + response.getMessage(), + response.getCode(), + mapper.deserialize(response, new TypeReference>() {})); + } + + private HttpRequest updateRequestBuilder(String callId, CallUpdateRequest callUpdateRequest) + throws ApiException { + // verify the required parameter 'callId' is set + if (callId == null) { + throw new ApiException(400, "Missing the required parameter 'callId' when calling update"); + } + + String localVarPath = + "/calling/v1/calls/id/{callId}" + .replaceAll( + "\\{" + "callId" + "\\}", URLPathUtils.encodePathSegment(callId.toString())); + + List localVarQueryParams = new ArrayList<>(); + + Map localVarHeaderParams = new HashMap<>(); + + final Collection localVarAccepts = Arrays.asList(); + + final Collection localVarContentTypes = Arrays.asList("application/json"); + + final Collection localVarAuthNames = Arrays.asList("Basic", "Signed"); + final String serializedBody = mapper.serialize(localVarContentTypes, callUpdateRequest); + + return new HttpRequest( + localVarPath, + HttpMethod.PATCH, + localVarQueryParams, + serializedBody, + localVarHeaderParams, + localVarAccepts, + localVarContentTypes, + localVarAuthNames); + } + @Override public void manageWithCallLeg(String callId, CallLeg callLeg, SvamlControl svamlControl) throws ApiException { diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/voice/models/v1/calls/request/CallUpdateRequest.java b/openapi-contracts/src/main/com/sinch/sdk/domains/voice/models/v1/calls/request/CallUpdateRequest.java new file mode 100644 index 000000000..6d8645fc6 --- /dev/null +++ b/openapi-contracts/src/main/com/sinch/sdk/domains/voice/models/v1/calls/request/CallUpdateRequest.java @@ -0,0 +1,78 @@ +/* + * Voice API | Sinch + * + * OpenAPI document version: 1.0.1 + * Contact: support@sinch.com + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * Do not edit the class manually. + */ + +package com.sinch.sdk.domains.voice.models.v1.calls.request; + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.sinch.sdk.domains.voice.models.v1.svaml.action.ManagedCallSvamlAction; +import com.sinch.sdk.domains.voice.models.v1.svaml.instruction.SvamlInstruction; +import java.util.Collection; + +/** + * SVAML is a call control markup language. When a server receives a callback event from the Sinch + * platform, it can respond with a SVAML object to control the voice call. The following is an + * example of a SVAML object type and its contents. + */ +@JsonDeserialize(builder = CallUpdateRequestImpl.Builder.class) +public interface CallUpdateRequest { + + /** + * The collection of instructions that can perform various tasks during the call. You can include + * as many instructions as necessary. + * + * @return instructions + */ + Collection getInstructions(); + + /** + * Get action + * + * @return action + */ + ManagedCallSvamlAction getAction(); + + /** + * Getting builder + * + * @return New Builder instance + */ + static Builder builder() { + return new CallUpdateRequestImpl.Builder(); + } + + /** Dedicated Builder */ + interface Builder { + + /** + * see getter + * + * @param instructions see getter + * @return Current builder + * @see #getInstructions + */ + Builder setInstructions(Collection instructions); + + /** + * see getter + * + * @param action see getter + * @return Current builder + * @see #getAction + */ + Builder setAction(ManagedCallSvamlAction action); + + /** + * Create instance + * + * @return The instance build with current builder values + */ + CallUpdateRequest build(); + } +} diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/voice/models/v1/calls/request/CallUpdateRequestImpl.java b/openapi-contracts/src/main/com/sinch/sdk/domains/voice/models/v1/calls/request/CallUpdateRequestImpl.java new file mode 100644 index 000000000..86be341d7 --- /dev/null +++ b/openapi-contracts/src/main/com/sinch/sdk/domains/voice/models/v1/calls/request/CallUpdateRequestImpl.java @@ -0,0 +1,123 @@ +package com.sinch.sdk.domains.voice.models.v1.calls.request; + +import com.fasterxml.jackson.annotation.JsonFilter; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder; +import com.sinch.sdk.core.models.OptionalValue; +import com.sinch.sdk.domains.voice.models.v1.svaml.action.ManagedCallSvamlAction; +import com.sinch.sdk.domains.voice.models.v1.svaml.instruction.SvamlInstruction; +import java.util.Collection; +import java.util.Objects; + +@JsonPropertyOrder({ + CallUpdateRequestImpl.JSON_PROPERTY_INSTRUCTIONS, + CallUpdateRequestImpl.JSON_PROPERTY_ACTION +}) +@JsonFilter("uninitializedFilter") +@JsonInclude(value = JsonInclude.Include.CUSTOM) +public class CallUpdateRequestImpl implements CallUpdateRequest { + private static final long serialVersionUID = 1L; + + public static final String JSON_PROPERTY_INSTRUCTIONS = "instructions"; + + private OptionalValue> instructions; + + public static final String JSON_PROPERTY_ACTION = "action"; + + private OptionalValue action; + + public CallUpdateRequestImpl() {} + + protected CallUpdateRequestImpl( + OptionalValue> instructions, + OptionalValue action) { + this.instructions = instructions; + this.action = action; + } + + @JsonIgnore + public Collection getInstructions() { + return instructions.orElse(null); + } + + @JsonProperty(JSON_PROPERTY_INSTRUCTIONS) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public OptionalValue> instructions() { + return instructions; + } + + @JsonIgnore + public ManagedCallSvamlAction getAction() { + return action.orElse(null); + } + + @JsonProperty(JSON_PROPERTY_ACTION) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public OptionalValue action() { + return action; + } + + /** Return true if this PATCHSVAMLRequestBody object is equal to o. */ + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + CallUpdateRequestImpl paTCHSVAMLRequestBody = (CallUpdateRequestImpl) o; + return Objects.equals(this.instructions, paTCHSVAMLRequestBody.instructions) + && Objects.equals(this.action, paTCHSVAMLRequestBody.action); + } + + @Override + public int hashCode() { + return Objects.hash(instructions, action); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class CallUpdateRequestImpl {\n"); + sb.append(" instructions: ").append(toIndentedString(instructions)).append("\n"); + sb.append(" action: ").append(toIndentedString(action)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces (except the first line). + */ + private String toIndentedString(Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + + @JsonPOJOBuilder(withPrefix = "set") + static class Builder implements CallUpdateRequest.Builder { + OptionalValue> instructions = OptionalValue.empty(); + OptionalValue action = OptionalValue.empty(); + + @JsonProperty(JSON_PROPERTY_INSTRUCTIONS) + public Builder setInstructions(Collection instructions) { + this.instructions = OptionalValue.of(instructions); + return this; + } + + @JsonProperty(JSON_PROPERTY_ACTION) + public Builder setAction(ManagedCallSvamlAction action) { + this.action = OptionalValue.of(action); + return this; + } + + public CallUpdateRequest build() { + return new CallUpdateRequestImpl(instructions, action); + } + } +} diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/voice/models/v1/svaml/action/SvamlActionContinue.java b/openapi-contracts/src/main/com/sinch/sdk/domains/voice/models/v1/svaml/action/SvamlActionContinue.java index 37240e504..8c9ed6c40 100644 --- a/openapi-contracts/src/main/com/sinch/sdk/domains/voice/models/v1/svaml/action/SvamlActionContinue.java +++ b/openapi-contracts/src/main/com/sinch/sdk/domains/voice/models/v1/svaml/action/SvamlActionContinue.java @@ -23,7 +23,8 @@ */ @JsonDeserialize(builder = SvamlActionContinueImpl.Builder.class) public interface SvamlActionContinue - extends com.sinch.sdk.domains.voice.models.v1.svaml.action.SvamlAction { + extends com.sinch.sdk.domains.voice.models.v1.svaml.action.SvamlAction, + com.sinch.sdk.domains.voice.models.v1.svaml.action.ManagedCallSvamlAction { /** ready to use action to send a `continue` */ SvamlActionContinue SVAML_ACTION_CONTINUE = SvamlActionContinue.builder().build(); diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/voice/models/v1/svaml/action/SvamlActionContinueImpl.java b/openapi-contracts/src/main/com/sinch/sdk/domains/voice/models/v1/svaml/action/SvamlActionContinueImpl.java index 09c3450e7..54b1c9b2c 100644 --- a/openapi-contracts/src/main/com/sinch/sdk/domains/voice/models/v1/svaml/action/SvamlActionContinueImpl.java +++ b/openapi-contracts/src/main/com/sinch/sdk/domains/voice/models/v1/svaml/action/SvamlActionContinueImpl.java @@ -13,7 +13,9 @@ @JsonFilter("uninitializedFilter") @JsonInclude(value = JsonInclude.Include.CUSTOM) public class SvamlActionContinueImpl - implements SvamlActionContinue, com.sinch.sdk.domains.voice.models.v1.svaml.action.SvamlAction { + implements SvamlActionContinue, + com.sinch.sdk.domains.voice.models.v1.svaml.action.SvamlAction, + com.sinch.sdk.domains.voice.models.v1.svaml.action.ManagedCallSvamlAction { private static final long serialVersionUID = 1L; public static final String JSON_PROPERTY_NAME = "name"; diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/voice/models/v1/svaml/action/SvamlActionHangup.java b/openapi-contracts/src/main/com/sinch/sdk/domains/voice/models/v1/svaml/action/SvamlActionHangup.java index c40d66663..9433b1099 100644 --- a/openapi-contracts/src/main/com/sinch/sdk/domains/voice/models/v1/svaml/action/SvamlActionHangup.java +++ b/openapi-contracts/src/main/com/sinch/sdk/domains/voice/models/v1/svaml/action/SvamlActionHangup.java @@ -25,7 +25,8 @@ */ @JsonDeserialize(builder = SvamlActionHangupImpl.Builder.class) public interface SvamlActionHangup - extends com.sinch.sdk.domains.voice.models.v1.svaml.action.SvamlAction { + extends com.sinch.sdk.domains.voice.models.v1.svaml.action.SvamlAction, + com.sinch.sdk.domains.voice.models.v1.svaml.action.ManagedCallSvamlAction { /** ready to use action to send a `hangup` */ SvamlActionHangup SVAML_ACTION_HANGUP = SvamlActionHangup.builder().build(); diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/voice/models/v1/svaml/action/SvamlActionHangupImpl.java b/openapi-contracts/src/main/com/sinch/sdk/domains/voice/models/v1/svaml/action/SvamlActionHangupImpl.java index 9cdac58e9..abdf61e9b 100644 --- a/openapi-contracts/src/main/com/sinch/sdk/domains/voice/models/v1/svaml/action/SvamlActionHangupImpl.java +++ b/openapi-contracts/src/main/com/sinch/sdk/domains/voice/models/v1/svaml/action/SvamlActionHangupImpl.java @@ -13,7 +13,9 @@ @JsonFilter("uninitializedFilter") @JsonInclude(value = JsonInclude.Include.CUSTOM) public class SvamlActionHangupImpl - implements SvamlActionHangup, com.sinch.sdk.domains.voice.models.v1.svaml.action.SvamlAction { + implements SvamlActionHangup, + com.sinch.sdk.domains.voice.models.v1.svaml.action.SvamlAction, + com.sinch.sdk.domains.voice.models.v1.svaml.action.ManagedCallSvamlAction { private static final long serialVersionUID = 1L; public static final String JSON_PROPERTY_NAME = "name"; diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/voice/models/v1/svaml/action/SvamlActionPark.java b/openapi-contracts/src/main/com/sinch/sdk/domains/voice/models/v1/svaml/action/SvamlActionPark.java index db8f2bdf2..74161aa2a 100644 --- a/openapi-contracts/src/main/com/sinch/sdk/domains/voice/models/v1/svaml/action/SvamlActionPark.java +++ b/openapi-contracts/src/main/com/sinch/sdk/domains/voice/models/v1/svaml/action/SvamlActionPark.java @@ -24,7 +24,8 @@ */ @JsonDeserialize(builder = SvamlActionParkImpl.Builder.class) public interface SvamlActionPark - extends com.sinch.sdk.domains.voice.models.v1.svaml.action.SvamlAction { + extends com.sinch.sdk.domains.voice.models.v1.svaml.action.SvamlAction, + com.sinch.sdk.domains.voice.models.v1.svaml.action.ManagedCallSvamlAction { /** The name property. Must have the value park. */ public class NameEnum extends EnumDynamic { diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/voice/models/v1/svaml/action/SvamlActionParkImpl.java b/openapi-contracts/src/main/com/sinch/sdk/domains/voice/models/v1/svaml/action/SvamlActionParkImpl.java index d66651404..73577fdc3 100644 --- a/openapi-contracts/src/main/com/sinch/sdk/domains/voice/models/v1/svaml/action/SvamlActionParkImpl.java +++ b/openapi-contracts/src/main/com/sinch/sdk/domains/voice/models/v1/svaml/action/SvamlActionParkImpl.java @@ -19,7 +19,9 @@ @JsonFilter("uninitializedFilter") @JsonInclude(value = JsonInclude.Include.CUSTOM) public class SvamlActionParkImpl - implements SvamlActionPark, com.sinch.sdk.domains.voice.models.v1.svaml.action.SvamlAction { + implements SvamlActionPark, + com.sinch.sdk.domains.voice.models.v1.svaml.action.SvamlAction, + com.sinch.sdk.domains.voice.models.v1.svaml.action.ManagedCallSvamlAction { private static final long serialVersionUID = 1L; public static final String JSON_PROPERTY_NAME = "name"; diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/voice/models/v1/svaml/internal/SvamlActionPatchInternal.java b/openapi-contracts/src/main/com/sinch/sdk/domains/voice/models/v1/svaml/internal/SvamlActionPatchInternal.java new file mode 100644 index 000000000..8fcd49233 --- /dev/null +++ b/openapi-contracts/src/main/com/sinch/sdk/domains/voice/models/v1/svaml/internal/SvamlActionPatchInternal.java @@ -0,0 +1,17 @@ +/* + * Voice API | Sinch + * + * OpenAPI document version: 1.0.1 + * Contact: support@sinch.com + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * Do not edit the class manually. + */ + +package com.sinch.sdk.domains.voice.models.v1.svaml.internal; + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; + +@JsonDeserialize( + using = SvamlActionPatchInternalImpl.SvamlActionPatchInternalImplDeserializer.class) +public interface SvamlActionPatchInternal {} diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/voice/models/v1/svaml/internal/SvamlActionPatchInternalImpl.java b/openapi-contracts/src/main/com/sinch/sdk/domains/voice/models/v1/svaml/internal/SvamlActionPatchInternalImpl.java new file mode 100644 index 000000000..5fadaa722 --- /dev/null +++ b/openapi-contracts/src/main/com/sinch/sdk/domains/voice/models/v1/svaml/internal/SvamlActionPatchInternalImpl.java @@ -0,0 +1,366 @@ +package com.sinch.sdk.domains.voice.models.v1.svaml.internal; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.JsonToken; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.MapperFeature; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.deser.std.StdDeserializer; +import com.fasterxml.jackson.databind.ser.std.StdSerializer; +import com.sinch.sdk.core.models.AbstractOpenApiSchema; +import com.sinch.sdk.core.utils.databind.JSONNavigator; +import com.sinch.sdk.domains.voice.models.v1.svaml.action.SvamlActionContinueImpl; +import com.sinch.sdk.domains.voice.models.v1.svaml.action.SvamlActionHangupImpl; +import com.sinch.sdk.domains.voice.models.v1.svaml.action.SvamlActionParkImpl; +import java.io.IOException; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.logging.Level; +import java.util.logging.Logger; + +@JsonDeserialize( + using = SvamlActionPatchInternalImpl.SvamlActionPatchInternalImplDeserializer.class) +@JsonSerialize(using = SvamlActionPatchInternalImpl.SvamlActionPatchInternalImplSerializer.class) +public class SvamlActionPatchInternalImpl extends AbstractOpenApiSchema + implements SvamlActionPatchInternal { + private static final Logger log = Logger.getLogger(SvamlActionPatchInternalImpl.class.getName()); + + public static final class SvamlActionPatchInternalImplSerializer + extends StdSerializer { + private static final long serialVersionUID = 1L; + + public SvamlActionPatchInternalImplSerializer(Class t) { + super(t); + } + + public SvamlActionPatchInternalImplSerializer() { + this(null); + } + + @Override + public void serialize( + SvamlActionPatchInternalImpl value, JsonGenerator jgen, SerializerProvider provider) + throws IOException, JsonProcessingException { + jgen.writeObject(value.getActualInstance()); + } + } + + public static final class SvamlActionPatchInternalImplDeserializer + extends StdDeserializer { + + private static final long serialVersionUID = 1L; + + public SvamlActionPatchInternalImplDeserializer() { + this(SvamlActionPatchInternalImpl.class); + } + + public SvamlActionPatchInternalImplDeserializer(Class vc) { + super(vc); + } + + @Override + public SvamlActionPatchInternalImpl deserialize(JsonParser jp, DeserializationContext ctxt) + throws IOException, JsonProcessingException { + JsonNode tree = jp.readValueAsTree(); + Object deserialized = null; + SvamlActionPatchInternalImpl newSvamlActionPatchInternalImpl = + new SvamlActionPatchInternalImpl(); + Map result2 = + tree.traverse(jp.getCodec()).readValueAs(new TypeReference>() {}); + String discriminatorValue = (String) result2.get("name"); + switch (discriminatorValue) { + case "continue": + deserialized = tree.traverse(jp.getCodec()).readValueAs(SvamlActionContinueImpl.class); + newSvamlActionPatchInternalImpl.setActualInstance(deserialized); + return newSvamlActionPatchInternalImpl; + case "hangup": + deserialized = tree.traverse(jp.getCodec()).readValueAs(SvamlActionHangupImpl.class); + newSvamlActionPatchInternalImpl.setActualInstance(deserialized); + return newSvamlActionPatchInternalImpl; + case "park": + deserialized = tree.traverse(jp.getCodec()).readValueAs(SvamlActionParkImpl.class); + newSvamlActionPatchInternalImpl.setActualInstance(deserialized); + return newSvamlActionPatchInternalImpl; + default: + log.log( + Level.WARNING, + String.format( + "Failed to lookup discriminator value `%s` for SvamlActionPatchInternalImpl." + + " Possible values: continue hangup park", + discriminatorValue)); + } + + boolean typeCoercion = ctxt.isEnabled(MapperFeature.ALLOW_COERCION_OF_SCALARS); + int match = 0; + JsonToken token = tree.traverse(jp.getCodec()).nextToken(); + // deserialize SvamlActionContinueImpl + try { + boolean attemptParsing = true; + // ensure that we respect type coercion as set on the client ObjectMapper + if (SvamlActionContinueImpl.class.equals(Integer.class) + || SvamlActionContinueImpl.class.equals(Long.class) + || SvamlActionContinueImpl.class.equals(Float.class) + || SvamlActionContinueImpl.class.equals(Double.class) + || SvamlActionContinueImpl.class.equals(Boolean.class) + || SvamlActionContinueImpl.class.equals(String.class)) { + attemptParsing = typeCoercion; + if (!attemptParsing) { + attemptParsing |= + ((SvamlActionContinueImpl.class.equals(Integer.class) + || SvamlActionContinueImpl.class.equals(Long.class)) + && token == JsonToken.VALUE_NUMBER_INT); + attemptParsing |= + ((SvamlActionContinueImpl.class.equals(Float.class) + || SvamlActionContinueImpl.class.equals(Double.class)) + && token == JsonToken.VALUE_NUMBER_FLOAT); + attemptParsing |= + (SvamlActionContinueImpl.class.equals(Boolean.class) + && (token == JsonToken.VALUE_FALSE || token == JsonToken.VALUE_TRUE)); + attemptParsing |= + (SvamlActionContinueImpl.class.equals(String.class) + && token == JsonToken.VALUE_STRING); + } + } + if (attemptParsing) { + deserialized = tree.traverse(jp.getCodec()).readValueAs(SvamlActionContinueImpl.class); + // TODO: there is no validation against JSON schema constraints + // (min, max, enum, pattern...), this does not perform a strict JSON + // validation, which means the 'match' count may be higher than it should be. + match++; + log.log(Level.FINER, "Input data matches schema 'SvamlActionContinueImpl'"); + } + } catch (Exception e) { + // deserialization failed, continue + log.log(Level.FINER, "Input data does not match schema 'SvamlActionContinueImpl'", e); + } + + // deserialize SvamlActionHangupImpl + try { + boolean attemptParsing = true; + // ensure that we respect type coercion as set on the client ObjectMapper + if (SvamlActionHangupImpl.class.equals(Integer.class) + || SvamlActionHangupImpl.class.equals(Long.class) + || SvamlActionHangupImpl.class.equals(Float.class) + || SvamlActionHangupImpl.class.equals(Double.class) + || SvamlActionHangupImpl.class.equals(Boolean.class) + || SvamlActionHangupImpl.class.equals(String.class)) { + attemptParsing = typeCoercion; + if (!attemptParsing) { + attemptParsing |= + ((SvamlActionHangupImpl.class.equals(Integer.class) + || SvamlActionHangupImpl.class.equals(Long.class)) + && token == JsonToken.VALUE_NUMBER_INT); + attemptParsing |= + ((SvamlActionHangupImpl.class.equals(Float.class) + || SvamlActionHangupImpl.class.equals(Double.class)) + && token == JsonToken.VALUE_NUMBER_FLOAT); + attemptParsing |= + (SvamlActionHangupImpl.class.equals(Boolean.class) + && (token == JsonToken.VALUE_FALSE || token == JsonToken.VALUE_TRUE)); + attemptParsing |= + (SvamlActionHangupImpl.class.equals(String.class) + && token == JsonToken.VALUE_STRING); + } + } + if (attemptParsing) { + deserialized = tree.traverse(jp.getCodec()).readValueAs(SvamlActionHangupImpl.class); + // TODO: there is no validation against JSON schema constraints + // (min, max, enum, pattern...), this does not perform a strict JSON + // validation, which means the 'match' count may be higher than it should be. + match++; + log.log(Level.FINER, "Input data matches schema 'SvamlActionHangupImpl'"); + } + } catch (Exception e) { + // deserialization failed, continue + log.log(Level.FINER, "Input data does not match schema 'SvamlActionHangupImpl'", e); + } + + // deserialize SvamlActionParkImpl + try { + boolean attemptParsing = true; + // ensure that we respect type coercion as set on the client ObjectMapper + if (SvamlActionParkImpl.class.equals(Integer.class) + || SvamlActionParkImpl.class.equals(Long.class) + || SvamlActionParkImpl.class.equals(Float.class) + || SvamlActionParkImpl.class.equals(Double.class) + || SvamlActionParkImpl.class.equals(Boolean.class) + || SvamlActionParkImpl.class.equals(String.class)) { + attemptParsing = typeCoercion; + if (!attemptParsing) { + attemptParsing |= + ((SvamlActionParkImpl.class.equals(Integer.class) + || SvamlActionParkImpl.class.equals(Long.class)) + && token == JsonToken.VALUE_NUMBER_INT); + attemptParsing |= + ((SvamlActionParkImpl.class.equals(Float.class) + || SvamlActionParkImpl.class.equals(Double.class)) + && token == JsonToken.VALUE_NUMBER_FLOAT); + attemptParsing |= + (SvamlActionParkImpl.class.equals(Boolean.class) + && (token == JsonToken.VALUE_FALSE || token == JsonToken.VALUE_TRUE)); + attemptParsing |= + (SvamlActionParkImpl.class.equals(String.class) && token == JsonToken.VALUE_STRING); + } + } + if (attemptParsing) { + deserialized = tree.traverse(jp.getCodec()).readValueAs(SvamlActionParkImpl.class); + // TODO: there is no validation against JSON schema constraints + // (min, max, enum, pattern...), this does not perform a strict JSON + // validation, which means the 'match' count may be higher than it should be. + match++; + log.log(Level.FINER, "Input data matches schema 'SvamlActionParkImpl'"); + } + } catch (Exception e) { + // deserialization failed, continue + log.log(Level.FINER, "Input data does not match schema 'SvamlActionParkImpl'", e); + } + + if (match == 1) { + SvamlActionPatchInternalImpl ret = new SvamlActionPatchInternalImpl(); + ret.setActualInstance(deserialized); + return ret; + } + throw new IOException( + String.format( + "Failed deserialization for SvamlActionPatchInternalImpl: %d classes match result," + + " expected 1", + match)); + } + + /** Handle deserialization of the 'null' value. */ + @Override + public SvamlActionPatchInternalImpl getNullValue(DeserializationContext ctxt) + throws JsonMappingException { + throw new JsonMappingException( + ctxt.getParser(), "SvamlActionPatchInternalImpl cannot be null"); + } + } + + // store a list of schema names defined in oneOf + public static final Map> schemas = new HashMap<>(); + + public SvamlActionPatchInternalImpl() { + super("oneOf", Boolean.FALSE); + } + + public SvamlActionPatchInternalImpl(SvamlActionContinueImpl o) { + super("oneOf", Boolean.FALSE); + setActualInstance(o); + } + + public SvamlActionPatchInternalImpl(SvamlActionHangupImpl o) { + super("oneOf", Boolean.FALSE); + setActualInstance(o); + } + + public SvamlActionPatchInternalImpl(SvamlActionParkImpl o) { + super("oneOf", Boolean.FALSE); + setActualInstance(o); + } + + static { + schemas.put("SvamlActionContinueImpl", SvamlActionContinueImpl.class); + schemas.put("SvamlActionHangupImpl", SvamlActionHangupImpl.class); + schemas.put("SvamlActionParkImpl", SvamlActionParkImpl.class); + JSONNavigator.registerDescendants( + SvamlActionPatchInternalImpl.class, Collections.unmodifiableMap(schemas)); + // Initialize and register the discriminator mappings. + Map> mappings = new HashMap>(); + mappings.put("continue", SvamlActionContinueImpl.class); + mappings.put("hangup", SvamlActionHangupImpl.class); + mappings.put("park", SvamlActionParkImpl.class); + mappings.put("svaml.action.patch", SvamlActionPatchInternalImpl.class); + JSONNavigator.registerDiscriminator(SvamlActionPatchInternalImpl.class, "name", mappings); + } + + @Override + public Map> getSchemas() { + return SvamlActionPatchInternalImpl.schemas; + } + + /** + * Set the instance that matches the oneOf child schema, check the instance parameter is valid + * against the oneOf child schemas: SvamlActionContinueImpl, SvamlActionHangupImpl, + * SvamlActionParkImpl + * + *

It could be an instance of the 'oneOf' schemas. The oneOf child schemas may themselves be a + * composed schema (allOf, anyOf, oneOf). + */ + @Override + public void setActualInstance(Object instance) { + if (JSONNavigator.isInstanceOf( + SvamlActionContinueImpl.class, instance, new HashSet>())) { + super.setActualInstance(instance); + return; + } + + if (JSONNavigator.isInstanceOf( + SvamlActionHangupImpl.class, instance, new HashSet>())) { + super.setActualInstance(instance); + return; + } + + if (JSONNavigator.isInstanceOf(SvamlActionParkImpl.class, instance, new HashSet>())) { + super.setActualInstance(instance); + return; + } + + throw new RuntimeException( + "Invalid instance type. Must be SvamlActionContinueImpl, SvamlActionHangupImpl," + + " SvamlActionParkImpl"); + } + + /** + * Get the actual instance, which can be the following: SvamlActionContinueImpl, + * SvamlActionHangupImpl, SvamlActionParkImpl + * + * @return The actual instance (SvamlActionContinueImpl, SvamlActionHangupImpl, + * SvamlActionParkImpl) + */ + @Override + public Object getActualInstance() { + return super.getActualInstance(); + } + + /** + * Get the actual instance of `SvamlActionContinueImpl`. If the actual instance is not + * `SvamlActionContinueImpl`, the ClassCastException will be thrown. + * + * @return The actual instance of `SvamlActionContinueImpl` + * @throws ClassCastException if the instance is not `SvamlActionContinueImpl` + */ + public SvamlActionContinueImpl getSvamlActionContinueImpl() throws ClassCastException { + return (SvamlActionContinueImpl) super.getActualInstance(); + } + + /** + * Get the actual instance of `SvamlActionHangupImpl`. If the actual instance is not + * `SvamlActionHangupImpl`, the ClassCastException will be thrown. + * + * @return The actual instance of `SvamlActionHangupImpl` + * @throws ClassCastException if the instance is not `SvamlActionHangupImpl` + */ + public SvamlActionHangupImpl getSvamlActionHangupImpl() throws ClassCastException { + return (SvamlActionHangupImpl) super.getActualInstance(); + } + + /** + * Get the actual instance of `SvamlActionParkImpl`. If the actual instance is not + * `SvamlActionParkImpl`, the ClassCastException will be thrown. + * + * @return The actual instance of `SvamlActionParkImpl` + * @throws ClassCastException if the instance is not `SvamlActionParkImpl` + */ + public SvamlActionParkImpl getSvamlActionParkImpl() throws ClassCastException { + return (SvamlActionParkImpl) super.getActualInstance(); + } +} diff --git a/openapi-contracts/src/test/java/com/sinch/sdk/domains/voice/models/v1/calls/request/CallUpdateRequestTest.java b/openapi-contracts/src/test/java/com/sinch/sdk/domains/voice/models/v1/calls/request/CallUpdateRequestTest.java new file mode 100644 index 000000000..5da9707ad --- /dev/null +++ b/openapi-contracts/src/test/java/com/sinch/sdk/domains/voice/models/v1/calls/request/CallUpdateRequestTest.java @@ -0,0 +1,38 @@ +package com.sinch.sdk.domains.voice.models.v1.calls.request; + +import com.adelean.inject.resources.junit.jupiter.GivenTextResource; +import com.adelean.inject.resources.junit.jupiter.TestWithResources; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.sinch.sdk.BaseTest; +import com.sinch.sdk.domains.voice.models.v1.svaml.action.SvamlActionHangup; +import com.sinch.sdk.domains.voice.models.v1.svaml.instruction.SvamlInstructionSay; +import java.util.Arrays; +import org.json.JSONException; +import org.junit.jupiter.api.Test; +import org.skyscreamer.jsonassert.JSONAssert; + +@TestWithResources +public class CallUpdateRequestTest extends BaseTest { + + public static CallUpdateRequest expectedCallUpdateRequest = + CallUpdateRequest.builder() + .setAction(SvamlActionHangup.SVAML_ACTION_HANGUP) + .setInstructions( + Arrays.asList( + SvamlInstructionSay.builder() + .setText("Sorry, the conference has been cancelled. The call will end now.") + .setLocale("en-US") + .build())) + .build(); + + @GivenTextResource("/domains/voice/v1/calls/request/CallUpdateRequestDto.json") + String jsonCallUpdateRequestDto; + + @Test + void serializeCallUpdateRequest() throws JsonProcessingException, JSONException { + + String serializedString = objectMapper.writeValueAsString(expectedCallUpdateRequest); + + JSONAssert.assertEquals(jsonCallUpdateRequestDto, serializedString, true); + } +} diff --git a/openapi-contracts/src/test/resources/domains/voice/v1/calls/request/CallUpdateRequestDto.json b/openapi-contracts/src/test/resources/domains/voice/v1/calls/request/CallUpdateRequestDto.json new file mode 100644 index 000000000..1640c9049 --- /dev/null +++ b/openapi-contracts/src/test/resources/domains/voice/v1/calls/request/CallUpdateRequestDto.json @@ -0,0 +1,12 @@ +{ + "instructions": [ + { + "name": "say", + "text": "Sorry, the conference has been cancelled. The call will end now.", + "locale": "en-US" + } + ], + "action": { + "name": "hangup" + } +}