From a1b3cff624736c52086f5a6b204c0b10f64f953f Mon Sep 17 00:00:00 2001 From: Lorenz Stechauner Date: Mon, 7 Oct 2024 22:59:10 +0200 Subject: [PATCH] [#11] Tests: Add DeliveryServiceTest --- Elwig/App.xaml.cs | 22 +- Elwig/Helpers/Utils.cs | 20 + Elwig/Services/DeliveryService.cs | 14 +- Elwig/ViewModels/DeliveryAdminViewModel.cs | 20 +- Elwig/Windows/DeliveryAdminWindow.xaml.cs | 19 +- Tests/DatabaseSetup.cs | 5 + Tests/Resources/Sql/ServiceDelete.sql | 2 + Tests/Resources/Sql/ServiceInsert.sql | 95 ++- Tests/ServiceTests/DeliveryServiceTest.cs | 847 +++++++++++++++++++++ Tests/ServiceTests/MemberServiceTest.cs | 8 + 10 files changed, 1008 insertions(+), 44 deletions(-) create mode 100644 Tests/ServiceTests/DeliveryServiceTest.cs diff --git a/Elwig/App.xaml.cs b/Elwig/App.xaml.cs index 1fcbc54..2c8bc6f 100644 --- a/Elwig/App.xaml.cs +++ b/Elwig/App.xaml.cs @@ -7,9 +7,6 @@ using Elwig.Helpers; using Elwig.Helpers.Weighing; using System.Collections.Generic; using System.Windows.Threading; -using System.Globalization; -using System.Threading; -using System.Windows.Markup; using System.Reflection; using Elwig.Helpers.Printing; using Elwig.Windows; @@ -62,7 +59,7 @@ namespace Elwig { MainDispatcher = Dispatcher; Scales = []; CurrentApp = this; - OverrideCulture(); + Utils.OverrideCulture(); var args = Environment.GetCommandLineArgs(); if (args.Length >= 2) { @@ -82,23 +79,6 @@ namespace Elwig { MainDispatcher.BeginInvoke(HintContextChange); } - private static void OverrideCulture() { - var locale = new CultureInfo("de-AT", false); - locale.NumberFormat.CurrencyGroupSeparator = Utils.GroupSeparator; - locale.NumberFormat.NumberGroupSeparator = Utils.GroupSeparator; - locale.NumberFormat.PercentGroupSeparator = Utils.GroupSeparator; - CultureInfo.CurrentCulture = locale; - CultureInfo.CurrentUICulture = locale; - Thread.CurrentThread.CurrentCulture = locale; - Thread.CurrentThread.CurrentUICulture = locale; - CultureInfo.DefaultThreadCurrentCulture = locale; - CultureInfo.DefaultThreadCurrentUICulture = locale; - FrameworkElement.LanguageProperty.OverrideMetadata( - typeof(FrameworkElement), - new FrameworkPropertyMetadata(XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.Name)) - ); - } - protected override async void OnStartup(StartupEventArgs evt) { Version = new Version(typeof(App).GetTypeInfo().Assembly.GetCustomAttribute()?.InformationalVersion.Split('+')[0] ?? "0.0.0"); diff --git a/Elwig/Helpers/Utils.cs b/Elwig/Helpers/Utils.cs index f4a3703..1de6c6f 100644 --- a/Elwig/Helpers/Utils.cs +++ b/Elwig/Helpers/Utils.cs @@ -28,6 +28,9 @@ using LinqKit; using System.Linq.Expressions; using Elwig.Models; using Microsoft.Win32; +using System.Globalization; +using System.Threading; +using System.Windows.Markup; namespace Elwig.Helpers { public static partial class Utils { @@ -118,6 +121,23 @@ namespace Elwig.Helpers { 0x8201, 0x42C0, 0x4380, 0x8341, 0x4100, 0x81C1, 0x8081, 0x4040, ]; + public static void OverrideCulture() { + var locale = new CultureInfo("de-AT", false); + locale.NumberFormat.CurrencyGroupSeparator = Utils.GroupSeparator; + locale.NumberFormat.NumberGroupSeparator = Utils.GroupSeparator; + locale.NumberFormat.PercentGroupSeparator = Utils.GroupSeparator; + CultureInfo.CurrentCulture = locale; + CultureInfo.CurrentUICulture = locale; + Thread.CurrentThread.CurrentCulture = locale; + Thread.CurrentThread.CurrentUICulture = locale; + CultureInfo.DefaultThreadCurrentCulture = locale; + CultureInfo.DefaultThreadCurrentUICulture = locale; + FrameworkElement.LanguageProperty.OverrideMetadata( + typeof(FrameworkElement), + new FrameworkPropertyMetadata(XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.Name)) + ); + } + public static SerialPort OpenSerialConnection(string connection) { var m = SerialRegex.Match(connection); if (!m.Success) diff --git a/Elwig/Services/DeliveryService.cs b/Elwig/Services/DeliveryService.cs index 58d2427..4d90cbb 100644 --- a/Elwig/Services/DeliveryService.cs +++ b/Elwig/Services/DeliveryService.cs @@ -462,7 +462,7 @@ namespace Elwig.Services { LNr = newLnr ?? oldDelivery!.LNr, ZwstId = vm.Branch!.ZwstId, LsNr = newLsNr ?? vm.LsNr!, - MgNr = (int)vm.MgNr!, + MgNr = vm.MgNr!.Value, Comment = string.IsNullOrEmpty(vm.Comment) ? null : vm.Comment, }; @@ -474,7 +474,7 @@ namespace Elwig.Services { SortId = vm.WineVar!.SortId, AttrId = vm.WineAttr?.AttrId, CultId = vm.WineCult?.CultId, - Kmw = (double)vm.GradationKmw!, + Kmw = vm.GradationKmw!.Value, QualId = vm.WineQualityLevel!.QualId, HkId = vm.WineOrigin!.HkId, KgNr = vm.WineKg?.KgNr, @@ -488,7 +488,7 @@ namespace Elwig.Services { Acid = vm.Acid, Comment = string.IsNullOrEmpty(vm.PartComment) ? null : vm.PartComment, - Weight = (int)vm.Weight!, + Weight = vm.Weight!.Value, IsManualWeighing = vm.IsManualWeighing, ScaleId = vm.ScaleId, WeighingData = vm.WeighingData, @@ -971,5 +971,13 @@ namespace Elwig.Services { return (wGrid, gGrid); } + + public static async Task DeleteDelivery(string lsnr) { + using (var ctx = new AppDbContext()) { + await ctx.Deliveries.Where(d => d.LsNr == lsnr).ExecuteDeleteAsync(); + await ctx.SaveChangesAsync(); + } + App.HintContextChange(); + } } } diff --git a/Elwig/ViewModels/DeliveryAdminViewModel.cs b/Elwig/ViewModels/DeliveryAdminViewModel.cs index ad8ea42..6e9ed35 100644 --- a/Elwig/ViewModels/DeliveryAdminViewModel.cs +++ b/Elwig/ViewModels/DeliveryAdminViewModel.cs @@ -96,10 +96,16 @@ namespace Elwig.ViewModels { private IEnumerable _wineCultSource = []; [ObservableProperty] private string? _gradationOeString; - public double? GradationOe => double.TryParse(GradationOeString, out var oe) ? oe : null; + public double? GradationOe { + get => double.TryParse(GradationOeString, out var oe) ? oe : null; + set => GradationOeString = $"{value:0}"; + } [ObservableProperty] private string? _gradationKmwString; - public double? GradationKmw => double.TryParse(GradationKmwString, out var kmw) ? kmw : null; + public double? GradationKmw { + get => double.TryParse(GradationKmwString, out var kmw) ? kmw : null; + set => GradationKmwString = $"{value:0.0}"; + } [ObservableProperty] private WineQualLevel? _wineQualityLevel; [ObservableProperty] @@ -152,10 +158,16 @@ namespace Elwig.ViewModels { private string? _partComment; [ObservableProperty] private string? _temperatureString; - public double? Temperature => double.TryParse(TemperatureString, out var t) ? t : null; + public double? Temperature { + get => double.TryParse(TemperatureString, out var t) ? t : null; + set => TemperatureString = $"{value:0.0}"; + } [ObservableProperty] private string? _acidString; - public double? Acid => double.TryParse(AcidString, out var a) ? a : null; + public double? Acid { + get => double.TryParse(AcidString, out var a) ? a : null; + set => AcidString = $"{value:0.0}"; + } [ObservableProperty] private bool _isLesewagen; [ObservableProperty] diff --git a/Elwig/Windows/DeliveryAdminWindow.xaml.cs b/Elwig/Windows/DeliveryAdminWindow.xaml.cs index 1fd899b..14560a7 100644 --- a/Elwig/Windows/DeliveryAdminWindow.xaml.cs +++ b/Elwig/Windows/DeliveryAdminWindow.xaml.cs @@ -172,9 +172,11 @@ namespace Elwig.Windows { Title = $"Traubentransportscheinliste (BKI) speichern unter - Elwig" }; if (d.ShowDialog() == true) { - Mouse.OverrideCursor = Cursors.AppStarting; - using var file = new Bki(d.FileName); - await file.ExportAsync(year); + Mouse.OverrideCursor = Cursors.Wait; + await Task.Run(async () => { + using var file = new Bki(d.FileName); + await file.ExportAsync(year); + }); Mouse.OverrideCursor = null; } } @@ -933,12 +935,13 @@ namespace Elwig.Windows { "Lieferung löschen", MessageBoxButton.OKCancel, MessageBoxImage.Warning, MessageBoxResult.Cancel); if (r == MessageBoxResult.OK) { Mouse.OverrideCursor = Cursors.AppStarting; - using (var ctx = new AppDbContext()) { - ctx.Remove(d); - await ctx.SaveChangesAsync(); + try { + await DeliveryService.DeleteDelivery(d.LsNr); + } catch (Exception exc) { + var str = "Der Eintrag konnte nicht in der Datenbank aktualisiert werden!\n\n" + exc.Message; + if (exc.InnerException != null) str += "\n\n" + exc.InnerException.Message; + MessageBox.Show(str, "Lieferung löschen", MessageBoxButton.OK, MessageBoxImage.Error); } - await RefreshList(); - await RefreshDeliveryParts(); Mouse.OverrideCursor = null; } } diff --git a/Tests/DatabaseSetup.cs b/Tests/DatabaseSetup.cs index 3ad9e55..7e5a432 100644 --- a/Tests/DatabaseSetup.cs +++ b/Tests/DatabaseSetup.cs @@ -30,6 +30,11 @@ namespace Tests { await BillingData.Init(); } + [OneTimeSetUp] + public void Setup_4_Culture() { + Utils.OverrideCulture(); + } + [OneTimeTearDown] public async Task TeardownDatabase() { AppDbContext.ConnectionStringOverride = null; diff --git a/Tests/Resources/Sql/ServiceDelete.sql b/Tests/Resources/Sql/ServiceDelete.sql index b5cf09a..553a721 100644 --- a/Tests/Resources/Sql/ServiceDelete.sql +++ b/Tests/Resources/Sql/ServiceDelete.sql @@ -7,3 +7,5 @@ DELETE FROM season; DELETE FROM area_commitment; DELETE FROM area_commitment_type; DELETE FROM member WHERE mgnr >= 200; +DELETE FROM wine_cultivation; +DELETE FROM wine_attribute; diff --git a/Tests/Resources/Sql/ServiceInsert.sql b/Tests/Resources/Sql/ServiceInsert.sql index b053556..c947db7 100644 --- a/Tests/Resources/Sql/ServiceInsert.sql +++ b/Tests/Resources/Sql/ServiceInsert.sql @@ -1,5 +1,12 @@ -- inserts for ServiceTests + +INSERT INTO wine_cultivation (cultid, name, description) VALUES +('B', 'Bio', 'AT-BIO-302'); + +INSERT INTO wine_attribute (attrid, name, active, max_kg_per_ha, strict, fill_lower) VALUES +('K', 'Kabinett', TRUE, NULL, FALSE, 0); + INSERT INTO member (mgnr, given_name, name, zwstid, volllieferant, buchführend, country, postal_dest, address, default_kgnr, iban, lfbis_nr, ustid_nr) VALUES (201, 'Theodor', 'Testbauer', 'X', FALSE, FALSE, 40, 222303524, 'Teststraße 1', 06109, 'AT811234567890123457', '0123463', NULL ), (202, 'Thomas', 'Testmann', 'X', FALSE, FALSE, 40, 222303524, 'Teststraße 2', 06109, 'AT541234567890123458', '0123471', 'ATU12345684'), @@ -30,21 +37,93 @@ INSERT INTO area_commitment (fbnr, mgnr, vtrgid, cultid, area, kgnr, gstnr, rdnr INSERT INTO season (year, currency, min_kg_per_bs, max_kg_per_bs, penalty_per_kg, penalty_amount, penalty_none, start_date, end_date) VALUES -(2021, 'EUR', 2000, 4000, NULL, NULL, NULL, NULL, NULL); +(2021, 'EUR', 2000, 4000, NULL, NULL, NULL, NULL, NULL), +(2022, 'EUR', 2000, 4000, NULL, NULL, NULL, NULL, NULL), +(2023, 'EUR', 2000, 4000, NULL, NULL, NULL, NULL, NULL); INSERT INTO modifier (year, modid, ordering, name, abs, rel, active) VALUES -(2021, 'S', 0, 'Geschädigte Trauben', NULL, -0.1, TRUE); +(2021, 'S', 0, 'Geschädigte Trauben', NULL, -0.1, TRUE), +(2022, 'S', 0, 'Geschädigte Trauben', NULL, -0.1, TRUE); INSERT INTO delivery (mgnr, year, did, date, time, zwstid, lnr) VALUES -(203, 2021, 1, '2021-10-01', NULL, 'X', 1), -(204, 2021, 2, '2021-10-01', NULL, 'X', 2); +(203, 2021, 1, '2021-10-01', NULL, 'X', 1), +(204, 2021, 2, '2021-10-01', NULL, 'X', 2), +(101, 2022, 1, '2022-09-29', NULL, 'X', 1), +(101, 2022, 2, '2022-09-30', NULL, 'X', 1), +(101, 2023, 1, '2023-10-01', NULL, 'X', 1), +(101, 2023, 2, '2023-10-01', NULL, 'X', 2), +(101, 2023, 3, '2023-10-01', NULL, 'X', 3), +(101, 2023, 4, '2023-10-01', NULL, 'X', 4), +(101, 2023, 5, '2023-10-02', NULL, 'X', 1), +(101, 2023, 6, '2023-10-03', NULL, 'X', 1), +(101, 2023, 7, '2023-10-04', NULL, 'X', 1), +(101, 2023, 8, '2023-10-05', NULL, 'X', 1), +(101, 2023, 9, '2023-10-06', NULL, 'X', 1), +(101, 2023, 10, '2023-10-06', NULL, 'X', 2), +(101, 2023, 11, '2023-10-07', NULL, 'X', 1), +(101, 2023, 12, '2023-10-07', NULL, 'X', 2), +(101, 2023, 13, '2023-10-08', NULL, 'X', 1), +(101, 2023, 14, '2023-10-08', NULL, 'X', 2), +(101, 2023, 15, '2023-10-09', NULL, 'X', 1), +(101, 2023, 16, '2023-10-09', NULL, 'X', 2), +(101, 2023, 17, '2023-10-10', NULL, 'X', 1), +(101, 2023, 18, '2023-10-10', NULL, 'X', 2), +(101, 2023, 19, '2023-10-10', NULL, 'X', 3); + INSERT INTO delivery_part (year, did, dpnr, sortid, attrid, cultid, weight, kmw, qualid, hkid, kgnr, net_weight, manual_weighing, spl_check, scale_id, weighing_data, weighing_reason) VALUES -(2021, 1, 1, 'GV', NULL, NULL, 3500, 15, 'QUW', 'WLNO', 15224, TRUE, FALSE, FALSE, NULL, NULL, NULL), -(2021, 2, 1, 'GV', NULL, NULL, 4000, 17, 'KAB', 'WLNO', 15224, TRUE, FALSE, FALSE, NULL, NULL, NULL), -(2021, 2, 2, 'GV', NULL, NULL, 4000, 16, 'QUW', 'WLNO', 15224, TRUE, FALSE, FALSE, NULL, NULL, NULL); +(2021, 1, 1, 'GV', NULL, NULL, 3500, 15.0, 'QUW', 'WLNO', 15224, TRUE, FALSE, FALSE, NULL, NULL, NULL), +(2021, 2, 1, 'GV', NULL, NULL, 4000, 17.0, 'KAB', 'WLNO', 15224, TRUE, FALSE, FALSE, NULL, NULL, NULL), +(2021, 2, 2, 'GV', NULL, NULL, 4000, 16.0, 'QUW', 'WLNO', 15224, TRUE, FALSE, FALSE, NULL, NULL, NULL), +(2022, 1, 1, 'GV', NULL, NULL, 3700, 16.5, 'QUW', 'WLNO', 15224, TRUE, FALSE, FALSE, NULL, NULL, NULL), +(2022, 1, 2, 'GV', NULL, NULL, 3700, 16.5, 'QUW', 'WLNO', 15224, TRUE, FALSE, FALSE, NULL, NULL, NULL), +(2023, 1, 1, 'GV', NULL, NULL, 1000, 15.0, 'QUW', 'WLNO', 15224, TRUE, FALSE, FALSE, NULL, NULL, NULL), +(2023, 1, 2, 'GV', NULL, NULL, 1000, 15.0, 'QUW', 'WLNO', 15224, TRUE, FALSE, FALSE, NULL, NULL, NULL), +(2023, 1, 3, 'GV', NULL, NULL, 1000, 15.0, 'QUW', 'WLNO', 15224, TRUE, FALSE, FALSE, NULL, NULL, NULL), +(2023, 2, 1, 'GV', NULL, NULL, 1000, 15.0, 'QUW', 'WLNO', 15224, TRUE, FALSE, FALSE, NULL, NULL, NULL), +(2023, 2, 2, 'GV', NULL, NULL, 1000, 15.0, 'QUW', 'WLNO', 15224, TRUE, FALSE, FALSE, NULL, NULL, NULL), +(2023, 2, 3, 'GV', NULL, NULL, 1000, 15.0, 'QUW', 'WLNO', 15224, TRUE, FALSE, FALSE, NULL, NULL, NULL), +(2023, 3, 1, 'GV', NULL, NULL, 1000, 15.0, 'QUW', 'WLNO', 15224, TRUE, FALSE, FALSE, NULL, NULL, NULL), +(2023, 3, 2, 'GV', NULL, NULL, 1000, 15.0, 'QUW', 'WLNO', 15224, TRUE, FALSE, FALSE, NULL, NULL, NULL), +(2023, 3, 3, 'GV', NULL, NULL, 1000, 15.0, 'QUW', 'WLNO', 15224, TRUE, FALSE, FALSE, NULL, NULL, NULL), +(2023, 4, 1, 'GV', NULL, NULL, 1000, 15.0, 'QUW', 'WLNO', 15224, TRUE, FALSE, FALSE, NULL, NULL, NULL), +(2023, 4, 2, 'GV', NULL, NULL, 1000, 15.0, 'QUW', 'WLNO', 15224, TRUE, FALSE, FALSE, NULL, NULL, NULL), +(2023, 4, 3, 'GV', NULL, NULL, 1000, 15.0, 'QUW', 'WLNO', 15224, TRUE, FALSE, FALSE, NULL, NULL, NULL), +(2023, 5, 1, 'GV', NULL, NULL, 1000, 15.0, 'QUW', 'WLNO', 15224, TRUE, FALSE, FALSE, NULL, NULL, NULL), +(2023, 5, 2, 'GV', NULL, NULL, 1000, 15.0, 'QUW', 'WLNO', 15224, TRUE, FALSE, FALSE, NULL, NULL, NULL), +(2023, 5, 3, 'GV', NULL, NULL, 1000, 15.0, 'QUW', 'WLNO', 15224, TRUE, FALSE, FALSE, NULL, NULL, NULL), +(2023, 6, 1, 'GV', NULL, NULL, 1000, 15.0, 'QUW', 'WLNO', 15224, TRUE, FALSE, FALSE, NULL, NULL, NULL), +(2023, 6, 2, 'GV', NULL, NULL, 1000, 15.0, 'QUW', 'WLNO', 15224, TRUE, FALSE, FALSE, NULL, NULL, NULL), +(2023, 6, 3, 'GV', NULL, NULL, 1000, 15.0, 'QUW', 'WLNO', 15224, TRUE, FALSE, FALSE, NULL, NULL, NULL), +(2023, 7, 1, 'GV', NULL, NULL, 1000, 15.0, 'QUW', 'WLNO', 15224, TRUE, FALSE, FALSE, NULL, NULL, NULL), +(2023, 7, 2, 'GV', NULL, NULL, 1000, 15.0, 'QUW', 'WLNO', 15224, TRUE, FALSE, FALSE, NULL, NULL, NULL), +(2023, 7, 3, 'GV', NULL, NULL, 1000, 15.0, 'QUW', 'WLNO', 15224, TRUE, FALSE, FALSE, NULL, NULL, NULL), +(2023, 8, 1, 'GV', NULL, NULL, 1000, 15.0, 'QUW', 'WLNO', 15224, TRUE, FALSE, FALSE, NULL, NULL, NULL), +(2023, 8, 2, 'GV', NULL, NULL, 1000, 15.0, 'QUW', 'WLNO', 15224, TRUE, FALSE, FALSE, NULL, NULL, NULL), +(2023, 8, 3, 'GV', NULL, NULL, 1000, 15.0, 'QUW', 'WLNO', 15224, TRUE, FALSE, FALSE, NULL, NULL, NULL), +(2023, 9, 1, 'GV', NULL, NULL, 1000, 15.0, 'QUW', 'WLNO', 15224, TRUE, FALSE, FALSE, NULL, NULL, NULL), +(2023, 9, 2, 'GV', NULL, NULL, 1000, 15.0, 'QUW', 'WLNO', 15224, TRUE, FALSE, FALSE, NULL, NULL, NULL), +(2023, 9, 3, 'GV', NULL, NULL, 1000, 15.0, 'QUW', 'WLNO', 15224, TRUE, FALSE, FALSE, NULL, NULL, NULL), +(2023, 10, 1, 'GV', NULL, NULL, 1000, 15.0, 'QUW', 'WLNO', 15224, TRUE, FALSE, FALSE, NULL, NULL, NULL), +(2023, 11, 1, 'GV', NULL, NULL, 1000, 15.0, 'QUW', 'WLNO', 15224, TRUE, FALSE, FALSE, NULL, NULL, NULL), +(2023, 11, 2, 'GV', NULL, NULL, 1000, 15.0, 'QUW', 'WLNO', 15224, TRUE, FALSE, FALSE, NULL, NULL, NULL), +(2023, 11, 3, 'GV', NULL, NULL, 1000, 15.0, 'QUW', 'WLNO', 15224, TRUE, FALSE, FALSE, NULL, NULL, NULL), +(2023, 12, 1, 'GV', NULL, NULL, 1000, 15.0, 'QUW', 'WLNO', 15224, TRUE, FALSE, FALSE, NULL, NULL, NULL), +(2023, 13, 1, 'GV', NULL, NULL, 1000, 15.0, 'QUW', 'WLNO', 15224, TRUE, FALSE, FALSE, NULL, NULL, NULL), +(2023, 13, 2, 'GV', NULL, NULL, 1000, 15.0, 'QUW', 'WLNO', 15224, TRUE, FALSE, FALSE, NULL, NULL, NULL), +(2023, 13, 3, 'GV', NULL, NULL, 1000, 15.0, 'QUW', 'WLNO', 15224, TRUE, FALSE, FALSE, NULL, NULL, NULL), +(2023, 14, 1, 'GV', NULL, NULL, 1000, 15.0, 'QUW', 'WLNO', 15224, TRUE, FALSE, FALSE, NULL, NULL, NULL), +(2023, 15, 1, 'GV', NULL, NULL, 1000, 15.0, 'QUW', 'WLNO', 15224, TRUE, FALSE, FALSE, NULL, NULL, NULL), +(2023, 15, 2, 'GV', NULL, NULL, 1000, 15.0, 'QUW', 'WLNO', 15224, TRUE, FALSE, FALSE, NULL, NULL, NULL), +(2023, 15, 3, 'GV', NULL, NULL, 1000, 15.0, 'QUW', 'WLNO', 15224, TRUE, FALSE, FALSE, NULL, NULL, NULL), +(2023, 16, 1, 'GV', NULL, NULL, 1000, 15.0, 'QUW', 'WLNO', 15224, TRUE, FALSE, FALSE, NULL, NULL, NULL), +(2023, 17, 1, 'GV', NULL, NULL, 1000, 15.0, 'QUW', 'WLNO', 15224, TRUE, FALSE, FALSE, NULL, NULL, NULL), +(2023, 18, 1, 'GV', NULL, NULL, 1000, 15.0, 'QUW', 'WLNO', 15224, TRUE, FALSE, FALSE, NULL, NULL, NULL), +(2023, 19, 1, 'GV', NULL, NULL, 1000, 15.0, 'QUW', 'WLNO', 15224, TRUE, FALSE, FALSE, NULL, NULL, NULL); + INSERT INTO delivery_part_modifier (year, did, dpnr, modid) VALUES (2021, 1, 1, 'S'), -(2021, 2, 2, 'S'); +(2021, 2, 2, 'S'), +(2022, 1, 2, 'S'); INSERT INTO payment_variant (year, avnr, name, date, transfer_date, test_variant, calc_time, comment, data) VALUES (2021, 1, 'Probevariante', '2022-01-15', '2022-01-15', TRUE, NULL, NULL, '{"mode":"elwig","version":1,"payment":0.5,"curves":[]}'); diff --git a/Tests/ServiceTests/DeliveryServiceTest.cs b/Tests/ServiceTests/DeliveryServiceTest.cs new file mode 100644 index 0000000..344ac9c --- /dev/null +++ b/Tests/ServiceTests/DeliveryServiceTest.cs @@ -0,0 +1,847 @@ +using Elwig.Helpers; +using Elwig.Models.Entities; +using Elwig.Services; +using Elwig.ViewModels; +using Microsoft.EntityFrameworkCore; + +namespace Tests.ServiceTests { + [TestFixture] + public class DeliveryServiceTest { + + private static async Task InitViewModel(DeliveryAdminViewModel vm) { + using var ctx = new AppDbContext(); + vm.MemberSource = await ctx.Members.ToListAsync(); + vm.BranchSource = await ctx.Branches.ToListAsync(); + vm.WineVarSource = await ctx.WineVarieties.ToListAsync(); + List attrs = (await ctx.WineAttributes.ToListAsync()).Cast().ToList(); + attrs.Insert(0, new NullItem()); + vm.WineAttrSource = attrs; + List cults = (await ctx.WineCultivations.ToListAsync()).Cast().ToList(); + cults.Insert(0, new NullItem()); + vm.WineCultSource = cults; + vm.WineQualityLevelSource = await ctx.WineQualityLevels.ToListAsync(); + vm.WineOriginSource = await ctx.WineOrigins.ToListAsync(); + vm.WineKgSource = await ctx.Katastralgemeinden.ToListAsync(); + vm.ModifiersSource = await ctx.Modifiers.Where(m => m.Year == 2022).ToListAsync(); + } + + private static async Task GetDelivery(string lsnr) { + using var ctx = new AppDbContext(); + return await ctx.Deliveries + .Where(d => d.LsNr == lsnr) + .Include(d => d.Parts) + .ThenInclude(p => p.PartModifiers) + .ThenInclude(m => m.Modifier) + .AsSplitQuery() + .FirstOrDefaultAsync(); + } + + private static DeliveryPart[] GetParts(Delivery d) { + return [.. d.Parts.OrderBy(p => p.DPNr)]; + } + + [Test] + public async Task TestCreate_01_Minimal() { + var vm = new DeliveryAdminViewModel(); + await InitViewModel(vm); + + vm.Date = "01.10.2022"; + vm.Branch = vm.BranchSource.First(); + vm.MgNr = 101; + vm.Member = vm.MemberSource.First(m => m.MgNr == vm.MgNr); + vm.SortId = "GV"; + vm.WineVar = vm.WineVarSource.First(v => v.SortId == vm.SortId); + vm.GradationKmw = 15.0; + vm.GradationOe = 73; + vm.Weight = 1234; + vm.IsManualWeighing = true; + vm.IsNetWeight = false; + vm.WineQualityLevel = vm.WineQualityLevelSource.First(l => l.QualId == "QUW"); + vm.WineOrigin = vm.WineOriginSource.First(o => o.HkId == "WLNO"); + + var p1 = await vm.UpdateDeliveryPart(2022, null, null, false, false, true); + Assert.That(p1.Delivery.LsNr, Is.EqualTo("20221001X001")); + + var d = await GetDelivery("20221001X001"); + + Assert.That(d, Is.Not.Null); + Assert.That(d.Parts, Has.Count.EqualTo(1)); + var p = d.Parts.First(); + Assert.That(p, Is.Not.Null); + Assert.Multiple(() => { + Assert.That(d.LsNr, Is.EqualTo("20221001X001")); + Assert.That(d.Date, Is.EqualTo(new DateOnly(2022, 10, 1))); + Assert.That(d.ZwstId, Is.EqualTo("X")); + Assert.That(d.MgNr, Is.EqualTo(101)); + Assert.That(p.SortId, Is.EqualTo("GV")); + Assert.That(p.AttrId, Is.Null); + Assert.That(p.CultId, Is.Null); + Assert.That(p.Kmw, Is.EqualTo(15.0)); + Assert.That(p.Oe, Is.EqualTo(73)); + Assert.That(p.QualId, Is.EqualTo("QUW")); + Assert.That(p.Weight, Is.EqualTo(1234)); + Assert.That(p.IsNetWeight, Is.False); + Assert.That(p.IsManualWeighing, Is.True); + Assert.That(p.HkId, Is.EqualTo("WLNO")); + }); + + vm = new DeliveryAdminViewModel(); + await InitViewModel(vm); + Assert.DoesNotThrow(() => { + vm.FillInputs(d); + vm.FillInputs(p); + }); + Assert.Multiple(() => { + Assert.That(vm.LsNr, Is.EqualTo("20221001X001")); + Assert.That(vm.Date, Is.EqualTo("01.10.2022")); + Assert.That(vm.Branch?.ZwstId, Is.EqualTo("X")); + Assert.That(vm.MgNr, Is.EqualTo(101)); + Assert.That(vm.SortId, Is.EqualTo("GV")); + Assert.That(vm.WineAttr?.AttrId, Is.Null); + Assert.That(vm.WineCult?.CultId, Is.Null); + Assert.That(vm.GradationKmw, Is.EqualTo(15.0)); + Assert.That(vm.WineQualityLevel?.QualId, Is.EqualTo("QUW")); + Assert.That(vm.Weight, Is.EqualTo(1234)); + Assert.That(vm.IsNetWeight, Is.False); + Assert.That(vm.IsManualWeighing, Is.True); + Assert.That(vm.WineOrigin?.HkId, Is.EqualTo("WLNO")); + }); + } + + [Test] + public async Task TestCreate_02_Advanced() { + var vm = new DeliveryAdminViewModel(); + await InitViewModel(vm); + + vm.Date = "02.10.2022"; + vm.Branch = vm.BranchSource.First(); + vm.MgNr = 102; + vm.Member = vm.MemberSource.First(m => m.MgNr == vm.MgNr); + vm.SortId = "ZW"; + vm.WineVar = vm.WineVarSource.First(v => v.SortId == vm.SortId); + vm.WineAttr = vm.WineAttrSource.Skip(1).First() as WineAttr; + vm.WineCult = vm.WineCultSource.Skip(1).First() as WineCult; + vm.GradationKmw = 15.9; + vm.GradationOe = 78; + vm.Weight = 3456; + vm.IsManualWeighing = false; + vm.IsNetWeight = true; + vm.WeighingData = "{}"; + vm.WineQualityLevel = vm.WineQualityLevelSource.First(l => l.QualId == "QUW"); + vm.WineOrigin = vm.WineOriginSource.First(o => o.HkId == "WLNO"); + vm.Modifiers.Add(vm.ModifiersSource.First()); + + var p1 = await vm.UpdateDeliveryPart(2022, null, null, false, false, true); + Assert.That(p1.Delivery.LsNr, Is.EqualTo("20221002X001")); + + var d = await GetDelivery("20221002X001"); + + Assert.That(d, Is.Not.Null); + Assert.That(d.Parts, Has.Count.EqualTo(1)); + var p = d.Parts.First(); + Assert.That(p, Is.Not.Null); + Assert.Multiple(() => { + Assert.That(d.LsNr, Is.EqualTo("20221002X001")); + Assert.That(d.Date, Is.EqualTo(new DateOnly(2022, 10, 2))); + Assert.That(d.ZwstId, Is.EqualTo("X")); + Assert.That(d.MgNr, Is.EqualTo(102)); + Assert.That(p.SortId, Is.EqualTo("ZW")); + Assert.That(p.AttrId, Is.Not.Null); + Assert.That(p.CultId, Is.Not.Null); + Assert.That(p.Kmw, Is.EqualTo(15.9)); + Assert.That(p.Oe, Is.EqualTo(78)); + Assert.That(p.QualId, Is.EqualTo("QUW")); + Assert.That(p.Weight, Is.EqualTo(3456)); + Assert.That(p.IsNetWeight, Is.True); + Assert.That(p.IsManualWeighing, Is.False); + Assert.That(p.WeighingData, Is.EqualTo("{}")); + Assert.That(p.HkId, Is.EqualTo("WLNO")); + Assert.That(p.Modifiers.Count(), Is.EqualTo(1)); + }); + + vm = new DeliveryAdminViewModel(); + await InitViewModel(vm); + Assert.DoesNotThrow(() => { + vm.FillInputs(d); + vm.FillInputs(p); + }); + Assert.Multiple(() => { + Assert.That(vm.LsNr, Is.EqualTo("20221002X001")); + Assert.That(vm.Date, Is.EqualTo("02.10.2022")); + Assert.That(vm.Branch?.ZwstId, Is.EqualTo("X")); + Assert.That(vm.MgNr, Is.EqualTo(102)); + Assert.That(vm.SortId, Is.EqualTo("ZW")); + Assert.That(vm.WineAttr?.AttrId, Is.Not.Null); + Assert.That(vm.WineCult?.CultId, Is.Not.Null); + Assert.That(vm.GradationKmw, Is.EqualTo(15.9)); + Assert.That(vm.WineQualityLevel?.QualId, Is.EqualTo("QUW")); + Assert.That(vm.Weight, Is.EqualTo(3456)); + Assert.That(vm.IsNetWeight, Is.True); + Assert.That(vm.IsManualWeighing, Is.False); + Assert.That(vm.WeighingData, Is.EqualTo("{}")); + Assert.That(vm.WineOrigin?.HkId, Is.EqualTo("WLNO")); + Assert.That(vm.Modifiers, Has.Count.EqualTo(1)); + }); + } + + [Test] + public async Task TestCreate_03_TwoParts() { + var vm = new DeliveryAdminViewModel(); + await InitViewModel(vm); + + vm.Date = "03.10.2022"; + vm.Branch = vm.BranchSource.First(); + vm.MgNr = 101; + vm.Member = vm.MemberSource.First(m => m.MgNr == vm.MgNr); + vm.SortId = "GV"; + vm.WineVar = vm.WineVarSource.First(v => v.SortId == vm.SortId); + vm.GradationKmw = 15.0; + vm.GradationOe = 73; + vm.WineQualityLevel = vm.WineQualityLevelSource.First(l => l.QualId == "QUW"); + vm.Weight = 1234; + vm.IsManualWeighing = true; + vm.IsNetWeight = true; + vm.WineOrigin = vm.WineOriginSource.First(o => o.HkId == "WLNO"); + var p1 = await vm.UpdateDeliveryPart(2022, null, null, false, false, true); + + Assert.That(p1.Delivery.LsNr, Is.EqualTo("20221003X001")); + vm.FillInputs(p1.Delivery); + + vm.SortId = "WR"; + vm.WineVar = vm.WineVarSource.First(v => v.SortId == vm.SortId); + vm.GradationKmw = 18.0; + vm.GradationOe = 89; + vm.WineQualityLevel = vm.WineQualityLevelSource.First(l => l.QualId == "KAB"); + vm.Weight = 2345; + var p2 = await vm.UpdateDeliveryPart(p1.Year, p1.DId, null, false, false, true); + + Assert.That(p2.Delivery.LsNr, Is.EqualTo("20221003X001")); + + var d = await GetDelivery("20221003X001"); + + Assert.That(d, Is.Not.Null); + Assert.Multiple(() => { + Assert.That(d.Parts, Has.Count.EqualTo(2)); + Assert.That(d.MgNr, Is.EqualTo(101)); + }); + var p = d.Parts.First(); + Assert.That(p, Is.Not.Null); + Assert.Multiple(() => { + Assert.That(p.DPNr, Is.EqualTo(1)); + Assert.That(p.SortId, Is.EqualTo("GV")); + }); + p = d.Parts.Skip(1).First(); + Assert.That(p, Is.Not.Null); + Assert.Multiple(() => { + Assert.That(p.DPNr, Is.EqualTo(2)); + Assert.That(p.SortId, Is.EqualTo("WR")); + }); + } + + [Test] + public async Task TestCreate_04_ChangeMember() { + var vm = new DeliveryAdminViewModel(); + await InitViewModel(vm); + + vm.Date = "04.10.2022"; + vm.Branch = vm.BranchSource.First(); + vm.MgNr = 101; + vm.Member = vm.MemberSource.First(m => m.MgNr == vm.MgNr); + vm.SortId = "GV"; + vm.WineVar = vm.WineVarSource.First(v => v.SortId == vm.SortId); + vm.GradationKmw = 15.0; + vm.GradationOe = 73; + vm.WineQualityLevel = vm.WineQualityLevelSource.First(l => l.QualId == "QUW"); + vm.Weight = 1234; + vm.IsManualWeighing = true; + vm.IsNetWeight = true; + vm.WineOrigin = vm.WineOriginSource.First(o => o.HkId == "WLNO"); + var p1 = await vm.UpdateDeliveryPart(2022, null, null, false, false, true); + + Assert.That(p1.Delivery.LsNr, Is.EqualTo("20221004X001")); + vm.FillInputs(p1.Delivery); + + vm.MgNr = 102; + vm.Member = vm.MemberSource.First(m => m.MgNr == vm.MgNr); + vm.SortId = "GV"; + vm.WineVar = vm.WineVarSource.First(v => v.SortId == vm.SortId); + vm.GradationKmw = 15.0; + vm.GradationOe = 73; + vm.WineQualityLevel = vm.WineQualityLevelSource.First(l => l.QualId == "QUW"); + vm.Weight = 1234; + vm.IsManualWeighing = true; + vm.IsNetWeight = true; + vm.WineOrigin = vm.WineOriginSource.First(o => o.HkId == "WLNO"); + + var p2 = await vm.UpdateDeliveryPart(p1.Year, p1.DId, null, false, false, true); + + Assert.That(p2.Delivery.LsNr, Is.EqualTo("20221004X001")); + + var d = await GetDelivery("20221004X001"); + + Assert.That(d, Is.Not.Null); + Assert.Multiple(() => { + Assert.That(d.Parts, Has.Count.EqualTo(2)); + Assert.That(d.MgNr, Is.EqualTo(102)); + }); + } + + [Test] + public async Task TestCreate_05_LNrChanged() { + var vm = new DeliveryAdminViewModel(); + await InitViewModel(vm); + + vm.Date = "29.09.2022"; + vm.Branch = vm.BranchSource.First(); + vm.LsNr = "20220929X001"; // "old" LNr, simulated change in DB + vm.MgNr = 101; + vm.Member = vm.MemberSource.First(m => m.MgNr == vm.MgNr); + vm.SortId = "GV"; + vm.WineVar = vm.WineVarSource.First(v => v.SortId == vm.SortId); + vm.GradationKmw = 15.0; + vm.GradationOe = 73; + vm.WineQualityLevel = vm.WineQualityLevelSource.First(l => l.QualId == "QUW"); + vm.Weight = 1234; + vm.IsManualWeighing = true; + vm.IsNetWeight = true; + vm.WineOrigin = vm.WineOriginSource.First(o => o.HkId == "WLNO"); + var p1 = await vm.UpdateDeliveryPart(2022, null, null, false, false, true); + + Assert.That(p1.Delivery.LsNr, Is.EqualTo("20220929X002")); + + var d = GetDelivery("20220929X002"); + Assert.That(d, Is.Not.Null); + } + + [Test] + public async Task TestUpdate_01_Simple() { + var vm = new DeliveryAdminViewModel(); + await InitViewModel(vm); + + var d = await GetDelivery("20231010X001"); + Assert.That(d, Is.Not.Null); + var p = d.Parts.First(); + Assert.That(p, Is.Not.Null); + Assert.DoesNotThrow(() => { + vm.FillInputs(d); + vm.FillInputs(p); + }); + + vm.SortId = "WR"; + vm.WineVar = vm.WineVarSource.First(v => v.SortId == vm.SortId); + vm.GradationKmw = 15.9; + vm.GradationOe = 79; + + Assert.DoesNotThrowAsync(async () => await DeliveryService.UpdateDeliveryPart(vm, p.Year, p.DId, p.DPNr, false, false, true)); + + d = await GetDelivery("20231010X001"); + Assert.That(d, Is.Not.Null); + p = d.Parts.First(); + Assert.That(p, Is.Not.Null); + + vm = new DeliveryAdminViewModel(); + await InitViewModel(vm); + Assert.DoesNotThrow(() => { + vm.FillInputs(d); + vm.FillInputs(p); + }); + Assert.Multiple(() => { + Assert.That(vm.SortId, Is.EqualTo("WR")); + Assert.That(vm.GradationKmw, Is.EqualTo(15.9)); + }); + } + + [Test] + public async Task TestUpdate_02_Member() { + var vm = new DeliveryAdminViewModel(); + await InitViewModel(vm); + + var d = await GetDelivery("20231010X002"); + Assert.That(d, Is.Not.Null); + var p = d.Parts.First(); + Assert.That(p, Is.Not.Null); + Assert.DoesNotThrow(() => { + vm.FillInputs(d); + vm.FillInputs(p); + }); + Assert.That(d.MgNr, Is.EqualTo(101)); + + vm.SortId = "GV"; + vm.WineVar = vm.WineVarSource.First(v => v.SortId == vm.SortId); + vm.MgNr = 102; + vm.Member = vm.MemberSource.First(m => m.MgNr == vm.MgNr); + + Assert.DoesNotThrowAsync(async () => await DeliveryService.UpdateDeliveryPart(vm, p.Year, p.DId, p.DPNr, false, false, true)); + + d = await GetDelivery("20231010X002"); + Assert.That(d, Is.Not.Null); + Assert.That(d.MgNr, Is.EqualTo(102)); + } + + [Test] + public async Task TestUpdate_03_DateAndTime() { + var vm = new DeliveryAdminViewModel(); + await InitViewModel(vm); + + var d = await GetDelivery("20231015X001"); + Assert.That(d, Is.Null); + d = await GetDelivery("20231010X003"); + Assert.That(d, Is.Not.Null); + var p = d.Parts.First(); + Assert.That(p, Is.Not.Null); + Assert.DoesNotThrow(() => { + vm.FillInputs(d); + vm.FillInputs(p); + }); + Assert.That(d.MgNr, Is.EqualTo(101)); + + vm.SortId = "GV"; + vm.WineVar = vm.WineVarSource.First(v => v.SortId == vm.SortId); + vm.Date = "15.10.2023"; + vm.Time = "12:00"; + + Assert.DoesNotThrowAsync(async () => await DeliveryService.UpdateDeliveryPart(vm, p.Year, p.DId, p.DPNr, true, true, false)); + + d = await GetDelivery("20231010X003"); + Assert.That(d, Is.Null); + d = await GetDelivery("20231015X001"); + Assert.That(d, Is.Not.Null); + } + + [Test] + public async Task TestSplit_01_Depreciate_One() { + var d = await GetDelivery("20231001X001"); + Assert.That(d, Is.Not.Null); + Assert.Multiple(() => { + var ps = GetParts(d); + Assert.That(ps, Has.Length.EqualTo(3)); + Assert.That(ps[0].Weight, Is.EqualTo(1000)); + Assert.That(ps[0].QualId, Is.Not.EqualTo("WEI")); + Assert.That(ps[1].QualId, Is.Not.EqualTo("WEI")); + Assert.That(ps[2].QualId, Is.Not.EqualTo("WEI")); + }); + + Assert.DoesNotThrowAsync(async () => await DeliveryService.DepreciateDelivery(d.Year, d.DId, [1000, 0, 0])); + d = await GetDelivery("20231001X001"); + Assert.That(d, Is.Not.Null); + Assert.Multiple(() => { + var ps = GetParts(d); + Assert.That(ps, Has.Length.EqualTo(3)); + Assert.That(ps[0].Weight, Is.EqualTo(1000)); + Assert.That(ps[0].QualId, Is.EqualTo("WEI")); + Assert.That(ps[1].QualId, Is.Not.EqualTo("WEI")); + Assert.That(ps[2].QualId, Is.Not.EqualTo("WEI")); + }); + } + + [Test] + public async Task TestSplit_02_Depreciate_Partial() { + var d = await GetDelivery("20231001X002"); + Assert.That(d, Is.Not.Null); + Assert.Multiple(() => { + var ps = GetParts(d); + Assert.That(ps, Has.Length.EqualTo(3)); + Assert.That(ps[0].Weight, Is.EqualTo(1000)); + Assert.That(ps[0].QualId, Is.Not.EqualTo("WEI")); + Assert.That(ps[1].QualId, Is.Not.EqualTo("WEI")); + Assert.That(ps[2].QualId, Is.Not.EqualTo("WEI")); + }); + + Assert.DoesNotThrowAsync(async () => await DeliveryService.DepreciateDelivery(d.Year, d.DId, [600, 0, 0])); + d = await GetDelivery("20231001X002"); + Assert.That(d, Is.Not.Null); + Assert.Multiple(() => { + var ps = GetParts(d); + Assert.That(ps, Has.Length.EqualTo(4)); + Assert.That(ps[0].Weight, Is.EqualTo(400)); + Assert.That(ps[0].QualId, Is.Not.EqualTo("WEI")); + Assert.That(ps[1].QualId, Is.Not.EqualTo("WEI")); + Assert.That(ps[2].QualId, Is.Not.EqualTo("WEI")); + Assert.That(ps[3].Weight, Is.EqualTo(600)); + Assert.That(ps[3].QualId, Is.EqualTo("WEI")); + }); + } + + [Test] + public async Task TestSplit_03_Depreciate_Mixed() { + var d = await GetDelivery("20231001X003"); + Assert.That(d, Is.Not.Null); + Assert.Multiple(() => { + var ps = GetParts(d); + Assert.That(ps, Has.Length.EqualTo(3)); + Assert.That(ps[0].Weight, Is.EqualTo(1000)); + Assert.That(ps[0].QualId, Is.Not.EqualTo("WEI")); + Assert.That(ps[1].Weight, Is.EqualTo(1000)); + Assert.That(ps[1].QualId, Is.Not.EqualTo("WEI")); + Assert.That(ps[2].QualId, Is.Not.EqualTo("WEI")); + }); + + Assert.DoesNotThrowAsync(async () => await DeliveryService.DepreciateDelivery(d.Year, d.DId, [1000, 700, -5])); + d = await GetDelivery("20231001X003"); + Assert.That(d, Is.Not.Null); + Assert.Multiple(() => { + var ps = GetParts(d); + Assert.That(ps, Has.Length.EqualTo(4)); + Assert.That(ps[0].Weight, Is.EqualTo(1000)); + Assert.That(ps[0].QualId, Is.EqualTo("WEI")); + Assert.That(ps[1].Weight, Is.EqualTo(300)); + Assert.That(ps[1].QualId, Is.Not.EqualTo("WEI")); + Assert.That(ps[2].Weight, Is.EqualTo(1000)); + Assert.That(ps[2].QualId, Is.Not.EqualTo("WEI")); + Assert.That(ps[3].Weight, Is.EqualTo(700)); + Assert.That(ps[3].QualId, Is.EqualTo("WEI")); + }); + } + + [Test] + public async Task TestSplit_04_Depreciate_Complete() { + var d = await GetDelivery("20231001X004"); + Assert.That(d, Is.Not.Null); + Assert.Multiple(() => { + var ps = GetParts(d); + Assert.That(ps, Has.Length.EqualTo(3)); + Assert.That(ps[0].Weight, Is.EqualTo(1000)); + Assert.That(ps[0].QualId, Is.Not.EqualTo("WEI")); + Assert.That(ps[1].Weight, Is.EqualTo(1000)); + Assert.That(ps[1].QualId, Is.Not.EqualTo("WEI")); + Assert.That(ps[2].Weight, Is.EqualTo(1000)); + Assert.That(ps[2].QualId, Is.Not.EqualTo("WEI")); + }); + + Assert.DoesNotThrowAsync(async () => await DeliveryService.DepreciateDelivery(d.Year, d.DId, [1000, 1100, int.MaxValue])); + d = await GetDelivery("20231001X004"); + Assert.That(d, Is.Not.Null); + Assert.Multiple(() => { + var ps = GetParts(d); + Assert.That(ps, Has.Length.EqualTo(3)); + Assert.That(ps[0].Weight, Is.EqualTo(1000)); + Assert.That(ps[0].QualId, Is.EqualTo("WEI")); + Assert.That(ps[1].Weight, Is.EqualTo(1000)); + Assert.That(ps[1].QualId, Is.EqualTo("WEI")); + Assert.That(ps[2].Weight, Is.EqualTo(1000)); + Assert.That(ps[2].QualId, Is.EqualTo("WEI")); + }); + } + + [Test] + public async Task TestSplit_05_OtherMember_One() { + var d1 = await GetDelivery("20231002X001"); + var d2 = await GetDelivery("20231002X002"); + Assert.Multiple(() => { + Assert.That(d1, Is.Not.Null); + Assert.That(d2, Is.Null); + }); + Assert.Multiple(() => { + var ps1 = GetParts(d1); + Assert.That(d1.MgNr, Is.EqualTo(101)); + Assert.That(ps1, Has.Length.EqualTo(3)); + Assert.That(ps1[0].Weight, Is.EqualTo(1000)); + Assert.That(ps1[1].Weight, Is.EqualTo(1000)); + Assert.That(ps1[2].Weight, Is.EqualTo(1000)); + }); + + Assert.DoesNotThrowAsync(async () => await DeliveryService.SplitDeliveryToMember(d1.Year, d1.DId, [1000, 0, 0], 102)); + d1 = await GetDelivery("20231002X001"); + d2 = await GetDelivery("20231002X002"); + Assert.Multiple(() => { + Assert.That(d1, Is.Not.Null); + Assert.That(d2, Is.Not.Null); + }); + Assert.Multiple(() => { + var ps1 = GetParts(d1); + var ps2 = GetParts(d2); + Assert.That(d1.MgNr, Is.EqualTo(101)); + Assert.That(d2.MgNr, Is.EqualTo(102)); + Assert.That(ps1, Has.Length.EqualTo(2)); + Assert.That(ps1[0].DPNr, Is.EqualTo(2)); + Assert.That(ps1[0].Weight, Is.EqualTo(1000)); + Assert.That(ps1[1].DPNr, Is.EqualTo(3)); + Assert.That(ps1[1].Weight, Is.EqualTo(1000)); + Assert.That(ps2, Has.Length.EqualTo(1)); + Assert.That(ps2[0].DPNr, Is.EqualTo(1)); + Assert.That(ps2[0].Weight, Is.EqualTo(1000)); + }); + } + + [Test] + public async Task TestSplit_06_OtherMember_Partial() { + var d1 = await GetDelivery("20231003X001"); + var d2 = await GetDelivery("20231003X002"); + Assert.Multiple(() => { + Assert.That(d1, Is.Not.Null); + Assert.That(d2, Is.Null); + }); + Assert.Multiple(() => { + var ps1 = GetParts(d1); + Assert.That(d1.MgNr, Is.EqualTo(101)); + Assert.That(ps1, Has.Length.EqualTo(3)); + Assert.That(ps1[0].Weight, Is.EqualTo(1000)); + Assert.That(ps1[1].Weight, Is.EqualTo(1000)); + Assert.That(ps1[2].Weight, Is.EqualTo(1000)); + }); + + Assert.DoesNotThrowAsync(async () => await DeliveryService.SplitDeliveryToMember(d1.Year, d1.DId, [400, -1, -2], 102)); + d1 = await GetDelivery("20231003X001"); + d2 = await GetDelivery("20231003X002"); + Assert.Multiple(() => { + Assert.That(d1, Is.Not.Null); + Assert.That(d2, Is.Not.Null); + }); + Assert.Multiple(() => { + var ps1 = GetParts(d1); + var ps2 = GetParts(d2); + Assert.That(d1.MgNr, Is.EqualTo(101)); + Assert.That(d2.MgNr, Is.EqualTo(102)); + Assert.That(ps1, Has.Length.EqualTo(3)); + Assert.That(ps1[0].Weight, Is.EqualTo(600)); + Assert.That(ps1[1].Weight, Is.EqualTo(1000)); + Assert.That(ps1[2].Weight, Is.EqualTo(1000)); + Assert.That(ps2, Has.Length.EqualTo(1)); + Assert.That(ps2[0].Weight, Is.EqualTo(400)); + }); + } + + [Test] + public async Task TestSplit_07_OtherMember_Mixed() { + var d1 = await GetDelivery("20231004X001"); + var d2 = await GetDelivery("20231004X002"); + Assert.Multiple(() => { + Assert.That(d1, Is.Not.Null); + Assert.That(d2, Is.Null); + }); + Assert.Multiple(() => { + var ps1 = GetParts(d1); + Assert.That(d1.MgNr, Is.EqualTo(101)); + Assert.That(ps1, Has.Length.EqualTo(3)); + Assert.That(ps1[0].Weight, Is.EqualTo(1000)); + Assert.That(ps1[1].Weight, Is.EqualTo(1000)); + Assert.That(ps1[2].Weight, Is.EqualTo(1000)); + }); + + Assert.DoesNotThrowAsync(async () => await DeliveryService.SplitDeliveryToMember(d1.Year, d1.DId, [200, 1000, int.MinValue], 102)); + d1 = await GetDelivery("20231004X001"); + d2 = await GetDelivery("20231004X002"); + Assert.Multiple(() => { + Assert.That(d1, Is.Not.Null); + Assert.That(d2, Is.Not.Null); + }); + Assert.Multiple(() => { + var ps1 = GetParts(d1); + var ps2 = GetParts(d2); + Assert.That(d1.MgNr, Is.EqualTo(101)); + Assert.That(d2.MgNr, Is.EqualTo(102)); + Assert.That(ps1, Has.Length.EqualTo(2)); + Assert.That(ps1[0].DPNr, Is.EqualTo(1)); + Assert.That(ps1[0].Weight, Is.EqualTo(800)); + Assert.That(ps1[1].DPNr, Is.EqualTo(3)); + Assert.That(ps1[1].Weight, Is.EqualTo(1000)); + Assert.That(ps2, Has.Length.EqualTo(2)); + Assert.That(ps2[0].DPNr, Is.EqualTo(1)); + Assert.That(ps2[0].Weight, Is.EqualTo(200)); + Assert.That(ps2[1].DPNr, Is.EqualTo(2)); + Assert.That(ps2[1].Weight, Is.EqualTo(1000)); + }); + } + + [Test] + public async Task TestSplit_08_OtherMember_Complete() { + var d1 = await GetDelivery("20231005X001"); + var d2 = await GetDelivery("20231005X002"); + Assert.Multiple(() => { + Assert.That(d1, Is.Not.Null); + Assert.That(d2, Is.Null); + }); + Assert.Multiple(() => { + var ps1 = GetParts(d1); + Assert.That(d1.MgNr, Is.EqualTo(101)); + Assert.That(ps1, Has.Length.EqualTo(3)); + Assert.That(ps1[0].Weight, Is.EqualTo(1000)); + Assert.That(ps1[1].Weight, Is.EqualTo(1000)); + Assert.That(ps1[2].Weight, Is.EqualTo(1000)); + }); + + Assert.DoesNotThrowAsync(async () => await DeliveryService.SplitDeliveryToMember(d1.Year, d1.DId, [1000, int.MaxValue, 1100], 102)); + d1 = await GetDelivery("20231005X001"); + d2 = await GetDelivery("20231005X002"); + Assert.Multiple(() => { + Assert.That(d1, Is.Null); + Assert.That(d2, Is.Not.Null); + }); + Assert.Multiple(() => { + var ps2 = GetParts(d2); + Assert.That(d2.MgNr, Is.EqualTo(102)); + Assert.That(ps2, Has.Length.EqualTo(3)); + Assert.That(ps2[0].Weight, Is.EqualTo(1000)); + Assert.That(ps2[1].Weight, Is.EqualTo(1000)); + Assert.That(ps2[2].Weight, Is.EqualTo(1000)); + }); + } + + [Test] + public async Task TestSplit_09_OtherDelivery_One() { + var d1 = await GetDelivery("20231006X001"); + var d2 = await GetDelivery("20231006X002"); + Assert.Multiple(() => { + Assert.That(d1, Is.Not.Null); + Assert.That(d2, Is.Not.Null); + }); + Assert.Multiple(() => { + var ps1 = GetParts(d1); + var ps2 = GetParts(d2); + Assert.That(ps1, Has.Length.EqualTo(3)); + Assert.That(ps1[0].Weight, Is.EqualTo(1000)); + Assert.That(ps1[1].Weight, Is.EqualTo(1000)); + Assert.That(ps1[2].Weight, Is.EqualTo(1000)); + Assert.That(ps2, Has.Length.EqualTo(1)); + Assert.That(ps2[0].Weight, Is.EqualTo(1000)); + }); + + Assert.DoesNotThrowAsync(async () => await DeliveryService.SplitDeliveryToLsNr(d1.Year, d1.DId, [0, 1000, -4], d2.LsNr)); + d1 = await GetDelivery("20231006X001"); + d2 = await GetDelivery("20231006X002"); + Assert.Multiple(() => { + Assert.That(d1, Is.Not.Null); + Assert.That(d2, Is.Not.Null); + }); + Assert.Multiple(() => { + var ps1 = GetParts(d1); + var ps2 = GetParts(d2); + Assert.That(ps1, Has.Length.EqualTo(2)); + Assert.That(ps1[0].DPNr, Is.EqualTo(1)); + Assert.That(ps1[0].Weight, Is.EqualTo(1000)); + Assert.That(ps1[1].DPNr, Is.EqualTo(3)); + Assert.That(ps1[1].Weight, Is.EqualTo(1000)); + Assert.That(ps2, Has.Length.EqualTo(2)); + Assert.That(ps2[0].Weight, Is.EqualTo(1000)); + Assert.That(ps2[1].Weight, Is.EqualTo(1000)); + }); + } + + [Test] + public async Task TestSplit_10_OtherDelivery_Partial() { + var d1 = await GetDelivery("20231007X001"); + var d2 = await GetDelivery("20231007X002"); + Assert.Multiple(() => { + Assert.That(d1, Is.Not.Null); + Assert.That(d2, Is.Not.Null); + }); + Assert.Multiple(() => { + var ps1 = GetParts(d1); + var ps2 = GetParts(d2); + Assert.That(ps1, Has.Length.EqualTo(3)); + Assert.That(ps1[0].Weight, Is.EqualTo(1000)); + Assert.That(ps1[1].Weight, Is.EqualTo(1000)); + Assert.That(ps1[2].Weight, Is.EqualTo(1000)); + Assert.That(ps2, Has.Length.EqualTo(1)); + Assert.That(ps2[0].Weight, Is.EqualTo(1000)); + }); + + Assert.DoesNotThrowAsync(async () => await DeliveryService.SplitDeliveryToLsNr(d1.Year, d1.DId, [0, 300, int.MinValue], d2.LsNr)); + d1 = await GetDelivery("20231007X001"); + d2 = await GetDelivery("20231007X002"); + Assert.Multiple(() => { + Assert.That(d1, Is.Not.Null); + Assert.That(d2, Is.Not.Null); + }); + Assert.Multiple(() => { + var ps1 = GetParts(d1); + var ps2 = GetParts(d2); + Assert.That(ps1, Has.Length.EqualTo(3)); + Assert.That(ps1[0].Weight, Is.EqualTo(1000)); + Assert.That(ps1[1].Weight, Is.EqualTo(700)); + Assert.That(ps1[2].Weight, Is.EqualTo(1000)); + Assert.That(ps2, Has.Length.EqualTo(2)); + Assert.That(ps2[0].Weight, Is.EqualTo(1000)); + Assert.That(ps2[1].Weight, Is.EqualTo(300)); + }); + } + + [Test] + public async Task TestSplit_11_OtherDelivery_Mixed() { + var d1 = await GetDelivery("20231008X001"); + var d2 = await GetDelivery("20231008X002"); + Assert.Multiple(() => { + Assert.That(d1, Is.Not.Null); + Assert.That(d2, Is.Not.Null); + }); + Assert.Multiple(() => { + var ps1 = GetParts(d1); + var ps2 = GetParts(d2); + Assert.That(ps1, Has.Length.EqualTo(3)); + Assert.That(ps1[0].Weight, Is.EqualTo(1000)); + Assert.That(ps1[1].Weight, Is.EqualTo(1000)); + Assert.That(ps1[2].Weight, Is.EqualTo(1000)); + Assert.That(ps2, Has.Length.EqualTo(1)); + Assert.That(ps2[0].Weight, Is.EqualTo(1000)); + }); + + Assert.DoesNotThrowAsync(async () => await DeliveryService.SplitDeliveryToLsNr(d1.Year, d1.DId, [850, 1000, -4], d2.LsNr)); + d1 = await GetDelivery("20231008X001"); + d2 = await GetDelivery("20231008X002"); + Assert.Multiple(() => { + Assert.That(d1, Is.Not.Null); + Assert.That(d2, Is.Not.Null); + }); + Assert.Multiple(() => { + var ps1 = GetParts(d1); + var ps2 = GetParts(d2); + Assert.That(ps1, Has.Length.EqualTo(2)); + Assert.That(ps1[0].DPNr, Is.EqualTo(1)); + Assert.That(ps1[0].Weight, Is.EqualTo(150)); + Assert.That(ps1[1].DPNr, Is.EqualTo(3)); + Assert.That(ps1[1].Weight, Is.EqualTo(1000)); + Assert.That(ps2, Has.Length.EqualTo(3)); + Assert.That(ps2[0].Weight, Is.EqualTo(1000)); + Assert.That(ps2[1].Weight, Is.EqualTo(850)); + Assert.That(ps2[2].Weight, Is.EqualTo(1000)); + }); + } + + [Test] + public async Task TestSplit_12_OtherDelivery_Complete() { + var d1 = await GetDelivery("20231009X001"); + var d2 = await GetDelivery("20231009X002"); + Assert.Multiple(() => { + Assert.That(d1, Is.Not.Null); + Assert.That(d2, Is.Not.Null); + }); + Assert.Multiple(() => { + var ps1 = GetParts(d1); + var ps2 = GetParts(d2); + Assert.That(ps1, Has.Length.EqualTo(3)); + Assert.That(ps1[0].Weight, Is.EqualTo(1000)); + Assert.That(ps1[1].Weight, Is.EqualTo(1000)); + Assert.That(ps1[2].Weight, Is.EqualTo(1000)); + Assert.That(ps2, Has.Length.EqualTo(1)); + Assert.That(ps2[0].Weight, Is.EqualTo(1000)); + }); + + Assert.DoesNotThrowAsync(async () => await DeliveryService.SplitDeliveryToLsNr(d1.Year, d1.DId, [1200, int.MaxValue, 1000], d2.LsNr)); + d1 = await GetDelivery("20231009X001"); + d2 = await GetDelivery("20231009X002"); + Assert.Multiple(() => { + Assert.That(d1, Is.Null); + Assert.That(d2, Is.Not.Null); + }); + Assert.Multiple(() => { + var ps2 = GetParts(d2); + Assert.That(ps2, Has.Length.EqualTo(4)); + Assert.That(ps2[0].Weight, Is.EqualTo(1000)); + Assert.That(ps2[1].Weight, Is.EqualTo(1000)); + Assert.That(ps2[2].Weight, Is.EqualTo(1000)); + Assert.That(ps2[3].Weight, Is.EqualTo(1000)); + }); + } + + [Test] + public async Task TestDelete_01_Normal() { + using (var ctx = new AppDbContext()) { + Assert.That(await ctx.Deliveries.FindAsync(2022, 2), Is.Not.Null); + } + Assert.DoesNotThrowAsync(async () => await DeliveryService.DeleteDelivery("20220930X001")); + using (var ctx = new AppDbContext()) { + Assert.That(await ctx.Deliveries.FindAsync(2022, 2), Is.Null); + } + } + } +} diff --git a/Tests/ServiceTests/MemberServiceTest.cs b/Tests/ServiceTests/MemberServiceTest.cs index 86e35e4..a095379 100644 --- a/Tests/ServiceTests/MemberServiceTest.cs +++ b/Tests/ServiceTests/MemberServiceTest.cs @@ -61,6 +61,8 @@ namespace Tests.ServiceTests { Assert.That(m.DefaultKg?.Name, Is.EqualTo("Wolkersdorf")); }); + vm = new MemberAdminViewModel(); + await InitViewModel(vm); Assert.DoesNotThrow(() => vm.FillInputs(m)); Assert.Multiple(() => { Assert.That(vm.MgNr, Is.EqualTo(205)); @@ -179,6 +181,8 @@ namespace Tests.ServiceTests { Assert.That(m.IsFunktionär, Is.True); }); + vm = new MemberAdminViewModel(); + await InitViewModel(vm); Assert.DoesNotThrow(() => vm.FillInputs(m)); Assert.Multiple(() => { Assert.That(vm.MgNr, Is.EqualTo(999)); @@ -268,6 +272,8 @@ namespace Tests.ServiceTests { Assert.That(m.ExitDateString, Is.EqualTo($"{exitDate:yyyy-MM-dd}")); }); + vm = new MemberAdminViewModel(); + await InitViewModel(vm); Assert.DoesNotThrow(() => vm.FillInputs(m)); Assert.Multiple(() => { Assert.That(vm.IsActive, Is.False); @@ -314,6 +320,8 @@ namespace Tests.ServiceTests { } Assert.That(m, Is.Not.Null); + vm = new MemberAdminViewModel(); + await InitViewModel(vm); Assert.DoesNotThrow(() => vm.FillInputs(m)); Assert.Multiple(() => { Assert.That(vm.MgNr, Is.EqualTo(210));