using FluentAssertions; using Jellyfin.Plugin.SRFPlay.Api.Models; using Jellyfin.Plugin.SRFPlay.Configuration; using Jellyfin.Plugin.SRFPlay.Services; using Microsoft.Extensions.Logging; using Moq; using Xunit; namespace Jellyfin.Plugin.SRFPlay.Tests.UnitTests; /// /// Unit tests for StreamUrlResolver. /// public class StreamUrlResolverTests : IDisposable { private readonly Mock> _loggerMock; private readonly StreamUrlResolver _resolver; public StreamUrlResolverTests() { _loggerMock = new Mock>(); _resolver = new StreamUrlResolver(_loggerMock.Object); } [Fact] public void GetStreamUrl_WithNullChapter_ReturnsNull() { // Act var result = _resolver.GetStreamUrl(null!, QualityPreference.Auto); // Assert result.Should().BeNull(); } [Fact] public void GetStreamUrl_WithNoResources_ReturnsNull() { // Arrange var chapter = new Chapter { Id = "test-id", ResourceList = new List() }; // Act var result = _resolver.GetStreamUrl(chapter, QualityPreference.Auto); // Assert result.Should().BeNull(); } [Fact] public void GetStreamUrl_WithDrmProtectedOnly_ReturnsNull() { // Arrange var chapter = new Chapter { Id = "test-id", ResourceList = new List { new Resource { Url = "https://example.com/stream.m3u8", Protocol = "HLS", Quality = "HD", DrmList = new System.Text.Json.JsonElement() // Non-empty DRM } } }; // Act var result = _resolver.GetStreamUrl(chapter, QualityPreference.Auto); // Assert result.Should().BeNull(); } [Fact] public void HasPlayableContent_WithNonDrmHlsStream_ReturnsTrue() { // Arrange var chapter = new Chapter { ResourceList = new List { new Resource { Url = "https://example.com/stream.m3u8", Protocol = "HLS", Quality = "HD", DrmList = null } } }; // Act var result = _resolver.HasPlayableContent(chapter); // Assert result.Should().BeTrue(); } [Fact] public void HasPlayableContent_WithDrmOnly_ReturnsFalse() { // Arrange var chapter = new Chapter { ResourceList = new List { new Resource { Url = "https://example.com/stream.m3u8", Protocol = "HLS", DrmList = new System.Text.Json.JsonElement() // Non-empty DRM } } }; // Act var result = _resolver.HasPlayableContent(chapter); // Assert result.Should().BeFalse(); } [Fact] public void IsContentExpired_WithFutureValidTo_ReturnsFalse() { // Arrange var chapter = new Chapter { ValidTo = DateTime.UtcNow.AddDays(7) }; // Act var result = _resolver.IsContentExpired(chapter); // Assert result.Should().BeFalse(); } [Fact] public void IsContentExpired_WithPastValidTo_ReturnsTrue() { // Arrange var chapter = new Chapter { ValidTo = DateTime.UtcNow.AddDays(-1) }; // Act var result = _resolver.IsContentExpired(chapter); // Assert result.Should().BeTrue(); } [Fact] public void IsContentExpired_WithNullValidTo_ReturnsFalse() { // Arrange var chapter = new Chapter { ValidTo = null }; // Act var result = _resolver.IsContentExpired(chapter); // Assert result.Should().BeFalse(); } public void Dispose() { _resolver?.Dispose(); } }