diff --git a/supacodeTests/AppFeatureSettingsChangedTests.swift b/supacodeTests/AppFeatureSettingsChangedTests.swift index 592c8bb0..2e950fcd 100644 --- a/supacodeTests/AppFeatureSettingsChangedTests.swift +++ b/supacodeTests/AppFeatureSettingsChangedTests.swift @@ -41,6 +41,19 @@ struct AppFeatureSettingsChangedTests { await store.finish() } + @Test(.dependencies) func disablingIconDetectionCancelsPendingScans() async { + var settings = GlobalSettings.default + settings.detectRepositoryIconsAutomatically = false + let store = TestStore(initialState: AppFeature.State()) { + AppFeature() + } + store.exhaustivity = .off + + await store.send(.settings(.delegate(.settingsChanged(settings)))) + await store.receive(\.repositories.repositoryManagement.cancelPendingIconDetections) + await store.finish() + } + @Test(.dependencies) func terminalFontSizeEventDoesNotFanOutGlobalSettingsEffects() async { let sentTerminalCommands = LockIsolated<[TerminalClient.Command]>([]) let watcherCommands = LockIsolated<[WorktreeInfoWatcherClient.Command]>([]) diff --git a/supacodeTests/RepositoriesFeatureIconDetectionTests.swift b/supacodeTests/RepositoriesFeatureIconDetectionTests.swift index 36ca9910..296ed857 100644 --- a/supacodeTests/RepositoriesFeatureIconDetectionTests.swift +++ b/supacodeTests/RepositoriesFeatureIconDetectionTests.swift @@ -410,6 +410,39 @@ struct RepositoriesFeatureIconDetectionTests { #expect(appearances()["/tmp/repo"]?.icon == .userImage(filename: "mine.png")) } + @Test func globalOptOutCancelsInFlightScans() async { + let newRepo = makeRepository(id: "/tmp/new", name: "new", kind: .plain) + let store = TestStore(initialState: makeState(repositories: [])) { + RepositoriesFeature() + } withDependencies: { + $0.repositoryIconDetector.detect = { _ in + // Parks until cancelled, standing in for a long scan. + let (stream, _) = AsyncStream.makeStream() + for await _ in stream {} + return nil + } + $0.repositoryPersistence.saveRepositorySnapshot = { _ in } + $0.gitClient.repositoryWebURL = { _ in nil } + } + store.exhaustivity = .off + + await store.send( + .repositoryManagement( + .openRepositoriesFinished( + [newRepo], + failures: [], + invalidRoots: [], + openFailures: [], + roots: [newRepo.rootURL] + ) + ) + ) + await store.send(.repositoryManagement(.cancelPendingIconDetections)) + await store.finish() + + #expect(appearances()["/tmp/new"] == nil) + } + @Test func detectorOwnedTemporaryFileIsDeletedAfterImport() async throws { let temp = FileManager.default.temporaryDirectory .appending(path: "icon-composer-artifact-\(UUID().uuidString).png")