using Bunit; using Duempelkas.App.Components.Accounts; using Duempelkas.App.Services; using Duempelkas.App.Services.Models; using Duempelkas.Domain.Enums; using Xunit; namespace Duempelkas.Tests; public class EntrySearchTests { [Fact] public void Search_FindsKnownBookingInLargeList_AndResetsWithoutChangingAmounts() { using var context = new BunitContext(); var entries = Enumerable.Range(1, 400).Select(i => new EntryDto(i, 1, $"2026-{i:D3}", EntryType.Income, new(2026, 1, 1), i == 321 ? "Älteres Jubiläum" : $"Beitrag {i}", i == 321 ? 12.50m : i, false, false, null, null, null)).ToList(); var original = entries.Sum(e => e.Amount); var table = context.Render(p => p.Add(x => x.Entries, entries)); table.Find("#entry-search").Input("Älteres 12,50"); Assert.Single(table.FindAll("tbody tr")); Assert.Contains("12,50", table.Find(".search-summary").TextContent); Assert.Contains("unverändert", table.Find(".search-summary").TextContent); table.Find("#entry-search").Input("nicht vorhanden"); Assert.Empty(table.FindAll("tbody tr")); Assert.Contains("Keine Treffer", table.Markup); table.Find(".filter-reset").Click(); Assert.Equal(400, table.FindAll("tbody tr").Count); Assert.Equal(original, entries.Sum(e => e.Amount)); table.Find("#entry-search").Input("2026-321"); Assert.Single(table.FindAll("tbody tr")); } [Fact] public void Sort_UsesSignedAmounts_AndDeletedHistoryDoesNotAffectResultSum() { var entries = new List { new(1,1,"2026-001",EntryType.Expense,DateTime.Today,"Porto",20m,false,false,null,null,null), new(2,1,"2026-002",EntryType.Income,DateTime.Today,"Beitrag",10m,false,false,null,null,null), new(3,1,"2026-003",EntryType.Income,DateTime.Today,"Gelöscht",99m,true,false,null,null,null) }; Assert.Equal(new[] { 2, 1 }, EntryListQuery.Apply(entries, "", false, "amount-desc").Select(e => e.Id)); Assert.Single(EntryListQuery.Apply(entries, "-20,00", false, "date-asc")); Assert.Equal(3, EntryListQuery.Apply(entries, "", true, "date-asc").Count); } }