Skip to content

Commit

Permalink
feat: implement Stop on ExperienceComposer
Browse files Browse the repository at this point in the history
  • Loading branch information
Tr00d committed Jun 21, 2024
1 parent 53d26c0 commit 1710977
Show file tree
Hide file tree
Showing 5 changed files with 145 additions and 3 deletions.
31 changes: 31 additions & 0 deletions Vonage.Test/Video/ExperienceComposer/Stop/E2ETest.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
using System;
using System.Net;
using System.Threading.Tasks;
using Vonage.Test.Common.Extensions;
using Vonage.Video.ExperienceComposer.Stop;
using WireMock.ResponseBuilders;
using Xunit;

namespace Vonage.Test.Video.ExperienceComposer.Stop;

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

[Fact]
public async Task Stop()
{
this.Helper.Server.Given(WireMock.RequestBuilders.Request.Create()
.WithPath("/v2/project/e3e78a75-221d-41ec-8846-25ae3db1943a/render/EXP-123")
.WithHeader("Authorization", this.Helper.ExpectedAuthorizationHeaderValue)
.UsingDelete())
.RespondWith(Response.Create().WithStatusCode(HttpStatusCode.OK));
await this.Helper.VonageClient.VideoClient.ExperienceComposerClient
.StopAsync(StopRequest.Parse(new Guid("e3e78a75-221d-41ec-8846-25ae3db1943a"), "EXP-123"))
.Should()
.BeSuccessAsync();
}
}
49 changes: 49 additions & 0 deletions Vonage.Test/Video/ExperienceComposer/Stop/RequestTest.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
using System;
using Vonage.Test.Common.Extensions;
using Vonage.Video.ExperienceComposer.Stop;
using Xunit;

namespace Vonage.Test.Video.ExperienceComposer.Stop;

[Trait("Category", "Request")]
public class RequestTest
{
private const string ValidExperienceComposerId = "EXP-123";
private readonly Guid validApplicationId = Guid.NewGuid();

[Fact]
public void GetEndpointPath_ShouldReturnApiEndpoint() =>
StopRequest.Parse(this.validApplicationId, ValidExperienceComposerId)
.Map(request => request.GetEndpointPath())
.Should()
.BeSuccess($"/v2/project/{this.validApplicationId}/render/EXP-123");

[Theory]
[InlineData("")]
[InlineData(" ")]
[InlineData(null)]
public void Parse_ShouldReturnFailure_GivenExperienceComposerIdIsEmpty(string invalidId) =>
StopRequest.Parse(Guid.NewGuid(), invalidId)
.Should()
.BeParsingFailure("ExperienceComposerId cannot be null or whitespace.");

[Fact]
public void Parse_ShouldReturnFailure_GivenApplicationIdIsEmpty() =>
StopRequest.Parse(Guid.Empty, ValidExperienceComposerId)
.Should()
.BeParsingFailure("ApplicationId cannot be empty.");

[Fact]
public void Parse_ShouldSetApplicationId() =>
StopRequest.Parse(this.validApplicationId, ValidExperienceComposerId)
.Map(request => request.ApplicationId)
.Should()
.BeSuccess(this.validApplicationId);

[Fact]
public void Parse_ShouldSetExperienceComposerId() =>
StopRequest.Parse(this.validApplicationId, ValidExperienceComposerId)
.Map(request => request.ExperienceComposerId)
.Should()
.BeSuccess(ValidExperienceComposerId);
}
12 changes: 12 additions & 0 deletions Vonage/Video/ExperienceComposer/ExperienceComposerClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
using Vonage.Serialization;
using Vonage.Video.ExperienceComposer.GetSession;
using Vonage.Video.ExperienceComposer.GetSessions;
using Vonage.Video.ExperienceComposer.Stop;

namespace Vonage.Video.ExperienceComposer;

Expand All @@ -28,6 +29,17 @@ public class ExperienceComposerClient
public Task<Result<Session>> GetSessionAsync(Result<GetSessionRequest> request) =>
this.vonageClient.SendWithResponseAsync<GetSessionRequest, Session>(request);

/// <summary>
/// Stops an Experience Composer session.
/// </summary>
/// <param name="request">The request.</param>
/// <returns>
/// A success state with the archive if the operation succeeded. A failure state with the error message if it
/// failed.
/// </returns>
public Task<Result<Unit>> StopAsync(Result<StopRequest> request) =>
this.vonageClient.SendAsync(request);

/// <summary>
/// Retrieves all experience composer sessions in an application.
/// </summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,13 +32,13 @@ namespace Vonage.Video.ExperienceComposer.GetSession;
/// <summary>
/// Parses the input into a GetEventRequest.
/// </summary>
/// <param name="application">The application Id.</param>
/// <param name="applicationId">The application Id.</param>
/// <param name="experienceComposerId">The experience composer 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<GetSessionRequest> Parse(Guid application, string experienceComposerId) =>
public static Result<GetSessionRequest> Parse(Guid applicationId, string experienceComposerId) =>
Result<GetSessionRequest>
.FromSuccess(new GetSessionRequest
{ApplicationId = application, ExperienceComposerId = experienceComposerId})
{ApplicationId = applicationId, ExperienceComposerId = experienceComposerId})
.Map(InputEvaluation<GetSessionRequest>.Evaluate)
.Bind(evaluation => evaluation.WithRules(VerifyExperienceComposerId, VerifyApplicationId));

Expand Down
50 changes: 50 additions & 0 deletions Vonage/Video/ExperienceComposer/Stop/StopRequest.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
using System;
using System.Net.Http;
using Vonage.Common.Client;
using Vonage.Common.Client.Builders;
using Vonage.Common.Monads;
using Vonage.Common.Validation;

namespace Vonage.Video.ExperienceComposer.Stop;

/// <summary>
/// Represents a request to retrieve a session.
/// </summary>
public readonly struct StopRequest : IVonageRequest, IHasApplicationId
{
/// <inheritdoc />
public Guid ApplicationId { get; internal init; }

/// <summary>
/// ID of the Experience Composer instance
/// </summary>
public string ExperienceComposerId { get; internal init; }

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

/// <inheritdoc />
public string GetEndpointPath() => $"/v2/project/{this.ApplicationId}/render/{this.ExperienceComposerId}";

/// <summary>
/// Parses the input into a GetEventRequest.
/// </summary>
/// <param name="applicationId">The application Id.</param>
/// <param name="experienceComposerId">The experience composer 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<StopRequest> Parse(Guid applicationId, string experienceComposerId) =>
Result<StopRequest>
.FromSuccess(new StopRequest
{ApplicationId = applicationId, ExperienceComposerId = experienceComposerId})
.Map(InputEvaluation<StopRequest>.Evaluate)
.Bind(evaluation => evaluation.WithRules(VerifyExperienceComposerId, VerifyApplicationId));

private static Result<StopRequest> VerifyExperienceComposerId(StopRequest request) =>
InputValidation.VerifyNotEmpty(request, request.ExperienceComposerId, nameof(ExperienceComposerId));

private static Result<StopRequest> VerifyApplicationId(StopRequest request) =>
InputValidation.VerifyNotEmpty(request, request.ApplicationId, nameof(ApplicationId));
}

0 comments on commit 1710977

Please sign in to comment.