Skip to content

Commit

Permalink
feat: verifyV2 Cancel (#407)
Browse files Browse the repository at this point in the history
  • Loading branch information
Tr00d committed May 15, 2023
1 parent 692f0bc commit abdd721
Show file tree
Hide file tree
Showing 5 changed files with 143 additions and 0 deletions.
31 changes: 31 additions & 0 deletions Vonage.Test.Unit/VerifyV2/Cancel/RequestTest.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
using System;
using Vonage.Common.Failures;
using Vonage.Common.Test.Extensions;
using Vonage.VerifyV2.Cancel;
using Xunit;

namespace Vonage.Test.Unit.VerifyV2.Cancel
{
public class RequestTest
{
[Fact]
public void Create_ShouldReturnFailure_GivenRequestIsEmpty() =>
CancelRequest.Parse(Guid.Empty)
.Should()
.BeFailure(ResultFailure.FromErrorMessage("RequestId cannot be empty."));

[Fact]
public void Create_ShouldReturnSuccess() =>
CancelRequest.Parse(new Guid("f3a065af-ac5a-47a4-8dfe-819561a7a287"))
.Map(request => request.RequestId)
.Should()
.BeSuccess(new Guid("f3a065af-ac5a-47a4-8dfe-819561a7a287"));

[Fact]
public void GetEndpointPath_ShouldReturnApiEndpoint() =>
CancelRequest.Parse(new Guid("f3a065af-ac5a-47a4-8dfe-819561a7a287"))
.Map(request => request.GetEndpointPath())
.Should()
.BeSuccess("/v2/verify/f3a065af-ac5a-47a4-8dfe-819561a7a287");
}
}
60 changes: 60 additions & 0 deletions Vonage.Test.Unit/VerifyV2/Cancel/UseCaseTest.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
using System;
using System.Net.Http;
using System.Threading.Tasks;
using AutoFixture;
using AutoFixture.Kernel;
using FsCheck;
using FsCheck.Xunit;
using Vonage.Common.Client;
using Vonage.Common.Monads;
using Vonage.Common.Test;
using Vonage.Common.Test.TestHelpers;
using Vonage.VerifyV2;
using Vonage.VerifyV2.Cancel;
using Xunit;

namespace Vonage.Test.Unit.VerifyV2.Cancel
{
public class UseCaseTest : BaseUseCase, IUseCase
{
private Func<VonageHttpClientConfiguration, Task<Result<Common.Monads.Unit>>> Operation =>
configuration => new VerifyV2Client(configuration).CancelAsync(this.request);

private readonly Result<CancelRequest> request;

public UseCaseTest() => this.request = BuildRequest(this.helper.Fixture);

[Property]
public Property ShouldReturnFailure_GivenApiErrorCannotBeParsed() =>
this.helper.VerifyReturnsFailureGivenErrorCannotBeParsed(this.BuildExpectedRequest(), this.Operation);

[Property]
public Property ShouldReturnFailure_GivenApiResponseIsError() =>
this.helper.VerifyReturnsFailureGivenApiResponseIsError(this.BuildExpectedRequest(), this.Operation);

[Fact]
public async Task ShouldReturnFailure_GivenRequestIsFailure() =>
await this.helper.VerifyReturnsFailureGivenRequestIsFailure<CancelRequest, Common.Monads.Unit>(
(configuration, failureRequest) => new VerifyV2Client(configuration).CancelAsync(failureRequest));

[Fact]
public async Task ShouldReturnFailure_GivenTokenGenerationFailed() =>
await this.helper.VerifyReturnsFailureGivenTokenGenerationFails(this.Operation);

[Fact]
public async Task ShouldReturnSuccess_GivenApiResponseIsSuccess() =>
await this.helper.VerifyReturnsExpectedValueGivenApiResponseIsSuccess(this.BuildExpectedRequest(),
this.Operation);

private ExpectedRequest BuildExpectedRequest() =>
new ExpectedRequest
{
Method = HttpMethod.Delete,
RequestUri = new Uri(UseCaseHelper.GetPathFromRequest(this.request), UriKind.Relative),
};

private static Result<CancelRequest> BuildRequest(
ISpecimenBuilder fixture) =>
CancelRequest.Parse(fixture.Create<Guid>());
}
}
39 changes: 39 additions & 0 deletions Vonage/VerifyV2/Cancel/CancelRequest.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
using System;
using System.Net.Http;
using Vonage.Common.Client;
using Vonage.Common.Monads;
using Vonage.Common.Validation;

namespace Vonage.VerifyV2.Cancel;

/// <inheritdoc />
public readonly struct CancelRequest : IVonageRequest
{
private CancelRequest(Guid requestId) => this.RequestId = requestId;

/// <summary>
/// ID of the verify request.
/// </summary>
public Guid RequestId { get; internal init; }

/// <inheritdoc />
public HttpRequestMessage BuildRequestMessage() => VonageRequestBuilder
.Initialize(HttpMethod.Delete, this.GetEndpointPath())
.Build();

/// <inheritdoc />
public string GetEndpointPath() => $"/v2/verify/{this.RequestId}";

/// <summary>
/// Parses the input into a CancelRequest.
/// </summary>
/// <param name="requestId">The verify request identifier.</param>
/// <returns>A success state with the request if the parsing succeeded. A failure state with an error if it failed.</returns>
public static Result<CancelRequest> Parse(Guid requestId) =>
Result<CancelRequest>
.FromSuccess(new CancelRequest(requestId))
.Bind(VerifyRoomId);

private static Result<CancelRequest> VerifyRoomId(CancelRequest request) =>
InputValidation.VerifyNotEmpty(request, request.RequestId, nameof(RequestId));
}
8 changes: 8 additions & 0 deletions Vonage/VerifyV2/IVerifyV2Client.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using System.Threading.Tasks;
using Vonage.Common.Monads;
using Vonage.VerifyV2.Cancel;
using Vonage.VerifyV2.StartVerification;
using Vonage.VerifyV2.VerifyCode;

Expand All @@ -10,6 +11,13 @@ namespace Vonage.VerifyV2;
/// </summary>
public interface IVerifyV2Client
{
/// <summary>
/// Aborts the workflow if a verification request is still active.
/// </summary>
/// <param name="request">The request.</param>
/// <returns>Success or Failure.</returns>
Task<Result<Unit>> CancelAsync(Result<CancelRequest> request);

/// <summary>
/// Requests a verification to be sent to a user.
/// </summary>
Expand Down
5 changes: 5 additions & 0 deletions Vonage/VerifyV2/VerifyV2Client.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using Vonage.Common;
using Vonage.Common.Client;
using Vonage.Common.Monads;
using Vonage.VerifyV2.Cancel;
using Vonage.VerifyV2.StartVerification;
using Vonage.VerifyV2.VerifyCode;

Expand All @@ -19,6 +20,10 @@ internal class VerifyV2Client : IVerifyV2Client
internal VerifyV2Client(VonageHttpClientConfiguration configuration) =>
this.vonageClient = new VonageHttpClient(configuration, JsonSerializer.BuildWithSnakeCase());

/// <inheritdoc />
public Task<Result<Unit>> CancelAsync(Result<CancelRequest> request) =>
this.vonageClient.SendAsync(request);

/// <inheritdoc />
public Task<Result<StartVerificationResponse>>
StartVerificationAsync<T>(Result<T> request) where T : IStartVerificationRequest =>
Expand Down

0 comments on commit abdd721

Please sign in to comment.