diff --git a/src/MxGateway.IntegrationTests/IntegrationTestEnvironment.cs b/src/MxGateway.IntegrationTests/IntegrationTestEnvironment.cs index 6660ec3..ec7768a 100644 --- a/src/MxGateway.IntegrationTests/IntegrationTestEnvironment.cs +++ b/src/MxGateway.IntegrationTests/IntegrationTestEnvironment.cs @@ -37,7 +37,7 @@ public static class IntegrationTestEnvironment return Path.GetFullPath(configuredPath); } - string repositoryRoot = ResolveRepositoryRoot(); + string repositoryRoot = ResolveRepositoryRoot(AppContext.BaseDirectory); string[] candidatePaths = [ Path.Combine(repositoryRoot, "src", "MxGateway.Worker", "bin", "x86", "Debug", "net48", "MxGateway.Worker.exe"), @@ -74,12 +74,13 @@ public static class IntegrationTestEnvironment return defaultValue; } - private static string ResolveRepositoryRoot() + internal static string ResolveRepositoryRoot(string startDirectory) { - DirectoryInfo? directory = new(AppContext.BaseDirectory); + DirectoryInfo? directory = new(startDirectory); while (directory is not null) { - if (Directory.Exists(Path.Combine(directory.FullName, ".git")) + if ((Directory.Exists(Path.Combine(directory.FullName, ".git")) + || File.Exists(Path.Combine(directory.FullName, ".git"))) && Directory.Exists(Path.Combine(directory.FullName, "src"))) { return directory.FullName; diff --git a/src/MxGateway.IntegrationTests/IntegrationTestEnvironmentTests.cs b/src/MxGateway.IntegrationTests/IntegrationTestEnvironmentTests.cs index 99aec5d..512f283 100644 --- a/src/MxGateway.IntegrationTests/IntegrationTestEnvironmentTests.cs +++ b/src/MxGateway.IntegrationTests/IntegrationTestEnvironmentTests.cs @@ -17,4 +17,29 @@ public sealed class IntegrationTestEnvironmentTests "MXGATEWAY_LIVE_MXACCESS_WORKER_EXE", IntegrationTestEnvironment.LiveMxAccessWorkerExecutableVariableName); } + + [Fact] + public void ResolveRepositoryRoot_AcceptsGitWorktreeFile() + { + string temporaryRoot = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); + string nestedDirectory = Path.Combine(temporaryRoot, "tests", "bin"); + + try + { + Directory.CreateDirectory(nestedDirectory); + Directory.CreateDirectory(Path.Combine(temporaryRoot, "src")); + File.WriteAllText(Path.Combine(temporaryRoot, ".git"), "gitdir: ../.git/worktrees/test"); + + string repositoryRoot = IntegrationTestEnvironment.ResolveRepositoryRoot(nestedDirectory); + + Assert.Equal(temporaryRoot, repositoryRoot); + } + finally + { + if (Directory.Exists(temporaryRoot)) + { + Directory.Delete(temporaryRoot, recursive: true); + } + } + } }