diff --git a/MusicBridge/PlayerStore.swift b/MusicBridge/PlayerStore.swift index 04d9354..0b60ec4 100644 --- a/MusicBridge/PlayerStore.swift +++ b/MusicBridge/PlayerStore.swift @@ -73,7 +73,7 @@ final class PlayerStore: ObservableObject { // Retry loading if Keychain was locked when the app was created. if connection == nil { do { connection = try storage.load() } - catch { error = BridgeError.describe(error) } + catch { self.error = BridgeError.describe(error) } } if discoveryEnabled { discovery.start() } resume() diff --git a/MusicBridgeTests/ResilienceTests.swift b/MusicBridgeTests/ResilienceTests.swift index b60176a..bf01950 100644 --- a/MusicBridgeTests/ResilienceTests.swift +++ b/MusicBridgeTests/ResilienceTests.swift @@ -49,6 +49,23 @@ final class ResilienceTests: XCTestCase { XCTAssertFalse(store.connected) } + func testRetriesStorageLoadWhenForegroundBecomesAvailable() async throws { + let saved = try connection("storage-unlock") + var loads = 0 + let storage = ConnectionStorage(load: { + loads += 1 + if loads == 1 { throw BridgeError.message("Keychain locked") } + return saved + }, save: { _ in }, delete: {}) + let store = PlayerStore(storage: storage, discoveryEnabled: false) + defer { store.setActive(false) } + XCTAssertNil(store.connection) + store.setActive(true) + try await eventually { store.connected } + XCTAssertEqual(loads, 2) + XCTAssertNil(store.error) + } + func testArtworkRetriesAfter404WithoutTrackChange() async throws { let store = try store("artwork") defer { store.setActive(false) }