Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: verifyV2 Cancel #407

Merged
merged 1 commit into from
May 15, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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