Skip to content

Commit

Permalink
feat: implement request validation for Start in ExperienceComposer
Browse files Browse the repository at this point in the history
  • Loading branch information
Tr00d committed Jun 24, 2024
1 parent 1710977 commit 6d6f1bf
Show file tree
Hide file tree
Showing 5 changed files with 475 additions and 0 deletions.
236 changes: 236 additions & 0 deletions Vonage.Test/Video/ExperienceComposer/Start/RequestBuilderTest.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,236 @@
using System;
using Vonage.Server;
using Vonage.Test.Common.Extensions;
using Vonage.Video.ExperienceComposer.Start;
using Xunit;

namespace Vonage.Test.Video.ExperienceComposer.Start;

[Trait("Category", "Request")]
public class RequestBuilderTest
{
private const string ValidSessionId = "session-id";
private const string ValidToken = "token";
private const RenderResolution ValidResolution = RenderResolution.FullHighDefinitionPortrait;
private const string ValidName = "name";
private readonly Guid validApplicationId = Guid.NewGuid();
private readonly Uri validUri = new Uri("https://example.com");

[Fact]
public void Build_ShouldSetApplicationId() =>
StartRequest
.Build()
.WithApplicationId(this.validApplicationId)
.WithSessionId(ValidSessionId)
.WithToken(ValidToken)
.WithUrl(this.validUri)
.WithResolution(ValidResolution)
.WithName(ValidName)
.Create()
.Map(request => request.ApplicationId)
.Should()
.BeSuccess(this.validApplicationId);

[Fact]
public void Build_ShouldSetSessionId() =>
StartRequest
.Build()
.WithApplicationId(this.validApplicationId)
.WithSessionId(ValidSessionId)
.WithToken(ValidToken)
.WithUrl(this.validUri)
.WithResolution(ValidResolution)
.WithName(ValidName)
.Create()
.Map(request => request.SessionId)
.Should()
.BeSuccess(ValidSessionId);

[Fact]
public void Build_ShouldSetToken() =>
StartRequest
.Build()
.WithApplicationId(this.validApplicationId)
.WithSessionId(ValidSessionId)
.WithToken(ValidToken)
.WithUrl(this.validUri)
.WithResolution(ValidResolution)
.WithName(ValidName)
.Create()
.Map(request => request.Token)
.Should()
.BeSuccess(ValidToken);

[Fact]
public void Build_ShouldSetUrl() =>
StartRequest
.Build()
.WithApplicationId(this.validApplicationId)
.WithSessionId(ValidSessionId)
.WithToken(ValidToken)
.WithUrl(this.validUri)
.WithResolution(ValidResolution)
.WithName(ValidName)
.Create()
.Map(request => request.Url)
.Should()
.BeSuccess(this.validUri);

[Fact]
public void Build_ShouldSetResolution() =>
StartRequest
.Build()
.WithApplicationId(this.validApplicationId)
.WithSessionId(ValidSessionId)
.WithToken(ValidToken)
.WithUrl(this.validUri)
.WithResolution(ValidResolution)
.WithName(ValidName)
.Create()
.Map(request => request.Resolution)
.Should()
.BeSuccess(ValidResolution);

[Fact]
public void Build_ShouldSetName() =>
StartRequest
.Build()
.WithApplicationId(this.validApplicationId)
.WithSessionId(ValidSessionId)
.WithToken(ValidToken)
.WithUrl(this.validUri)
.WithResolution(ValidResolution)
.WithName(ValidName)
.Create()
.Map(request => request.Properties)
.Should()
.BeSuccess(new StartProperties(ValidName));

[Theory]
[InlineData(60)]
[InlineData(36000)]
public void Build_ShouldSetMaxDuration(int validDuration) =>
StartRequest
.Build()
.WithApplicationId(this.validApplicationId)
.WithSessionId(ValidSessionId)
.WithToken(ValidToken)
.WithUrl(this.validUri)
.WithResolution(ValidResolution)
.WithName(ValidName)
.WithMaxDuration(validDuration)
.Create()
.Map(request => request.MaxDuration)
.Should()
.BeSuccess(validDuration);

[Fact]
public void Build_ShouldHaveDefaultMaxDuration() =>
StartRequest
.Build()
.WithApplicationId(this.validApplicationId)
.WithSessionId(ValidSessionId)
.WithToken(ValidToken)
.WithUrl(this.validUri)
.WithResolution(ValidResolution)
.WithName(ValidName)
.Create()
.Map(request => request.MaxDuration)
.Should()
.BeSuccess(7200);

[Theory]
[InlineData("")]
[InlineData(" ")]
[InlineData(null)]
public void Parse_ShouldReturnFailure_GivenSessionIdIsEmpty(string invalidId) =>
StartRequest
.Build()
.WithApplicationId(this.validApplicationId)
.WithSessionId(invalidId)
.WithToken(ValidToken)
.WithUrl(this.validUri)
.WithResolution(ValidResolution)
.WithName(ValidName)
.Create()
.Should()
.BeParsingFailure("SessionId cannot be null or whitespace.");

[Theory]
[InlineData("")]
[InlineData(" ")]
[InlineData(null)]
public void Parse_ShouldReturnFailure_GivenTokenIsEmpty(string invalidToken) =>
StartRequest
.Build()
.WithApplicationId(this.validApplicationId)
.WithSessionId(invalidToken)
.WithToken(ValidToken)
.WithUrl(this.validUri)
.WithResolution(ValidResolution)
.WithName(ValidName)
.Create()
.Should()
.BeParsingFailure("SessionId cannot be null or whitespace.");

[Theory]
[InlineData("")]
[InlineData(" ")]
[InlineData(null)]
public void Parse_ShouldReturnFailure_GivenNameIsEmpty(string invalidName) =>
StartRequest
.Build()
.WithApplicationId(this.validApplicationId)
.WithSessionId(ValidSessionId)
.WithToken(ValidToken)
.WithUrl(this.validUri)
.WithResolution(ValidResolution)
.WithName(invalidName)
.Create()
.Should()
.BeParsingFailure("Name cannot be null or whitespace.");

[Fact]
public void Parse_ShouldReturnFailure_GivenApplicationIdIsEmpty() =>
StartRequest
.Build()
.WithApplicationId(Guid.Empty)
.WithSessionId(ValidSessionId)
.WithToken(ValidToken)
.WithUrl(this.validUri)
.WithResolution(ValidResolution)
.WithName(ValidName)
.Create()
.Should()
.BeParsingFailure("ApplicationId cannot be empty.");

[Fact]
public void Build_ShouldReturnFailure_GivenMaxDurationIsLowerThanSixty() =>
StartRequest
.Build()
.WithApplicationId(this.validApplicationId)
.WithSessionId(ValidSessionId)
.WithToken(ValidToken)
.WithUrl(this.validUri)
.WithResolution(ValidResolution)
.WithName(ValidName)
.WithMaxDuration(59)
.Create()
.Should()
.BeParsingFailure("MaxDuration cannot be lower than 60.");

[Fact]
public void Build_ShouldReturnFailure_GivenMaxDurationIsHigherThanThirtySixThousand() =>
StartRequest
.Build()
.WithApplicationId(this.validApplicationId)
.WithSessionId(ValidSessionId)
.WithToken(ValidToken)
.WithUrl(this.validUri)
.WithResolution(ValidResolution)
.WithName(ValidName)
.WithMaxDuration(36001)
.Create()
.Should()
.BeParsingFailure("MaxDuration cannot be higher than 36000.");
}
1 change: 1 addition & 0 deletions Vonage.Test/Vonage.Test.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@
</ItemGroup>

<ItemGroup>
<Folder Include="Video\ExperienceComposer\Start\Data\"/>
<None Update="Data\NccoTests\TestRecord-request.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
Expand Down
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.Start;
using Vonage.Video.ExperienceComposer.Stop;

namespace Vonage.Video.ExperienceComposer;
Expand Down Expand Up @@ -40,6 +41,17 @@ public class ExperienceComposerClient
public Task<Result<Unit>> StopAsync(Result<StopRequest> request) =>
this.vonageClient.SendAsync(request);

/// <summary>
/// Starts 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<Session>> StartAsync(Result<StartRequest> request) =>
this.vonageClient.SendWithResponseAsync<StartRequest, Session>(request);

/// <summary>
/// Retrieves all experience composer sessions in an application.
/// </summary>
Expand Down
55 changes: 55 additions & 0 deletions Vonage/Video/ExperienceComposer/Start/StartRequest.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
using System;
using System.Net.Http;
using Vonage.Common.Client;
using Vonage.Server;

namespace Vonage.Video.ExperienceComposer.Start;

/// <inheritdoc />
public struct StartRequest : IVonageRequest
{
/// <summary>
/// </summary>
public Guid ApplicationId { get; internal init; }

/// <summary>
/// </summary>
public string SessionId { get; internal init; }

/// <summary>
/// </summary>
public string Token { get; internal init; }

/// <summary>
/// </summary>
public Uri Url { get; internal init; }

/// <summary>
/// </summary>
public int MaxDuration { get; internal init; }

/// <summary>
/// </summary>
public RenderResolution Resolution { get; internal init; }

/// <summary>
/// </summary>
public StartProperties Properties { get; internal init; }

/// <inheritdoc />
public HttpRequestMessage BuildRequestMessage() => throw new NotImplementedException();

/// <inheritdoc />
public string GetEndpointPath() => throw new NotImplementedException();

/// <summary>
/// Initializes a builder.
/// </summary>
/// <returns>The builder.</returns>
public static IBuilderForApplicationId Build() => new StartRequestBuilder();
}

/// <summary>
/// </summary>
/// <param name="Name"></param>
public record StartProperties(string Name);
Loading

0 comments on commit 6d6f1bf

Please sign in to comment.