using Bunit; using Duempelkas.App.Components.Accounts; using Duempelkas.App.Services.Models; using Duempelkas.Domain.Enums; using Xunit; namespace Duempelkas.Tests; public class EntryPresentationTests { [Fact] public void EmptyAccount_ShowsExplanationRatherThanParameterName() { using var f = new LedgerUiFixture(); f.Service().NavigateTo("/accounts/2"); var page = f.Context.Render(); page.WaitForAssertion(() => Assert.Contains("Noch keine Buchungen vorhanden.", page.Markup)); Assert.DoesNotContain("emptyEntriesMessage", page.Markup); } [Fact] public void Actions_AreDirectIconButtonsWithTitlesAndBookingSpecificNames() { using var fixture = new LedgerUiFixture(); var context = fixture.Context; var entry = new EntryDto(1, 1, "2026-001", EntryType.Expense, DateTime.Today, "Porto", 4.20m, false, false, null, null, null); var edited = 0; var table = context.Render(p => p.Add(x => x.Entries, [entry]).Add(x => x.OnEditEntry, id => edited = id)); Assert.Empty(table.FindAll("summary")); var edit = table.Find("button[title='Buchung bearbeiten']"); Assert.Contains("2026-001 Porto", edit.GetAttribute("aria-label")); Assert.NotNull(edit.QuerySelector(".bi-pencil[aria-hidden=true]")); Assert.NotNull(table.Find("button.btn-outline-danger .bi-trash")); Assert.Contains("Porto", edit.GetAttribute("aria-label")); edit.Click(); Assert.Equal(1, edited); } }