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();
}
}