This commit is contained in:
Baryshev Dmitry 2025-02-13 14:04:39 +04:00
parent 6c7eeaf5fc
commit 2adcba7625
9 changed files with 136 additions and 112 deletions

View File

@ -13,7 +13,8 @@ using System.Xml;
namespace SeniorPomidorContracts.DataModels; namespace SeniorPomidorContracts.DataModels;
public class CropDataModel(string id, string harvestId, string cropName, double price, public class CropDataModel(string id, string harvestId, string cropName, double price,
CropType cropType, bool isActual, DateTime replenishmentDate, bool isDeleted) : IValidation double? prevPrice, double? prevPrevPrice, CropType cropType, bool isActual,
DateTime replenishmentDate, bool isDeleted) : IValidation
{ {
public string Id { get; private set; } = id; public string Id { get; private set; } = id;
@ -23,6 +24,10 @@ public class CropDataModel(string id, string harvestId, string cropName, double
public double Price { get; private set; } = price; public double Price { get; private set; } = price;
public double? PrevPrice { get; private set; } = prevPrice;
public double? PrevPrevPrice { get; private set; } = prevPrevPrice;
public CropType CropType { get; private set; } = cropType; public CropType CropType { get; private set; } = cropType;
public bool IsActual { get; private set; } = isActual; public bool IsActual { get; private set; } = isActual;

View File

@ -9,8 +9,7 @@ using System.Threading.Tasks;
namespace SeniorPomidorContracts.DataModels; namespace SeniorPomidorContracts.DataModels;
public class HarvestDataModel(string id, string cropId, string harvestName public class HarvestDataModel(string id, string cropId, string harvestName, int harvestAmount) : IValidation
/*, string? prevHarvestName, string? prevPrevHarvestName*/, int harvestAmount) : IValidation
{ {
public string Id { get; private set; } = id; public string Id { get; private set; } = id;
@ -18,10 +17,6 @@ public class HarvestDataModel(string id, string cropId, string harvestName
public string HarvestName { get; private set; } = harvestName; public string HarvestName { get; private set; } = harvestName;
//public string prevHarvestName { get; private set; } = prevHarvestName;
//public string prevPrevHarvestName { get; private set; }= prevPrevHarvestName;
public int HarvestAmount { get; private set; } = harvestAmount; public int HarvestAmount { get; private set; } = harvestAmount;
public void Validate() public void Validate()

View File

@ -13,13 +13,13 @@ using System.ComponentModel.DataAnnotations;
namespace SeniorPomidorContracts.DataModels; namespace SeniorPomidorContracts.DataModels;
public class SupplierDataModel(string id, string fio, string phoneNumber, double discountSize) : IValidation public class SupplierDataModel(string id, string fio, string email, double discountSize) : IValidation
{ {
public string Id { get; private set; } = id; public string Id { get; private set; } = id;
public string FIO { get; private set; } = fio; public string FIO { get; private set; } = fio;
public string PhoneNumber { get; private set; } = phoneNumber; public string Email { get; private set; } = email;
public double DiscountSize { get; private set; } = discountSize; public double DiscountSize { get; private set; } = discountSize;
@ -34,13 +34,13 @@ public class SupplierDataModel(string id, string fio, string phoneNumber, double
if (FIO.IsEmpty()) if (FIO.IsEmpty())
throw new ValidationException("Field FIO is empty"); throw new ValidationException("Field FIO is empty");
if (PhoneNumber.IsEmpty()) if (Email.IsEmpty())
throw new ValidationException("Field PhoneNumber is empty"); throw new ValidationException("Field Email is empty");
if (!Regex.IsMatch(PhoneNumber, @"^((8|\+7)[\- ]?)?(\(?\d{3}\)?[\- ]?)?[\d\- ]{7,10}$")) if (!Regex.IsMatch(Email, @"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$"))
throw new ValidationException("Field PhoneNumber is not a phone number"); throw new ValidationException("Field Email is not a phone number");
if (DiscountSize < 0) if (DiscountSize < 0)
throw new ValidationException("Field PhoneNumber is not a phone number"); throw new ValidationException("Field DiscountSize is less than zero");
} }
} }

View File

@ -0,0 +1,32 @@
using SeniorPomidorContracts.Extensions;
using SeniorPomidorContracts.Infrastructure;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SeniorPomidorContracts.DataModels;
public class SupplierHistoryDataModel(string supplierId, string oldName) : IValidation
{
public string SupplierId { get; private set; } = supplierId;
public string OldName { get; private set; } = oldName;
public DateTime ChangeTime { get; private set; } = DateTime.UtcNow;
public void Validate()
{
if (SupplierId.IsEmpty())
throw new ValidationException("Field SupplierId is empty");
if (!SupplierId.IsGuid())
throw new ValidationException("The value in the field SupplierId is not a unique identifier");
if (OldName.IsEmpty())
throw new ValidationException("Field OldName is empty");
}
}

View File

@ -1,26 +0,0 @@
using SeniorPomidorContracts.Extensions;
using SeniorPomidorContracts.Infrastructure;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SeniorPomidorContracts.DataModels;
public class SupplyHistoryDataModel(string SupplyId) : IValidation
{
public string SupplyId { get; private set; } = SupplyId;
public DateTime SupplyDate { get; private set; } = DateTime.UtcNow;
public void Validate()
{
if (SupplyId.IsEmpty())
throw new ValidationException("Field SupplyId is empty");
if (!SupplyId.IsGuid())
throw new ValidationException("The value in the field SupplyId is not a unique identifier");
}
}

View File

@ -16,11 +16,11 @@ internal class CropDataModelsTests
public void IdIsNullOrEmptyTest() public void IdIsNullOrEmptyTest()
{ {
var crop = CreateDataModel(null, Guid.NewGuid().ToString(), "name", var crop = CreateDataModel(null, Guid.NewGuid().ToString(), "name",
10, CropType.Berry, true, DateTime.UtcNow, false); 10, 9, 8, CropType.Berry, true, DateTime.UtcNow, false);
Assert.That(() => crop.Validate(), Throws.TypeOf<ValidationException>()); Assert.That(() => crop.Validate(), Throws.TypeOf<ValidationException>());
crop = CreateDataModel(string.Empty, Guid.NewGuid().ToString(), "name", crop = CreateDataModel(string.Empty, Guid.NewGuid().ToString(), "name",
10, CropType.Berry, true, DateTime.UtcNow, false); 10, 9, 8, CropType.Berry, true, DateTime.UtcNow, false);
Assert.That(() => crop.Validate(), Throws.TypeOf<ValidationException>()); Assert.That(() => crop.Validate(), Throws.TypeOf<ValidationException>());
} }
@ -28,18 +28,18 @@ internal class CropDataModelsTests
public void IdIsNotGuid() public void IdIsNotGuid()
{ {
var crop = CreateDataModel("Id", Guid.NewGuid().ToString(), "name", var crop = CreateDataModel("Id", Guid.NewGuid().ToString(), "name",
10, CropType.Berry, true, DateTime.UtcNow, false); 10, 9, 8, CropType.Berry, true, DateTime.UtcNow, false);
Assert.That(() => crop.Validate(), Throws.TypeOf<ValidationException>()); Assert.That(() => crop.Validate(), Throws.TypeOf<ValidationException>());
} }
public void HarvestIdIsNullOrEmptyTest() public void HarvestIdIsNullOrEmptyTest()
{ {
var crop = CreateDataModel(Guid.NewGuid().ToString(), null, "name", var crop = CreateDataModel(Guid.NewGuid().ToString(), null, "name",
10, CropType.Berry, true, DateTime.UtcNow, false); 10, 9, 8, CropType.Berry, true, DateTime.UtcNow, false);
Assert.That(() => crop.Validate(), Throws.TypeOf<ValidationException>()); Assert.That(() => crop.Validate(), Throws.TypeOf<ValidationException>());
crop = CreateDataModel(Guid.NewGuid().ToString(), string.Empty, "name", crop = CreateDataModel(Guid.NewGuid().ToString(), string.Empty, "name",
10, CropType.Berry, true, DateTime.UtcNow, false); 10, 9, 8, CropType.Berry, true, DateTime.UtcNow, false);
Assert.That(() => crop.Validate(), Throws.TypeOf<ValidationException>()); Assert.That(() => crop.Validate(), Throws.TypeOf<ValidationException>());
} }
@ -47,7 +47,7 @@ internal class CropDataModelsTests
public void HarvestIdIsNotGuid() public void HarvestIdIsNotGuid()
{ {
var crop = CreateDataModel(Guid.NewGuid().ToString(), "Id", "name", var crop = CreateDataModel(Guid.NewGuid().ToString(), "Id", "name",
10, CropType.Berry, true, DateTime.UtcNow, false); 10, 9, 8, CropType.Berry, true, DateTime.UtcNow, false);
Assert.That(() => crop.Validate(), Throws.TypeOf<ValidationException>()); Assert.That(() => crop.Validate(), Throws.TypeOf<ValidationException>());
} }
@ -55,7 +55,7 @@ internal class CropDataModelsTests
public void CropNameIsEmptyTest() public void CropNameIsEmptyTest()
{ {
var crop = CreateDataModel(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), null, var crop = CreateDataModel(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), null,
10, CropType.Berry, true, DateTime.UtcNow, false); 10, 9, 8, CropType.Berry, true, DateTime.UtcNow, false);
Assert.That(() => crop.Validate(), Throws.TypeOf<ValidationException>()); Assert.That(() => crop.Validate(), Throws.TypeOf<ValidationException>());
} }
@ -63,11 +63,11 @@ internal class CropDataModelsTests
public void PriceIsLessOrZeroTest() public void PriceIsLessOrZeroTest()
{ {
var crop = CreateDataModel(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), "name", var crop = CreateDataModel(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), "name",
0, CropType.Berry, true, DateTime.UtcNow, false); 0, 9, 8, CropType.Berry, true, DateTime.UtcNow, false);
Assert.That(() => crop.Validate(), Throws.TypeOf<ValidationException>()); Assert.That(() => crop.Validate(), Throws.TypeOf<ValidationException>());
crop = CreateDataModel(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), "name", crop = CreateDataModel(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), "name",
-10, CropType.Berry, true, DateTime.UtcNow, false); -10, 9, 8, CropType.Berry, true, DateTime.UtcNow, false);
Assert.That(() => crop.Validate(), Throws.TypeOf<ValidationException>()); Assert.That(() => crop.Validate(), Throws.TypeOf<ValidationException>());
} }
@ -75,7 +75,7 @@ internal class CropDataModelsTests
public void CropTypeIsNoneTest() public void CropTypeIsNoneTest()
{ {
var crop = CreateDataModel(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), "name", var crop = CreateDataModel(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), "name",
10, CropType.None, true, DateTime.UtcNow, false); 10, 9, 8, CropType.None, true, DateTime.UtcNow, false);
Assert.That(() => crop.Validate(), Throws.TypeOf<ValidationException>()); Assert.That(() => crop.Validate(), Throws.TypeOf<ValidationException>());
} }
@ -86,12 +86,14 @@ internal class CropDataModelsTests
var harvestId = Guid.NewGuid().ToString(); var harvestId = Guid.NewGuid().ToString();
var cropName = "name"; var cropName = "name";
var price = 10; var price = 10;
var prevPrice = 9;
var prevPrevPrice = 8;
var cropType = CropType.Berry; var cropType = CropType.Berry;
var isActual = true; var isActual = true;
var replenishmentDate = DateTime.UtcNow.AddDays(-1); var replenishmentDate = DateTime.UtcNow.AddDays(-1);
var isDeleted = false; var isDeleted = false;
var crop = CreateDataModel(cropId, harvestId, cropName, price, var crop = CreateDataModel(cropId, harvestId, cropName, price, prevPrice,
cropType, isActual, replenishmentDate, isDeleted); prevPrevPrice, cropType, isActual, replenishmentDate, isDeleted);
Assert.That(() => crop.Validate(), Throws.Nothing); Assert.That(() => crop.Validate(), Throws.Nothing);
Assert.Multiple(() => Assert.Multiple(() =>
@ -101,13 +103,17 @@ internal class CropDataModelsTests
Assert.That(crop.CropName, Is.EqualTo(cropName)); Assert.That(crop.CropName, Is.EqualTo(cropName));
Assert.That(crop.CropType, Is.EqualTo(cropType)); Assert.That(crop.CropType, Is.EqualTo(cropType));
Assert.That(crop.Price, Is.EqualTo(price)); Assert.That(crop.Price, Is.EqualTo(price));
Assert.That(crop.PrevPrice, Is.EqualTo(prevPrice));
Assert.That(crop.PrevPrevPrice, Is.EqualTo(prevPrevPrice));
Assert.That(crop.IsActual, Is.EqualTo(isActual)); Assert.That(crop.IsActual, Is.EqualTo(isActual));
Assert.That(crop.ReplenishmentDate, Is.EqualTo(replenishmentDate)); Assert.That(crop.ReplenishmentDate, Is.EqualTo(replenishmentDate));
Assert.That(crop.IsDeleted, Is.EqualTo(isDeleted)); Assert.That(crop.IsDeleted, Is.EqualTo(isDeleted));
}); });
} }
private static CropDataModel CreateDataModel(string? id, string? harvestId, string? cropName, private static CropDataModel CreateDataModel(string? id, string? harvestId,
double price, CropType cropType, bool isActual, DateTime replenishmentDate, bool isDeleted) => new (id, harvestId, string? cropName, double price, double? prevPrice, double? prevPrevPrice,
cropName, price, cropType, isActual, replenishmentDate, isDeleted); CropType cropType, bool isActual, DateTime replenishmentDate, bool isDeleted)
=> new (id, harvestId, cropName, price, prevPrice, prevPrevPrice, cropType,
isActual, replenishmentDate, isDeleted);
} }

View File

@ -14,7 +14,7 @@ internal class SupplierDataModelsTests
[Test] [Test]
public void IdIsNullOrEmptyTest() public void IdIsNullOrEmptyTest()
{ {
var supplier = CreateDataModel(null, "fio", "number", 10); var supplier = CreateDataModel(null, "fio", "email", 10);
Assert.That(() => supplier.Validate(), Throws.TypeOf<ValidationException>()); Assert.That(() => supplier.Validate(), Throws.TypeOf<ValidationException>());
supplier = CreateDataModel(string.Empty, Guid.NewGuid().ToString(), "number", 10); supplier = CreateDataModel(string.Empty, Guid.NewGuid().ToString(), "number", 10);
@ -24,22 +24,22 @@ internal class SupplierDataModelsTests
[Test] [Test]
public void IdIsNotGuid() public void IdIsNotGuid()
{ {
var supplier = CreateDataModel("Id", "fio", "number", 10); var supplier = CreateDataModel("Id", "fio", "email", 10);
Assert.That(() => supplier.Validate(), Throws.TypeOf<ValidationException>()); Assert.That(() => supplier.Validate(), Throws.TypeOf<ValidationException>());
} }
[Test] [Test]
public void FIOIsNullOrEmptyTest() public void FIOIsNullOrEmptyTest()
{ {
var supplier = CreateDataModel(Guid.NewGuid().ToString(), null, "number", 10); var supplier = CreateDataModel(Guid.NewGuid().ToString(), null, "email", 10);
Assert.That(() => supplier.Validate(), Throws.TypeOf<ValidationException>()); Assert.That(() => supplier.Validate(), Throws.TypeOf<ValidationException>());
supplier = CreateDataModel(Guid.NewGuid().ToString(), string.Empty, "number", 10); supplier = CreateDataModel(Guid.NewGuid().ToString(), string.Empty, "email", 10);
Assert.That(() => supplier.Validate(), Throws.TypeOf<ValidationException>()); Assert.That(() => supplier.Validate(), Throws.TypeOf<ValidationException>());
} }
[Test] [Test]
public void PhoneNumberIsNullOrEmptyTest() public void EmailIsNullOrEmptyTest()
{ {
var supplier = CreateDataModel(Guid.NewGuid().ToString(), "fio", null, 10); var supplier = CreateDataModel(Guid.NewGuid().ToString(), "fio", null, 10);
Assert.That(() => supplier.Validate(), Throws.TypeOf<ValidationException>()); Assert.That(() => supplier.Validate(), Throws.TypeOf<ValidationException>());
@ -49,16 +49,16 @@ internal class SupplierDataModelsTests
} }
[Test] [Test]
public void PhoneNumberIsIncorrectTest() public void EmailIsIncorrectTest()
{ {
var supplier = CreateDataModel(Guid.NewGuid().ToString(), "fio", "777", 10); var supplier = CreateDataModel(Guid.NewGuid().ToString(), "fio", "i.ru", 10);
Assert.That(() => supplier.Validate(), Throws.TypeOf<ValidationException>()); Assert.That(() => supplier.Validate(), Throws.TypeOf<ValidationException>());
} }
[Test] [Test]
public void DiscountIsLessZero() public void DiscountIsLessZero()
{ {
var supplier = CreateDataModel(Guid.NewGuid().ToString(), "fio", "number", -10); var supplier = CreateDataModel(Guid.NewGuid().ToString(), "fio", "email", -10);
Assert.That(() => supplier.Validate(), Throws.TypeOf<ValidationException>()); Assert.That(() => supplier.Validate(), Throws.TypeOf<ValidationException>());
} }
@ -67,15 +67,15 @@ internal class SupplierDataModelsTests
{ {
var id = Guid.NewGuid().ToString(); var id = Guid.NewGuid().ToString();
var fio = "fio"; var fio = "fio";
var phoneNum = "+7-777-777-77-77"; var email = "senior_pomidor@yandex.ru";
var discountSize = 10; var discountSize = 10;
var supplier = CreateDataModel(id, fio, phoneNum, discountSize); var supplier = CreateDataModel(id, fio, email, discountSize);
Assert.That(() => supplier.Validate(), Throws.Nothing); Assert.That(() => supplier.Validate(), Throws.Nothing);
Assert.Multiple(() => Assert.Multiple(() =>
{ {
Assert.That(supplier.Id, Is.EqualTo(id)); Assert.That(supplier.Id, Is.EqualTo(id));
Assert.That(supplier.FIO, Is.EqualTo(fio)); Assert.That(supplier.FIO, Is.EqualTo(fio));
Assert.That(supplier.PhoneNumber, Is.EqualTo(phoneNum)); Assert.That(supplier.Email, Is.EqualTo(email));
Assert.That(supplier.DiscountSize, Is.EqualTo(discountSize)); Assert.That(supplier.DiscountSize, Is.EqualTo(discountSize));
}); });
} }

View File

@ -0,0 +1,58 @@
using SeniorPomidorContracts.DataModels;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SeniorPomidorTests.DataModelsTests;
[TestFixture]
internal class SupplierHistoryDataModelsTests
{
[Test]
public void SuppplierIdIsNullOrEmptyTest()
{
var supplierHistory = CreateDataModel(null, "name");
Assert.That(() => supplierHistory.Validate(), Throws.TypeOf<ValidationException>());
supplierHistory = CreateDataModel(string.Empty, "name");
Assert.That(() => supplierHistory.Validate(),Throws.TypeOf<ValidationException>());
}
[Test]
public void SuppplierIdIsNotGuid()
{
var supplierHistory = CreateDataModel("Id", "name");
Assert.That(() => supplierHistory.Validate(), Throws.TypeOf<ValidationException>());
}
public void OldNameNullOrEmptyTest()
{
var supplierHistory = CreateDataModel(Guid.NewGuid().ToString(), null);
Assert.That(() => supplierHistory.Validate(), Throws.TypeOf<ValidationException>());
supplierHistory = CreateDataModel(Guid.NewGuid().ToString(), string.Empty);
Assert.That(() => supplierHistory.Validate(), Throws.TypeOf<ValidationException>());
}
[Test]
public void AllFieldsIsCorrectTest()
{
var supplierId = Guid.NewGuid().ToString();
var oldName = "Name";
var supplyHistory = CreateDataModel(supplierId, oldName);
Assert.That(() => supplyHistory.Validate(), Throws.Nothing);
Assert.Multiple(() =>
{
Assert.That(supplyHistory.SupplierId, Is.EqualTo(supplierId));
Assert.That(supplyHistory.OldName, Is.EqualTo(oldName));
Assert.That(supplyHistory.ChangeTime, Is.LessThan(DateTime.UtcNow));
Assert.That(supplyHistory.ChangeTime, Is.GreaterThan(DateTime.UtcNow.AddMinutes(-1)));
});
}
private static SupplierHistoryDataModel CreateDataModel(string? supplierId,
string? oldName) => new(supplierId, oldName);
}

View File

@ -1,46 +0,0 @@
using SeniorPomidorContracts.DataModels;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SeniorPomidorTests.DataModelsTests;
[TestFixture]
internal class SupplyHistoryDataModelsTests
{
[Test]
public void SuppplyIdIsNullOrEmptyTest()
{
var supplyHistory = CreateDataModel(null);
Assert.That(() => supplyHistory.Validate(), Throws.TypeOf<ValidationException>());
supplyHistory = CreateDataModel(string.Empty);
Assert.That(() => supplyHistory.Validate(),Throws.TypeOf<ValidationException>());
}
[Test]
public void SuppplyIdIsNotGuid()
{
var supplyHistory = CreateDataModel("Id");
Assert.That(() => supplyHistory.Validate(), Throws.TypeOf<ValidationException>());
}
[Test]
public void AllFieldsIsCorrectTest()
{
var supplyId = Guid.NewGuid().ToString();
var supplyHistory = CreateDataModel(supplyId);
Assert.That(() => supplyHistory.Validate(), Throws.Nothing);
Assert.Multiple(() =>
{
Assert.That(supplyHistory.SupplyId, Is.EqualTo(supplyId));
Assert.That(supplyHistory.SupplyDate, Is.LessThan(DateTime.UtcNow));
Assert.That(supplyHistory.SupplyDate, Is.GreaterThan(DateTime.UtcNow.AddMinutes(-1)));
});
}
private static SupplyHistoryDataModel CreateDataModel(string? supplyId) => new(supplyId);
}