diff --git a/src/tests/StevesBot.Webhook.Tests/Unit/PubSubClientTests.cs b/src/tests/StevesBot.Webhook.Tests/Unit/PubSubClientTests.cs new file mode 100644 index 0000000..f00bac1 --- /dev/null +++ b/src/tests/StevesBot.Webhook.Tests/Unit/PubSubClientTests.cs @@ -0,0 +1,36 @@ + +namespace StevesBot.Webhook.Tests.Unit; + +public sealed class PubSubClientTests : IDisposable +{ + private readonly MockHttpMessageHandler _mockHttpMessageHandler = new(); + private readonly Mock> _mockLogger = new(); + private readonly PubSubClient _sut; + + public PubSubClientTests() + { + var mockHttpClient = _mockHttpMessageHandler.ToHttpClient(); + mockHttpClient.BaseAddress = new("https://test.com"); + + _sut = new(mockHttpClient, _mockLogger.Object); + } + + [Theory] + [InlineData(HttpStatusCode.InternalServerError, false)] + [InlineData(HttpStatusCode.OK, true)] + public async Task SubscribeAsync_WhenCalled_ItShouldReturnExpectedResult(HttpStatusCode givenStatusCode, bool expectedResult) + { + _mockHttpMessageHandler + .When("*/subscribe") + .Respond(givenStatusCode); + + var result = await _sut.SubscribeAsync("callbackUrl", "topicUrl"); + + result.Should().Be(expectedResult); + } + + public void Dispose() + { + _mockHttpMessageHandler.Dispose(); + } +} \ No newline at end of file diff --git a/src/tests/StevesBot.Webhook.Tests/Unit/YouTubePageInfoTests.cs b/src/tests/StevesBot.Webhook.Tests/Unit/YouTubePageInfoTests.cs new file mode 100644 index 0000000..10ea56c --- /dev/null +++ b/src/tests/StevesBot.Webhook.Tests/Unit/YouTubePageInfoTests.cs @@ -0,0 +1,6 @@ +namespace StevesBot.Webhook.Tests.Unit; + +public class YouTubePageInfoTests +{ + +} \ No newline at end of file diff --git a/src/tests/StevesBot.Webhook.Tests/Unit/YouTubeSnippetTests.cs b/src/tests/StevesBot.Webhook.Tests/Unit/YouTubeSnippetTests.cs new file mode 100644 index 0000000..1e2a061 --- /dev/null +++ b/src/tests/StevesBot.Webhook.Tests/Unit/YouTubeSnippetTests.cs @@ -0,0 +1,25 @@ +namespace StevesBot.Webhook.Tests.Unit; + +public class YouTubeSnippetTests +{ + [Fact] + public void Constructor_WhenCalled_ItShouldReturnAnInstance() + { + var result = new YouTubeSnippet(); + + result.LiveBroadcastContent.Should().BeEmpty(); + } + + [Fact] + public void Constructor_WhenCalledWithValues_ItShouldReturnAnInstance() + { + var content = "live"; + + var result = new YouTubeSnippet() + { + LiveBroadcastContent = content, + }; + + result.LiveBroadcastContent.Should().Be(content); + } +} \ No newline at end of file diff --git a/src/tests/StevesBot.Webhook.Tests/Unit/YouTubeVideoListResponseTests.cs b/src/tests/StevesBot.Webhook.Tests/Unit/YouTubeVideoListResponseTests.cs new file mode 100644 index 0000000..2bf7ea3 --- /dev/null +++ b/src/tests/StevesBot.Webhook.Tests/Unit/YouTubeVideoListResponseTests.cs @@ -0,0 +1,31 @@ +using StevesBot.Webhook.YouTube.Data; + +namespace StevesBot.Webhook.Tests.Unit; + +public class YouTubeVideoListResponseTests +{ + [Fact] + public void Constructor_WhenCalled_ItShouldReturnAnInstance() + { + var result = new YouTubeVideoListResponse(); + + result.Items.Should().BeEmpty(); + result.PageInfo.Should().BeEquivalentTo(new YouTubePageInfo()); + } + + [Fact] + public void Constructor_WhenCalledWithValues_ItShouldReturnAnInstance() + { + var videos = new YouTubeVideo[] { new() }; + var pageInfo = new YouTubePageInfo(); + + var result = new YouTubeVideoListResponse() + { + Items = videos, + PageInfo = pageInfo, + }; + + result.Items.Should().BeSameAs(videos); + result.PageInfo.Should().BeSameAs(pageInfo); + } +} \ No newline at end of file diff --git a/src/tests/StevesBot.Webhook.Tests/Unit/YouTubeVideoTests.cs b/src/tests/StevesBot.Webhook.Tests/Unit/YouTubeVideoTests.cs new file mode 100644 index 0000000..128d5fd --- /dev/null +++ b/src/tests/StevesBot.Webhook.Tests/Unit/YouTubeVideoTests.cs @@ -0,0 +1,68 @@ +namespace StevesBot.Webhook.Tests.Unit; + +public class YouTubeVideoTests +{ + [Fact] + public void Constructor_WhenCalled_ItShouldReturnAnInstance() + { + var result = new YouTubeVideo(); + + result.Id.Should().BeEmpty(); + result.LiveStreamingDetails.Should().BeNull(); + result.Snippet.Should().BeEquivalentTo(new YouTubeSnippet()); + } + + [Fact] + public void Constructor_WhenCalledWithValues_ItShouldReturnAnInstance() + { + var id = "id"; + var details = new YouTubeLiveStreamingDetails(); + var snippet = new YouTubeSnippet(); + + var result = new YouTubeVideo() + { + Id = id, + LiveStreamingDetails = details, + Snippet = snippet, + }; + + result.Id.Should().Be(id); + result.LiveStreamingDetails.Should().BeSameAs(details); + result.Snippet.Should().BeSameAs(snippet); + } + + [Fact] + public void IsLiveStream_WhenLiveStreamingDetailsIsNull_ItShouldReturnFalse() + { + var video = new YouTubeVideo() + { + Snippet = new() { LiveBroadcastContent = "live" }, + }; + + video.IsLiveStream.Should().BeFalse(); + } + + [Fact] + public void IsLiveStream_WhenSnippetLiveBroadcastContentIsNotLive_ItShouldReturnFalse() + { + var video = new YouTubeVideo() + { + LiveStreamingDetails = new(), + Snippet = new() { LiveBroadcastContent = "none" }, + }; + + video.IsLiveStream.Should().BeFalse(); + } + + [Fact] + public void IsLiveStream_WhenDetailsIsNotNullAndContentIsLive_ItShouldReturnTrue() + { + var video = new YouTubeVideo() + { + LiveStreamingDetails = new(), + Snippet = new() { LiveBroadcastContent = "live" }, + }; + + video.IsLiveStream.Should().BeTrue(); + } +} \ No newline at end of file diff --git a/src/tests/StevesBot.Webhook.Tests/Usings.cs b/src/tests/StevesBot.Webhook.Tests/Usings.cs index 4617e08..aadd939 100644 --- a/src/tests/StevesBot.Webhook.Tests/Usings.cs +++ b/src/tests/StevesBot.Webhook.Tests/Usings.cs @@ -1,2 +1,11 @@ +global using System.Net; + +global using Microsoft.Extensions.Logging; + +global using Moq; + +global using RichardSzalay.MockHttp; + global using StevesBot.Webhook.YouTube; -global using StevesBot.Webhook.YouTube.Tasks; \ No newline at end of file +global using StevesBot.Webhook.YouTube.Data; +global using StevesBot.Webhook.YouTube.Tasks;