From 480eb0817a95008cd9be96fa28879594a439481b Mon Sep 17 00:00:00 2001 From: Mika Kuns Date: Wed, 22 Apr 2026 13:10:21 +0200 Subject: [PATCH] feat(data): add TaskRepository.UpdateAgentSettingsAsync --- .../Repositories/TaskRepository.cs | 19 +++++ .../TaskRepositoryAgentSettingsTests.cs | 75 +++++++++++++++++++ 2 files changed, 94 insertions(+) create mode 100644 tests/ClaudeDo.Worker.Tests/Repositories/TaskRepositoryAgentSettingsTests.cs diff --git a/src/ClaudeDo.Data/Repositories/TaskRepository.cs b/src/ClaudeDo.Data/Repositories/TaskRepository.cs index e9465bc..24bab92 100644 --- a/src/ClaudeDo.Data/Repositories/TaskRepository.cs +++ b/src/ClaudeDo.Data/Repositories/TaskRepository.cs @@ -111,6 +111,25 @@ public sealed class TaskRepository #endregion + #region Agent settings + + public async Task UpdateAgentSettingsAsync( + string taskId, + string? model, + string? systemPrompt, + string? agentPath, + CancellationToken ct = default) + { + await _context.Tasks + .Where(t => t.Id == taskId) + .ExecuteUpdateAsync(s => s + .SetProperty(t => t.Model, model) + .SetProperty(t => t.SystemPrompt, systemPrompt) + .SetProperty(t => t.AgentPath, agentPath), ct); + } + + #endregion + #region Tags public async Task AddTagAsync(string taskId, long tagId, CancellationToken ct = default) diff --git a/tests/ClaudeDo.Worker.Tests/Repositories/TaskRepositoryAgentSettingsTests.cs b/tests/ClaudeDo.Worker.Tests/Repositories/TaskRepositoryAgentSettingsTests.cs new file mode 100644 index 0000000..6ac3d78 --- /dev/null +++ b/tests/ClaudeDo.Worker.Tests/Repositories/TaskRepositoryAgentSettingsTests.cs @@ -0,0 +1,75 @@ +using ClaudeDo.Data; +using ClaudeDo.Data.Models; +using ClaudeDo.Data.Repositories; +using ClaudeDo.Worker.Tests.Infrastructure; +using Xunit; + +namespace ClaudeDo.Worker.Tests.Repositories; + +public sealed class TaskRepositoryAgentSettingsTests : IDisposable +{ + private readonly DbFixture _db = new(); + private readonly ClaudeDoDbContext _ctx; + private readonly TaskRepository _repo; + + public TaskRepositoryAgentSettingsTests() + { + _ctx = _db.CreateContext(); + _repo = new TaskRepository(_ctx); + } + + public void Dispose() + { + _ctx.Dispose(); + _db.Dispose(); + } + + private async Task SeedTaskAsync() + { + using var ctx = _db.CreateContext(); + var listId = Guid.NewGuid().ToString(); + var taskId = Guid.NewGuid().ToString(); + await new ListRepository(ctx).AddAsync(new ListEntity + { + Id = listId, Name = "L", CreatedAt = DateTime.UtcNow, + }); + await new TaskRepository(ctx).AddAsync(new TaskEntity + { + Id = taskId, ListId = listId, Title = "T", CreatedAt = DateTime.UtcNow, + }); + return taskId; + } + + [Fact] + public async Task UpdateAgentSettingsAsync_SetsAllThreeFields() + { + var taskId = await SeedTaskAsync(); + + await _repo.UpdateAgentSettingsAsync(taskId, "opus", "system!", "/tmp/a.md"); + + var entity = await _repo.GetByIdAsync(taskId); + Assert.NotNull(entity); + Assert.Equal("opus", entity!.Model); + Assert.Equal("system!", entity.SystemPrompt); + Assert.Equal("/tmp/a.md", entity.AgentPath); + } + + [Fact] + public async Task UpdateAgentSettingsAsync_NullsClearColumns() + { + var taskId = await SeedTaskAsync(); + + using (var ctx = _db.CreateContext()) + { + await new TaskRepository(ctx).UpdateAgentSettingsAsync(taskId, "opus", "s", "/a.md"); + } + + await _repo.UpdateAgentSettingsAsync(taskId, null, null, null); + + var entity = await _repo.GetByIdAsync(taskId); + Assert.NotNull(entity); + Assert.Null(entity!.Model); + Assert.Null(entity.SystemPrompt); + Assert.Null(entity.AgentPath); + } +}