using Bunit; using Duempelkas.App.Components.Dialogs; using Duempelkas.App.Services; using Duempelkas.Domain.Enums; using Xunit; namespace Duempelkas.Tests; public class TransferDirectionTests { [Theory] [InlineData(1)] [InlineData(2)] public async Task BothSides_ShowSameDirection(int accountId) { using var f = new LedgerUiFixture(); var entries = f.Service(); await entries.CreateTransferAsync(1, 2, DateTime.Today, "Zur Bank", 20m); var entry = Assert.Single(await entries.GetEntriesAsync(accountId, (int?)null)); var dialog = f.Context.Render(p => p.Add(x => x.SourceAccountId, accountId).Add(x => x.EditEntry, entry)); dialog.WaitForAssertion(() => Assert.Contains("Von: Barkasse → Nach: Girokonto", dialog.Find("#transfer-direction").TextContent)); Assert.Contains("Gesamtsumme unverändert", dialog.Markup); Assert.Contains(accountId == 2 ? "Von Konto" : "Nach Konto", dialog.Find("label[for=transfer-account]").TextContent); } [Fact] public async Task IncomingEdit_MovesSource_AndRejectsSameAccountWithoutChanges() { using var f = new LedgerUiFixture(); var entries = f.Service(); var third = await f.Service().CreateAccountAsync("Sparkonto"); await entries.CreateTransferAsync(1, 2, DateTime.Today, "Zur Bank", 20m); var incoming = Assert.Single(await entries.GetEntriesAsync(2, (int?)null)); await Assert.ThrowsAsync(() => entries.UpdateTransferAsync(incoming.Id, 2, DateTime.Today, "Unzulässig", 99m)); Assert.Equal(20m, Assert.Single(await entries.GetEntriesAsync(2, (int?)null)).Amount); await entries.UpdateTransferAsync(incoming.Id, third.Id, DateTime.Today, "Andere Quelle", 25m); Assert.Empty(await entries.GetEntriesAsync(1, (int?)null)); Assert.Equal(EntryType.Expense, Assert.Single(await entries.GetEntriesAsync(third.Id, (int?)null)).Type); Assert.Equal(EntryType.Income, Assert.Single(await entries.GetEntriesAsync(2, (int?)null)).Type); } }