@@ -37,6 +37,48 @@ final class ExecutionServiceTests: XCTestCase {
3737 // Then
3838 XCTAssertEqual ( command, " npm start " )
3939 }
40+
41+ func testDetectRunCommand_DockerfileTakesPriorityOverSwift( ) async throws {
42+ // Given
43+ mockDocker. dockerCommandAvailable = true
44+ mockDocker. fileExistenceResults = [
45+ " Dockerfile " : true ,
46+ " Package.swift " : true
47+ ]
48+
49+ // When
50+ let command = try await service. detectRunCommand ( container: " test-container " )
51+
52+ // Then
53+ XCTAssertEqual ( command, " docker build -t zero-runner . && docker run --rm zero-runner " )
54+ }
55+
56+ func testDetectRunCommand_DockerfileStrategyWhenOnlyDockerfileExists( ) async throws {
57+ // Given
58+ mockDocker. dockerCommandAvailable = true
59+ mockDocker. fileExistenceResults = [ " Dockerfile " : true ]
60+
61+ // When
62+ let command = try await service. detectRunCommand ( container: " test-container " )
63+
64+ // Then
65+ XCTAssertEqual ( command, " docker build -t zero-runner . && docker run --rm zero-runner " )
66+ }
67+
68+ func testDetectRunCommand_DockerfileFallsBackWhenDockerUnavailable( ) async throws {
69+ // Given
70+ mockDocker. dockerCommandAvailable = false
71+ mockDocker. fileExistenceResults = [
72+ " Dockerfile " : true ,
73+ " Package.swift " : true
74+ ]
75+
76+ // When
77+ let command = try await service. detectRunCommand ( container: " test-container " )
78+
79+ // Then
80+ XCTAssertEqual ( command, " swift run " )
81+ }
4082
4183 func testExecute_Success( ) async {
4284 // Given
@@ -139,6 +181,7 @@ class MockExecutionDockerService: DockerServiceProtocol {
139181 var cancelCurrentExecutionCalled = false
140182 var streamingChunks : [ String ] = [ ]
141183 var interChunkDelayNanoseconds : UInt64 = 0
184+ var dockerCommandAvailable = true
142185
143186 func checkInstallation( ) throws -> Bool { return true }
144187
@@ -154,6 +197,10 @@ class MockExecutionDockerService: DockerServiceProtocol {
154197 func runContainer( image: String , name: String ) throws -> String { return " " }
155198 func executeCommand( container: String , command: String ) throws -> String { return " " }
156199 func executeShell( container: String , script: String ) throws -> String {
200+ if script. contains ( " command -v docker " ) {
201+ return dockerCommandAvailable ? " yes " : " no "
202+ }
203+
157204 if shouldBlockUntilCancelled {
158205 while !cancelCurrentExecutionCalled {
159206 usleep ( 10_000 )
0 commit comments