From 5b9131886f65521eb2fe667b9e5f32170ec80f21 Mon Sep 17 00:00:00 2001 From: tr00d Date: Tue, 25 Jun 2024 08:45:47 +0200 Subject: [PATCH] feat: implement serialization for Start on ExperienceComposer --- .../Data/ShouldDeserialize200-response.json | 14 +++++ .../Start/Data/ShouldSerialize-request.json | 10 ++++ .../Start/SerializationTest.cs | 53 +++++++++++++++++++ Vonage.Test/Vonage.Test.csproj | 7 ++- .../ExperienceComposer/Start/StartRequest.cs | 23 ++++++-- 5 files changed, 103 insertions(+), 4 deletions(-) create mode 100644 Vonage.Test/Video/ExperienceComposer/Start/Data/ShouldDeserialize200-response.json create mode 100644 Vonage.Test/Video/ExperienceComposer/Start/Data/ShouldSerialize-request.json create mode 100644 Vonage.Test/Video/ExperienceComposer/Start/SerializationTest.cs diff --git a/Vonage.Test/Video/ExperienceComposer/Start/Data/ShouldDeserialize200-response.json b/Vonage.Test/Video/ExperienceComposer/Start/Data/ShouldDeserialize200-response.json new file mode 100644 index 00000000..c0b7578e --- /dev/null +++ b/Vonage.Test/Video/ExperienceComposer/Start/Data/ShouldDeserialize200-response.json @@ -0,0 +1,14 @@ +{ + "id": "1248e7070b81464c9789f46ad10e7764", + "sessionId": "flR1ZSBPY3QgMjkgMTI6MTM6MjMgUERUIDIwMTN", + "applicationId": "93e36bb9-b72c-45b6-a9ea-5c37dbc49906", + "createdAt": 1437676551000, + "callbackUrl": "https://example.com/video/events", + "updatedAt": 1437676551000, + "name": "Composed stream for Live event #1", + "url": "https://example.com/", + "resolution": "720x1280", + "status": "failed", + "streamId": "e32445b743678c98230f238", + "reason": "Could not load URL" +} \ No newline at end of file diff --git a/Vonage.Test/Video/ExperienceComposer/Start/Data/ShouldSerialize-request.json b/Vonage.Test/Video/ExperienceComposer/Start/Data/ShouldSerialize-request.json new file mode 100644 index 00000000..2bfe517b --- /dev/null +++ b/Vonage.Test/Video/ExperienceComposer/Start/Data/ShouldSerialize-request.json @@ -0,0 +1,10 @@ +{ + "sessionId": "flR1ZSBPY3QgMjkgMTI6MTM6MjMgUERUIDIwMTN", + "token": "830c9c9d-d09e-4513-9cc8-29c90a760248", + "url": "https://example.com/", + "maxDuration": 1800, + "resolution": "640x480", + "properties": { + "name": "Composed stream for Live event #1" + } +} \ No newline at end of file diff --git a/Vonage.Test/Video/ExperienceComposer/Start/SerializationTest.cs b/Vonage.Test/Video/ExperienceComposer/Start/SerializationTest.cs new file mode 100644 index 00000000..537f9a9d --- /dev/null +++ b/Vonage.Test/Video/ExperienceComposer/Start/SerializationTest.cs @@ -0,0 +1,53 @@ +using System; +using Vonage.Serialization; +using Vonage.Server; +using Vonage.Test.Common; +using Vonage.Test.Common.Extensions; +using Vonage.Video.ExperienceComposer; +using Vonage.Video.ExperienceComposer.Start; +using Xunit; + +namespace Vonage.Test.Video.ExperienceComposer.Start; + +[Trait("Category", "Serialization")] +public class SerializationTest +{ + private readonly SerializationTestHelper helper = new SerializationTestHelper( + typeof(SerializationTest).Namespace, + JsonSerializerBuilder.BuildWithCamelCase()); + + [Fact] + public void ShouldDeserialize200() => this.helper.Serializer + .DeserializeObject(this.helper.GetResponseJson()) + .Should() + .BeSuccess(BuildExpectedSession()); + + [Fact] + public void ShouldSerialize() => StartRequest + .Build() + .WithApplicationId(Guid.NewGuid()) + .WithSessionId("flR1ZSBPY3QgMjkgMTI6MTM6MjMgUERUIDIwMTN") + .WithToken("830c9c9d-d09e-4513-9cc8-29c90a760248") + .WithUrl(new Uri("https://example.com/")) + .WithResolution(RenderResolution.StandardDefinitionLandscape) + .WithName("Composed stream for Live event #1") + .WithMaxDuration(1800) + .Create() + .GetStringContent() + .Should() + .BeSuccess(this.helper.GetRequestJson()); + + internal static Session BuildExpectedSession() => + new Session("1248e7070b81464c9789f46ad10e7764", + "flR1ZSBPY3QgMjkgMTI6MTM6MjMgUERUIDIwMTN", + new Guid("93e36bb9-b72c-45b6-a9ea-5c37dbc49906"), + 1437676551000, + new Uri("https://example.com/video/events"), + 1437676551000, + "Composed stream for Live event #1", + new Uri("https://example.com/"), + RenderResolution.HighDefinitionPortrait, + SessionStatus.Failed, + "e32445b743678c98230f238", + "Could not load URL"); +} \ No newline at end of file diff --git a/Vonage.Test/Vonage.Test.csproj b/Vonage.Test/Vonage.Test.csproj index 0f72b760..821a4c7b 100644 --- a/Vonage.Test/Vonage.Test.csproj +++ b/Vonage.Test/Vonage.Test.csproj @@ -47,7 +47,6 @@ - PreserveNewest @@ -1240,6 +1239,12 @@ PreserveNewest + + PreserveNewest + + + PreserveNewest + diff --git a/Vonage/Video/ExperienceComposer/Start/StartRequest.cs b/Vonage/Video/ExperienceComposer/Start/StartRequest.cs index 68e77043..6a190774 100644 --- a/Vonage/Video/ExperienceComposer/Start/StartRequest.cs +++ b/Vonage/Video/ExperienceComposer/Start/StartRequest.cs @@ -1,43 +1,60 @@ using System; using System.Net.Http; +using System.Text; +using System.Text.Json.Serialization; using Vonage.Common.Client; +using Vonage.Serialization; using Vonage.Server; namespace Vonage.Video.ExperienceComposer.Start; /// -public struct StartRequest : IVonageRequest +public readonly struct StartRequest : IVonageRequest { /// - /// + [JsonIgnore] public Guid ApplicationId { get; internal init; } /// /// + /// + [JsonPropertyOrder(0)] public string SessionId { get; internal init; } /// /// + [JsonPropertyOrder(1)] public string Token { get; internal init; } /// /// + [JsonPropertyOrder(2)] public Uri Url { get; internal init; } /// /// + [JsonPropertyOrder(3)] public int MaxDuration { get; internal init; } /// /// + [JsonPropertyOrder(4)] public RenderResolution Resolution { get; internal init; } /// /// + [JsonPropertyOrder(5)] public StartProperties Properties { get; internal init; } /// - public HttpRequestMessage BuildRequestMessage() => throw new NotImplementedException(); + public HttpRequestMessage BuildRequestMessage() => VonageRequestBuilder + .Initialize(HttpMethod.Post, this.GetEndpointPath()) + .WithContent(this.GetRequestContent()) + .Build(); + + private StringContent GetRequestContent() => + new StringContent(JsonSerializerBuilder.BuildWithCamelCase().SerializeObject(this), Encoding.UTF8, + "application/json"); /// public string GetEndpointPath() => $"/v2/project/{this.ApplicationId}/render";