From 41ccb10ef7d9d690ecd1c5fad99751c16f79931e Mon Sep 17 00:00:00 2001 From: Loretta Date: Fri, 29 May 2026 12:16:48 +0200 Subject: [PATCH] Add CargoTruck CRUD, grid tabs, and related tests - Introduced LicencePlate to CargoTruck and Shippings navigation to CargoPartner. - Implemented CargoTruck CRUD methods in IFruitBankDataControllerCommon and FruitBankSignalRClient. - Expanded tests for CargoTruck and improved assertions for CargoPartner and Partner. - Updated CargoPartner grid to show CargoTrucks and Shippings in detail tabs. - Minor formatting and settings.local.json Bash command update. --- .claude/settings.local.json | 3 +- FruitBank.Common/Entities/CargoPartner.cs | 3 + FruitBank.Common/Entities/CargoTruck.cs | 1 + .../IFruitBankDataControllerCommon.cs | 7 ++ .../FruitBankClientTests.cs | 91 +++++++++++++++++-- .../Grids/Cargos/GridCargoPartner.razor | 43 ++++----- .../SignalRs/FruitBankSignalRClient.cs | 11 ++- 7 files changed, 127 insertions(+), 32 deletions(-) diff --git a/.claude/settings.local.json b/.claude/settings.local.json index 344f27c7..e971f96b 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -11,7 +11,8 @@ "Bash(while read:*)", "Bash(do sed -i '1a using AyCode.Core.Serializers.Toons;\\\\n' \"$f\")", "Bash(done)", - "Bash(rm \"C:/Users/Fullepi/.claude/projects/H--Applications-Mango-Source-FruitBankHybridApp/memory/feedback_framework_docs_no_consumer_types.md\")" + "Bash(rm \"C:/Users/Fullepi/.claude/projects/H--Applications-Mango-Source-FruitBankHybridApp/memory/feedback_framework_docs_no_consumer_types.md\")", + "Bash(cd \"H:/Applications/Aycode/Source/AyCode.Core/AyCode.Services.Server/bin/FruitBank\" && ls -la --time-style=full-iso Debug/net9.0/AyCode.Core.dll Release/net9.0/AyCode.Core.dll 2>&1)" ] } } diff --git a/FruitBank.Common/Entities/CargoPartner.cs b/FruitBank.Common/Entities/CargoPartner.cs index 565bff5a..12aa2d43 100644 --- a/FruitBank.Common/Entities/CargoPartner.cs +++ b/FruitBank.Common/Entities/CargoPartner.cs @@ -14,4 +14,7 @@ public sealed class CargoPartner : PartnerBase, ICargoPartner { [Association(ThisKey = nameof(Id), OtherKey = nameof(CargoTruck.CargoPartnerId), CanBeNull = true)] public List? CargoTrucks { get; set; } + + //[Association(ThisKey = nameof(Id), OtherKey = nameof(Shipping.CargoPartnerId), CanBeNull = true)] + public List? Shippings { get; set; } } \ No newline at end of file diff --git a/FruitBank.Common/Entities/CargoTruck.cs b/FruitBank.Common/Entities/CargoTruck.cs index b5168995..3a150dd6 100644 --- a/FruitBank.Common/Entities/CargoTruck.cs +++ b/FruitBank.Common/Entities/CargoTruck.cs @@ -11,4 +11,5 @@ namespace FruitBank.Common.Entities; public sealed class CargoTruck: MgEntityBase//, ICargoPartner { public int CargoPartnerId { get; set; } + public string LicencePlate { get; set; } } diff --git a/FruitBank.Common/Interfaces/IFruitBankDataControllerCommon.cs b/FruitBank.Common/Interfaces/IFruitBankDataControllerCommon.cs index 07e242c4..4af46ea9 100644 --- a/FruitBank.Common/Interfaces/IFruitBankDataControllerCommon.cs +++ b/FruitBank.Common/Interfaces/IFruitBankDataControllerCommon.cs @@ -26,6 +26,13 @@ public interface IFruitBankDataControllerCommon public Task UpdateCargoPartner(CargoPartner cargoPartner); #endregion CargoPartner + #region CargoTruck + public Task?> GetCargoTrucks(); + public Task GetCargoTruckById(int id); + public Task AddCargoTruck(CargoTruck cargoTruck); + public Task UpdateCargoTruck(CargoTruck cargoTruck); + #endregion CargoTruck + #region Shipping public Task?> GetShippings(); Task?> GetNotMeasuredShippings(); diff --git a/FruitBankHybrid.Shared.Tests/FruitBankClientTests.cs b/FruitBankHybrid.Shared.Tests/FruitBankClientTests.cs index 6a61dda8..d18fc8a4 100644 --- a/FruitBankHybrid.Shared.Tests/FruitBankClientTests.cs +++ b/FruitBankHybrid.Shared.Tests/FruitBankClientTests.cs @@ -42,22 +42,22 @@ namespace FruitBankHybrid.Shared.Tests var partners = await _signalRClient.GetPartners(); Assert.IsNotNull(partners); - Assert.IsTrue(partners.Count != 0); + Assert.IsNotEmpty(partners); } - //[DataTestMethod] + //[TestMethod] //[DataRow(1)] public async Task GetPartnerByIdTest(int partnerId) { var partner = await _signalRClient.GetPartnerById(partnerId); Assert.IsNotNull(partner); - Assert.IsTrue(partner.Id == partnerId); + Assert.AreEqual(partnerId, partner.Id); return partner; } - [DataTestMethod] + [TestMethod] [DataRow(2)] public async Task UpdatePartnerTest(int partnerId) { @@ -75,7 +75,7 @@ namespace FruitBankHybrid.Shared.Tests partner = await _signalRClient.UpdatePartner(partner); Assert.IsNotNull(partner); - Assert.IsTrue(partner.Id == partnerId); + Assert.AreEqual(partnerId, partner.Id); } #endregion Partner @@ -83,13 +83,88 @@ namespace FruitBankHybrid.Shared.Tests [TestMethod] public async Task GetCargoPartnersTest() { - var partners = await _signalRClient.GetPartners(); + var partners = await _signalRClient.GetCargoPartners(); Assert.IsNotNull(partners); - Assert.IsTrue(partners.Count != 0); + Assert.IsNotEmpty(partners); + } + //[TestMethod] + //[DataRow(1)] + public async Task GetCargoPartnerByIdTest(int cargoPartnerId) + { + var cargoPartner = await _signalRClient.GetCargoPartnerById(cargoPartnerId); + + Assert.IsNotNull(cargoPartner); + Assert.AreEqual(cargoPartnerId, cargoPartner.Id); + + return cargoPartner; + } + + [TestMethod] + [DataRow(1)] + public async Task UpdateCargoPartnerTest(int cargoPartnerId) + { + var cargoPartner = await GetCargoPartnerByIdTest(cargoPartnerId); + + var newName = GetFixtureName(cargoPartner.Name); + + cargoPartner.Name = newName; + cargoPartner = await _signalRClient.UpdateCargoPartner(cargoPartner); + + Assert.IsNotNull(cargoPartner); + Assert.IsTrue(cargoPartner.Name == newName); + + cargoPartner.Name = GetOriginalName(cargoPartner.Name); + cargoPartner = await _signalRClient.UpdateCargoPartner(cargoPartner); + + Assert.IsNotNull(cargoPartner); + Assert.AreEqual(cargoPartnerId, cargoPartner.Id); } #endregion CargoPartner + #region CargoTruck + [TestMethod] + public async Task GetCargoTrucksTest() + { + var cargoTrucks = await _signalRClient.GetCargoTrucks(); + + Assert.IsNotNull(cargoTrucks); + Assert.IsNotEmpty(cargoTrucks); + } + //[TestMethod] + //[DataRow(1)] + public async Task GetCargoTruckByIdTest(int cargoTruckId) + { + var cargoTruck = await _signalRClient.GetCargoTruckById(cargoTruckId); + + Assert.IsNotNull(cargoTruck); + Assert.AreEqual(cargoTruckId, cargoTruck.Id); + + return cargoTruck; + } + + [TestMethod] + [DataRow(1)] + public async Task UpdateCargoTruckTest(int cargoTruckId) + { + var cargoTruck = await GetCargoTruckByIdTest(cargoTruckId); + + var newLicencePlate = GetFixtureName(cargoTruck.LicencePlate); + + cargoTruck.LicencePlate = newLicencePlate; + cargoTruck = await _signalRClient.UpdateCargoTruck(cargoTruck); + + Assert.IsNotNull(cargoTruck); + Assert.IsTrue(cargoTruck.LicencePlate == newLicencePlate); + + cargoTruck.LicencePlate = GetOriginalName(cargoTruck.LicencePlate); + cargoTruck = await _signalRClient.UpdateCargoTruck(cargoTruck); + + Assert.IsNotNull(cargoTruck); + Assert.AreEqual(cargoTruckId, cargoTruck.Id); + } + #endregion CargoTruck + #region Shipping [TestMethod] public async Task GetShippingsTest() @@ -97,7 +172,7 @@ namespace FruitBankHybrid.Shared.Tests var shippings = await _signalRClient.GetShippings(); Assert.IsNotNull(shippings); - Assert.IsTrue(shippings.Count != 0); + Assert.IsNotEmpty(shippings); } [TestMethod] diff --git a/FruitBankHybrid.Shared/Components/Grids/Cargos/GridCargoPartner.razor b/FruitBankHybrid.Shared/Components/Grids/Cargos/GridCargoPartner.razor index 26898ca6..181dc188 100644 --- a/FruitBankHybrid.Shared/Components/Grids/Cargos/GridCargoPartner.razor +++ b/FruitBankHybrid.Shared/Components/Grids/Cargos/GridCargoPartner.razor @@ -18,11 +18,11 @@ + SignalRClient="FruitBankSignalRClient" + Logger="_logger" + CssClass="@GridCss" + ValidationEnabled="false" + OnGridFocusedRowChanged="Grid_FocusedRowChanged"> @@ -41,37 +41,38 @@ -@* + @if (IsMasterGrid) { var partner = ((CargoPartner)context.DataItem); - var shippingDocuments = partner?.ShippingDocuments ?? []; + var shipping = partner?.Shippings ?? []; + var cargoTrucks = partner?.CargoTrucks ?? []; - + @{ - var observableShippingDocuments = new AcObservableCollection(shippingDocuments); - + // var observableShippingDocuments = new AcObservableCollection(cargoTrucks); + // } - + @{ - var observableShippingItems = new AcObservableCollection(shippingDocuments.SelectMany(sd => sd.ShippingItems ?? [])); - + var observableShippings = new AcObservableCollection(shipping); + } } - *@ - @if (IsMasterGrid) - { - - } - - - + + @if (IsMasterGrid) + { + + } + + + @code { diff --git a/FruitBankHybrid.Shared/Services/SignalRs/FruitBankSignalRClient.cs b/FruitBankHybrid.Shared/Services/SignalRs/FruitBankSignalRClient.cs index 9340b88d..e9675de6 100644 --- a/FruitBankHybrid.Shared/Services/SignalRs/FruitBankSignalRClient.cs +++ b/FruitBankHybrid.Shared/Services/SignalRs/FruitBankSignalRClient.cs @@ -57,8 +57,7 @@ namespace FruitBankHybrid.Shared.Services.SignalRs } } - public Task?> GetMeasuringModels() - => GetAllAsync>(SignalRTags.GetMeasuringModels); + public Task?> GetMeasuringModels() => GetAllAsync>(SignalRTags.GetMeasuringModels); #region Partner public Task?> GetPartners() => GetAllAsync>(SignalRTags.GetPartners); @@ -74,6 +73,14 @@ namespace FruitBankHybrid.Shared.Services.SignalRs public Task UpdateCargoPartner(CargoPartner cargoPartner) => PostDataAsync(SignalRTags.UpdateCargoPartner, cargoPartner); #endregion CargoPartner + #region CargoTruck + public Task?> GetCargoTrucks() => GetAllAsync>(SignalRTags.GetCargoTrucks); + public Task GetCargoTruckById(int id) => GetByIdAsync(SignalRTags.GetCargoTruckById, id); + public Task AddCargoTruck(CargoTruck cargoTruck) => PostDataAsync(SignalRTags.AddCargoTruck, cargoTruck); + public Task UpdateCargoTruck(CargoTruck cargoTruck) => PostDataAsync(SignalRTags.UpdateCargoTruck, cargoTruck); + #endregion CargoTruck + + #region Shipping public Task?> GetShippings()