Forge
csharpdeeb25a2
1using CascadeIDE.Features.IdeMcp.Application;
2using CascadeIDE.Services;
3using Xunit;
4
5namespace CascadeIDE.Tests;
6
7public sealed class IdeMcpGitWorkspaceSessionTests
8{
9 [Fact]
10 public void TryCreate_null_workspace_returns_error_json()
11 {
12 var runner = new NoOpGitRunner();
13 Assert.False(IdeMcpGitWorkspaceSession.TryCreate(runner, null, out _, out var err));
14 Assert.Contains("Workspace path", err, StringComparison.Ordinal);
15 Assert.Contains("\"success\":false", err, StringComparison.Ordinal);
16 }
17
18 [Fact]
19 public void TryCreate_nonexistent_directory_returns_error_json()
20 {
21 var runner = new NoOpGitRunner();
22 Assert.False(IdeMcpGitWorkspaceSession.TryCreate(runner, @"Z:\nonexistent\cascade-git-test", out _, out var err));
23 Assert.Contains("\"exit_code\":-1", err, StringComparison.Ordinal);
24 }
25
26 [Fact]
27 public async Task GitStatusAsync_passes_workspace_to_runner_and_success_json()
28 {
29 var dir = Directory.CreateTempSubdirectory("cascade-git-mcp-test-");
30 try
31 {
32 var runner = new CapturingGitRunner { Result = (true, 0, "ok-branch") };
33 Assert.True(IdeMcpGitWorkspaceSession.TryCreate(runner, dir.FullName, out var session, out var bindErr), bindErr);
34 var json = await session!.GitStatusAsync();
35 Assert.Contains("\"success\":true", json, StringComparison.Ordinal);
36 Assert.Single(runner.WorkingDirectories);
37 Assert.Equal(dir.FullName, runner.WorkingDirectories[0]);
38 }
39 finally
40 {
41 try
42 {
43 dir.Delete(recursive: true);
44 }
45 catch
46 {
47 // Best-effort cleanup on temp dir.
48 }
49 }
50 }
51
52 private sealed class NoOpGitRunner : IGitCommandRunner
53 {
54 public Task<(bool Success, int ExitCode, string Output)> RunAsync(
55 IReadOnlyList<string> args,
56 string workingDirectory,
57 CancellationToken cancellationToken = default) =>
58 Task.FromResult((true, 0, ""));
59 }
60
61 private sealed class CapturingGitRunner : IGitCommandRunner
62 {
63 public List<string> WorkingDirectories { get; } = [];
64
65 public (bool Success, int ExitCode, string Output) Result = (true, 0, "");
66
67 public Task<(bool Success, int ExitCode, string Output)> RunAsync(
68 IReadOnlyList<string> args,
69 string workingDirectory,
70 CancellationToken cancellationToken = default)
71 {
72 WorkingDirectories.Add(workingDirectory);
73 return Task.FromResult(Result);
74 }
75 }
76}
77
View only · write via MCP/CIDE