From ad02e89449e021e2fe735b2bcf55800a184769fd Mon Sep 17 00:00:00 2001 From: Brandon Evans Date: Fri, 8 Jan 2021 17:38:01 -0700 Subject: [PATCH] Add failing test to cover removing an uninstalled version, fix it https://github.com/RobotsAndPencils/XcodesApp/pull/44#issuecomment-756783640 --- Xcodes/Backend/AppState.swift | 8 +++++--- XcodesTests/AppStateUpdateTests.swift | 17 +++++++++++++++++ 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/Xcodes/Backend/AppState.swift b/Xcodes/Backend/AppState.swift index 7a1e7de..1ad6858 100644 --- a/Xcodes/Backend/AppState.swift +++ b/Xcodes/Backend/AppState.swift @@ -378,13 +378,15 @@ class AppState: ObservableObject { .map { xcodeVersion in let installedXcode = installedXcodes.first(where: { xcodeVersion.isEquivalentForDeterminingIfInstalled(toInstalled: $0.version) }) let availableXcode = availableXcodes.first { $0.version == xcodeVersion } - let existingXcode = allXcodes.first { $0.version == xcodeVersion } - let defaultInstallState: XcodeInstallState = installedXcode != nil ? .installed : .notInstalled + // If the existing install state is "installing", keep it + let existingXcodeInstallState = allXcodes.first { $0.version == xcodeVersion && $0.installing }?.installState + // Otherwise, determine it from whether there's an installed Xcode + let defaultXcodeInstallState: XcodeInstallState = installedXcode != nil ? .installed : .notInstalled return Xcode( version: xcodeVersion, - installState: existingXcode?.installState ?? defaultInstallState, + installState: existingXcodeInstallState ?? defaultXcodeInstallState, selected: installedXcode != nil && selectedXcodePath?.hasPrefix(installedXcode!.path.string) == true, path: installedXcode?.path.string, icon: (installedXcode?.path.string).map(NSWorkspace.shared.icon(forFile:)), diff --git a/XcodesTests/AppStateUpdateTests.swift b/XcodesTests/AppStateUpdateTests.swift index ee850bc..3a50d5b 100644 --- a/XcodesTests/AppStateUpdateTests.swift +++ b/XcodesTests/AppStateUpdateTests.swift @@ -27,4 +27,21 @@ class AppStateUpdateTests: XCTestCase { XCTAssertEqual(subject.allXcodes[0].installState, .installing(.unarchiving)) } + + func testRemovesUninstalledVersion() throws { + subject.allXcodes = [ + Xcode(version: Version("0.0.0")!, installState: .installed, selected: true, path: "/Applications/Xcode-0.0.0.app", icon: NSImage(systemSymbolName: "app.fill", accessibilityDescription: nil)) + ] + + subject.updateAllXcodes( + availableXcodes: [ + AvailableXcode(version: Version("0.0.0")!, url: URL(string: "https://apple.com/xcode.xip")!, filename: "mock.xip", releaseDate: nil) + ], + installedXcodes: [ + ], + selectedXcodePath: nil + ) + + XCTAssertEqual(subject.allXcodes[0].installState, .notInstalled) + } }