feat(claude-do): „Claude Help Me"-Button: Claude-Session zur Setup-Fehlersuch
Der Button, der aus „Problem erkannt" ein „Problem gelöst" macht: startet eine interaktive Claude-Session, die dem Nutzer beim Einrichten hilft. ## Warum externes Terminal Der ConPTY-Stack (`PtyTerminalSession`, `ConPtyPaneView`) liegt in `ClaudeDo.Ui` und ist Avalonia — der Installer ist WPF und referenziert nur Data/Releases/Localization. Beim Fresh Install sind `app\`/`worker\` außerdem noch n ClaudeDo-Task: 4e196058-38a3-404f-9862-4cb0e90195da
This commit is contained in:
+65
-2
@@ -1,13 +1,14 @@
|
||||
using ClaudeDo.Installer.Checks;
|
||||
using ClaudeDo.Installer.Core;
|
||||
using ClaudeDo.Installer.Tests.Core;
|
||||
using Vm = ClaudeDo.Installer.Pages.SystemCheckPage.SystemCheckPageViewModel;
|
||||
|
||||
namespace ClaudeDo.Installer.Tests.Pages.SystemCheckPage;
|
||||
|
||||
public sealed class SystemCheckPageViewModelTests
|
||||
{
|
||||
private static Vm CreateViewModel(Func<EnvironmentCheckService> factory) =>
|
||||
new(new InstallContext(), factory);
|
||||
private static Vm CreateViewModel(Func<EnvironmentCheckService> factory, ClaudeHelpLauncher? claudeHelpLauncher = null, InstallContext? context = null) =>
|
||||
new(context ?? new InstallContext(), factory, claudeHelpLauncher ?? TestClaudeHelpLauncher.Create());
|
||||
|
||||
private static Func<EnvironmentCheckService> FactoryFor(params IEnvironmentCheck[] checks) =>
|
||||
() => new EnvironmentCheckService(checks);
|
||||
@@ -169,4 +170,66 @@ public sealed class SystemCheckPageViewModelTests
|
||||
gate.SetResult();
|
||||
await run;
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task ClaudeHelp_disabled_when_claude_cli_check_failed()
|
||||
{
|
||||
var vm = CreateViewModel(FactoryFor(
|
||||
FakeEnvironmentCheck.Fail(ClaudeCliCheck.CheckId, CheckSeverity.Error),
|
||||
FakeEnvironmentCheck.Ok(ClaudeAuthCheck.CheckId)));
|
||||
|
||||
await vm.LoadAsync();
|
||||
|
||||
Assert.False(vm.CanStartClaudeHelp);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task ClaudeHelp_disabled_when_claude_auth_check_failed()
|
||||
{
|
||||
var vm = CreateViewModel(FactoryFor(
|
||||
FakeEnvironmentCheck.Ok(ClaudeCliCheck.CheckId),
|
||||
FakeEnvironmentCheck.Fail(ClaudeAuthCheck.CheckId, CheckSeverity.Error)));
|
||||
|
||||
await vm.LoadAsync();
|
||||
|
||||
Assert.False(vm.CanStartClaudeHelp);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task ClaudeHelp_enabled_when_both_checks_ok()
|
||||
{
|
||||
var vm = CreateViewModel(FactoryFor(
|
||||
FakeEnvironmentCheck.Ok(ClaudeCliCheck.CheckId),
|
||||
FakeEnvironmentCheck.Ok(ClaudeAuthCheck.CheckId)));
|
||||
|
||||
await vm.LoadAsync();
|
||||
|
||||
Assert.True(vm.CanStartClaudeHelp);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task ClaudeHelp_stays_enabled_when_auth_check_is_unknown()
|
||||
{
|
||||
var vm = CreateViewModel(FactoryFor(
|
||||
FakeEnvironmentCheck.Ok(ClaudeCliCheck.CheckId),
|
||||
FakeEnvironmentCheck.Unknown(ClaudeAuthCheck.CheckId)));
|
||||
|
||||
await vm.LoadAsync();
|
||||
|
||||
Assert.True(vm.CanStartClaudeHelp);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task ClaudeHelp_start_failure_sets_error_message_without_throwing()
|
||||
{
|
||||
var ctx = new InstallContext { ClaudeBin = "claudedo_totally_missing_cmd_9f3a1" };
|
||||
var vm = CreateViewModel(
|
||||
FactoryFor(FakeEnvironmentCheck.Ok(ClaudeCliCheck.CheckId), FakeEnvironmentCheck.Ok(ClaudeAuthCheck.CheckId)),
|
||||
context: ctx);
|
||||
await vm.LoadAsync();
|
||||
|
||||
await vm.StartClaudeHelpCommand.ExecuteAsync(null);
|
||||
|
||||
Assert.NotNull(vm.ClaudeHelpError);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user