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