using Microsoft.Extensions.Logging.Abstractions;
namespace Flaro.Metadata.Tests;
/// Welches Plakat und welcher Hintergrund genommen werden.
///
///
///
/// Der gemeldete Fehler. „365 Tage" stand mit polnischem Plakat da,
/// obwohl in der eingestellten Sprache gesucht wurde. TMDB liefert im
/// Einzelabruf das Feld poster_path der Originalsprache, wenn in der
/// gewünschten keines eingetragen ist — und genau dieses Feld wurde
/// genommen. Die sprachsortierte Liste lag in derselben Antwort schon vor
/// (append_to_response=…,images) und wurde ausschliesslich für den
/// Schriftzug benutzt.
///
///
/// Sprachlos vor Englisch. Ein Bild ohne Sprachkennung trägt keinen
/// Text. Für einen deutschen Bestand ist ein Plakat ohne Titel besser als
/// dasselbe mit englischem Titel darüber.
///
///
public class Bildwahltests
{
private static TmdbClient Client(Attrappe attrappe, string sprache = "de-DE") =>
new(new HttpClient(attrappe) { BaseAddress = new Uri(TmdbClient.BaseAddress) },
FesteEinstellungen.MitSchluessel(sprache), NullLogger.Instance);
private const string Suche =
"""{"results":[{"id":500,"title":"Probe","release_date":"2020-02-07"}]}""";
/// Ein Einzelabruf mit Bilderliste und einem Rückfallfeld.
/// Ein Einzelabruf mit Bilderliste und einem Rückfallfeld.
private static Attrappe MitBildern(string posters, string backdrops = "[]") =>
Attrappe.NachPfad(
("search/movie", Suche),
("movie/500",
"{\"id\":500,\"title\":\"Probe\",\"release_date\":\"2020-02-07\","
+ "\"poster_path\":\"/original.jpg\",\"backdrop_path\":\"/grund.jpg\","
+ "\"images\":{\"posters\":" + posters
+ ",\"backdrops\":" + backdrops + "}}"));
private static Task Holen(Attrappe a, string sprache = "de-DE") =>
Client(a, sprache).FindMovieAsync("Probe", 2020);
[Test]
public async Task Das_deutsche_Plakat_sticht_das_der_Originalsprache()
{
var film = await Holen(MitBildern("""
[{"file_path":"/pl.jpg","iso_639_1":"pl","vote_average":9.0},
{"file_path":"/de.jpg","iso_639_1":"de","vote_average":1.0}]
"""));
Assert.That(film!.Poster!.Url, Does.EndWith("/de.jpg"),
"die eingestellte Sprache gewinnt, auch gegen die besseren Stimmen");
}
[Test]
public async Task Ohne_deutsches_Plakat_gewinnt_das_sprachlose()
{
var film = await Holen(MitBildern("""
[{"file_path":"/en.jpg","iso_639_1":"en","vote_average":9.0},
{"file_path":"/ohne.jpg","iso_639_1":null,"vote_average":1.0},
{"file_path":"/pl.jpg","iso_639_1":"pl","vote_average":8.0}]
"""));
Assert.That(film!.Poster!.Url, Does.EndWith("/ohne.jpg"),
"ein Plakat ohne Text ist besser als eines mit englischem");
}
[Test]
public async Task Gibt_es_nur_Englisch_und_Fremdes_gewinnt_Englisch()
{
var film = await Holen(MitBildern("""
[{"file_path":"/pl.jpg","iso_639_1":"pl","vote_average":9.0},
{"file_path":"/en.jpg","iso_639_1":"en","vote_average":1.0}]
"""));
Assert.That(film!.Poster!.Url, Does.EndWith("/en.jpg"));
}
/// Bei gleicher Sprache entscheiden die Stimmen.
[Test]
public async Task Unter_Gleichsprachigen_gewinnen_die_Stimmen()
{
var film = await Holen(MitBildern("""
[{"file_path":"/de-schwach.jpg","iso_639_1":"de","vote_average":2.0},
{"file_path":"/de-stark.jpg","iso_639_1":"de","vote_average":8.0}]
"""));
Assert.That(film!.Poster!.Url, Does.EndWith("/de-stark.jpg"));
}
/// Ohne Liste bleibt es beim Feld der Hauptantwort.
///
///
/// Ein alter Zwischenspeicher oder eine abgespeckte Antwort darf nicht
/// dazu führen, dass gar kein Plakat mehr herauskommt.
///
[Test]
public async Task Ohne_Bilderliste_bleibt_das_Feld_der_Hauptantwort()
{
var attrappe = Attrappe.NachPfad(
("search/movie", Suche),
("movie/500", """
{"id":500,"title":"Probe","release_date":"2020-02-07",
"poster_path":"/original.jpg","backdrop_path":"/grund.jpg"}
"""));
var film = await Holen(attrappe);
Assert.Multiple(() =>
{
Assert.That(film!.Poster!.Url, Does.EndWith("/original.jpg"));
Assert.That(film.Backdrop!.Url, Does.EndWith("/grund.jpg"));
});
}
/// Der Hintergrund folgt derselben Regel.
[Test]
public async Task Der_Hintergrund_bevorzugt_das_Bild_ohne_Schrift()
{
var film = await Holen(MitBildern("[]", """
[{"file_path":"/mit-titel.jpg","iso_639_1":"en","vote_average":9.0},
{"file_path":"/ohne-titel.jpg","iso_639_1":null,"vote_average":1.0}]
"""));
Assert.That(film!.Backdrop!.Url, Does.EndWith("/ohne-titel.jpg"));
}
/// Eine andere eingestellte Sprache verschiebt die Rangfolge mit.
[Test]
public async Task Die_Rangfolge_haengt_an_der_eingestellten_Sprache()
{
var bilder = """
[{"file_path":"/de.jpg","iso_639_1":"de","vote_average":9.0},
{"file_path":"/fr.jpg","iso_639_1":"fr","vote_average":1.0}]
""";
var film = await Holen(MitBildern(bilder), "fr-FR");
Assert.That(film!.Poster!.Url, Does.EndWith("/fr.jpg"));
}
}