Исправил все ошибки в 3 сложной

This commit is contained in:
2025-03-22 09:37:47 +04:00
parent f2139897bc
commit 22eea3a192
13 changed files with 139 additions and 77 deletions

View File

@@ -190,9 +190,8 @@ internal class ComplitedWorkBusinessLogicContract(IComplitedWorkStorageContract
throw new ValidationException("Completed work must have at least one assigned worker.");
}
if (!warehouseStorageContract.CheckWorks(complitedWorkDataModel))
if (!warehouseStorageContract.ReserveWorksForComplitedWork(complitedWorkDataModel))
{
logger.LogError("Not enough works for ComplitedWorks.");
throw new ValidationException("Not enough works for ComplitedWorks.");
}

View File

@@ -4,13 +4,23 @@ using TwoFromTheCasketContracts.Infastructure;
namespace TwoFromTheCasketContracts.DataModels;
public class WarehouseDataModel(string id, string name, string location,
List<WorkWarehouseDataModel> workWarehouseDataModels) : IValidation
public class WarehouseDataModel : IValidation
{
public string Id { get; private set; } = id;
public string Name { get; private set; } = name;
public string Location { get; private set; } = location;
public List<WorkWarehouseDataModel> WorkWarehouseDataModels { get; private set; } = workWarehouseDataModels;
public string Id { get; private set; }
public string Name { get; private set; }
public string Location { get; private set; }
public List<WorkWarehouseDataModel> WorkWarehouseDataModels { get; private set; }
public WarehouseDataModel(string id, string name, string location,
List<WorkWarehouseDataModel> workWarehouseDataModels)
{
Id = id;
Name = name;
Location = location;
WorkWarehouseDataModels = workWarehouseDataModels;
}
public WarehouseDataModel() { }
public void Validate()
{

View File

@@ -15,6 +15,5 @@ public interface IWarehouseStorageContract
void AddElement(WarehouseDataModel warehouseDataModel);
void UpdElement(WarehouseDataModel warehouseDataModel);
void DelElement(string id);
bool CheckWorks(ComplitedWorkDataModel workDataModel);
void ReserveWorksForComplitedWork(ComplitedWorkDataModel workDataModel);
bool ReserveWorksForComplitedWork(ComplitedWorkDataModel workDataModel);
}

View File

@@ -0,0 +1,10 @@
using TwoFromTheCasketContracts.DataModels;
namespace TwoFromTheCasketContracts.StorageContracts;
public interface IWorkerComplitedWorkStorageContract
{
List<WorkerComplitedWorkDataModel> GetList(string? workerId = null, string? complitedWorkId = null);
WorkerComplitedWorkDataModel? GetElementById(string id);
void AddElement(WorkerComplitedWorkDataModel workerComplitedWorkDataModel);
void UpdElement(WorkerComplitedWorkDataModel workerComplitedWorkDataModel);
void DelElement(string id);
}

View File

@@ -84,16 +84,32 @@ public class ComplitedWorkStorageContract : IComplitedWorkStorageContract
{
try
{
if (!_warehouseStorage.CheckWorks(complitedWorkDataModel))
if (complitedWorkDataModel.Workers == null || complitedWorkDataModel.Workers.Count == 0)
{
throw new ElementNotFoundException("Not enough work available in warehouses.");
throw new ValidationException("The value in the Workers must include workers");
}
_warehouseStorage.ReserveWorksForComplitedWork(complitedWorkDataModel);
if (!_dbContext.Rooms.Any(x => x.Id == complitedWorkDataModel.RoomId))
{
throw new ElementNotFoundException($"Room with ID {complitedWorkDataModel.RoomId} not found.");
}
try
{
_warehouseStorage.ReserveWorksForComplitedWork(complitedWorkDataModel);
}
catch (Exception ex)
{
throw new StorageException(ex);
}
_dbContext.ComplitedWorks.Add(_mapper.Map<ComplitedWork>(complitedWorkDataModel));
_dbContext.SaveChanges();
}
catch (ValidationException)
{
throw;
}
catch (ElementNotFoundException)
{
_dbContext.ChangeTracker.Clear();

View File

@@ -19,9 +19,14 @@ public class SupplyStorageContract : ISupplyStorageContract
var config = new MapperConfiguration(cfg =>
{
cfg.CreateMap<SupplyDataModel, Supply>();
cfg.CreateMap<Supply, SupplyDataModel>();
cfg.CreateMap<SupplyDataModel, Supply>()
.ForMember(dest => dest.Works, opt => opt.Ignore());
cfg.CreateMap<Supply, SupplyDataModel>()
.ForMember(dest => dest.Works, opt => opt.Ignore());
cfg.CreateMap<WorkSupplyDataModel, Work_Supply>();
cfg.CreateMap<Work_Supply, WorkSupplyDataModel>();
});
_mapper = new Mapper(config);
@@ -70,8 +75,11 @@ public class SupplyStorageContract : ISupplyStorageContract
{
try
{
var entity = _mapper.Map<Supply>(supplyDataModel);
_dbContext.Supplies.Add(entity);
var supplyEntity = _mapper.Map<Supply>(supplyDataModel);
_dbContext.Supplies.Add(supplyEntity);
_dbContext.SaveChanges();
_dbContext.ChangeTracker.Clear();
foreach (var ws in supplyDataModel.Works)
{
@@ -116,6 +124,7 @@ public class SupplyStorageContract : ISupplyStorageContract
}
}
public void DelElement(string id)
{
try

View File

@@ -20,6 +20,7 @@ namespace TwoFromTheCasketDatabase.Implementations
{
cfg.CreateMap<WarehouseDataModel, Warehouse>();
cfg.CreateMap<Warehouse, WarehouseDataModel>();
});
_mapper = new Mapper(conf);
}
@@ -137,48 +138,20 @@ namespace TwoFromTheCasketDatabase.Implementations
}
}
public bool CheckWorks(ComplitedWorkDataModel workDataModel)
public bool ReserveWorksForComplitedWork(ComplitedWorkDataModel workDataModel)
{
using var transaction = _dbContext.Database.BeginTransaction();
try
{
var requiredWork = _dbContext.Works
.FirstOrDefault(w => w.Id == workDataModel.WorkId)
?? throw new ElementNotFoundException(workDataModel.WorkId);
var availableWorkQuantities = _dbContext.WorkWarehouses
.Where(ww => ww.WorkId == requiredWork.Id)
.ToList();
var totalAvailable = availableWorkQuantities.Sum(ww => ww.Quantity);
return totalAvailable > 0;
}
catch (ElementNotFoundException)
{
_dbContext.ChangeTracker.Clear();
throw;
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex);
}
}
public void ReserveWorksForComplitedWork(ComplitedWorkDataModel workDataModel)
{
try
{
var requiredWork = _dbContext.Works
.FirstOrDefault(w => w.Id == workDataModel.WorkId)
?? throw new ElementNotFoundException(workDataModel.WorkId);
int requiredQuantity = 2;
var workStocks = _dbContext.WorkWarehouses
.Where(ww => ww.WorkId == requiredWork.Id)
.OrderByDescending(ww => ww.Quantity)
.ToList();
int requiredQuantity = 1;
.ToList();
foreach (var stock in workStocks)
{
@@ -190,24 +163,27 @@ namespace TwoFromTheCasketDatabase.Implementations
}
if (requiredQuantity > 0)
{
throw new ElementNotFoundException("Not enough work");
}
_dbContext.SaveChanges();
transaction.Commit();
return true;
}
catch (ElementNotFoundException)
{
transaction.Rollback();
_dbContext.ChangeTracker.Clear();
throw;
}
catch (Exception ex)
{
transaction.Rollback();
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex);
}
}
}
}

View File

@@ -447,7 +447,7 @@ namespace TwoFromTheCasketTests.BusinessLogicsContractsTests
{
var flag = false;
var record = new ComplitedWorkDataModel(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), new List<WorkerComplitedWorkDataModel>());
_warehouseStorageMock.Setup(x => x.CheckWorks(It.IsAny<ComplitedWorkDataModel>())).Returns(true);
_warehouseStorageMock.Setup(x => x.ReserveWorksForComplitedWork(It.IsAny<ComplitedWorkDataModel>())).Returns(true);
_complitedWorkStorageMock.Setup(x => x.AddElement(It.IsAny<ComplitedWorkDataModel>()))
.Callback((ComplitedWorkDataModel x) =>
@@ -466,7 +466,7 @@ namespace TwoFromTheCasketTests.BusinessLogicsContractsTests
{
_complitedWorkStorageMock.Setup(x => x.AddElement(It.IsAny<ComplitedWorkDataModel>()))
.Throws(new ElementExistsException("Data", "Data"));
_warehouseStorageMock.Setup(x => x.CheckWorks(It.IsAny<ComplitedWorkDataModel>())).Returns(true);
_warehouseStorageMock.Setup(x => x.ReserveWorksForComplitedWork(It.IsAny<ComplitedWorkDataModel>())).Returns(true);
Assert.That(() => _complitedWorkBusinessLogicContract.InsertComplitedWork(new(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), new List<WorkerComplitedWorkDataModel>())),
Throws.TypeOf<ElementExistsException>());
@@ -489,7 +489,7 @@ namespace TwoFromTheCasketTests.BusinessLogicsContractsTests
{
_complitedWorkStorageMock.Setup(x => x.AddElement(It.IsAny<ComplitedWorkDataModel>()))
.Throws(new StorageException(new InvalidOperationException()));
_warehouseStorageMock.Setup(x => x.CheckWorks(It.IsAny<ComplitedWorkDataModel>())).Returns(true);
_warehouseStorageMock.Setup(x => x.ReserveWorksForComplitedWork(It.IsAny<ComplitedWorkDataModel>())).Returns(true);
Assert.That(() => _complitedWorkBusinessLogicContract.InsertComplitedWork(
new(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), new List<WorkerComplitedWorkDataModel>())),
@@ -501,13 +501,13 @@ namespace TwoFromTheCasketTests.BusinessLogicsContractsTests
[Test]
public void InsertComplitedWork_NotEnoughWorks_ThrowException_Test()
{
_warehouseStorageMock.Setup(x => x.CheckWorks(It.IsAny<ComplitedWorkDataModel>())).Returns(false);
_warehouseStorageMock.Setup(x => x.ReserveWorksForComplitedWork(It.IsAny<ComplitedWorkDataModel>())).Returns(false);
Assert.That(() => _complitedWorkBusinessLogicContract.InsertComplitedWork(
new(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), new List<WorkerComplitedWorkDataModel>())),
Throws.TypeOf<ValidationException>());
_warehouseStorageMock.Verify(x => x.CheckWorks(It.IsAny<ComplitedWorkDataModel>()), Times.Once);
_warehouseStorageMock.Verify(x => x.ReserveWorksForComplitedWork(It.IsAny<ComplitedWorkDataModel>()), Times.Once);
}
[Test]

View File

@@ -9,5 +9,5 @@ namespace TwoFromTheCasketTests.Infrastructure;
public class ConfigurationDatabaseTest : IConfigurationDatabase
{
public string ConnectionString => "Host=localhost;Port=5432;Database=TwoFromTheCasketDb;Username=postgres;Password=1234";
public string ConnectionString => "Host=localhost;Port=5432;Database=TwoFromTheCasketDbHard2;Username=postgres;Password=1234";
}

View File

@@ -15,16 +15,18 @@ namespace TwoFromTheCasketTests.StorageContracts;
public class ComplitedWorkStorageContractTests : BaseStorageContractTest
{
private ComplitedWorkStorageContract _complitedWorkStorageContract;
private Mock<IWarehouseStorageContract> _warehouseStorageMock;
private WarehouseStorageContract _warehouseStorage;
[SetUp]
public void SetUp()
{
_warehouseStorageMock = new Mock<IWarehouseStorageContract>();
_warehouseStorage = new WarehouseStorageContract(
TwoFromTheCasketDb
);
_complitedWorkStorageContract = new ComplitedWorkStorageContract(
TwoFromTheCasketDb,
_warehouseStorageMock.Object
_warehouseStorage
);
}
@@ -70,6 +72,12 @@ public class ComplitedWorkStorageContractTests : BaseStorageContractTest
var roomId = InsertRoomToDatabase(Guid.NewGuid().ToString()).Id;
var workId = InsertWorkToDatabase(Guid.NewGuid().ToString()).Id;
var warehouse1 = InsertWarehouseToDatabase();
var warehouse2 = InsertWarehouseToDatabase();
InsertSupplyToDatabase(workId, warehouse1.Id, 3);
InsertSupplyToDatabase(workId, warehouse2.Id, 2);
var complitedWorkDataModel = new ComplitedWorkDataModel(
Guid.NewGuid().ToString(),
workId,
@@ -90,8 +98,8 @@ public class ComplitedWorkStorageContractTests : BaseStorageContractTest
var warehouse1 = InsertWarehouseToDatabase();
var warehouse2 = InsertWarehouseToDatabase();
InsertWorkToWarehouse(warehouse1.Id, workId, 2);
InsertWorkToWarehouse(warehouse2.Id, workId, 3);
InsertSupplyToDatabase(workId, warehouse1.Id, 2);
InsertSupplyToDatabase(workId, warehouse2.Id, 3);
var complitedWorkDataModel = CreateComplitedWorkDataModel(Guid.NewGuid().ToString(), workId);
@@ -102,7 +110,7 @@ public class ComplitedWorkStorageContractTests : BaseStorageContractTest
var remainingWork1 = GetWorkQuantityFromWarehouse(warehouse1.Id, workId);
var remainingWork2 = GetWorkQuantityFromWarehouse(warehouse2.Id, workId);
Assert.That(remainingWork1 + remainingWork2, Is.EqualTo(4));
Assert.That(remainingWork1 + remainingWork2, Is.EqualTo(3));
}
[Test]
@@ -112,12 +120,28 @@ public class ComplitedWorkStorageContractTests : BaseStorageContractTest
InsertWorkToDatabase(workId);
var warehouse = InsertWarehouseToDatabase();
InsertWorkToWarehouse(warehouse.Id, workId, 0);
InsertSupplyToDatabase(workId, warehouse.Id, 0);
var complitedWorkDataModel = CreateComplitedWorkDataModel(Guid.NewGuid().ToString(), workId);
Assert.That(() => _complitedWorkStorageContract.AddElement(complitedWorkDataModel),
Throws.TypeOf<StorageException>().With.Message.Contains("Not enough work available"));
Throws.TypeOf<StorageException>());
}
[Test]
public void Try_AddElement_WhenOneELementNotEnoughWorkAvailable_Test()
{
var workId = Guid.NewGuid().ToString();
InsertWorkToDatabase(workId);
var warehouse = InsertWarehouseToDatabase();
InsertSupplyToDatabase(workId, warehouse.Id, 0);
InsertSupplyToDatabase(workId, warehouse.Id, 1);
var complitedWorkDataModel = CreateComplitedWorkDataModel(Guid.NewGuid().ToString(), workId);
Assert.That(() => _complitedWorkStorageContract.AddElement(complitedWorkDataModel),
Throws.TypeOf<StorageException>());
}
@@ -212,7 +236,7 @@ public class ComplitedWorkStorageContractTests : BaseStorageContractTest
private static void AssertElement(ComplitedWork? actual, ComplitedWorkDataModel expected)
{
Assert.That(actual, Is.Not.Null, "ComplitedWork не найден в базе после добавления"); // ✅ Проверка перед сравнением
Assert.That(actual, Is.Not.Null, "ComplitedWork не найден в базе после добавления");
Assert.Multiple(() =>
{
@@ -261,7 +285,7 @@ public class ComplitedWorkStorageContractTests : BaseStorageContractTest
private Worker InsertWorkerToDatabase(string id, string fio = "Иванов И.И.")
{
var phonenumber = $"+791012345{new Random().Next(10, 99)}";
var phonenumber = $"+79101234{new Random().Next(100, 999)}";
var worker = new Worker
{
Id = id,
@@ -312,6 +336,23 @@ public class ComplitedWorkStorageContractTests : BaseStorageContractTest
.FirstOrDefault();
}
private void InsertSupplyToDatabase(string workId, string warehouseId, double quantity)
{
var supplyId = Guid.NewGuid().ToString();
var supply = new SupplyDataModel(
supplyId,
warehouseId,
DateTime.UtcNow,
new List<WorkSupplyDataModel>
{
new WorkSupplyDataModel(workId, supplyId, quantity)
});
new SupplyStorageContract(TwoFromTheCasketDb).AddElement(supply);
}
private TwoFromTheCasketDatabase.Models.Specialization InsertSpecializationToDatabase(string id, string name = null, double salary = 50000)
{
name ??= $"Повар , {new Random().Next(1, 1000)}";

View File

@@ -23,7 +23,7 @@ public class SupplyStorageContractTests : BaseStorageContractTest
{
TwoFromTheCasketDb.Database.ExecuteSqlRaw("TRUNCATE \"WorkSupplyies\" CASCADE;");
TwoFromTheCasketDb.Database.ExecuteSqlRaw("TRUNCATE \"Supplies\" CASCADE;");
TwoFromTheCasketDb.Database.ExecuteSqlRaw("TRUNCATE \"Work_Warehouses\" CASCADE;");
TwoFromTheCasketDb.Database.ExecuteSqlRaw("TRUNCATE \"WorkWarehouses\" CASCADE;");
TwoFromTheCasketDb.Database.ExecuteSqlRaw("TRUNCATE \"Warehouses\" CASCADE;");
TwoFromTheCasketDb.Database.ExecuteSqlRaw("TRUNCATE \"Works\" CASCADE;");
}
@@ -210,6 +210,7 @@ public class SupplyStorageContractTests : BaseStorageContractTest
private SupplyDataModel CreateSupplyDataModel(string warehouseId)
{
var workId = InsertWork().Id;
return new SupplyDataModel(
Guid.NewGuid().ToString(),
warehouseId,

View File

@@ -2,6 +2,7 @@
using NUnit.Framework;
using TwoFromTheCasketContracts.DataModels;
using TwoFromTheCasketContracts.Exceptions;
using TwoFromTheCasketContracts.StorageContracts;
using TwoFromTheCasketDatabase.Implementations;
using TwoFromTheCasketDatabase.Models;
@@ -21,7 +22,7 @@ public class WarehouseStorageContractTests : BaseStorageContractTest
[TearDown]
public void TearDown()
{
TwoFromTheCasketDb.Database.ExecuteSqlRaw("TRUNCATE \"Work_Warehouses\" CASCADE;");
TwoFromTheCasketDb.Database.ExecuteSqlRaw("TRUNCATE \"WorkWarehouses\" CASCADE;");
TwoFromTheCasketDb.Database.ExecuteSqlRaw("TRUNCATE \"Warehouses\" CASCADE;");
TwoFromTheCasketDb.Database.ExecuteSqlRaw("TRUNCATE \"Works\" CASCADE;");
TwoFromTheCasketDb.Database.ExecuteSqlRaw("TRUNCATE \"ComplitedWorks\" CASCADE;");
@@ -143,7 +144,7 @@ public class WarehouseStorageContractTests : BaseStorageContractTest
var complitedWork = CreateComplitedWork(workId);
var checkResult = _warehouseStorageContract.CheckWorks(complitedWork);
var checkResult = _warehouseStorageContract.ReserveWorksForComplitedWork(complitedWork);
Assert.That(checkResult, Is.True);
}
@@ -157,9 +158,9 @@ public class WarehouseStorageContractTests : BaseStorageContractTest
InsertWorkToWarehouse(warehouse.Id, workId, 0);
var complitedWork = CreateComplitedWork(workId);
var checkResult = _warehouseStorageContract.CheckWorks(complitedWork);
Assert.That(checkResult, Is.False);
Assert.That(() => _warehouseStorageContract.ReserveWorksForComplitedWork(complitedWork),
Throws.TypeOf<ElementNotFoundException>());
}
@@ -182,7 +183,7 @@ public class WarehouseStorageContractTests : BaseStorageContractTest
.Where(x => x.WorkId == workId)
.Sum(x => x.Quantity);
Assert.That(total, Is.EqualTo(4));
Assert.That(total, Is.EqualTo(3));
}
[Test]
@@ -196,7 +197,7 @@ public class WarehouseStorageContractTests : BaseStorageContractTest
var complitedWork = CreateComplitedWork(workId);
Assert.That(() => _warehouseStorageContract.ReserveWorksForComplitedWork(complitedWork),
Throws.TypeOf<StorageException>().With.Message.Contains("Not enough work available"));
Throws.TypeOf<ElementNotFoundException>());
}
private Warehouse InsertWarehouseToDatabase(string name, string location)
{

View File

@@ -173,9 +173,9 @@ public class WorkerStorageContractTests : BaseStorageContractTest
private Worker InsertWorkerToDatabase(string id, string specializationId = null, string fio = "Иванов И.И.", string phoneNumber = "+79101234567", DateTime? dateBirthday = null)
{
specializationId = InsertSpecializationToDatabase(Guid.NewGuid().ToString()).Id; // ✅ Создаем специализацию перед работником
specializationId = InsertSpecializationToDatabase(Guid.NewGuid().ToString()).Id;
var phonenumber = $"+791012345{new Random().Next(10, 99)}";
var phonenumber = $"+791012345{new Random().Next(100, 999)}";
var worker = new Worker
{