diff --git a/Vonage.Test/VerifyV2/NextWorkflow/E2ETest.cs b/Vonage.Test/VerifyV2/NextWorkflow/E2ETest.cs new file mode 100644 index 00000000..2e529b42 --- /dev/null +++ b/Vonage.Test/VerifyV2/NextWorkflow/E2ETest.cs @@ -0,0 +1,27 @@ +using System; +using System.Net; +using System.Threading.Tasks; +using Vonage.Test.Common.Extensions; +using Vonage.VerifyV2.NextWorkflow; +using WireMock.ResponseBuilders; +using Xunit; + +namespace Vonage.Test.VerifyV2.NextWorkflow; + +[Trait("Category", "E2E")] +public class E2ETest : E2EBase +{ + [Fact] + public async Task NextWorkflow() + { + this.Helper.Server.Given(WireMock.RequestBuilders.Request.Create() + .WithPath("/v2/verify/68c2b32e-55ba-4a8e-b3fa-43b3ae6cd1fb/next_workflow") + .WithHeader("Authorization", this.Helper.ExpectedAuthorizationHeaderValue) + .UsingPost()) + .RespondWith(Response.Create().WithStatusCode(HttpStatusCode.OK)); + await this.Helper.VonageClient.VerifyV2Client.NextWorkflowAsync( + NextWorkflowRequest.Parse(Guid.Parse("68c2b32e-55ba-4a8e-b3fa-43b3ae6cd1fb"))) + .Should() + .BeSuccessAsync(); + } +} \ No newline at end of file diff --git a/Vonage.Test/VerifyV2/NextWorkflow/RequestTest.cs b/Vonage.Test/VerifyV2/NextWorkflow/RequestTest.cs new file mode 100644 index 00000000..4329fe7c --- /dev/null +++ b/Vonage.Test/VerifyV2/NextWorkflow/RequestTest.cs @@ -0,0 +1,30 @@ +using System; +using Vonage.Test.Common.Extensions; +using Vonage.VerifyV2.NextWorkflow; +using Xunit; + +namespace Vonage.Test.VerifyV2.NextWorkflow; + +[Trait("Category", "Request")] +public class RequestTest +{ + [Fact] + public void GetEndpointPath_ShouldReturnApiEndpoint() => + NextWorkflowRequest.Parse(new Guid("f3a065af-ac5a-47a4-8dfe-819561a7a287")) + .Map(request => request.GetEndpointPath()) + .Should() + .BeSuccess("/v2/verify/f3a065af-ac5a-47a4-8dfe-819561a7a287/next_workflow"); + + [Fact] + public void Parse_ShouldReturnFailure_GivenRequestIsEmpty() => + NextWorkflowRequest.Parse(Guid.Empty) + .Should() + .BeParsingFailure("RequestId cannot be empty."); + + [Fact] + public void Parse_ShouldReturnSuccess() => + NextWorkflowRequest.Parse(new Guid("f3a065af-ac5a-47a4-8dfe-819561a7a287")) + .Map(request => request.RequestId) + .Should() + .BeSuccess(new Guid("f3a065af-ac5a-47a4-8dfe-819561a7a287")); +} \ No newline at end of file diff --git a/Vonage/VerifyV2/IVerifyV2Client.cs b/Vonage/VerifyV2/IVerifyV2Client.cs index ef56b3ac..ae46525b 100644 --- a/Vonage/VerifyV2/IVerifyV2Client.cs +++ b/Vonage/VerifyV2/IVerifyV2Client.cs @@ -1,6 +1,7 @@ using System.Threading.Tasks; using Vonage.Common.Monads; using Vonage.VerifyV2.Cancel; +using Vonage.VerifyV2.NextWorkflow; using Vonage.VerifyV2.StartVerification; using Vonage.VerifyV2.VerifyCode; @@ -18,6 +19,13 @@ public interface IVerifyV2Client /// Success or Failure. Task> CancelAsync(Result request); + /// + /// Move the request onto the next workflow, if available. + /// + /// The request. + /// Success or Failure. + Task> NextWorkflowAsync(Result request); + /// /// Requests a verification to be sent to a user. /// diff --git a/Vonage/VerifyV2/NextWorkflow/NextWorkflowRequest.cs b/Vonage/VerifyV2/NextWorkflow/NextWorkflowRequest.cs new file mode 100644 index 00000000..0e694799 --- /dev/null +++ b/Vonage/VerifyV2/NextWorkflow/NextWorkflowRequest.cs @@ -0,0 +1,40 @@ +using System; +using System.Net.Http; +using Vonage.Common.Client; +using Vonage.Common.Monads; +using Vonage.Common.Validation; + +namespace Vonage.VerifyV2.NextWorkflow; + +/// +public readonly struct NextWorkflowRequest : IVonageRequest +{ + private NextWorkflowRequest(Guid requestId) => this.RequestId = requestId; + + /// + /// ID of the verify request. + /// + public Guid RequestId { get; internal init; } + + /// + public HttpRequestMessage BuildRequestMessage() => VonageRequestBuilder + .Initialize(HttpMethod.Post, this.GetEndpointPath()) + .Build(); + + /// + public string GetEndpointPath() => $"/v2/verify/{this.RequestId}/next_workflow"; + + /// + /// Parses the input into a NextWorkflowRequest. + /// + /// The verify request identifier. + /// A success state with the request if the parsing succeeded. A failure state with an error if it failed. + public static Result Parse(Guid requestId) => + Result + .FromSuccess(new NextWorkflowRequest(requestId)) + .Map(InputEvaluation.Evaluate) + .Bind(evaluation => evaluation.WithRules(VerifyRequestId)); + + private static Result VerifyRequestId(NextWorkflowRequest request) => + InputValidation.VerifyNotEmpty(request, request.RequestId, nameof(RequestId)); +} \ No newline at end of file diff --git a/Vonage/VerifyV2/VerifyV2Client.cs b/Vonage/VerifyV2/VerifyV2Client.cs index e2326e25..87e29504 100644 --- a/Vonage/VerifyV2/VerifyV2Client.cs +++ b/Vonage/VerifyV2/VerifyV2Client.cs @@ -3,6 +3,7 @@ using Vonage.Common.Monads; using Vonage.Serialization; using Vonage.VerifyV2.Cancel; +using Vonage.VerifyV2.NextWorkflow; using Vonage.VerifyV2.StartVerification; using Vonage.VerifyV2.VerifyCode; @@ -23,6 +24,10 @@ internal VerifyV2Client(VonageHttpClientConfiguration configuration) => public Task> CancelAsync(Result request) => this.vonageClient.SendAsync(request); + /// + public Task> NextWorkflowAsync(Result request) => + this.vonageClient.SendAsync(request); + /// public Task> StartVerificationAsync(Result request) => this.vonageClient.SendWithResponseAsync(request);