Skip to content

Commit

Permalink
feat: implement GetTemplates for VerifyV2
Browse files Browse the repository at this point in the history
  • Loading branch information
Tr00d committed Sep 12, 2024
1 parent ce23ccd commit ccf80dd
Show file tree
Hide file tree
Showing 11 changed files with 426 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
{
"page_size": 1,
"page": 2,
"total_pages": 10,
"total_items": 25,
"_embedded": {
"templates": [
{
"template_id": "8f35a1a7-eb2f-4552-8fdf-fffdaee41bc9",
"name": "my-template-1",
"is_default": true,
"_links": {
"self": {
"href": "https://api.nexmo.com/v2/verify/templates/8f35a1a7-eb2f-4552-8fdf-fffdaee41bc9"
},
"fragments": {
"href": "https://api.nexmo.com/v2/verify/templates/8f35a1a7-eb2f-4552-8fdf-fffdaee41bc9/template_fragments"
}
}
},
{
"template_id": "0ac50843-b549-4a89-916e-848749f20040",
"name": "my-template-2",
"is_default": false,
"_links": {
"self": {
"href": "https://api.nexmo.com/v2/verify/templates/0ac50843-b549-4a89-916e-848749f20040"
},
"fragments": {
"href": "https://api.nexmo.com/v2/verify/templates/0ac50843-b549-4a89-916e-848749f20040/template_fragments"
}
}
}
]
},
"_links": {
"self": {
"href": "https://api.nexmo.com/v2/verify/templates?page=2"
},
"next": {
"href": "https://api.nexmo.com/v2/verify/templates?page=3"
},
"prev": {
"href": "https://api.nexmo.com/v2/verify/templates?page=1"
},
"last": {
"href": "https://api.nexmo.com/v2/verify/templates?page=5"
}
}
}
34 changes: 34 additions & 0 deletions Vonage.Test/VerifyV2/GetTemplates/E2ETest.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
#region
using System.Net;
using System.Threading.Tasks;
using Vonage.Test.Common.Extensions;
using Vonage.VerifyV2.GetTemplates;
using WireMock.ResponseBuilders;
using Xunit;
#endregion

namespace Vonage.Test.VerifyV2.GetTemplates;

[Trait("Category", "E2E")]
public class E2ETest : E2EBase
{
public E2ETest() : base(typeof(E2ETest).Namespace)
{
}

[Fact]
public async Task GetTemplates()
{
this.Helper.Server.Given(WireMock.RequestBuilders.Request.Create()
.WithPath("/v2/verify/templates")
.WithHeader("Authorization", this.Helper.ExpectedAuthorizationHeaderValue)
.UsingGet())
.RespondWith(Response.Create()
.WithStatusCode(HttpStatusCode.OK)
.WithBody(this.Serialization.GetResponseJson(nameof(SerializationTest.ShouldDeserialize200))));
await this.Helper.VonageClient.VerifyV2Client
.GetTemplateAsync(GetTemplatesRequest.Build().Create())
.Should()
.BeSuccessAsync(SerializationTest.VerifyExpectedResponse);
}
}
50 changes: 50 additions & 0 deletions Vonage.Test/VerifyV2/GetTemplates/RequestBuilderTest.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
#region
using Vonage.Common.Monads;
using Vonage.Test.Common.Extensions;
using Vonage.VerifyV2.GetTemplates;
using Xunit;
#endregion

namespace Vonage.Test.VerifyV2.GetTemplates;

[Trait("Category", "Request")]
public class RequestBuilderTest
{
[Fact]
public void Build_ShouldHaveNoDefaultPageSize() =>
GetTemplatesRequest
.Build()
.Create()
.Map(request => request.PageSize)
.Should()
.BeSuccess(Maybe<int>.None);

[Fact]
public void Build_ShouldHaveNoDefaultPage() =>
GetTemplatesRequest
.Build()
.Create()
.Map(request => request.Page)
.Should()
.BeSuccess(Maybe<int>.None);

[Fact]
public void Build_ShouldSetPageSize() =>
GetTemplatesRequest
.Build()
.WithPageSize(50)
.Create()
.Map(request => request.PageSize)
.Should()
.BeSuccess(50);

[Fact]
public void Build_ShouldSetPage() =>
GetTemplatesRequest
.Build()
.WithPage(50)
.Create()
.Map(request => request.Page)
.Should()
.BeSuccess(50);
}
32 changes: 32 additions & 0 deletions Vonage.Test/VerifyV2/GetTemplates/RequestTest.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
#region
using Vonage.Test.Common.Extensions;
using Vonage.VerifyV2.GetTemplates;
using Xunit;
#endregion

namespace Vonage.Test.VerifyV2.GetTemplates;

[Trait("Category", "Request")]
public class RequestTest
{
[Theory]
[InlineData(null, null, "/v2/verify/templates")]
[InlineData(30, null, "/v2/verify/templates?page_size=30")]
[InlineData(null, 50, "/v2/verify/templates?page=50")]
[InlineData(30, 50, "/v2/verify/templates?page_size=30&page=50")]
public void GetEndpointPath_ShouldReturnApiEndpoint(int? pageSize, int? page, string expectedEndpoint)
{
var builder = GetTemplatesRequest.Build();
if (pageSize.HasValue)
{
builder = builder.WithPageSize(pageSize.Value);
}

if (page.HasValue)
{
builder = builder.WithPage(page.Value);
}

builder.Create().Map(request => request.GetEndpointPath()).Should().BeSuccess(expectedEndpoint);
}
}
56 changes: 56 additions & 0 deletions Vonage.Test/VerifyV2/GetTemplates/SerializationTest.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
#region
using System;
using FluentAssertions;
using Vonage.Common;
using Vonage.Serialization;
using Vonage.Test.Common;
using Vonage.Test.Common.Extensions;
using Vonage.VerifyV2;
using Vonage.VerifyV2.GetTemplates;
using Xunit;
#endregion

namespace Vonage.Test.VerifyV2.GetTemplates;

[Trait("Category", "Serialization")]
public class SerializationTest
{
private readonly SerializationTestHelper helper = new SerializationTestHelper(
typeof(SerializationTest).Namespace,
JsonSerializerBuilder.BuildWithSnakeCase());

[Fact]
public void ShouldDeserialize200() =>
this.helper.Serializer
.DeserializeObject<GetTemplatesResponse>(this.helper.GetResponseJson())
.Should()
.BeSuccess(VerifyExpectedResponse);

internal static void VerifyExpectedResponse(GetTemplatesResponse response)
{
response.PageSize.Should().Be(1);
response.Page.Should().Be(2);
response.TotalPages.Should().Be(10);
response.TotalItems.Should().Be(25);
response.Links.Self.Href.Should().Be(new Uri("https://api.nexmo.com/v2/verify/templates?page=2"));
response.Links.Next.Href.Should().Be(new Uri("https://api.nexmo.com/v2/verify/templates?page=3"));
response.Links.Previous.Href.Should().Be(new Uri("https://api.nexmo.com/v2/verify/templates?page=1"));
response.Links.Last.Href.Should().Be(new Uri("https://api.nexmo.com/v2/verify/templates?page=5"));
response.Embedded.Templates.Should().HaveCount(2);
response.Embedded.Templates.Should().BeEquivalentTo(new[]
{
new Template(new Guid("8f35a1a7-eb2f-4552-8fdf-fffdaee41bc9"), "my-template-1", true,
new TemplateLinks(
new HalLink(
new Uri("https://api.nexmo.com/v2/verify/templates/8f35a1a7-eb2f-4552-8fdf-fffdaee41bc9")),
new HalLink(new Uri(
"https://api.nexmo.com/v2/verify/templates/8f35a1a7-eb2f-4552-8fdf-fffdaee41bc9/template_fragments")))),
new Template(new Guid("0ac50843-b549-4a89-916e-848749f20040"), "my-template-2", false,
new TemplateLinks(
new HalLink(
new Uri("https://api.nexmo.com/v2/verify/templates/0ac50843-b549-4a89-916e-848749f20040")),
new HalLink(new Uri(
"https://api.nexmo.com/v2/verify/templates/0ac50843-b549-4a89-916e-848749f20040/template_fragments")))),
});
}
}
3 changes: 3 additions & 0 deletions Vonage.Test/Vonage.Test.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -1322,6 +1322,9 @@
<None Update="VerifyV2\GetTemplate\Data\ShouldDeserialize200-response.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="VerifyV2\GetTemplates\Data\ShouldDeserialize200-response.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
<Target Name="PreBuild" BeforeTargets="PreBuildEvent">
<Exec Command="node ../.scripts/init.js"/>
Expand Down
45 changes: 45 additions & 0 deletions Vonage/VerifyV2/GetTemplates/GetTemplatesRequest.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
#region
using System.Collections.Generic;
using System.Net.Http;
using Vonage.Common;
using Vonage.Common.Client;
using Vonage.Common.Monads;
#endregion

namespace Vonage.VerifyV2.GetTemplates;

/// <inheritdoc />
public readonly struct GetTemplatesRequest : IVonageRequest
{
/// <summary>
/// Number of results per page.
/// </summary>
public Maybe<int> PageSize { get; internal init; }

/// <summary>
/// The page.
/// </summary>
public Maybe<int> Page { get; internal init; }

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

/// <inheritdoc />
public string GetEndpointPath() => UriHelpers.BuildUri("/v2/verify/templates", this.GetQueryStringParameters());

private Dictionary<string, string> GetQueryStringParameters()
{
var parameters = new Dictionary<string, string>();
this.PageSize.IfSome(some => parameters.Add("page_size", some.ToString()));
this.Page.IfSome(some => parameters.Add("page", some.ToString()));
return parameters;
}

/// <summary>
/// Initializes a builder for GetTemplates.
/// </summary>
/// <returns>The builder.</returns>
public static IBuilderForOptional Build() => new GetTemplatesRequestBuilder();
}
43 changes: 43 additions & 0 deletions Vonage/VerifyV2/GetTemplates/GetTemplatesRequestBuilder.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
#region
using Vonage.Common.Client;
using Vonage.Common.Monads;
#endregion

namespace Vonage.VerifyV2.GetTemplates;

internal struct GetTemplatesRequestBuilder : IBuilderForOptional
{
private Maybe<int> page;
private Maybe<int> pageSize;

/// <inheritdoc />
public Result<GetTemplatesRequest> Create() => Result<GetTemplatesRequest>.FromSuccess(new GetTemplatesRequest
{
PageSize = this.pageSize,
Page = this.page,
});

public IBuilderForOptional WithPageSize(int value) => this with {pageSize = value};

public IBuilderForOptional WithPage(int value) => this with {page = value};
}

/// <summary>
/// Represents a builder for optional values.
/// </summary>
public interface IBuilderForOptional : IVonageRequestBuilder<GetTemplatesRequest>
{
/// <summary>
/// Sets the page size on the builder.
/// </summary>
/// <param name="value">The page size.</param>
/// <returns>The builder.</returns>
IBuilderForOptional WithPageSize(int value);

/// <summary>
/// Sets the page on the builder.
/// </summary>
/// <param name="value">The page.</param>
/// <returns>The builder.</returns>
IBuilderForOptional WithPage(int value);
}
Loading

0 comments on commit ccf80dd

Please sign in to comment.