From 2940a94ed3cbecbe29f9bc25ebffccdb10c937b1 Mon Sep 17 00:00:00 2001 From: onevcat Date: Sat, 13 Jun 2026 10:45:11 +0900 Subject: [PATCH] Share the temporary project directory helper between tests --- supacodeTests/OpenWorktreeActionTests.swift | 22 +++---------- supacodeTests/TemporaryProjectDirectory.swift | 26 ++++++++++++++++ supacodeTests/WorktreeProjectKindTests.swift | 31 ++----------------- 3 files changed, 33 insertions(+), 46 deletions(-) create mode 100644 supacodeTests/TemporaryProjectDirectory.swift diff --git a/supacodeTests/OpenWorktreeActionTests.swift b/supacodeTests/OpenWorktreeActionTests.swift index b664b7b5..f5023985 100644 --- a/supacodeTests/OpenWorktreeActionTests.swift +++ b/supacodeTests/OpenWorktreeActionTests.swift @@ -64,7 +64,7 @@ struct OpenWorktreeActionTests { } @Test func preferredDefaultPicksXcodeForAppleProject() throws { - try withProjectDirectory(entries: ["Package.swift"]) { directory in + try withTemporaryProjectDirectory(entries: ["Package.swift"]) { directory in let installed: Set = [.xcode, .cursor, .vscode, .finder] let action = OpenWorktreeAction.preferredDefault(for: directory) { installed.contains($0) } #expect(action == .xcode) @@ -72,7 +72,7 @@ struct OpenWorktreeActionTests { } @Test func preferredDefaultPicksAndroidStudioForGradleProject() throws { - try withProjectDirectory(entries: ["settings.gradle.kts", "gradlew"]) { directory in + try withTemporaryProjectDirectory(entries: ["settings.gradle.kts", "gradlew"]) { directory in let installed: Set = [.androidStudio, .cursor, .xcode, .finder] let action = OpenWorktreeAction.preferredDefault(for: directory) { installed.contains($0) } #expect(action == .androidStudio) @@ -80,7 +80,7 @@ struct OpenWorktreeActionTests { } @Test func preferredDefaultFallsBackToSecondSpecialistThenGenericPriority() throws { - try withProjectDirectory(entries: ["build.gradle.kts"]) { directory in + try withTemporaryProjectDirectory(entries: ["build.gradle.kts"]) { directory in let withIntellij: Set = [.intellij, .cursor, .finder] let intellijPick = OpenWorktreeAction.preferredDefault(for: directory) { withIntellij.contains($0) @@ -96,7 +96,7 @@ struct OpenWorktreeActionTests { } @Test func preferredDefaultIgnoresProjectKindWithoutMarkers() throws { - try withProjectDirectory(entries: ["README.md"]) { directory in + try withTemporaryProjectDirectory(entries: ["README.md"]) { directory in let installed: Set = [.xcode, .vscode, .finder] let action = OpenWorktreeAction.preferredDefault(for: directory) { installed.contains($0) } #expect(action == .vscode) @@ -114,18 +114,4 @@ struct OpenWorktreeActionTests { #expect(action == .finder) } - private func withProjectDirectory( - entries: [String], - body: (URL) throws -> Void - ) throws { - let fileManager = FileManager.default - let directory = fileManager.temporaryDirectory - .appending(path: "open-action-\(UUID().uuidString)") - try fileManager.createDirectory(at: directory, withIntermediateDirectories: true) - defer { try? fileManager.removeItem(at: directory) } - for entry in entries { - try Data().write(to: directory.appending(path: entry)) - } - try body(directory) - } } diff --git a/supacodeTests/TemporaryProjectDirectory.swift b/supacodeTests/TemporaryProjectDirectory.swift new file mode 100644 index 00000000..c8497d14 --- /dev/null +++ b/supacodeTests/TemporaryProjectDirectory.swift @@ -0,0 +1,26 @@ +import Foundation + +/// Creates a temporary directory containing `entries` (a trailing slash marks +/// a subdirectory, like an `.xcodeproj` bundle) and removes it after `body` +/// runs. +func withTemporaryProjectDirectory( + entries: [String], + body: (URL) throws -> Void +) throws { + let fileManager = FileManager.default + let directory = fileManager.temporaryDirectory + .appending(path: "project-fixture-\(UUID().uuidString)") + try fileManager.createDirectory(at: directory, withIntermediateDirectories: true) + defer { try? fileManager.removeItem(at: directory) } + for entry in entries { + if entry.hasSuffix("/") { + try fileManager.createDirectory( + at: directory.appending(path: String(entry.dropLast())), + withIntermediateDirectories: true + ) + } else { + try Data().write(to: directory.appending(path: entry)) + } + } + try body(directory) +} diff --git a/supacodeTests/WorktreeProjectKindTests.swift b/supacodeTests/WorktreeProjectKindTests.swift index fded7c13..19e4e91f 100644 --- a/supacodeTests/WorktreeProjectKindTests.swift +++ b/supacodeTests/WorktreeProjectKindTests.swift @@ -26,7 +26,7 @@ struct WorktreeProjectKindTests { (["package.json"], WorktreeProjectKind.web), ]) func detectsKindFromMarker(entries: [String], expected: WorktreeProjectKind) throws { - try withTemporaryDirectory(entries: entries) { directory in + try withTemporaryProjectDirectory(entries: entries) { directory in #expect(WorktreeProjectKind.detect(at: directory) == expected) } } @@ -40,13 +40,13 @@ struct WorktreeProjectKindTests { (["composer.json", "package.json"], WorktreeProjectKind.php), ]) func specificMarkersWinOverGenericOnes(entries: [String], expected: WorktreeProjectKind) throws { - try withTemporaryDirectory(entries: entries) { directory in + try withTemporaryProjectDirectory(entries: entries) { directory in #expect(WorktreeProjectKind.detect(at: directory) == expected) } } @Test func returnsNilWithoutMarkers() throws { - try withTemporaryDirectory(entries: ["README.md", "src/"]) { directory in + try withTemporaryProjectDirectory(entries: ["README.md", "src/"]) { directory in #expect(WorktreeProjectKind.detect(at: directory) == nil) } } @@ -56,29 +56,4 @@ struct WorktreeProjectKindTests { .appending(path: "missing-\(UUID().uuidString)") #expect(WorktreeProjectKind.detect(at: directory) == nil) } - - /// Creates a temporary directory containing `entries` (a trailing slash - /// marks a subdirectory, like an `.xcodeproj` bundle) and removes it after - /// `body` runs. - private func withTemporaryDirectory( - entries: [String], - body: (URL) throws -> Void - ) throws { - let fileManager = FileManager.default - let directory = fileManager.temporaryDirectory - .appending(path: "project-kind-\(UUID().uuidString)") - try fileManager.createDirectory(at: directory, withIntermediateDirectories: true) - defer { try? fileManager.removeItem(at: directory) } - for entry in entries { - if entry.hasSuffix("/") { - try fileManager.createDirectory( - at: directory.appending(path: String(entry.dropLast())), - withIntermediateDirectories: true - ) - } else { - try Data().write(to: directory.appending(path: entry)) - } - } - try body(directory) - } } -- 2.51.2