@@ -252,6 +252,52 @@ class AppStateTests: XCTestCase {
252252 XCTAssertEqual ( subject. selectedXcodePath, secondPath. string)
253253 }
254254
255+ func test_Uninstall_MissingXcodePresentsFileNotFoundError( ) async throws {
256+ let missingPath = try XCTUnwrap ( Path ( " /Applications/Xcode-Missing.app " ) )
257+ let xcode = Xcode ( version: Version ( " 15.0.0 " ) !, installState: . installed( missingPath) , selected: false , icon: nil )
258+ let didTryToTrashItem = TestLockedBox ( false )
259+ Current . files. contentsAtPath = { _ in nil }
260+ Current . files. trashItem = { _ in
261+ didTryToTrashItem. withValue { $0 = true }
262+ return URL ( fileURLWithPath: " \( NSHomeDirectory ( ) ) /.Trash " )
263+ }
264+
265+ subject. uninstall ( xcode: xcode)
266+ let uninstallTask = try XCTUnwrap ( subject. uninstallTask)
267+ await uninstallTask. value
268+
269+ guard case let . generic( title, message) = subject. presentedAlert else {
270+ return XCTFail ( " Expected generic uninstall error alert " )
271+ }
272+ XCTAssertEqual ( title, localizeString ( " Alert.Uninstall.Error.Title " ) )
273+ XCTAssertEqual (
274+ message,
275+ String ( format: localizeString ( " Alert.Uninstall.Error.Message.FileNotFound " ) , missingPath. string)
276+ )
277+ XCTAssertFalse ( didTryToTrashItem. read { $0 } )
278+ }
279+
280+ func test_Uninstall_RefreshesInstalledXcodeList( ) async throws {
281+ let installedPath = try XCTUnwrap ( Path ( " /Applications/Xcode-0.0.0.app " ) )
282+ let version = try XCTUnwrap ( Version ( " 0.0.0 " ) )
283+ subject. availableXcodes = [
284+ AvailableXcode ( version: version, url: URL ( string: " https://apple.com/xcode.xip " ) !, filename: " mock.xip " , releaseDate: nil )
285+ ]
286+ subject. allXcodes = [
287+ Xcode ( version: version, installState: . installed( installedPath) , selected: true , icon: nil )
288+ ]
289+ Current . files. installedXcodes = { _ in [ ] }
290+ Current . shell. xcodeSelectPrintPath = {
291+ ProcessOutput ( status: 0 , out: " " , err: " " )
292+ }
293+
294+ subject. uninstall ( xcode: subject. allXcodes [ 0 ] )
295+ let uninstallTask = try XCTUnwrap ( subject. uninstallTask)
296+ await uninstallTask. value
297+
298+ XCTAssertEqual ( subject. allXcodes [ 0 ] . installState, . notInstalled)
299+ }
300+
255301 func test_Signout_RemovesCookiesFromDownloadSession( ) throws {
256302 let session = URLSession ( configuration: . ephemeral)
257303 Current . network. session = session
0 commit comments