From 8a01e3788e06de6bb6d84f25246f89dfacf9e245 Mon Sep 17 00:00:00 2001 From: Michael Gerasymenko Date: Tue, 26 Nov 2024 09:33:04 +0100 Subject: [PATCH] Feature: allow passing list of changed files in --- .../SelectiveTestingTool.swift | 18 +++++++++++++----- .../SelectiveTesting.swift | 4 ++++ .../IntegrationTestTool.swift | 3 +++ .../SelectiveTestingProjectTests.swift | 16 ++++++++++++++++ 4 files changed, 36 insertions(+), 5 deletions(-) diff --git a/Sources/SelectiveTestingCore/SelectiveTestingTool.swift b/Sources/SelectiveTestingCore/SelectiveTestingTool.swift index fe2eed3..6ded595 100644 --- a/Sources/SelectiveTestingCore/SelectiveTestingTool.swift +++ b/Sources/SelectiveTestingCore/SelectiveTestingTool.swift @@ -15,6 +15,7 @@ public final class SelectiveTestingTool { private let baseBranch: String? private let basePath: Path private let printJSON: Bool + private let changedFiles: [String] private let renderDependencyGraph: Bool private let turbo: Bool private let dot: Bool @@ -25,6 +26,7 @@ public final class SelectiveTestingTool { public init(baseBranch: String?, basePath: String?, testPlan: String?, + changedFiles: [String], printJSON: Bool = false, renderDependencyGraph: Bool = false, dot: Bool = false, @@ -46,6 +48,7 @@ public final class SelectiveTestingTool { self.baseBranch = baseBranch self.basePath = Path(finalBasePath) + self.changedFiles = changedFiles self.printJSON = printJSON self.renderDependencyGraph = renderDependencyGraph self.turbo = turbo @@ -58,11 +61,16 @@ public final class SelectiveTestingTool { // 1. Identify changed files let changeset: Set - Logger.message("Finding changeset for repository at \(basePath)") - if let baseBranch { - changeset = try Git(path: basePath).changeset(baseBranch: baseBranch, verbose: verbose) - } else { - changeset = try Git(path: basePath).localChangeset() + if changedFiles.isEmpty { + Logger.message("Finding changeset for repository at \(basePath)") + if let baseBranch { + changeset = try Git(path: basePath).changeset(baseBranch: baseBranch, verbose: verbose) + } else { + changeset = try Git(path: basePath).localChangeset() + } + } + else { + changeset = Set(changedFiles.map { Path($0).absolute() }) } if verbose { Logger.message("Changed files: \(changeset)") } diff --git a/Sources/xcode-selective-test/SelectiveTesting.swift b/Sources/xcode-selective-test/SelectiveTesting.swift index ee0fea0..5429fed 100644 --- a/Sources/xcode-selective-test/SelectiveTesting.swift +++ b/Sources/xcode-selective-test/SelectiveTesting.swift @@ -13,6 +13,9 @@ struct SelectiveTesting: AsyncParsableCommand { @Argument(help: "Project, workspace or package path", completion: .file(extensions: ["xcworkspace", "xcodeproj"])) var basePath: String? + @Option(name: [.customShort("c"), .long], parsing: .upToNextOption, help: "List of changed files") + var changedFiles: [String] = [] + @Option(name: .long, help: "Name of the base branch") var baseBranch: String? @@ -38,6 +41,7 @@ struct SelectiveTesting: AsyncParsableCommand { let tool = try SelectiveTestingTool(baseBranch: baseBranch, basePath: basePath, testPlan: testPlan, + changedFiles: changedFiles, printJSON: JSON, renderDependencyGraph: dependencyGraph, dot: dot, diff --git a/Tests/SelectiveTestingTests/IntegrationTestTool.swift b/Tests/SelectiveTestingTests/IntegrationTestTool.swift index b8671be..0b217bd 100644 --- a/Tests/SelectiveTestingTests/IntegrationTestTool.swift +++ b/Tests/SelectiveTestingTests/IntegrationTestTool.swift @@ -61,6 +61,7 @@ final class IntegrationTestTool { func createSUT(config: Config? = nil, basePath: Path? = nil, testPlan: String? = nil, + changedFiles: [String] = [], turbo: Bool = false) throws -> SelectiveTestingTool { if let config { @@ -72,6 +73,7 @@ final class IntegrationTestTool { return try SelectiveTestingTool(baseBranch: "main", basePath: basePath?.string, testPlan: testPlan, + changedFiles: changedFiles, renderDependencyGraph: false, turbo: turbo, verbose: true) @@ -81,6 +83,7 @@ final class IntegrationTestTool { return try SelectiveTestingTool(baseBranch: "main", basePath: (projectPath + "ExampleWorkspace.xcworkspace").string, testPlan: "ExampleProject.xctestplan", + changedFiles: [], renderDependencyGraph: false, verbose: true) } diff --git a/Tests/SelectiveTestingTests/SelectiveTestingProjectTests.swift b/Tests/SelectiveTestingTests/SelectiveTestingProjectTests.swift index 47dacf6..66c2fc5 100644 --- a/Tests/SelectiveTestingTests/SelectiveTestingProjectTests.swift +++ b/Tests/SelectiveTestingTests/SelectiveTestingProjectTests.swift @@ -87,4 +87,20 @@ final class SelectiveTestingProjectTests: XCTestCase { testTool.mainProjectUITests, ])) } + + func testPassingChangedFiles() async throws { + // given & when + let changedPath = testTool.projectPath + "ExampleProject/Base.lproj/Example.xib" + let tool = try testTool.createSUT(config: nil, + basePath: "ExampleProject.xcodeproj", + changedFiles: [changedPath.string]) + + // then + let result = try await tool.run() + XCTAssertEqual(result, Set([ + testTool.mainProjectMainTarget, + testTool.mainProjectTests, + testTool.mainProjectUITests, + ])) + } }