Files
jellyfin-multilang/tests/Jellyfin.Plugin.Multilang.Tests/ProviderClientTests.cs
T

115 lines
4.7 KiB
C#

using System.Net;
using System.Text;
using Jellyfin.Plugin.Multilang.Services.Providers;
using Jellyfin.Plugin.Multilang.Services.Refresh;
namespace Jellyfin.Plugin.Multilang.Tests;
public sealed class ProviderClientTests
{
[Fact]
public async Task TmdbMetadataParsesMovieFieldsAndDeduplicatesGenres()
{
var factory = JsonFactory("""
{
"title": "Finnish title",
"overview": "Overview",
"tagline": "Tagline",
"original_title": "Original title",
"original_language": "fi",
"origin_country": ["FI", "FI"],
"production_countries": [{"iso_3166_1":"FI"}],
"spoken_languages": [{"iso_639_1":"fi"}, {"iso_639_1":"en"}],
"genres": [{"id": 18, "name": "Drama"}, {"id": 18, "name": "Duplicate"}]
}
""");
var client = new TmdbClient(factory);
var result = await client.FetchMetadataAsync(Movie(), "fi-FI", "key", new FetchRateLimiter(TimeSpan.Zero), CancellationToken.None);
Assert.NotNull(result);
Assert.Equal("Finnish title", result.Title);
Assert.Equal("Original title", result.OriginalTitle);
Assert.Equal("fi", result.OriginalLanguage);
Assert.Equal(["FI"], result.OriginCountries);
Assert.Equal(["fi", "en"], result.SpokenLanguages);
Assert.Equal([18], result.GenreIds);
Assert.Contains("language=fi-FI", factory.Requests.Single());
}
[Fact]
public async Task TmdbImagesKeepTheFirstImageForEachLanguage()
{
var factory = JsonFactory("""
{
"posters": [
{"iso_639_1":"fi", "file_path":"/first.jpg"},
{"iso_639_1":"fi", "file_path":"/second.jpg"},
{"iso_639_1":null, "file_path":"/none.jpg"}
],
"logos": [{"iso_639_1":"sv", "file_path":"/logo.png"}],
"backdrops": [{"iso_639_1":"en", "file_path":"/backdrop.jpg"}]
}
""");
var client = new TmdbClient(factory);
var result = await client.FetchImagesAsync(Movie(), "key", new FetchRateLimiter(TimeSpan.Zero), CancellationToken.None);
Assert.NotNull(result);
Assert.Equal("https://image.tmdb.org/t/p/original/first.jpg", result.Posters["fi"]);
Assert.Equal("https://image.tmdb.org/t/p/original/logo.png", result.Logos["sv"]);
Assert.Equal("https://image.tmdb.org/t/p/original/backdrop.jpg", result.Backdrops["en"]);
}
[Fact]
public async Task TmdbNotFoundReturnsNoMetadata()
{
var factory = new TestHttpClientFactory(_ => new HttpResponseMessage(HttpStatusCode.NotFound));
var client = new TmdbClient(factory);
var result = await client.FetchMetadataAsync(Movie(), "en", "key", new FetchRateLimiter(TimeSpan.Zero), CancellationToken.None);
Assert.Null(result);
}
[Fact]
public async Task FanartSelectsMostLikedArtworkAndUsesStandardLogoAsFallback()
{
var factory = JsonFactory("""
{
"movieposter": [
{"lang":"fi", "url":"https://images/fi-low.jpg", "likes":"2"},
{"lang":"fi", "url":"https://images/fi-best.jpg", "likes":"8"},
{"lang":"00", "url":"https://images/no-language.jpg", "likes":"99"}
],
"hdmovielogo": [{"lang":"sv", "url":"https://images/hd-logo.png", "likes":1}],
"movielogo": [
{"lang":"sv", "url":"https://images/standard-sv.png", "likes":9},
{"lang":"fi", "url":"https://images/standard-fi.png", "likes":3}
],
"moviebanner": [{"lang":"fi", "url":"https://images/banner.jpg", "likes":0}],
"moviethumb": [{"lang":"fi", "url":"https://images/thumb.jpg", "likes":0}]
}
""");
var client = new FanartClient(factory);
var result = await client.FetchMovieImagesAsync("123", "key", CancellationToken.None);
Assert.NotNull(result);
Assert.Equal("https://images/fi-best.jpg", result.Posters["fi"]);
Assert.Equal("https://images/hd-logo.png", result.Logos["sv"]);
Assert.Equal("https://images/standard-fi.png", result.Logos["fi"]);
Assert.Equal("https://images/banner.jpg", result.Banners["fi"]);
Assert.Equal("https://images/thumb.jpg", result.Thumbs["fi"]);
}
private static RefreshItemInfo Movie()
=> new("11111111111111111111111111111111", "123", "movie", RefreshWorkClass.Movies, 0, 0, null, "Movie");
private static TestHttpClientFactory JsonFactory(string json)
=> new(_ => new HttpResponseMessage(HttpStatusCode.OK)
{
Content = new StringContent(json, Encoding.UTF8, "application/json")
});
}