using ClaudeDo.Worker.Tickets; using TaskStatus = ClaudeDo.Data.Models.TaskStatus; namespace ClaudeDo.Worker.Tests.Tickets; public sealed class TicketStatusMapTests { [Theory] [InlineData(TaskStatus.Running, 2)] [InlineData(TaskStatus.WaitingForReview, 2)] [InlineData(TaskStatus.Done, 3)] public void Maps_the_three_states_we_report(TaskStatus status, int expected) => Assert.Equal(expected, TicketStatusMap.ToTicketStatus(status)); [Theory] [InlineData(TaskStatus.Idle)] [InlineData(TaskStatus.Queued)] [InlineData(TaskStatus.WaitingForChildren)] [InlineData(TaskStatus.Failed)] [InlineData(TaskStatus.Cancelled)] public void Everything_else_writes_nothing(TaskStatus status) => Assert.Null(TicketStatusMap.ToTicketStatus(status)); [Fact] public void Never_writes_Offen() { foreach (var status in Enum.GetValues()) Assert.NotEqual(1, TicketStatusMap.ToTicketStatus(status)); } // Der PATCH-Body braucht statusName; ein leerer Name wäre ein 400 der API. [Fact] public void NameOf_is_never_empty_for_any_status_we_write() { foreach (var status in Enum.GetValues()) { if (TicketStatusMap.ToTicketStatus(status) is not int id) continue; Assert.False(string.IsNullOrWhiteSpace(TicketStatusMap.NameOf(id))); } Assert.False(string.IsNullOrWhiteSpace(TicketStatusMap.NameOf(99))); } [Theory] [InlineData(1, "Offen")] [InlineData(2, "InBearbeitung")] [InlineData(3, "Fertig")] [InlineData(4, "Archiviert")] public void NameOf_matches_the_api_status_list(int id, string expected) => Assert.Equal(expected, TicketStatusMap.NameOf(id)); [Theory] [InlineData("bandel:1234", 1234)] [InlineData("BANDEL:7", 7)] public void Parses_a_bandel_ref(string reference, int expected) => Assert.Equal(expected, TicketStatusMap.ParseBandelTicketId(reference)); [Theory] [InlineData(null)] [InlineData("")] [InlineData("1234")] [InlineData("jira:ABC-1")] [InlineData("bandel:")] [InlineData("bandel:abc")] public void Rejects_anything_else(string? reference) => Assert.Null(TicketStatusMap.ParseBandelTicketId(reference)); }