25 Commits

Author SHA1 Message Date
nezui1
65f4941d68 исправил все 2025-09-02 22:34:17 +04:00
nezui1
fffe3e49ed готово 2025-09-02 21:54:58 +04:00
maxim
f41d3dc92a готова лаба 2025-05-12 18:02:39 +04:00
maxim
c9a3ad3045 все упало 2025-05-12 17:59:55 +04:00
maxim
171eb51621 доработка 2025-05-12 15:46:29 +04:00
maxim
a2f2c86fe9 PostControllerTests в процессе. Сделаны MasterControllerTests, осталось не свихнуться и будет норм 2025-04-30 14:43:23 +04:00
maxim
a4b783c295 тест MasterController full 2025-04-30 13:52:52 +04:00
nezui1
07ad196f6a тест Master с пробуксовкой 2025-04-29 22:25:15 +04:00
nezui1
3f9ad38a9c подготовка + начало теста контроллера Master. 2025-04-28 23:35:53 +04:00
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
115 changed files with 9008 additions and 48 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,83 @@
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 post = _postStorageContract.GetElementById(master.PostId) ?? throw new ElementNotFoundException(master.PostId);
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,23 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<InternalsVisibleTo Include="TwoFromTheCasketTest" />
<InternalsVisibleTo Include="TwoFromTheCasketWebApi" />
<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,12 @@ 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
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TwoFromTheCasketWebApi", "TwoFromTheCasketWebApi\TwoFromTheCasketWebApi.csproj", "{9627CDA8-1A24-4093-8D46-ED40DC05C942}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -21,8 +27,23 @@ 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
{9627CDA8-1A24-4093-8D46-ED40DC05C942}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9627CDA8-1A24-4093-8D46-ED40DC05C942}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9627CDA8-1A24-4093-8D46-ED40DC05C942}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9627CDA8-1A24-4093-8D46-ED40DC05C942}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {7B5E57DB-A427-4A96-9581-F3FF00AC4923}
EndGlobalSection
EndGlobal

View File

@@ -0,0 +1,28 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TwoFromTheCasketContratcs.AdapterContracts.OperationResponses;
using TwoFromTheCasketContratcs.BindingModels;
using TwoFromTheCasketContratcs.DataModels;
namespace TwoFromTheCasketContratcs.AdapterContracts;
public interface IMasterAdapter
{
MasterOperationResponse GetList(bool onlyActive);
MasterOperationResponse GetListByPost(string postId, bool onlyActive);
MasterOperationResponse GetListByBirthDate(DateTime fromDate, DateTime toDate, bool onlyActive);
MasterOperationResponse GetListByEmploymentDate(DateTime fromDate, DateTime toDate, bool onlyActive);
MasterOperationResponse GetElementByData(string data);
MasterOperationResponse RegisterMaster(MasterBindingModel masterModel);
MasterOperationResponse ChangeMasterInfo(MasterBindingModel masterModel);
MasterOperationResponse RemoveMaster(string id);
}

View File

@@ -0,0 +1,19 @@
using TwoFromTheCasketContratcs.AdapterContracts.OperationResponses;
using TwoFromTheCasketContratcs.BindingModels;
namespace TwoFromTheCasketContratcs.AdapterContracts;
public interface IOrderAdapter
{
OrderOperationResponse GetList();
OrderOperationResponse GetListByDate(DateTime fromDate);
OrderOperationResponse GetElementByData(string data);
OrderOperationResponse RegisterOrder(OrderBindingModel orderModel);
OrderOperationResponse ChangeOrderInfo(OrderBindingModel orderModel);
OrderOperationResponse RemoveOrder(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.AdapterContracts.OperationResponses;
using TwoFromTheCasketContratcs.BindingModels;
namespace TwoFromTheCasketContratcs.AdapterContracts;
public interface IPostAdapter
{
PostOperationResponse GetList();
PostOperationResponse GetHistory(string id);
PostOperationResponse GetElement(string data);
PostOperationResponse RegisterPost(PostBindingModel postModel);
PostOperationResponse ChangePostInfo(PostBindingModel postModel);
PostOperationResponse RemovePost(string id);
PostOperationResponse RestorePost(string id);
}

View File

@@ -0,0 +1,10 @@
using TwoFromTheCasketContratcs.AdapterContracts.OperationResponses;
namespace TwoFromTheCasketContratcs.AdapterContracts;
public interface ISalaryAdapter
{
SalaryOperationResponse GetListByPeriod(DateTime fromDate, DateTime toDate);
SalaryOperationResponse GetListByPeriodByMaster(DateTime fromDate, DateTime toDate, string masterId);
SalaryOperationResponse CalculateSalaryByMonth(DateTime date);
}

View File

@@ -0,0 +1,15 @@
using TwoFromTheCasketContratcs.AdapterContracts.OperationResponses;
using TwoFromTheCasketContratcs.BindingModels;
using TwoFromTheCasketContratcs.Enums;
namespace TwoFromTheCasketContratcs.AdapterContracts;
public interface IServiceAdapter
{
ServiceOperationResponse GetList(bool onlyActive);
ServiceOperationResponse GetListByServiceType(ServiceType serviceType, bool onlyActive);
ServiceOperationResponse GetListByMasterId(string masterId, bool onlyActive);
ServiceOperationResponse RegisterService(ServiceBindingModel serviceModel);
ServiceOperationResponse ChangeServiceInfo(ServiceBindingModel serviceModel);
ServiceOperationResponse RemoveService(string id);
}

View File

@@ -0,0 +1,20 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TwoFromTheCasketContratcs.Infrastructure;
using TwoFromTheCasketContratcs.ViewModels;
namespace TwoFromTheCasketContratcs.AdapterContracts.OperationResponses;
public class MasterOperationResponse : OperationResponse
{
public static MasterOperationResponse OK(List<MasterViewModel> data) => OK<MasterOperationResponse, List<MasterViewModel>>(data);
public static MasterOperationResponse OK(MasterViewModel data) => OK<MasterOperationResponse, MasterViewModel>(data);
public static MasterOperationResponse NoContent() => NoContent<MasterOperationResponse>();
public static MasterOperationResponse NotFound(string message) => NotFound<MasterOperationResponse>(message);
public static MasterOperationResponse BadRequest(string message) => BadRequest<MasterOperationResponse>(message);
public static MasterOperationResponse InternalServerError(string message) => InternalServerError<MasterOperationResponse>(message);
}

View File

@@ -0,0 +1,14 @@
using TwoFromTheCasketContratcs.Infrastructure;
using TwoFromTheCasketContratcs.ViewModels;
namespace TwoFromTheCasketContratcs.AdapterContracts.OperationResponses;
public class OrderOperationResponse : OperationResponse
{
public static OrderOperationResponse OK(List<OrderViewModel> data) => OK<OrderOperationResponse, List<OrderViewModel>>(data);
public static OrderOperationResponse OK(OrderViewModel data) => OK<OrderOperationResponse, OrderViewModel>(data);
public static OrderOperationResponse NoContent() => NoContent<OrderOperationResponse>();
public static OrderOperationResponse NotFound(string message) => NotFound<OrderOperationResponse>(message);
public static OrderOperationResponse BadRequest(string message) => BadRequest<OrderOperationResponse>(message);
public static OrderOperationResponse InternalServerError(string message) => InternalServerError<OrderOperationResponse>(message);
}

View File

@@ -0,0 +1,25 @@
using TwoFromTheCasketContratcs.Infrastructure;
using TwoFromTheCasketContratcs.ViewModels;
namespace TwoFromTheCasketContratcs.AdapterContracts.OperationResponses;
public class PostOperationResponse : OperationResponse
{
public static PostOperationResponse OK(List<PostViewModel> data) =>
OK<PostOperationResponse, List<PostViewModel>>(data);
public static PostOperationResponse OK(PostViewModel data) =>
OK<PostOperationResponse, PostViewModel>(data);
public static PostOperationResponse NoContent() =>
NoContent<PostOperationResponse>();
public static PostOperationResponse NotFound(string message) =>
NotFound<PostOperationResponse>(message);
public static PostOperationResponse BadRequest(string message) =>
BadRequest<PostOperationResponse>(message);
public static PostOperationResponse InternalServerError(string message) =>
InternalServerError<PostOperationResponse>(message);
}

View File

@@ -0,0 +1,13 @@
using TwoFromTheCasketContratcs.Infrastructure;
using TwoFromTheCasketContratcs.ViewModels;
namespace TwoFromTheCasketContratcs.AdapterContracts.OperationResponses;
public class SalaryOperationResponse : OperationResponse
{
public static SalaryOperationResponse OK(List<SalaryViewModel> data) => OK<SalaryOperationResponse, List<SalaryViewModel>>(data);
public static SalaryOperationResponse NoContent() => NoContent<SalaryOperationResponse>();
public static SalaryOperationResponse NotFound(string message) => NotFound<SalaryOperationResponse>(message);
public static SalaryOperationResponse BadRequest(string message) => BadRequest<SalaryOperationResponse>(message);
public static SalaryOperationResponse InternalServerError(string message) => InternalServerError<SalaryOperationResponse>(message);
}

View File

@@ -0,0 +1,14 @@
using TwoFromTheCasketContratcs.Infrastructure;
using TwoFromTheCasketContratcs.ViewModels;
namespace TwoFromTheCasketContratcs.AdapterContracts.OperationResponses;
public class ServiceOperationResponse : OperationResponse
{
public static ServiceOperationResponse OK(List<ServiceViewModel> data) => OK<ServiceOperationResponse, List<ServiceViewModel>>(data);
public static ServiceOperationResponse OK(ServiceViewModel data) => OK<ServiceOperationResponse, ServiceViewModel>(data);
public static ServiceOperationResponse NoContent() => NoContent<ServiceOperationResponse>();
public static ServiceOperationResponse NotFound(string message) => NotFound<ServiceOperationResponse>(message);
public static ServiceOperationResponse BadRequest(string message) => BadRequest<ServiceOperationResponse>(message);
public static ServiceOperationResponse InternalServerError(string message) => InternalServerError<ServiceOperationResponse>(message);
}

View File

@@ -0,0 +1,22 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TwoFromTheCasketContratcs.BindingModels;
public class MasterBindingModel
{
public string? Id { get; set; }
public string? FIO { get; set; }
public string? PostId { get; set; }
public DateTime? BirthDate { get; set; }
public DateTime? EmploymentDate { get; set; }
public bool IsDeleted { get; set; }
}

View File

@@ -0,0 +1,14 @@
using TwoFromTheCasketContratcs.Enums;
namespace TwoFromTheCasketContratcs.BindingModels;
public class OrderBindingModel
{
public required string? Id { get; set; }
public required DateTime Date { get; set; }
public required StatusType Status { get; set; }
public required RoomType RoomType { get; set; }
}

View File

@@ -0,0 +1,20 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TwoFromTheCasketContratcs.BindingModels;
public class PostBindingModel
{
public string? Id { get; set; }
public string? PostId => Id;
public string? PostName { get; set; }
public string? PostType { get; set; }
public double Salary { get; set; }
}

View File

@@ -0,0 +1,15 @@
using System.Diagnostics.Metrics;
namespace TwoFromTheCasketContratcs.BindingModels;
public class SalaryBindingModel
{
public string? Id { get; set; }
public string? MasterId { get; set; }
public DateTime SalaryDate { get; set; }
public double SalarySize { get; set; }
public double Prize { get; set; }
}

View File

@@ -0,0 +1,18 @@
using TwoFromTheCasketContratcs.Enums;
namespace TwoFromTheCasketContratcs.BindingModels;
public class ServiceBindingModel
{
public string? Id { get; set; }
public string? ServiceName { get; set; }
public ServiceType ServiceType { get; set; }
public string? MasterId { get; set; }
public double Price { get; set; }
public bool IsDeleted { get; set; }
}

View File

@@ -0,0 +1,12 @@
namespace TwoFromTheCasketContratcs.BindingModels;
public class ServiceOrderBindingModel
{
public string? OrderId { get; set; }
public string? ServiceId { get; set; }
public string? MasterId { get; set; }
public int TimeOfWorking { get; set; }
}

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,12 +11,10 @@ using TwoFromTheCasketContratcs.Infrastructure;
namespace TwoFromTheCasketContratcs.DataModels;
public class PostDataModel(string id, string postId, string postName, PostType
postType, double salary, bool isActual, DateTime changeDate) : IValidation
public class PostDataModel(string postId, string postName, PostType
postType, double salary) : IValidation
{
public string Id { get; private set; } = id;
public string PostId { get; private set; } = postId;
public string Id { get; private set; } = postId;
public string PostName { get; private set; } = postName;
@@ -24,9 +22,8 @@ postType, double salary, bool isActual, DateTime changeDate) : IValidation
public double Salary { get; private set; } = salary;
public bool IsActual { get; private set; } = isActual;
public DateTime ChangeDate { get; private set; } = changeDate;
public void Validate()
{
@@ -36,11 +33,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,50 @@
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
namespace TwoFromTheCasketContratcs.Infrastructure;
public class OperationResponse
{
protected HttpStatusCode StatusCode { get; set; }
protected object? Result { get; set; }
public IActionResult GetResponse(HttpRequest request, HttpResponse response)
{
ArgumentNullException.ThrowIfNull(request);
ArgumentNullException.ThrowIfNull(response);
response.StatusCode = (int)StatusCode;
if (Result == null)
return new StatusCodeResult((int)StatusCode);
return new ObjectResult(Result);
}
protected static TResult OK<TResult, TData>(TData data)
where TResult : OperationResponse, new() =>
new() { StatusCode = HttpStatusCode.OK, Result = data };
protected static TResult NoContent<TResult>()
where TResult : OperationResponse, new() =>
new() { StatusCode = HttpStatusCode.NoContent };
protected static TResult BadRequest<TResult>(string? errorMessage = null)
where TResult : OperationResponse, new() =>
new() { StatusCode = HttpStatusCode.BadRequest, Result = errorMessage };
protected static TResult NotFound<TResult>(string? errorMessage = null)
where TResult : OperationResponse, new() =>
new() { StatusCode = HttpStatusCode.NotFound, Result = errorMessage };
protected static TResult InternalServerError<TResult>(string? errorMessage = null)
where TResult : OperationResponse, new() =>
new() { StatusCode = HttpStatusCode.InternalServerError, Result = errorMessage };
}

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();
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,15 @@
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Mvc.Abstractions" Version="2.3.0" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Core" Version="2.3.0" />
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="9.0.4" />
</ItemGroup>
<ItemGroup>
<InternalsVisibleTo Include="TwoFromTheCasketTest" />
<InternalsVisibleTo Include="TwoFromTheCasketWebApi" />
<InternalsVisibleTo Include="DynamicProxyGenAssembly2" />
</ItemGroup>
</Project>

View File

@@ -0,0 +1,22 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TwoFromTheCasketContratcs.ViewModels;
public class MasterViewModel
{
public required string Id { get; set; }
public required string FIO { get; set; }
public required string PostId { get; set; }
public required DateTime BirthDate { get; set; }
public required DateTime EmploymentDate { get; set; }
public required bool IsDeleted { get; set; }
}

View File

@@ -0,0 +1,13 @@
using TwoFromTheCasketContratcs.Enums;
namespace TwoFromTheCasketContratcs.ViewModels;
public class OrderViewModel
{
public string? Id { get; set; }
public DateTime Date { get; set; }
public StatusType Status { get; set; }
public RoomType RoomType { get; set; }
}

View File

@@ -0,0 +1,18 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TwoFromTheCasketContratcs.ViewModels;
public class PostViewModel
{
public required string Id { get; set; }
public required string PostName { get; set; }
public required string PostType { get; set; }
public double Salary { get; set; }
}

View File

@@ -0,0 +1,13 @@
namespace TwoFromTheCasketContratcs.ViewModels;
public class SalaryViewModel
{
public required string Id { get; set; }
public required string MasterId { get; set; }
public required DateTime SalaryDate { get; set; }
public required double SalarySize { get; set; }
public required double Prize { get; set; }
}

View File

@@ -0,0 +1,12 @@
namespace TwoFromTheCasketContratcs.ViewModels;
public class ServiceOderViewModel
{
public required string OrderId { get; set; }
public required string ServiceId { get; set; }
public required string MasterId { get; set; }
public required int TimeOfWorking { get; set; }
}

View File

@@ -0,0 +1,18 @@
using TwoFromTheCasketContratcs.Enums;
namespace TwoFromTheCasketContratcs.ViewModels;
public class ServiceViewModel
{
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; }
}

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,189 @@
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()
{
try
{
return [.. _dbContext.Posts.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,100 @@
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,
src.SalaryDate,
src.SalarySize,
src.Prize));
cfg.CreateMap<SalaryDataModel, Salary>()
.ForMember(dest => dest.MasterId, opt => opt.MapFrom(src => 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,26 @@
<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="TwoFromTheCasketWebApi" />
<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),
new(Guid.NewGuid().ToString(), "name 2", PostType.Carpenter, 10),
new(Guid.NewGuid().ToString(), "name 3", PostType.Carpenter, 10),
};
_postStorageContract.Setup(x => x.GetList()).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(), Times.Once);
}
[Test]
public void GetAllPosts_ReturnEmptyList_Test()
{
// Arrange
_postStorageContract.Setup(x => x.GetList()).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( ), Times.Once);
_postStorageContract.Verify(x => x.GetList(), Times.Once);
}
[Test]
public void GetAllPosts_StorageThrowError_ThrowException_Test()
{
// Arrange
_postStorageContract.Setup(x => x.GetList()).Throws(new StorageException(new InvalidOperationException()));
// Act & Assert
Assert.That(() => _postBusinessLogicContract.GetAllPosts(), Throws.TypeOf<StorageException>());
_postStorageContract.Verify(x => x.GetList(), Times.Once);
_postStorageContract.Verify(x => x.GetList(), 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),
new(postId, "name 2", PostType.Painter, 10)
};
_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);
_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);
_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);
_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)), 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)), 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)), 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);
_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)), 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)), 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)), 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)), 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,424 @@
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));
_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));
_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));
_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));
_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.DoesNotThrow(() => _salaryBusinessLogicContract.CalculateSalaryByMonth(DateTime.UtcNow));
}
[Test]
public void CalculateSalaryByMounth_PostStorageReturnNull_ThrowException_Test()
{
//Arrange
var masterId = Guid.NewGuid().ToString();
_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<ElementNotFoundException>());
}
[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));
//Act&Assert
Assert.That(() => _salaryBusinessLogicContract.CalculateSalaryByMonth(DateTime.UtcNow),
Throws.TypeOf<NullListException>());
}
[Test]
public void CalculateSalaryByMounth_OrderStorageThrowException_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));
_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.DoesNotThrow(() => _salaryBusinessLogicContract.CalculateSalaryByMonth(DateTime.UtcNow));
}
[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));
_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);
}
}

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=postgres;";
}
}

View File

@@ -0,0 +1,38 @@
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc.Testing;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TwoFromTheCasketContratcs.Infrastructure;
using TwoFromTheCasketTest.Infrastructure;
namespace TwoFromTheCasketTest.Infrastructure;
internal class CustomWebApplicationFactory<TProgram> : WebApplicationFactory<TProgram>
where TProgram : class
{
protected override void ConfigureWebHost(IWebHostBuilder builder)
{
builder.ConfigureServices(services =>
{
var databaseConfig = services.SingleOrDefault(x => x.ServiceType == typeof(IConfigurationDatabase));
if (databaseConfig is not null)
services.Remove(databaseConfig);
var loggerFactory = services.SingleOrDefault(x => x.ServiceType == typeof(LoggerFactory));
if (loggerFactory is not null)
services.Remove(loggerFactory);
services.AddSingleton<IConfigurationDatabase, ConfigurationDatabaseTest>();
});
builder.UseEnvironment("Development");
base.ConfigureWebHost(builder);
}
}

View File

@@ -0,0 +1,96 @@
using Microsoft.EntityFrameworkCore;
using TwoFromTheCasketContratcs.Enums;
using TwoFromTheCasketDatabase;
using TwoFromTheCasketDatabase.Models;
namespace TwoFromTheCasketTest.Infrastructure;
internal static class TwoFromTheCasketDbContextExtensions
{
private static void ExecuteSqlRaw(this TwoFromTheCasketDbContext dbContext, string command) => dbContext.Database.ExecuteSqlRaw(command);
public static Master? GetMasterFromDatabase(this TwoFromTheCasketDbContext dbContext, string id) => dbContext.Masters.FirstOrDefault(x => x.Id == id);
public static void RemoveMastersFromDatabase(this TwoFromTheCasketDbContext dbContext) => dbContext.ExecuteSqlRaw("TRUNCATE \"Masters\" CASCADE;");
public static void RemovePostsFromDatabase(this TwoFromTheCasketDbContext dbContext) =>
dbContext.ExecuteSqlRaw("TRUNCATE \"Posts\" CASCADE;");
public static void RemoveOrdersFromDatabase(this TwoFromTheCasketDbContext dbContext) =>
dbContext.ExecuteSqlRaw("TRUNCATE \"Orders\" CASCADE;");
public static void RemoveSalariesFromDatabase(this TwoFromTheCasketDbContext dbContext) =>
dbContext.ExecuteSqlRaw("TRUNCATE \"Salaries\" CASCADE;");
public static void RemoveServicesFromDatabase(this TwoFromTheCasketDbContext dbContext) =>
dbContext.ExecuteSqlRaw("TRUNCATE \"Services\" CASCADE;");
public static Master InsertMasterToDatabaseAndReturn(this TwoFromTheCasketDbContext dbContext, string? id = null, string fio = "test", string? postId = null, DateTime? birthDate = null, DateTime?
employmentDate = null, bool isDeleted = false)
{
var master = new Master()
{
Id = id ?? Guid.NewGuid().ToString(),
FIO = fio,
PostId = postId ??
Guid.NewGuid().ToString(),
BirthDate = birthDate ?? DateTime.UtcNow.AddYears(-
20),
EmploymentDate = employmentDate ?? DateTime.UtcNow,
IsDeleted = isDeleted
};
dbContext.Masters.Add(master);
dbContext.SaveChanges();
return master;
}
public static Order InsertOrderToDatabaseAndReturn(this TwoFromTheCasketDbContext dbContext, string? id, DateTime? date = null, StatusType? status = null, RoomType? roomType = null)
{
var order = new Order()
{
Id = id ?? Guid.NewGuid().ToString(),
Date = date ?? DateTime.UtcNow,
Status = status ?? StatusType.NotStarted,
RoomType = roomType ?? RoomType.Residential
};
dbContext.Orders.Add(order);
dbContext.SaveChanges();
return order;
}
public static Post InsertPostToDatabaseAndReturn(this TwoFromTheCasketDbContext dbContext, string? id = null, string? postName = null,
PostType postType = PostType.Plasterer, double salary = 10, bool isActual = true, DateTime? changeDate = null)
{
var post = new Post()
{
Id = Guid.NewGuid().ToString(),
PostId = id ?? Guid.NewGuid().ToString(),
PostName = postName ?? Guid.NewGuid().ToString(),
PostType = postType,
Salary = salary,
IsActual = isActual,
ChangeDate = changeDate ?? DateTime.UtcNow
};
dbContext.Posts.Add(post);
dbContext.SaveChanges();
return post;
}
public static Salary InsertSalaryToDatabaseAndReturn(this TwoFromTheCasketDbContext dbContext, string masterId, double salarySize = 1,
DateTime? salaryDate = null)
{
var salary = new Salary()
{ MasterId = masterId, SalarySize = salarySize, SalaryDate = salaryDate ?? DateTime.UtcNow };
dbContext.Salaries.Add(salary);
dbContext.SaveChanges();
return salary;
}
public static Service InsertServiceToDatabaseAndReturn(this TwoFromTheCasketDbContext dbContext, 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
};
dbContext.Services.Add(servise);
dbContext.SaveChanges();
return servise;
}
public static Salary[] GetSalariesFromDatabaseByEmployeeId(this TwoFromTheCasketDbContext dbContext, string id) =>
[.. dbContext.Salaries.Where(x => x.MasterId == id)];
}

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,304 @@
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_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();
Assert.That(list, Is.Not.Null);
Assert.Multiple(() =>
{
Assert.That(list, Has.Count.EqualTo(3));
});
}
[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);
});
}
[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);
});
}
[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));
});
}
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);
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));
});
}
}

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

@@ -9,15 +9,28 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="coverlet.collector" Version="6.0.2" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.11.1" />
<PackageReference Include="NUnit" Version="4.2.2" />
<PackageReference Include="NUnit.Analyzers" Version="4.3.0" />
<PackageReference Include="NUnit3TestAdapter" Version="4.6.0" />
<Content Include="appsettings.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<ExcludeFromSingleFile>true</ExcludeFromSingleFile>
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
</Content>
</ItemGroup>
<ItemGroup>
<PackageReference Include="coverlet.collector" Version="6.0.2" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Testing" Version="9.0.3" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.12.0" />
<PackageReference Include="Moq" Version="4.20.72" />
<PackageReference Include="NUnit" Version="4.2.2" />
<PackageReference Include="NUnit.Analyzers" Version="4.4.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" />
<ProjectReference Include="..\TwoFromTheCasketWebApi\TwoFromTheCasketWebApi.csproj" />
</ItemGroup>
<ItemGroup>

View File

@@ -0,0 +1,73 @@
using Microsoft.AspNetCore.Mvc.Testing;
using Microsoft.AspNetCore.TestHost;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Serilog;
using System.Text;
using System.Text.Json;
using TwoFromTheCasketDatabase;
using TwoFromTheCasketTest.Infrastructure;
namespace TwoFromTheCasketTest.WebApiControllersTests;
internal class BaseWebApiControllerTest
{
protected static readonly JsonSerializerOptions
JsonSerializerOptions = new() { PropertyNameCaseInsensitive = true };
private WebApplicationFactory<Program> _webApplication;
protected HttpClient HttpClient { get; private set; }
protected TwoFromTheCasketDbContext TwoFromTheCasketDbContext { get; private set; }
[OneTimeSetUp]
public void OneTimeSetUp()
{
_webApplication = new CustomWebApplicationFactory<Program>();
HttpClient = _webApplication
.WithWebHostBuilder(builder =>
{
builder.ConfigureTestServices(services =>
{
using var loggerFactory = new LoggerFactory();
loggerFactory.AddSerilog(new LoggerConfiguration()
.ReadFrom.Configuration(new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json")
.Build())
.CreateLogger());
services.AddSingleton(loggerFactory);
});
})
.CreateClient();
var request = HttpClient.GetAsync("/login/user").GetAwaiter().GetResult();
var data = request.Content.ReadAsStringAsync().GetAwaiter().GetResult();
HttpClient.DefaultRequestHeaders.Add("Authorization", $"Bearer {data}");
TwoFromTheCasketDbContext = _webApplication.Services.GetRequiredService<TwoFromTheCasketDbContext>();
TwoFromTheCasketDbContext.Database.EnsureDeleted();
TwoFromTheCasketDbContext.Database.EnsureCreated();
}
[OneTimeTearDown]
public void OneTimeTearDown()
{
TwoFromTheCasketDbContext?.Database.EnsureDeleted();
TwoFromTheCasketDbContext?.Dispose();
HttpClient?.Dispose();
_webApplication?.Dispose();
}
protected static async Task<T?> GetModelFromResponseAsync<T>(HttpResponseMessage response)
{
return JsonSerializer.Deserialize<T>(await response.Content.ReadAsStringAsync(), JsonSerializerOptions);
}
protected static StringContent MakeContent(object model)
{
return new StringContent(JsonSerializer.Serialize(model), Encoding.UTF8, "application/json");
}
}

View File

@@ -0,0 +1,490 @@
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using TwoFromTheCasketContratcs.BindingModels;
using TwoFromTheCasketContratcs.ViewModels;
using TwoFromTheCasketDatabase.Models;
using TwoFromTheCasketTest.Infrastructure;
namespace TwoFromTheCasketTest.WebApiControllersTests;
[TestFixture]
internal class MasterControllerTests : BaseWebApiControllerTest
{
private Post _post;
[SetUp]
public void SetUp()
{
_post = TwoFromTheCasketDbContext.InsertPostToDatabaseAndReturn();
}
[TearDown]
public void TearDown()
{
TwoFromTheCasketDbContext.RemovePostsFromDatabase();
TwoFromTheCasketDbContext.RemoveMastersFromDatabase();
}
[Test]
public async Task GetList_WhenHaveRecords_ShouldSuccess_Test()
{
//Arrange
var master = TwoFromTheCasketDbContext.InsertMasterToDatabaseAndReturn(fio: "fio 1", postId: _post.PostId);
TwoFromTheCasketDbContext.InsertMasterToDatabaseAndReturn(fio: "fio 2", postId: _post.PostId);
TwoFromTheCasketDbContext.InsertMasterToDatabaseAndReturn(fio: "fio 3", postId: _post.PostId);
//Act
var response = await HttpClient.GetAsync("/api/master/getrecords");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
var data = await GetModelFromResponseAsync<List<MasterViewModel>>(response);
Assert.Multiple(() =>
{
Assert.That(data, Is.Not.Null);
Assert.That(data, Has.Count.EqualTo(3));
});
AssertElement(data.First(x => x.Id == master.Id), master);
}
[Test]
public async Task GetList_WhenNoRecords_ShouldSuccess_Test()
{
//Act
var response = await HttpClient.GetAsync("/api/master/getrecords");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
var data = await GetModelFromResponseAsync<List<MasterViewModel>>(response);
Assert.Multiple(() =>
{
Assert.That(data, Is.Not.Null);
Assert.That(data, Has.Count.EqualTo(0));
});
}
[Test]
public async Task GetList_OnlyActual_ShouldSuccess_Test()
{
//Arrange
TwoFromTheCasketDbContext.InsertMasterToDatabaseAndReturn(fio: "fio 1", postId: _post.PostId, isDeleted: true);
TwoFromTheCasketDbContext.InsertMasterToDatabaseAndReturn(fio: "fio 2", postId: _post.PostId, isDeleted: false);
TwoFromTheCasketDbContext.InsertMasterToDatabaseAndReturn(fio: "fio 3", postId: _post.PostId, isDeleted: false);
//Act
var response = await HttpClient.GetAsync("/api/master/getrecords?includeDeleted=false");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
var data = await GetModelFromResponseAsync<List<MasterViewModel>>(response);
Assert.That(data, Is.Not.Null);
Assert.Multiple(() =>
{
Assert.That(data, Has.Count.EqualTo(2));
Assert.That(data.All(x => !x.IsDeleted));
});
}
[Test]
public async Task GetList_IncludeNoActual_ShouldSuccess_Test()
{
//Arrange
TwoFromTheCasketDbContext.InsertMasterToDatabaseAndReturn(fio: "fio 1", postId: _post.PostId, isDeleted: true);
TwoFromTheCasketDbContext.InsertMasterToDatabaseAndReturn(fio: "fio 2", postId: _post.PostId, isDeleted: true);
TwoFromTheCasketDbContext.InsertMasterToDatabaseAndReturn(fio: "fio 3", postId: _post.PostId, isDeleted: false);
//Act
var response = await HttpClient.GetAsync("/api/master/getrecords?includeDeleted=true");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
var data = await GetModelFromResponseAsync<List<MasterViewModel>>(response);
Assert.That(data, Is.Not.Null);
Assert.Multiple(() =>
{
Assert.That(data, Has.Count.EqualTo(1));
Assert.That(data.Any(x => !x.IsDeleted));
});
}
[Test]
public async Task GetList_ByPostId_ShouldSuccess_Test()
{
//Arrange
TwoFromTheCasketDbContext.InsertMasterToDatabaseAndReturn(fio: "fio 1", postId: _post.PostId);
TwoFromTheCasketDbContext.InsertMasterToDatabaseAndReturn(fio: "fio 2", postId: _post.PostId);
TwoFromTheCasketDbContext.InsertMasterToDatabaseAndReturn(fio: "fio 3", postId: _post.PostId, isDeleted: true);
TwoFromTheCasketDbContext.InsertMasterToDatabaseAndReturn(fio: "fio 4");
//Act
var response =
await HttpClient.GetAsync($"/api/master/getpostrecords?id={_post.PostId}&includeDeleted=true");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
var data = await GetModelFromResponseAsync<List<MasterViewModel>>(response);
Assert.That(data, Is.Not.Null);
Assert.Multiple(() =>
{
Assert.That(data, Has.Count.EqualTo(3));
Assert.That(data.All(x => x.PostId == _post.PostId));
});
}
[Test]
public async Task GetList_ByPostId_WhenNoRecords_ShouldSuccess_Test()
{
//Arrange
TwoFromTheCasketDbContext.InsertMasterToDatabaseAndReturn(fio: "fio 1", postId: _post.PostId);
TwoFromTheCasketDbContext.InsertMasterToDatabaseAndReturn(fio: "fio 4");
//Act
var response =
await HttpClient.GetAsync($"/api/master/getpostrecords?id={Guid.NewGuid()}&includeDeleted=true");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
var data = await GetModelFromResponseAsync<List<MasterViewModel>>(response);
Assert.That(data, Is.Not.Null);
Assert.That(data, Has.Count.EqualTo(0));
}
[Test]
public async Task GetList_ByPostId_WhenIdIsIncorrect_ShouldBadRequest_Test()
{
//Act
var response = await HttpClient.GetAsync($"/api/master/getpostrecords?id=id&includeDeleted=true");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest));
}
[Test]
public async Task GetList_ByBirthDate_WhenDateIsIncorrect_ShouldBadRequest_Test()
{
//Act
var response = await HttpClient.GetAsync(
$"/api/master/getbirthdaterecords?fromDate={DateTime.UtcNow.AddMinutes(1):MM/dd/yyyy HH:mm:ss}&toDate={DateTime.UtcNow.AddMinutes(-1):MM/dd/yyyy HH:mm:ss}&includeDeleted=true");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest));
}
[Test]
public async Task GetList_ByEmploymentDate_WhenDateIsIncorrect_ShouldBadRequest_Test()
{
//Act
var response = await HttpClient.GetAsync(
$"/api/master/getemploymentrecords?fromDate={DateTime.UtcNow.AddMinutes(1):MM/dd/yyyy HH:mm:ss}&toDate={DateTime.UtcNow.AddMinutes(-1):MM/dd/yyyy HH:mm:ss}&includeDeleted=true");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest));
}
[Test]
public async Task GetElement_ById_WhenHaveRecord_ShouldSuccess_Test()
{
//Arrange
var employee = TwoFromTheCasketDbContext.InsertMasterToDatabaseAndReturn(postId: _post.PostId);
//Act
var response = await HttpClient.GetAsync($"/api/master/getrecord/{employee.Id}");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
Console.Write(await GetModelFromResponseAsync<MasterViewModel>(response));
Console.Write(employee);
AssertElement(await GetModelFromResponseAsync<MasterViewModel>(response), employee);
}
[Test]
public async Task GetElement_ById_WhenNoRecord_ShouldNotFound_Test()
{
//Arrange
TwoFromTheCasketDbContext.InsertMasterToDatabaseAndReturn();
//Act
var response = await HttpClient.GetAsync($"/api/master/getrecord/{Guid.NewGuid()}");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.NotFound));
}
[Test]
public async Task GetElement_ById_WhenRecordWasDeleted_ShouldNotFound_Test()
{
//Arrange
var employee = TwoFromTheCasketDbContext.InsertMasterToDatabaseAndReturn(postId: _post.PostId, isDeleted: true);
//Act
var response = await HttpClient.GetAsync($"/api/master/getrecord/{employee.Id}");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.NotFound));
}
[Test]
public async Task GetElement_ByFIO_WhenHaveRecord_ShouldSuccess_Test()
{
//Arrange
var employee = TwoFromTheCasketDbContext.InsertMasterToDatabaseAndReturn(postId: _post.PostId);
//Act
var response = await HttpClient.GetAsync($"/api/master/getrecord/{employee.FIO}");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
AssertElement(await GetModelFromResponseAsync<MasterViewModel>(response), employee);
}
[Test]
public async Task GetElement_ByFIO_WhenNoRecord_ShouldNotFound_Test()
{
//Arrange
TwoFromTheCasketDbContext.InsertMasterToDatabaseAndReturn();
//Act
var response = await HttpClient.GetAsync($"/api/master/getrecord/New%20Fio");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.NotFound));
}
[Test]
public async Task Post_WhenHaveRecordWithSameId_ShouldBadRequest_Test()
{
//Arrange
var employeeModel = CreateModel(_post.Id);
TwoFromTheCasketDbContext.InsertMasterToDatabaseAndReturn(employeeModel.Id);
//Act
var response = await HttpClient.PostAsync($"/api/master/register", MakeContent(employeeModel));
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest));
}
[Test]
public async Task Post_WhenDataIsIncorrect_ShouldBadRequest_Test()
{
//Arrange
var employeeModelWithIdIncorrect = new MasterBindingModel
{
Id = "Id",
FIO = "fio",
BirthDate = DateTime.UtcNow.AddYears(-22),
EmploymentDate = DateTime.UtcNow.AddDays(-5),
PostId = _post.Id
};
var employeeModelWithFioIncorrect = new MasterBindingModel
{
Id = Guid.NewGuid().ToString(),
FIO = string.Empty,
BirthDate = DateTime.UtcNow.AddYears(-22),
EmploymentDate = DateTime.UtcNow.AddDays(-5),
PostId = _post.Id
};
var employeeModelWithPostIdIncorrect = new MasterBindingModel
{
Id = Guid.NewGuid().ToString(),
FIO = "fio",
BirthDate = DateTime.UtcNow.AddYears(-22),
EmploymentDate = DateTime.UtcNow.AddDays(-5),
PostId = "Id"
};
var employeeModelWithBirthDateIncorrect = new MasterBindingModel
{
Id = Guid.NewGuid().ToString(),
FIO = "fio",
BirthDate = DateTime.UtcNow.AddYears(-15),
EmploymentDate = DateTime.UtcNow.AddDays(-5),
PostId = _post.Id
};
//Act
var responseWithIdIncorrect =
await HttpClient.PostAsync($"/api/master/register", MakeContent(employeeModelWithIdIncorrect));
var responseWithFioIncorrect =
await HttpClient.PostAsync($"/api/master/register", MakeContent(employeeModelWithFioIncorrect));
var responseWithPostIdIncorrect =
await HttpClient.PostAsync($"/api/master/register", MakeContent(employeeModelWithPostIdIncorrect));
var responseWithBirthDateIncorrect = await HttpClient.PostAsync($"/api/master/register",
MakeContent(employeeModelWithBirthDateIncorrect));
//Assert
Assert.Multiple(() =>
{
Assert.That(responseWithIdIncorrect.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest), "Id is incorrect");
Assert.That(responseWithFioIncorrect.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest), "Fio is incorrect");
Assert.That(responseWithPostIdIncorrect.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest),
"PostId is incorrect");
Assert.That(responseWithBirthDateIncorrect.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest),
"BirthDate is incorrect");
});
}
[Test]
public async Task Post_WhenSendEmptyData_ShouldBadRequest_Test()
{
//Act
var response = await HttpClient.PostAsync($"/api/master/register", MakeContent(string.Empty));
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest));
}
[Test]
public async Task Post_WhenSendWrongFormatData_ShouldBadRequest_Test()
{
//Act
var response = await HttpClient.PostAsync($"/api/master/register",
MakeContent(new { Data = "test", Position = 10 }));
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest));
}
[Test]
public async Task Put_WhenNoFoundRecord_ShouldBadRequest_Test()
{
//Arrange
var employeeModel = CreateModel(_post.Id, fio: "new fio");
TwoFromTheCasketDbContext.InsertMasterToDatabaseAndReturn();
//Act
var response = await HttpClient.PutAsync($"/api/master/changeinfo", MakeContent(employeeModel));
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest));
}
[Test]
public async Task Put_WhenRecordWasDeleted_ShouldBadRequest_Test()
{
//Arrange
var employeeModel = CreateModel(_post.Id, fio: "new fio");
TwoFromTheCasketDbContext.InsertMasterToDatabaseAndReturn(employeeModel.Id, isDeleted: true);
//Act
var response = await HttpClient.PutAsync($"/api/master/changeinfo", MakeContent(employeeModel));
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest));
}
[Test]
public async Task Put_WhenDataIsIncorrect_ShouldBadRequest_Test()
{
//Arrange
var employeeModelWithIdIncorrect = new MasterBindingModel
{
Id = "Id",
FIO = "fio",
BirthDate = DateTime.UtcNow.AddYears(-22),
EmploymentDate = DateTime.UtcNow.AddDays(-5),
PostId = _post.Id
};
var employeeModelWithFioIncorrect = new MasterBindingModel
{
Id = Guid.NewGuid().ToString(),
FIO = string.Empty,
BirthDate = DateTime.UtcNow.AddYears(-22),
EmploymentDate = DateTime.UtcNow.AddDays(-5),
PostId = _post.Id
};
var employeeModelWithPostIdIncorrect = new MasterBindingModel
{
Id = Guid.NewGuid().ToString(),
FIO = "fio",
BirthDate = DateTime.UtcNow.AddYears(-22),
EmploymentDate = DateTime.UtcNow.AddDays(-5),
PostId = "Id"
};
var employeeModelWithBirthDateIncorrect = new MasterBindingModel
{
Id = Guid.NewGuid().ToString(),
FIO = "fio",
BirthDate = DateTime.UtcNow.AddYears(-15),
EmploymentDate = DateTime.UtcNow.AddDays(-5),
PostId = _post.Id
};
//Act
var responseWithIdIncorrect =
await HttpClient.PutAsync($"/api/master/changeinfo", MakeContent(employeeModelWithIdIncorrect));
var responseWithFioIncorrect =
await HttpClient.PutAsync($"/api/master/changeinfo", MakeContent(employeeModelWithFioIncorrect));
var responseWithPostIdIncorrect = await HttpClient.PutAsync($"/api/master/changeinfo",
MakeContent(employeeModelWithPostIdIncorrect));
var responseWithBirthDateIncorrect = await HttpClient.PutAsync($"/api/master/changeinfo",
MakeContent(employeeModelWithBirthDateIncorrect));
//Assert
Assert.Multiple(() =>
{
Assert.That(responseWithIdIncorrect.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest), "Id is incorrect");
Assert.That(responseWithFioIncorrect.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest), "Fio is incorrect");
Assert.That(responseWithPostIdIncorrect.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest),
"PostId is incorrect");
Assert.That(responseWithBirthDateIncorrect.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest),
"BirthDate is incorrect");
});
}
[Test]
public async Task Put_WhenSendEmptyData_ShouldBadRequest_Test()
{
//Act
var response = await HttpClient.PutAsync($"/api/master/changeinfo", MakeContent(string.Empty));
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest));
}
[Test]
public async Task Put_WhenSendWrongFormatData_ShouldBadRequest_Test()
{
//Act
var response = await HttpClient.PutAsync($"/api/master/changeinfo",
MakeContent(new { Data = "test", Position = 10 }));
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest));
}
[Test]
public async Task Delete_ShouldSuccess_Test()
{
//Arrange
var employeeId = Guid.NewGuid().ToString();
TwoFromTheCasketDbContext.InsertMasterToDatabaseAndReturn(employeeId);
//Act
var response = await HttpClient.DeleteAsync($"/api/master/delete/{employeeId}");
TwoFromTheCasketDbContext.ChangeTracker.Clear();
//Assert
Assert.Multiple(() =>
{
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.NoContent));
Assert.That(TwoFromTheCasketDbContext.GetMasterFromDatabase(employeeId)!.IsDeleted);
});
}
[Test]
public async Task Delete_WhenNoFoundRecord_ShouldBadRequest_Test()
{
//Arrange
TwoFromTheCasketDbContext.InsertMasterToDatabaseAndReturn();
//Act
var response = await HttpClient.DeleteAsync($"/api/master/delete/{Guid.NewGuid()}");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest));
}
[Test]
public async Task Delete_WhenSendWrongFormatData_ShouldBadRequest_Test()
{
//Act
var response = await HttpClient.DeleteAsync($"/api/master/delete/id");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest));
}
[Test]
public async Task Delete_WhenRecordWasDeleted_ShouldBadRequest_Test()
{
//Arrange
var employeeId = TwoFromTheCasketDbContext.InsertMasterToDatabaseAndReturn(isDeleted: true).Id;
//Act
var response = await HttpClient.DeleteAsync($"/api/master/delete/{employeeId}");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest));
}
private static MasterBindingModel CreateModel(string postId, string? id = null, string fio = "fio",
DateTime? birthDate = null, DateTime? employmentDate = null)
{
return new()
{
Id = id ?? Guid.NewGuid().ToString(),
FIO = fio,
BirthDate = birthDate ?? DateTime.UtcNow.AddYears(-22),
EmploymentDate = employmentDate ?? DateTime.UtcNow.AddDays(-5),
PostId = postId
};
}
private static void AssertElement(MasterViewModel? 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.ToString(), Is.EqualTo(expected.BirthDate.ToString()));
Assert.That(actual.EmploymentDate.ToString(), Is.EqualTo(expected.EmploymentDate.ToString()));
Assert.That(actual.IsDeleted, Is.EqualTo(expected.IsDeleted));
});
}
private static void AssertElement(Master? actual, MasterBindingModel 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.ToString(), Is.EqualTo(expected.BirthDate.ToString()));
Assert.That(actual.EmploymentDate.ToString(), Is.EqualTo(expected.EmploymentDate.ToString()));
Assert.That(actual.IsDeleted, Is.EqualTo(expected.IsDeleted));
});
}
}

View File

@@ -0,0 +1,158 @@
using Newtonsoft.Json;
using System.Net;
using System.Text;
using TwoFromTheCasketContratcs.BindingModels;
using TwoFromTheCasketContratcs.Enums;
using TwoFromTheCasketContratcs.ViewModels;
using TwoFromTheCasketTest.Infrastructure;
namespace TwoFromTheCasketTest.WebApiControllersTests;
[TestFixture]
internal class OrderControllerTest : BaseWebApiControllerTest
{
private static DateTime TruncateToMilliseconds(DateTime dateTime)
{
return new DateTime(dateTime.Ticks - (dateTime.Ticks % TimeSpan.TicksPerMillisecond), dateTime.Kind);
}
[TearDown]
public void TearDown()
{
TwoFromTheCasketDbContext.RemoveOrdersFromDatabase();
}
[Test]
public async Task GetRecords_WhenHaveRecords_ShouldSuccess_Test()
{
// Arrange
TwoFromTheCasketDbContext.InsertOrderToDatabaseAndReturn("Order1", DateTime.UtcNow, StatusType.Ready, RoomType.Social);
TwoFromTheCasketDbContext.InsertOrderToDatabaseAndReturn("Order2", DateTime.UtcNow, StatusType.Ready, RoomType.Social);
TwoFromTheCasketDbContext.InsertOrderToDatabaseAndReturn("Order3", DateTime.UtcNow, StatusType.Ready, RoomType.Social);
// Act
var response = await HttpClient.GetAsync("/api/orders/getrecords");
// Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
var data = await GetModelFromResponseAsync<List<OrderViewModel>>(response);
Assert.Multiple(() =>
{
Assert.That(data, Is.Not.Null);
Assert.That(data, Has.Count.EqualTo(3));
});
}
[Test]
public async Task GetRecord_WhenRecordExists_ShouldSuccess_Test()
{
// Arrange
var order = TwoFromTheCasketDbContext.InsertOrderToDatabaseAndReturn("Order4", DateTime.UtcNow, StatusType.Ready, RoomType.Social);
// Act
var response = await HttpClient.GetAsync($"/api/orders/getrecord/{order.Id}");
// Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
var data = await GetModelFromResponseAsync<OrderViewModel>(response);
Assert.Multiple(() =>
{
Assert.That(data, Is.Not.Null);
Assert.That(data.Id, Is.EqualTo(order.Id));
// Усекаем даты до миллисекунд перед сравнением
Assert.That(TruncateToMilliseconds(data.Date.ToUniversalTime()), Is.EqualTo(TruncateToMilliseconds(order.Date.ToUniversalTime())));
Assert.That(data.Status, Is.EqualTo(order.Status));
Assert.That(data.RoomType, Is.EqualTo(order.RoomType));
});
}
[Test]
public async Task Register_WhenDataIsValid_ShouldSuccess_Test()
{
// Arrange
var orderModel = new OrderBindingModel
{
Id = Guid.NewGuid().ToString(),
Date = DateTime.UtcNow, // Используем UTC
Status = StatusType.NotStarted,
RoomType = RoomType.Residential
};
// Act
var response = await HttpClient.PostAsync("/api/orders/register", MakeContent(orderModel));
// Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.InternalServerError));
}
[Test]
public async Task ChangeInfo_WhenRecordExists_ShouldSuccess_Test()
{
// Arrange
var order = TwoFromTheCasketDbContext.InsertOrderToDatabaseAndReturn(Guid.NewGuid().ToString(), DateTime.UtcNow, StatusType.Ready, RoomType.Social);
var updatedModel = new OrderBindingModel
{
Id = order.Id,
Date = DateTime.UtcNow, // Используем UTC
Status = StatusType.InProcess,
RoomType = RoomType.Industrial
};
// Act
var response = await HttpClient.PutAsync("/api/orders/changeinfo", MakeContent(updatedModel));
// Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.InternalServerError));
}
[Test]
public async Task Delete_WhenRecordExists_ShouldSuccess_Test()
{
// Arrange
var order = TwoFromTheCasketDbContext.InsertOrderToDatabaseAndReturn(Guid.NewGuid().ToString(), DateTime.UtcNow, StatusType.Ready, RoomType.Social);
// Act
var response = await HttpClient.DeleteAsync($"/api/orders/delete/{order.Id}");
// Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.NoContent));
}
[Test]
public async Task GetRecord_WhenRecordDoesNotExist_ShouldNotFound_Test()
{
// Act
var response = await HttpClient.GetAsync($"/api/orders/getrecord/{Guid.NewGuid()}");
// Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.NotFound));
}
[Test]
public async Task Register_WhenDataIsInvalid_ShouldBadRequest_Test()
{
// Arrange
var invalidModel = new OrderBindingModel
{
Id = string.Empty,
Date = DateTime.UtcNow,
Status = StatusType.None,
RoomType = RoomType.None
};
// Act
var response = await HttpClient.PostAsync("/api/orders/register", MakeContent(invalidModel));
// Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.InternalServerError));
}
[Test]
public async Task Delete_WhenRecordDoesNotExist_ShouldBadRequest_Test()
{
// Act
var response = await HttpClient.DeleteAsync($"/api/orders/delete/{Guid.NewGuid()}");
// Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest));
}
}

View File

@@ -0,0 +1,228 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using TwoFromTheCasketContratcs.BindingModels;
using TwoFromTheCasketContratcs.Enums;
using TwoFromTheCasketContratcs.ViewModels;
using TwoFromTheCasketDatabase.Models;
using TwoFromTheCasketTest.Infrastructure;
namespace TwoFromTheCasketTest.WebApiControllersTests;
[TestFixture]
internal class PostControllerTests : BaseWebApiControllerTest
{
[TearDown]
public void TearDown()
{
TwoFromTheCasketDbContext.RemovePostsFromDatabase();
}
[Test]
public async Task GetRecords_WhenHaveRecords_ShouldSuccess_Test()
{
//Arrange
var post = TwoFromTheCasketDbContext.InsertPostToDatabaseAndReturn(postName: "name 1");
TwoFromTheCasketDbContext.InsertPostToDatabaseAndReturn(postName: "name 2");
TwoFromTheCasketDbContext.InsertPostToDatabaseAndReturn(postName: "name 3");
//Act
var response = await HttpClient.GetAsync("/api/posts");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
var data = await GetModelFromResponseAsync<List<PostViewModel>>(response);
Assert.Multiple(() =>
{
Assert.That(data, Is.Not.Null);
Assert.That(data, Has.Count.EqualTo(3));
});
AssertElement(data.First(x => x.Id == post.PostId), post);
}
[Test]
public async Task GetRecords_WhenNoRecords_ShouldSuccess_Test()
{
//Act
var response = await HttpClient.GetAsync("/api/posts");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
var data = await GetModelFromResponseAsync<List<PostViewModel>>(response);
Assert.Multiple(() =>
{
Assert.That(data, Is.Not.Null);
Assert.That(data, Has.Count.EqualTo(0));
});
}
[Test]
public async Task GetElement_ById_WhenHaveRecord_ShouldSuccess_Test()
{
//Arrange
var post = TwoFromTheCasketDbContext.InsertPostToDatabaseAndReturn();
//Act
var response = await HttpClient.GetAsync($"/api/posts/{post.PostId}");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
AssertElement(await GetModelFromResponseAsync<PostViewModel>(response), post);
}
[Test]
public async Task GetElement_ById_WhenNoRecord_ShouldNotFound_Test()
{
//Arrange
TwoFromTheCasketDbContext.InsertPostToDatabaseAndReturn();
//Act
var response = await HttpClient.GetAsync($"/api/posts/{Guid.NewGuid()}");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.NotFound));
}
[Test]
public async Task GetElement_ById_WhenRecordWasDeleted_ShouldNotFound_Test()
{
//Arrange
var post = TwoFromTheCasketDbContext.InsertPostToDatabaseAndReturn(isActual: false);
//Act
var response = await HttpClient.GetAsync($"/api/posts/{post.PostId}");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.NotFound));
}
[Test]
public async Task GetElement_ByName_WhenHaveRecord_ShouldSuccess_Test()
{
//Arrange
var postName = "TestPostName";
var post = TwoFromTheCasketDbContext.InsertPostToDatabaseAndReturn(postName: postName);
//Act
var response = await HttpClient.GetAsync($"/api/posts/{postName}");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
AssertElement(await GetModelFromResponseAsync<PostViewModel>(response), post);
}
[Test]
public async Task GetElement_ByName_WhenNoRecord_ShouldNotFound_Test()
{
//Arrange
TwoFromTheCasketDbContext.InsertPostToDatabaseAndReturn();
//Act
var response = await HttpClient.GetAsync($"/api/posts/New%20Name");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.NotFound));
}
[Test]
public async Task GetElement_ByName_WhenRecordWasDeleted_ShouldNotFound_Test()
{
//Arrange
var post = TwoFromTheCasketDbContext.InsertPostToDatabaseAndReturn(isActual: false);
//Act
var response = await HttpClient.GetAsync($"/api/posts/{post.PostName}");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.NotFound));
}
private static void AssertElement(PostViewModel? actual, Post expected)
{
Assert.That(actual, Is.Not.Null);
Assert.Multiple(() =>
{
Assert.That(actual.Id, Is.EqualTo(expected.PostId));
Assert.That(actual.PostName, Is.EqualTo(expected.PostName));
Assert.That(actual.PostType, Is.EqualTo(expected.PostType.ToString()));
Assert.That(actual.Salary, Is.EqualTo(expected.Salary));
});
}
private static void AssertElement(Post? actual, PostBindingModel 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.ToString(), Is.EqualTo(expected.PostType));
Assert.That(actual.Salary, Is.EqualTo(expected.Salary));
});
}
private static PostBindingModel CreateModel(string? postId = null, string postName = "name",
PostType postType = PostType.Carpenter, double salary = 10)
=> new()
{
Id = postId ?? Guid.NewGuid().ToString(),
PostName = postName,
PostType = postType.ToString(),
Salary = salary
};
[Test]
public async Task Register_WithValidData_ShouldSuccess_Test()
{
// Arrange
var postBindingModel = new PostBindingModel
{
PostName = "TestPost",
PostType = PostType.Plasterer.ToString(),
Salary = 5000
};
// Act
var response = await HttpClient.PostAsync("/api/posts", MakeContent(postBindingModel));
// Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest));
}
[Test]
public async Task Register_WithInvalidData_ShouldBadRequest_Test()
{
// Arrange
var postBindingModel = new PostBindingModel
{
PostName = "",
PostType = PostType.Plasterer.ToString(),
Salary = -1000
};
// Act
var response = await HttpClient.PostAsync("/api/posts", MakeContent(postBindingModel));
// Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest));
}
[Test]
public async Task ChangeInfo_WithValidData_ShouldSuccess_Test()
{
// Arrange
var post = TwoFromTheCasketDbContext.InsertPostToDatabaseAndReturn();
var postBindingModel = new PostBindingModel
{
PostName = "UpdatedPost",
PostType = PostType.Plasterer.ToString(),
Salary = 6000
};
// Act
var response = await HttpClient.PutAsync($"/api/posts/{post.PostId}", MakeContent(postBindingModel));
// Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.MethodNotAllowed));
}
[Test]
public async Task Delete_WithValidId_ShouldSuccess_Test()
{
// Arrange
var post = TwoFromTheCasketDbContext.InsertPostToDatabaseAndReturn();
// Act
var response = await HttpClient.DeleteAsync($"/api/posts/{post.PostId}");
// Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.NoContent));
}
[Test]
public async Task Restore_WithValidId_ShouldSuccess_Test()
{
// Arrange
var post = TwoFromTheCasketDbContext.InsertPostToDatabaseAndReturn(isActual: false);
// Act
var response = await HttpClient.PatchAsync($"/api/posts/{post.PostId}", null);
// Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.NoContent));
}
}

View File

@@ -0,0 +1,289 @@
using System.Net;
using TwoFromTheCasketContratcs.ViewModels;
using TwoFromTheCasketTest.Infrastructure;
namespace TwoFromTheCasketTest.WebApiControllersTests;
[TestFixture]
internal class SalaryControllerTests : BaseWebApiControllerTest
{
[TearDown]
public void TearDown()
{
TwoFromTheCasketDbContext.RemoveMastersFromDatabase();
TwoFromTheCasketDbContext.RemoveSalariesFromDatabase();
}
[Test]
public async Task GetList_WhenHaveRecords_ShouldSuccess_Test()
{
// Arrange
var master = TwoFromTheCasketDbContext.InsertMasterToDatabaseAndReturn(fio: "Иванов И.И.");
var salary = TwoFromTheCasketDbContext.InsertSalaryToDatabaseAndReturn(master.Id, salarySize: 100);
TwoFromTheCasketDbContext.InsertSalaryToDatabaseAndReturn(master.Id);
TwoFromTheCasketDbContext.InsertSalaryToDatabaseAndReturn(master.Id);
// Act
var fromDate = Uri.EscapeDataString(DateTime.UtcNow.AddDays(-10).ToString("yyyy-MM-ddTHH:mm:ssZ"));
var toDate = Uri.EscapeDataString(DateTime.UtcNow.AddDays(10).ToString("yyyy-MM-ddTHH:mm:ssZ"));
var response = await HttpClient.GetAsync($"/api/salary/getrecords?fromDate={fromDate}&toDate={toDate}");
// Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
var data = await GetModelFromResponseAsync<List<SalaryViewModel>>(response);
Assert.Multiple(() =>
{
Assert.That(data, Is.Not.Null);
Assert.That(data, Has.Count.EqualTo(3));
});
}
[Test]
public async Task GetList_WhenNoRecords_ShouldSuccess_Test()
{
// Act
var fromDate = Uri.EscapeDataString(DateTime.UtcNow.AddDays(-1).ToString("yyyy-MM-ddTHH:mm:ssZ"));
var toDate = Uri.EscapeDataString(DateTime.UtcNow.AddDays(1).ToString("yyyy-MM-ddTHH:mm:ssZ"));
var response = await HttpClient.GetAsync($"/api/salary/getrecords?fromDate={fromDate}&toDate={toDate}");
// Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
var data = await GetModelFromResponseAsync<List<SalaryViewModel>>(response);
Assert.Multiple(() =>
{
Assert.That(data, Is.Not.Null);
Assert.That(data, Has.Count.EqualTo(0));
});
}
[Test]
public async Task GetList_OnlyInDatePeriod_ShouldSuccess_Test()
{
// Arrange
var master = TwoFromTheCasketDbContext.InsertMasterToDatabaseAndReturn(fio: "Иванов И.И.");
TwoFromTheCasketDbContext.InsertSalaryToDatabaseAndReturn(master.Id, salaryDate: DateTime.UtcNow.AddDays(-2));
TwoFromTheCasketDbContext.InsertSalaryToDatabaseAndReturn(master.Id, salaryDate: DateTime.UtcNow.AddDays(-1).AddMinutes(5));
TwoFromTheCasketDbContext.InsertSalaryToDatabaseAndReturn(master.Id, salaryDate: DateTime.UtcNow.AddDays(1).AddMinutes(-5));
TwoFromTheCasketDbContext.InsertSalaryToDatabaseAndReturn(master.Id, salaryDate: DateTime.UtcNow.AddDays(-2));
// Act
var fromDate = Uri.EscapeDataString(DateTime.UtcNow.AddDays(-1).ToString("yyyy-MM-ddTHH:mm:ssZ"));
var toDate = Uri.EscapeDataString(DateTime.UtcNow.AddDays(1).ToString("yyyy-MM-ddTHH:mm:ssZ"));
var response = await HttpClient.GetAsync($"/api/salary/getrecords?fromDate={fromDate}&toDate={toDate}");
// Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
var data = await GetModelFromResponseAsync<List<SalaryViewModel>>(response);
Assert.That(data, Is.Not.Null);
Assert.Multiple(() =>
{
Assert.That(data, Has.Count.EqualTo(2));
});
}
[Test]
public async Task GetList_WhenDateIsIncorrect_ShouldBadRequest_Test()
{
// Act
var fromDate = Uri.EscapeDataString(DateTime.UtcNow.AddDays(1).ToString("yyyy-MM-ddTHH:mm:ssZ"));
var toDate = Uri.EscapeDataString(DateTime.UtcNow.AddDays(-1).ToString("yyyy-MM-ddTHH:mm:ssZ"));
var response = await HttpClient.GetAsync($"/api/salary/getmasterrecords?fromDate={fromDate}&toDate={toDate}");
// Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest));
}
[Test]
public async Task GetList_ByMaster_ShouldSuccess_Test()
{
// Arrange
var master1 = TwoFromTheCasketDbContext.InsertMasterToDatabaseAndReturn(fio: "Иванов И.И.");
var master2 = TwoFromTheCasketDbContext.InsertMasterToDatabaseAndReturn(fio: "Иванов И.И.");
TwoFromTheCasketDbContext.InsertSalaryToDatabaseAndReturn(master1.Id);
TwoFromTheCasketDbContext.InsertSalaryToDatabaseAndReturn(master1.Id);
TwoFromTheCasketDbContext.InsertSalaryToDatabaseAndReturn(master2.Id);
// Act
var fromDate = Uri.EscapeDataString(DateTime.UtcNow.AddDays(-1).ToString("yyyy-MM-ddTHH:mm:ssZ"));
var toDate = Uri.EscapeDataString(DateTime.UtcNow.AddDays(1).ToString("yyyy-MM-ddTHH:mm:ssZ"));
var response = await HttpClient.GetAsync($"/api/salary/getmasterrecords?fromDate={fromDate}&toDate={toDate}&id={master1.Id}");
// Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
var data = await GetModelFromResponseAsync<List<SalaryViewModel>>(response);
Assert.That(data, Is.Not.Null);
Assert.Multiple(() =>
{
Assert.That(data, Has.Count.EqualTo(2));
Assert.That(data.All(x => x.MasterId == master1.Id));
});
}
[Test]
public async Task GetList_ByMaster_OnlyInDatePeriod_ShouldSuccess_Test()
{
// Arrange
var master1 = TwoFromTheCasketDbContext.InsertMasterToDatabaseAndReturn(fio: "Иванов И.И.");
var master2 = TwoFromTheCasketDbContext.InsertMasterToDatabaseAndReturn(fio: "Иванов И.И.");
TwoFromTheCasketDbContext.InsertSalaryToDatabaseAndReturn(master1.Id, salaryDate: DateTime.UtcNow.AddDays(-2));
TwoFromTheCasketDbContext.InsertSalaryToDatabaseAndReturn(master1.Id, salaryDate: DateTime.UtcNow.AddDays(-1).AddMinutes(5));
TwoFromTheCasketDbContext.InsertSalaryToDatabaseAndReturn(master2.Id, salaryDate: DateTime.UtcNow.AddDays(-1).AddMinutes(5));
TwoFromTheCasketDbContext.InsertSalaryToDatabaseAndReturn(master1.Id, salaryDate: DateTime.UtcNow.AddDays(1).AddMinutes(-5));
TwoFromTheCasketDbContext.InsertSalaryToDatabaseAndReturn(master2.Id, salaryDate: DateTime.UtcNow.AddDays(1).AddMinutes(-5));
TwoFromTheCasketDbContext.InsertSalaryToDatabaseAndReturn(master1.Id, salaryDate: DateTime.UtcNow.AddDays(-2));
// Act
var fromDate = Uri.EscapeDataString(DateTime.UtcNow.AddDays(-1).ToString("yyyy-MM-ddTHH:mm:ssZ"));
var toDate = Uri.EscapeDataString(DateTime.UtcNow.AddDays(1).ToString("yyyy-MM-ddTHH:mm:ssZ"));
var response = await HttpClient.GetAsync($"/api/salary/getmasterrecords?fromDate={fromDate}&toDate={toDate}&id={master1.Id}");
// Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
var data = await GetModelFromResponseAsync<List<SalaryViewModel>>(response);
Assert.That(data, Is.Not.Null);
Assert.Multiple(() =>
{
Assert.That(data, Has.Count.EqualTo(2));
Assert.That(data.All(x => x.MasterId == master1.Id));
});
}
[Test]
public async Task GetList_ByMaster_WhenDateIsIncorrect_ShouldBadRequest_Test()
{
// Arrange
var master = TwoFromTheCasketDbContext.InsertMasterToDatabaseAndReturn(fio: "Иванов И.И.");
// Act
var fromDate = Uri.EscapeDataString(DateTime.UtcNow.AddDays(1).ToString("yyyy-MM-ddTHH:mm:ssZ"));
var toDate = Uri.EscapeDataString(DateTime.UtcNow.AddDays(-1).ToString("yyyy-MM-ddTHH:mm:ssZ"));
var response = await HttpClient.GetAsync($"/api/salary/getmasterrecords?fromDate={fromDate}&toDate={toDate}&id={master.Id}");
// Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest));
}
[Test]
public async Task GetList_ByMaster_WhenIdIsNotGuid_ShouldBadRequest_Test()
{
// Act
var fromDate = Uri.EscapeDataString(DateTime.UtcNow.AddDays(-1).ToString("yyyy-MM-ddTHH:mm:ssZ"));
var toDate = Uri.EscapeDataString(DateTime.UtcNow.AddDays(1).ToString("yyyy-MM-ddTHH:mm:ssZ"));
var response = await HttpClient.GetAsync($"/api/salary/getmasterrecords?fromDate={fromDate}&toDate={toDate}&id=id");
// Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest));
}
[Test]
public async Task Calculate_WithoutMasters_ShouldSuccess_Test()
{
// Act
var date = Uri.EscapeDataString(DateTime.UtcNow.ToString("yyyy-MM-dd"));
var response = await HttpClient.PostAsync($"/api/salary/calculate?date={date}", null);
// Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.NoContent));
var salaries = TwoFromTheCasketDbContext.Salaries.ToArray();
Assert.That(salaries, Has.Length.EqualTo(0));
}
[Test]
public async Task Calculate_ShouldSuccess_Test()
{
//Arrange
var postId = Guid.NewGuid().ToString();
var post = TwoFromTheCasketDbContext.InsertPostToDatabaseAndReturn(id: postId, salary: 1000);
var master = TwoFromTheCasketDbContext.InsertMasterToDatabaseAndReturn(fio: "name", postId: postId);
TwoFromTheCasketDbContext.InsertOrderToDatabaseAndReturn(null);
//Act
var date = Uri.EscapeDataString(DateTime.UtcNow.ToString("yyyy-MM-dd"));
var response = await HttpClient.PostAsync($"/api/salary/calculate?date={date}", null);
var salary = TwoFromTheCasketDbContext.GetSalariesFromDatabaseByEmployeeId(master.Id);
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.InternalServerError));
Assert.That(salary, Has.Length.EqualTo(0));
}
[Test]
public async Task Calculate_PostNotFound_ShouldNotFound_Test()
{
// Arrange
TwoFromTheCasketDbContext.InsertPostToDatabaseAndReturn();
var master = TwoFromTheCasketDbContext.InsertMasterToDatabaseAndReturn(fio: "name", postId: Guid.NewGuid().ToString());
var sale = TwoFromTheCasketDbContext.InsertSalaryToDatabaseAndReturn(master.Id);
// Act
var date = Uri.EscapeDataString(DateTime.UtcNow.ToString("yyyy-MM-dd"));
var response = await HttpClient.PostAsync($"/api/salary/calculate?date={date}", null);
// Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.InternalServerError));
}
[Test]
public async Task GetList_WithInvalidDateFormat_ShouldBadRequest_Test()
{
// Act
var response = await HttpClient.GetAsync("/api/salary/getrecords?fromDate=invalid-date&toDate=2024-01-01");
// Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest));
}
[Test]
public async Task GetList_ByMaster_WithNonExistentId_ShouldSuccess_Test()
{
// Arrange
var nonExistentId = Guid.NewGuid().ToString();
// Act
var fromDate = Uri.EscapeDataString(DateTime.UtcNow.AddDays(-1).ToString("yyyy-MM-ddTHH:mm:ssZ"));
var toDate = Uri.EscapeDataString(DateTime.UtcNow.AddDays(1).ToString("yyyy-MM-ddTHH:mm:ssZ"));
var response = await HttpClient.GetAsync($"/api/salary/getmasterrecords?fromDate={fromDate}&toDate={toDate}&id={nonExistentId}");
// Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
var data = await GetModelFromResponseAsync<List<SalaryViewModel>>(response);
Assert.Multiple(() =>
{
Assert.That(data, Is.Not.Null);
Assert.That(data, Has.Count.EqualTo(0));
});
}
[Test]
public async Task Calculate_WithInvalidDateFormat_ShouldBadRequest_Test()
{
// Act
var response = await HttpClient.PostAsync("/api/salary/calculate?date=invalid-date", null);
// Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest));
}
[Test]
public async Task GetList_WithLargeDateRange_ShouldSuccess_Test()
{
// Arrange
var master = TwoFromTheCasketDbContext.InsertMasterToDatabaseAndReturn(fio: "Иванов И.И.");
TwoFromTheCasketDbContext.InsertSalaryToDatabaseAndReturn(master.Id, salaryDate: DateTime.UtcNow.AddDays(-30));
TwoFromTheCasketDbContext.InsertSalaryToDatabaseAndReturn(master.Id, salaryDate: DateTime.UtcNow.AddDays(-15));
TwoFromTheCasketDbContext.InsertSalaryToDatabaseAndReturn(master.Id, salaryDate: DateTime.UtcNow.AddDays(15));
// Act
var fromDate = Uri.EscapeDataString(DateTime.UtcNow.AddDays(-60).ToString("yyyy-MM-ddTHH:mm:ssZ"));
var toDate = Uri.EscapeDataString(DateTime.UtcNow.AddDays(60).ToString("yyyy-MM-ddTHH:mm:ssZ"));
var response = await HttpClient.GetAsync($"/api/salary/getrecords?fromDate={fromDate}&toDate={toDate}");
// Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
var data = await GetModelFromResponseAsync<List<SalaryViewModel>>(response);
Assert.Multiple(() =>
{
Assert.That(data, Is.Not.Null);
Assert.That(data, Has.Count.EqualTo(3));
});
}
[Test]
public async Task GetList_ByMaster_WithNoRecords_ShouldSuccess_Test()
{
// Arrange
var master = TwoFromTheCasketDbContext.InsertMasterToDatabaseAndReturn(fio: "Иванов И.И.");
// Act
var fromDate = Uri.EscapeDataString(DateTime.UtcNow.AddDays(-1).ToString("yyyy-MM-ddTHH:mm:ssZ"));
var toDate = Uri.EscapeDataString(DateTime.UtcNow.AddDays(1).ToString("yyyy-MM-ddTHH:mm:ssZ"));
var response = await HttpClient.GetAsync($"/api/salary/getmasterrecords?fromDate={fromDate}&toDate={toDate}&id={master.Id}");
// Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
var data = await GetModelFromResponseAsync<List<SalaryViewModel>>(response);
Assert.Multiple(() =>
{
Assert.That(data, Is.Not.Null);
Assert.That(data, Has.Count.EqualTo(0));
});
}
}

View File

@@ -0,0 +1,254 @@
using System.Net;
using TwoFromTheCasketContratcs.BindingModels;
using TwoFromTheCasketContratcs.Enums;
using TwoFromTheCasketContratcs.ViewModels;
using TwoFromTheCasketDatabase.Models;
using TwoFromTheCasketTest.Infrastructure;
namespace TwoFromTheCasketTest.WebApiControllersTests;
internal class ServiceControllerTests : BaseWebApiControllerTest
{
private Master _master;
[SetUp]
public void SetUp()
{
_master = TwoFromTheCasketDbContext.InsertMasterToDatabaseAndReturn();
}
[TearDown]
public void TearDown()
{
TwoFromTheCasketDbContext.RemoveMastersFromDatabase();
TwoFromTheCasketDbContext.RemoveServicesFromDatabase();
}
[Test]
public async Task GetRecords_WhenHaveRecords_ShouldSuccess_Test()
{
// Arrange
TwoFromTheCasketDbContext.InsertServiceToDatabaseAndReturn("Service1",serviceName: "name1", masterId: _master.Id);
TwoFromTheCasketDbContext.InsertServiceToDatabaseAndReturn("Service2", serviceName: "name2", masterId: _master.Id);
TwoFromTheCasketDbContext.InsertServiceToDatabaseAndReturn("Service3", serviceName: "name3", masterId: _master.Id);
// Act
var response = await HttpClient.GetAsync("/api/services/getrecords");
// Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
var data = await GetModelFromResponseAsync<List<ServiceViewModel>>(response);
Assert.Multiple(() =>
{
Assert.That(data, Is.Not.Null);
Assert.That(data, Has.Count.EqualTo(3));
});
}
[Test]
public async Task GetRecords_WhenNoRecords_ShouldSuccess_Test()
{
// Act
var response = await HttpClient.GetAsync("/api/services/getrecords");
// Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
var data = await GetModelFromResponseAsync<List<ServiceViewModel>>(response);
Assert.Multiple(() =>
{
Assert.That(data, Is.Not.Null);
Assert.That(data, Has.Count.EqualTo(0));
});
}
[Test]
public async Task GetServiceTypeRecords_ShouldFilterByServiceType_Test()
{
// Arrange
TwoFromTheCasketDbContext.InsertServiceToDatabaseAndReturn(Guid.NewGuid().ToString(), serviceName: "UniqueName1", serviceType: ServiceType.Plastering);
TwoFromTheCasketDbContext.InsertServiceToDatabaseAndReturn(Guid.NewGuid().ToString(), serviceName: "UniqueName2", serviceType: ServiceType.Painting);
TwoFromTheCasketDbContext.InsertServiceToDatabaseAndReturn(Guid.NewGuid().ToString(), serviceName: "UniqueName3", serviceType: ServiceType.Plastering);
// Act
var response = await HttpClient.GetAsync("/api/services/getservicetyperecords?serviceType=Plastering");
// Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
var data = await GetModelFromResponseAsync<List<ServiceViewModel>>(response);
Assert.Multiple(() =>
{
Assert.That(data, Is.Not.Null);
Assert.That(data, Has.Count.EqualTo(0));
Assert.That(data.All(x => x.ServiceType == ServiceType.Plastering));
});
}
[Test]
public async Task GetMasterRecords_ShouldFilterByMasterId_Test()
{
// Arrange
TwoFromTheCasketDbContext.InsertServiceToDatabaseAndReturn(Guid.NewGuid().ToString(), serviceName: "name1", masterId: _master.Id);
TwoFromTheCasketDbContext.InsertServiceToDatabaseAndReturn(Guid.NewGuid().ToString(), serviceName: "name2", masterId: _master.Id);
TwoFromTheCasketDbContext.InsertServiceToDatabaseAndReturn(Guid.NewGuid().ToString(), serviceName: "name3", masterId: Guid.NewGuid().ToString());
// Act
var response = await HttpClient.GetAsync($"/api/services/getmasterrecords?id={_master.Id}");
// Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
var data = await GetModelFromResponseAsync<List<ServiceViewModel>>(response);
Assert.Multiple(() =>
{
Assert.That(data, Is.Not.Null);
Assert.That(data, Has.Count.EqualTo(3));
Assert.That(data.All(x => x.MasterId == _master.Id));
});
}
[Test]
public async Task Register_WhenDataIsValid_ShouldSuccess_Test()
{
// Arrange
var serviceModel = new ServiceBindingModel
{
Id = Guid.NewGuid().ToString(),
ServiceName = $"Updated Service {Guid.NewGuid()}",
ServiceType = ServiceType.Painting,
MasterId = _master.Id,
Price = 100
};
// Act
var response = await HttpClient.PostAsync("/api/services/register", MakeContent(serviceModel));
// Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.NoContent));
}
[Test]
public async Task ChangeInfo_WhenRecordExists_ShouldSuccess_Test()
{
// Arrange
var service = TwoFromTheCasketDbContext.InsertServiceToDatabaseAndReturn(Guid.NewGuid().ToString(), masterId: Guid.NewGuid().ToString());
var updatedModel = new ServiceBindingModel
{
Id = service.Id,
ServiceName = "Updated Service",
ServiceType = ServiceType.Carpentry,
MasterId = _master.Id,
Price = 200,
IsDeleted = false
};
// Act
var response = await HttpClient.PutAsync("/api/services/changeinfo", MakeContent(updatedModel));
// Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.NoContent));
}
[Test]
public async Task Delete_WhenRecordExists_ShouldSuccess_Test()
{
// Arrange
var service = TwoFromTheCasketDbContext.InsertServiceToDatabaseAndReturn(Guid.NewGuid().ToString(), masterId: _master.Id);
// Act
var response = await HttpClient.DeleteAsync($"/api/services/delete/{service.Id}");
// Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.NoContent));
}
[Test]
public async Task Delete_WhenRecordDoesNotExist_ShouldBadRequest_Test()
{
// Act
var response = await HttpClient.DeleteAsync($"/api/services/delete/{Guid.NewGuid()}");
// Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest));
}
[Test]
public async Task GetRecords_WithIncludeDeleted_ShouldSuccess_Test()
{
// Arrange
TwoFromTheCasketDbContext.InsertServiceToDatabaseAndReturn(Guid.NewGuid().ToString(), serviceName: "UniqueName1", isDeleted: false);
TwoFromTheCasketDbContext.InsertServiceToDatabaseAndReturn(Guid.NewGuid().ToString(), serviceName: "UniqueName2", isDeleted: true);
// Act
var response = await HttpClient.GetAsync("/api/services/getrecords?includeDeleted=true");
// Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
var data = await GetModelFromResponseAsync<List<ServiceViewModel>>(response);
Assert.Multiple(() =>
{
Assert.That(data, Is.Not.Null);
Assert.That(data, Has.Count.EqualTo(2));
});
}
[Test]
public async Task Register_WithInvalidData_ShouldBadRequest_Test()
{
// Arrange
var serviceModel = new ServiceBindingModel
{
Id = Guid.NewGuid().ToString(),
ServiceName = "",
ServiceType = ServiceType.Plastering,
MasterId = _master.Id,
Price = -100
};
// Act
var response = await HttpClient.PostAsync("/api/services/register", MakeContent(serviceModel));
// Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest));
}
[Test]
public async Task ChangeInfo_WithNonExistentId_ShouldBadRequest_Test()
{
// Arrange
var serviceModel = new ServiceBindingModel
{
Id = Guid.NewGuid().ToString(),
ServiceName = "Updated Service",
ServiceType = ServiceType.Plastering,
MasterId = _master.Id,
Price = 150
};
// Act
var response = await HttpClient.PutAsync($"/api/services/changeinfo/{Guid.NewGuid()}", MakeContent(serviceModel));
// Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.NotFound));
}
[Test]
public async Task GetMasterRecords_WithInvalidId_ShouldBadRequest_Test()
{
// Act
var response = await HttpClient.GetAsync("/api/services/getmasterrecords?masterId=invalid-id");
// Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest));
}
[Test]
public async Task GetServiceTypeRecords_WithIncludeDeleted_ShouldSuccess_Test()
{
// Arrange
TwoFromTheCasketDbContext.InsertServiceToDatabaseAndReturn(Guid.NewGuid().ToString(), serviceName: "UniquePlastering1", serviceType: ServiceType.Plastering, isDeleted: false);
TwoFromTheCasketDbContext.InsertServiceToDatabaseAndReturn(Guid.NewGuid().ToString(), serviceName: "UniquePlastering2", serviceType: ServiceType.Plastering, isDeleted: true);
// Act
var response = await HttpClient.GetAsync("/api/services/getservicetyperecords?serviceType=Plastering&includeDeleted=true");
// Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
var data = await GetModelFromResponseAsync<List<ServiceViewModel>>(response);
Assert.Multiple(() =>
{
Assert.That(data, Is.Not.Null);
Assert.That(data, Has.Count.EqualTo(2));
Assert.That(data.All(x => x.ServiceType == ServiceType.Plastering));
});
}
}

View File

@@ -0,0 +1,18 @@
{
"Serilog": {
"Using": [
"Serilog.Sinks.File"
],
"WriteTo": [
{
"Name": "File",
"Args": {
"path": "../logs/TwoFromTheCasket.log",
"rollingInterval": "Day",
"outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} {CorrelationId} {Level:u3} {Username} {Message:lj}{Exception}{NewLine}"
}
}
]
}
}

View File

@@ -0,0 +1,296 @@
using AutoMapper;
using TwoFromTheCasketContratcs.AdapterContracts;
using TwoFromTheCasketContratcs.AdapterContracts.OperationResponses;
using TwoFromTheCasketContratcs.BindingModels;
using TwoFromTheCasketContratcs.BuisnessLogicsContracts;
using TwoFromTheCasketContratcs.DataModels;
using TwoFromTheCasketContratcs.Exceptions;
using TwoFromTheCasketContratcs.ViewModels;
namespace TwoFromTheCasketWebApi.Adapters;
public class MasterAdapter : IMasterAdapter
{
private readonly IMasterBuisnessLogicContract _masterBuisnessLogicContract;
private readonly ILogger _logger;
private readonly Mapper _mapper;
public MasterAdapter(IMasterBuisnessLogicContract masterBuisnessLogicContract, ILogger<MasterAdapter> logger)
{
_masterBuisnessLogicContract = masterBuisnessLogicContract;
_logger = logger;
var config = new MapperConfiguration(cfg =>
{
cfg.CreateMap<MasterBindingModel, MasterDataModel>();
cfg.CreateMap<MasterDataModel, MasterViewModel>();
});
_mapper = new Mapper(config);
}
public MasterOperationResponse GetList(bool onlyActive)
{
try
{
return MasterOperationResponse.OK([.._masterBuisnessLogicContract.GetAllMasters().Select(x => _mapper.Map<MasterViewModel>(x))]);
}
catch (NullListException)
{
_logger.LogError("NullListException");
return MasterOperationResponse.NotFound("The list is not initialized");
}
catch (StorageException ex)
{
_logger.LogError(ex, "StorageException");
return MasterOperationResponse.InternalServerError($"Errorwhile working with data storage: { ex.InnerException!.Message}");
}
catch (Exception ex)
{
_logger.LogError(ex, "Exception");
return MasterOperationResponse.InternalServerError(ex.Message);
}
}
public MasterOperationResponse GetElementByData(string data)
{
try
{
return MasterOperationResponse.OK(_mapper.Map<MasterViewModel>(_masterBuisnessLogicContract.GetMasterByData(data)));
}
catch (ArgumentNullException ex)
{
_logger.LogError(ex, "ArgumentNullException");
return MasterOperationResponse.BadRequest("Data is empty");
}
catch (ElementNotFoundException ex)
{
_logger.LogError(ex, "ElementNotFoundException");
return MasterOperationResponse.NotFound($"Not found element by {data}");
}
catch (StorageException ex)
{
_logger.LogError(ex, "StorageException");
return MasterOperationResponse.InternalServerError($"Error while working with data storage: {ex.InnerException!.Message}");
}
catch (Exception ex)
{
_logger.LogError(ex, "Exception");
return MasterOperationResponse.InternalServerError(ex.Message);
}
}
public MasterOperationResponse GetListByBirthDate(DateTime fromDate, DateTime toDate, bool onlyActive)
{
try
{
return MasterOperationResponse.OK([
.. _masterBuisnessLogicContract.GetAllMastersByBirthDate(fromDate, toDate, !onlyActive)
.Select(x => _mapper.Map<MasterViewModel>(x))
]);
}
catch (IncorrectDatesException ex)
{
_logger.LogError(ex, "IncorrectDatesException");
return MasterOperationResponse.BadRequest($"Incorrect dates: {ex.Message}");
}
catch (NullListException)
{
_logger.LogError("NullListException");
return MasterOperationResponse.NotFound("The list is not initialized");
}
catch (StorageException ex)
{
_logger.LogError(ex, "StorageException");
return MasterOperationResponse.InternalServerError(
$"Error while working with data storage: {ex.InnerException!.Message}");
}
catch (Exception ex)
{
_logger.LogError(ex, "Exception");
return MasterOperationResponse.InternalServerError(ex.Message);
}
}
public MasterOperationResponse GetListByEmploymentDate(DateTime fromDate, DateTime toDate, bool onlyActive)
{
try
{
return MasterOperationResponse.OK([
.. _masterBuisnessLogicContract.GetAllMastersByEmploymentDate(fromDate, toDate, !onlyActive)
.Select(x => _mapper.Map<MasterViewModel>(x))
]);
}
catch (IncorrectDatesException ex)
{
_logger.LogError(ex, "IncorrectDatesException");
return MasterOperationResponse.BadRequest($"Incorrect dates: {ex.Message}");
}
catch (NullListException)
{
_logger.LogError("NullListException");
return MasterOperationResponse.NotFound("The list is not initialized");
}
catch (StorageException ex)
{
_logger.LogError(ex, "StorageException");
return MasterOperationResponse.InternalServerError(
$"Error while working with data storage: {ex.InnerException!.Message}");
}
catch (Exception ex)
{
_logger.LogError(ex, "Exception");
return MasterOperationResponse.InternalServerError(ex.Message);
}
}
public MasterOperationResponse GetListByPost(string postId, bool onlyActive)
{
try
{
return MasterOperationResponse.OK([.. _masterBuisnessLogicContract.
GetAllMastersByPost(postId, !onlyActive).Select(x => _mapper.Map<MasterViewModel>(x))]);
}
catch (ValidationException ex)
{
_logger.LogError(ex, "ValidationException");
return MasterOperationResponse.BadRequest($"Incorrect data transmitted: {ex.Message}");
}
catch (NullListException)
{
_logger.LogError("NullListException");
return MasterOperationResponse.NotFound("The list is not initialized");
}
catch (StorageException ex)
{
_logger.LogError(ex, "StorageException");
return MasterOperationResponse.InternalServerError(
$"Error while working with data storage: {ex.InnerException!.Message}");
}
catch (Exception ex)
{
_logger.LogError(ex, "Exception");
return MasterOperationResponse.InternalServerError(ex.Message);
}
}
public MasterOperationResponse RegisterMaster(MasterBindingModel masterModel)
{
try
{
_masterBuisnessLogicContract.InsertMaster(_mapper.Map<MasterDataModel>(masterModel));
return MasterOperationResponse.NoContent();
}
catch (ArgumentNullException ex)
{
_logger.LogError(ex, "ArgumentNullException");
return MasterOperationResponse.BadRequest("Data is empty");
}
catch (ValidationException ex)
{
_logger.LogError(ex, "ValidationException");
return MasterOperationResponse.BadRequest($"Incorrect data transmitted: {ex.Message}");
}
catch (ElementExistsException ex)
{
_logger.LogError(ex, "ElementExistsException");
return MasterOperationResponse.BadRequest(ex.Message);
}
catch (StorageException ex)
{
_logger.LogError(ex, "StorageException");
return MasterOperationResponse.BadRequest(
$"Error while working with data storage: {ex.InnerException!.Message}");
}
catch (Exception ex)
{
_logger.LogError(ex, "Exception");
return MasterOperationResponse.InternalServerError(ex.Message);
}
}
public MasterOperationResponse ChangeMasterInfo(MasterBindingModel masterModel)
{
try
{
_masterBuisnessLogicContract.UpdateMaster(_mapper.Map<MasterDataModel>(masterModel));
return MasterOperationResponse.NoContent();
}
catch (ArgumentNullException ex)
{
_logger.LogError(ex, "ArgumentNullException");
return MasterOperationResponse.BadRequest("Data is empty");
}
catch (ValidationException ex)
{
_logger.LogError(ex, "ValidationException");
return MasterOperationResponse.BadRequest($"Incorrect data transmitted: {ex.Message}");
}
catch (ElementNotFoundException ex)
{
_logger.LogError(ex, "ElementNotFoundException");
return MasterOperationResponse.BadRequest($"Not found element by Id {masterModel.Id}");
}
catch (ElementExistsException ex)
{
_logger.LogError(ex, "ElementExistsException");
return MasterOperationResponse.BadRequest(ex.Message);
}
catch (ElementDeletedException ex)
{
_logger.LogError(ex, "ElementDeletedException");
return MasterOperationResponse.BadRequest($"Element by id: {masterModel.Id} was deleted");
}
catch (StorageException ex)
{
_logger.LogError(ex, "StorageException");
return MasterOperationResponse.BadRequest(
$"Error while working with data storage: {ex.InnerException!.Message}");
}
catch (Exception ex)
{
_logger.LogError(ex, "Exception");
return MasterOperationResponse.InternalServerError(ex.Message);
}
}
public MasterOperationResponse RemoveMaster(string id)
{
try
{
_masterBuisnessLogicContract.DeleteMaster(id);
return MasterOperationResponse.NoContent();
}
catch (ArgumentNullException ex)
{
_logger.LogError(ex, "ArgumentNullException");
return MasterOperationResponse.BadRequest("Id is empty");
}
catch (ValidationException ex)
{
_logger.LogError(ex, "ValidationException");
return MasterOperationResponse.BadRequest($"Incorrect data transmitted: {ex.Message}");
}
catch (ElementNotFoundException ex)
{
_logger.LogError(ex, "ElementNotFoundException");
return MasterOperationResponse.BadRequest($"Not found element by id: {id}");
}
catch (ElementDeletedException ex)
{
_logger.LogError(ex, "ElementDeletedException");
return MasterOperationResponse.BadRequest($"Element by id: {id} was deleted");
}
catch (StorageException ex)
{
_logger.LogError(ex, "StorageException");
return MasterOperationResponse.BadRequest(
$"Error while working with data storage: {ex.InnerException!.Message}");
}
catch (Exception ex)
{
_logger.LogError(ex, "Exception");
return MasterOperationResponse.InternalServerError(ex.Message);
}
}
}

View File

@@ -0,0 +1,229 @@
using AutoMapper;
using TwoFromTheCasketBuisnessLogic.Implementations;
using TwoFromTheCasketContratcs.AdapterContracts;
using TwoFromTheCasketContratcs.AdapterContracts.OperationResponses;
using TwoFromTheCasketContratcs.BindingModels;
using TwoFromTheCasketContratcs.BuisnessLogicsContracts;
using TwoFromTheCasketContratcs.DataModels;
using TwoFromTheCasketContratcs.Exceptions;
using TwoFromTheCasketContratcs.ViewModels;
using static System.Runtime.InteropServices.JavaScript.JSType;
namespace TwoFromTheCasketWebApi.Adapters;
public class OrderAdapter : IOrderAdapter
{
private readonly IOrderBuisnessLogicContract _orderBuisnessLogicContract;
private readonly ILogger _logger;
private readonly Mapper _mapper;
public OrderAdapter(IOrderBuisnessLogicContract orderBuisnessLogicContract, ILogger<OrderAdapter> logger)
{
_orderBuisnessLogicContract = orderBuisnessLogicContract;
_logger = logger;
var config = new MapperConfiguration(cfg =>
{
cfg.CreateMap<OrderBindingModel, OrderDataModel>();
cfg.CreateMap<OrderDataModel, OrderViewModel>();
});
_mapper = new Mapper(config);
}
public OrderOperationResponse GetList()
{
try
{
return OrderOperationResponse.OK([.. _orderBuisnessLogicContract.GetAllOrder().Select(x => _mapper.Map<OrderViewModel>(x))]);
}
catch (NullListException)
{
_logger.LogError("NullListException");
return OrderOperationResponse.NotFound("The list is not initialized");
}
catch (StorageException ex)
{
_logger.LogError(ex, "StorageException");
return OrderOperationResponse.InternalServerError($"Errorwhile working with data storage: {ex.InnerException!.Message}");
}
catch (Exception ex)
{
_logger.LogError(ex, "Exception");
return OrderOperationResponse.InternalServerError(ex.Message);
}
}
public OrderOperationResponse GetElementByData(string data)
{
try
{
return OrderOperationResponse.OK(_mapper.Map<OrderViewModel>(_orderBuisnessLogicContract.GetOrderByData(data)));
}
catch (ArgumentNullException ex)
{
_logger.LogError(ex, "ArgumentNullException");
return OrderOperationResponse.BadRequest("Data is empty");
}
catch (ElementNotFoundException ex)
{
_logger.LogError(ex, "ElementNotFoundException");
return OrderOperationResponse.NotFound($"Not found element by {data}");
}
catch (StorageException ex)
{
_logger.LogError(ex, "StorageException");
return OrderOperationResponse.InternalServerError($"Error while working with data storage: {ex.InnerException!.Message}");
}
catch (Exception ex)
{
_logger.LogError(ex, "Exception");
return OrderOperationResponse.InternalServerError(ex.Message);
}
}
public OrderOperationResponse GetListByDate(DateTime fromDate)
{
try
{
return OrderOperationResponse.OK(
_mapper.Map<OrderViewModel>(_orderBuisnessLogicContract.GetOrderByDate(fromDate)));
}
catch (NullListException)
{
_logger.LogError("NullListException");
return OrderOperationResponse.NotFound("The list is not initialized");
}
catch (IncorrectDatesException)
{
_logger.LogError("IncorrectDatesException");
return OrderOperationResponse.BadRequest("Incorrect dates");
}
catch (StorageException ex)
{
_logger.LogError(ex, "StorageException");
return OrderOperationResponse.InternalServerError(
$"Error while working with data storage:{ex.InnerException!.Message}"
);
}
catch (Exception ex)
{
_logger.LogError(ex, "Exception");
return OrderOperationResponse.InternalServerError(ex.Message);
}
}
public OrderOperationResponse RegisterOrder(OrderBindingModel orderModel)
{
try
{
_orderBuisnessLogicContract.InsertOrder(_mapper.Map<OrderDataModel>(orderModel));
return OrderOperationResponse.NoContent();
}
catch (ArgumentNullException ex)
{
_logger.LogError(ex, "ArgumentNullException");
return OrderOperationResponse.BadRequest("Data is empty");
}
catch (ValidationException ex)
{
_logger.LogError(ex, "ValidationException");
return OrderOperationResponse.BadRequest($"Incorrect data transmitted: {ex.Message}");
}
catch (ElementExistsException ex)
{
_logger.LogError(ex, "ElementExistsException");
return OrderOperationResponse.BadRequest(ex.Message);
}
catch (StorageException ex)
{
_logger.LogError(ex, "StorageException");
return OrderOperationResponse.BadRequest(
$"Error while working with data storage: {ex.InnerException!.Message}");
}
catch (Exception ex)
{
_logger.LogError(ex, "Exception");
return OrderOperationResponse.InternalServerError(ex.Message);
}
}
public OrderOperationResponse ChangeOrderInfo(OrderBindingModel orderModel)
{
try
{
_orderBuisnessLogicContract.UpdateOrder(_mapper.Map<OrderDataModel>(orderModel));
return OrderOperationResponse.NoContent();
}
catch (ArgumentNullException ex)
{
_logger.LogError(ex, "ArgumentNullException");
return OrderOperationResponse.BadRequest("Data is empty");
}
catch (ValidationException ex)
{
_logger.LogError(ex, "ValidationException");
return OrderOperationResponse.BadRequest($"Incorrect data transmitted: {ex.Message}");
}
catch (ElementNotFoundException ex)
{
_logger.LogError(ex, "ElementNotFoundException");
return OrderOperationResponse.BadRequest($"Not found element by Id {orderModel.Id}");
}
catch (ElementExistsException ex)
{
_logger.LogError(ex, "ElementExistsException");
return OrderOperationResponse.BadRequest(ex.Message);
}
catch (ElementDeletedException ex)
{
_logger.LogError(ex, "ElementDeletedException");
return OrderOperationResponse.BadRequest($"Element by id: {orderModel.Id} was deleted");
}
catch (StorageException ex)
{
_logger.LogError(ex, "StorageException");
return OrderOperationResponse.BadRequest(
$"Error while working with data storage: {ex.InnerException!.Message}");
}
catch (Exception ex)
{
_logger.LogError(ex, "Exception");
return OrderOperationResponse.InternalServerError(ex.Message);
}
}
public OrderOperationResponse RemoveOrder(string id)
{
try
{
_orderBuisnessLogicContract.DeleteOrder(id);
return OrderOperationResponse.NoContent();
}
catch (ArgumentNullException ex)
{
_logger.LogError(ex, "ArgumentNullException");
return OrderOperationResponse.BadRequest("Data is empty");
}
catch (ElementNotFoundException ex)
{
_logger.LogError(ex, "ElementNotFoundException");
return OrderOperationResponse.BadRequest($"Not found element by Id {id}");
}
catch (ElementDeletedException ex)
{
_logger.LogError(ex, "ElementDeletedException");
return OrderOperationResponse.BadRequest($"Element by id: {id} was deleted");
}
catch (StorageException ex)
{
_logger.LogError(ex, "StorageException");
return OrderOperationResponse.BadRequest(
$"Error while working with data storage: {ex.InnerException!.Message}");
}
catch (Exception ex)
{
_logger.LogError(ex, "Exception");
return OrderOperationResponse.InternalServerError(ex.Message);
}
}
}

View File

@@ -0,0 +1,277 @@
using AutoMapper;
using TwoFromTheCasketContratcs.AdapterContracts;
using TwoFromTheCasketContratcs.AdapterContracts.OperationResponses;
using TwoFromTheCasketContratcs.BindingModels;
using TwoFromTheCasketContratcs.BuisnessLogicsContracts;
using TwoFromTheCasketContratcs.DataModels;
using TwoFromTheCasketContratcs.Exceptions;
using TwoFromTheCasketContratcs.ViewModels;
namespace TwoFromTheCasketWebApi.Adapters;
public class PostAdapter : IPostAdapter
{
private readonly IPostBuisnessLogicContract _postBusinessLogicContract;
private readonly ILogger _logger;
private readonly Mapper _mapper;
public PostAdapter(IPostBuisnessLogicContract postBusinessLogicContract, ILogger<PostAdapter> logger)
{
_postBusinessLogicContract = postBusinessLogicContract;
_logger = logger;
var config = new MapperConfiguration(cfg =>
{
cfg.CreateMap<PostBindingModel, PostDataModel>();
cfg.CreateMap<PostDataModel, PostViewModel>();
});
_mapper = new Mapper(config);
}
public PostOperationResponse GetList()
{
try
{
return PostOperationResponse.OK([
.. _postBusinessLogicContract.GetAllPosts().Select(x => _mapper.Map<PostViewModel>(x))
]);
}
catch (NullListException)
{
_logger.LogError("NullListException");
return PostOperationResponse.NotFound("The list is not initialized");
}
catch (StorageException ex)
{
_logger.LogError(ex, "StorageException");
return PostOperationResponse.InternalServerError(
$"Error while working with data storage: {ex.InnerException!.Message}");
}
catch (Exception ex)
{
_logger.LogError(ex, "Exception");
return PostOperationResponse.InternalServerError(ex.Message);
}
}
public PostOperationResponse GetHistory(string id)
{
try
{
return PostOperationResponse.OK([
.. _postBusinessLogicContract.GetAllDataOfPost(id).Select(x => _mapper.Map<PostViewModel>(x))
]);
}
catch (ArgumentNullException ex)
{
_logger.LogError(ex, "ArgumentNullException");
return PostOperationResponse.BadRequest("Data is empty");
}
catch (ValidationException ex)
{
_logger.LogError(ex, "ValidationException");
return PostOperationResponse.BadRequest($"Incorrect data transmitted: {ex.Message}");
}
catch (StorageException ex)
{
_logger.LogError(ex, "StorageException");
return PostOperationResponse.InternalServerError(
$"Error while working with data storage: {ex.InnerException!.Message}");
}
catch (Exception ex)
{
_logger.LogError(ex, "Exception");
return PostOperationResponse.InternalServerError(ex.Message);
}
}
public PostOperationResponse GetElement(string data)
{
try
{
return PostOperationResponse.OK(_mapper.Map<PostViewModel>(_postBusinessLogicContract.GetPostByData(data)));
}
catch (ArgumentNullException ex)
{
_logger.LogError(ex, "ArgumentNullException");
return PostOperationResponse.BadRequest("Data is empty");
}
catch (ElementNotFoundException ex)
{
_logger.LogError(ex, "ElementNotFoundException");
return PostOperationResponse.NotFound($"Not found element by data {data}");
}
catch (ElementDeletedException ex)
{
_logger.LogError(ex, "ElementDeletedException");
return PostOperationResponse.BadRequest($"Element by data: {data} was deleted");
}
catch (StorageException ex)
{
_logger.LogError(ex, "StorageException");
return PostOperationResponse.InternalServerError(
$"Error while working with data storage: {ex.InnerException!.Message}");
}
catch (Exception ex)
{
_logger.LogError(ex, "Exception");
return PostOperationResponse.InternalServerError(ex.Message);
}
}
public PostOperationResponse RegisterPost(PostBindingModel postModel)
{
try
{
_postBusinessLogicContract.InsertPost(_mapper.Map<PostDataModel>(postModel));
return PostOperationResponse.NoContent();
}
catch (ArgumentNullException ex)
{
_logger.LogError(ex, "ArgumentNullException");
return PostOperationResponse.BadRequest("Data is empty");
}
catch (ValidationException ex)
{
_logger.LogError(ex, "ValidationException");
return PostOperationResponse.BadRequest($"Incorrect data transmitted: {ex.Message}");
}
catch (ElementExistsException ex)
{
_logger.LogError(ex, "ElementExistsException");
return PostOperationResponse.BadRequest(ex.Message);
}
catch (StorageException ex)
{
_logger.LogError(ex, "StorageException");
return PostOperationResponse.BadRequest(
$"Error while working with data storage: {ex.InnerException!.Message}");
}
catch (Exception ex)
{
_logger.LogError(ex, "Exception");
return PostOperationResponse.InternalServerError(ex.Message);
}
}
public PostOperationResponse ChangePostInfo(PostBindingModel postModel)
{
try
{
_postBusinessLogicContract.UpdatePost(_mapper.Map<PostDataModel>(postModel));
return PostOperationResponse.NoContent();
}
catch (ArgumentNullException ex)
{
_logger.LogError(ex, "ArgumentNullException");
return PostOperationResponse.BadRequest("Data is empty");
}
catch (ValidationException ex)
{
_logger.LogError(ex, "ValidationException");
return PostOperationResponse.BadRequest($"Incorrect data transmitted: {ex.Message}");
}
catch (ElementNotFoundException ex)
{
_logger.LogError(ex, "ElementNotFoundException");
return PostOperationResponse.BadRequest($"Not found element by Id {postModel.Id}");
}
catch (ElementExistsException ex)
{
_logger.LogError(ex, "ElementExistsException");
return PostOperationResponse.BadRequest(ex.Message);
}
catch (ElementDeletedException ex)
{
_logger.LogError(ex, "ElementDeletedException");
return PostOperationResponse.BadRequest($"Element by id: {postModel.Id} was deleted");
}
catch (StorageException ex)
{
_logger.LogError(ex, "StorageException");
return PostOperationResponse.BadRequest(
$"Error while working with data storage: {ex.InnerException!.Message}");
}
catch (Exception ex)
{
_logger.LogError(ex, "Exception");
return PostOperationResponse.InternalServerError(ex.Message);
}
}
public PostOperationResponse RemovePost(string id)
{
try
{
_postBusinessLogicContract.DeletePost(id);
return PostOperationResponse.NoContent();
}
catch (ArgumentNullException ex)
{
_logger.LogError(ex, "ArgumentNullException");
return PostOperationResponse.BadRequest("Id is empty");
}
catch (ValidationException ex)
{
_logger.LogError(ex, "ValidationException");
return PostOperationResponse.BadRequest($"Incorrect data transmitted: {ex.Message}");
}
catch (ElementNotFoundException ex)
{
_logger.LogError(ex, "ElementNotFoundException");
return PostOperationResponse.BadRequest($"Not found element by id: {id}");
}
catch (ElementDeletedException ex)
{
_logger.LogError(ex, "ElementDeletedException");
return PostOperationResponse.BadRequest($"Element by id: {id} was deleted");
}
catch (StorageException ex)
{
_logger.LogError(ex, "StorageException");
return PostOperationResponse.BadRequest(
$"Error while working with data storage: {ex.InnerException!.Message}");
}
catch (Exception ex)
{
_logger.LogError(ex, "Exception");
return PostOperationResponse.InternalServerError(ex.Message);
}
}
public PostOperationResponse RestorePost(string id)
{
try
{
_postBusinessLogicContract.RestorePost(id);
return PostOperationResponse.NoContent();
}
catch (ArgumentNullException ex)
{
_logger.LogError(ex, "ArgumentNullException");
return PostOperationResponse.BadRequest("Id is empty");
}
catch (ValidationException ex)
{
_logger.LogError(ex, "ValidationException");
return PostOperationResponse.BadRequest($"Incorrect data transmitted: {ex.Message}");
}
catch (ElementNotFoundException ex)
{
_logger.LogError(ex, "ElementNotFoundException");
return PostOperationResponse.BadRequest($"Not found element by id: {id}");
}
catch (StorageException ex)
{
_logger.LogError(ex, "StorageException");
return PostOperationResponse.BadRequest(
$"Error while working with data storage: {ex.InnerException!.Message}");
}
catch (Exception ex)
{
_logger.LogError(ex, "Exception");
return PostOperationResponse.InternalServerError(ex.Message);
}
}
}

View File

@@ -0,0 +1,125 @@
using AutoMapper;
using TwoFromTheCasketBuisnessLogic.Implementations;
using TwoFromTheCasketContratcs.AdapterContracts;
using TwoFromTheCasketContratcs.AdapterContracts.OperationResponses;
using TwoFromTheCasketContratcs.BuisnessLogicsContracts;
using TwoFromTheCasketContratcs.DataModels;
using TwoFromTheCasketContratcs.Exceptions;
using TwoFromTheCasketContratcs.ViewModels;
namespace TwoFromTheCasketWebApi.Adapters;
public class SalaryAdapter : ISalaryAdapter
{
private readonly ISalaryBuisnessLogicContract _salaryBusinessLogicContract;
private readonly ILogger _logger;
private readonly Mapper _mapper;
public SalaryAdapter(ISalaryBuisnessLogicContract salaryBusinessLogicContract, ILogger<SalaryAdapter> logger)
{
_salaryBusinessLogicContract = salaryBusinessLogicContract;
_logger = logger;
var config = new MapperConfiguration(cfg =>
{
cfg.CreateMap<SalaryDataModel, SalaryViewModel>();
});
_mapper = new Mapper(config);
}
public SalaryOperationResponse GetListByPeriod(DateTime fromDate, DateTime toDate)
{
try
{
return SalaryOperationResponse.OK([.. _salaryBusinessLogicContract.GetAllSalariesByPeriod(fromDate, toDate).Select(x => _mapper.Map<SalaryViewModel>(x))]);
}
catch (ValidationException ex)
{
_logger.LogError(ex, "ValidationException");
return SalaryOperationResponse.BadRequest($"Incorrect data transmitted: {ex.Message}");
}
catch (IncorrectDatesException ex)
{
_logger.LogError(ex, "IncorrectDatesException");
return SalaryOperationResponse.BadRequest($"Incorrect dates: {ex.Message}");
}
catch (NullListException)
{
_logger.LogError("NullListException");
return SalaryOperationResponse.NotFound("The list is not initialized");
}
catch (StorageException ex)
{
_logger.LogError(ex, "StorageException");
return SalaryOperationResponse.InternalServerError($"Error while working with data storage: {ex.InnerException!.Message}");
}
catch (Exception ex)
{
_logger.LogError(ex, "Exception");
return SalaryOperationResponse.InternalServerError(ex.Message);
}
}
public SalaryOperationResponse GetListByPeriodByMaster(DateTime fromDate, DateTime toDate, string masterId)
{
try
{
return SalaryOperationResponse.OK([.. _salaryBusinessLogicContract.GetAllSalariesByPeriodByMaster(fromDate, toDate, masterId).Select(x => _mapper.Map<SalaryViewModel>(x))]);
}
catch (ValidationException ex)
{
_logger.LogError(ex, "ValidationException");
return SalaryOperationResponse.BadRequest($"Incorrect data transmitted: {ex.Message}");
}
catch (IncorrectDatesException ex)
{
_logger.LogError(ex, "IncorrectDatesException");
return SalaryOperationResponse.BadRequest($"Incorrect dates: {ex.Message}");
}
catch (NullListException)
{
_logger.LogError("NullListException");
return SalaryOperationResponse.NotFound("The list is not initialized");
}
catch (StorageException ex)
{
_logger.LogError(ex, "StorageException");
return SalaryOperationResponse.InternalServerError($"Error while working with data storage: {ex.InnerException!.Message}");
}
catch (Exception ex)
{
_logger.LogError(ex, "Exception");
return SalaryOperationResponse.InternalServerError(ex.Message);
}
}
public SalaryOperationResponse CalculateSalaryByMonth(DateTime date)
{
try
{
_salaryBusinessLogicContract.CalculateSalaryByMonth(date);
return SalaryOperationResponse.NoContent();
}
catch (NullListException)
{
_logger.LogError("NullListException");
return SalaryOperationResponse.NotFound("The list is not initialized");
}
catch (ElementNotFoundException ex)
{
_logger.LogError(ex, "ElementNotFoundException");
return SalaryOperationResponse.NotFound($"Element not found: {ex.Message}");
}
catch (StorageException ex)
{
_logger.LogError(ex, "StorageException");
return SalaryOperationResponse.InternalServerError($"Error while working with data storage: {ex.InnerException!.Message}");
}
catch (Exception ex)
{
_logger.LogError(ex, "Exception");
return SalaryOperationResponse.InternalServerError(ex.Message);
}
}
}

View File

@@ -0,0 +1,238 @@
using AutoMapper;
using Microsoft.OpenApi.Any;
using Moq;
using TwoFromTheCasketBuisnessLogic.Implementations;
using TwoFromTheCasketContratcs.AdapterContracts;
using TwoFromTheCasketContratcs.AdapterContracts.OperationResponses;
using TwoFromTheCasketContratcs.BindingModels;
using TwoFromTheCasketContratcs.BuisnessLogicsContracts;
using TwoFromTheCasketContratcs.DataModels;
using TwoFromTheCasketContratcs.Enums;
using TwoFromTheCasketContratcs.Exceptions;
using TwoFromTheCasketContratcs.ViewModels;
using TwoFromTheCasketDatabase.Models;
namespace TwoFromTheCasketWebApi.Adapters;
public class ServiceAdapter : IServiceAdapter
{
private readonly IServiceBuisnessLogicContract _serviceBuisnessLogicContract;
private readonly ILogger _logger;
private readonly Mapper _mapper;
public ServiceAdapter(IServiceBuisnessLogicContract serviceBuisnessLogicContract, ILogger<MasterAdapter> logger)
{
_serviceBuisnessLogicContract = serviceBuisnessLogicContract;
_logger = logger;
var config = new MapperConfiguration(cfg =>
{
cfg.CreateMap<ServiceBindingModel, ServiceDataModel>();
cfg.CreateMap<ServiceDataModel, ServiceBindingModel>();
cfg.CreateMap<ServiceDataModel, ServiceViewModel>();
});
_mapper = new Mapper(config);
}
public ServiceOperationResponse GetList(bool onlyActive)
{
try
{
return ServiceOperationResponse.OK([.. _serviceBuisnessLogicContract.GetAllServices(It.IsAny<bool>()).Select(x => _mapper.Map<ServiceViewModel>(x))]);
}
catch (NullListException)
{
_logger.LogError("NullListException");
return ServiceOperationResponse.NotFound("The list is not initialized");
}
catch (StorageException ex)
{
_logger.LogError(ex, "StorageException");
return ServiceOperationResponse.InternalServerError($"Errorwhile working with data storage: {ex.InnerException!.Message}");
}
catch (Exception ex)
{
_logger.LogError(ex, "Exception");
return ServiceOperationResponse.InternalServerError(ex.Message);
}
}
public ServiceOperationResponse GetListByServiceType(ServiceType serviceType, bool onlyActive)
{
try
{
return ServiceOperationResponse.OK([.. _serviceBuisnessLogicContract.
GetServicesByServiceType(serviceType, !onlyActive).Select(x => _mapper.Map<ServiceViewModel>(x))]);
}
catch (ValidationException ex)
{
_logger.LogError(ex, "ValidationException");
return ServiceOperationResponse.BadRequest($"Incorrect data transmitted: {ex.Message}");
}
catch (NullListException)
{
_logger.LogError("NullListException");
return ServiceOperationResponse.NotFound("The list is not initialized");
}
catch (StorageException ex)
{
_logger.LogError(ex, "StorageException");
return ServiceOperationResponse.InternalServerError(
$"Error while working with data storage: {ex.InnerException!.Message}");
}
catch (Exception ex)
{
_logger.LogError(ex, "Exception");
return ServiceOperationResponse.InternalServerError(ex.Message);
}
}
public ServiceOperationResponse GetListByMasterId(string masterId, bool onlyActive)
{
try
{
return ServiceOperationResponse.OK([.. _serviceBuisnessLogicContract.
GetServicesByMasterId(masterId, !onlyActive).Select(x => _mapper.Map<ServiceViewModel>(x))]);
}
catch (ValidationException ex)
{
_logger.LogError(ex, "ValidationException");
return ServiceOperationResponse.BadRequest($"Incorrect data transmitted: {ex.Message}");
}
catch (NullListException)
{
_logger.LogError("NullListException");
return ServiceOperationResponse.NotFound("The list is not initialized");
}
catch (StorageException ex)
{
_logger.LogError(ex, "StorageException");
return ServiceOperationResponse.InternalServerError(
$"Error while working with data storage: {ex.InnerException!.Message}");
}
catch (Exception ex)
{
_logger.LogError(ex, "Exception");
return ServiceOperationResponse.InternalServerError(ex.Message);
}
}
public ServiceOperationResponse RegisterService(ServiceBindingModel serviceModel)
{
try
{
_serviceBuisnessLogicContract.InsertService(_mapper.Map<ServiceDataModel>(serviceModel));
return ServiceOperationResponse.NoContent();
}
catch (ArgumentNullException ex)
{
_logger.LogError(ex, "ArgumentNullException");
return ServiceOperationResponse.BadRequest("Data is empty");
}
catch (ValidationException ex)
{
_logger.LogError(ex, "ValidationException");
return ServiceOperationResponse.BadRequest($"Incorrect data transmitted: {ex.Message}");
}
catch (ElementExistsException ex)
{
_logger.LogError(ex, "ElementExistsException");
return ServiceOperationResponse.BadRequest(ex.Message);
}
catch (StorageException ex)
{
_logger.LogError(ex, "StorageException");
return ServiceOperationResponse.BadRequest(
$"Error while working with data storage: {ex.InnerException!.Message}");
}
catch (Exception ex)
{
_logger.LogError(ex, "Exception");
return ServiceOperationResponse.InternalServerError(ex.Message);
}
}
public ServiceOperationResponse ChangeServiceInfo(ServiceBindingModel serviceModel)
{
try
{
_serviceBuisnessLogicContract.UpdateService(_mapper.Map<ServiceDataModel>(serviceModel));
return ServiceOperationResponse.NoContent();
}
catch (ArgumentNullException ex)
{
_logger.LogError(ex, "ArgumentNullException");
return ServiceOperationResponse.BadRequest("Data is empty");
}
catch (ValidationException ex)
{
_logger.LogError(ex, "ValidationException");
return ServiceOperationResponse.BadRequest($"Incorrect data transmitted: {ex.Message}");
}
catch (ElementNotFoundException ex)
{
_logger.LogError(ex, "ElementNotFoundException");
return ServiceOperationResponse.BadRequest($"Not found element by Id {serviceModel.Id}");
}
catch (ElementExistsException ex)
{
_logger.LogError(ex, "ElementExistsException");
return ServiceOperationResponse.BadRequest(ex.Message);
}
catch (ElementDeletedException ex)
{
_logger.LogError(ex, "ElementDeletedException");
return ServiceOperationResponse.BadRequest($"Element by id: {serviceModel.Id} was deleted");
}
catch (StorageException ex)
{
_logger.LogError(ex, "StorageException");
return ServiceOperationResponse.BadRequest(
$"Error while working with data storage: {ex.InnerException!.Message}");
}
catch (Exception ex)
{
_logger.LogError(ex, "Exception");
return ServiceOperationResponse.InternalServerError(ex.Message);
}
}
public ServiceOperationResponse RemoveService(string id)
{
try
{
_serviceBuisnessLogicContract.DeleteService(id);
return ServiceOperationResponse.NoContent();
}
catch (ArgumentNullException ex)
{
_logger.LogError(ex, "ArgumentNullException");
return ServiceOperationResponse.BadRequest("Id is empty");
}
catch (ValidationException ex)
{
_logger.LogError(ex, "ValidationException");
return ServiceOperationResponse.BadRequest($"Incorrect data transmitted: {ex.Message}");
}
catch (ElementNotFoundException ex)
{
_logger.LogError(ex, "ElementNotFoundException");
return ServiceOperationResponse.BadRequest($"Not found element by id: {id}");
}
catch (ElementDeletedException ex)
{
_logger.LogError(ex, "ElementDeletedException");
return ServiceOperationResponse.BadRequest($"Element by id: {id} was deleted");
}
catch (StorageException ex)
{
_logger.LogError(ex, "StorageException");
return ServiceOperationResponse.BadRequest(
$"Error while working with data storage: {ex.InnerException!.Message}");
}
catch (Exception ex)
{
_logger.LogError(ex, "Exception");
return ServiceOperationResponse.InternalServerError(ex.Message);
}
}
}

View File

@@ -0,0 +1,12 @@
using Microsoft.IdentityModel.Tokens;
using System.Text;
namespace TwoFromTheCasketWebApi;
public class AuthOptions
{
public const string ISSUER = "TwoFromTheCasket_AuthServer"; // издатель токена
public const string AUDIENCE = "TwoFromTheCasket_AuthClient"; // потребитель токена
const string KEY = "casketsecret_secretsecretsecretkey!123"; // ключ для шифрации
public static SymmetricSecurityKey GetSymmetricSecurityKey() => new(Encoding.UTF8.GetBytes(KEY));
}

Some files were not shown because too many files have changed in this diff Show More