Skip to content

Commit

Permalink
feat: implement request creation from HalLink for GetUserConversations
Browse files Browse the repository at this point in the history
  • Loading branch information
Tr00d committed Jan 25, 2024
1 parent 91a6132 commit 68fbbd5
Show file tree
Hide file tree
Showing 3 changed files with 118 additions and 3 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
using System;
using System.Globalization;
using Vonage.Common.Monads;
using Vonage.Conversations;
using Vonage.Conversations.GetUserConversations;
using Vonage.Test.Common.Extensions;
using Xunit;

namespace Vonage.Test.Conversations.GetUserConversations;

public class GetUserConversationsHalLinkTest
{
[Fact]
public void BuildRequestForPrevious_ShouldReturnSuccess() =>
new GetUserConversationsHalLink(
new Uri("https://api.nexmo.com/v1/users/US-123/conversations?order=desc&page_size=10"))
.BuildRequest()
.Should()
.BeSuccess(new GetUserConversationsRequest
{
Order = FetchOrder.Descending, PageSize = 10, UserId = "US-123",
StartDate = Maybe<DateTimeOffset>.None,
Cursor = Maybe<string>.None,
State = Maybe<State>.None,
OrderBy = "created",
IncludeCustomData = false,
});

[Fact]
public void BuildRequestForPrevious_ShouldReturnSuccess_WithCursor() =>
new GetUserConversationsHalLink(new Uri(
"https://api.nexmo.com/v1/users/US-123/conversations?order=desc&page_size=10&cursor=7EjDNQrAcipmOnc0HCzpQRkhBULzY44ljGUX4lXKyUIVfiZay5pv9wg%3D"))
.BuildRequest()
.Map(request => request.Cursor)
.Should()
.BeSuccess("7EjDNQrAcipmOnc0HCzpQRkhBULzY44ljGUX4lXKyUIVfiZay5pv9wg=");

[Fact]
public void BuildRequestForPrevious_ShouldReturnSuccess_WithStartDate() =>
new GetUserConversationsHalLink(new Uri(
"https://api.nexmo.com/v1/users/US-123/conversations?order=desc&page_size=10&date_start=2023-12-18T09%3A56%3A08Z"))
.BuildRequest()
.Map(request => request.StartDate)
.Should()
.BeSuccess(DateTimeOffset.Parse("2023-12-18T09:56:08Z", CultureInfo.InvariantCulture));

[Fact]
public void BuildRequestForPrevious_ShouldReturnSuccess_WithOrderBy() =>
new GetUserConversationsHalLink(new Uri(
"https://api.nexmo.com/v1/users/US-123/conversations?order=desc&page_size=10&order_by=custom"))
.BuildRequest()
.Map(request => request.OrderBy)
.Should()
.BeSuccess("custom");

[Fact]
public void BuildRequestForPrevious_ShouldReturnSuccess_WithIncludeCustomData() =>
new GetUserConversationsHalLink(new Uri(
"https://api.nexmo.com/v1/users/US-123/conversations?order=desc&page_size=10&include_custom_data=true"))
.BuildRequest()
.Map(request => request.IncludeCustomData)
.Should()
.BeSuccess(true);

[Fact]
public void BuildRequestForPrevious_ShouldReturnSuccess_WithState() =>
new GetUserConversationsHalLink(new Uri(
"https://api.nexmo.com/v1/users/US-123/conversations?order=desc&page_size=10&state=joined"))
.BuildRequest()
.Map(request => request.State)
.Should()
.BeSuccess(State.Joined);
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,12 @@ namespace Vonage.Conversations.GetUserConversations;

internal class GetUserConversationsRequestBuilder : IBuilderForUserId, IBuilderForOptional
{
public const string DefaultOrderBy = "created";
private const int MaximumPageSize = 100;
private const int MinimumPageSize = 1;
private bool includeCustomData;
private FetchOrder order = FetchOrder.Ascending;
private string orderBy = "created";
private string orderBy = DefaultOrderBy;
private int pageSize = 10;
private Maybe<DateTimeOffset> startDate;
private Maybe<State> state;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,44 @@
namespace Vonage.Conversations.GetUserConversations;
using System;
using System.Globalization;
using System.Web;
using EnumsNET;
using Vonage.Common.Monads;

public record GetUserConversationsRequestResponse;
namespace Vonage.Conversations.GetUserConversations;

public record GetUserConversationsRequestResponse;

/// <summary>
/// Represents a link to another resource.
/// </summary>
/// <param name="Href">Hyperlink reference.</param>
public record GetUserConversationsHalLink(Uri Href)
{
/// <summary>
/// Transforms the link into a GetUserConversationsRequest using the cursor pagination.
/// </summary>
/// <returns></returns>
public Result<GetUserConversationsRequest> BuildRequest()
{
var queryParameters = HttpUtility.ParseQueryString(this.Href.Query);
var userId = this.Href.AbsolutePath.Replace("/v1/users/", string.Empty).Replace("/conversations", string.Empty);
var pageSize = queryParameters["page_size"];
var order = queryParameters["order"];
var orderBy = queryParameters["order_by"] ?? Maybe<string>.None;
var cursor = queryParameters["cursor"] ?? Maybe<string>.None;
var startDate = queryParameters["date_start"] ?? Maybe<string>.None;
var includeCustomData = queryParameters["include_custom_data"] ?? Maybe<string>.None;
var state = queryParameters["state"] ?? Maybe<string>.None;
return Result<GetUserConversationsRequest>.FromSuccess(new GetUserConversationsRequest
{
Cursor = cursor,
IncludeCustomData = includeCustomData.Match(bool.Parse, () => false),
Order = Enums.Parse<FetchOrder>(order, false, EnumFormat.Description),
OrderBy = orderBy.IfNone(GetUserConversationsRequestBuilder.DefaultOrderBy),
PageSize = int.Parse(pageSize),
StartDate = startDate.Map(value => DateTimeOffset.Parse(value, CultureInfo.InvariantCulture)),
State = state.Map(value => Enums.Parse<State>(value, false, EnumFormat.Description)),
UserId = userId,
});
}
}

0 comments on commit 68fbbd5

Please # to comment.