Add SFTP tools with SCP fallback

This commit is contained in:
Vibe Myass
2026-05-24 21:18:09 +00:00
parent d3b39c590a
commit 8afa6dee62
12 changed files with 684 additions and 51 deletions

View File

@@ -8,11 +8,11 @@ namespace McpSsh.Tests;
public sealed class TerminalSessionManagerTests
{
[Fact]
public async Task StartAsync_CreatesSessionAndExecsRequestedShell()
public async Task StartAsync_CreatesSessionWithoutWritingShellSetup()
{
using var manager = CreateManager(out var factory, out _);
var result = await manager.StartAsync(" prod-api ", " deploy ", "bash", null, null, null, "/keys/id", "secret", null, CancellationToken.None);
var result = await manager.StartAsync(" prod-api ", " deploy ", null, null, null, "/keys/id", "secret", null, CancellationToken.None);
Assert.Null(result.Error);
Assert.StartsWith("term_", result.SessionId);
@@ -21,14 +21,14 @@ public sealed class TerminalSessionManagerTests
Assert.Equal("deploy", factory.Request.Username);
Assert.Equal("/keys/id", factory.Request.KeyPath);
Assert.Equal("secret", factory.Request.KeyPassphrase);
Assert.Contains("exec bash\n", factory.Connection.Writes);
Assert.Empty(factory.Connection.Writes);
}
[Fact]
public async Task Write_SendsInputToActiveSession()
{
using var manager = CreateManager(out var factory, out _);
var start = await manager.StartAsync("prod-api", "deploy", null, null, null, null, null, null, null, CancellationToken.None);
var start = await manager.StartAsync("prod-api", "deploy", null, null, null, null, null, null, CancellationToken.None);
var result = manager.Write(start.SessionId!, "uptime\n");
@@ -40,7 +40,7 @@ public sealed class TerminalSessionManagerTests
public async Task Read_DrainsBufferedOutputAndReportsTruncation()
{
using var manager = CreateManager(out var factory, out _);
var start = await manager.StartAsync("prod-api", "deploy", null, null, null, null, null, null, null, CancellationToken.None);
var start = await manager.StartAsync("prod-api", "deploy", null, null, null, null, null, null, CancellationToken.None);
factory.Connection.QueueOutput("abcdef");
var first = await ReadUntilOutputAsync(manager, start.SessionId!, 3);
@@ -67,7 +67,7 @@ public sealed class TerminalSessionManagerTests
public async Task Stop_DisposesAndRemovesSession()
{
using var manager = CreateManager(out var factory, out _);
var start = await manager.StartAsync("prod-api", "deploy", null, null, null, null, null, null, null, CancellationToken.None);
var start = await manager.StartAsync("prod-api", "deploy", null, null, null, null, null, null, CancellationToken.None);
var result = manager.Stop(start.SessionId!);
var writeAfterStop = manager.Write(start.SessionId!, "pwd\n");