Files
steves-bot/src/tests/StevesBot.Webhook.Tests/Unit/YouTubeDataApiClientTests.cs
T

77 lines
2.0 KiB
C#

namespace StevesBot.Webhook.Tests.Unit;
public sealed class YouTubeDataApiClientTests : IDisposable
{
private readonly MockHttpMessageHandler _mockHttpMessageHandler = new();
private readonly Mock<ILogger<YouTubeDataApiClient>> _mockLogger = new();
private readonly Mock<IOptions<YouTubeClientOptions>> _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();
}
}