import Foundation import Testing @testable import MediaKit @Suite("Der Abzug fürs Regal") struct TopShelfSnapshotTests { private func eintrag(_ id: String) -> TopShelfSnapshot.Entry { .init(id: id, title: "Titel \(id)", imageURL: URL(string: "https://example.test/\(id).jpg")) } /// **Der Fall, der sonst erst auf dem Fernseher auffiele.** Die /// Erweiterung entschlüsselt, was die App geschrieben hat; passt eines /// von beiden nicht, bleibt das Regal leer — ohne Fehler, ohne Hinweis. @Test("Was geschrieben wurde, kommt gleich wieder heraus") func roundTrips() throws { let original = TopShelfSnapshot(sections: [ .init(id: "continue", title: "Weiterschauen", entries: [eintrag("1"), eintrag("2")]), ]) let daten = try JSONEncoder().encode(original) let zurück = try JSONDecoder().decode(TopShelfSnapshot.self, from: daten) #expect(zurück == original) } /// Ohne App-Gruppe gibt es den geteilten Ort nicht — und bis sie im /// Entwicklerkonto steht, ist das der Normalfall. Dann soll nichts /// passieren, nicht abgestürzt werden. /// /// **Geprüft wird die Harmlosigkeit, nicht das `nil`.** Dass der Ort /// fehlt, lässt sich hier nicht behaupten: dieser Test läuft auf macOS, /// und dort reicht das System für eine unbekannte Gruppe trotzdem einen /// Ordner heraus — anders als auf tvOS. Die Zusage, auf die es ankommt, /// gilt überall: beides geht durch, und gelesen wird nur, was auch /// geschrieben wurde. @Test("Eine unbekannte App-Gruppe bringt nichts zum Absturz") func unknownGroupIsHarmless() { let unbekannt = "group.flaro.test.\(UUID().uuidString)" TopShelfStore.write(TopShelfSnapshot(sections: []), group: unbekannt) let gelesen = TopShelfStore.read(group: unbekannt) #expect(gelesen?.sections.isEmpty ?? true) } /// Die Grenzen sind kein Geschmack: das Regal zeigt eine knappe /// Bildschirmbreite, und die Erweiterung hat weniger als eine Sekunde. @Test("Die Grenzen sind eng genug, dass es in einer Sekunde reicht") func limitsAreTight() { #expect(TopShelfSnapshot.sectionLimit <= 3) #expect(TopShelfSnapshot.entryLimit <= 20) } }