Ein Haken, der stehen blieb, als die Rechnung sich änderte
Ein Film stand bei 1:32 und tauchte in „Fortsetzen" trotzdem nicht auf. Die Reihe fragt nicht die Regel, sondern deren festgehaltenes Ergebnis: die Spalte `InProgress`. Die Bruchrechnung „Stelle kleiner als Anteil der Laufzeit" lässt sich nicht nach SQL übersetzen, also steht sie als Wahrheitswert in der Zeile — und berechnet wird sie nur, wenn eine Fortschrittsmeldung eintrifft. Die kaputte Meldung von vorgestern hatte dort `false` hinterlassen; die Korrektur am Server verhinderte neuen Schaden, räumte den alten aber nicht weg. `Sehstandpflege` rechnet nach jedem Update einmal durch: erst die Laufzeit aus der Datei nachtragen, dann neu bewerten — in dieser Reihenfolge, denn eine Neubewertung auf Basis eines Stummels käme wieder zu `false`. `UpdatedAt` bleibt, wo es war; danach ist die Reihe sortiert. Und der Knopf heisst jetzt so wie die Reihe, über der er steht. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
5dfc22bdce
commit
a609b2d087
@@ -263,4 +263,66 @@ public sealed class StatistikTests
|
||||
Assert.That((await Statistik(client))!.LoggedSeconds, Is.GreaterThan(0),
|
||||
"und mitgezählt werden muss sie auch.");
|
||||
}
|
||||
|
||||
/// <summary>Ein Stummel als Laufzeit nimmt den Titel nicht dauerhaft aus „Fortsetzen".</summary>
|
||||
///
|
||||
/// <remarks>
|
||||
/// <para>
|
||||
/// <b>Der gemeldete Fall.</b> Ein Film stand bei 1:32, und in
|
||||
/// „Fortsetzen" tauchte er trotzdem nicht auf — bis er einmal neu
|
||||
/// gestartet wurde. Die Reihe fragt nicht die Regel, sondern deren
|
||||
/// festgehaltenes Ergebnis: die Spalte <c>InProgress</c>. Berechnet
|
||||
/// wird sie nur, wenn eine Meldung eintrifft.
|
||||
/// </para>
|
||||
/// <para>
|
||||
/// Hier wird geprüft, dass eine Meldung mit zu kurzer Laufzeit den
|
||||
/// Eintrag gar nicht erst herauswirft — und dass er danach weiter in
|
||||
/// „Fortsetzen" steht, ohne dass jemand den Film anfassen muss.
|
||||
/// </para>
|
||||
/// </remarks>
|
||||
[Test]
|
||||
public async Task Eine_zu_kurze_Laufzeit_wirft_nicht_aus_Fortsetzen()
|
||||
{
|
||||
Datei("Spinnenmann (2026)/Spinnenmann (2026).mkv");
|
||||
using var server = MitUhr();
|
||||
var client = await Eingelesen(server);
|
||||
var film = await ErsterFilm(client);
|
||||
|
||||
await Melden(client, film, 5520, 11460);
|
||||
|
||||
var davor = await client.GetFromJsonAsync<Page<ContinueEntry>>("/api/v1/home/continue");
|
||||
Assert.That(davor!.Items.Select(e => e.Id), Has.Member(film),
|
||||
"bei 1:32 von 3:11 gehört er dort hin");
|
||||
|
||||
// Die Meldung, die früher alles zerstörte: ein Client, der an einer
|
||||
// wachsenden Playlist misst und nur einen Stummel sieht.
|
||||
await Melden(client, film, 5520, 60);
|
||||
|
||||
var danach = await client.GetFromJsonAsync<Page<ContinueEntry>>("/api/v1/home/continue");
|
||||
|
||||
Assert.That(danach!.Items.Select(e => e.Id), Has.Member(film),
|
||||
"und er bleibt dort, auch nach einer unsinnig kurzen Laufzeit");
|
||||
}
|
||||
|
||||
/// <summary>„Entfernen" nimmt ihn heraus — das soll weiter gehen.</summary>
|
||||
///
|
||||
/// <remarks>
|
||||
/// Die Reparatur darf nicht so weit gehen, dass sie eine Entscheidung
|
||||
/// des Zuschauers überschreibt.
|
||||
/// </remarks>
|
||||
[Test]
|
||||
public async Task Wer_entfernt_wird_bleibt_draussen()
|
||||
{
|
||||
Datei("Spinnenmann (2026)/Spinnenmann (2026).mkv");
|
||||
using var server = MitUhr();
|
||||
var client = await Eingelesen(server);
|
||||
var film = await ErsterFilm(client);
|
||||
|
||||
await Melden(client, film, 5520, 11460);
|
||||
(await client.PostAsync($"/api/v1/items/{film}/dismiss", null)).EnsureSuccessStatusCode();
|
||||
|
||||
var danach = await client.GetFromJsonAsync<Page<ContinueEntry>>("/api/v1/home/continue");
|
||||
|
||||
Assert.That(danach!.Items, Is.Empty);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user