From 390b6f56c50782b3be1ef09078650824e73a6d54 Mon Sep 17 00:00:00 2001 From: Stevan Freeborn <65925598+StevanFreeborn@users.noreply.github.com> Date: Sat, 31 May 2025 21:58:18 -0500 Subject: [PATCH] tests: add tests for data client --- .../StevesBot.Webhook.Tests.csproj | 2 +- .../Unit/SubscribeTaskTests.cs | 4 +- .../Unit/YouTubeDataApiClientTests.cs | 81 +++++++++++++++++++ .../Unit/YouTubeLiveStreamingDetailsTests.cs | 42 ++++++++++ 4 files changed, 126 insertions(+), 3 deletions(-) create mode 100644 src/tests/StevesBot.Webhook.Tests/Unit/YouTubeDataApiClientTests.cs create mode 100644 src/tests/StevesBot.Webhook.Tests/Unit/YouTubeLiveStreamingDetailsTests.cs diff --git a/src/tests/StevesBot.Webhook.Tests/StevesBot.Webhook.Tests.csproj b/src/tests/StevesBot.Webhook.Tests/StevesBot.Webhook.Tests.csproj index f84a1e3..eedb9b8 100644 --- a/src/tests/StevesBot.Webhook.Tests/StevesBot.Webhook.Tests.csproj +++ b/src/tests/StevesBot.Webhook.Tests/StevesBot.Webhook.Tests.csproj @@ -27,7 +27,7 @@ ./TestResults/Coverage/ cobertura [StevesBot.Webhook]* - **/Program.cs,**/Worker.cs + **/Program.cs,**/SubscriptionWorker.cs diff --git a/src/tests/StevesBot.Webhook.Tests/Unit/SubscribeTaskTests.cs b/src/tests/StevesBot.Webhook.Tests/Unit/SubscribeTaskTests.cs index 463a642..2c63a3b 100644 --- a/src/tests/StevesBot.Webhook.Tests/Unit/SubscribeTaskTests.cs +++ b/src/tests/StevesBot.Webhook.Tests/Unit/SubscribeTaskTests.cs @@ -9,7 +9,7 @@ public class SubscribeTaskTests task.CallbackUrl.Should().BeEmpty(); task.TopicUrl.Should().BeEmpty(); - task.ExpiresAt.Should().Be(DateTime.MinValue); + task.ExpiresAt.Should().Be(DateTimeOffset.MinValue); } [Fact] @@ -23,7 +23,7 @@ public class SubscribeTaskTests { CallbackUrl = callbackUrl, TopicUrl = topicUrl, - ExpiresAt = expiresAt + ExpiresAt = expiresAt, }; task.CallbackUrl.Should().Be(callbackUrl); diff --git a/src/tests/StevesBot.Webhook.Tests/Unit/YouTubeDataApiClientTests.cs b/src/tests/StevesBot.Webhook.Tests/Unit/YouTubeDataApiClientTests.cs new file mode 100644 index 0000000..1021642 --- /dev/null +++ b/src/tests/StevesBot.Webhook.Tests/Unit/YouTubeDataApiClientTests.cs @@ -0,0 +1,81 @@ +using System.Text.Json; + +using Microsoft.Extensions.Options; + +namespace StevesBot.Webhook.Tests.Unit; + +public sealed class YouTubeDataApiClientTests : IDisposable +{ + private readonly MockHttpMessageHandler _mockHttpMessageHandler = new(); + private readonly Mock> _mockLogger = new(); + private readonly Mock> _mockOptions = new(); + private readonly YouTubeDataApiClient _sut; + + public YouTubeDataApiClientTests() + { + var httpClient = _mockHttpMessageHandler.ToHttpClient(); + httpClient.BaseAddress = new Uri("https://test.com"); + + _mockOptions + .Setup(static x => x.Value) + .Returns(new YouTubeClientOptions()); + + _sut = new(httpClient, _mockLogger.Object, _mockOptions.Object); + } + + [Fact] + public async Task GetVideoByIdAsync_WhenRequestFails_ItShouldReturnNull() + { + _mockHttpMessageHandler + .When("*/videos") + .Respond(HttpStatusCode.InternalServerError); + + var result = await _sut.GetVideoByIdAsync("video_id"); + + result.Should().BeNull(); + } + + [Fact] + public async Task GetVideoByIdAsync_WhenRequestSucceedsButItemsEmpty_ItShouldReturnNull() + { + var videosResponse = new YouTubeVideoListResponse(); + + _mockHttpMessageHandler + .When("*/videos") + .Respond( + HttpStatusCode.OK, + "application/json", + JsonSerializer.Serialize(videosResponse) + ); + + var result = await _sut.GetVideoByIdAsync("video_id", ["snippet"]); + + result.Should().BeNull(); + } + + [Fact] + public async Task GetVideoByIdAsync_WhenRequestSucceedsAndVideoFound_ItShouldReturnVideo() + { + var videoId = "video_id"; + var video = new YouTubeVideo() { Id = videoId }; + var videosResponse = new YouTubeVideoListResponse() { Items = [video] }; + + _mockHttpMessageHandler + .When("*/videos") + .Respond( + HttpStatusCode.OK, + "application/json", + JsonSerializer.Serialize(videosResponse) + ); + + var result = await _sut.GetVideoByIdAsync(videoId); + + result.Should().BeEquivalentTo(video); + + } + + public void Dispose() + { + _mockHttpMessageHandler.Dispose(); + } +} \ No newline at end of file diff --git a/src/tests/StevesBot.Webhook.Tests/Unit/YouTubeLiveStreamingDetailsTests.cs b/src/tests/StevesBot.Webhook.Tests/Unit/YouTubeLiveStreamingDetailsTests.cs new file mode 100644 index 0000000..004d2c6 --- /dev/null +++ b/src/tests/StevesBot.Webhook.Tests/Unit/YouTubeLiveStreamingDetailsTests.cs @@ -0,0 +1,42 @@ +namespace StevesBot.Webhook.Tests.Unit; + +public class YouTubeLiveStreamingDetailsTests +{ + [Fact] + public void Constructor_WhenCalled_ItShouldReturnAnInstance() + { + var result = new YouTubeLiveStreamingDetails(); + + result.ActualStartTime.Should().BeNull(); + result.ActualEndTime.Should().BeNull(); + result.ScheduledStartTime.Should().BeNull(); + result.ScheduledEndTime.Should().BeNull(); + result.ConcurrentViewers.Should().BeNull(); + result.ActiveLiveChatId.Should().BeNull(); + } + + [Fact] + public void Constructor_WhenCalledWithValues_ItShouldReturnAnInstance() + { + var now = DateTimeOffset.UtcNow; + var viewers = 100UL; + var chatId = "chad_id"; + + var result = new YouTubeLiveStreamingDetails() + { + ActualStartTime = now, + ActualEndTime = now, + ScheduledStartTime = now, + ScheduledEndTime = now, + ConcurrentViewers = viewers, + ActiveLiveChatId = chatId, + }; + + result.ActualStartTime.Should().Be(now); + result.ActualEndTime.Should().Be(now); + result.ScheduledStartTime.Should().Be(now); + result.ScheduledEndTime.Should().Be(now); + result.ConcurrentViewers.Should().Be(viewers); + result.ActiveLiveChatId.Should().Be(chatId); + } +} \ No newline at end of file