Skip to content

Commit

Permalink
feat: implement DeleteEvent in Conversations
Browse files Browse the repository at this point in the history
  • Loading branch information
Tr00d committed Jun 5, 2024
1 parent 5b75177 commit 0ddedaa
Show file tree
Hide file tree
Showing 5 changed files with 143 additions and 0 deletions.
29 changes: 29 additions & 0 deletions Vonage.Test/Conversations/DeleteEvent/E2ETest.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
using System.Net;
using System.Threading.Tasks;
using Vonage.Test.Common.Extensions;
using WireMock.ResponseBuilders;
using Xunit;

namespace Vonage.Test.Conversations.DeleteEvent;

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

[Fact]
public async Task DeleteEvent()
{
this.Helper.Server.Given(WireMock.RequestBuilders.Request.Create()
.WithPath("/v1/conversations/CON-123/events/EVE-123")
.WithHeader("Authorization", this.Helper.ExpectedAuthorizationHeaderValue)
.UsingDelete())
.RespondWith(Response.Create().WithStatusCode(HttpStatusCode.OK));
await this.Helper.VonageClient.ConversationsClient
.DeleteEventAsync(RequestTest.BuildRequest())
.Should()
.BeSuccessAsync();
}
}
55 changes: 55 additions & 0 deletions Vonage.Test/Conversations/DeleteEvent/RequestTest.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
using Vonage.Common.Monads;
using Vonage.Conversations.DeleteEvent;
using Vonage.Test.Common.Extensions;
using Xunit;

namespace Vonage.Test.Conversations.DeleteEvent;

[Trait("Category", "Request")]
public class RequestTest
{
private const string ValidConversationId = "CON-123";
private const string ValidEventId = "EVE-123";

[Fact]
public void GetEndpointPath_ShouldReturnApiEndpoint() =>
BuildRequest()
.Map(request => request.GetEndpointPath())
.Should()
.BeSuccess("/v1/conversations/CON-123/events/EVE-123");

internal static Result<DeleteEventRequest> BuildRequest() =>
DeleteEventRequest.Parse(ValidConversationId, ValidEventId);

[Theory]
[InlineData("")]
[InlineData(" ")]
[InlineData(null)]
public void Parse_ShouldReturnFailure_GivenConversationIdIsEmpty(string invalidId) =>
DeleteEventRequest.Parse(invalidId, ValidEventId)
.Should()
.BeParsingFailure("ConversationId cannot be null or whitespace.");

[Theory]
[InlineData("")]
[InlineData(" ")]
[InlineData(null)]
public void Parse_ShouldReturnFailure_GivenEventIdIsEmpty(string invalidId) =>
DeleteEventRequest.Parse(ValidConversationId, invalidId)
.Should()
.BeParsingFailure("EventId cannot be null or whitespace.");

[Fact]
public void Parse_ShouldSetConversationId() =>
BuildRequest()
.Map(request => request.ConversationId)
.Should()
.BeSuccess("CON-123");

[Fact]
public void Parse_ShouldSetEventId() =>
BuildRequest()
.Map(request => request.EventId)
.Should()
.BeSuccess("EVE-123");
}
5 changes: 5 additions & 0 deletions Vonage/Conversations/ConversationsClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
using Vonage.Conversations.CreateConversation;
using Vonage.Conversations.CreateMember;
using Vonage.Conversations.DeleteConversation;
using Vonage.Conversations.DeleteEvent;
using Vonage.Conversations.GetConversation;
using Vonage.Conversations.GetConversations;
using Vonage.Conversations.GetMember;
Expand Down Expand Up @@ -35,6 +36,10 @@ internal class ConversationsClient : IConversationsClient
public Task<Result<Unit>> DeleteConversationAsync(Result<DeleteConversationRequest> request) =>
this.vonageClient.SendAsync(request);

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

/// <inheritdoc />
public Task<Result<Conversation>> GetConversationAsync(Result<GetConversationRequest> request) =>
this.vonageClient.SendWithResponseAsync<GetConversationRequest, Conversation>(request);
Expand Down
46 changes: 46 additions & 0 deletions Vonage/Conversations/DeleteEvent/DeleteEventRequest.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
using System.Net.Http;
using Vonage.Common.Client;
using Vonage.Common.Monads;
using Vonage.Common.Validation;

namespace Vonage.Conversations.DeleteEvent;

/// <inheritdoc />
public readonly struct DeleteEventRequest : IVonageRequest
{
/// <summary>
/// The conversation Id.
/// </summary>
public string ConversationId { get; private init; }

/// <summary>
/// The event Id.
/// </summary>
public string EventId { get; private init; }

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

/// <inheritdoc />
public string GetEndpointPath() => $"/v1/conversations/{this.ConversationId}/events/{this.EventId}";

/// <summary>
/// Parses the input into a DeleteEventRequest.
/// </summary>
/// <param name="conversationId">The conversation Id.</param>
/// <param name="eventId">The event Id.</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<DeleteEventRequest> Parse(string conversationId, string eventId) =>
Result<DeleteEventRequest>
.FromSuccess(new DeleteEventRequest {ConversationId = conversationId, EventId = eventId})
.Map(InputEvaluation<DeleteEventRequest>.Evaluate)
.Bind(evaluation => evaluation.WithRules(VerifyConversationId, VerifyEventId));

private static Result<DeleteEventRequest> VerifyConversationId(DeleteEventRequest request) =>
InputValidation.VerifyNotEmpty(request, request.ConversationId, nameof(ConversationId));

private static Result<DeleteEventRequest> VerifyEventId(DeleteEventRequest request) =>
InputValidation.VerifyNotEmpty(request, request.EventId, nameof(EventId));
}
8 changes: 8 additions & 0 deletions Vonage/Conversations/IConversationsClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
using Vonage.Conversations.CreateConversation;
using Vonage.Conversations.CreateMember;
using Vonage.Conversations.DeleteConversation;
using Vonage.Conversations.DeleteEvent;
using Vonage.Conversations.GetConversation;
using Vonage.Conversations.GetConversations;
using Vonage.Conversations.GetMember;
Expand Down Expand Up @@ -32,6 +33,13 @@ public interface IConversationsClient
/// <returns>Success or Failure.</returns>
Task<Result<Unit>> DeleteConversationAsync(Result<DeleteConversationRequest> request);

/// <summary>
/// Deletes an event.
/// </summary>
/// <param name="request">The request.</param>
/// <returns>Success or Failure.</returns>
Task<Result<Unit>> DeleteEventAsync(Result<DeleteEventRequest> request);

/// <summary>
/// Retrieves a conversation.
/// </summary>
Expand Down

0 comments on commit 0ddedaa

Please sign in to comment.