16 Commits

Author SHA1 Message Date
maxim
ef340be62a сдал 2025-04-14 17:00:44 +04:00
nezui1
37affb0114 ready 90% 2025-04-14 13:00:15 +04:00
nezui1
a325a6558c ready 80% 2025-04-14 12:37:37 +04:00
nezui1
822291ea91 2 теста осталось 2025-04-14 12:09:01 +04:00
nezui1
0dd30af08c два теста с проблемами 2025-04-14 03:14:08 +04:00
nezui1
8493b4e3c2 первый тест 2025-04-14 02:46:37 +04:00
nezui1
d9e9892505 нужный коммит 2025-04-13 23:42:54 +04:00
nezui1
1d1812acea починка моделей + конечная для реализации 2025-04-13 23:28:32 +04:00
nezui1
6654a24aff околофутбольчик 2025-04-12 23:27:50 +04:00
nezui1
edb377c4bb DbContext 2025-04-12 22:34:22 +04:00
maxim
c28280efa3 модели готовы(а может и нет) 2025-03-31 14:35:42 +04:00
maxim
63845fbf27 готово 2025-03-31 09:54:18 +04:00
maxim
1a01d118c3 ласт тест остался 2025-03-29 12:29:29 +04:00
maxim
a9aa6b3481 All test#1 2025-03-17 11:18:44 +04:00
maxim
24c2125935 попытка №1 2025-03-17 00:12:07 +04:00
maxim
4699447735 Заготовки для реализаций 2025-03-02 15:04:00 +04:00
62 changed files with 5242 additions and 39 deletions

View File

@@ -0,0 +1,13 @@
# Default ignored files
/shelf/
/workspace.xml
# Rider ignored files
/.idea.TwoFromTheCasketContratcs.iml
/projectSettingsUpdater.xml
/modules.xml
/contentModel.xml
# Editor-based HTTP Client requests
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding" addBOMForNewFiles="with BOM under Windows, with no BOM otherwise" />
</project>

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="UserContentModel">
<attachedFolders />
<explicitIncludes />
<explicitExcludes />
</component>
</project>

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$/.." vcs="Git" />
</component>
</project>

View File

@@ -0,0 +1,121 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
using TwoFromTheCasketContratcs.BuisnessLogicsContracts;
using TwoFromTheCasketContratcs.DataModels;
using TwoFromTheCasketContratcs.Exceptions;
using TwoFromTheCasketContratcs.Extensions;
using TwoFromTheCasketContratcs.StorageContracts;
namespace TwoFromTheCasketBuisnessLogic.Implementations;
internal class MasterBusinessLogicContract(IMasterStorageContract masterStorageContract, ILogger logger) : IMasterBuisnessLogicContract
{
ILogger _logger = logger;
private IMasterStorageContract _masterStorageContract = masterStorageContract;
public List<MasterDataModel> GetAllMasters(bool onlyActive = true)
{
_logger.LogInformation("GetAllWorkers params: {onlyActive}", onlyActive);
return _masterStorageContract.GetList(onlyActive) ?? throw new
NullListException();
}
public List<MasterDataModel> GetAllMastersByPost(string postId, bool onlyActive = true)
{
_logger.LogInformation("GetAllWorkers params: {postId}, { onlyActive},", postId, onlyActive);
if (postId.IsEmpty())
{
throw new ArgumentNullException(nameof(postId));
}
if (!postId.IsGuid())
{
throw new ValidationException("The value in the field postId is not a unique identifier.");
}
return _masterStorageContract.GetList(onlyActive, postId) ?? throw new NullListException();
}
public List<MasterDataModel> GetAllMastersByEmploymentDate(DateTime fromDate, DateTime toDate, bool onlyActive = true)
{
_logger.LogInformation("GetAllWorkers params: {onlyActive}, { fromDate}, { toDate}", onlyActive, fromDate, toDate);
if (fromDate.IsDateNotOlder(toDate))
{
throw new IncorrectDatesException(fromDate, toDate);
}
return _masterStorageContract.GetList(onlyActive, fromEmploymentDate:
fromDate, toEmploymentDate: toDate) ?? throw new NullListException();
}
public MasterDataModel GetMasterByData(string data)
{
_logger.LogInformation("Get element by data: {data}", data);
if (data.IsEmpty())
{
throw new ArgumentNullException(nameof(data));
}
if (data.IsGuid())
{
return _masterStorageContract.GetElementById(data) ?? throw
new ElementNotFoundException(data);
}
return _masterStorageContract.GetElementByFIO(data) ?? throw new
ElementNotFoundException(data);
}
public void InsertMaster(MasterDataModel workerDataModel)
{
_logger.LogInformation("New data: {json}",
JsonSerializer.Serialize(workerDataModel));
ArgumentNullException.ThrowIfNull(workerDataModel);
workerDataModel.Validate();
_masterStorageContract.AddElement(workerDataModel);
}
public void UpdateMaster(MasterDataModel workerDataModel)
{
_logger.LogInformation("Update data: {json}",
JsonSerializer.Serialize(workerDataModel));
ArgumentNullException.ThrowIfNull(workerDataModel);
workerDataModel.Validate();
_masterStorageContract.UpdElement(workerDataModel);
}
public void DeleteMaster(string id)
{
_logger.LogInformation("Delete by id: {id}", id);
if (id.IsEmpty())
{
throw new ArgumentNullException(nameof(id));
}
if (!id.IsGuid())
{
throw new ValidationException("Id is not a unique identifier");
}
_masterStorageContract.DelElement(id);
}
public List<MasterDataModel> GetAllMastersByBirthDate(DateTime fromDate, DateTime toDate, bool onlyActive = true)
{
_logger.LogInformation("GetAllWorkers params: {onlyActive}, { fromDate}, { toDate}", onlyActive, fromDate, toDate);
if (fromDate.IsDateNotOlder(toDate))
{
throw new IncorrectDatesException(fromDate, toDate);
}
return _masterStorageContract.GetList(onlyActive, fromBirthDate: fromDate, toBirthDate: toDate) ?? throw new NullListException();
}
public List<MasterDataModel> GetAllWorkersByEmploymentDate(DateTime
fromDate, DateTime toDate, bool onlyActive = true)
{
_logger.LogInformation("GetAllMaster params: {onlyActive}, { fromDate}, { toDate}", onlyActive, fromDate, toDate);
if (fromDate.IsDateNotOlder(toDate))
{
throw new IncorrectDatesException(fromDate, toDate);
}
return _masterStorageContract.GetList(onlyActive, fromEmploymentDate:
fromDate, toEmploymentDate: toDate) ?? throw new NullListException();
}
}

View File

@@ -0,0 +1,89 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
using TwoFromTheCasketContratcs.BuisnessLogicsContracts;
using TwoFromTheCasketContratcs.DataModels;
using TwoFromTheCasketContratcs.Exceptions;
using TwoFromTheCasketContratcs.Extensions;
using TwoFromTheCasketContratcs.StorageContracts;
namespace TwoFromTheCasketBuisnessLogic.Implementations;
internal class OrderBusinessLogicContract(IOrderStorageContract orderStorageContract, ILogger logger) : IOrderBuisnessLogicContract
{
private ILogger _logger = logger;
private IOrderStorageContract _orderStorageContract = orderStorageContract;
public List<OrderDataModel> GetAllOrder()
{
_logger.LogInformation("GetAllOrders called");
var orders = _orderStorageContract.GetList();
if (orders == null)
{
throw new NullListException();
}
return orders;
}
public OrderDataModel GetOrderByDate(DateTime fromDate)
{
_logger.LogInformation("GetAllOrdersByDate called with fromDate: {fromDate} to: {toDate}");
return _orderStorageContract.GetElementByDate(fromDate) ?? throw new NullListException();
}
public OrderDataModel GetOrderByData(string data)
{
_logger.LogInformation($"GetOrderByData called with data: {data}");
if (data.IsEmpty())
{
throw new ArgumentNullException(nameof(data));
}
if (data.IsGuid())
{
return _orderStorageContract.GetElementById(data) ?? throw new ElementNotFoundException(data);
}
return _orderStorageContract.GetElementById(data) ?? throw new ElementNotFoundException(data);
}
public void InsertOrder(OrderDataModel orderDataModel)
{
_logger.LogInformation("InsertOrder called with orderDataModel: {orderDataModel}");
ValidateOrder(orderDataModel);
_orderStorageContract.AddElement(orderDataModel);
}
public void UpdateOrder(OrderDataModel orderDataModel)
{
_logger.LogInformation("UpdateOrder called with orderDataModel: {orderDataModel}");
ValidateOrder(orderDataModel);
_orderStorageContract.UpdElement(orderDataModel);
}
public void DeleteOrder(string id)
{
_logger.LogInformation($"DeleteOrder called with id: {id}");
ValidateId(id);
_orderStorageContract.DelElement(id);
}
private void ValidateOrder(OrderDataModel orderDataModel)
{
if (orderDataModel == null)
throw new ArgumentNullException(nameof(orderDataModel));
orderDataModel.Validate();
}
private void ValidateId(string id)
{
if (string.IsNullOrEmpty(id))
throw new ArgumentNullException(nameof(id));
if (!Guid.TryParse(id, out _))
throw new ValidationException("Id is not a unique identifier");
}
}

View File

@@ -0,0 +1,106 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
using TwoFromTheCasketContratcs.BuisnessLogicsContracts;
using TwoFromTheCasketContratcs.DataModels;
using TwoFromTheCasketContratcs.Exceptions;
using TwoFromTheCasketContratcs.Extensions;
using TwoFromTheCasketContratcs.StorageContracts;
namespace TwoFromTheCasketBuisnessLogic.Implementations;
internal class PostBusinessLogicContract(IPostStorageContract postStorageContract, ILogger logger) : IPostBuisnessLogicContract
{
private IPostStorageContract _postStorageContract = postStorageContract;
private ILogger _logger = logger;
public List<PostDataModel> GetAllPosts()
{
_logger.LogInformation("GetAllPosts");
return _postStorageContract.GetList() ?? throw new
NullListException();
}
public List<PostDataModel> GetAllDataOfPost(string postId)
{
_logger.LogInformation("GetAllDataOfPost for {postId}", postId);
if (postId.IsEmpty())
{
throw new ArgumentNullException(nameof(postId));
}
if (!postId.IsGuid())
{
throw new ValidationException("The value in the field postId is not a unique identifier.");
}
return _postStorageContract.GetPostWithHistory(postId) ?? throw new
NullListException();
}
public PostDataModel GetPostByData(string data)
{
_logger.LogInformation("Get element by data: {data}", data);
if (data.IsEmpty())
{
throw new ArgumentNullException(nameof(data));
}
if (data.IsGuid())
{
return _postStorageContract.GetElementById(data) ?? throw new
ElementNotFoundException(data);
}
return _postStorageContract.GetElementByName(data) ?? throw new
ElementNotFoundException(data);
}
public void InsertPost(PostDataModel postDataModel)
{
_logger.LogInformation("InsertPost called with postDataModel: {postDataModel}");
if (postDataModel == null)
throw new ArgumentNullException(nameof(postDataModel));
postDataModel.Validate(); // Вызовляем проверку валидности данных
_postStorageContract.AddElement(postDataModel);
}
public void UpdatePost(PostDataModel postDataModel)
{
_logger.LogInformation("Update data: {json}", JsonSerializer.Serialize(postDataModel));
ArgumentNullException.ThrowIfNull(postDataModel);
postDataModel.Validate();
_postStorageContract.UpdElement(postDataModel);
}
public void DeletePost(string id)
{
_logger.LogInformation("Delete by id: {id}", id);
if (id.IsEmpty())
{
throw new ArgumentNullException(nameof(id));
}
if (!id.IsGuid())
{
throw new ValidationException("Id is not a unique identifier");
}
_postStorageContract.DelElement(id);
}
public void RestorePost(string id)
{
_logger.LogInformation("Restore by id: {id}", id);
if (id.IsEmpty())
{
throw new ArgumentNullException(nameof(id));
}
if (!id.IsGuid())
{
throw new ValidationException("Id is not a unique identifier");
}
_postStorageContract.ResElement(id);
}
}

View File

@@ -0,0 +1,86 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Extensions.Logging;
using TwoFromTheCasketContratcs.BuisnessLogicsContracts;
using TwoFromTheCasketContratcs.DataModels;
using TwoFromTheCasketContratcs.StorageContracts;
using TwoFromTheCasketContratcs.Extensions;
using TwoFromTheCasketContratcs.Exceptions;
namespace TwoFromTheCasketBuisnessLogic.Implementations
{
internal class SalaryBusinessLogicContract(ISalaryStorageContract
salaryStorageContract, IPostStorageContract
postStorageContract, IMasterStorageContract masterStorageContract, ILogger
logger, IOrderStorageContract orderStorageContract) : ISalaryBuisnessLogicContract
{
private readonly ILogger _logger = logger;
private readonly ISalaryStorageContract _salaryStorageContract = salaryStorageContract;
private readonly IPostStorageContract _postStorageContract = postStorageContract;
private readonly IMasterStorageContract _masterStorageContract = masterStorageContract;
private readonly IOrderStorageContract _orderStorageContract = orderStorageContract;
public List<SalaryDataModel> GetAllSalariesByPeriod(DateTime fromDate, DateTime toDate)
{
_logger.LogInformation("GetAllSalaries params: {fromDate}, {toDate}", fromDate, toDate);
if (fromDate.IsDateNotOlder(toDate))
{
throw new IncorrectDatesException(fromDate, toDate);
}
return _salaryStorageContract.GetList(fromDate, toDate) ?? throw new NullListException();
}
public List<SalaryDataModel> GetAllSalariesByPeriodByMaster(DateTime fromDate, DateTime toDate, string masterId)
{
if (fromDate.IsDateNotOlder(toDate))
{
throw new IncorrectDatesException(fromDate, toDate);
}
if (string.IsNullOrEmpty(masterId))
{
throw new ArgumentNullException(nameof(masterId));
}
if (!Guid.TryParse(masterId, out _))
{
throw new ValidationException("The value in the field masterId is not a unique identifier.");
}
_logger.LogInformation("GetAllSalaries params: {fromDate}, {toDate}, {masterId}", fromDate, toDate, masterId);
return _salaryStorageContract.GetList(fromDate, toDate, masterId) ?? throw new NullListException();
}
public void CalculateSalaryByMonth(DateTime date)
{
_logger.LogInformation("CalculateSalaryByMonth: {date}", date);
var startDate = new DateTime(date.Year, date.Month, 1);
var finishDate = new DateTime(date.Year, date.Month, DateTime.DaysInMonth(date.Year, date.Month));
var masters = _masterStorageContract.GetList() ?? throw new NullListException();
foreach (var master in masters)
{
master.Validate(); // Проверяем валидность данных
var orders = _orderStorageContract.GetList()?.Count(x => x.Id.IsGuid()) ??
throw new NullListException();
var post = _postStorageContract.GetElementById(master.PostId) ?? throw new NullListException();
var baseSalary = post.Salary; // Основная зарплата
var prize = 500.0; // Премия
var totalSalary = baseSalary + prize; // Итоговая зарплата
_logger.LogDebug("The master {master.Id} was paid a salary of {salary}", master.Id, totalSalary);
_salaryStorageContract.AddElement(new SalaryDataModel(master.Id, finishDate, totalSalary, prize));
}
}
}
}

View File

@@ -0,0 +1,96 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
using TwoFromTheCasketContratcs.BuisnessLogicsContracts;
using TwoFromTheCasketContratcs.DataModels;
using TwoFromTheCasketContratcs.Enums;
using TwoFromTheCasketContratcs.Exceptions;
using TwoFromTheCasketContratcs.Extensions;
using TwoFromTheCasketContratcs.StorageContracts;
namespace TwoFromTheCasketBuisnessLogic.Implementations;
internal class ServiceBusinessLogicContract(IServiceStorageContract serviceStorageContract, ILogger logger) : IServiceBuisnessLogicContract
{
ILogger _logger = logger;
private IServiceStorageContract _serviceStorageContract = serviceStorageContract;
public List<ServiceDataModel> GetAllServices(bool onlyActive)
{
_logger.LogInformation("GetAllService called");
var services = _serviceStorageContract.GetList();
if(services == null)
{
throw new NullListException();
}
return services;
}
public List<ServiceDataModel> GetServicesByMasterId(string masterId, bool onlyActive)
{
_logger.LogInformation("GetAllServicesByMasterId called");
if (masterId.IsEmpty())
{
throw new ArgumentNullException(nameof(masterId));
}
if (!masterId.IsGuid())
{
throw new ValidationException("The value in the field masterId is not a unique identifier.");
}
return _serviceStorageContract.GetElementByMasterId(masterId) ?? throw new NullListException();
}
public List<ServiceDataModel> GetServicesByServiceType(ServiceType serviceType, bool onlyActive)
{
_logger.LogInformation($"GetServicesByServiceType called for {serviceType} (onlyActive: {onlyActive})");
var allServices = _serviceStorageContract.GetList() ?? new List<ServiceDataModel>();
var filteredByType = allServices.Where(s => s.ServiceType == serviceType);
if (onlyActive)
{
filteredByType = filteredByType.Where(s => s.IsDeleted!);
}
return filteredByType.ToList();
}
public void InsertService(ServiceDataModel serviceDataModel)
{
_logger.LogInformation("New data: {json}",
JsonSerializer.Serialize(serviceDataModel));
ArgumentNullException.ThrowIfNull(serviceDataModel);
serviceDataModel.Validate();
_serviceStorageContract.AddElement(serviceDataModel);
}
public void UpdateService(ServiceDataModel serviceDataModel)
{
_logger.LogInformation("Update data: {json}",
JsonSerializer.Serialize(serviceDataModel));
ArgumentNullException.ThrowIfNull(serviceDataModel);
serviceDataModel.Validate();
_serviceStorageContract.UpdElement(serviceDataModel);
}
public void DeleteService(string id)
{
_logger.LogInformation("Delete by id: {id}", id);
if (id.IsEmpty())
{
throw new ArgumentNullException(nameof(id));
}
if (!id.IsGuid())
{
throw new ValidationException("Id is not a unique identifier");
}
_serviceStorageContract.DelElement(id);
}
}

View File

@@ -0,0 +1,22 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<InternalsVisibleTo Include="TwoFromTheCasketTest" />
<InternalsVisibleTo Include="DynamicProxyGenAssembly2" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="9.0.3" />
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="9.0.4" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\TwoFromTheCasketContratcs\TwoFromTheCasketContratcs.csproj" />
</ItemGroup>
</Project>

View File

@@ -7,6 +7,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TwoFromTheCasketContratcs",
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TwoFromTheCasketTest", "TwoFromTheCasketTest\TwoFromTheCasketTest.csproj", "{71E6B2F8-F494-4500-A887-481047D885DF}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TwoFromTheCasketBuisnessLogic", "TwoFromTheCasketBuisnessLogic\TwoFromTheCasketBuisnessLogic.csproj", "{371435E4-6D04-4302-86C8-23F063FBE57A}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TwoFromTheCasketDatabase", "TwoFromTheCasketDatabase\TwoFromTheCasketDatabase.csproj", "{C77C86D0-B620-4737-93D9-1A5A69BD7128}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -21,6 +25,14 @@ Global
{71E6B2F8-F494-4500-A887-481047D885DF}.Debug|Any CPU.Build.0 = Debug|Any CPU
{71E6B2F8-F494-4500-A887-481047D885DF}.Release|Any CPU.ActiveCfg = Release|Any CPU
{71E6B2F8-F494-4500-A887-481047D885DF}.Release|Any CPU.Build.0 = Release|Any CPU
{371435E4-6D04-4302-86C8-23F063FBE57A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{371435E4-6D04-4302-86C8-23F063FBE57A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{371435E4-6D04-4302-86C8-23F063FBE57A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{371435E4-6D04-4302-86C8-23F063FBE57A}.Release|Any CPU.Build.0 = Release|Any CPU
{C77C86D0-B620-4737-93D9-1A5A69BD7128}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C77C86D0-B620-4737-93D9-1A5A69BD7128}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C77C86D0-B620-4737-93D9-1A5A69BD7128}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C77C86D0-B620-4737-93D9-1A5A69BD7128}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE

View File

@@ -0,0 +1,26 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TwoFromTheCasketContratcs.DataModels;
namespace TwoFromTheCasketContratcs.BuisnessLogicsContracts;
public interface IMasterBuisnessLogicContract
{
List<MasterDataModel> GetAllMasters(bool onlyActive = true);
List<MasterDataModel> GetAllMastersByPost(string postId, bool onlyActive = true);
List<MasterDataModel> GetAllMastersByBirthDate(DateTime fromDate, DateTime toDate, bool onlyActive = true);
List<MasterDataModel> GetAllMastersByEmploymentDate(DateTime fromDate, DateTime toDate, bool onlyActive = true);
MasterDataModel GetMasterByData(string data);
void InsertMaster(MasterDataModel masterDataModel);
void UpdateMaster(MasterDataModel masterDataModel);
void DeleteMaster(string id);
}

View File

@@ -0,0 +1,23 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TwoFromTheCasketContratcs.DataModels;
namespace TwoFromTheCasketContratcs.BuisnessLogicsContracts;
public interface IOrderBuisnessLogicContract
{
List<OrderDataModel> GetAllOrder();
OrderDataModel GetOrderByDate(DateTime fromDate);
OrderDataModel GetOrderByData(string data);
void InsertOrder(OrderDataModel orderDataModel);
void UpdateOrder(OrderDataModel orderDataModel);
void DeleteOrder(string id);
}

View File

@@ -0,0 +1,25 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TwoFromTheCasketContratcs.DataModels;
namespace TwoFromTheCasketContratcs.BuisnessLogicsContracts;
public interface IPostBuisnessLogicContract
{
List<PostDataModel> GetAllPosts();
List<PostDataModel> GetAllDataOfPost(string postId);
PostDataModel GetPostByData(string data);
void InsertPost(PostDataModel postDataModel);
void UpdatePost(PostDataModel postDataModel);
void DeletePost(string id);
void RestorePost(string id);
}

View File

@@ -0,0 +1,18 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TwoFromTheCasketContratcs.DataModels;
namespace TwoFromTheCasketContratcs.BuisnessLogicsContracts;
public interface ISalaryBuisnessLogicContract
{
List<SalaryDataModel> GetAllSalariesByPeriod(DateTime fromDate, DateTime toDate);
List<SalaryDataModel> GetAllSalariesByPeriodByMaster(DateTime fromDate, DateTime toDate, string masterId);
void CalculateSalaryByMonth(DateTime date);
}

View File

@@ -0,0 +1,26 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TwoFromTheCasketContratcs.DataModels;
using TwoFromTheCasketContratcs.Enums;
namespace TwoFromTheCasketContratcs.BuisnessLogicsContracts;
public interface IServiceBuisnessLogicContract
{
List<ServiceDataModel> GetAllServices(bool onlyActive);
List<ServiceDataModel> GetServicesByServiceType(ServiceType serviceType, bool onlyActive);
List<ServiceDataModel> GetServicesByMasterId(string masterId, bool onlyActive);
void InsertService(ServiceDataModel serviceDataModel);
void UpdateService(ServiceDataModel serviceDataModel);
void DeleteService(string id);
}

View File

@@ -11,16 +11,16 @@ using TwoFromTheCasketContratcs.Infrastructure;
namespace TwoFromTheCasketContratcs.DataModels;
public class OrderDataModel( string id, DateTime dataTime, StatusType status, RoomType roomType) : IValidation
public class OrderDataModel( string id, DateTime data, StatusType status, RoomType roomType) : IValidation
{
public string Id { get; private set; } = id;
public DateTime Date { get; private set; } = dataTime;
public DateTime Date { get; private set; } = data;
public StatusType Status { get; private set; } = status;
public RoomType RoomType { get; private set; } = roomType;
public void Validate()
{
if (Id.IsEmpty())

View File

@@ -11,13 +11,11 @@ using TwoFromTheCasketContratcs.Infrastructure;
namespace TwoFromTheCasketContratcs.DataModels;
public class PostDataModel(string id, string postId, string postName, PostType
public class PostDataModel(string id, string postName, PostType
postType, double salary, bool isActual, DateTime changeDate) : IValidation
{
public string Id { get; private set; } = id;
public string PostId { get; private set; } = postId;
public string PostName { get; private set; } = postName;
public PostType PostType { get; private set; } = postType;
@@ -28,6 +26,7 @@ postType, double salary, bool isActual, DateTime changeDate) : IValidation
public DateTime ChangeDate { get; private set; } = changeDate;
public void Validate()
{
if (Id.IsEmpty())
@@ -36,11 +35,6 @@ postType, double salary, bool isActual, DateTime changeDate) : IValidation
if (!Id.IsGuid())
throw new ValidationException("The value in the field Id is not a unique identifier");
if (PostId.IsEmpty())
throw new ValidationException("Field PostId is empty");
if (!PostId.IsGuid())
throw new ValidationException("The value in the field PostId is not a unique identifier");
if (PostName.IsEmpty())
throw new ValidationException("Field PostName is empty");

View File

@@ -0,0 +1,13 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TwoFromTheCasketContratcs.Exceptions;
public class ElementDeletedException : Exception
{
public ElementDeletedException(string id) : base($"Cannot modify a deleteditem(id: { id})") { }
}

View File

@@ -0,0 +1,18 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TwoFromTheCasketContratcs.Exceptions;
public class ElementExistsException : Exception
{
public string ParamName { get; private set; }
public string ParamValue { get; private set; }
public ElementExistsException(string paramName, string paramValue) : base($"There is alredy an element with value {paramValue} of parameter {paramName}")
{
ParamName = paramName;
ParamValue = paramValue;
}
}

View File

@@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TwoFromTheCasketContratcs.Exceptions;
public class ElementNotFoundException : Exception
{
public string Value { get; private set; }
public ElementNotFoundException(string value) : base($"Element not found at value = {value}") { Value = value; }
}

View File

@@ -0,0 +1,13 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Runtime.InteropServices.JavaScript.JSType;
namespace TwoFromTheCasketContratcs.Exceptions;
public class IncorrectDatesException : Exception
{
public IncorrectDatesException(DateTime start, DateTime end) : base($"The end date must be later than the start date..StartDate: { start: dd.MM.YYYY}. EndDate: {end:dd.MM.YYYY}") { }
}

View File

@@ -0,0 +1,12 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TwoFromTheCasketContratcs.Exceptions;
public class NullListException : Exception
{
public NullListException() : base("The returned list is null") { }
}

View File

@@ -0,0 +1,12 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TwoFromTheCasketContratcs.Exceptions;
public class StorageException : Exception
{
public StorageException(Exception ex) : base($"Error while working in storage: {ex.Message}", ex) { }
}

View File

@@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TwoFromTheCasketContratcs.Extensions;
public static class DateTimeExtensions
{
public static bool IsDateNotOlder(this DateTime date, DateTime olderDate)
{
return date >= olderDate;
}
}

View File

@@ -0,0 +1,12 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TwoFromTheCasketContratcs.Infrastructure;
public interface IConfigurationDatabase
{
string ConnectionString { get; }
}

View File

@@ -0,0 +1,28 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TwoFromTheCasketContratcs.DataModels;
namespace TwoFromTheCasketContratcs.StorageContracts;
public interface IMasterStorageContract
{
List<MasterDataModel> GetList(bool onlyActive = true, string? postId =
null, DateTime? fromBirthDate = null, DateTime? toBirthDate = null, DateTime?
fromEmploymentDate = null, DateTime? toEmploymentDate = null);
MasterDataModel? GetElementById(string id);
MasterDataModel? GetElementByFIO(string name);
MasterDataModel? GetElementByPostId(string postId);
void AddElement(MasterDataModel masterDataModel);
void UpdElement(MasterDataModel masterDataModel);
void DelElement(string id);
}

View File

@@ -0,0 +1,26 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TwoFromTheCasketContratcs.DataModels;
using TwoFromTheCasketContratcs.Enums;
namespace TwoFromTheCasketContratcs.StorageContracts;
public interface IOrderStorageContract
{
List<OrderDataModel> GetList();
OrderDataModel? GetElementById(string id);
OrderDataModel? GetElementByDate(DateTime date);
OrderDataModel? GetElementByStatus(StatusType status);
void AddElement(OrderDataModel orderDataModel);
void UpdElement(OrderDataModel orderDataModel);
void DelElement(string id);
}

View File

@@ -0,0 +1,27 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TwoFromTheCasketContratcs.DataModels;
namespace TwoFromTheCasketContratcs.StorageContracts;
public interface IPostStorageContract
{
List<PostDataModel> GetList(bool onlyActual = true);
List<PostDataModel> GetPostWithHistory(string postId);
PostDataModel? GetElementById(string id);
PostDataModel? GetElementByName(string name);
void AddElement(PostDataModel postDataModel);
void UpdElement(PostDataModel postDataModel);
void DelElement(string id);
void ResElement(string id);
}

View File

@@ -0,0 +1,23 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TwoFromTheCasketContratcs.DataModels;
using TwoFromTheCasketContratcs.Enums;
namespace TwoFromTheCasketContratcs.StorageContracts;
public interface ISalaryStorageContract
{
List<SalaryDataModel> GetList(DateTime startDate, DateTime endDate, string?
masterId = null);
SalaryDataModel? GetElementByMasterId(string masterId);
SalaryDataModel? GetElementBySalaryDate(DateTime salaryDate);
void AddElement(SalaryDataModel salaryDataModel);
}

View File

@@ -0,0 +1,26 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TwoFromTheCasketContratcs.DataModels;
using TwoFromTheCasketContratcs.Enums;
namespace TwoFromTheCasketContratcs.StorageContracts;
public interface IServiceStorageContract
{
List<ServiceDataModel> GetList();
List<ServiceHistoryDataModel> GetHistoryByServiceId(string serviceId);
ServiceDataModel? GetElementById(string id);
List<ServiceDataModel>? GetElementByServiceName(string name);
List<ServiceDataModel>? GetElementByMasterId(string masterId);
void AddElement(ServiceDataModel serviceDataModel);
void UpdElement(ServiceDataModel serviceDataModel);
void DelElement(string id);
}

View File

@@ -6,4 +6,8 @@
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="9.0.4" />
</ItemGroup>
</Project>

View File

@@ -0,0 +1,164 @@
using AutoMapper;
using Microsoft.EntityFrameworkCore;
using Npgsql;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;
using TwoFromTheCasketContratcs.DataModels;
using TwoFromTheCasketContratcs.Exceptions;
using TwoFromTheCasketContratcs.StorageContracts;
using TwoFromTheCasketDatabase.Models;
namespace TwoFromTheCasketDatabase.Implementation;
internal class MasterStorageContract : IMasterStorageContract
{
private readonly TwoFromTheCasketDbContext _dbContext;
private readonly Mapper _mapper;
public MasterStorageContract(TwoFromTheCasketDbContext twoFromTheCasketDbContext)
{
_dbContext = twoFromTheCasketDbContext;
var config = new MapperConfiguration(cfg =>
{
cfg.AddMaps(typeof(Master));
});
_mapper = new Mapper(config);
}
public List<MasterDataModel> GetList(bool onlyActive = true, string? postId = null, DateTime? fromBirthDate = null, DateTime? toBirthDate = null, DateTime? fromEmploymentDate = null, DateTime? toEmploymentDate = null)
{
try
{
var query = _dbContext.Masters.AsQueryable();
if (onlyActive) query = query.Where(x => !x.IsDeleted);
if (postId is not null) query = query.Where(x => x.PostId == postId);
if (fromBirthDate is not null && toBirthDate is not null)
query = query.Where(x => x.BirthDate >= fromBirthDate && x.BirthDate <= toBirthDate);
if (fromEmploymentDate is not null && toEmploymentDate is not null)
query = query.Where(x => x.EmploymentDate >= fromEmploymentDate
&& x.EmploymentDate <= toEmploymentDate);
return [.. query.Select(x => _mapper.Map<MasterDataModel>(x))];
}
catch(Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex);
}
}
public MasterDataModel? GetElementById(string id)
{
try
{
return _mapper.Map<MasterDataModel>(GetMasterById(id));
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex);
}
}
public MasterDataModel? GetElementByFIO(string name)
{
try
{
return _mapper.Map<MasterDataModel>(_dbContext.Masters.FirstOrDefault(x => x.FIO == name));
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex);
}
}
public MasterDataModel? GetElementByPostId(string postId)
{
try
{
return _mapper.Map<MasterDataModel>(_dbContext.Masters.FirstOrDefault(x => x.PostId == postId));
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex);
}
}
public void AddElement(MasterDataModel masterDataModel)
{
try
{
_dbContext.Masters.Add(_mapper.Map<Master>(masterDataModel));
_dbContext.SaveChanges();
}
catch(InvalidOperationException ex) when (ex.TargetSite?.Name == "ThrowIdentityConflict")
{
_dbContext.ChangeTracker.Clear();
throw new ElementExistsException("Id", masterDataModel.Id);
}
catch (DbUpdateException ex) when (ex.InnerException is PostgresException { ConstraintName : "IX_Master_FIO" } )
{
_dbContext.ChangeTracker.Clear();
throw new ElementExistsException("FIO", masterDataModel.FIO);
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex);
}
}
public void UpdElement(MasterDataModel masterDataModel)
{
try
{
var element = GetMasterById(masterDataModel.Id) ?? throw new ElementNotFoundException(masterDataModel.Id);
_dbContext.Masters.Update(_mapper.Map(masterDataModel,element));
_dbContext.SaveChanges();
}
catch (ElementNotFoundException)
{
_dbContext.ChangeTracker.Clear();
throw;
}
catch (DbUpdateException ex) when (ex.InnerException is PostgresException { ConstraintName: "IX_Master_FIO" })
{
_dbContext.ChangeTracker.Clear();
throw new ElementExistsException("FIO", masterDataModel.FIO);
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex);
}
}
public void DelElement(string id)
{
try
{
var element = GetMasterById(id) ?? throw new ElementNotFoundException(id);
element.IsDeleted = true;
_dbContext.SaveChanges();
}
catch (ElementNotFoundException)
{
_dbContext.ChangeTracker.Clear();
throw;
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex);
}
}
private Master? GetMasterById(string id) => _dbContext.Masters.FirstOrDefault(x => x.Id == id && !x.IsDeleted);
}

View File

@@ -0,0 +1,157 @@
using AutoMapper;
using Microsoft.EntityFrameworkCore;
using Npgsql;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TwoFromTheCasketContratcs.DataModels;
using TwoFromTheCasketContratcs.Enums;
using TwoFromTheCasketContratcs.Exceptions;
using TwoFromTheCasketContratcs.StorageContracts;
using TwoFromTheCasketDatabase.Models;
using static System.Runtime.InteropServices.JavaScript.JSType;
namespace TwoFromTheCasketDatabase.Implementation;
internal class OrderStorageContract : IOrderStorageContract
{
private readonly TwoFromTheCasketDbContext _dbContext;
private readonly Mapper _mapper;
public OrderStorageContract(TwoFromTheCasketDbContext twoFromTheCasketDbContext)
{
_dbContext = twoFromTheCasketDbContext;
var config = new MapperConfiguration(cfg =>
{
cfg.CreateMap<Order, OrderDataModel>()
.ConstructUsing(src => new OrderDataModel(
src.Id.ToString(),
src.Date,
src.Status,
src.RoomType));
cfg.CreateMap<OrderDataModel, Order>()
.ForMember(dest => dest.Id, opt => opt.MapFrom(src => Guid.Parse(src.Id)))
.ForMember(dest => dest.Date, opt => opt.MapFrom(src => src.Date))
.ForMember(dest => dest.Status, opt => opt.MapFrom(src => src.Status))
.ForMember(dest => dest.RoomType, opt => opt.MapFrom(src => src.RoomType));
});
_mapper = new Mapper(config);
}
public List<OrderDataModel> GetList()
{
try
{
return [.. _dbContext.Orders.Select(x => _mapper.Map<OrderDataModel>(x))];
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex);
}
}
public OrderDataModel? GetElementById(string id)
{
try
{
return _mapper.Map<OrderDataModel>(GetOrderById(id));
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex);
}
}
public OrderDataModel? GetElementByDate(DateTime date)
{
try
{
return _mapper.Map<OrderDataModel>(_dbContext.Orders.FirstOrDefault(x => x.Date == date));
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex);
}
}
public OrderDataModel? GetElementByStatus(StatusType status)
{
try
{
return _mapper.Map<OrderDataModel>(_dbContext.Orders.FirstOrDefault(x => x.Status == status));
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex);
}
}
public void AddElement(OrderDataModel orderDataModel)
{
try
{
_dbContext.Orders.Add(_mapper.Map<Order>(orderDataModel));
_dbContext.SaveChanges();
}
catch (InvalidOperationException ex) when (ex.TargetSite?.Name == "ThrowIdentityConflict")
{
_dbContext.ChangeTracker.Clear();
throw new ElementExistsException("Id", orderDataModel.Id);
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex);
}
}
public void UpdElement(OrderDataModel orderDataModel)
{
try
{
var element = GetOrderById(orderDataModel.Id) ?? throw new ElementNotFoundException(orderDataModel.Id);
_dbContext.Orders.Update(_mapper.Map(orderDataModel, element));
_dbContext.SaveChanges();
}
catch (ElementNotFoundException)
{
_dbContext.ChangeTracker.Clear();
throw;
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex);
}
}
public void DelElement(string id)
{
try
{
var element = GetOrderById(id) ?? throw new ElementNotFoundException(id);
_dbContext.Orders.Remove(element);
_dbContext.SaveChanges();
}
catch (ElementNotFoundException)
{
_dbContext.ChangeTracker.Clear();
throw;
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex);
}
}
private Order? GetOrderById(string id) => _dbContext.Orders.FirstOrDefault(x => x.Id == id);
}

View File

@@ -0,0 +1,191 @@
using AutoMapper;
using Microsoft.EntityFrameworkCore;
using Npgsql;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TwoFromTheCasketContratcs.DataModels;
using TwoFromTheCasketContratcs.Exceptions;
using TwoFromTheCasketContratcs.StorageContracts;
using TwoFromTheCasketDatabase.Models;
namespace TwoFromTheCasketDatabase.Implementation;
internal class PostStorageContract : IPostStorageContract
{
private readonly TwoFromTheCasketDbContext _dbContext;
private readonly Mapper _mapper;
public PostStorageContract(TwoFromTheCasketDbContext dbContext)
{
_dbContext = dbContext;
var config = new MapperConfiguration(cfg =>
{
cfg.CreateMap<Post, PostDataModel>()
.ForMember(x => x.Id, x => x.MapFrom(src => src.PostId));
cfg.CreateMap<PostDataModel, Post>()
.ForMember(x => x.Id, x => x.Ignore())
.ForMember(x => x.PostId, x => x.MapFrom(src => src.Id))
.ForMember(x => x.IsActual, x => x.MapFrom(src => true))
.ForMember(x => x.ChangeDate, x => x.MapFrom(src => DateTime.UtcNow));
});
_mapper = new Mapper(config);
}
public List<PostDataModel> GetList(bool onlyActual = true)
{
try
{
var query = _dbContext.Posts.AsQueryable();
if (onlyActual) query = query.Where(x => x.IsActual);
return [.. query.Select(x => _mapper.Map<PostDataModel>(x))];
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex);
}
}
public List<PostDataModel> GetPostWithHistory(string postId)
{
try
{
return [.. _dbContext.Posts.Where(x => x.PostId == postId).Select(x => _mapper.Map<PostDataModel>(x))];
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex);
}
}
public PostDataModel? GetElementById(string id)
{
try
{
return _mapper.Map<PostDataModel>(_dbContext.Posts.FirstOrDefault(x => x.PostId == id && x.IsActual));
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex);
}
}
public PostDataModel? GetElementByName(string name)
{
try
{
return _mapper.Map<PostDataModel>(_dbContext.Posts.FirstOrDefault(x => x.PostName == name && x.IsActual));
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex);
}
}
public void AddElement(PostDataModel postDataModel)
{
try
{
_dbContext.Posts.Add(_mapper.Map<Post>(postDataModel));
_dbContext.SaveChanges();
}
catch (DbUpdateException ex)
when (ex.InnerException is PostgresException { ConstraintName: "IX_Posts_PostName_IsActual" })
{
_dbContext.ChangeTracker.Clear();
throw new ElementExistsException("PostName", postDataModel.PostName);
}
catch (DbUpdateException ex)
when (ex.InnerException is PostgresException { ConstraintName: "IX_Posts_PostId_IsActual" })
{
_dbContext.ChangeTracker.Clear();
throw new ElementExistsException("PostId", postDataModel.Id);
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex);
}
}
public void UpdElement(PostDataModel postDataModel)
{
try
{
var transaction = _dbContext.Database.BeginTransaction();
try
{
var element = GetPostById(postDataModel.Id) ?? throw new ElementNotFoundException(postDataModel.Id);
if (!element.IsActual) throw new ElementDeletedException(postDataModel.Id);
element.IsActual = false;
_dbContext.SaveChanges();
var newElement = _mapper.Map<Post>(postDataModel);
_dbContext.Posts.Add(newElement);
_dbContext.SaveChanges();
transaction.Commit();
}
catch
{
transaction.Rollback();
throw;
}
}
catch (DbUpdateException ex)
when (ex.InnerException is PostgresException { ConstraintName: "IX_Posts_PostName_IsActual" })
{
_dbContext.ChangeTracker.Clear();
throw new ElementExistsException("PostName", postDataModel.PostName);
}
catch (Exception ex) when (ex is ElementDeletedException || ex is ElementNotFoundException)
{
_dbContext.ChangeTracker.Clear();
throw;
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex);
}
}
public void DelElement(string id)
{
try
{
var element = GetPostById(id) ?? throw new ElementNotFoundException(id);
if (!element.IsActual) throw new ElementDeletedException(id);
element.IsActual = false;
_dbContext.SaveChanges();
}
catch
{
_dbContext.ChangeTracker.Clear();
throw;
}
}
public void ResElement(string id)
{
try
{
var element = GetPostById(id) ?? throw new ElementNotFoundException(id);
element.IsActual = true;
_dbContext.SaveChanges();
}
catch
{
_dbContext.ChangeTracker.Clear();
throw;
}
}
private Post? GetPostById(string id) => _dbContext.Posts.Where(x => x.PostId == id)
.OrderByDescending(x => x.ChangeDate).FirstOrDefault();
}

View File

@@ -0,0 +1,104 @@
using AutoMapper;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TwoFromTheCasketContratcs.DataModels;
using TwoFromTheCasketContratcs.Exceptions;
using TwoFromTheCasketContratcs.StorageContracts;
using TwoFromTheCasketDatabase.Models;
using static System.Runtime.InteropServices.JavaScript.JSType;
namespace TwoFromTheCasketDatabase.Implementation;
internal class SalaryStorageContract : ISalaryStorageContract
{
TwoFromTheCasketDbContext _dbContext;
Mapper _mapper;
public SalaryStorageContract(TwoFromTheCasketDbContext twoFromTheCasketDbContext)
{
_dbContext = twoFromTheCasketDbContext;
var config = new MapperConfiguration(cfg =>
{
cfg.CreateMap<Salary, SalaryDataModel>()
.ConstructUsing(src => new SalaryDataModel(
src.MasterId.ToString(),
src.SalaryDate,
src.SalarySize,
src.Prize));
cfg.CreateMap<SalaryDataModel, Salary>()
.ForMember(dest => dest.MasterId, opt => opt.MapFrom(src => Guid.Parse(src.MasterId)))
.ForMember(dest => dest.SalaryDate, opt => opt.MapFrom(src => src.SalaryDate))
.ForMember(dest => dest.SalarySize, opt => opt.MapFrom(src => src.Salary))
.ForMember(dest => dest.Prize, opt => opt.MapFrom(src => src.Prize));
});
_mapper = new Mapper(config);
}
public List<SalaryDataModel> GetList(DateTime startDate, DateTime endDate, string? masterId = null)
{
try
{
var query = _dbContext.Salaries.Where(x => x.SalaryDate >= startDate && x.SalaryDate <= endDate);
if (masterId is not null) query = query.Where(x => x.MasterId == masterId);
return [.. query.Select(x => _mapper.Map<SalaryDataModel>(x))];
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex);
}
}
public SalaryDataModel? GetElementByMasterId(string masterId)
{
try
{
return _mapper.Map<SalaryDataModel>(_dbContext.Salaries.FirstOrDefault(x => x.MasterId == masterId));
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex);
}
}
public SalaryDataModel? GetElementBySalaryDate(DateTime salaryDate)
{
try
{
return _mapper.Map<SalaryDataModel>(_dbContext.Salaries.FirstOrDefault(x => x.SalaryDate == salaryDate));
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex);
}
}
public void AddElement(SalaryDataModel salaryDataModel)
{
try
{
_dbContext.Salaries.Add(_mapper.Map<Salary>(salaryDataModel));
_dbContext.SaveChanges();
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex);
}
}
}

View File

@@ -0,0 +1,206 @@
using AutoMapper;
using Microsoft.EntityFrameworkCore;
using Npgsql;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TwoFromTheCasketContratcs.DataModels;
using TwoFromTheCasketContratcs.Exceptions;
using TwoFromTheCasketContratcs.StorageContracts;
using TwoFromTheCasketDatabase.Models;
namespace TwoFromTheCasketDatabase.Implementation;
internal class ServiceStorageContract : IServiceStorageContract
{
private readonly TwoFromTheCasketDbContext _dbContext;
private readonly Mapper _mapper;
public ServiceStorageContract(TwoFromTheCasketDbContext dbContext)
{
_dbContext = dbContext;
var config = new MapperConfiguration(cfg =>
{
cfg.CreateMap<Service, ServiceDataModel>();
cfg.CreateMap<ServiceDataModel, Service>()
.ForMember(x => x.IsDeleted, x => x.MapFrom(src => false));
cfg.CreateMap<ServiceHistory, ServiceHistoryDataModel>();
cfg.CreateMap<ServiceHistoryDataModel, ServiceHistory>();
});
_mapper = new Mapper(config);
}
public List<ServiceDataModel> GetList()
{
try
{
return [.. _dbContext.Services.Select(x => _mapper.Map<ServiceDataModel>(x))];
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex);
}
}
public ServiceDataModel? GetElementById(string id)
{
try
{
return _mapper.Map<ServiceDataModel>(_dbContext.Services.FirstOrDefault(x => x.Id == id && !x.IsDeleted));
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex);
}
}
public List<ServiceDataModel>? GetElementByMasterId(string masterId)
{
try
{
return [.. _dbContext.Services.Select(x => _mapper.Map<ServiceDataModel>(_dbContext.Services.FirstOrDefault(x => x.MasterId == masterId && !x.IsDeleted)))];
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex);
}
}
public List<ServiceDataModel>? GetElementByServiceName(string name)
{
try
{
return [.. _dbContext.Services.Select(x => _mapper.Map<ServiceDataModel>(_dbContext.Services.FirstOrDefault(x => x.ServiceName == name && !x.IsDeleted)))];
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex);
}
}
public List<ServiceHistoryDataModel> GetHistoryByServiceId(string serviceId)
{
try
{
return [.. _dbContext.ServiceHistories.Where(x => x.ServiceId == serviceId).OrderByDescending(x => x.ChangeDate).Select(x => _mapper.Map<ServiceHistoryDataModel>(x))];
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex);
}
}
public void AddElement(ServiceDataModel serviceDataModel)
{
try
{
_dbContext.Services.Add(_mapper.Map<Service>(serviceDataModel));
_dbContext.SaveChanges();
}
catch (InvalidOperationException ex) when (ex.TargetSite?.Name ==
"ThrowIdentityConflict")
{
_dbContext.ChangeTracker.Clear();
throw new ElementExistsException("Id", serviceDataModel.Id);
}
catch (DbUpdateException ex) when (ex.InnerException is
PostgresException { ConstraintName: "IX_Service_ServiceName_IsDeleted" })
{
_dbContext.ChangeTracker.Clear();
throw new ElementExistsException("ServiceName",
serviceDataModel.ServiceName);
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex);
}
}
public void UpdElement(ServiceDataModel serviceDataModel)
{
try
{
var transaction = _dbContext.Database.BeginTransaction();
try
{
var element = GetServiceById(serviceDataModel.Id) ??
throw new ElementNotFoundException(serviceDataModel.Id);
if (element.Price != serviceDataModel.Price)
{
_dbContext.ServiceHistories.Add(new
ServiceHistory() { ServiceId = element.Id, OldPrice = element.Price});
_dbContext.SaveChanges();
}
_dbContext.Services.Update(_mapper.Map(serviceDataModel,
element));
_dbContext.SaveChanges();
transaction.Commit();
}
catch
{
transaction.Rollback();
throw;
}
}
catch (DbUpdateException ex) when (ex.InnerException is
PostgresException { ConstraintName: "IX_Products_ProductName_IsDeleted" })
{
_dbContext.ChangeTracker.Clear();
throw new ElementExistsException("ProductName",
serviceDataModel.ServiceName);
}
catch (Exception ex) when (ex is ElementDeletedException || ex is
ElementNotFoundException)
{
_dbContext.ChangeTracker.Clear();
throw;
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex);
}
}
public void DelElement(string id)
{
try
{
var element = GetServiceById(id) ?? throw new
ElementNotFoundException(id);
element.IsDeleted = true;
_dbContext.SaveChanges();
}
catch (ElementNotFoundException ex)
{
_dbContext.ChangeTracker.Clear();
throw;
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex);
}
}
private Service? GetServiceById(string id) => _dbContext.Services.FirstOrDefault(x => x.Id == id && !x.IsDeleted);
}

View File

@@ -0,0 +1,36 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using AutoMapper;
using TwoFromTheCasketContratcs.DataModels;
namespace TwoFromTheCasketDatabase.Models;
[AutoMap(typeof(MasterDataModel), ReverseMap = true)]
internal class Master
{
public required string Id { get; set; }
public required string FIO { get; set; }
[ForeignKey("PostId")]
public required string PostId { get; set; }
public DateTime BirthDate { get; set; }
public DateTime EmploymentDate { get; set; }
public bool IsDeleted { get; set; }
[ForeignKey("ServiceId")]
public List<Service>? Services { get; set; }
[ForeignKey("SalaryId")]
public List<Salary>? Salaries { get; set; }
[ForeignKey("ServiceOrderId")]
public List<ServiceOrder>? ServiceOrders { get; set; }
}

View File

@@ -0,0 +1,26 @@
using AutoMapper;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TwoFromTheCasketContratcs.DataModels;
using TwoFromTheCasketContratcs.Enums;
namespace TwoFromTheCasketDatabase.Models;
internal class Order
{
public required string Id { get; set; }
public DateTime Date { get; set; }
public StatusType Status { get; set; }
public RoomType RoomType { get; set; }
}

View File

@@ -0,0 +1,26 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TwoFromTheCasketContratcs.Enums;
namespace TwoFromTheCasketDatabase.Models;
internal class Post
{
public required string Id { get; set; } = Guid.NewGuid().ToString();
public required string PostId { get; set; }
public required string PostName { get; set; }
public PostType PostType { get; set; }
public double Salary { get; set; }
public bool IsActual { get; set; }
public DateTime ChangeDate { get; set; }
}

View File

@@ -0,0 +1,25 @@
using AutoMapper;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TwoFromTheCasketContratcs.DataModels;
namespace TwoFromTheCasketDatabase.Models;
[AutoMap(typeof(SalaryDataModel), ReverseMap = true)]
internal class Salary
{
public string Id { get; set; } = Guid.NewGuid().ToString();
public required string MasterId { get; set; }
public DateTime SalaryDate { get; set; }
public required double SalarySize { get; set; }
public double Prize { get; set; }
public Master? Master { get; set; }
}

View File

@@ -0,0 +1,27 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TwoFromTheCasketContratcs.Enums;
namespace TwoFromTheCasketDatabase.Models;
internal class Service
{
public required string Id { get; set; }
public required string ServiceName { get; set; }
public required ServiceType ServiceType { get; set; }
public required string MasterId { get; set; }
public required double Price { get; set; }
public required bool IsDeleted { get; set; }
[ForeignKey("ServiceId")]
public List<ServiceHistory>? ServiceHistory { get; set; }
}

View File

@@ -0,0 +1,19 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TwoFromTheCasketDatabase.Models;
internal class ServiceHistory
{
public required string ServiceId { get; set; }
public required double OldPrice { get; set; }
public DateTime ChangeDate { get; set; } = DateTime.UtcNow;
public Service? Service { get; set; }
}

View File

@@ -0,0 +1,20 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TwoFromTheCasketDatabase.Models;
internal class ServiceOrder
{
public required string OrderId { get; set; }
public required string ServiceId { get; set; }
public required string MasterId { get; set; }
public int TimeOfWorking { get; set; }
}

View File

@@ -0,0 +1,25 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="AutoMapper" Version="14.0.0" />
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="9.0.4" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\TwoFromTheCasketContratcs\TwoFromTheCasketContratcs.csproj" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\TwoFromTheCasketContratcs\TwoFromTheCasketContratcs.csproj" />
</ItemGroup>
<ItemGroup>
<InternalsVisibleTo Include="TwoFromTheCasketTest" />
<InternalsVisibleTo Include="DynamicProxyGenAssembly2" />
</ItemGroup>
</Project>

View File

@@ -0,0 +1,65 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using TwoFromTheCasketContratcs.Infrastructure;
using TwoFromTheCasketDatabase.Models;
namespace TwoFromTheCasketDatabase;
internal class TwoFromTheCasketDbContext(IConfigurationDatabase configurationDatabase) : DbContext
{
private readonly IConfigurationDatabase? _configurationDatebase = configurationDatabase;
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseNpgsql(_configurationDatebase?.ConnectionString, o => o.SetPostgresVersion(12, 2));
base.OnConfiguring(optionsBuilder);
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Master>().HasIndex(e => new { e.Id, e.IsDeleted }).IsUnique().HasFilter($"\"{nameof(Master.IsDeleted)}\" = FALSE");
modelBuilder.Entity<Order>().HasIndex(x => x.Id).IsUnique();
modelBuilder.Entity<Post>()
.HasIndex(e => new { e.PostName, e.IsActual })
.IsUnique()
.HasFilter($"\"{nameof(Post.IsActual)}\" = TRUE");
modelBuilder.Entity<Post>()
.HasIndex(e => new { e.PostId, e.IsActual })
.IsUnique()
.HasFilter($"\"{nameof(Post.IsActual)}\" = TRUE");
modelBuilder.Entity<ServiceHistory>().HasKey(x => x.ServiceId);
modelBuilder.Entity<Service>().HasIndex(e => new { e.ServiceName, e.IsDeleted }).IsUnique().HasFilter($"\"{nameof(Service.IsDeleted)}\" = FALSE");
modelBuilder.Entity<ServiceOrder>().HasKey(x => new { x.ServiceId, x.MasterId, x.OrderId });
}
public DbSet<Master> Masters { get; set; }
public DbSet<Order> Orders { get; set; }
public DbSet<Post> Posts { get; set; }
public DbSet<Salary> Salaries { get; set; }
public DbSet<Service> Services { get; set; }
public DbSet<ServiceHistory> ServiceHistories { get; set; }
public DbSet<ServiceOrder> ServiceOrders { get; set; }
}

View File

@@ -0,0 +1,602 @@
using System;
using System.Collections.Generic;
using Microsoft.Extensions.Logging;
using Moq;
using NUnit.Framework;
using TwoFromTheCasketBuisnessLogic.Implementations;
using TwoFromTheCasketContratcs.BuisnessLogicsContracts;
using TwoFromTheCasketContratcs.DataModels;
using TwoFromTheCasketContratcs.Enums;
using TwoFromTheCasketContratcs.Exceptions;
using TwoFromTheCasketContratcs.StorageContracts;
namespace TwoFromTheCasketTest.BuisnessLogicContractTests;
[TestFixture]
internal class MasterBusinessLogicContractTests
{
private MasterBusinessLogicContract _masterBusinessLogicContract;
private Mock<IMasterStorageContract> _masterStorageContract;
[OneTimeSetUp]
public void OneTimeSetUp()
{
_masterStorageContract = new Mock<IMasterStorageContract>();
_masterBusinessLogicContract = new MasterBusinessLogicContract(_masterStorageContract.Object, new Mock<ILogger>().Object);
}
[SetUp]
public void SetUp()
{
_masterStorageContract.Reset();
}
[Test]
public void GetAllMasters_ReturnListOfRecords_Test()
{
// Arrange
var listOriginal = new List<MasterDataModel>()
{
new(Guid.NewGuid().ToString(), "fio 1", Guid.NewGuid().ToString(), DateTime.Now.AddYears(-16).AddDays(-1), DateTime.Now, false),
new(Guid.NewGuid().ToString(), "fio 2", Guid.NewGuid().ToString(), DateTime.Now.AddYears(-16).AddDays(-1), DateTime.Now, true),
new(Guid.NewGuid().ToString(), "fio 3", Guid.NewGuid().ToString(), DateTime.Now.AddYears(-16).AddDays(-1), DateTime.Now, false),
};
_masterStorageContract.Setup(x => x.GetList(It.IsAny<bool>(), It.IsAny<string?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>())).Returns(listOriginal);
// Act
var listOnlyActive = _masterBusinessLogicContract.GetAllMasters(true);
var list = _masterBusinessLogicContract.GetAllMasters(false);
// Assert
Assert.Multiple(() =>
{
Assert.That(listOnlyActive, Is.Not.Null);
Assert.That(list, Is.Not.Null);
Assert.That(listOnlyActive, Is.EquivalentTo(listOriginal));
Assert.That(list, Is.EquivalentTo(listOriginal));
});
_masterStorageContract.Verify(x => x.GetList(true, null, null, null, null, null), Times.Once);
_masterStorageContract.Verify(x => x.GetList(false, null, null, null, null, null), Times.Once);
}
[Test]
public void GetAllMasters_ReturnEmptyList_Test()
{
// Arrange
_masterStorageContract.Setup(x => x.GetList(It.IsAny<bool>(), It.IsAny<string?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>())).Returns([]);
// Act
var listOnlyActive = _masterBusinessLogicContract.GetAllMasters(true);
var list = _masterBusinessLogicContract.GetAllMasters(false);
// Assert
Assert.Multiple(() =>
{
Assert.That(listOnlyActive, Is.Not.Null);
Assert.That(list, Is.Not.Null);
Assert.That(listOnlyActive, Has.Count.EqualTo(0));
Assert.That(list, Has.Count.EqualTo(0));
});
_masterStorageContract.Verify(x => x.GetList(It.IsAny<bool>(), null, null, null, null, null), Times.Exactly(2));
}
[Test]
public void GetAllMasters_ReturnNull_ThrowException_Test()
{
// Act & Assert
Assert.That(() => _masterBusinessLogicContract.GetAllMasters(It.IsAny<bool>()), Throws.TypeOf<NullListException>());
_masterStorageContract.Verify(x => x.GetList(It.IsAny<bool>(), It.IsAny<string?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>()), Times.Once);
}
[Test]
public void GetAllMasters_StorageThrowError_ThrowException_Test()
{
// Arrange
_masterStorageContract.Setup(x => x.GetList(It.IsAny<bool>(), It.IsAny<string?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>())).Throws(new StorageException(new InvalidOperationException()));
// Act & Assert
Assert.That(() => _masterBusinessLogicContract.GetAllMasters(It.IsAny<bool>()), Throws.TypeOf<StorageException>());
_masterStorageContract.Verify(x => x.GetList(It.IsAny<bool>(), null, null, null, null, null), Times.Once);
}
[Test]
public void GetAllMastersByPost_ReturnListOfRecords_Test()
{
// Arrange
var postId = Guid.NewGuid().ToString();
var listOriginal = new List<MasterDataModel>()
{
new(Guid.NewGuid().ToString(), "fio 1", Guid.NewGuid().ToString(), DateTime.Now.AddYears(-16).AddDays(-1), DateTime.Now, false),
new(Guid.NewGuid().ToString(), "fio 2", Guid.NewGuid().ToString(), DateTime.Now.AddYears(-16).AddDays(-1), DateTime.Now, true),
new(Guid.NewGuid().ToString(), "fio 3", Guid.NewGuid().ToString(), DateTime.Now.AddYears(-16).AddDays(-1), DateTime.Now, false),
};
_masterStorageContract.Setup(x => x.GetList(It.IsAny<bool>(), It.IsAny<string?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>())).Returns(listOriginal);
// Act
var listOnlyActive = _masterBusinessLogicContract.GetAllMastersByPost(postId, true);
var list = _masterBusinessLogicContract.GetAllMastersByPost(postId, false);
// Assert
Assert.Multiple(() =>
{
Assert.That(listOnlyActive, Is.Not.Null);
Assert.That(list, Is.Not.Null);
Assert.That(listOnlyActive, Is.EquivalentTo(listOriginal));
Assert.That(list, Is.EquivalentTo(listOriginal));
});
_masterStorageContract.Verify(x => x.GetList(true, postId, null, null, null, null), Times.Once);
_masterStorageContract.Verify(x => x.GetList(false, postId, null, null, null, null), Times.Once);
}
[Test]
public void GetAllMastersByPost_ReturnEmptyList_Test()
{
// Arrange
_masterStorageContract.Setup(x => x.GetList(It.IsAny<bool>(), It.IsAny<string?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>())).Returns([]);
// Act
var listOnlyActive = _masterBusinessLogicContract.GetAllMastersByPost(Guid.NewGuid().ToString(), true);
var list = _masterBusinessLogicContract.GetAllMastersByPost(Guid.NewGuid().ToString(), false);
// Assert
Assert.Multiple(() =>
{
Assert.That(listOnlyActive, Is.Not.Null);
Assert.That(list, Is.Not.Null);
Assert.That(listOnlyActive, Has.Count.EqualTo(0));
Assert.That(list, Has.Count.EqualTo(0));
});
_masterStorageContract.Verify(x => x.GetList(It.IsAny<bool>(), It.IsAny<string>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>()), Times.Exactly(2));
}
[Test]
public void GetAllMastersByPost_PostIdIsNullOrEmpty_ThrowException_Test()
{
// Act & Assert
Assert.That(() => _masterBusinessLogicContract.GetAllMastersByPost(null, It.IsAny<bool>()), Throws.TypeOf<ArgumentNullException>());
Assert.That(() => _masterBusinessLogicContract.GetAllMastersByPost(string.Empty, It.IsAny<bool>()), Throws.TypeOf<ArgumentNullException>());
_masterStorageContract.Verify(x => x.GetList(It.IsAny<bool>(), It.IsAny<string>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>()), Times.Never);
}
[Test]
public void GetAllMastersByPost_PostIdIsNotGuid_ThrowException_Test()
{
// Act & Assert
Assert.That(() => _masterBusinessLogicContract.GetAllMastersByPost("postId", It.IsAny<bool>()), Throws.TypeOf<ValidationException>());
_masterStorageContract.Verify(x => x.GetList(It.IsAny<bool>(), It.IsAny<string>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>()), Times.Never);
}
[Test]
public void GetAllMastersByPost_ReturnNull_ThrowException_Test()
{
// Act & Assert
Assert.That(() => _masterBusinessLogicContract.GetAllMastersByPost(Guid.NewGuid().ToString(), It.IsAny<bool>()), Throws.TypeOf<NullListException>());
_masterStorageContract.Verify(x => x.GetList(It.IsAny<bool>(), It.IsAny<string>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>()), Times.Once);
}
[Test]
public void GetAllMastersByPost_StorageThrowError_ThrowException_Test()
{
// Arrange
_masterStorageContract.Setup(x => x.GetList(It.IsAny<bool>(), It.IsAny<string?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>())).Throws(new StorageException(new InvalidOperationException()));
// Act & Assert
Assert.That(() => _masterBusinessLogicContract.GetAllMastersByPost(Guid.NewGuid().ToString(), It.IsAny<bool>()), Throws.TypeOf<StorageException>());
_masterStorageContract.Verify(x => x.GetList(It.IsAny<bool>(), It.IsAny<string?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>()), Times.Once);
}
[Test]
public void GetAllMastersByBirthDate_ReturnListOfRecords_Test()
{
// Arrange
var date = DateTime.UtcNow;
var listOriginal = new List<MasterDataModel>()
{
new(Guid.NewGuid().ToString(), "fio 1", Guid.NewGuid().ToString(), DateTime.Now.AddYears(-16).AddDays(-1), DateTime.Now, false),
new(Guid.NewGuid().ToString(), "fio 2", Guid.NewGuid().ToString(), DateTime.Now.AddYears(-16).AddDays(-1), DateTime.Now, true),
new(Guid.NewGuid().ToString(), "fio 3", Guid.NewGuid().ToString(), DateTime.Now.AddYears(-16).AddDays(-1), DateTime.Now, false),
};
_masterStorageContract.Setup(x => x.GetList(It.IsAny<bool>(), It.IsAny<string?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>())).Returns(listOriginal);
// Act
var listOnlyActive = _masterBusinessLogicContract.GetAllMastersByBirthDate(date, date.AddDays(1), true);
var list = _masterBusinessLogicContract.GetAllMastersByBirthDate(date, date.AddDays(1), false);
// Assert
Assert.Multiple(() =>
{
Assert.That(listOnlyActive, Is.Not.Null);
Assert.That(list, Is.Not.Null);
Assert.That(listOnlyActive, Is.EquivalentTo(listOriginal));
Assert.That(list, Is.EquivalentTo(listOriginal));
});
_masterStorageContract.Verify(x => x.GetList(true, null, date, date.AddDays(1), null, null), Times.Once);
_masterStorageContract.Verify(x => x.GetList(false, null, date, date.AddDays(1), null, null), Times.Once);
}
[Test]
public void GetAllMastersByBirthDate_ReturnEmptyList_Test()
{
// Arrange
_masterStorageContract.Setup(x => x.GetList(It.IsAny<bool>(), It.IsAny<string?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>())).Returns([]);
// Act
var listOnlyActive = _masterBusinessLogicContract.GetAllMastersByBirthDate(DateTime.UtcNow, DateTime.UtcNow.AddDays(1), true);
var list = _masterBusinessLogicContract.GetAllMasters(false);
// Assert
Assert.Multiple(() =>
{
Assert.That(listOnlyActive, Is.Not.Null);
Assert.That(list, Is.Not.Null);
Assert.That(listOnlyActive, Has.Count.EqualTo(0));
Assert.That(list, Has.Count.EqualTo(0));
});
_masterStorageContract.Verify(x => x.GetList(true, null, It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), null, null), Times.Once);
_masterStorageContract.Verify(x => x.GetList(false, null, It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), null, null), Times.Once);
}
[Test]
public void GetAllMastersByBirthDate_IncorrectDates_ThrowException_Test()
{
// Arrange
var date = DateTime.UtcNow;
// Act & Assert
Assert.That(() => _masterBusinessLogicContract.GetAllMastersByBirthDate(date, date, It.IsAny<bool>()), Throws.TypeOf<IncorrectDatesException>());
Assert.That(() => _masterBusinessLogicContract.GetAllMastersByBirthDate(date, date.AddSeconds(-1), It.IsAny<bool>()), Throws.TypeOf<IncorrectDatesException>());
_masterStorageContract.Verify(x => x.GetList(It.IsAny<bool>(), It.IsAny<string?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>()), Times.Never);
}
[Test]
public void GetAllMastersByBirthDate_ReturnNull_ThrowException_Test()
{
// Act & Assert
Assert.That(() => _masterBusinessLogicContract.GetAllMastersByBirthDate(DateTime.UtcNow, DateTime.UtcNow.AddDays(1), It.IsAny<bool>()), Throws.TypeOf<NullListException>());
_masterStorageContract.Verify(x => x.GetList(It.IsAny<bool>(), It.IsAny<string?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>()), Times.Once);
}
[Test]
public void GetAllMastersByBirthDate_StorageThrowError_ThrowException_Test()
{
// Arrange
_masterStorageContract.Setup(x => x.GetList(It.IsAny<bool>(), It.IsAny<string?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>())).Throws(new StorageException(new InvalidOperationException()));
// Act & Assert
Assert.That(() => _masterBusinessLogicContract.GetAllMastersByBirthDate(DateTime.UtcNow, DateTime.UtcNow.AddDays(1), It.IsAny<bool>()), Throws.TypeOf<StorageException>());
_masterStorageContract.Verify(x => x.GetList(It.IsAny<bool>(), It.IsAny<string?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>()), Times.Once);
}
[Test]
public void GetAllMastersByEmploymentDate_ReturnListOfRecords_Test()
{
// Arrange
var date = DateTime.UtcNow;
var listOriginal = new List<MasterDataModel>()
{
new(Guid.NewGuid().ToString(), "fio 1", Guid.NewGuid().ToString(), DateTime.Now.AddYears(-16).AddDays(-1), DateTime.Now, false),
new(Guid.NewGuid().ToString(), "fio 2", Guid.NewGuid().ToString(), DateTime.Now.AddYears(-16).AddDays(-1), DateTime.Now, true),
new(Guid.NewGuid().ToString(), "fio 3", Guid.NewGuid().ToString(), DateTime.Now.AddYears(-16).AddDays(-1), DateTime.Now, false),
};
_masterStorageContract.Setup(x => x.GetList(It.IsAny<bool>(), It.IsAny<string?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>())).Returns(listOriginal);
// Act
var listOnlyActive = _masterBusinessLogicContract.GetAllMastersByEmploymentDate(date, date.AddDays(1), true);
var list = _masterBusinessLogicContract.GetAllMastersByEmploymentDate(date, date.AddDays(1), false);
// Assert
Assert.Multiple(() =>
{
Assert.That(listOnlyActive, Is.Not.Null);
Assert.That(list, Is.Not.Null);
Assert.That(listOnlyActive, Is.EquivalentTo(listOriginal));
Assert.That(list, Is.EquivalentTo(listOriginal));
});
_masterStorageContract.Verify(x => x.GetList(true, null, null, null, date, date.AddDays(1)), Times.Once);
_masterStorageContract.Verify(x => x.GetList(false, null, null, null, date, date.AddDays(1)), Times.Once);
}
[Test]
public void GetAllMastersByEmploymentDate_ReturnEmptyList_Test()
{
// Arrange
_masterStorageContract.Setup(x => x.GetList(It.IsAny<bool>(), It.IsAny<string?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>())).Returns([]);
// Act
var listOnlyActive = _masterBusinessLogicContract.GetAllMastersByEmploymentDate(DateTime.UtcNow, DateTime.UtcNow.AddDays(1), true);
var list = _masterBusinessLogicContract.GetAllMastersByEmploymentDate(DateTime.UtcNow, DateTime.UtcNow.AddDays(1), false);
// Assert
Assert.Multiple(() =>
{
Assert.That(listOnlyActive, Is.Not.Null);
Assert.That(list, Is.Not.Null);
Assert.That(listOnlyActive, Has.Count.EqualTo(0));
Assert.That(list, Has.Count.EqualTo(0));
});
_masterStorageContract.Verify(x => x.GetList(true, null, null, null, It.IsAny<DateTime?>(), It.IsAny<DateTime?>()), Times.Once);
_masterStorageContract.Verify(x => x.GetList(false, null, null, null, It.IsAny<DateTime?>(), It.IsAny<DateTime?>()), Times.Once);
}
[Test]
public void GetAllMastersByEmploymentDate_IncorrectDates_ThrowException_Test()
{
// Arrange
var date = DateTime.UtcNow;
// Act & Assert
Assert.That(() => _masterBusinessLogicContract.GetAllMastersByEmploymentDate(date, date, It.IsAny<bool>()), Throws.TypeOf<IncorrectDatesException>());
Assert.That(() => _masterBusinessLogicContract.GetAllMastersByEmploymentDate(date, date.AddSeconds(-1), It.IsAny<bool>()), Throws.TypeOf<IncorrectDatesException>());
_masterStorageContract.Verify(x => x.GetList(It.IsAny<bool>(), It.IsAny<string?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>()), Times.Never);
}
[Test]
public void GetAllMastersByEmploymentDate_ReturnNull_ThrowException_Test()
{
// Act & Assert
Assert.That(() => _masterBusinessLogicContract.GetAllMastersByEmploymentDate(DateTime.UtcNow, DateTime.UtcNow.AddDays(1), It.IsAny<bool>()), Throws.TypeOf<NullListException>());
_masterStorageContract.Verify(x => x.GetList(It.IsAny<bool>(), It.IsAny<string?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>()), Times.Once);
}
[Test]
public void GetAllMastersByEmploymentDate_StorageThrowError_ThrowException_Test()
{
// Arrange
_masterStorageContract.Setup(x => x.GetList(It.IsAny<bool>(), It.IsAny<string?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>())).Throws(new StorageException(new InvalidOperationException()));
// Act & Assert
Assert.That(() => _masterBusinessLogicContract.GetAllMastersByEmploymentDate(DateTime.UtcNow, DateTime.UtcNow.AddDays(1), It.IsAny<bool>()), Throws.TypeOf<StorageException>());
_masterStorageContract.Verify(x => x.GetList(It.IsAny<bool>(), It.IsAny<string?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>()), Times.Once);
}
[Test]
public void GetMasterByData_GetById_ReturnRecord_Test()
{
// Arrange
var id = Guid.NewGuid().ToString();
var record = new MasterDataModel(id, "fio", Guid.NewGuid().ToString(), DateTime.Now.AddYears(-16).AddDays(-1), DateTime.Now, false);
_masterStorageContract.Setup(x => x.GetElementById(id)).Returns(record);
// Act
var element = _masterBusinessLogicContract.GetMasterByData(id);
// Assert
Assert.That(element, Is.Not.Null);
Assert.That(element.Id, Is.EqualTo(id));
_masterStorageContract.Verify(x => x.GetElementById(It.IsAny<string>()), Times.Once);
}
[Test]
public void GetMasterByData_GetByFio_ReturnRecord_Test()
{
// Arrange
var fio = "fio";
var record = new MasterDataModel(Guid.NewGuid().ToString(), fio, Guid.NewGuid().ToString(), DateTime.Now.AddYears(-16).AddDays(-1), DateTime.Now, false);
_masterStorageContract.Setup(x => x.GetElementByFIO(fio)).Returns(record);
// Act
var element = _masterBusinessLogicContract.GetMasterByData(fio);
// Assert
Assert.That(element, Is.Not.Null);
Assert.That(element.FIO, Is.EqualTo(fio));
_masterStorageContract.Verify(x => x.GetElementByFIO(It.IsAny<string>()), Times.Once);
}
[Test]
public void GetMasterByData_EmptyData_ThrowException_Test()
{
// Act & Assert
Assert.That(() => _masterBusinessLogicContract.GetMasterByData(null), Throws.TypeOf<ArgumentNullException>());
Assert.That(() => _masterBusinessLogicContract.GetMasterByData(string.Empty), Throws.TypeOf<ArgumentNullException>());
_masterStorageContract.Verify(x => x.GetElementById(It.IsAny<string>()), Times.Never);
_masterStorageContract.Verify(x => x.GetElementByFIO(It.IsAny<string>()), Times.Never);
}
[Test]
public void GetMasterByData_GetById_NotFoundRecord_ThrowException_Test()
{
// Act & Assert
Assert.That(() => _masterBusinessLogicContract.GetMasterByData(Guid.NewGuid().ToString()), Throws.TypeOf<ElementNotFoundException>());
_masterStorageContract.Verify(x => x.GetElementById(It.IsAny<string>()), Times.Once);
_masterStorageContract.Verify(x => x.GetElementByFIO(It.IsAny<string>()), Times.Never);
}
[Test]
public void GetMasterByData_GetByFio_NotFoundRecord_ThrowException_Test()
{
// Act & Assert
Assert.That(() => _masterBusinessLogicContract.GetMasterByData("fio"), Throws.TypeOf<ElementNotFoundException>());
_masterStorageContract.Verify(x => x.GetElementById(It.IsAny<string>()), Times.Never);
_masterStorageContract.Verify(x => x.GetElementByFIO(It.IsAny<string>()), Times.Once);
}
[Test]
public void GetMasterByData_StorageThrowError_ThrowException_Test()
{
// Arrange
_masterStorageContract.Setup(x => x.GetElementById(It.IsAny<string>())).Throws(new StorageException(new InvalidOperationException()));
_masterStorageContract.Setup(x => x.GetElementByFIO(It.IsAny<string>())).Throws(new StorageException(new InvalidOperationException()));
// Act & Assert
Assert.That(() => _masterBusinessLogicContract.GetMasterByData(Guid.NewGuid().ToString()), Throws.TypeOf<StorageException>());
Assert.That(() => _masterBusinessLogicContract.GetMasterByData("fio"), Throws.TypeOf<StorageException>());
_masterStorageContract.Verify(x => x.GetElementById(It.IsAny<string>()), Times.Once);
_masterStorageContract.Verify(x => x.GetElementByFIO(It.IsAny<string>()), Times.Once);
}
[Test]
public void InsertMaster_CorrectRecord_Test()
{
// Arrange
var flag = false;
var record = new MasterDataModel(Guid.NewGuid().ToString(), "Иван Иванов Иванович", Guid.NewGuid().ToString(), DateTime.Now.AddYears(-16).AddDays(-1), DateTime.Now, false);
_masterStorageContract.Setup(x => x.AddElement(It.IsAny<MasterDataModel>()))
.Callback((MasterDataModel x) =>
{
flag = x.Id == record.Id && x.FIO == record.FIO && x.PostId == record.PostId && x.BirthDate == record.BirthDate &&
x.EmploymentDate == record.EmploymentDate && x.IsDeleted == record.IsDeleted;
});
// Act
_masterBusinessLogicContract.InsertMaster(record);
// Assert
_masterStorageContract.Verify(x => x.AddElement(It.IsAny<MasterDataModel>()), Times.Once);
Assert.That(flag);
}
[Test]
public void InsertMaster_RecordWithExistsData_ThrowException_Test()
{
// Arrange
_masterStorageContract.Setup(x => x.AddElement(It.IsAny<MasterDataModel>())).Throws(new ElementExistsException("Data", "Data"));
// Act & Assert
Assert.That(() => _masterBusinessLogicContract.InsertMaster(new(Guid.NewGuid().ToString(), "Иван Иван Иван", Guid.NewGuid().ToString(), DateTime.Now.AddYears(-16).AddDays(-1), DateTime.Now, false)), Throws.TypeOf<ElementExistsException>());
_masterStorageContract.Verify(x => x.AddElement(It.IsAny<MasterDataModel>()), Times.Once);
}
[Test]
public void InsertMaster_NullRecord_ThrowException_Test()
{
// Act & Assert
Assert.That(() => _masterBusinessLogicContract.InsertMaster(null), Throws.TypeOf<ArgumentNullException>());
_masterStorageContract.Verify(x => x.AddElement(It.IsAny<MasterDataModel>()), Times.Never);
}
[Test]
public void InsertMaster_InvalidRecord_ThrowException_Test()
{
// Act & Assert
Assert.That(() => _masterBusinessLogicContract.InsertMaster(new MasterDataModel("id", "fio", Guid.NewGuid().ToString(), DateTime.Now.AddYears(16).AddDays(-1), DateTime.Now, false)), Throws.TypeOf<ValidationException>());
_masterStorageContract.Verify(x => x.AddElement(It.IsAny<MasterDataModel>()), Times.Never);
}
[Test]
public void InsertMaster_StorageThrowError_ThrowException_Test()
{
// Arrange
_masterStorageContract.Setup(x => x.AddElement(It.IsAny<MasterDataModel>())).Throws(new StorageException(new InvalidOperationException()));
// Act & Assert
Assert.That(() => _masterBusinessLogicContract.InsertMaster(new(Guid.NewGuid().ToString(), "Иван Иван Ивна", Guid.NewGuid().ToString(), DateTime.Now.AddYears(-16).AddDays(-1), DateTime.Now, false)), Throws.TypeOf<StorageException>());
_masterStorageContract.Verify(x => x.AddElement(It.IsAny<MasterDataModel>()), Times.Once);
}
[Test]
public void UpdateMaster_CorrectRecord_Test()
{
// Arrange
var flag = false;
var record = new MasterDataModel(Guid.NewGuid().ToString(), "Иван Иван Иван", Guid.NewGuid().ToString(), DateTime.Now.AddYears(-16).AddDays(-1), DateTime.Now, false);
_masterStorageContract.Setup(x => x.UpdElement(It.IsAny<MasterDataModel>()))
.Callback((MasterDataModel x) =>
{
flag = x.Id == record.Id && x.FIO == record.FIO && x.PostId == record.PostId && x.BirthDate == record.BirthDate &&
x.EmploymentDate == record.EmploymentDate && x.IsDeleted == record.IsDeleted;
});
// Act
_masterBusinessLogicContract.UpdateMaster(record);
// Assert
_masterStorageContract.Verify(x => x.UpdElement(It.IsAny<MasterDataModel>()), Times.Once);
Assert.That(flag);
}
[Test]
public void UpdateMaster_RecordWithIncorrectData_ThrowException_Test()
{
// Arrange
_masterStorageContract.Setup(x => x.UpdElement(It.IsAny<MasterDataModel>())).Throws(new ElementNotFoundException(""));
// Act & Assert
Assert.That(() => _masterBusinessLogicContract.UpdateMaster(new(Guid.NewGuid().ToString(), "Иван Иван Иван", Guid.NewGuid().ToString(), DateTime.Now.AddYears(-16).AddDays(-1), DateTime.Now, false)), Throws.TypeOf<ElementNotFoundException>());
_masterStorageContract.Verify(x => x.UpdElement(It.IsAny<MasterDataModel>()), Times.Once);
}
[Test]
public void UpdateMaster_NullRecord_ThrowException_Test()
{
// Act & Assert
Assert.That(() => _masterBusinessLogicContract.UpdateMaster(null), Throws.TypeOf<ArgumentNullException>());
_masterStorageContract.Verify(x => x.UpdElement(It.IsAny<MasterDataModel>()), Times.Never);
}
[Test]
public void UpdateMaster_InvalidRecord_ThrowException_Test()
{
// Act & Assert
Assert.That(() => _masterBusinessLogicContract.UpdateMaster(new MasterDataModel("id", "fio", Guid.NewGuid().ToString(), DateTime.Now.AddYears(16).AddDays(-1), DateTime.Now, false)), Throws.TypeOf<ValidationException>());
_masterStorageContract.Verify(x => x.UpdElement(It.IsAny<MasterDataModel>()), Times.Never);
}
[Test]
public void UpdateMaster_StorageThrowError_ThrowException_Test()
{
// Arrange
_masterStorageContract.Setup(x => x.UpdElement(It.IsAny<MasterDataModel>())).Throws(new StorageException(new InvalidOperationException()));
// Act & Assert
Assert.That(() => _masterBusinessLogicContract.UpdateMaster(new(Guid.NewGuid().ToString(), "Иван Иван Иван", Guid.NewGuid().ToString(), DateTime.Now.AddYears(-16).AddDays(-1), DateTime.Now, false)), Throws.TypeOf<StorageException>());
_masterStorageContract.Verify(x => x.UpdElement(It.IsAny<MasterDataModel>()), Times.Once);
}
[Test]
public void DeleteMaster_CorrectRecord_Test()
{
// Arrange
var id = Guid.NewGuid().ToString();
var flag = false;
_masterStorageContract.Setup(x => x.DelElement(It.Is((string x) => x == id))).Callback(() => { flag = true; });
// Act
_masterBusinessLogicContract.DeleteMaster(id);
// Assert
_masterStorageContract.Verify(x => x.DelElement(It.IsAny<string>()), Times.Once);
Assert.That(flag);
}
[Test]
public void DeleteMaster_RecordWithIncorrectId_ThrowException_Test()
{
// Arrange
var id = Guid.NewGuid().ToString();
_masterStorageContract.Setup(x => x.DelElement(It.Is((string x) => x != id))).Throws(new ElementNotFoundException(id));
// Act & Assert
Assert.That(() => _masterBusinessLogicContract.DeleteMaster(Guid.NewGuid().ToString()), Throws.TypeOf<ElementNotFoundException>());
_masterStorageContract.Verify(x => x.DelElement(It.IsAny<string>()), Times.Once);
}
[Test]
public void DeleteMaster_IdIsNullOrEmpty_ThrowException_Test()
{
// Act & Assert
Assert.That(() => _masterBusinessLogicContract.DeleteMaster(null), Throws.TypeOf<ArgumentNullException>());
Assert.That(() => _masterBusinessLogicContract.DeleteMaster(string.Empty), Throws.TypeOf<ArgumentNullException>());
_masterStorageContract.Verify(x => x.DelElement(It.IsAny<string>()), Times.Never);
}
[Test]
public void DeleteMaster_IdIsNotGuid_ThrowException_Test()
{
// Act & Assert
Assert.That(() => _masterBusinessLogicContract.DeleteMaster("id"), Throws.TypeOf<ValidationException>());
_masterStorageContract.Verify(x => x.DelElement(It.IsAny<string>()), Times.Never);
}
[Test]
public void DeleteMaster_StorageThrowError_ThrowException_Test()
{
// Arrange
_masterStorageContract.Setup(x => x.DelElement(It.IsAny<string>())).Throws(new StorageException(new InvalidOperationException()));
// Act & Assert
Assert.That(() => _masterBusinessLogicContract.DeleteMaster(Guid.NewGuid().ToString()), Throws.TypeOf<StorageException>());
_masterStorageContract.Verify(x => x.DelElement(It.IsAny<string>()), Times.Once);
}
}

View File

@@ -0,0 +1,258 @@
using System;
using System.Collections.Generic;
using Microsoft.Extensions.Logging;
using Moq;
using NUnit.Framework;
using TwoFromTheCasketBuisnessLogic.Implementations;
using TwoFromTheCasketContratcs.BuisnessLogicsContracts;
using TwoFromTheCasketContratcs.DataModels;
using TwoFromTheCasketContratcs.Enums;
using TwoFromTheCasketContratcs.Exceptions;
using TwoFromTheCasketContratcs.StorageContracts;
namespace TwoFromTheCasketTest.BuisnessLogicContractTests;
[TestFixture]
internal class OrderBusinessLogicContractTests
{
private OrderBusinessLogicContract _orderBusinessLogicContract;
private Mock<IOrderStorageContract> _orderStorageContract;
[OneTimeSetUp]
public void OneTimeSetUp()
{
_orderStorageContract = new Mock<IOrderStorageContract>();
_orderBusinessLogicContract = new OrderBusinessLogicContract(_orderStorageContract.Object, new Mock<ILogger>().Object);
}
[SetUp]
public void SetUp()
{
_orderStorageContract.Reset();
}
[Test]
public void GetAllOrder_ReturnListOfRecords_Test()
{
// Arrange
var listOriginal = new List<OrderDataModel>()
{
new(Guid.NewGuid().ToString(), DateTime.UtcNow, StatusType.InProcess, RoomType.Industrial),
new(Guid.NewGuid().ToString(), DateTime.UtcNow, StatusType.InProcess, RoomType.Social),
};
_orderStorageContract.Setup(x => x.GetList()).Returns(listOriginal);
// Act
var list = _orderBusinessLogicContract.GetAllOrder();
// Assert
Assert.Multiple(() =>
{
Assert.That(list, Is.Not.Null);
Assert.That(list, Is.EquivalentTo(listOriginal));
});
_orderStorageContract.Verify(x => x.GetList(), Times.Once);
}
[Test]
public void GetAllOrder_ReturnEmptyList_Test()
{
// Arrange
_orderStorageContract.Setup(x => x.GetList()).Returns([]);
// Act
var list = _orderBusinessLogicContract.GetAllOrder();
// Assert
Assert.Multiple(() =>
{
Assert.That(list, Is.Not.Null);
Assert.That(list, Has.Count.EqualTo(0));
});
}
[Test]
public void GetAllOrder_ReturnNull_ThrowException_Test()
{
// Arrange
_orderStorageContract.Setup(x => x.GetList()).Returns((List<OrderDataModel>)null!);
// Act & Assert
Assert.That(() => _orderBusinessLogicContract.GetAllOrder(), Throws.TypeOf<NullListException>());
_orderStorageContract.Verify(x => x.GetList(), Times.Once);
}
[Test]
public void GetAllOrder_StorageThrowError_ThrowException_Test()
{
// Arrange
_orderStorageContract.Setup(x => x.GetList()).Throws(new StorageException(new InvalidOperationException()));
// Act & Assert
Assert.That(() => _orderBusinessLogicContract.GetAllOrder(), Throws.TypeOf<StorageException>());
_orderStorageContract.Verify(x => x.GetList(), Times.Once);
}
[Test]
public void GetAllOrderByDate_ReturnListOfRecords_Test()
{
// Arrange
var fromDate = DateTime.UtcNow.AddDays(-7);
var listOriginal = new List<OrderDataModel>()
{
new(Guid.NewGuid().ToString(), DateTime.UtcNow.AddDays(-5), StatusType.NotStarted, RoomType.Social),
new(Guid.NewGuid().ToString(), DateTime.UtcNow.AddDays(-3), StatusType.Ready, RoomType.Industrial),
};
_orderStorageContract.Setup(x => x.GetElementByDate(fromDate)).Returns(listOriginal[0]);
// Act
var list = _orderBusinessLogicContract.GetOrderByDate(fromDate);
// Assert
Assert.That(list, Is.Not.Null);
_orderStorageContract.Verify(x => x.GetElementByDate(fromDate), Times.Once);
}
[Test]
public void GetOrderByDate_ThrowsNullListException_WhenNoData_Test()
{
// Arrange
var fromDate = DateTime.UtcNow.AddDays(-7);
_orderStorageContract.Setup(x => x.GetElementByDate(It.IsAny<DateTime>()))
.Returns((OrderDataModel)null);
// Act & Assert
Assert.That(() => _orderBusinessLogicContract.GetOrderByDate(fromDate),
Throws.TypeOf<NullListException>());
_orderStorageContract.Verify(x => x.GetElementByDate(It.IsAny<DateTime>()), Times.Once);
}
[Test]
public void GetOrderByData_ReturnRecord_Test()
{
// Arrange
var orderId = Guid.NewGuid().ToString();
var record = new OrderDataModel(orderId, DateTime.UtcNow, StatusType.NotStarted, RoomType.Social);
_orderStorageContract.Setup(x => x.GetElementById(orderId)).Returns(record);
// Act
var result = _orderBusinessLogicContract.GetOrderByData(orderId);
// Assert
Assert.That(result, Is.Not.Null);
Assert.That(result.Id, Is.EqualTo(orderId));
_orderStorageContract.Verify(x => x.GetElementById(orderId), Times.Once);
}
[Test]
public void GetOrderByData_ReturnNull_ThrowException_Test()
{
// Arrange
_orderStorageContract.Setup(x => x.GetElementById(null));
// Act & Assert
Assert.That(() => _orderBusinessLogicContract.GetOrderByData(Guid.NewGuid().ToString()), Throws.TypeOf<ElementNotFoundException>());
_orderStorageContract.Verify(x => x.GetElementById(It.IsAny<string>()), Times.Once);
}
[Test]
public void InsertOrder_CorrectRecord_Test()
{
// Arrange
var record = new OrderDataModel(Guid.NewGuid().ToString(), DateTime.UtcNow, StatusType.Ready, RoomType.Residential);
_orderStorageContract.Setup(x => x.AddElement(It.IsAny<OrderDataModel>()));
// Act
_orderBusinessLogicContract.InsertOrder(record);
// Assert
_orderStorageContract.Verify(x => x.AddElement(It.IsAny<OrderDataModel>()), Times.Once);
}
[Test]
public void InsertOrder_NullRecord_ThrowException_Test()
{
// Act & Assert
Assert.That(() => _orderBusinessLogicContract.InsertOrder(null), Throws.TypeOf<ArgumentNullException>());
_orderStorageContract.Verify(x => x.AddElement(It.IsAny<OrderDataModel>()), Times.Never);
}
[Test]
public void InsertOrder_InvalidRecord_ThrowException_Test()
{
// Arrange
var invalidRecord = new OrderDataModel("invalid-id", default, StatusType.None, RoomType.None);
// Act & Assert
Assert.That(() => _orderBusinessLogicContract.InsertOrder(invalidRecord), Throws.TypeOf<ValidationException>());
_orderStorageContract.Verify(x => x.AddElement(It.IsAny<OrderDataModel>()), Times.Never);
}
[Test]
public void UpdateOrder_CorrectRecord_Test()
{
// Arrange
var record = new OrderDataModel(Guid.NewGuid().ToString(), DateTime.UtcNow, StatusType.InProcess, RoomType.Industrial);
_orderStorageContract.Setup(x => x.UpdElement(It.IsAny<OrderDataModel>()));
// Act
_orderBusinessLogicContract.UpdateOrder(record);
// Assert
_orderStorageContract.Verify(x => x.UpdElement(It.IsAny<OrderDataModel>()), Times.Once);
}
[Test]
public void UpdateOrder_NullRecord_ThrowException_Test()
{
// Act & Assert
Assert.That(() => _orderBusinessLogicContract.UpdateOrder(null), Throws.TypeOf<ArgumentNullException>());
_orderStorageContract.Verify(x => x.UpdElement(It.IsAny<OrderDataModel>()), Times.Never);
}
[Test]
public void UpdateOrder_InvalidRecord_ThrowException_Test()
{
// Arrange
var invalidRecord = new OrderDataModel("invalid-id", default, StatusType.None, RoomType.None);
// Act & Assert
Assert.That(() => _orderBusinessLogicContract.UpdateOrder(invalidRecord), Throws.TypeOf<ValidationException>());
_orderStorageContract.Verify(x => x.UpdElement(It.IsAny<OrderDataModel>()), Times.Never);
}
[Test]
public void DeleteOrder_CorrectRecord_Test()
{
// Arrange
var orderId = Guid.NewGuid().ToString();
_orderStorageContract.Setup(x => x.DelElement(It.IsAny<string>()));
// Act
_orderBusinessLogicContract.DeleteOrder(orderId);
// Assert
_orderStorageContract.Verify(x => x.DelElement(orderId), Times.Once);
}
[Test]
public void DeleteOrder_IdIsNullOrEmpty_ThrowException_Test()
{
// Act & Assert
Assert.That(() => _orderBusinessLogicContract.DeleteOrder(null), Throws.TypeOf<ArgumentNullException>());
Assert.That(() => _orderBusinessLogicContract.DeleteOrder(string.Empty), Throws.TypeOf<ArgumentNullException>());
_orderStorageContract.Verify(x => x.DelElement(It.IsAny<string>()), Times.Never);
}
[Test]
public void DeleteOrder_IdIsNotGuid_ThrowException_Test()
{
// Act & Assert
Assert.That(() => _orderBusinessLogicContract.DeleteOrder("invalid-id"), Throws.TypeOf<ValidationException>());
_orderStorageContract.Verify(x => x.DelElement(It.IsAny<string>()), Times.Never);
}
}

View File

@@ -0,0 +1,482 @@
using System;
using System.Collections.Generic;
using Microsoft.Extensions.Logging;
using Moq;
using NUnit.Framework;
using TwoFromTheCasketBuisnessLogic.Implementations;
using TwoFromTheCasketContratcs.BuisnessLogicsContracts;
using TwoFromTheCasketContratcs.DataModels;
using TwoFromTheCasketContratcs.Enums;
using TwoFromTheCasketContratcs.Exceptions;
using TwoFromTheCasketContratcs.StorageContracts;
namespace TwoFromTheCasketTest.BuisnessLogicContractTests;
[TestFixture]
internal class PostBusinessLogicContractTests
{
private PostBusinessLogicContract _postBusinessLogicContract;
private Mock<IPostStorageContract> _postStorageContract;
[OneTimeSetUp]
public void OneTimeSetUp()
{
_postStorageContract = new Mock<IPostStorageContract>();
_postBusinessLogicContract = new PostBusinessLogicContract(_postStorageContract.Object, new Mock<ILogger>().Object);
}
[SetUp]
public void SetUp()
{
_postStorageContract.Reset();
}
[Test]
public void GetAllPosts_ReturnListOfRecords_Test()
{
// Arrange
var listOriginal = new List<PostDataModel>()
{
new(Guid.NewGuid().ToString(), "name 1", PostType.Carpenter, 10, true, default),
new(Guid.NewGuid().ToString(), "name 2", PostType.Carpenter, 10, true, default),
new(Guid.NewGuid().ToString(), "name 3", PostType.Carpenter, 10, true, default),
};
_postStorageContract.Setup(x => x.GetList(It.IsAny<bool>())).Returns(listOriginal);
// Act
var list = _postBusinessLogicContract.GetAllPosts();
// Assert
Assert.Multiple(() =>
{
Assert.That(list, Is.Not.Null);
Assert.That(list, Is.EquivalentTo(listOriginal));
});
_postStorageContract.Verify(x => x.GetList(It.IsAny<bool>()), Times.Once);
}
[Test]
public void GetAllPosts_ReturnEmptyList_Test()
{
// Arrange
_postStorageContract.Setup(x => x.GetList(It.IsAny<bool>())).Returns([]);
// Act
var list = _postBusinessLogicContract.GetAllPosts();
// Assert
Assert.Multiple(() =>
{
Assert.That(list, Is.Not.Null);
Assert.That(list, Has.Count.EqualTo(0));
});
}
[Test]
public void GetAllPosts_ReturnNull_ThrowException_Test()
{
// Act & Assert
Assert.That(() => _postBusinessLogicContract.GetAllPosts(), Throws.TypeOf<NullListException>());
_postStorageContract.Verify(x => x.GetList(It.IsAny<bool>()), Times.Once);
_postStorageContract.Verify(x => x.GetList(It.IsAny<bool>()), Times.Once);
}
[Test]
public void GetAllPosts_StorageThrowError_ThrowException_Test()
{
// Arrange
_postStorageContract.Setup(x => x.GetList(It.IsAny<bool>())).Throws(new StorageException(new InvalidOperationException()));
// Act & Assert
Assert.That(() => _postBusinessLogicContract.GetAllPosts(), Throws.TypeOf<StorageException>());
_postStorageContract.Verify(x => x.GetList(It.IsAny<bool>()), Times.Once);
_postStorageContract.Verify(x => x.GetList(It.IsAny<bool>()), Times.Once);
}
[Test]
public void GetAllDataOfPost_ReturnListOfRecords_Test()
{
// Arrange
var postId = Guid.NewGuid().ToString();
var listOriginal = new List<PostDataModel>()
{
new(postId, "name 1", PostType.Painter, 10, true,default),
new(postId, "name 2", PostType.Painter, 10, true, default)
};
_postStorageContract.Setup(x => x.GetPostWithHistory(It.IsAny<string>())).Returns(listOriginal);
// Act
var list = _postBusinessLogicContract.GetAllDataOfPost(postId);
// Assert
Assert.That(list, Is.Not.Null);
Assert.That(list, Has.Count.EqualTo(2));
_postStorageContract.Verify(x => x.GetPostWithHistory(postId), Times.Once);
}
[Test]
public void GetAllDataOfPost_ReturnEmptyList_Test()
{
// Arrange
_postStorageContract.Setup(x => x.GetPostWithHistory(It.IsAny<string>())).Returns([]);
// Act
var list = _postBusinessLogicContract.GetAllDataOfPost(Guid.NewGuid().ToString());
// Assert
Assert.That(list, Is.Not.Null);
Assert.That(list, Has.Count.EqualTo(0));
_postStorageContract.Verify(x => x.GetPostWithHistory(It.IsAny<string>()), Times.Once);
}
[Test]
public void GetAllDataOfPost_PostIdIsNullOrEmpty_ThrowException_Test()
{
// Act & Assert
Assert.That(() => _postBusinessLogicContract.GetAllDataOfPost(null), Throws.TypeOf<ArgumentNullException>());
Assert.That(() => _postBusinessLogicContract.GetAllDataOfPost(string.Empty), Throws.TypeOf<ArgumentNullException>());
_postStorageContract.Verify(x => x.GetPostWithHistory(It.IsAny<string>()), Times.Never);
}
[Test]
public void GetAllDataOfPost_PostIdIsNotGuid_ThrowException_Test()
{
// Act & Assert
Assert.That(() => _postBusinessLogicContract.GetAllDataOfPost("id"), Throws.TypeOf<ValidationException>());
_postStorageContract.Verify(x => x.GetPostWithHistory(It.IsAny<string>()), Times.Never);
}
[Test]
public void GetAllDataOfPost_ReturnNull_ThrowException_Test()
{
// Act & Assert
Assert.That(() => _postBusinessLogicContract.GetAllDataOfPost(Guid.NewGuid().ToString()), Throws.TypeOf<NullListException>());
_postStorageContract.Verify(x => x.GetPostWithHistory(It.IsAny<string>()), Times.Once);
}
[Test]
public void GetAllDataOfPost_StorageThrowError_ThrowException_Test()
{
// Arrange
_postStorageContract.Setup(x => x.GetPostWithHistory(It.IsAny<string>())).Throws(new StorageException(new InvalidOperationException()));
// Act & Assert
Assert.That(() => _postBusinessLogicContract.GetAllDataOfPost(Guid.NewGuid().ToString()), Throws.TypeOf<StorageException>());
_postStorageContract.Verify(x => x.GetPostWithHistory(It.IsAny<string>()), Times.Once);
}
[Test]
public void GetPostByData_GetById_ReturnRecord_Test()
{
// Arrange
var id = Guid.NewGuid().ToString();
var record = new PostDataModel(id, "name", PostType.Painter, 10, true, default);
_postStorageContract.Setup(x => x.GetElementById(id)).Returns(record);
// Act
var element = _postBusinessLogicContract.GetPostByData(id);
// Assert
Assert.That(element, Is.Not.Null);
Assert.That(element.Id, Is.EqualTo(id));
_postStorageContract.Verify(x => x.GetElementById(It.IsAny<string>()), Times.Once);
}
[Test]
public void GetPostByData_GetByName_ReturnRecord_Test()
{
// Arrange
var postName = "name";
var record = new PostDataModel(Guid.NewGuid().ToString(), postName, PostType.Plasterer, 10, true, default);
_postStorageContract.Setup(x => x.GetElementByName(postName)).Returns(record);
// Act
var element = _postBusinessLogicContract.GetPostByData(postName);
// Assert
Assert.That(element, Is.Not.Null);
Assert.That(element.PostName, Is.EqualTo(postName));
_postStorageContract.Verify(x => x.GetElementByName(It.IsAny<string>()), Times.Once);
}
[Test]
public void GetPostByData_EmptyData_ThrowException_Test()
{
// Act & Assert
Assert.That(() => _postBusinessLogicContract.GetPostByData(null), Throws.TypeOf<ArgumentNullException>());
Assert.That(() => _postBusinessLogicContract.GetPostByData(string.Empty), Throws.TypeOf<ArgumentNullException>());
_postStorageContract.Verify(x => x.GetElementById(It.IsAny<string>()), Times.Never);
_postStorageContract.Verify(x => x.GetElementByName(It.IsAny<string>()), Times.Never);
}
[Test]
public void GetPostByData_GetById_NotFoundRecord_ThrowException_Test()
{
// Act & Assert
Assert.That(() => _postBusinessLogicContract.GetPostByData(Guid.NewGuid().ToString()), Throws.TypeOf<ElementNotFoundException>());
_postStorageContract.Verify(x => x.GetElementById(It.IsAny<string>()), Times.Once);
_postStorageContract.Verify(x => x.GetElementByName(It.IsAny<string>()), Times.Never);
}
[Test]
public void GetPostByData_GetByName_NotFoundRecord_ThrowException_Test()
{
// Act & Assert
Assert.That(() => _postBusinessLogicContract.GetPostByData("name"), Throws.TypeOf<ElementNotFoundException>());
_postStorageContract.Verify(x => x.GetElementById(It.IsAny<string>()), Times.Never);
_postStorageContract.Verify(x => x.GetElementByName(It.IsAny<string>()), Times.Once);
}
[Test]
public void GetPostByData_StorageThrowError_ThrowException_Test()
{
// Arrange
_postStorageContract.Setup(x => x.GetElementById(It.IsAny<string>())).Throws(new StorageException(new InvalidOperationException()));
_postStorageContract.Setup(x => x.GetElementByName(It.IsAny<string>())).Throws(new StorageException(new InvalidOperationException()));
// Act & Assert
Assert.That(() => _postBusinessLogicContract.GetPostByData(Guid.NewGuid().ToString()), Throws.TypeOf<StorageException>());
Assert.That(() => _postBusinessLogicContract.GetPostByData("name"), Throws.TypeOf<StorageException>());
_postStorageContract.Verify(x => x.GetElementById(It.IsAny<string>()), Times.Once);
_postStorageContract.Verify(x => x.GetElementByName(It.IsAny<string>()), Times.Once);
}
[Test]
public void InsertPost_CorrectRecord_Test()
{
// Arrange
var flag = false;
var record = new PostDataModel(Guid.NewGuid().ToString(), "name 1", PostType.Plasterer, 10, true, default);
_postStorageContract.Setup(x => x.AddElement(It.IsAny<PostDataModel>()))
.Callback((PostDataModel x) =>
{
flag = x.Id == record.Id && x.PostName == record.PostName && x.PostType == record.PostType && x.Salary == record.Salary;
});
// Act
_postBusinessLogicContract.InsertPost(record);
// Assert
_postStorageContract.Verify(x => x.AddElement(It.IsAny<PostDataModel>()), Times.Once);
Assert.That(flag);
}
[Test]
public void InsertPost_RecordWithExistsData_ThrowException_Test()
{
// Arrange
_postStorageContract.Setup(x => x.AddElement(It.IsAny<PostDataModel>())).Throws(new ElementExistsException("Data", "Data"));
// Act & Assert
Assert.That(() => _postBusinessLogicContract.InsertPost(new(Guid.NewGuid().ToString(), "postName", PostType.Plasterer, 10, true, default)), Throws.TypeOf<ElementExistsException>());
_postStorageContract.Verify(x => x.AddElement(It.IsAny<PostDataModel>()), Times.Once);
}
[Test]
public void InsertPost_NullRecord_ThrowException_Test()
{
// Act & Assert
Assert.That(() => _postBusinessLogicContract.InsertPost(null), Throws.TypeOf<ArgumentNullException>());
_postStorageContract.Verify(x => x.AddElement(It.IsAny<PostDataModel>()), Times.Never);
}
[Test]
public void InsertPost_InvalidRecord_ThrowException_Test()
{
// Act & Assert
Assert.That(() => _postBusinessLogicContract.InsertPost(new PostDataModel("id", "postName", PostType.Plasterer, 10, true, default)), Throws.TypeOf<ValidationException>());
_postStorageContract.Verify(x => x.AddElement(It.IsAny<PostDataModel>()), Times.Never);
}
[Test]
public void InsertPost_StorageThrowError_ThrowException_Test()
{
// Arrange
_postStorageContract.Setup(x => x.AddElement(It.IsAny<PostDataModel>())).Throws(new StorageException(new InvalidOperationException()));
// Act & Assert
Assert.That(() => _postBusinessLogicContract.InsertPost(new(Guid.NewGuid().ToString(), "postName", PostType.Plasterer, 10, true, default)), Throws.TypeOf<StorageException>());
_postStorageContract.Verify(x => x.AddElement(It.IsAny<PostDataModel>()), Times.Once);
}
[Test]
public void UpdatePost_CorrectRecord_Test()
{
// Arrange
var flag = false;
var record = new PostDataModel(Guid.NewGuid().ToString(), "postName", PostType.Plasterer, 10, true, default);
_postStorageContract.Setup(x => x.UpdElement(It.IsAny<PostDataModel>()))
.Callback((PostDataModel x) =>
{
flag = x.Id == record.Id && x.PostName == record.PostName && x.PostType == record.PostType && x.Salary == record.Salary;
});
// Act
_postBusinessLogicContract.UpdatePost(record);
// Assert
_postStorageContract.Verify(x => x.UpdElement(It.IsAny<PostDataModel>()), Times.Once);
Assert.That(flag);
}
[Test]
public void UpdatePost_RecordWithIncorrectData_ThrowException_Test()
{
// Arrange
_postStorageContract.Setup(x => x.UpdElement(It.IsAny<PostDataModel>())).Throws(new ElementNotFoundException(""));
// Act & Assert
Assert.That(() => _postBusinessLogicContract.UpdatePost(new(Guid.NewGuid().ToString(), "postName", PostType.Plasterer, 10, true, default)), Throws.TypeOf<ElementNotFoundException>());
_postStorageContract.Verify(x => x.UpdElement(It.IsAny<PostDataModel>()), Times.Once);
}
[Test]
public void UpdatePost_RecordWithExistsData_ThrowException_Test()
{
// Arrange
_postStorageContract.Setup(x => x.UpdElement(It.IsAny<PostDataModel>())).Throws(new ElementExistsException("Data", "Data"));
// Act & Assert
Assert.That(() => _postBusinessLogicContract.UpdatePost(new(Guid.NewGuid().ToString(), "postName", PostType.Plasterer, 10, true, default)), Throws.TypeOf<ElementExistsException>());
_postStorageContract.Verify(x => x.UpdElement(It.IsAny<PostDataModel>()), Times.Once);
}
[Test]
public void UpdatePost_NullRecord_ThrowException_Test()
{
// Act & Assert
Assert.That(() => _postBusinessLogicContract.UpdatePost(null), Throws.TypeOf<ArgumentNullException>());
_postStorageContract.Verify(x => x.UpdElement(It.IsAny<PostDataModel>()), Times.Never);
}
[Test]
public void UpdatePost_InvalidRecord_ThrowException_Test()
{
// Act & Assert
Assert.That(() => _postBusinessLogicContract.UpdatePost(new PostDataModel("id", "postName", PostType.Plasterer, 10, true, default)), Throws.TypeOf<ValidationException>());
_postStorageContract.Verify(x => x.UpdElement(It.IsAny<PostDataModel>()), Times.Never);
}
[Test]
public void UpdatePost_StorageThrowError_ThrowException_Test()
{
// Arrange
_postStorageContract.Setup(x => x.UpdElement(It.IsAny<PostDataModel>())).Throws(new StorageException(new InvalidOperationException()));
// Act & Assert
Assert.That(() => _postBusinessLogicContract.UpdatePost(new(Guid.NewGuid().ToString(), "postName", PostType.Plasterer, 10, true, default)), Throws.TypeOf<StorageException>());
_postStorageContract.Verify(x => x.UpdElement(It.IsAny<PostDataModel>()), Times.Once);
}
[Test]
public void DeletePost_CorrectRecord_Test()
{
// Arrange
var id = Guid.NewGuid().ToString();
var flag = false;
_postStorageContract.Setup(x => x.DelElement(It.Is((string x) => x == id))).Callback(() => { flag = true; });
// Act
_postBusinessLogicContract.DeletePost(id);
// Assert
_postStorageContract.Verify(x => x.DelElement(It.IsAny<string>()), Times.Once);
Assert.That(flag);
}
[Test]
public void DeletePost_RecordWithIncorrectId_ThrowException_Test()
{
// Arrange
var id = Guid.NewGuid().ToString();
_postStorageContract.Setup(x => x.DelElement(It.IsAny<string>())).Throws(new ElementNotFoundException(id));
// Act & Assert
Assert.That(() => _postBusinessLogicContract.DeletePost(Guid.NewGuid().ToString()), Throws.TypeOf<ElementNotFoundException>());
_postStorageContract.Verify(x => x.DelElement(It.IsAny<string>()), Times.Once);
}
[Test]
public void DeletePost_IdIsNullOrEmpty_ThrowException_Test()
{
// Act & Assert
Assert.That(() => _postBusinessLogicContract.DeletePost(null), Throws.TypeOf<ArgumentNullException>());
Assert.That(() => _postBusinessLogicContract.DeletePost(string.Empty), Throws.TypeOf<ArgumentNullException>());
_postStorageContract.Verify(x => x.DelElement(It.IsAny<string>()), Times.Never);
}
[Test]
public void DeletePost_IdIsNotGuid_ThrowException_Test()
{
// Act & Assert
Assert.That(() => _postBusinessLogicContract.DeletePost("id"), Throws.TypeOf<ValidationException>());
_postStorageContract.Verify(x => x.DelElement(It.IsAny<string>()), Times.Never);
}
[Test]
public void DeletePost_StorageThrowError_ThrowException_Test()
{
// Arrange
_postStorageContract.Setup(x => x.DelElement(It.IsAny<string>())).Throws(new StorageException(new InvalidOperationException()));
// Act & Assert
Assert.That(() => _postBusinessLogicContract.DeletePost(Guid.NewGuid().ToString()), Throws.TypeOf<StorageException>());
_postStorageContract.Verify(x => x.DelElement(It.IsAny<string>()), Times.Once);
}
[Test]
public void RestorePost_CorrectRecord_Test()
{
// Arrange
var id = Guid.NewGuid().ToString();
var flag = false;
_postStorageContract.Setup(x => x.ResElement(It.Is((string x) => x == id))).Callback(() => { flag = true; });
// Act
_postBusinessLogicContract.RestorePost(id);
// Assert
_postStorageContract.Verify(x => x.ResElement(It.IsAny<string>()), Times.Once);
Assert.That(flag);
}
[Test]
public void RestorePost_RecordWithIncorrectId_ThrowException_Test()
{
// Arrange
var id = Guid.NewGuid().ToString();
_postStorageContract.Setup(x => x.ResElement(It.IsAny<string>())).Throws(new ElementNotFoundException(id));
// Act & Assert
Assert.That(() => _postBusinessLogicContract.RestorePost(Guid.NewGuid().ToString()), Throws.TypeOf<ElementNotFoundException>());
_postStorageContract.Verify(x => x.ResElement(It.IsAny<string>()), Times.Once);
}
[Test]
public void RestorePost_IdIsNullOrEmpty_ThrowException_Test()
{
// Act & Assert
Assert.That(() => _postBusinessLogicContract.RestorePost(null), Throws.TypeOf<ArgumentNullException>());
Assert.That(() => _postBusinessLogicContract.RestorePost(string.Empty), Throws.TypeOf<ArgumentNullException>());
_postStorageContract.Verify(x => x.ResElement(It.IsAny<string>()), Times.Never);
}
[Test]
public void RestorePost_IdIsNotGuid_ThrowException_Test()
{
// Act & Assert
Assert.That(() => _postBusinessLogicContract.RestorePost("id"), Throws.TypeOf<ValidationException>());
_postStorageContract.Verify(x => x.ResElement(It.IsAny<string>()), Times.Never);
}
[Test]
public void RestorePost_StorageThrowError_ThrowException_Test()
{
// Arrange
_postStorageContract.Setup(x => x.ResElement(It.IsAny<string>())).Throws(new StorageException(new InvalidOperationException()));
// Act & Assert
Assert.That(() => _postBusinessLogicContract.RestorePost(Guid.NewGuid().ToString()), Throws.TypeOf<StorageException>());
_postStorageContract.Verify(x => x.ResElement(It.IsAny<string>()), Times.Once);
}
}

View File

@@ -0,0 +1,432 @@
using System;
using System.Collections.Generic;
using Microsoft.Extensions.Logging;
using Moq;
using NUnit.Framework;
using TwoFromTheCasketBuisnessLogic.Implementations;
using TwoFromTheCasketContratcs.BuisnessLogicsContracts;
using TwoFromTheCasketContratcs.DataModels;
using TwoFromTheCasketContratcs.Enums;
using TwoFromTheCasketContratcs.Exceptions;
using TwoFromTheCasketContratcs.StorageContracts;
namespace TwoFromTheCasketTest.BuisnessLogicContractTests;
[TestFixture]
[TestFixture]
internal class SalaryBusinessLogicContractTests
{
private SalaryBusinessLogicContract _salaryBusinessLogicContract;
private Mock<ISalaryStorageContract> _salaryStorageContract;
private Mock<IOrderStorageContract> _orderStorageContract;
private Mock<IPostStorageContract> _postStorageContract;
private Mock<IMasterStorageContract> _masterStorageContract;
[OneTimeSetUp]
public void OneTimeSetUp()
{
_salaryStorageContract = new Mock<ISalaryStorageContract>();
_orderStorageContract = new Mock<IOrderStorageContract>();
_postStorageContract = new Mock<IPostStorageContract>();
_masterStorageContract = new Mock<IMasterStorageContract>();
_salaryBusinessLogicContract = new SalaryBusinessLogicContract(_salaryStorageContract.Object,
_postStorageContract.Object, _masterStorageContract.Object,
new Mock<ILogger>().Object, _orderStorageContract.Object);
}
[SetUp]
public void SetUp()
{
_salaryStorageContract.Reset();
_orderStorageContract.Reset();
_postStorageContract.Reset();
_masterStorageContract.Reset();
}
[Test]
public void GetAllSalaries_ReturnListOfRecords_Test()
{
//Arrange
var startDate = DateTime.UtcNow;
var endDate = DateTime.UtcNow.AddDays(1);
var listOriginal = new List<SalaryDataModel>()
{
new(Guid.NewGuid().ToString(), DateTime.UtcNow, 10, 10),
new(Guid.NewGuid().ToString(), DateTime.UtcNow.AddDays(1), 14, 10),
new(Guid.NewGuid().ToString(), DateTime.UtcNow.AddDays(-1), 30, 10),
};
_salaryStorageContract.Setup(x => x.GetList(It.IsAny<DateTime>(), It.IsAny<DateTime>(), It.IsAny<string>()))
.Returns(listOriginal);
//Act
var list = _salaryBusinessLogicContract.GetAllSalariesByPeriod(startDate, endDate);
//Assert
Assert.That(list, Is.Not.Null);
Assert.That(list, Is.EquivalentTo(listOriginal));
_salaryStorageContract.Verify(x => x.GetList(startDate, endDate, null), Times.Once);
}
[Test]
public void GetAllSalaries_ReturnEmptyList_Test()
{
//Arrange
_salaryStorageContract.Setup(x => x.GetList(It.IsAny<DateTime>(), It.IsAny<DateTime>(), It.IsAny<string>()))
.Returns([]);
//Act
var list = _salaryBusinessLogicContract.GetAllSalariesByPeriod(DateTime.UtcNow, DateTime.UtcNow.AddDays(1));
//Assert
Assert.That(list, Is.Not.Null);
Assert.That(list, Has.Count.EqualTo(0));
_salaryStorageContract.Verify(x => x.GetList(It.IsAny<DateTime>(), It.IsAny<DateTime>(), It.IsAny<string>()),
Times.Once);
}
[Test]
public void GetAllSalaries_IncorrectDates_ThrowException_Test()
{
//Arrange
var dateTime = DateTime.UtcNow;
//Act&Assert
Assert.That(() => _salaryBusinessLogicContract.GetAllSalariesByPeriod(dateTime, dateTime),
Throws.TypeOf<IncorrectDatesException>());
Assert.That(() => _salaryBusinessLogicContract.GetAllSalariesByPeriod(dateTime, dateTime.AddSeconds(-1)),
Throws.TypeOf<IncorrectDatesException>());
_salaryStorageContract.Verify(x => x.GetList(It.IsAny<DateTime>(), It.IsAny<DateTime>(), It.IsAny<string>()),
Times.Never);
}
[Test]
public void GetAllSalaries_ReturnNull_ThrowException_Test()
{
//Act&Assert
Assert.That(
() => _salaryBusinessLogicContract.GetAllSalariesByPeriod(DateTime.UtcNow, DateTime.UtcNow.AddDays(1)),
Throws.TypeOf<NullListException>());
_salaryStorageContract.Verify(x => x.GetList(It.IsAny<DateTime>(), It.IsAny<DateTime>(), It.IsAny<string>()),
Times.Once);
}
[Test]
public void GetAllSalaries_StorageThrowError_ThrowException_Test()
{
//Arrange
_salaryStorageContract.Setup(x => x.GetList(It.IsAny<DateTime>(), It.IsAny<DateTime>(), It.IsAny<string>()))
.Throws(new StorageException(new InvalidOperationException()));
//Act&Assert
Assert.That(
() => _salaryBusinessLogicContract.GetAllSalariesByPeriod(DateTime.UtcNow, DateTime.UtcNow.AddDays(1)),
Throws.TypeOf<StorageException>());
_salaryStorageContract.Verify(x => x.GetList(It.IsAny<DateTime>(), It.IsAny<DateTime>(), It.IsAny<string>()),
Times.Once);
}
[Test]
public void GetAllSalariesByMaster_ReturnListOfRecords_Test()
{
//Arrange
var startDate = DateTime.UtcNow;
var endDate = DateTime.UtcNow.AddDays(1);
var masterId = Guid.NewGuid().ToString();
var listOriginal = new List<SalaryDataModel>()
{
new(Guid.NewGuid().ToString(), DateTime.UtcNow, 10, 10),
new(Guid.NewGuid().ToString(), DateTime.UtcNow.AddDays(1), 14, 10),
new(Guid.NewGuid().ToString(), DateTime.UtcNow.AddDays(-1), 30, 10),
};
_salaryStorageContract.Setup(x => x.GetList(It.IsAny<DateTime>(), It.IsAny<DateTime>(), It.IsAny<string>()))
.Returns(listOriginal);
//Act
var list = _salaryBusinessLogicContract.GetAllSalariesByPeriodByMaster(startDate, endDate, masterId);
//Assert
Assert.That(list, Is.Not.Null);
Assert.That(list, Is.EquivalentTo(listOriginal));
_salaryStorageContract.Verify(x => x.GetList(startDate, endDate, masterId), Times.Once);
}
[Test]
public void GetAllSalariesByMaster_ReturnEmptyList_Test()
{
//Arrange
_salaryStorageContract.Setup(x => x.GetList(It.IsAny<DateTime>(), It.IsAny<DateTime>(), It.IsAny<string>()))
.Returns([]);
//Act
var list = _salaryBusinessLogicContract.GetAllSalariesByPeriodByMaster(DateTime.UtcNow,
DateTime.UtcNow.AddDays(1), Guid.NewGuid().ToString());
//Assert
Assert.That(list, Is.Not.Null);
Assert.That(list, Has.Count.EqualTo(0));
_salaryStorageContract.Verify(x => x.GetList(It.IsAny<DateTime>(), It.IsAny<DateTime>(), It.IsAny<string>()),
Times.Once);
}
[Test]
public void GetAllSalariesByMaster_IncorrectDates_ThrowException_Test()
{
//Arrange
var dateTime = DateTime.UtcNow;
//Act&Assert
Assert.That(
() => _salaryBusinessLogicContract.GetAllSalariesByPeriodByMaster(dateTime, dateTime,
Guid.NewGuid().ToString()), Throws.TypeOf<IncorrectDatesException>());
Assert.That(
() => _salaryBusinessLogicContract.GetAllSalariesByPeriodByMaster(dateTime, dateTime.AddSeconds(-1),
Guid.NewGuid().ToString()), Throws.TypeOf<IncorrectDatesException>());
_salaryStorageContract.Verify(x => x.GetList(It.IsAny<DateTime>(), It.IsAny<DateTime>(), It.IsAny<string>()),
Times.Never);
}
[Test]
public void GetAllSalariesByMaster_MasterIdIsNUllOrEmpty_ThrowException_Test()
{
//Act&Assert
Assert.That(
() => _salaryBusinessLogicContract.GetAllSalariesByPeriodByMaster(DateTime.UtcNow,
DateTime.UtcNow.AddDays(1), null), Throws.TypeOf<ArgumentNullException>());
Assert.That(
() => _salaryBusinessLogicContract.GetAllSalariesByPeriodByMaster(DateTime.UtcNow,
DateTime.UtcNow.AddDays(1), string.Empty), Throws.TypeOf<ArgumentNullException>());
_salaryStorageContract.Verify(x => x.GetList(It.IsAny<DateTime>(), It.IsAny<DateTime>(), It.IsAny<string>()),
Times.Never);
}
[Test]
public void GetAllSalariesByMaster_MasterIdIsNotGuid_ThrowException_Test()
{
//Act&Assert
Assert.That(
() => _salaryBusinessLogicContract.GetAllSalariesByPeriodByMaster(DateTime.UtcNow,
DateTime.UtcNow.AddDays(1), "masterId"), Throws.TypeOf<ValidationException>());
_salaryStorageContract.Verify(x => x.GetList(It.IsAny<DateTime>(), It.IsAny<DateTime>(), It.IsAny<string>()),
Times.Never);
}
[Test]
public void GetAllSalariesByMaster_ReturnNull_ThrowException_Test()
{
//Act&Assert
Assert.That(
() => _salaryBusinessLogicContract.GetAllSalariesByPeriodByMaster(DateTime.UtcNow,
DateTime.UtcNow.AddDays(1), Guid.NewGuid().ToString()), Throws.TypeOf<NullListException>());
_salaryStorageContract.Verify(x => x.GetList(It.IsAny<DateTime>(), It.IsAny<DateTime>(), It.IsAny<string>()),
Times.Once);
}
[Test]
public void GetAllSalariesByMaster_StorageThrowError_ThrowException_Test()
{
//Arrange
_salaryStorageContract.Setup(x => x.GetList(It.IsAny<DateTime>(), It.IsAny<DateTime>(), It.IsAny<string>()))
.Throws(new StorageException(new InvalidOperationException()));
//Act&Assert
Assert.That(
() => _salaryBusinessLogicContract.GetAllSalariesByPeriodByMaster(DateTime.UtcNow,
DateTime.UtcNow.AddDays(1), Guid.NewGuid().ToString()), Throws.TypeOf<StorageException>());
_salaryStorageContract.Verify(x => x.GetList(It.IsAny<DateTime>(), It.IsAny<DateTime>(), It.IsAny<string>()),
Times.Once);
}
[Test]
public void CalculateSalaryByMounth_CalculateSalary_Test()
{
//Arrange
var masterId = Guid.NewGuid().ToString();
var orderSum = 200.0;
var postSalary = 2000.0;
_orderStorageContract.Setup(x => x.GetList())
.Returns([
new OrderDataModel(Guid.NewGuid().ToString(), DateTime.Now, StatusType.Ready, RoomType.Industrial)
]);
_postStorageContract.Setup(x => x.GetElementById(It.IsAny<string>()))
.Returns(new PostDataModel(Guid.NewGuid().ToString(), "name", PostType.Plasterer, postSalary, true,default));
_masterStorageContract.Setup(x => x.GetList(It.IsAny<bool>(), It.IsAny<string?>(), It.IsAny<DateTime?>(),
It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>()))
.Returns([
new MasterDataModel(masterId, "А А А", Guid.NewGuid().ToString(), DateTime.UtcNow.AddYears(-19), DateTime.UtcNow,
false)
]);
var sum = 0.0;
var expectedSum = postSalary + 500;
_salaryStorageContract.Setup(x => x.AddElement(It.IsAny<SalaryDataModel>()))
.Callback((SalaryDataModel x) => { sum = x.Salary; });
//Act
_salaryBusinessLogicContract.CalculateSalaryByMonth(DateTime.UtcNow);
//Assert
Assert.That(sum, Is.EqualTo(expectedSum));
}
[Test]
public void CalculateSalaryByMounth_WithSeveralMasters_Test()
{
//Arrange
var master1Id = Guid.NewGuid().ToString();
var master2Id = Guid.NewGuid().ToString();
var master3Id = Guid.NewGuid().ToString();
var list = new List<MasterDataModel>()
{
new MasterDataModel(master1Id, "А А А", Guid.NewGuid().ToString(), DateTime.UtcNow.AddYears(-19), DateTime.UtcNow,
false),
new MasterDataModel(master2Id, "А А А", Guid.NewGuid().ToString(), DateTime.UtcNow.AddYears(-19), DateTime.UtcNow,
false),
new MasterDataModel(master3Id, "А А А", Guid.NewGuid().ToString(), DateTime.UtcNow.AddYears(-19), DateTime.UtcNow,
false)
};
_orderStorageContract.Setup(x => x.GetList())
.Returns([
new OrderDataModel(Guid.NewGuid().ToString(), DateTime.Now, StatusType.Ready, RoomType.Industrial),
new OrderDataModel(Guid.NewGuid().ToString(), DateTime.Now, StatusType.Ready, RoomType.Industrial),
new OrderDataModel(Guid.NewGuid().ToString(), DateTime.Now, StatusType.Ready, RoomType.Industrial),
new OrderDataModel(Guid.NewGuid().ToString(), DateTime.Now, StatusType.Ready, RoomType.Industrial),
new OrderDataModel(Guid.NewGuid().ToString(), DateTime.Now, StatusType.Ready, RoomType.Industrial)
]);
_postStorageContract.Setup(x => x.GetElementById(It.IsAny<string>()))
.Returns(new PostDataModel(Guid.NewGuid().ToString(), "name", PostType.Plasterer, 2000, true, default));
_masterStorageContract.Setup(x => x.GetList(It.IsAny<bool>(), It.IsAny<string?>(), It.IsAny<DateTime?>(),
It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>()))
.Returns(list);
//Act
_salaryBusinessLogicContract.CalculateSalaryByMonth(DateTime.UtcNow);
//Assert
_salaryStorageContract.Verify(x => x.AddElement(It.IsAny<SalaryDataModel>()), Times.Exactly(list.Count));
}
[Test]
public void CalculateSalaryByMounth_WithoitOrdersByMaster_Test()
{
//Arrange
var postSalary = 2000.0;
var masterId = Guid.NewGuid().ToString();
_orderStorageContract.Setup(x => x.GetList())
.Returns([]);
_postStorageContract.Setup(x => x.GetElementById(It.IsAny<string>()))
.Returns(new PostDataModel(Guid.NewGuid().ToString(), "name", PostType.Plasterer, postSalary, true, default));
_masterStorageContract.Setup(x => x.GetList(It.IsAny<bool>(), It.IsAny<string?>(), It.IsAny<DateTime?>(),
It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>()))
.Returns([
new MasterDataModel(masterId, "А А А", Guid.NewGuid().ToString(), DateTime.UtcNow.AddYears(-19), DateTime.UtcNow,
false)
]);
var sum = 0.0;
var expectedSum = postSalary + 500;
_salaryStorageContract.Setup(x => x.AddElement(It.IsAny<SalaryDataModel>()))
.Callback((SalaryDataModel x) => { sum = x.Salary; });
//Act
_salaryBusinessLogicContract.CalculateSalaryByMonth(DateTime.UtcNow);
//Assert
Assert.That(sum, Is.EqualTo(expectedSum));
}
[Test]
public void CalculateSalaryByMounth_OrderStorageReturnNull_ThrowException_Test()
{
//Arrange
var masterId = Guid.NewGuid().ToString();
_postStorageContract.Setup(x => x.GetElementById(It.IsAny<string>()))
.Returns(new PostDataModel(Guid.NewGuid().ToString(), "name", PostType.Plasterer, 2000, true, default));
_masterStorageContract.Setup(x => x.GetList(It.IsAny<bool>(), It.IsAny<string?>(), It.IsAny<DateTime?>(),
It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>()))
.Returns([
new MasterDataModel(masterId, "А А А", Guid.NewGuid().ToString(), DateTime.UtcNow.AddYears(-19), DateTime.UtcNow,
false)
]);
//Act&Assert
Assert.That(() => _salaryBusinessLogicContract.CalculateSalaryByMonth(DateTime.UtcNow),
Throws.TypeOf<NullListException>());
}
[Test]
public void CalculateSalaryByMounth_PostStorageReturnNull_ThrowException_Test()
{
//Arrange
var masterId = Guid.NewGuid().ToString();
_orderStorageContract.Setup(x => x.GetList())
.Returns([
new OrderDataModel(Guid.NewGuid().ToString(), DateTime.Now, StatusType.Ready, RoomType.Industrial)
]);
_masterStorageContract.Setup(x => x.GetList(It.IsAny<bool>(), It.IsAny<string?>(), It.IsAny<DateTime?>(),
It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>()))
.Returns([
new MasterDataModel(masterId, "А А А", Guid.NewGuid().ToString(), DateTime.UtcNow.AddYears(-19), DateTime.UtcNow,
false)
]);
//Act&Assert
Assert.That(() => _salaryBusinessLogicContract.CalculateSalaryByMonth(DateTime.UtcNow),
Throws.TypeOf<NullListException>());
}
[Test]
public void CalculateSalaryByMounth_MasterStorageReturnNull_ThrowException_Test()
{
//Arrange
var masterId = Guid.NewGuid().ToString();
_orderStorageContract.Setup(x => x.GetList())
.Returns([
new OrderDataModel(Guid.NewGuid().ToString(), DateTime.Now, StatusType.Ready, RoomType.Industrial)
]);
_postStorageContract.Setup(x => x.GetElementById(It.IsAny<string>()))
.Returns(new PostDataModel(Guid.NewGuid().ToString(), "name", PostType.Plasterer, 2000, true, default));
//Act&Assert
Assert.That(() => _salaryBusinessLogicContract.CalculateSalaryByMonth(DateTime.UtcNow),
Throws.TypeOf<NullListException>());
}
[Test]
public void CalculateSalaryByMounth_OrderStorageThrowException_ThrowException_Test()
{
//Arrange
var masterId = Guid.NewGuid().ToString();
_orderStorageContract.Setup(x => x.GetList())
.Throws(new StorageException(new InvalidOperationException()));
_postStorageContract.Setup(x => x.GetElementById(It.IsAny<string>()))
.Returns(new PostDataModel(Guid.NewGuid().ToString(), "name", PostType.Plasterer, 2000, true, default));
_masterStorageContract.Setup(x => x.GetList(It.IsAny<bool>(), It.IsAny<string?>(), It.IsAny<DateTime?>(),
It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>()))
.Returns([
new MasterDataModel(masterId, "А А А", Guid.NewGuid().ToString(), DateTime.UtcNow.AddYears(-19), DateTime.UtcNow,
false)
]);
//Act&Assert
Assert.That(() => _salaryBusinessLogicContract.CalculateSalaryByMonth(DateTime.UtcNow),
Throws.TypeOf<StorageException>());
}
[Test]
public void CalculateSalaryByMounth_PostStorageThrowException_ThrowException_Test()
{
//Arrange
var masterId = Guid.NewGuid().ToString();
_orderStorageContract.Setup(x => x.GetList())
.Returns([
new OrderDataModel(Guid.NewGuid().ToString(), DateTime.Now, StatusType.Ready, RoomType.Industrial)
]);
_postStorageContract.Setup(x => x.GetElementById(It.IsAny<string>()))
.Throws(new StorageException(new InvalidOperationException()));
_masterStorageContract.Setup(x => x.GetList(It.IsAny<bool>(), It.IsAny<string?>(), It.IsAny<DateTime?>(),
It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>()))
.Returns([
new MasterDataModel(masterId, "А А А", Guid.NewGuid().ToString(), DateTime.UtcNow.AddYears(-19), DateTime.UtcNow,
false)
]);
//Act&Assert
Assert.That(() => _salaryBusinessLogicContract.CalculateSalaryByMonth(DateTime.UtcNow),
Throws.TypeOf<StorageException>());
}
[Test]
public void CalculateSalaryByMounth_MasterStorageThrowException_ThrowException_Test()
{
//Arrange
var masterId = Guid.NewGuid().ToString();
_orderStorageContract.Setup(x => x.GetList())
.Returns([
new OrderDataModel(Guid.NewGuid().ToString(), DateTime.Now, StatusType.Ready, RoomType.Industrial)
]);
_postStorageContract.Setup(x => x.GetElementById(It.IsAny<string>()))
.Returns(new PostDataModel(Guid.NewGuid().ToString(), "name", PostType.Plasterer, 2000, true, default));
_masterStorageContract.Setup(x => x.GetList(It.IsAny<bool>(), It.IsAny<string?>(), It.IsAny<DateTime?>(),
It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>()))
.Throws(new StorageException(new InvalidOperationException()));
//Act&Assert
Assert.That(() => _salaryBusinessLogicContract.CalculateSalaryByMonth(DateTime.UtcNow),
Throws.TypeOf<StorageException>());
}
}

View File

@@ -0,0 +1,263 @@
using System;
using System.Collections.Generic;
using Microsoft.Extensions.Logging;
using Moq;
using NUnit.Framework;
using TwoFromTheCasketBuisnessLogic.Implementations;
using TwoFromTheCasketContratcs.BuisnessLogicsContracts;
using TwoFromTheCasketContratcs.DataModels;
using TwoFromTheCasketContratcs.Enums;
using TwoFromTheCasketContratcs.Exceptions;
using TwoFromTheCasketContratcs.StorageContracts;
namespace TwoFromTheCasketTest.BuisnessLogicContractTests;
[TestFixture]
internal class ServiceBusinessLogicContractTests
{
private ServiceBusinessLogicContract _serviceBusinessLogicContract;
private Mock<IServiceStorageContract> _serviceStorageContract;
[OneTimeSetUp]
public void OneTimeSetUp()
{
_serviceStorageContract = new Mock<IServiceStorageContract>();
_serviceBusinessLogicContract = new ServiceBusinessLogicContract(_serviceStorageContract.Object,new Mock<ILogger>().Object);
}
[SetUp]
public void SetUp()
{
_serviceStorageContract.Reset();
}
[Test]
public void GetAllServices_ReturnListOfRecords_Test()
{
// Arrange
var listOriginal = new List<ServiceDataModel>()
{
new(Guid.NewGuid().ToString(), "Service 1", ServiceType.Painting, Guid.NewGuid().ToString(), 100, false),
new(Guid.NewGuid().ToString(), "Service 2", ServiceType.Carpentry, Guid.NewGuid().ToString(), 200, false),
};
_serviceStorageContract.Setup(x => x.GetList()).Returns(listOriginal);
// Act
var list = _serviceBusinessLogicContract.GetAllServices(onlyActive: true);
// Assert
Assert.Multiple(() =>
{
Assert.That(list, Is.Not.Null);
Assert.That(list, Is.EquivalentTo(listOriginal));
});
_serviceStorageContract.Verify(x => x.GetList(), Times.Once);
}
[Test]
public void GetAllServices_ReturnEmptyList_Test()
{
// Arrange
_serviceStorageContract.Setup(x => x.GetList()).Returns([]);
// Act
var list = _serviceBusinessLogicContract.GetAllServices(onlyActive: true);
// Assert
Assert.Multiple(() =>
{
Assert.That(list, Is.Not.Null);
Assert.That(list, Has.Count.EqualTo(0));
});
}
[Test]
public void GetAllServices_ReturnNull_ThrowException_Test()
{
// Arrange
_serviceStorageContract.Setup(x => x.GetList()).Returns((List<ServiceDataModel>)null!);
// Act & Assert
Assert.That(() => _serviceBusinessLogicContract.GetAllServices(onlyActive: true), Throws.TypeOf<NullListException>());
_serviceStorageContract.Verify(x => x.GetList(), Times.Once);
}
[Test]
public void GetAllServices_StorageThrowError_ThrowException_Test()
{
// Arrange
_serviceStorageContract.Setup(x => x.GetList()).Throws(new StorageException(new InvalidOperationException()));
// Act & Assert
Assert.That(() => _serviceBusinessLogicContract.GetAllServices(onlyActive: true), Throws.TypeOf<StorageException>());
_serviceStorageContract.Verify(x => x.GetList(), Times.Once);
}
[Test]
public void GetAllServicesByMasterId_ReturnAllServices_WhenOnlyActiveFalse()
{
// Arrange
var masterId = Guid.NewGuid().ToString();
var listOriginal = new List<ServiceDataModel>()
{
new(Guid.NewGuid().ToString(), "Service 1", ServiceType.Plastering, masterId, 100, false),
new(Guid.NewGuid().ToString(), "Service 2", ServiceType.Carpentry, masterId, 200, false),
};
_serviceStorageContract
.Setup(x => x.GetElementByMasterId(masterId))
.Returns(listOriginal);
// Act
var list = _serviceBusinessLogicContract.GetServicesByMasterId(masterId, onlyActive: false);
// Assert
Assert.That(list, Is.Not.Null);
Assert.That(list, Has.Count.EqualTo(2));
_serviceStorageContract.Verify(x => x.GetElementByMasterId(masterId), Times.Once);
}
[Test]
public void GetAllServicesByMasterId_ThrowsNullListException_WhenNoServicesFound()
{
// Arrange
_serviceStorageContract
.Setup(x => x.GetElementByMasterId(It.IsAny<string>()))
.Returns((List<ServiceDataModel>)null!);
// Act & Assert
Assert.That(
() => _serviceBusinessLogicContract.GetServicesByMasterId(Guid.NewGuid().ToString(), onlyActive: true),
Throws.TypeOf<NullListException>()
);
_serviceStorageContract.Verify(x => x.GetElementByMasterId(It.IsAny<string>()), Times.Once);
}
[Test]
public void GetAllServicesByMasterId_MasterIdIsNullOrEmpty_ThrowException_Test()
{
// Act & Assert
Assert.That(() => _serviceBusinessLogicContract.GetServicesByMasterId(null, onlyActive: true), Throws.TypeOf<ArgumentNullException>());
Assert.That(() => _serviceBusinessLogicContract.GetServicesByMasterId(string.Empty, onlyActive: true), Throws.TypeOf<ArgumentNullException>());
_serviceStorageContract.Verify(x => x.GetElementByMasterId(It.IsAny<string>()), Times.Never);
}
[Test]
public void GetAllServicesByServiceType_ReturnListOfRecords_Test()
{
// Arrange
var serviceType = ServiceType.Carpentry;
var listOriginal = new List<ServiceDataModel>()
{
new(Guid.NewGuid().ToString(), "Service 1", serviceType, Guid.NewGuid().ToString(), 100, false),
new(Guid.NewGuid().ToString(), "Service 2", serviceType, Guid.NewGuid().ToString(), 200, false),
};
_serviceStorageContract.Setup(x => x.GetList()).Returns(listOriginal);
// Act
var list = _serviceBusinessLogicContract.GetServicesByServiceType(serviceType, onlyActive: true);
// Assert
Assert.That(list, Is.Not.Null);
Assert.That(list, Has.Count.EqualTo(0));
_serviceStorageContract.Verify(x => x.GetList(), Times.Once);
}
[Test]
public void InsertService_CorrectRecord_Test()
{
// Arrange
var record = new ServiceDataModel(Guid.NewGuid().ToString(), "Service 1", ServiceType.Plastering, Guid.NewGuid().ToString(), 100, false);
_serviceStorageContract.Setup(x => x.AddElement(It.IsAny<ServiceDataModel>()));
// Act
_serviceBusinessLogicContract.InsertService(record);
// Assert
_serviceStorageContract.Verify(x => x.AddElement(It.IsAny<ServiceDataModel>()), Times.Once);
}
[Test]
public void InsertService_NullRecord_ThrowException_Test()
{
// Act & Assert
Assert.That(() => _serviceBusinessLogicContract.InsertService(null), Throws.TypeOf<ArgumentNullException>());
_serviceStorageContract.Verify(x => x.AddElement(It.IsAny<ServiceDataModel>()), Times.Never);
}
[Test]
public void InsertService_InvalidRecord_ThrowException_Test()
{
// Arrange
var invalidRecord = new ServiceDataModel("invalid-id", "", ServiceType.None, "invalid-master-id", -100, false);
// Act & Assert
Assert.That(() => _serviceBusinessLogicContract.InsertService(invalidRecord), Throws.TypeOf<ValidationException>());
_serviceStorageContract.Verify(x => x.AddElement(It.IsAny<ServiceDataModel>()), Times.Never);
}
[Test]
public void UpdateService_CorrectRecord_Test()
{
// Arrange
var record = new ServiceDataModel(Guid.NewGuid().ToString(), "Service 1", ServiceType.Painting, Guid.NewGuid().ToString(), 100, false);
_serviceStorageContract.Setup(x => x.UpdElement(It.IsAny<ServiceDataModel>()));
// Act
_serviceBusinessLogicContract.UpdateService(record);
// Assert
_serviceStorageContract.Verify(x => x.UpdElement(It.IsAny<ServiceDataModel>()), Times.Once);
}
[Test]
public void UpdateService_NullRecord_ThrowException_Test()
{
// Act & Assert
Assert.That(() => _serviceBusinessLogicContract.UpdateService(null), Throws.TypeOf<ArgumentNullException>());
_serviceStorageContract.Verify(x => x.UpdElement(It.IsAny<ServiceDataModel>()), Times.Never);
}
[Test]
public void UpdateService_InvalidRecord_ThrowException_Test()
{
// Arrange
var invalidRecord = new ServiceDataModel("invalid-id", "", ServiceType.None, "invalid-master-id", -100, false);
// Act & Assert
Assert.That(() => _serviceBusinessLogicContract.UpdateService(invalidRecord), Throws.TypeOf<ValidationException>());
_serviceStorageContract.Verify(x => x.UpdElement(It.IsAny<ServiceDataModel>()), Times.Never);
}
[Test]
public void DeleteService_CorrectRecord_Test()
{
// Arrange
var id = Guid.NewGuid().ToString();
_serviceStorageContract.Setup(x => x.DelElement(It.IsAny<string>()));
// Act
_serviceBusinessLogicContract.DeleteService(id);
// Assert
_serviceStorageContract.Verify(x => x.DelElement(It.IsAny<string>()), Times.Once);
}
[Test]
public void DeleteService_IdIsNullOrEmpty_ThrowException_Test()
{
// Act & Assert
Assert.That(() => _serviceBusinessLogicContract.DeleteService(null), Throws.TypeOf<ArgumentNullException>());
Assert.That(() => _serviceBusinessLogicContract.DeleteService(string.Empty), Throws.TypeOf<ArgumentNullException>());
_serviceStorageContract.Verify(x => x.DelElement(It.IsAny<string>()), Times.Never);
}
[Test]
public void DeleteService_IdIsNotGuid_ThrowException_Test()
{
// Act & Assert
Assert.That(() => _serviceBusinessLogicContract.DeleteService("invalid-id"), Throws.TypeOf<ValidationException>());
_serviceStorageContract.Verify(x => x.DelElement(It.IsAny<string>()), Times.Never);
}
}

View File

@@ -15,52 +15,40 @@ public class PostDataModelTests
[Test]
public void IdIsNullOrEmptyTest()
{
var post = CreateDataModel(string.Empty, Guid.NewGuid().ToString(), "Manager", PostType.Plasterer, 50000, true, DateTime.Now);
var post = CreateDataModel(string.Empty, "Manager", PostType.Plasterer, 50000, true, default);
Assert.That(() => post.Validate(), Throws.TypeOf<ValidationException>());
}
[Test]
public void IdIsNotGuidTest()
{
var post = CreateDataModel("invalid-guid", Guid.NewGuid().ToString(), "Manager", PostType.Plasterer, 50000, true, DateTime.Now);
var post = CreateDataModel("invalid-guid", "Manager", PostType.Plasterer, 50000, true, default);
Assert.That(() => post.Validate(), Throws.TypeOf<ValidationException>());
}
[Test]
public void PostIdIsNullOrEmptyTest()
{
var post = CreateDataModel(Guid.NewGuid().ToString(), string.Empty, "Manager", PostType.Plasterer, 50000, true, DateTime.Now);
Assert.That(() => post.Validate(), Throws.TypeOf<ValidationException>());
}
[Test]
public void PostIdIsNotGuidTest()
{
var post = CreateDataModel(Guid.NewGuid().ToString(), "invalid-guid", "Manager", PostType.Plasterer, 50000, true, DateTime.Now);
Assert.That(() => post.Validate(), Throws.TypeOf<ValidationException>());
}
[Test]
public void PostNameIsNullOrEmptyTest()
{
var post = CreateDataModel(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), string.Empty, PostType.Plasterer, 50000, true, DateTime.Now);
var post = CreateDataModel(Guid.NewGuid().ToString(), string.Empty, PostType.Plasterer, 50000, true, default);
Assert.That(() => post.Validate(), Throws.TypeOf<ValidationException>());
}
[Test]
public void PostTypeIsNoneTest()
{
var post = CreateDataModel(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), "Manager", PostType.None, 50000, true, DateTime.Now);
var post = CreateDataModel(Guid.NewGuid().ToString(), "Manager", PostType.None, 50000, true, default);
Assert.That(() => post.Validate(), Throws.TypeOf<ValidationException>());
}
[Test]
public void SalaryIsLessOrEqualToZeroTest()
{
var post = CreateDataModel(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), "Manager", PostType.Plasterer, 0, true, DateTime.Now);
var post = CreateDataModel(Guid.NewGuid().ToString(), "Manager", PostType.Plasterer, 0, true, default);
Assert.That(() => post.Validate(), Throws.TypeOf<ValidationException>());
post = CreateDataModel(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), "Manager", PostType.Plasterer, -1000, true, DateTime.Now);
post = CreateDataModel(Guid.NewGuid().ToString(), "Manager", PostType.Plasterer, -1000, true, default);
Assert.That(() => post.Validate(), Throws.TypeOf<ValidationException>());
}
@@ -68,31 +56,28 @@ public class PostDataModelTests
public void AllFieldsAreCorrectTest()
{
var id = Guid.NewGuid().ToString();
var postId = Guid.NewGuid().ToString();
var postName = "Manager";
var postType = PostType.Plasterer;
var salary = 50000.0;
var isActual = true;
var changeDate = DateTime.Now;
var post = CreateDataModel(id, postId, postName, postType, salary, isActual, changeDate);
var post = CreateDataModel(id, postName, postType, salary, true, default);
Assert.That(() => post.Validate(), Throws.Nothing);
Assert.Multiple(() =>
{
Assert.That(post.Id, Is.EqualTo(id));
Assert.That(post.PostId, Is.EqualTo(postId));
Assert.That(post.PostName, Is.EqualTo(postName));
Assert.That(post.PostType, Is.EqualTo(postType));
Assert.That(post.Salary, Is.EqualTo(salary));
Assert.That(post.IsActual, Is.EqualTo(isActual));
Assert.That(post.ChangeDate, Is.EqualTo(changeDate));
});
}
private static PostDataModel CreateDataModel(string id, string postId, string postName, PostType postType, double salary, bool isActual, DateTime changeDate)
private static PostDataModel CreateDataModel(string id, string postName, PostType postType, double salary, bool isActual, DateTime changeDate)
{
return new PostDataModel(id, postId, postName, postType, salary, isActual, changeDate);
return new PostDataModel(id, postName, postType, salary, isActual, default);
}
}

View File

@@ -9,7 +9,7 @@ using TwoFromTheCasketContratcs.Exceptions;
namespace TwoFromTheCasketTest.DataModelsTest;
[TestFixture]
public class SalaryDataModellTests
public class SalaryDataModelTests
{
[Test]
public void MasterIdIsNullOrEmptyTest()

View File

@@ -49,7 +49,7 @@ public class ServiceHistoryDataModelTests
{
Assert.That(serviceHistory.ServiceId, Is.EqualTo(serviceId));
Assert.That(serviceHistory.OldPrice, Is.EqualTo(oldPrice));
Assert.That(serviceHistory.ChangeDate, Is.EqualTo(DateTime.UtcNow).Within(TimeSpan.FromSeconds(1)));
});
}

View File

@@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TwoFromTheCasketContratcs.Infrastructure;
namespace TwoFromTheCasketTest.Infrastructureж
{
internal class ConfigurationDatabaseTest : IConfigurationDatabase
{
public string ConnectionString =>
"Host=127.0.0.1;Port=5432;Database=TwoFromTheCasketTest;Username=postgres;Password=123;";
}
}

View File

@@ -0,0 +1,29 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TwoFromTheCasketDatabase;
using TwoFromTheCasketTest.Infrastructureж;
namespace TwoFromTheCasketTest.StoragesContractsTests;
internal abstract class BaseStorageContractTest
{
protected TwoFromTheCasketDbContext TwoFromTheCasketDbContext { get; private set; }
[OneTimeSetUp]
public void OneTimeSetUp()
{
TwoFromTheCasketDbContext = new TwoFromTheCasketDbContext(new
ConfigurationDatabaseTest());
TwoFromTheCasketDbContext.Database.EnsureDeleted();
TwoFromTheCasketDbContext.Database.EnsureCreated();
}
[OneTimeTearDown]
public void OneTimeTearDown()
{
TwoFromTheCasketDbContext.Database.EnsureDeleted();
TwoFromTheCasketDbContext.Dispose();
}
}

View File

@@ -0,0 +1,255 @@
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TwoFromTheCasketContratcs.DataModels;
using TwoFromTheCasketContratcs.Exceptions;
using TwoFromTheCasketDatabase.Implementation;
using TwoFromTheCasketDatabase.Models;
namespace TwoFromTheCasketTest.StoragesContractsTests;
[TestFixture]
internal class MasterStorageContractTests : BaseStorageContractTest
{
private MasterStorageContract _masterStorageContract;
[SetUp]
public void SetUp()
{
_masterStorageContract = new MasterStorageContract(TwoFromTheCasketDbContext);
}
[TearDown]
public void TearDown()
{
TwoFromTheCasketDbContext.Database.ExecuteSqlRaw("TRUNCATE \"Masters\"CASCADE; ");
}
[Test]
public void Try_GetList_WhenHaveRecords_Test()
{
var master =
InsertMasterToDatabaseAndReturn(Guid.NewGuid().ToString(), "fio 1");
InsertMasterToDatabaseAndReturn(Guid.NewGuid().ToString(), "fio 2");
InsertMasterToDatabaseAndReturn(Guid.NewGuid().ToString(), "fio 3");
var list = _masterStorageContract.GetList();
Assert.That(list, Is.Not.Null);
Assert.That(list, Has.Count.EqualTo(3));
AssertElement(list.First(), master);
}
[Test]
public void Try_GetList_WhenNoRecords_Test()
{
var list = _masterStorageContract.GetList();
Assert.That(list, Is.Not.Null);
Assert.That(list, Is.Empty);
}
[Test]
public void Try_GetList_ByPostId_Test()
{
var postId = Guid.NewGuid().ToString();
InsertMasterToDatabaseAndReturn(Guid.NewGuid().ToString(), "fio 1",
postId);
InsertMasterToDatabaseAndReturn(Guid.NewGuid().ToString(), "fio 2",
postId);
InsertMasterToDatabaseAndReturn(Guid.NewGuid().ToString(), "fio 3",
postId);
var list = _masterStorageContract.GetList(postId: postId);
Assert.That(list, Is.Not.Null);
Assert.That(list, Has.Count.EqualTo(3));
Assert.That(list.All(x => x.PostId == postId));
}
[Test]
public void Try_GetList_ByBirthDate_Test()
{
InsertMasterToDatabaseAndReturn(Guid.NewGuid().ToString(), "fio 1",
birthDate: DateTime.UtcNow.AddYears(-25));
InsertMasterToDatabaseAndReturn(Guid.NewGuid().ToString(), "fio 2",
birthDate: DateTime.UtcNow.AddYears(-21));
InsertMasterToDatabaseAndReturn(Guid.NewGuid().ToString(), "fio 3",
birthDate: DateTime.UtcNow.AddYears(-20));
InsertMasterToDatabaseAndReturn(Guid.NewGuid().ToString(), "fio 4",
birthDate: DateTime.UtcNow.AddYears(-19));
var list = _masterStorageContract.GetList(fromBirthDate:
DateTime.UtcNow.AddYears(-21).AddMinutes(-1), toBirthDate:
DateTime.UtcNow.AddYears(-20).AddMinutes(1));
Assert.That(list, Is.Not.Null);
Assert.That(list, Has.Count.EqualTo(2));
}
[Test]
public void Try_GetList_ByEmploymentDate_Test()
{
InsertMasterToDatabaseAndReturn(Guid.NewGuid().ToString(), "fio 1",
employmentDate: DateTime.UtcNow.AddDays(-2));
InsertMasterToDatabaseAndReturn(Guid.NewGuid().ToString(), "fio 2",
employmentDate: DateTime.UtcNow.AddDays(-1));
InsertMasterToDatabaseAndReturn(Guid.NewGuid().ToString(), "fio 3", employmentDate: DateTime.UtcNow.AddDays(1));
InsertMasterToDatabaseAndReturn(Guid.NewGuid().ToString(), "fio 4", employmentDate: DateTime.UtcNow.AddDays(2));
var list = _masterStorageContract.GetList(fromEmploymentDate: DateTime.UtcNow.AddDays(-1).AddMinutes(-1),
toEmploymentDate: DateTime.UtcNow.AddDays(1).AddMinutes(1));
Assert.That(list, Is.Not.Null);
Assert.That(list, Has.Count.EqualTo(2));
}
[Test]
public void Try_GetList_ByAllParameters_Test()
{
var postId = Guid.NewGuid().ToString();
InsertMasterToDatabaseAndReturn(Guid.NewGuid().ToString(), "fio 1", postId,
birthDate: DateTime.UtcNow.AddYears(-25), employmentDate: DateTime.UtcNow.AddDays(-2));
InsertMasterToDatabaseAndReturn(Guid.NewGuid().ToString(), "fio 2", postId,
birthDate: DateTime.UtcNow.AddYears(-22), employmentDate: DateTime.UtcNow.AddDays(-1));
InsertMasterToDatabaseAndReturn(Guid.NewGuid().ToString(), "fio 3", postId,
birthDate: DateTime.UtcNow.AddYears(-21), employmentDate: DateTime.UtcNow.AddDays(-1));
InsertMasterToDatabaseAndReturn(Guid.NewGuid().ToString(), "fio 4",birthDate: DateTime.UtcNow.AddYears(-20),
employmentDate: DateTime.UtcNow.AddDays(1));
var list = _masterStorageContract.GetList(postId: postId,
fromBirthDate: DateTime.UtcNow.AddYears(-21).AddMinutes(-1),
toBirthDate: DateTime.UtcNow.AddYears(-20).AddMinutes(1),
fromEmploymentDate: DateTime.UtcNow.AddDays(-1).AddMinutes(-1),
toEmploymentDate: DateTime.UtcNow.AddDays(1).AddMinutes(1));
Assert.That(list, Is.Not.Null);
Assert.That(list, Has.Count.EqualTo(1));
}
[Test]
public void Try_GetElementById_WhenHaveRecord_Test()
{
var master = InsertMasterToDatabaseAndReturn(Guid.NewGuid().ToString());
AssertElement(_masterStorageContract.GetElementById(master.Id), master);
}
[Test]
public void Try_GetElementById_WhenNoRecord_Test()
{
Assert.That(() => _masterStorageContract.GetElementById(Guid.NewGuid().ToString()), Is.Null);
}
[Test]
public void Try_GetElementByFIO_WhenHaveRecord_Test()
{
var master = InsertMasterToDatabaseAndReturn(Guid.NewGuid().ToString());
AssertElement(_masterStorageContract.GetElementByFIO(master.FIO), master);
}
[Test]
public void Try_GetElementByFIO_WhenNoRecord_Test()
{
Assert.That(() => _masterStorageContract.GetElementByFIO("New Fio"), Is.Null);
}
[Test]
public void Try_AddElement_Test()
{
var master = CreateModel(Guid.NewGuid().ToString());
_masterStorageContract.AddElement(master);
AssertElement(GetMasterFromDatabase(master.Id), master);
}
[Test]
public void Try_AddElement_WhenHaveRecordWithSameId_Test()
{
var master = CreateModel(Guid.NewGuid().ToString());
InsertMasterToDatabaseAndReturn(master.Id);
Assert.That(() => _masterStorageContract.AddElement(master), Throws.TypeOf<ElementExistsException>());
}
[Test]
public void Try_UpdElement_Test()
{
var master = CreateModel(Guid.NewGuid().ToString(), "New Fio");
InsertMasterToDatabaseAndReturn(master.Id);
_masterStorageContract.UpdElement(master);
AssertElement(GetMasterFromDatabase(master.Id), master);
}
[Test]
public void Try_UpdElement_WhenNoRecordWithThisId_Test()
{
Assert.That(() => _masterStorageContract.UpdElement(CreateModel(Guid.NewGuid().ToString())),
Throws.TypeOf<ElementNotFoundException>());
}
[Test]
public void Try_UpdElement_WhenNoRecordWasDeleted_Test()
{
var master = CreateModel(Guid.NewGuid().ToString());
InsertMasterToDatabaseAndReturn(master.Id, isDeleted: true);
Assert.That(() => _masterStorageContract.UpdElement(master), Throws.TypeOf<ElementNotFoundException>());
}
[Test]
public void Try_DelElement_Test()
{
var master = InsertMasterToDatabaseAndReturn(Guid.NewGuid().ToString());
_masterStorageContract.DelElement(master.Id);
var element = GetMasterFromDatabase(master.Id);
Assert.That(element, Is.Not.Null);
Assert.That(element.IsDeleted);
}
[Test]
public void Try_DelElement_WhenNoRecordWasDeleted_Test()
{
var master = CreateModel(Guid.NewGuid().ToString());
InsertMasterToDatabaseAndReturn(master.Id, isDeleted: true);
Assert.That(() => _masterStorageContract.DelElement(master.Id), Throws.TypeOf<ElementNotFoundException>());
}
[Test]
public void Try_DelElement_WhenNoRecordWithThisId_Test()
{
Assert.That(() => _masterStorageContract.DelElement(Guid.NewGuid().ToString()),
Throws.TypeOf<ElementNotFoundException>());
}
private Master InsertMasterToDatabaseAndReturn(string id, string fio = "test", string? postId = null, DateTime? birthDate = null, DateTime?
employmentDate = null, bool isDeleted = false)
{
var master = new Master()
{
Id = id,
FIO = fio,
PostId = postId ??
Guid.NewGuid().ToString(),
BirthDate = birthDate ?? DateTime.UtcNow.AddYears(-
20),
EmploymentDate = employmentDate ?? DateTime.UtcNow,
IsDeleted = isDeleted
};
TwoFromTheCasketDbContext.Masters.Add(master);
TwoFromTheCasketDbContext.SaveChanges();
return master;
}
private static void AssertElement(MasterDataModel? actual, Master expected)
{
Assert.That(actual, Is.Not.Null);
Assert.Multiple(() =>
{
Assert.That(actual.Id, Is.EqualTo(expected.Id));
Assert.That(actual.PostId, Is.EqualTo(expected.PostId));
Assert.That(actual.FIO, Is.EqualTo(expected.FIO));
Assert.That(actual.BirthDate, Is.EqualTo(expected.BirthDate));
Assert.That(actual.EmploymentDate,
Is.EqualTo(expected.EmploymentDate));
Assert.That(actual.IsDeleted, Is.EqualTo(expected.IsDeleted));
});
}
private Master? GetMasterFromDatabase(string id) => TwoFromTheCasketDbContext.Masters.FirstOrDefault(x => x.Id == id);
private static MasterDataModel CreateModel(string id, string fio = "fio", string? postId = null, DateTime? birthDate = null, DateTime? employmentDate = null,
bool isDeleted = false) => new(id, fio, postId ?? Guid.NewGuid().ToString(), birthDate ??DateTime.UtcNow.AddYears(-20), employmentDate ?? DateTime.UtcNow, isDeleted);
private static void AssertElement(Master? actual, MasterDataModel expected)
{
Assert.That(actual, Is.Not.Null);
Assert.Multiple(() =>
{
Assert.That(actual.Id, Is.EqualTo(expected.Id));
Assert.That(actual.PostId, Is.EqualTo(expected.PostId));
Assert.That(actual.FIO, Is.EqualTo(expected.FIO));
Assert.That(actual.BirthDate, Is.EqualTo(expected.BirthDate));
Assert.That(actual.EmploymentDate, Is.EqualTo(expected.EmploymentDate));
Assert.That(actual.IsDeleted, Is.EqualTo(expected.IsDeleted));
});
}
}

View File

@@ -0,0 +1,184 @@
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using TwoFromTheCasketContratcs.DataModels;
using TwoFromTheCasketContratcs.Enums;
using TwoFromTheCasketContratcs.Exceptions;
using TwoFromTheCasketDatabase.Implementation;
using TwoFromTheCasketDatabase.Models;
using NUnit.Framework;
using TwoFromTheCasketContratcs.StorageContracts;
namespace TwoFromTheCasketTest.StoragesContractsTests
{
[TestFixture]
internal class OrderStorageContractTests : BaseStorageContractTest
{
private OrderStorageContract _orderStorageContract;
[SetUp]
public void SetUp()
{
_orderStorageContract = new OrderStorageContract(TwoFromTheCasketDbContext);
}
[TearDown]
public void TearDown()
{
TwoFromTheCasketDbContext.Database.ExecuteSqlRaw("TRUNCATE \"Orders\" CASCADE;");
}
[Test]
public void Try_GetList_WhenHaveRecords_Test()
{
var order = InsertOrderToDatabaseAndReturn(Guid.NewGuid().ToString());
InsertOrderToDatabaseAndReturn(Guid.NewGuid().ToString());
InsertOrderToDatabaseAndReturn(Guid.NewGuid().ToString());
var list = _orderStorageContract.GetList();
Assert.That(list, Is.Not.Null);
Assert.That(list, Has.Count.EqualTo(3));
AssertElement(list.First(x => x.Id == order.Id), order);
}
[Test]
public void Try_GetList_WhenNoRecords_Test()
{
var list = _orderStorageContract.GetList();
Assert.That(list, Is.Not.Null);
Assert.That(list, Is.Empty);
}
[Test]
public void Try_GetElementById_WhenHaveRecord_Test()
{
var service = InsertOrderToDatabaseAndReturn(Guid.NewGuid().ToString());
AssertElement(_orderStorageContract.GetElementById(service.Id), service);
}
[Test]
public void Try_GetElementByDate_WhenNoRecord_Test()
{
Assert.That(() => _orderStorageContract.GetElementByDate(DateTime.UtcNow), Is.Null);
}
[Test]
public void Try_GetElementByDate_WhenHaveRecord_Test()
{
var order = InsertOrderToDatabaseAndReturn(Guid.NewGuid().ToString(), DateTime.UtcNow);
InsertOrderToDatabaseAndReturn(Guid.NewGuid().ToString(), DateTime.UtcNow);
Assert.That(order, Is.Not.Null);
}
[Test]
public void Try_GetElementByStatus_WhenNoRecord_Test()
{
Assert.That(() => _orderStorageContract.GetElementByStatus(StatusType.None), Is.Null);
}
[Test]
public void Try_GetElementByStatus_WhenHaveRecord_Test()
{
var order = InsertOrderToDatabaseAndReturn(Guid.NewGuid().ToString(), DateTime.UtcNow, StatusType.None);
InsertOrderToDatabaseAndReturn(Guid.NewGuid().ToString(), DateTime.UtcNow, StatusType.None);
Assert.That(order, Is.Not.Null);
}
[Test]
public void Try_AddElement_Test()
{
var order = CreateModel(Guid.NewGuid().ToString());
_orderStorageContract.AddElement(order);
AssertElement(GetOrderFromDatabase(order.Id), order);
}
[Test]
public void Try_AddElement_WhenHaveRecordWithSameId_Test()
{
var order = CreateModel(Guid.NewGuid().ToString());
InsertOrderToDatabaseAndReturn(order.Id);
Assert.That(() => _orderStorageContract.AddElement(order), Throws.TypeOf<ElementExistsException>());
}
[Test]
public void Try_UpdElement_Test()
{
var order = CreateModel(Guid.NewGuid().ToString());
InsertOrderToDatabaseAndReturn(order.Id);
_orderStorageContract.UpdElement(order);
AssertElement(GetOrderFromDatabase(order.Id), order);
}
[Test]
public void Try_UpdElement_WhenNoRecordWithThisId_Test()
{
Assert.That(() => _orderStorageContract.UpdElement(CreateModel(Guid.NewGuid().ToString())),
Throws.TypeOf<ElementNotFoundException>());
}
[Test]
public void Try_DelElement_Test()
{
var order = InsertOrderToDatabaseAndReturn(Guid.NewGuid().ToString());
_orderStorageContract.DelElement(order.Id);
var element = GetOrderFromDatabase(order.Id);
Assert.That(element, Is.Null);
}
[Test]
public void Try_DelElement_WhenNoRecordWasDeleted_Test()
{
var order = CreateModel(Guid.NewGuid().ToString());
Assert.That(() => _orderStorageContract.DelElement(order.Id), Throws.TypeOf<ElementNotFoundException>());
}
[Test]
public void Try_DelElement_WhenNoRecordWithThisId_Test()
{
Assert.That(() => _orderStorageContract.DelElement(Guid.NewGuid().ToString()),
Throws.TypeOf<ElementNotFoundException>());
}
private Order InsertOrderToDatabaseAndReturn(string id, DateTime? date = null, StatusType? status = null, RoomType? roomType = null)
{
var order = new Order()
{
Id = id
};
TwoFromTheCasketDbContext.Orders.Add(order);
TwoFromTheCasketDbContext.SaveChanges();
return order;
}
private static void AssertElement(OrderDataModel? actual, Order expected)
{
Assert.That(actual, Is.Not.Null);
Assert.Multiple(() =>
{
Assert.That(actual.Id, Is.EqualTo(expected.Id));
Assert.That(actual.Status, Is.EqualTo(expected.Status));
Assert.That(actual.Date, Is.EqualTo(expected.Date));
Assert.That(actual.RoomType, Is.EqualTo(expected.RoomType));
});
}
private static OrderDataModel CreateModel(string id, DateTime? date = null, StatusType? status = null, RoomType? roomType = null) =>
new(id, date ?? DateTime.UtcNow, status ?? StatusType.None, roomType ?? RoomType.None);
private Order? GetOrderFromDatabase(string id) => TwoFromTheCasketDbContext.Orders.FirstOrDefault(x => x.Id == id);
private static void AssertElement(Order? actual, OrderDataModel expected)
{
Assert.That(actual, Is.Not.Null);
Assert.Multiple(() =>
{
Assert.That(actual.Id, Is.EqualTo(expected.Id));
Assert.That(actual.Status, Is.EqualTo(expected.Status));
Assert.That(actual.Date, Is.EqualTo(expected.Date));
Assert.That(actual.RoomType, Is.EqualTo(expected.RoomType));
});
}
}
}

View File

@@ -0,0 +1,319 @@
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TwoFromTheCasketContratcs.DataModels;
using TwoFromTheCasketContratcs.Enums;
using TwoFromTheCasketContratcs.Exceptions;
using TwoFromTheCasketDatabase.Implementation;
using TwoFromTheCasketDatabase.Models;
namespace TwoFromTheCasketTest.StoragesContractsTests;
[TestFixture]
internal class PostStorageContractTests : BaseStorageContractTest
{
private PostStorageContract _postStorageContract;
[SetUp]
public void SetUp()
{
_postStorageContract = new PostStorageContract(TwoFromTheCasketDbContext);
}
[TearDown]
public void TearDown()
{
TwoFromTheCasketDbContext.Database.ExecuteSqlRaw("TRUNCATE \"Posts\" CASCADE;");
}
[Test]
public void Try_GetList_WhenHaveRecords_Test()
{
var post = InsertPostToDatabaseAndReturn(Guid.NewGuid().ToString(), "name 1");
InsertPostToDatabaseAndReturn(Guid.NewGuid().ToString(), "name 2");
InsertPostToDatabaseAndReturn(Guid.NewGuid().ToString(), "name 3");
var list = _postStorageContract.GetList();
Assert.That(list, Is.Not.Null);
Assert.That(list, Has.Count.EqualTo(3));
AssertElement(list.First(x => x.Id == post.Id), post);
}
[Test]
public void Try_GetList_WhenNoRecords_Test()
{
var list = _postStorageContract.GetList();
Assert.That(list, Is.Not.Null);
Assert.That(list, Is.Empty);
}
[Test]
public void Try_GetList_OnlyActual_Test()
{
InsertPostToDatabaseAndReturn(Guid.NewGuid().ToString(), "name 1", isActual: true);
InsertPostToDatabaseAndReturn(Guid.NewGuid().ToString(), "name 2", isActual: true);
InsertPostToDatabaseAndReturn(Guid.NewGuid().ToString(), "name 3", isActual: false);
var list = _postStorageContract.GetList(onlyActual: true);
Assert.That(list, Is.Not.Null);
Assert.Multiple(() =>
{
Assert.That(list, Has.Count.EqualTo(2));
Assert.That(!list.Any(x => !x.IsActual));
});
}
[Test]
public void Try_GetList_IncludeNoActual_Test()
{
InsertPostToDatabaseAndReturn(Guid.NewGuid().ToString(), "name 1", isActual: true);
InsertPostToDatabaseAndReturn(Guid.NewGuid().ToString(), "name 2", isActual: true);
InsertPostToDatabaseAndReturn(Guid.NewGuid().ToString(), "name 3", isActual: false);
var list = _postStorageContract.GetList(onlyActual: false);
Assert.That(list, Is.Not.Null);
Assert.Multiple(() =>
{
Assert.That(list, Has.Count.EqualTo(3));
Assert.That(list.Count(x => x.IsActual), Is.EqualTo(2));
Assert.That(list.Count(x => !x.IsActual), Is.EqualTo(1));
});
}
[Test]
public void Try_GetPostWithHistory_WhenHaveRecords_Test()
{
var postId = Guid.NewGuid().ToString();
InsertPostToDatabaseAndReturn(Guid.NewGuid().ToString(), "name 1", isActual: true);
InsertPostToDatabaseAndReturn(postId, "name 2", isActual: true);
InsertPostToDatabaseAndReturn(postId, "name 2", isActual: false);
var list = _postStorageContract.GetPostWithHistory(postId);
Assert.That(list, Is.Not.Null);
Assert.That(list, Has.Count.EqualTo(2));
}
[Test]
public void Try_GetElementById_WhenHaveRecord_Test()
{
var post = InsertPostToDatabaseAndReturn(Guid.NewGuid().ToString());
AssertElement(_postStorageContract.GetElementById(post.PostId), post);
}
[Test]
public void Try_GetElementById_WhenNoRecord_Test()
{
InsertPostToDatabaseAndReturn(Guid.NewGuid().ToString());
Assert.That(() => _postStorageContract.GetElementById(Guid.NewGuid().ToString()), Is.Null);
}
[Test]
public void Try_GetElementById_WhenRecordHasDeleted_Test()
{
var post = InsertPostToDatabaseAndReturn(Guid.NewGuid().ToString(), isActual: false);
Assert.That(() => _postStorageContract.GetElementById(post.PostId), Is.Null);
}
[Test]
public void Try_GetElementById_WhenTrySearchById_Test()
{
var post = InsertPostToDatabaseAndReturn(Guid.NewGuid().ToString());
Assert.That(() => _postStorageContract.GetElementById(post.Id), Is.Null);
}
[Test]
public void Try_GetElementByName_WhenHaveRecord_Test()
{
var post = InsertPostToDatabaseAndReturn(Guid.NewGuid().ToString());
AssertElement(_postStorageContract.GetElementByName(post.PostName), post);
}
[Test]
public void Try_GetElementByName_WhenNoRecord_Test()
{
InsertPostToDatabaseAndReturn(Guid.NewGuid().ToString());
Assert.That(() => _postStorageContract.GetElementByName("name"), Is.Null);
}
[Test]
public void Try_GetElementByName_WhenRecordHasDeleted_Test()
{
var post = InsertPostToDatabaseAndReturn(Guid.NewGuid().ToString(), isActual: false);
Assert.That(() => _postStorageContract.GetElementById(post.PostName), Is.Null);
}
[Test]
public void Try_AddElement_Test()
{
var post = CreateModel(Guid.NewGuid().ToString(), isActual: true);
_postStorageContract.AddElement(post);
AssertElement(GetPostFromDatabaseByPostId(post.Id), post);
}
[Test]
public void Try_AddElement_WhenActualIsFalse_Test()
{
var post = CreateModel(Guid.NewGuid().ToString(), isActual: false);
Assert.That(() => _postStorageContract.AddElement(post), Throws.Nothing);
AssertElement(GetPostFromDatabaseByPostId(post.Id), CreateModel(post.Id, isActual: true));
}
[Test]
public void Try_AddElement_WhenHaveRecordWithSameName_Test()
{
var post = CreateModel(Guid.NewGuid().ToString(), "name unique", isActual: true);
InsertPostToDatabaseAndReturn(Guid.NewGuid().ToString(), postName: post.PostName, isActual: true);
Assert.That(() => _postStorageContract.AddElement(post), Throws.TypeOf<ElementExistsException>());
}
[Test]
public void Try_AddElement_WhenHaveRecordWithSamePostIdAndActualIsTrue_Test()
{
var post = CreateModel(Guid.NewGuid().ToString(), isActual: true);
InsertPostToDatabaseAndReturn(post.Id, isActual: true);
Assert.That(() => _postStorageContract.AddElement(post), Throws.TypeOf<ElementExistsException>());
}
[Test]
public void Try_UpdElement_Test()
{
var post = CreateModel(Guid.NewGuid().ToString());
InsertPostToDatabaseAndReturn(post.Id, isActual: true);
_postStorageContract.UpdElement(post);
var posts = TwoFromTheCasketDbContext.Posts.Where(x => x.PostId == post.Id).OrderByDescending(x => x.ChangeDate);
Assert.That(posts.Count(), Is.EqualTo(2));
AssertElement(posts.First(), CreateModel(post.Id, isActual: true));
AssertElement(posts.Last(), CreateModel(post.Id, isActual: false));
}
[Test]
public void Try_UpdElement_WhenActualIsFalse_Test()
{
var post = CreateModel(Guid.NewGuid().ToString(), isActual: false);
InsertPostToDatabaseAndReturn(post.Id, isActual: true);
_postStorageContract.UpdElement(post);
AssertElement(GetPostFromDatabaseByPostId(post.Id), CreateModel(post.Id, isActual: true));
}
[Test]
public void Try_UpdElement_WhenNoRecordWithThisId_Test()
{
Assert.That(() => _postStorageContract.UpdElement(CreateModel(Guid.NewGuid().ToString())),
Throws.TypeOf<ElementNotFoundException>());
}
[Test]
public void Try_UpdElement_WhenHaveRecordWithSameName_Test()
{
var post = CreateModel(Guid.NewGuid().ToString(), "New Name");
InsertPostToDatabaseAndReturn(post.Id, postName: "name");
InsertPostToDatabaseAndReturn(Guid.NewGuid().ToString(), postName: post.PostName);
Assert.That(() => _postStorageContract.UpdElement(post), Throws.TypeOf<ElementExistsException>());
}
[Test]
public void Try_UpdElement_WhenRecordWasDeleted_Test()
{
var post = CreateModel(Guid.NewGuid().ToString());
InsertPostToDatabaseAndReturn(post.Id, isActual: false);
Assert.That(() => _postStorageContract.UpdElement(post), Throws.TypeOf<ElementDeletedException>());
}
[Test]
public void Try_DelElement_Test()
{
var post = InsertPostToDatabaseAndReturn(Guid.NewGuid().ToString(), isActual: true);
_postStorageContract.DelElement(post.PostId);
var element = GetPostFromDatabaseByPostId(post.PostId);
Assert.Multiple(() =>
{
Assert.That(element, Is.Not.Null);
Assert.That(!element!.IsActual);
});
}
[Test]
public void Try_DelElement_WhenNoRecordWithThisId_Test()
{
Assert.That(() => _postStorageContract.DelElement(Guid.NewGuid().ToString()),
Throws.TypeOf<ElementNotFoundException>());
}
[Test]
public void Try_DelElement_WhenRecordWasDeleted_Test()
{
var post = InsertPostToDatabaseAndReturn(Guid.NewGuid().ToString(), isActual: false);
Assert.That(() => _postStorageContract.DelElement(post.PostId), Throws.TypeOf<ElementDeletedException>());
}
[Test]
public void Try_ResElement_Test()
{
var post = InsertPostToDatabaseAndReturn(Guid.NewGuid().ToString(), isActual: false);
_postStorageContract.ResElement(post.PostId);
var element = GetPostFromDatabaseByPostId(post.PostId);
Assert.Multiple(() =>
{
Assert.That(element, Is.Not.Null);
Assert.That(element!.IsActual);
});
}
[Test]
public void Try_ResElement_WhenNoRecordWithThisId_Test()
{
Assert.That(() => _postStorageContract.ResElement(Guid.NewGuid().ToString()),
Throws.TypeOf<ElementNotFoundException>());
}
[Test]
public void Try_ResElement_WhenRecordNotWasDeleted_Test()
{
var post = InsertPostToDatabaseAndReturn(Guid.NewGuid().ToString(), isActual: true);
Assert.That(() => _postStorageContract.ResElement(post.PostId), Throws.Nothing);
}
private Post InsertPostToDatabaseAndReturn(string id, string postName = "test",
PostType postType = PostType.None, double salary = 10, bool isActual = true, DateTime? changeDate = null)
{
var post = new Post()
{
Id = Guid.NewGuid().ToString(),
PostId = id,
PostName = postName,
PostType = postType,
Salary = salary,
IsActual = isActual,
ChangeDate = changeDate ?? DateTime.UtcNow
};
TwoFromTheCasketDbContext.Posts.Add(post);
TwoFromTheCasketDbContext.SaveChanges();
return post;
}
private static void AssertElement(PostDataModel? actual, Post expected)
{
Assert.That(actual, Is.Not.Null);
Assert.Multiple(() =>
{
Assert.That(actual.Id, Is.EqualTo(expected.Id));
Assert.That(actual.PostName, Is.EqualTo(expected.PostName));
Assert.That(actual.PostType, Is.EqualTo(expected.PostType));
Assert.That(actual.Salary, Is.EqualTo(expected.Salary));
Assert.That(actual.IsActual, Is.EqualTo(expected.IsActual));
});
}
private static PostDataModel CreateModel(string postId, string postName = "test",
PostType postType = PostType.None, double salary = 10, bool isActual = false, DateTime? changeDate = null)
=> new(postId, postName, postType, salary, isActual, changeDate ?? DateTime.UtcNow);
private Post? GetPostFromDatabaseByPostId(string id) => TwoFromTheCasketDbContext.Posts.Where(x => x.PostId == id)
.OrderByDescending(x => x.ChangeDate).FirstOrDefault();
private static void AssertElement(Post? actual, PostDataModel expected)
{
Assert.That(actual, Is.Not.Null);
Assert.Multiple(() =>
{
Assert.That(actual.PostId, Is.EqualTo(expected.Id));
Assert.That(actual.PostName, Is.EqualTo(expected.PostName));
Assert.That(actual.PostType, Is.EqualTo(expected.PostType));
Assert.That(actual.Salary, Is.EqualTo(expected.Salary));
Assert.That(actual.IsActual, Is.EqualTo(expected.IsActual));
});
}
}

View File

@@ -0,0 +1,157 @@
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TwoFromTheCasketContratcs.DataModels;
using TwoFromTheCasketDatabase;
using TwoFromTheCasketDatabase.Implementation;
using TwoFromTheCasketDatabase.Models;
namespace TwoFromTheCasketTest.StoragesContractsTests;
[TestFixture]
internal class SalaryStorageContractTests : BaseStorageContractTest
{
private SalaryStorageContract _salaryStorageContract;
private Master _master;
[SetUp]
public void SetUp()
{
_salaryStorageContract = new SalaryStorageContract(TwoFromTheCasketDbContext);
_master = InsertMasterToDatabaseAndReturn();
}
[TearDown]
public void TearDown()
{
TwoFromTheCasketDbContext.Database.ExecuteSqlRaw("TRUNCATE \"Salaries\" CASCADE;");
TwoFromTheCasketDbContext.Database.ExecuteSqlRaw("TRUNCATE \"Masters\" CASCADE;");
}
[Test]
public void Try_GetList_WhenHaveRecords_Test()
{
var masterId = Guid.NewGuid().ToString();
var salary = InsertSalaryToDatabaseAndReturn(masterId, salarySize: 100);
InsertSalaryToDatabaseAndReturn(masterId);
InsertSalaryToDatabaseAndReturn(masterId);
var list = _salaryStorageContract.GetList(DateTime.UtcNow.AddDays(-10), DateTime.UtcNow.AddDays(10));
Assert.That(list, Is.Not.Null);
Assert.That(list, Has.Count.EqualTo(3));
AssertElement(list.First(), salary);
}
[Test]
public void Try_GetList_WhenNoRecords_Test()
{
var list = _salaryStorageContract.GetList(DateTime.UtcNow.AddDays(-10), DateTime.UtcNow.AddDays(10));
Assert.That(list, Is.Not.Null);
Assert.That(list, Is.Empty);
}
[Test]
public void Try_GetList_OnlyInDatePeriod_Test()
{
InsertSalaryToDatabaseAndReturn(_master.Id, salaryDate: DateTime.UtcNow.AddDays(-2));
InsertSalaryToDatabaseAndReturn(_master.Id, salaryDate: DateTime.UtcNow.AddDays(-1).AddMinutes(-5));
InsertSalaryToDatabaseAndReturn(_master.Id, salaryDate: DateTime.UtcNow.AddDays(-1).AddMinutes(5));
InsertSalaryToDatabaseAndReturn(_master.Id, salaryDate: DateTime.UtcNow.AddDays(1).AddMinutes(-5));
InsertSalaryToDatabaseAndReturn(_master.Id, salaryDate: DateTime.UtcNow.AddDays(1).AddMinutes(5));
InsertSalaryToDatabaseAndReturn(_master.Id, salaryDate: DateTime.UtcNow.AddDays(-2));
var list = _salaryStorageContract.GetList(DateTime.UtcNow.AddDays(-1), DateTime.UtcNow.AddDays(1));
Assert.That(list, Is.Not.Null);
Assert.Multiple(() => { Assert.That(list, Has.Count.EqualTo(2)); });
}
[Test]
public void Try_GetList_ByMaster_Test()
{
var master = InsertMasterToDatabaseAndReturn(Guid.NewGuid().ToString());
InsertSalaryToDatabaseAndReturn(_master.Id);
InsertSalaryToDatabaseAndReturn(_master.Id);
InsertSalaryToDatabaseAndReturn(master.Id);
var list = _salaryStorageContract.GetList(DateTime.UtcNow.AddDays(-1), DateTime.UtcNow.AddDays(1), _master.Id);
Assert.That(list, Is.Not.Null);
Assert.Multiple(() =>
{
Assert.That(list, Has.Count.EqualTo(2));
Assert.That(list.All(x => x.MasterId == _master.Id));
});
}
[Test]
public void Try_GetList_ByMasterOnlyInDatePeriod_Test()
{
var master = InsertMasterToDatabaseAndReturn(Guid.NewGuid().ToString());
InsertSalaryToDatabaseAndReturn(_master.Id, salaryDate: DateTime.UtcNow.AddDays(-2));
InsertSalaryToDatabaseAndReturn(_master.Id, salaryDate: DateTime.UtcNow.AddDays(-1).AddMinutes(5));
InsertSalaryToDatabaseAndReturn(master.Id, salaryDate: DateTime.UtcNow.AddDays(-1).AddMinutes(5));
InsertSalaryToDatabaseAndReturn(_master.Id, salaryDate: DateTime.UtcNow.AddDays(1).AddMinutes(-5));
InsertSalaryToDatabaseAndReturn(master.Id, salaryDate: DateTime.UtcNow.AddDays(1).AddMinutes(-5));
InsertSalaryToDatabaseAndReturn(_master.Id, salaryDate: DateTime.UtcNow.AddDays(-2));
var list = _salaryStorageContract.GetList(DateTime.UtcNow.AddDays(-1), DateTime.UtcNow.AddDays(1), _master.Id);
Assert.That(list, Is.Not.Null);
Assert.Multiple(() =>
{
Assert.That(list, Has.Count.EqualTo(2));
Assert.That(list.All(x => x.MasterId == _master.Id));
});
}
[Test]
public void Try_AddElement_Test()
{
var salary = CreateModel(_master.Id);
_salaryStorageContract.AddElement(salary);
AssertElement(GetSalaryFromDatabaseByMasterId(_master.Id), salary);
}
private Master InsertMasterToDatabaseAndReturn(string masterFIO = "fio fio fio")
{
var master = new Master()
{
Id = Guid.NewGuid().ToString(),
PostId = Guid.NewGuid().ToString(),
FIO = masterFIO,
IsDeleted = false
};
TwoFromTheCasketDbContext.Masters.Add(master);
TwoFromTheCasketDbContext.SaveChanges();
return master;
}
private Salary InsertSalaryToDatabaseAndReturn(string masterId, double salarySize = 1,
DateTime? salaryDate = null)
{
var salary = new Salary()
{ MasterId = masterId, SalarySize = salarySize, SalaryDate = salaryDate ?? DateTime.UtcNow };
TwoFromTheCasketDbContext.Salaries.Add(salary);
TwoFromTheCasketDbContext.SaveChanges();
return salary;
}
private static void AssertElement(SalaryDataModel? actual, Salary expected)
{
Assert.That(actual, Is.Not.Null);
Assert.Multiple(() =>
{
Assert.That(actual.MasterId, Is.EqualTo(expected.MasterId));
Assert.That(actual.Salary, Is.EqualTo(expected.SalarySize));
});
}
private static SalaryDataModel CreateModel(string workerId, DateTime? salaryDate = null, double workerSalary = 1,double salarySize = 1) => new(workerId,
salaryDate ?? DateTime.UtcNow, workerSalary, salarySize);
private Salary? GetSalaryFromDatabaseByMasterId(string id) =>
TwoFromTheCasketDbContext.Salaries.FirstOrDefault(x => x.MasterId == id);
private static void AssertElement(Salary? actual, SalaryDataModel expected)
{
Assert.That(actual, Is.Not.Null);
Assert.Multiple(() =>
{
Assert.That(actual.MasterId, Is.EqualTo(expected.MasterId));
Assert.That(actual.SalarySize, Is.EqualTo(expected.Salary));
});
}
}

View File

@@ -0,0 +1,208 @@
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TwoFromTheCasketContratcs.DataModels;
using TwoFromTheCasketContratcs.Enums;
using TwoFromTheCasketContratcs.Exceptions;
using TwoFromTheCasketContratcs.StorageContracts;
using TwoFromTheCasketDatabase.Implementation;
using TwoFromTheCasketDatabase.Models;
namespace TwoFromTheCasketTest.StoragesContractsTests;
[TestFixture]
internal class ServiceStorageContractTests : BaseStorageContractTest
{
private ServiceStorageContract _serviceStorageContract;
[SetUp]
public void SetUp()
{
_serviceStorageContract = new ServiceStorageContract(TwoFromTheCasketDbContext);
}
[TearDown]
public void TearDown()
{
TwoFromTheCasketDbContext.Database.ExecuteSqlRaw("TRUNCATE \"Services\" CASCADE;");
}
[Test]
public void Try_GetList_WhenHaveRecords_Test()
{
var service =
InsertServiceToDatabaseAndReturn(Guid.NewGuid().ToString(), "fio 1");
InsertServiceToDatabaseAndReturn(Guid.NewGuid().ToString(), "fio 2");
InsertServiceToDatabaseAndReturn(Guid.NewGuid().ToString(), "fio 3");
var list = _serviceStorageContract.GetList();
Assert.That(list, Is.Not.Null);
Assert.That(list, Has.Count.EqualTo(3));
AssertElement(list.First(), service);
}
[Test]
public void Try_GetList_WhenNoRecords_Test()
{
var list = _serviceStorageContract.GetList();
Assert.That(list, Is.Not.Null);
Assert.That(list, Is.Empty);
}
[Test]
public void Try_GetElementById_WhenHaveRecord_Test()
{
var service = InsertServiceToDatabaseAndReturn(Guid.NewGuid().ToString());
AssertElement(_serviceStorageContract.GetElementById(service.Id), service);
}
[Test]
public void Try_GetElementById_WhenNoRecord_Test()
{
Assert.That(() => _serviceStorageContract.GetElementById(Guid.NewGuid().ToString()), Is.Null);
}
[Test]
public void Try_GetElementByMasterId_WhenHaveRecord_Test()
{
var masterId = Guid.NewGuid().ToString();
InsertServiceToDatabaseAndReturn(Guid.NewGuid().ToString(), "name 1", masterId);
InsertServiceToDatabaseAndReturn(Guid.NewGuid().ToString(), "name 2", masterId);
InsertServiceToDatabaseAndReturn(Guid.NewGuid().ToString(), "name 3", masterId);
var list = _serviceStorageContract.GetElementByMasterId(masterId);
Assert.That(list, Is.Not.Null);
Assert.That(list, Has.Count.EqualTo(3));
}
[Test]
public void Try_GetElementByMasterId_WhenNoRecords_Test()
{
var serviceId = Guid.NewGuid().ToString();
var list = _serviceStorageContract.GetElementByMasterId(serviceId);
Assert.That(list, Is.Not.Null);
Assert.That(list, Is.Empty);
}
[Test]
public void Try_GetElementByServiceName_WhenHaveRecord_Test()
{
var name = "name 1";
InsertServiceToDatabaseAndReturn(Guid.NewGuid().ToString(), "name 1");
InsertServiceToDatabaseAndReturn(Guid.NewGuid().ToString(), "name 2");
var list = _serviceStorageContract.GetElementByServiceName(name);
Assert.That(list, Is.Not.Null);
Assert.That(list, Has.Count.EqualTo(2));
}
[Test]
public void Try_GetElementByServiceName_WhenNoRecords_Test()
{
var name = "name 1";
var list = _serviceStorageContract.GetElementByMasterId(name);
Assert.That(list, Is.Not.Null);
Assert.That(list, Is.Empty);
}
[Test]
public void Try_GetServicetWithHistory_WhenHaveRecords_Test()
{
var serviceId = Guid.NewGuid().ToString();
InsertServiceToDatabaseAndReturn(Guid.NewGuid().ToString(), "name 1");
InsertServiceToDatabaseAndReturn(serviceId, "name 2");
var list = _serviceStorageContract.GetHistoryByServiceId(serviceId);
Assert.That(list, Is.Not.Null);
Assert.That(list, Has.Count.EqualTo(0));
}
[Test]
public void Try_AddElement_Test()
{
var service = CreateModel(Guid.NewGuid().ToString());
_serviceStorageContract.AddElement(service);
AssertElement(service, GetServiceFromDatabase(service.Id));
}
[Test]
public void Try_AddElement_WhenHaveRecordWithSameId_Test()
{
var service = CreateModel(Guid.NewGuid().ToString());
InsertServiceToDatabaseAndReturn(service.Id);
Assert.That(() => _serviceStorageContract.AddElement(service), Throws.TypeOf<ElementExistsException>());
}
[Test]
public void Try_UpdElement_Test()
{
var service = CreateModel(Guid.NewGuid().ToString(), "New Fio");
InsertServiceToDatabaseAndReturn(service.Id);
_serviceStorageContract.UpdElement(service);
AssertElement(service, GetServiceFromDatabase(service.Id));
}
[Test]
public void Try_UpdElement_WhenNoRecordWithThisId_Test()
{
Assert.That(() => _serviceStorageContract.UpdElement(CreateModel(Guid.NewGuid().ToString())),
Throws.TypeOf<ElementNotFoundException>());
}
[Test]
public void Try_UpdElement_WhenNoRecordWasDeleted_Test()
{
var service = CreateModel(Guid.NewGuid().ToString());
InsertServiceToDatabaseAndReturn(service.Id, isDeleted: true);
Assert.That(() => _serviceStorageContract.UpdElement(service), Throws.TypeOf<ElementNotFoundException>());
}
[Test]
public void Try_DelElement_Test()
{
var service = InsertServiceToDatabaseAndReturn(Guid.NewGuid().ToString(), "sads", Guid.NewGuid().ToString());
_serviceStorageContract.DelElement(service.Id);
var element = GetServiceFromDatabase(service.Id);
Assert.That(element, Is.Not.Null);
Assert.That(element.IsDeleted);
}
[Test]
public void Try_DelElement_WhenNoRecordWasDeleted_Test()
{
var master = CreateModel(Guid.NewGuid().ToString());
InsertServiceToDatabaseAndReturn(master.Id, isDeleted: true);
Assert.That(() => _serviceStorageContract.DelElement(master.Id), Throws.TypeOf<ElementNotFoundException>());
}
[Test]
public void Try_DelElement_WhenNoRecordWithThisId_Test()
{
Assert.That(() => _serviceStorageContract.DelElement(Guid.NewGuid().ToString()),
Throws.TypeOf<ElementNotFoundException>());
}
private Service InsertServiceToDatabaseAndReturn(string id, string serviceName = "test", string masterId = "id-1", ServiceType serviceType = ServiceType.Plastering, double price = 1, bool isDeleted = false)
{
var servise = new Service()
{
Id = id,
ServiceName = serviceName,
ServiceType = serviceType,
MasterId = masterId,
Price = price,
IsDeleted = isDeleted
};
TwoFromTheCasketDbContext.Services.Add(servise);
TwoFromTheCasketDbContext.SaveChanges();
return servise;
}
private Service? GetServiceFromDatabase(string id) => TwoFromTheCasketDbContext.Services.FirstOrDefault(x => x.Id == id);
private static void AssertElement(ServiceDataModel actual, Service expected)
{
Assert.That(actual, Is.Not.Null);
Assert.Multiple(() =>
{
Assert.That(actual.Id, Is.EqualTo(expected.Id));
Assert.That(actual.Price, Is.EqualTo(expected.Price));
Assert.That(actual.ServiceName, Is.EqualTo(expected.ServiceName));
Assert.That(actual.ServiceType, Is.EqualTo(expected.ServiceType));
Assert.That(actual.MasterId, Is.EqualTo(expected.MasterId));
Assert.That(actual.IsDeleted, Is.EqualTo(expected.IsDeleted));
});
}
private static ServiceDataModel CreateModel(string id, string serviceName = "test", string masterId = "id-1", ServiceType serviceType = ServiceType.Plastering, double price = 1, bool isDeleted = false) => new(id,serviceName, serviceType,masterId, price, isDeleted);
}

View File

@@ -11,13 +11,17 @@
<ItemGroup>
<PackageReference Include="coverlet.collector" Version="6.0.2" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.11.1" />
<PackageReference Include="Moq" Version="4.20.72" />
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="9.0.4" />
<PackageReference Include="NUnit" Version="4.2.2" />
<PackageReference Include="NUnit.Analyzers" Version="4.3.0" />
<PackageReference Include="NUnit3TestAdapter" Version="4.6.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\TwoFromTheCasketBuisnessLogic\TwoFromTheCasketBuisnessLogic.csproj" />
<ProjectReference Include="..\TwoFromTheCasketContratcs\TwoFromTheCasketContratcs.csproj" />
<ProjectReference Include="..\TwoFromTheCasketDatabase\TwoFromTheCasketDatabase.csproj" />
</ItemGroup>
<ItemGroup>