diff --git a/src/ClaudeDo.Ui/ViewModels/Islands/TasksIslandViewModel.cs b/src/ClaudeDo.Ui/ViewModels/Islands/TasksIslandViewModel.cs index c11597d8..968b5ade 100644 --- a/src/ClaudeDo.Ui/ViewModels/Islands/TasksIslandViewModel.cs +++ b/src/ClaudeDo.Ui/ViewModels/Islands/TasksIslandViewModel.cs @@ -443,6 +443,7 @@ public sealed partial class TasksIslandViewModel : ViewModelBase, IDisposable row.ShowListChip = _currentList?.Kind == ListKind.Virtual; Items.Add(row); Regroup(); + SelectedTask = row; NewTaskTitle = ""; UpdateSubtitle(); TasksChanged?.Invoke(this, EventArgs.Empty); diff --git a/tests/ClaudeDo.Ui.Tests/ViewModels/TasksIslandAddAndSelectTests.cs b/tests/ClaudeDo.Ui.Tests/ViewModels/TasksIslandAddAndSelectTests.cs new file mode 100644 index 00000000..2084300b --- /dev/null +++ b/tests/ClaudeDo.Ui.Tests/ViewModels/TasksIslandAddAndSelectTests.cs @@ -0,0 +1,76 @@ +using ClaudeDo.Data; +using ClaudeDo.Data.Models; +using ClaudeDo.Ui.ViewModels.Islands; +using Microsoft.EntityFrameworkCore; + +namespace ClaudeDo.Ui.Tests.ViewModels; + +public class TasksIslandAddAndSelectTests : IDisposable +{ + private readonly string _dbPath; + + public TasksIslandAddAndSelectTests() + { + _dbPath = Path.Combine(Path.GetTempPath(), $"claudedo_ui_addselect_{Guid.NewGuid():N}.db"); + using var ctx = NewContext(); + ctx.Database.EnsureCreated(); + } + + public void Dispose() + { + try { File.Delete(_dbPath); } catch { } + try { File.Delete(_dbPath + "-wal"); } catch { } + try { File.Delete(_dbPath + "-shm"); } catch { } + } + + private ClaudeDoDbContext NewContext() + { + var opts = new DbContextOptionsBuilder() + .UseSqlite($"Data Source={_dbPath}") + .Options; + return new ClaudeDoDbContext(opts); + } + + private sealed class TestDbFactory : IDbContextFactory + { + private readonly Func _create; + public TestDbFactory(Func create) => _create = create; + public ClaudeDoDbContext CreateDbContext() => _create(); + } + + private async Task SeedListAsync() + { + await using var db = NewContext(); + db.Lists.Add(new ListEntity { Id = "L1", Name = "Work", CreatedAt = DateTime.UtcNow }); + await db.SaveChangesAsync(); + } + + [Fact] + public async Task AddAsync_SelectsNewTask() + { + await SeedListAsync(); + var vm = new TasksIslandViewModel(new TestDbFactory(NewContext), worker: null); + vm.LoadForList(new ListNavItemViewModel { Id = "user:L1", Name = "Work", Kind = ListKind.User }); + await vm.LoadTask!; + + vm.NewTaskTitle = "My new task"; + await vm.AddCommand.ExecuteAsync(null); + + Assert.NotNull(vm.SelectedTask); + Assert.Equal("My new task", vm.SelectedTask!.Title); + } + + [Fact] + public async Task AddAsync_EmptyTitle_DoesNotChangeSelection() + { + await SeedListAsync(); + var vm = new TasksIslandViewModel(new TestDbFactory(NewContext), worker: null); + vm.LoadForList(new ListNavItemViewModel { Id = "user:L1", Name = "Work", Kind = ListKind.User }); + await vm.LoadTask!; + + vm.NewTaskTitle = ""; + await vm.AddCommand.ExecuteAsync(null); + + Assert.Null(vm.SelectedTask); + } +}