Anmelde-Adresse wurde doppelt kodiert URLComponents.fragment kodiert beim Setzen erneut, aus %5B wurde %255B. Plex antwortete mit „Diese Anfrage konnte nicht abgeschlossen werden". Die Adresse wird jetzt von Hand zusammengesetzt. Verbindungssuche hing bis zu anderthalb Minuten probeTimeout war deklariert, aber nirgends angewendet — es galt der URLSession-Standard von 60 Sekunden. Zusammen mit der Prüfung Rang für Rang kostete eine schweigende lokale Adresse die volle Zeit, bevor der direkte Weg überhaupt begann. Jetzt laufen alle Adressen gleichzeitig, mit Zeitgrenze, und die Rangordnung entscheidet unter den erreichbaren. Kein Zurück während des Ladens Die Kopfzeile mit dem Schließen-Knopf wurde nur im Zustand .playing gezeichnet. Bei langsamer Verbindung saß man ohne Ausweg vor einem Ladekreis. Sie liegt jetzt als eigene Ebene darüber und erscheint auch beim Vorbereiten — samt Titel, damit erkennbar bleibt, worauf gewartet wird. Sechs neue Tests, darunter drei, die die Zeitgrenze der Verbindungssuche an einer schweigenden Adresse nachstellen. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
42 lines
1.7 KiB
Swift
42 lines
1.7 KiB
Swift
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"))
|
|
}
|
|
}
|