FruitBankHybridApp/FruitBankHybrid.Shared.Tests/Ekaer/ShippingToEkaerMapperTests.cs

213 lines
8.0 KiB
C#

using AyCode.Services.Nav.Ekaer.Models;
using FruitBank.Common.Dtos;
using FruitBank.Common.Entities;
using FruitBank.Common.Services.Ekaer;
using TradeReasonType = AyCode.Services.Nav.Ekaer.Models.Common.TradeReasonType;
using TradeType = AyCode.Services.Nav.Ekaer.Models.Common.TradeType;
namespace FruitBankHybrid.Shared.Tests.Ekaer;
/// <summary>
/// Unit tesztek a <see cref="ShippingToEkaerMapper"/>-re — a FruitBank <c>Shipping</c> → NAV EKÁER tradeCard
/// leképezésre. Tisztán memóriában felépített entitásokon fut (nincs hálózat/DB), determinisztikus.
/// </summary>
[TestClass]
public sealed class ShippingToEkaerMapperTests
{
private static readonly ShippingToEkaerMapper Mapper = new();
// ---- Helpers ------------------------------------------------------------
private static Shipping CreateShipping(string sellerCountry = "HU", string plate = "ABC-123", bool withTrailer = true)
{
var item = new ShippingItem
{
Id = 1,
Name = "Alma",
ProductDto = new ProductDto { Gtin = "08081010", Name = "Alma" },
MeasuredGrossWeight = 123.5,
MeasuredQuantity = 10,
UnitPriceOnDocument = 5.0,
};
var document = new ShippingDocument
{
Country = sellerCountry,
Partner = new Partner
{
Name = "Beszállító Kft",
TaxId = "12345678-2-42",
CountryCode = sellerCountry,
PostalCode = "1011",
City = "Budapest",
Street = "Fő utca 1",
},
ShippingItems = [item],
};
var shipping = new Shipping
{
CargoPartner = new CargoPartner { Name = "Fuvaros Zrt", CountryCode = "HU" },
CargoTruck = new CargoTruck { LicencePlate = plate, CountryCode = "HU", IsTrailer = false },
ShippingDocuments = [document],
};
if (withTrailer)
shipping.CargoTrailer = new CargoTruck { LicencePlate = "XYZ-789", CountryCode = "HU", IsTrailer = true };
return shipping;
}
private static EkaerMappingOptions CreateOptions() => new()
{
DestinationName = "FruitBank Kft",
DestinationVatNumber = "98765432-2-41",
DestinationCountryCode = "HU",
DestinationAddress = "1102 Budapest Raktár utca 5",
HomeCountryCode = "HU",
UnloadLocation = new LocationType
{
Name = "FruitBank Raktár",
VatNumber = "98765432-2-41",
Country = "HU",
ZipCode = "1102",
City = "Budapest",
Street = "Raktár utca",
StreetNumber = "5",
},
};
// ---- Granularitás / index ----------------------------------------------
[TestMethod]
public void MapShipping_ProducesOneOperationPerDocument_WithSequentialIndex()
{
var shipping = CreateShipping();
shipping.ShippingDocuments!.Add(new ShippingDocument
{
Country = "HU",
Partner = new Partner { Name = "Másik Beszállító", CountryCode = "HU" },
ShippingItems = [],
});
var ops = Mapper.MapShipping(shipping, CreateOptions());
Assert.AreEqual(2, ops.Count, "dokumentumonként egy tradeCard");
Assert.AreEqual(1, ops[0].Index);
Assert.AreEqual(2, ops[1].Index);
Assert.AreEqual(OperationType.Create, ops[0].Operation, "alapértelmezett művelet: Create");
}
[TestMethod]
public void MapShipping_NullDocuments_ReturnsEmpty()
{
var ops = Mapper.MapShipping(new Shipping { ShippingDocuments = null }, CreateOptions());
Assert.AreEqual(0, ops.Count);
}
[TestMethod]
public void MapShipping_HonorsExplicitOperation()
{
var ops = Mapper.MapShipping(CreateShipping(), CreateOptions(), OperationType.Modify);
Assert.AreEqual(OperationType.Modify, ops[0].Operation);
}
// ---- tradeType irány ----------------------------------------------------
[TestMethod]
public void MapShipping_DomesticSeller_TradeTypeDomestic()
{
var ops = Mapper.MapShipping(CreateShipping(sellerCountry: "HU"), CreateOptions());
Assert.AreEqual(TradeType.D, ops[0].TradeCard.TradeType, "belföldi feladó → D");
}
[TestMethod]
public void MapShipping_ForeignSeller_TradeTypeImport()
{
var ops = Mapper.MapShipping(CreateShipping(sellerCountry: "DE"), CreateOptions());
Assert.AreEqual(TradeType.I, ops[0].TradeCard.TradeType, "külföldi feladó → I (import)");
}
// ---- Tétel-leképezés ----------------------------------------------------
[TestMethod]
public void MapShipping_MapsItemFields()
{
var item = Mapper.MapShipping(CreateShipping(), CreateOptions())[0].TradeCard.Items[0];
Assert.AreEqual("08081010", item.ProductVtsz, "productVtsz = ProductDto.Gtin");
Assert.AreEqual("Alma", item.ProductName);
Assert.AreEqual(123.5m, item.Weight, "weight = MeasuredGrossWeight (bruttó)");
Assert.AreEqual(TradeReasonType.A, item.TradeReason, "bejövő áru = beszerzés = A");
Assert.IsNull(item.Value, "a HUF érték a deviza tisztázásáig nincs kitöltve");
}
// ---- Eladó (seller*) ----------------------------------------------------
[TestMethod]
public void MapShipping_MapsSellerFromPartner()
{
var tradeCard = Mapper.MapShipping(CreateShipping(), CreateOptions())[0].TradeCard;
Assert.AreEqual("Beszállító Kft", tradeCard.SellerName);
Assert.AreEqual("12345678-2-42", tradeCard.SellerVatNumber);
Assert.AreEqual("HU", tradeCard.SellerCountry);
StringAssert.Contains(tradeCard.SellerAddress, "Budapest");
}
[TestMethod]
public void MapShipping_MapsDestinationAndUnloadFromOptions()
{
var options = CreateOptions();
var tradeCard = Mapper.MapShipping(CreateShipping(), options)[0].TradeCard;
Assert.AreEqual("FruitBank Kft", tradeCard.DestinationName);
Assert.AreEqual("HU", tradeCard.DestinationCountry);
Assert.AreSame(options.UnloadLocation, tradeCard.UnloadLocation, "a lerakodási hely a konfigból jön");
}
[TestMethod]
public void MapShipping_MapsCarrierTextFromCargoPartner()
{
var tradeCard = Mapper.MapShipping(CreateShipping(), CreateOptions())[0].TradeCard;
Assert.AreEqual("Fuvaros Zrt", tradeCard.CarrierText);
}
// ---- Járművek + rendszám-normalizálás ----------------------------------
[TestMethod]
public void MapShipping_NormalizesLicencePlate_RemovesHyphenAndUppercases()
{
var tradeCard = Mapper.MapShipping(CreateShipping(plate: "abc-123"), CreateOptions())[0].TradeCard;
Assert.AreEqual("ABC123", tradeCard.Vehicle!.PlateNumber, "a NAV pattern nem enged kötőjelet, és nagybetűs");
Assert.AreEqual("HU", tradeCard.Vehicle.Country);
}
[TestMethod]
public void MapShipping_WithTrailer_MapsVehicle2()
{
var tradeCard = Mapper.MapShipping(CreateShipping(withTrailer: true), CreateOptions())[0].TradeCard;
Assert.IsNotNull(tradeCard.Vehicle, "vonó jármű");
Assert.IsNotNull(tradeCard.Vehicle2, "vontatmány");
Assert.AreEqual("XYZ789", tradeCard.Vehicle2!.PlateNumber);
}
[TestMethod]
public void MapShipping_NoTrailer_Vehicle2Null()
{
var tradeCard = Mapper.MapShipping(CreateShipping(withTrailer: false), CreateOptions())[0].TradeCard;
Assert.IsNotNull(tradeCard.Vehicle);
Assert.IsNull(tradeCard.Vehicle2, "nincs pótkocsi → nincs vehicle2");
}
// ---- Védőkorlátok -------------------------------------------------------
[TestMethod]
public void MapShipping_NullShipping_Throws()
=> Assert.ThrowsExactly<ArgumentNullException>(() => Mapper.MapShipping(null!, CreateOptions()));
[TestMethod]
public void MapShipping_NullOptions_Throws()
=> Assert.ThrowsExactly<ArgumentNullException>(() => Mapper.MapShipping(CreateShipping(), null!));
}