using MagicCarpetContracts.DataModels; using MagicCarpetContracts.Enums; using MagicCarpetContracts.Exceptions; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace MagicCarpetTests.DataModelTests; [TestFixture] internal class SaleDataModelTests { [Test] public void IdIsNullOrEmptyTest() { var sale = CreateDataModel(null, Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), DiscountType.OnSale, false, CreateSubDataModel()); Assert.That(() => sale.Validate(), Throws.TypeOf()); sale = CreateDataModel(string.Empty, Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), DiscountType.OnSale, false, CreateSubDataModel()); Assert.That(() => sale.Validate(), Throws.TypeOf()); } [Test] public void IdIsNotGuidTest() { var sale = CreateDataModel("id", Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), DiscountType.OnSale, false, CreateSubDataModel()); Assert.That(() => sale.Validate(), Throws.TypeOf()); } [Test] public void EmployeeIdIsNullOrEmptyTest() { var sale = CreateDataModel(Guid.NewGuid().ToString(), null, Guid.NewGuid().ToString(), DiscountType.OnSale, false, CreateSubDataModel()); Assert.That(() => sale.Validate(), Throws.TypeOf()); sale = CreateDataModel(Guid.NewGuid().ToString(), string.Empty, Guid.NewGuid().ToString(), DiscountType.OnSale, false, CreateSubDataModel()); Assert.That(() => sale.Validate(), Throws.TypeOf()); } [Test] public void EmployeeIdIsNotGuidTest() { var sale = CreateDataModel(Guid.NewGuid().ToString(), "employeeId", Guid.NewGuid().ToString(), DiscountType.OnSale, false, CreateSubDataModel()); Assert.That(() => sale.Validate(), Throws.TypeOf()); } [Test] public void ClientIdIsNotGuidTest() { var sale = CreateDataModel(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), "clientId", DiscountType.OnSale, false, CreateSubDataModel()); Assert.That(() => sale.Validate(), Throws.TypeOf()); } [Test] public void ToursIsNullOrEmptyTest() { var sale = CreateDataModel(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), DiscountType.OnSale, false, null); Assert.That(() => sale.Validate(), Throws.TypeOf()); sale = CreateDataModel(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), DiscountType.OnSale, false, []); Assert.That(() => sale.Validate(), Throws.TypeOf()); } [Test] public void CalcSumAndDiscountTest() { var saleId = Guid.NewGuid().ToString(); var employeeId = Guid.NewGuid().ToString(); var clientId = Guid.NewGuid().ToString(); var tours = new List() { new(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), 2, 1.1), new(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), 1, 1.3) }; var isCancel = false; var totalSum = tours.Sum(x => x.Price * x.Count); var saleNone = CreateDataModel(saleId, employeeId, clientId, DiscountType.None, isCancel, tours); Assert.Multiple(() => { Assert.That(saleNone.Sum, Is.EqualTo(totalSum)); Assert.That(saleNone.Discount, Is.EqualTo(0)); }); var saleOnSale = CreateDataModel(saleId, employeeId, clientId, DiscountType.OnSale, isCancel, tours); Assert.Multiple(() => { Assert.That(saleOnSale.Sum, Is.EqualTo(totalSum)); Assert.That(saleOnSale.Discount, Is.EqualTo(totalSum * 0.1)); }); var saleRegularCustomer = CreateDataModel(saleId, employeeId, clientId, DiscountType.RegularCustomer, isCancel, tours); Assert.Multiple(() => { Assert.That(saleRegularCustomer.Sum, Is.EqualTo(totalSum)); Assert.That(saleRegularCustomer.Discount, Is.EqualTo(totalSum * 0.5)); }); var saleCertificate = CreateDataModel(saleId, employeeId, clientId, DiscountType.Certificate, isCancel, tours); Assert.Multiple(() => { Assert.That(saleCertificate.Sum, Is.EqualTo(totalSum)); Assert.That(saleCertificate.Discount, Is.EqualTo(totalSum * 0.3)); }); var saleMulty = CreateDataModel(saleId, employeeId, clientId, DiscountType.Certificate | DiscountType.RegularCustomer, isCancel, tours); Assert.Multiple(() => { Assert.That(saleMulty.Sum, Is.EqualTo(totalSum)); Assert.That(saleMulty.Discount, Is.EqualTo(totalSum * 0.8)); }); } [Test] public void AllFieldsIsCorrectTest() { var saleId = Guid.NewGuid().ToString(); var employeeId = Guid.NewGuid().ToString(); var clientId = Guid.NewGuid().ToString(); var discountType = DiscountType.Certificate; var isCancel = true; var tours = CreateSubDataModel(); var sale = CreateDataModel(saleId, employeeId, clientId, discountType, isCancel, tours); Assert.That(() => sale.Validate(), Throws.Nothing); Assert.Multiple(() => { Assert.That(sale.Id, Is.EqualTo(saleId)); Assert.That(sale.EmployeeId, Is.EqualTo(employeeId)); Assert.That(sale.ClientId, Is.EqualTo(clientId)); Assert.That(sale.DiscountType, Is.EqualTo(discountType)); Assert.That(sale.IsCancel, Is.EqualTo(isCancel)); Assert.That(sale.Tours, Is.EquivalentTo(tours)); }); } private static SaleDataModel CreateDataModel(string? id, string? employeeId, string? clientId, DiscountType discountType, bool isCancel, List? tours) => new(id, employeeId, clientId, discountType, isCancel, tours); private static List CreateSubDataModel() => [new(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), 1, 1.1)]; }