import Foundation import Testing import MediaKit @testable import FlaroServerKit /// Vorspann und Abspann auf dem Weg vom Server in den Spieler. /// /// **Der Anlass:** im Web erschien der Überspringen-Knopf, in der App nie. /// Dazwischen liegt genau diese Übersetzung — und ohne Prüfung liesse sich /// nicht sagen, ob sie der Grund ist oder etwas dahinter. @Suite("Flaro: Marken") struct MarkenTests { private static let folge = """ { "id": "folge-1", "season": 1, "episode": 6, "title": "Bestimmung", "overview": null, "stillImage": null, "files": [{ "id": "datei-1", "fileName": "F.mkv", "sizeBytes": 1, "container": "mkv", "durationSeconds": 2700, "streams": [] }], "state": null, "publishAt": null, "seriesId": "serie-1", "markers": [ { "kind": "intro", "startSeconds": 30.5, "endSeconds": 65 }, { "kind": "credits", "startSeconds": 2500, "endSeconds": 2700 } ] } """ @Test("Eine Folge bringt Vorspann und Abspann mit") func folgeMitMarken() throws { let roh = try #require( try? FlaroClient.decoder.decode(Wire.Episode.self, from: Data(Self.folge.utf8))) let titel = roh.neutral() #expect(titel.markers.count == 2) let intro = try #require(titel.markers.first { $0.kind == .intro }) #expect(intro.startMilliseconds == 30_500) #expect(intro.endMilliseconds == 65_000) #expect(intro.contains(45_000)) let abspann = try #require(titel.markers.first { $0.kind == .credits }) #expect(abspann.startMilliseconds == 2_500_000) } /// Ein älterer Server schickt das Feld gar nicht — das ist kein Fehler. @Test("Ohne Marken bleibt die Liste leer") func ohneMarken() throws { let ohne = """ { "id": "folge-1", "season": 1, "episode": 6, "title": "Bestimmung", "overview": null, "stillImage": null, "files": [], "state": null, "publishAt": null, "seriesId": "serie-1" } """ let roh = try #require( try? FlaroClient.decoder.decode(Wire.Episode.self, from: Data(ohne.utf8))) #expect(roh.neutral().markers.isEmpty) } /// Ein unbekanntes Wort wirft die Marke nicht weg — sie zählt nur nicht. @Test("Eine unbekannte Art wird nicht zur falschen") func unbekannteArt() throws { let fremd = Self.folge.replacingOccurrences(of: "\"intro\"", with: "\"werbung\"") let roh = try #require( try? FlaroClient.decoder.decode(Wire.Episode.self, from: Data(fremd.utf8))) let titel = roh.neutral() #expect(titel.markers.count == 2) #expect(titel.markers.first?.kind == .unknown) } }