import Foundation import Testing @testable import PlexKit @Suite("Anmelde-Adresse") struct AuthorizationURLTests { private let pin = PlexPin(id: 42, code: "5474") private func url() throws -> URL { try #require(pin.authorizationURL(clientIdentifier: "abc-123", product: "Flixy")) } @Test("Die Klammern der Kontext-Parameter werden nicht doppelt kodiert") func bracketsAreEncodedExactlyOnce() throws { // Der Fehler, der plex.tv „Diese Anfrage konnte nicht abgeschlossen // werden" antworten ließ: eine bereits kodierte Klammer (%5B) wurde // beim Setzen des Fragments ein zweites Mal kodiert (%255B). Plex sah // dann einen Parameter namens „context%5Bdevice%5D…" statt // „context[device]…" und konnte nichts damit anfangen. let text = try url().absoluteString #expect(!text.contains("%25"), "doppelt kodiert: \(text)") #expect(text.contains("context%5Bdevice%5D%5Bproduct%5D=Flixy")) } @Test("Code und Client-Kennung stehen im Fragment") func carriesCodeAndClient() throws { let text = try url().absoluteString #expect(text.hasPrefix("https://app.plex.tv/auth#?")) #expect(text.contains("clientID=abc-123")) #expect(text.contains("code=5474")) } @Test("Produktnamen mit Leerzeichen werden kodiert") func productNamesWithSpacesAreEncoded() throws { // Der Name steht noch nicht fest. Wird daraus „Flixy Player", darf // das Leerzeichen die Adresse nicht zerreißen. let url = try #require(pin.authorizationURL(clientIdentifier: "abc", product: "Flixy Player")) #expect(url.absoluteString.contains("Flixy%20Player")) #expect(!url.absoluteString.contains("Flixy Player")) } }