3 Commits

108 changed files with 2763 additions and 1110 deletions

View File

@@ -8,7 +8,6 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="AutoMapper" Version="14.0.0" />
<PackageReference Include="DocumentFormat.OpenXml" Version="3.3.0" />
<PackageReference Include="EntityFramework" Version="6.5.1" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="9.0.4" />

View File

@@ -2,7 +2,9 @@
using AndDietCokeContracts.DataModels;
using AndDietCokeContracts.Exceptions;
using AndDietCokeContracts.Extensions;
using AndDietCokeContracts.Resources;
using AndDietCokeContracts.StoragesContracts;
using Microsoft.Extensions.Localization;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
@@ -14,15 +16,15 @@ using System.Threading.Tasks;
namespace AndDietCokeBuisnessLogic.Implementations;
internal class BuyerBusinessLogicContract(IBuyerStorageContract buyerStorageContract, ILogger logger) : IBuyerBusinessLogicContract
internal class BuyerBusinessLogicContract(IBuyerStorageContract buyerStorageContract, IStringLocalizer<Messages> localizer, ILogger logger) : IBuyerBusinessLogicContract
{
private readonly ILogger _logger = logger;
private readonly IBuyerStorageContract _buyerStorageContract = buyerStorageContract;
private readonly IStringLocalizer<Messages> _localizer = localizer;
public List<BuyerDataModel> GetAllBuyers()
{
_logger.LogInformation("GetAllBuyers");
return _buyerStorageContract.GetList() ?? throw new NullListException();
return _buyerStorageContract.GetList();
}
public BuyerDataModel GetBuyerByData(string data)
@@ -34,20 +36,20 @@ internal class BuyerBusinessLogicContract(IBuyerStorageContract buyerStorageCont
}
if (data.IsGuid())
{
return _buyerStorageContract.GetElementById(data) ?? throw new ElementNotFoundException(data);
return _buyerStorageContract.GetElementById(data) ?? throw new ElementNotFoundException(data, _localizer);
}
if (Regex.IsMatch(data, @"^((8|\+7)[\- ]?)?(\(?\d{3}\)?[\- ]?)?[\d\- ]{7,10}$"))
{
return _buyerStorageContract.GetElementByPhoneNumber(data) ?? throw new ElementNotFoundException(data);
return _buyerStorageContract.GetElementByPhoneNumber(data) ?? throw new ElementNotFoundException(data, _localizer);
}
return _buyerStorageContract.GetElementByFIO(data) ?? throw new ElementNotFoundException(data);
return _buyerStorageContract.GetElementByFIO(data) ?? throw new ElementNotFoundException(data, _localizer);
}
public void InsertBuyer(BuyerDataModel buyerDataModel)
{
_logger.LogInformation("New data: {json}", JsonSerializer.Serialize(buyerDataModel));
ArgumentNullException.ThrowIfNull(buyerDataModel);
buyerDataModel.Validate();
buyerDataModel.Validate(_localizer);
_buyerStorageContract.AddElement(buyerDataModel);
}
@@ -55,7 +57,7 @@ internal class BuyerBusinessLogicContract(IBuyerStorageContract buyerStorageCont
{
_logger.LogInformation("Update data: {json}", JsonSerializer.Serialize(buyerDataModel));
ArgumentNullException.ThrowIfNull(buyerDataModel);
buyerDataModel.Validate();
buyerDataModel.Validate(_localizer);
_buyerStorageContract.UpdElement(buyerDataModel);
}
@@ -68,7 +70,7 @@ internal class BuyerBusinessLogicContract(IBuyerStorageContract buyerStorageCont
}
if (!id.IsGuid())
{
throw new ValidationException("Id is not a unique identifier");
throw new ValidationException(string.Format(localizer["ValidationExceptionMessageNotAId"], "Id"));
}
_buyerStorageContract.DelElement(id);
}

View File

@@ -3,7 +3,9 @@ using AndDietCokeContracts.DataModels;
using AndDietCokeContracts.Enums;
using AndDietCokeContracts.Exceptions;
using AndDietCokeContracts.Extensions;
using AndDietCokeContracts.Resources;
using AndDietCokeContracts.StoragesContracts;
using Microsoft.Extensions.Localization;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
@@ -14,14 +16,15 @@ using System.Threading.Tasks;
namespace AndDietCokeBuisnessLogic.Implementations;
internal class DishBusinessLogicContract(IDishStorageContract dishStorageContract, ILogger logger) : IDishBusinessLogicContract
internal class DishBusinessLogicContract(IDishStorageContract dishStorageContract, IStringLocalizer<Messages> localizer, ILogger logger) : IDishBusinessLogicContract
{
private readonly ILogger _logger = logger;
private readonly IDishStorageContract _dishStorageContract = dishStorageContract;
private readonly IStringLocalizer<Messages> _localizer = localizer;
public List<DishDataModel> GetAllDishes(bool onlyActive)
{
_logger.LogInformation("GetAllDishes params: {onlyActive}", onlyActive);
return _dishStorageContract.GetList(onlyActive) ?? throw new NullListException();
return _dishStorageContract.GetList(onlyActive);
}
public List<DishHistoryDataModel> GetDishHistoryByDish(string dishId)
{
@@ -32,9 +35,9 @@ internal class DishBusinessLogicContract(IDishStorageContract dishStorageContrac
}
if (!dishId.IsGuid())
{
throw new ValidationException("The value in the field dishId is not a unique identifier.");
throw new ValidationException(string.Format(localizer["ValidationExceptionMessageNotAId"], "DishId"));
}
return _dishStorageContract.GetHistoryByDishId(dishId) ?? throw new NullListException();
return _dishStorageContract.GetHistoryByDishId(dishId);
}
public DishDataModel GetDishByData(string data)
{
@@ -45,22 +48,22 @@ internal class DishBusinessLogicContract(IDishStorageContract dishStorageContrac
}
if (data.IsGuid())
{
return _dishStorageContract.GetElementById(data) ?? throw new ElementNotFoundException(data);
return _dishStorageContract.GetElementById(data) ?? throw new ElementNotFoundException(data, _localizer);
}
return _dishStorageContract.GetElementByName(data) ?? throw new ElementNotFoundException(data);
return _dishStorageContract.GetElementByName(data) ?? throw new ElementNotFoundException(data, _localizer);
}
public void InsertDish(DishDataModel dishDataModel)
{
_logger.LogInformation("New data: {json}", JsonSerializer.Serialize(dishDataModel));
ArgumentNullException.ThrowIfNull(dishDataModel);
dishDataModel.Validate();
dishDataModel.Validate(_localizer);
_dishStorageContract.AddElement(dishDataModel);
}
public void UpdateDish(DishDataModel dishDataModel)
{
_logger.LogInformation("Update data: {json}", JsonSerializer.Serialize(dishDataModel));
ArgumentNullException.ThrowIfNull(dishDataModel);
dishDataModel.Validate();
dishDataModel.Validate(_localizer);
_dishStorageContract.UpdElement(dishDataModel);
}
public void DeleteDish(string id)
@@ -72,7 +75,7 @@ internal class DishBusinessLogicContract(IDishStorageContract dishStorageContrac
}
if (!id.IsGuid())
{
throw new ValidationException("Id is not a unique identifier");
throw new ValidationException(string.Format(localizer["ValidationExceptionMessageNotAId"], "Id"));
}
_dishStorageContract.DelElement(id);
}

View File

@@ -3,7 +3,9 @@ using AndDietCokeContracts.DataModels;
using AndDietCokeContracts.Enums;
using AndDietCokeContracts.Exceptions;
using AndDietCokeContracts.Extensions;
using AndDietCokeContracts.Resources;
using AndDietCokeContracts.StoragesContracts;
using Microsoft.Extensions.Localization;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
@@ -14,15 +16,15 @@ using System.Threading.Tasks;
namespace AndDietCokeBuisnessLogic.Implementations;
public class PostBusinessLogicContract(IPostStorageContract postStorageContract, ILogger logger) : IPostBusinessLogicContract
internal class PostBusinessLogicContract(IPostStorageContract postStorageContract, IStringLocalizer<Messages> localizer, ILogger logger) : IPostBusinessLogicContract
{
private readonly ILogger _logger = logger;
private readonly IPostStorageContract _postStorageContract = postStorageContract;
private readonly IStringLocalizer<Messages> _localizer = localizer;
public List<PostDataModel> GetAllPosts(bool onlyActive = true)
{
_logger.LogInformation("GetAllPosts params: {onlyActive}", onlyActive);
return _postStorageContract.GetList(onlyActive) ?? throw new NullListException();
return _postStorageContract.GetList(onlyActive);
}
public List<PostDataModel> GetAllDataOfPost(string postId)
@@ -34,9 +36,9 @@ public class PostBusinessLogicContract(IPostStorageContract postStorageContract,
}
if (!postId.IsGuid())
{
throw new ValidationException("The value in the field postId is not a unique identifier.");
throw new ValidationException(string.Format(localizer["ValidationExceptionMessageNotAId"], "PostId"));
}
return _postStorageContract.GetPostWithHistory(postId) ?? throw new NullListException();
return _postStorageContract.GetPostWithHistory(postId);
}
public PostDataModel GetPostByData(string data)
@@ -48,16 +50,16 @@ public class PostBusinessLogicContract(IPostStorageContract postStorageContract,
}
if (data.IsGuid())
{
return _postStorageContract.GetElementById(data) ?? throw new ElementNotFoundException(data);
return _postStorageContract.GetElementById(data) ?? throw new ElementNotFoundException(data, _localizer);
}
return _postStorageContract.GetElementByName(data) ?? throw new ElementNotFoundException(data);
return _postStorageContract.GetElementByName(data) ?? throw new ElementNotFoundException(data, _localizer);
}
public void InsertPost(PostDataModel postDataModel)
{
_logger.LogInformation("New data: {json}", JsonSerializer.Serialize(postDataModel));
ArgumentNullException.ThrowIfNull(postDataModel);
postDataModel.Validate();
postDataModel.Validate(_localizer);
_postStorageContract.AddElement(postDataModel);
}
@@ -65,7 +67,7 @@ public class PostBusinessLogicContract(IPostStorageContract postStorageContract,
{
_logger.LogInformation("Update data: {json}", JsonSerializer.Serialize(postDataModel));
ArgumentNullException.ThrowIfNull(postDataModel);
postDataModel.Validate();
postDataModel.Validate(_localizer);
_postStorageContract.UpdElement(postDataModel);
}
@@ -78,7 +80,7 @@ public class PostBusinessLogicContract(IPostStorageContract postStorageContract,
}
if (!id.IsGuid())
{
throw new ValidationException("Id is not a unique identifier");
throw new ValidationException(string.Format(localizer["ValidationExceptionMessageNotAId"], "Id"));
}
_postStorageContract.DelElement(id);
}
@@ -92,7 +94,7 @@ public class PostBusinessLogicContract(IPostStorageContract postStorageContract,
}
if (!id.IsGuid())
{
throw new ValidationException("Id is not a unique identifier");
throw new ValidationException(string.Format(localizer["ValidationExceptionMessageNotAId"], "Id"));
}
_postStorageContract.ResElement(id);
}

View File

@@ -4,23 +4,43 @@ using AndDietCokeBuisnessLogic.OfficePackage;
using AndDietCokeContracts.DataModels;
using AndDietCokeContracts.Exceptions;
using AndDietCokeContracts.Extensions;
using AndDietCokeContracts.Resources;
using AndDietCokeContracts.StoragesContracts;
using Microsoft.Extensions.Localization;
using Microsoft.Extensions.Logging;
namespace AndDietCokeBuisnessLogic.Implementations
{
public class ReportContract(IDishStorageContract dishStorageContract, ISaleStorageContract saleStorageContract, ISalaryStorageContract salaryStorageContract, ILogger logger, BaseWordBuilder baseWordBuilder, BaseExcelBuilder baseExcelBuilder, BasePdfBuilder basePdfBuilder) : IReportContract
internal class ReportContract : IReportContract
{
private readonly ILogger _logger = logger;
private readonly BaseWordBuilder _baseWordBuilder = baseWordBuilder;
private readonly IDishStorageContract _dishStorageContract = dishStorageContract;
private readonly ISaleStorageContract _saleStorageContract = saleStorageContract;
private readonly BaseExcelBuilder _baseExcelBuilder = baseExcelBuilder;
private readonly ISalaryStorageContract _salaryStorageContract = salaryStorageContract;
private readonly BasePdfBuilder _basePdfBuilder = basePdfBuilder;
internal static readonly string[] tableHeader = ["Дата продажи", "Сумма", "Название блюда", "Количество", "Имя работника"];
internal static readonly string[] documentHeader = ["Блюдо", "История цен", "Дата изменения"];
private readonly ILogger _logger;
private readonly IStringLocalizer<Messages> _localizer;
private readonly BaseWordBuilder _baseWordBuilder;
private readonly IDishStorageContract _dishStorageContract;
private readonly ISaleStorageContract _saleStorageContract;
private readonly BaseExcelBuilder _baseExcelBuilder;
private readonly ISalaryStorageContract _salaryStorageContract;
private readonly BasePdfBuilder _basePdfBuilder;
internal readonly string[] tableHeader;
internal readonly string[] documentHeader;
public ReportContract(IDishStorageContract dishStorageContract, ISaleStorageContract saleStorageContract, ISalaryStorageContract salaryStorageContract, ILogger logger, BaseWordBuilder baseWordBuilder, BaseExcelBuilder baseExcelBuilder, BasePdfBuilder basePdfBuilder, IStringLocalizer<Messages> localizer)
{
_localizer = localizer;
_baseWordBuilder = baseWordBuilder;
_baseExcelBuilder = baseExcelBuilder;
_saleStorageContract = saleStorageContract;
_salaryStorageContract = salaryStorageContract;
_dishStorageContract = dishStorageContract;
_basePdfBuilder = basePdfBuilder;
_logger = logger;
documentHeader =
[_localizer["DocumentDocCaptionDish"],
_localizer["DocumentDocCaptionPriceHistories"],
_localizer["DocumentDocCaptionDate"]];
tableHeader =
[_localizer["DocumentExcelCaptionDate"], _localizer["DocumentExcelCaptionSum"],
_localizer["DocumentExcelCaptionDish"], _localizer["DocumentExcelCaptionCount"], _localizer["DocumentExcelCaptionWorkerName"]];
}
public Task<List<DishPriceReportDataModel>> GetDataDishPricesAsync(CancellationToken ct)
{
_logger.LogInformation("GetDataDishPricesAsync");
@@ -44,11 +64,11 @@ namespace AndDietCokeBuisnessLogic.Implementations
var data = await GetDataBySalaryAsync(dateStart, dateFinish, ct) ?? throw new InvalidOperationException("No found data");
var totalSalary = data.Sum(x => x.TotalSalary);
return _basePdfBuilder
.AddHeader("Зарплатная ведомость")
.AddParagraph($"за период с {dateStart.ToShortDateString()} по {dateFinish.ToShortDateString()}")
.AddPieChart("Начисления", [.. data.Select(x => (x.WorkerFIO, x.TotalSalary))])
.AddHeader(_localizer["DocumentPdfHeader"])
.AddParagraph(string.Format(_localizer["DocumentPdfSubHeader"], dateStart.ToLocalTime().ToShortDateString(), dateFinish.ToLocalTime().ToShortDateString()))
.AddPieChart(_localizer["DocumentPdfDiagramCaption"], [.. data.Select(x => (x.WorkerFIO, x.TotalSalary))])
.AddParagraph("")
.AddParagraph($"Общая сумма начислений: {totalSalary:N2} руб.")
.AddParagraph(string.Format(_localizer["DocumentPdfTotalSalary"],totalSalary.ToString("N2")))
.Build();
}
@@ -85,14 +105,14 @@ namespace AndDietCokeBuisnessLogic.Implementations
tableRows.Add(new[]
{
"Всего",
_localizer["DocumentExcelCaptionTotal"],
data.Sum(x => x.Sum).ToString("N2"),
"", "",""
});
return _baseExcelBuilder
.AddHeader("Продажи за период", 0, 5)
.AddParagraph($"c {dateStart.ToShortDateString()} по {dateFinish.ToShortDateString()}", 2)
.AddHeader(_localizer["DocumentExcelHeader"], 0, 5)
.AddParagraph(string.Format(_localizer["DocumentExcelSubHeader"], dateStart.ToLocalTime().ToShortDateString(), dateFinish.ToLocalTime().ToShortDateString()), 2)
.AddTable(
new[] { 10, 10, 10, 10, 10 },
[tableHeader, .. tableRows]
@@ -102,10 +122,9 @@ namespace AndDietCokeBuisnessLogic.Implementations
public async Task<Stream> CreateDocumentDishPricesByDishAsync(CancellationToken ct)
{
logger.LogInformation("Create report ProductsByManufacturer");
_logger.LogInformation("Create report ProductsByManufacturer");
var data = await GetDishPriceHistoryAsync(ct) ?? throw new InvalidOperationException("No found data");
var documentHeader = new string[] { "Название блюда", "Цена", "Дата" };
var tableData = new List<string[]>() { documentHeader }
.Union(
data.SelectMany(x =>
@@ -121,8 +140,8 @@ namespace AndDietCokeBuisnessLogic.Implementations
.ToList();
return _baseWordBuilder
.AddHeader("История цен блюд")
.AddParagraph($"Сформировано на дату {DateTime.Now}")
.AddHeader(_localizer["DocumentDocHeader"])
.AddParagraph(string.Format(_localizer["DocumentDocSubHeader"], DateTime.Now))
.AddTable(
new[] { 3000, 5000, 3000 },
tableData
@@ -150,7 +169,7 @@ namespace AndDietCokeBuisnessLogic.Implementations
{
if (dateStart.IsDateNotOlder(dateFinish))
{
throw new IncorrectDatesException(dateStart, dateFinish);
throw new IncorrectDatesException(dateStart, dateFinish, _localizer);
}
var sales = await _saleStorageContract.GetListAsync(dateStart, dateFinish, ct);
@@ -167,7 +186,7 @@ namespace AndDietCokeBuisnessLogic.Implementations
{
if (dateStart.IsDateNotOlder(dateFinish))
{
throw new IncorrectDatesException(dateStart, dateFinish);
throw new IncorrectDatesException(dateStart, dateFinish, _localizer);
}
return [.. (await _salaryStorageContract.GetListAsync(dateStart, dateFinish, ct))
.GroupBy(x => x.WorkerId)

View File

@@ -4,13 +4,16 @@ using AndDietCokeContracts.Exceptions;
using AndDietCokeContracts.Extensions;
using AndDietCokeContracts.Infrastrusture;
using AndDietCokeContracts.Infrastrusture.PostConfiguration;
using AndDietCokeContracts.Resources;
using AndDietCokeContracts.StoragesContracts;
using Microsoft.Extensions.Localization;
using Microsoft.Extensions.Logging;
namespace AndDietCokeBuisnessLogic.Implementations;
internal class SalaryBusinessLogicContract(ISalaryStorageContract salaryStorageContract,
ISaleStorageContract saleStorageContract, IPostStorageContract postStorageContract, IWorkerStorageContract workerStorageContract, ILogger logger, IConfigurationSalary сonfiguration) : ISalaryBusinessLogicContract
ISaleStorageContract saleStorageContract, IPostStorageContract postStorageContract, IWorkerStorageContract workerStorageContract,
ILogger logger, IConfigurationSalary сonfiguration, IStringLocalizer<Messages> localizer) : ISalaryBusinessLogicContract
{
private readonly ILogger _logger = logger;
private readonly ISalaryStorageContract _salaryStorageContract = salaryStorageContract;
@@ -18,22 +21,22 @@ internal class SalaryBusinessLogicContract(ISalaryStorageContract salaryStorageC
private readonly IWorkerStorageContract _workerStorageContract = workerStorageContract;
private readonly IPostStorageContract _roleStorageContract = postStorageContract;
private readonly IConfigurationSalary _salaryConfiguration = сonfiguration;
private readonly IStringLocalizer<Messages> _localizer = localizer;
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);
throw new IncorrectDatesException(fromDate, toDate, _localizer);
}
return _salaryStorageContract.GetList(fromDate, toDate) ?? throw new NullListException();
return _salaryStorageContract.GetList(fromDate, toDate);
}
public List<SalaryDataModel> GetAllSalariesByPeriodByWorker(DateTime fromDate, DateTime toDate, string workerId)
{
if (fromDate.IsDateNotOlder(toDate))
{
throw new IncorrectDatesException(fromDate, toDate);
throw new IncorrectDatesException(fromDate, toDate, _localizer);
}
if (workerId.IsEmpty())
{
@@ -44,20 +47,19 @@ internal class SalaryBusinessLogicContract(ISalaryStorageContract salaryStorageC
throw new ValidationException("The value in the field workerId is not a unique identifier.");
}
_logger.LogInformation("GetAllSalaries params: {fromDate}, {toDate}, {workerId}", fromDate, toDate, workerId);
return _salaryStorageContract.GetList(fromDate, toDate, workerId) ?? throw new NullListException();
return _salaryStorageContract.GetList(fromDate, toDate, workerId);
}
public void CalculateSalaryByMounth(DateTime date)
{
_logger.LogInformation("CalculateSalaryByMounth: {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 workers = _workerStorageContract.GetList() ?? throw new NullListException();
var startDate = new DateTime(date.Year, date.Month, 1, 0, 0, 0, DateTimeKind.Utc);
var finishDate = new DateTime(date.Year, date.Month, DateTime.DaysInMonth(date.Year, date.Month), 0, 0, 0, DateTimeKind.Utc);
var workers = _workerStorageContract.GetList();
foreach (var worker in workers)
{
var sales = _saleStorageContract.GetList(startDate, finishDate, workerId: worker.Id) ??
throw new NullListException();
var post = _roleStorageContract.GetElementById(worker.PostId) ?? throw new NullListException();
var sales = _saleStorageContract.GetList(startDate, finishDate, workerId: worker.Id);
var post = _roleStorageContract.GetElementById(worker.PostId);
var salary = post.ConfigurationModel switch
{
null => 0,

View File

@@ -2,7 +2,9 @@
using AndDietCokeContracts.DataModels;
using AndDietCokeContracts.Exceptions;
using AndDietCokeContracts.Extensions;
using AndDietCokeContracts.Resources;
using AndDietCokeContracts.StoragesContracts;
using Microsoft.Extensions.Localization;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
@@ -13,19 +15,20 @@ using System.Threading.Tasks;
namespace AndDietCokeBuisnessLogic.Implementations;
internal class SaleBusinessLogicContract(ISaleStorageContract saleStorageContract, ILogger logger) : ISaleBusinessLogicContract
internal class SaleBusinessLogicContract(ISaleStorageContract saleStorageContract, ILogger logger, IStringLocalizer<Messages> localizer) : ISaleBusinessLogicContract
{
private readonly ILogger _logger = logger;
private readonly ISaleStorageContract _saleStorageContract = saleStorageContract;
private readonly IStringLocalizer<Messages> _localizer=localizer;
public List<SaleDataModel> GetAllSalesByPeriod(DateTime fromDate, DateTime toDate)
{
_logger.LogInformation("GetAllSales params: {fromDate}, {toDate}", fromDate, toDate);
if (fromDate.IsDateNotOlder(toDate))
{
throw new IncorrectDatesException(fromDate, toDate);
throw new IncorrectDatesException(fromDate, toDate, _localizer);
}
return _saleStorageContract.GetList(fromDate, toDate) ?? throw new NullListException();
return _saleStorageContract.GetList(fromDate, toDate);
}
public List<SaleDataModel> GetAllSalesByWorkerByPeriod(string workerId, DateTime fromDate, DateTime toDate)
@@ -33,7 +36,7 @@ internal class SaleBusinessLogicContract(ISaleStorageContract saleStorageContrac
_logger.LogInformation("GetAllSales params: {workerId}, {fromDate}, {toDate}", workerId, fromDate, toDate);
if (fromDate.IsDateNotOlder(toDate))
{
throw new IncorrectDatesException(fromDate, toDate);
throw new IncorrectDatesException(fromDate, toDate, _localizer);
}
if (workerId.IsEmpty())
{
@@ -43,7 +46,7 @@ internal class SaleBusinessLogicContract(ISaleStorageContract saleStorageContrac
{
throw new ValidationException("The value in the field workerId is not a unique identifier.");
}
return _saleStorageContract.GetList(fromDate, toDate, workerId: workerId) ?? throw new NullListException();
return _saleStorageContract.GetList(fromDate, toDate, workerId: workerId);
}
public List<SaleDataModel> GetAllSalesByBuyerByPeriod(string buyerId, DateTime fromDate, DateTime toDate)
@@ -51,7 +54,7 @@ internal class SaleBusinessLogicContract(ISaleStorageContract saleStorageContrac
_logger.LogInformation("GetAllSales params: {buyerId}, {fromDate}, {toDate}", buyerId, fromDate, toDate);
if (fromDate.IsDateNotOlder(toDate))
{
throw new IncorrectDatesException(fromDate, toDate);
throw new IncorrectDatesException(fromDate, toDate, _localizer);
}
if (buyerId.IsEmpty())
{
@@ -61,7 +64,7 @@ internal class SaleBusinessLogicContract(ISaleStorageContract saleStorageContrac
{
throw new ValidationException("The value in the field buyerId is not a unique identifier.");
}
return _saleStorageContract.GetList(fromDate, toDate, buyerId: buyerId) ?? throw new NullListException();
return _saleStorageContract.GetList(fromDate, toDate, buyerId: buyerId);
}
public List<SaleDataModel> GetAllSalesByDishByPeriod(string dishId, DateTime fromDate, DateTime toDate)
@@ -69,7 +72,7 @@ internal class SaleBusinessLogicContract(ISaleStorageContract saleStorageContrac
_logger.LogInformation("GetAllSales params: {dishId}, {fromDate}, {toDate}", dishId, fromDate, toDate);
if (fromDate.IsDateNotOlder(toDate))
{
throw new IncorrectDatesException(fromDate, toDate);
throw new IncorrectDatesException(fromDate, toDate, _localizer);
}
if (dishId.IsEmpty())
{
@@ -79,7 +82,7 @@ internal class SaleBusinessLogicContract(ISaleStorageContract saleStorageContrac
{
throw new ValidationException("The value in the field dishId is not a unique identifier.");
}
return _saleStorageContract.GetList(fromDate, toDate, dishId: dishId) ?? throw new NullListException();
return _saleStorageContract.GetList(fromDate, toDate, dishId: dishId);
}
public SaleDataModel GetSaleByData(string data)
@@ -93,14 +96,14 @@ internal class SaleBusinessLogicContract(ISaleStorageContract saleStorageContrac
{
throw new ValidationException("Id is not a unique identifier");
}
return _saleStorageContract.GetElementById(data) ?? throw new ElementNotFoundException(data);
return _saleStorageContract.GetElementById(data) ?? throw new ElementNotFoundException(data, _localizer);
}
public void InsertSale(SaleDataModel saleDataModel)
{
_logger.LogInformation("New data: {json}", JsonSerializer.Serialize(saleDataModel));
ArgumentNullException.ThrowIfNull(saleDataModel);
saleDataModel.Validate();
saleDataModel.Validate(_localizer);
_saleStorageContract.AddElement(saleDataModel);
}

View File

@@ -2,26 +2,25 @@
using AndDietCokeContracts.DataModels;
using AndDietCokeContracts.Exceptions;
using AndDietCokeContracts.Extensions;
using AndDietCokeContracts.Resources;
using AndDietCokeContracts.StoragesContracts;
using Microsoft.Extensions.Localization;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
namespace AndDietCokeBuisnessLogic.Implementations;
internal class WorkerBusinessLogicContract(IWorkerStorageContract workerStorageContract, ILogger logger) : IWorkerBusinessLogicContract
internal class WorkerBusinessLogicContract(IWorkerStorageContract workerStorageContract, IStringLocalizer<Messages> localizer, ILogger logger) : IWorkerBusinessLogicContract
{
private readonly ILogger _logger = logger;
private readonly IWorkerStorageContract _workerStorageContract = workerStorageContract;
private readonly IStringLocalizer<Messages> _localizer = localizer;
public List<WorkerDataModel> GetAllWorkers(bool onlyActive = true)
{
_logger.LogInformation("GetAllWorkers params: {onlyActive}", onlyActive);
return _workerStorageContract.GetList(onlyActive) ?? throw new NullListException();
return _workerStorageContract.GetList(onlyActive);
}
public List<WorkerDataModel> GetAllWorkersByPost(string postId, bool onlyActive = true)
@@ -35,7 +34,7 @@ internal class WorkerBusinessLogicContract(IWorkerStorageContract workerStorageC
{
throw new ValidationException("The value in the field postId is not a unique identifier.");
}
return _workerStorageContract.GetList(onlyActive, postId) ?? throw new NullListException();
return _workerStorageContract.GetList(onlyActive, postId);
}
public List<WorkerDataModel> GetAllWorkersByBirthDate(DateTime fromDate, DateTime toDate, bool onlyActive = true)
@@ -43,9 +42,9 @@ internal class WorkerBusinessLogicContract(IWorkerStorageContract workerStorageC
_logger.LogInformation("GetAllWorkers params: {onlyActive}, {fromDate}, {toDate}", onlyActive, fromDate, toDate);
if (fromDate.IsDateNotOlder(toDate))
{
throw new IncorrectDatesException(fromDate, toDate);
throw new IncorrectDatesException(fromDate, toDate, _localizer);
}
return _workerStorageContract.GetList(onlyActive, fromBirthDate: fromDate, toBirthDate: toDate) ?? throw new NullListException();
return _workerStorageContract.GetList(onlyActive, fromBirthDate: fromDate, toBirthDate: toDate);
}
public List<WorkerDataModel> GetAllWorkersByEmploymentDate(DateTime fromDate, DateTime toDate, bool onlyActive = true)
@@ -53,9 +52,9 @@ internal class WorkerBusinessLogicContract(IWorkerStorageContract workerStorageC
_logger.LogInformation("GetAllWorkers params: {onlyActive}, {fromDate}, {toDate}", onlyActive, fromDate, toDate);
if (fromDate.IsDateNotOlder(toDate))
{
throw new IncorrectDatesException(fromDate, toDate);
throw new IncorrectDatesException(fromDate, toDate, _localizer);
}
return _workerStorageContract.GetList(onlyActive, fromEmploymentDate: fromDate, toEmploymentDate: toDate) ?? throw new NullListException();
return _workerStorageContract.GetList(onlyActive, fromEmploymentDate: fromDate, toEmploymentDate: toDate);
}
public WorkerDataModel GetWorkerByData(string data)
@@ -67,16 +66,16 @@ internal class WorkerBusinessLogicContract(IWorkerStorageContract workerStorageC
}
if (data.IsGuid())
{
return _workerStorageContract.GetElementById(data) ?? throw new ElementNotFoundException(data);
return _workerStorageContract.GetElementById(data) ?? throw new ElementNotFoundException(data, _localizer);
}
return _workerStorageContract.GetElementByFIO(data) ?? throw new ElementNotFoundException(data);
return _workerStorageContract.GetElementByFIO(data) ?? throw new ElementNotFoundException(data, _localizer);
}
public void InsertWorker(WorkerDataModel workerDataModel)
{
_logger.LogInformation("New data: {json}", JsonSerializer.Serialize(workerDataModel));
ArgumentNullException.ThrowIfNull(workerDataModel);
workerDataModel.Validate();
workerDataModel.Validate(_localizer);
_workerStorageContract.AddElement(workerDataModel);
}
@@ -84,7 +83,7 @@ internal class WorkerBusinessLogicContract(IWorkerStorageContract workerStorageC
{
_logger.LogInformation("Update data: {json}", JsonSerializer.Serialize(workerDataModel));
ArgumentNullException.ThrowIfNull(workerDataModel);
workerDataModel.Validate();
workerDataModel.Validate(_localizer);
_workerStorageContract.UpdElement(workerDataModel);
}

View File

@@ -8,7 +8,6 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="AutoMapper" Version="14.0.0" />
<PackageReference Include="EntityFramework" Version="6.5.1" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="9.0.4" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="9.0.4">

View File

@@ -14,8 +14,6 @@ public class AndDietCokeDbContext : DbContext
public AndDietCokeDbContext(IConfigurationDatabase configurationDatabase)
{
_configurationDatabase = configurationDatabase;
AppContext.SetSwitch("Npgsql.EnableLegacyTimestampBehavior", true);
AppContext.SetSwitch("Npgsql.DisableDateTimeInfinityConversions", true);
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{

View File

@@ -1,43 +1,35 @@
using AndDietCokeContracts.DataModels;
using AndDietCokeContracts.Exceptions;
using AndDietCokeContracts.Mapper;
using AndDietCokeContracts.Resources;
using AndDietCokeContracts.StoragesContracts;
using AndDietCokeDatabase.Models;
using AutoMapper;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Localization;
using Npgsql;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AndDietCokeDatabase.Implementations;
internal class BuyerStorageContract : IBuyerStorageContract
{
private readonly AndDietCokeDbContext _dbContext;
private readonly Mapper _mapper;
public BuyerStorageContract(AndDietCokeDbContext andDietCokeDbContext)
private readonly IStringLocalizer<Messages> _localizer;
public BuyerStorageContract(AndDietCokeDbContext andDietCokeDbContext, IStringLocalizer<Messages> localizer)
{
_dbContext = andDietCokeDbContext;
var config = new MapperConfiguration(cfg =>
{
cfg.AddMaps(typeof(AndDietCokeDbContext).Assembly);
});
_mapper = new Mapper(config);
_localizer = localizer;
}
public List<BuyerDataModel> GetList()
{
try
{
return [.. _dbContext.Buyers.Select(x => _mapper.Map<BuyerDataModel>(x))];
return [.. _dbContext.Buyers.Select(x => CustomMapper.MapObject<BuyerDataModel>(x))];
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex);
throw new StorageException(ex,_localizer);
}
}
@@ -45,12 +37,12 @@ internal class BuyerStorageContract : IBuyerStorageContract
{
try
{
return _mapper.Map<BuyerDataModel>(GetBuyerById(id));
return CustomMapper.MapObjectWithNull<BuyerDataModel>(GetBuyerById(id));
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex);
throw new StorageException(ex,_localizer);
}
}
@@ -58,12 +50,12 @@ internal class BuyerStorageContract : IBuyerStorageContract
{
try
{
return _mapper.Map<BuyerDataModel>(_dbContext.Buyers.FirstOrDefault(x => x.FIO == fio));
return CustomMapper.MapObjectWithNull<BuyerDataModel>(_dbContext.Buyers.FirstOrDefault(x => x.FIO == fio));
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex);
throw new StorageException(ex,_localizer);
}
}
@@ -71,12 +63,12 @@ internal class BuyerStorageContract : IBuyerStorageContract
{
try
{
return _mapper.Map<BuyerDataModel>(_dbContext.Buyers.FirstOrDefault(x => x.PhoneNumber == phoneNumber));
return CustomMapper.MapObjectWithNull<BuyerDataModel>(_dbContext.Buyers.FirstOrDefault(x => x.PhoneNumber == phoneNumber));
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex);
throw new StorageException(ex, _localizer);
}
}
@@ -84,23 +76,29 @@ internal class BuyerStorageContract : IBuyerStorageContract
{
try
{
_dbContext.Buyers.Add(_mapper.Map<Buyer>(buyerDataModel));
_dbContext.Buyers.Add(CustomMapper.MapObject<Buyer>(buyerDataModel));
_dbContext.SaveChanges();
}
catch (InvalidOperationException ex) when (ex.TargetSite?.Name == "ThrowIdentityConflict")
{
_dbContext.ChangeTracker.Clear();
throw new ElementExistsException("Id", buyerDataModel.Id);
throw new ElementExistsException("Id", buyerDataModel.Id,_localizer);
}
catch (DbUpdateException ex) when (ex.InnerException is PostgresException { ConstraintName: "IX_Buyers_PhoneNumber" })
{
_dbContext.ChangeTracker.Clear();
throw new ElementExistsException("PhoneNumber", buyerDataModel.PhoneNumber);
throw new ElementExistsException("PhoneNumber", buyerDataModel.PhoneNumber, _localizer);
}
catch (DbUpdateException ex) when (ex.InnerException is PostgresException { ConstraintName: "PK_Buyers" })
{
_dbContext.ChangeTracker.Clear();
throw new ElementExistsException("Id", buyerDataModel.Id, _localizer);
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex);
throw new StorageException(ex, _localizer);
}
}
@@ -108,8 +106,8 @@ internal class BuyerStorageContract : IBuyerStorageContract
{
try
{
var element = GetBuyerById(buyerDataModel.Id) ?? throw new ElementNotFoundException(buyerDataModel.Id);
_dbContext.Buyers.Update(_mapper.Map(buyerDataModel, element));
var element = GetBuyerById(buyerDataModel.Id) ?? throw new ElementNotFoundException(buyerDataModel.Id, _localizer);
_dbContext.Buyers.Update(CustomMapper.MapObject(buyerDataModel, element));
_dbContext.SaveChanges();
}
catch (ElementNotFoundException)
@@ -120,12 +118,12 @@ internal class BuyerStorageContract : IBuyerStorageContract
catch (DbUpdateException ex) when (ex.InnerException is PostgresException { ConstraintName: "IX_Buyers_PhoneNumber" })
{
_dbContext.ChangeTracker.Clear();
throw new ElementExistsException("PhoneNumber", buyerDataModel.PhoneNumber);
throw new ElementExistsException("PhoneNumber", buyerDataModel.PhoneNumber, _localizer);
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex);
throw new StorageException(ex, _localizer);
}
}
@@ -133,7 +131,7 @@ internal class BuyerStorageContract : IBuyerStorageContract
{
try
{
var element = GetBuyerById(id) ?? throw new ElementNotFoundException(id);
var element = GetBuyerById(id) ?? throw new ElementNotFoundException(id, _localizer);
_dbContext.Buyers.Remove(element);
_dbContext.SaveChanges();
}
@@ -145,7 +143,7 @@ internal class BuyerStorageContract : IBuyerStorageContract
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex);
throw new StorageException(ex, _localizer);
}
}

View File

@@ -1,9 +1,11 @@
using AndDietCokeContracts.DataModels;
using AndDietCokeContracts.Exceptions;
using AndDietCokeContracts.Mapper;
using AndDietCokeContracts.Resources;
using AndDietCokeContracts.StoragesContracts;
using AndDietCokeDatabase.Models;
using AutoMapper;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Localization;
using Npgsql;
using System;
using System.Collections.Generic;
@@ -16,19 +18,11 @@ namespace AndDietCokeDatabase.Implementations;
internal class DishStorageContract : IDishStorageContract
{
private readonly AndDietCokeDbContext _dbContext;
private readonly Mapper _mapper;
public DishStorageContract(AndDietCokeDbContext dbContext)
private readonly IStringLocalizer<Messages> _localizer;
public DishStorageContract(AndDietCokeDbContext dbContext, IStringLocalizer<Messages> localizer)
{
_dbContext = dbContext;
var config = new MapperConfiguration(cfg =>
{
cfg.CreateMap<Dish, DishDataModel>();
cfg.CreateMap<DishDataModel, Dish>()
.ForMember(x => x.IsDeleted, x => x.MapFrom(src => false));
cfg.CreateMap<DishHistory, DishHistoryDataModel>();
});
_mapper = new Mapper(config);
_localizer = localizer;
}
public List<DishDataModel> GetList(bool onlyActive = true)
@@ -40,12 +34,12 @@ internal class DishStorageContract : IDishStorageContract
{
query = query.Where(x => !x.IsDeleted);
}
return [.. query.Select(x => _mapper.Map<DishDataModel>(x))];
return [.. query.Select(x => CustomMapper.MapObject<DishDataModel>(x))];
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex);
throw new StorageException(ex, _localizer);
}
}
@@ -53,12 +47,12 @@ internal class DishStorageContract : IDishStorageContract
{
try
{
return [.. _dbContext.DishHistories.Include(x => x.Dish).Where(x => x.DishId == dishId).OrderByDescending(x => x.ChangeDate).Select(x => _mapper.Map<DishHistoryDataModel>(x))];
return [.. _dbContext.DishHistories.Include(x => x.Dish).Where(x => x.DishId == dishId).OrderByDescending(x => x.ChangeDate).Select(x => CustomMapper.MapObject<DishHistoryDataModel>(x))];
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex);
throw new StorageException(ex, _localizer);
}
}
@@ -66,12 +60,12 @@ internal class DishStorageContract : IDishStorageContract
{
try
{
return _mapper.Map<DishDataModel>(GetDishById(id));
return CustomMapper.MapObjectWithNull<DishDataModel>(GetDishById(id));
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex);
throw new StorageException(ex, _localizer);
}
}
@@ -79,12 +73,12 @@ internal class DishStorageContract : IDishStorageContract
{
try
{
return _mapper.Map<DishDataModel>(_dbContext.Dishes.FirstOrDefault(x => x.DishName == name && !x.IsDeleted));
return CustomMapper.MapObjectWithNull<DishDataModel>(_dbContext.Dishes.FirstOrDefault(x => x.DishName == name && !x.IsDeleted));
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex);
throw new StorageException(ex, _localizer);
}
}
@@ -92,23 +86,29 @@ internal class DishStorageContract : IDishStorageContract
{
try
{
_dbContext.Dishes.Add(_mapper.Map<Dish>(dishDataModel));
_dbContext.Dishes.Add(CustomMapper.MapObject<Dish>(dishDataModel));
_dbContext.SaveChanges();
}
catch (InvalidOperationException ex) when (ex.TargetSite?.Name == "ThrowIdentityConflict")
{
_dbContext.ChangeTracker.Clear();
throw new ElementExistsException("Id", dishDataModel.Id);
throw new ElementExistsException("Id", dishDataModel.Id,_localizer);
}
catch (DbUpdateException ex) when (ex.InnerException is PostgresException { ConstraintName: "IX_Dishes_DishName_IsDeleted" })
{
_dbContext.ChangeTracker.Clear();
throw new ElementExistsException("DishName", dishDataModel.DishName);
throw new ElementExistsException("DishName", dishDataModel.DishName, _localizer);
}
catch (DbUpdateException ex) when (ex.InnerException is PostgresException { ConstraintName: "PK_Dishes" })
{
_dbContext.ChangeTracker.Clear();
throw new ElementExistsException("Id", dishDataModel.Id, _localizer);
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex);
throw new StorageException(ex, _localizer);
}
}
@@ -119,13 +119,13 @@ internal class DishStorageContract : IDishStorageContract
var transaction = _dbContext.Database.BeginTransaction();
try
{
var element = GetDishById(dishDataModel.Id) ?? throw new ElementNotFoundException(dishDataModel.Id);
var element = GetDishById(dishDataModel.Id) ?? throw new ElementNotFoundException(dishDataModel.Id, _localizer);
if (element.Price != dishDataModel.Price)
{
_dbContext.DishHistories.Add(new DishHistory() { DishId = element.Id, OldPrice = element.Price });
_dbContext.SaveChanges();
}
_dbContext.Dishes.Update(_mapper.Map(dishDataModel, element));
_dbContext.Dishes.Update(CustomMapper.MapObject(dishDataModel, element));
_dbContext.SaveChanges();
transaction.Commit();
}
@@ -138,7 +138,7 @@ internal class DishStorageContract : IDishStorageContract
catch (DbUpdateException ex) when (ex.InnerException is PostgresException { ConstraintName: "IX_Dishes_DishName_IsDeleted" })
{
_dbContext.ChangeTracker.Clear();
throw new ElementExistsException("DishName", dishDataModel.DishName);
throw new ElementExistsException("DishName", dishDataModel.DishName, _localizer);
}
catch (Exception ex) when (ex is ElementDeletedException || ex is ElementNotFoundException)
{
@@ -148,7 +148,7 @@ internal class DishStorageContract : IDishStorageContract
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex);
throw new StorageException(ex, _localizer);
}
}
@@ -156,7 +156,7 @@ internal class DishStorageContract : IDishStorageContract
{
try
{
var element = GetDishById(id) ?? throw new ElementNotFoundException(id);
var element = GetDishById(id) ?? throw new ElementNotFoundException(id, _localizer);
element.IsDeleted = true;
_dbContext.SaveChanges();
}
@@ -168,7 +168,7 @@ internal class DishStorageContract : IDishStorageContract
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex);
throw new StorageException(ex, _localizer);
}
}
@@ -182,12 +182,12 @@ internal class DishStorageContract : IDishStorageContract
.Include(x => x.Dish)
.ToListAsync(ct);
return entities.Select(x => _mapper.Map<DishHistoryDataModel>(x)).ToList();
return entities.Select(x => CustomMapper.MapObject<DishHistoryDataModel>(x)).ToList();
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex);
throw new StorageException(ex, _localizer);
}
}
}

View File

@@ -1,38 +1,22 @@
using AndDietCokeContracts.DataModels;
using AndDietCokeContracts.Exceptions;
using AndDietCokeContracts.Mapper;
using AndDietCokeContracts.Resources;
using AndDietCokeContracts.StoragesContracts;
using AndDietCokeDatabase.Models;
using AutoMapper;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Localization;
using Npgsql;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AndDietCokeDatabase.Implementations;
internal class PostStorageContract : IPostStorageContract
{
private readonly AndDietCokeDbContext _dbContext;
private readonly Mapper _mapper;
public PostStorageContract(AndDietCokeDbContext dbContext)
private readonly IStringLocalizer<Messages> _localizer;
public PostStorageContract(AndDietCokeDbContext dbContext, IStringLocalizer<Messages> localizer)
{
_dbContext = dbContext;
var config = new MapperConfiguration(cfg =>
{
cfg.CreateMap<Post, PostDataModel>()
.ForMember(x => x.Id, opt => opt.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))
.ForMember(x => x.Configuration, x => x.MapFrom(src => src.ConfigurationModel));
});
_mapper = new Mapper(config);
_localizer = localizer;
}
public List<PostDataModel> GetList(bool onlyActual = true)
@@ -40,12 +24,12 @@ internal class PostStorageContract : IPostStorageContract
try
{
var query = _dbContext.Posts.AsQueryable();
return [.. query.Select(x => _mapper.Map<PostDataModel>(x))];
return [.. query.Select(x => CustomMapper.MapObject<PostDataModel>(x))];
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex);
throw new StorageException(ex, _localizer);
}
}
@@ -53,12 +37,12 @@ internal class PostStorageContract : IPostStorageContract
{
try
{
return [.. _dbContext.Posts.Where(x => x.PostId == postId).Select(x => _mapper.Map<PostDataModel>(x))];
return [.. _dbContext.Posts.Where(x => x.PostId == postId).Select(x => CustomMapper.MapObject<PostDataModel>(x))];
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex);
throw new StorageException(ex, _localizer);
}
}
@@ -66,12 +50,12 @@ internal class PostStorageContract : IPostStorageContract
{
try
{
return _mapper.Map<PostDataModel>(_dbContext.Posts.FirstOrDefault(x => x.PostId == id && x.IsActual));
return CustomMapper.MapObjectWithNull<PostDataModel>(_dbContext.Posts.FirstOrDefault(x => x.PostId == id && x.IsActual));
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex);
throw new StorageException(ex, _localizer);
}
}
@@ -79,12 +63,12 @@ internal class PostStorageContract : IPostStorageContract
{
try
{
return _mapper.Map<PostDataModel>(_dbContext.Posts.FirstOrDefault(x => x.PostName == name && x.IsActual));
return CustomMapper.MapObjectWithNull<PostDataModel>(_dbContext.Posts.FirstOrDefault(x => x.PostName == name && x.IsActual));
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex);
throw new StorageException(ex, _localizer);
}
}
@@ -92,23 +76,23 @@ internal class PostStorageContract : IPostStorageContract
{
try
{
_dbContext.Posts.Add(_mapper.Map<Post>(postDataModel));
_dbContext.Posts.Add(CustomMapper.MapObject<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);
throw new ElementExistsException("PostName", postDataModel.PostName,_localizer);
}
catch (DbUpdateException ex) when (ex.InnerException is PostgresException { ConstraintName: "IX_Posts_PostId_IsActual" })
{
_dbContext.ChangeTracker.Clear();
throw new ElementExistsException("PostId", postDataModel.Id);
throw new ElementExistsException("PostId", postDataModel.Id, _localizer);
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex);
throw new StorageException(ex, _localizer);
}
}
@@ -119,14 +103,14 @@ internal class PostStorageContract : IPostStorageContract
var transaction = _dbContext.Database.BeginTransaction();
try
{
var element = GetPostById(postDataModel.Id) ?? throw new ElementNotFoundException(postDataModel.Id);
var element = GetPostById(postDataModel.Id) ?? throw new ElementNotFoundException(postDataModel.Id, _localizer);
if (!element.IsActual)
{
throw new ElementDeletedException(postDataModel.Id);
throw new ElementDeletedException(postDataModel.Id, _localizer);
}
element.IsActual = false;
_dbContext.SaveChanges();
var newElement = _mapper.Map<Post>(postDataModel);
var newElement = CustomMapper.MapObject<Post>(postDataModel);
_dbContext.Posts.Add(newElement);
_dbContext.SaveChanges();
transaction.Commit();
@@ -140,7 +124,7 @@ internal class PostStorageContract : IPostStorageContract
catch (DbUpdateException ex) when (ex.InnerException is PostgresException { ConstraintName: "IX_Posts_PostName_IsActual" })
{
_dbContext.ChangeTracker.Clear();
throw new ElementExistsException("PostName", postDataModel.PostName);
throw new ElementExistsException("PostName", postDataModel.PostName, _localizer);
}
catch (Exception ex) when (ex is ElementDeletedException || ex is ElementNotFoundException)
{
@@ -150,7 +134,7 @@ internal class PostStorageContract : IPostStorageContract
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex);
throw new StorageException(ex, _localizer);
}
}
@@ -158,10 +142,10 @@ internal class PostStorageContract : IPostStorageContract
{
try
{
var element = GetPostById(id) ?? throw new ElementNotFoundException(id);
var element = GetPostById(id) ?? throw new ElementNotFoundException(id, _localizer);
if (!element.IsActual)
{
throw new ElementDeletedException(id);
throw new ElementDeletedException(id, _localizer);
}
element.IsActual = false;
_dbContext.SaveChanges();
@@ -177,7 +161,7 @@ internal class PostStorageContract : IPostStorageContract
{
try
{
var element = GetPostById(id) ?? throw new ElementNotFoundException(id);
var element = GetPostById(id) ?? throw new ElementNotFoundException(id, _localizer);
element.IsActual = true;
_dbContext.SaveChanges();
}

View File

@@ -1,9 +1,11 @@
using AndDietCokeContracts.DataModels;
using AndDietCokeContracts.Exceptions;
using AndDietCokeContracts.Mapper;
using AndDietCokeContracts.Resources;
using AndDietCokeContracts.StoragesContracts;
using AndDietCokeDatabase.Models;
using AutoMapper;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Localization;
namespace AndDietCokeDatabase.Implementations;
@@ -11,20 +13,11 @@ namespace AndDietCokeDatabase.Implementations;
internal class SalaryStorageContract : ISalaryStorageContract
{
private readonly AndDietCokeDbContext _dbContext;
private readonly Mapper _mapper;
public SalaryStorageContract(AndDietCokeDbContext dbContext)
private readonly IStringLocalizer<Messages> _localizer;
public SalaryStorageContract(AndDietCokeDbContext dbContext, IStringLocalizer<Messages> localizer)
{
_dbContext = dbContext;
var config = new MapperConfiguration(cfg =>
{
cfg.CreateMap<Worker, WorkerDataModel>();
cfg.CreateMap<WorkerDataModel, Worker>();
cfg.CreateMap<Salary, SalaryDataModel>();
cfg.CreateMap<SalaryDataModel, Salary>()
.ForMember(dest => dest.WorkerSalary, opt => opt.MapFrom(src => src.Salary));
});
_mapper = new Mapper(config);
_localizer = localizer;
}
public List<SalaryDataModel> GetList(DateTime startDate, DateTime endDate, string? workerId = null)
@@ -36,12 +29,12 @@ internal class SalaryStorageContract : ISalaryStorageContract
{
query = query.Where(x => x.WorkerId == workerId);
}
return [.. query.Select(x => _mapper.Map<SalaryDataModel>(x))];
return [.. query.Select(x => CustomMapper.MapObject<SalaryDataModel>(x))];
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex);
throw new StorageException(ex, _localizer);
}
}
@@ -49,13 +42,13 @@ internal class SalaryStorageContract : ISalaryStorageContract
{
try
{
_dbContext.Salaries.Add(_mapper.Map<Salary>(salaryDataModel));
_dbContext.Salaries.Add(CustomMapper.MapObject<Salary>(salaryDataModel));
_dbContext.SaveChanges();
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex);
throw new StorageException(ex, _localizer);
}
}
@@ -63,12 +56,12 @@ internal class SalaryStorageContract : ISalaryStorageContract
{
try
{
return [.. await _dbContext.Salaries.Include(x => x.Worker).Where(x => x.SalaryDate >= startDate && x.SalaryDate <= endDate).Select(x => _mapper.Map<SalaryDataModel>(x)).ToListAsync()];
return [.. await _dbContext.Salaries.Include(x => x.Worker).Where(x => x.SalaryDate >= startDate && x.SalaryDate <= endDate).Select(x => CustomMapper.MapObject<SalaryDataModel>(x)).ToListAsync()];
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex);
throw new StorageException(ex, _localizer);
}
}
}

View File

@@ -2,37 +2,21 @@
using AndDietCokeContracts.Exceptions;
using AndDietCokeContracts.StoragesContracts;
using AndDietCokeDatabase.Models;
using AutoMapper;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Localization;
using AndDietCokeContracts.Resources;
using AndDietCokeContracts.Mapper;
namespace AndDietCokeDatabase.Implementations;
internal class SaleStorageContract : ISaleStorageContract
{
private readonly AndDietCokeDbContext _dbContext;
private readonly Mapper _mapper;
public SaleStorageContract(AndDietCokeDbContext dbContext)
private readonly IStringLocalizer<Messages> _localizer;
public SaleStorageContract(AndDietCokeDbContext dbContext, IStringLocalizer<Messages> localizer)
{
_dbContext = dbContext;
var config = new MapperConfiguration(cfg =>
{
cfg.CreateMap<Buyer, BuyerDataModel>();
cfg.CreateMap<Dish, DishDataModel>();
cfg.CreateMap<Worker, WorkerDataModel>();
cfg.CreateMap<OrderDish, OrderDishDataModel>();
cfg.CreateMap<Sale, SaleDataModel>();
cfg.CreateMap<OrderDishDataModel, OrderDish>();
cfg.CreateMap<SaleDataModel, Sale>()
.ForMember(x => x.IsCancel, x => x.MapFrom(src => false))
.ForMember(x => x.OrderDishes, x => x.MapFrom(src => src.Dishes));
});
_mapper = new Mapper(config);
_localizer = localizer;
}
public List<SaleDataModel> GetList(DateTime? startDate = null, DateTime? endDate = null, string? workerId = null, string? buyerId = null, string? dishId = null)
@@ -56,12 +40,12 @@ internal class SaleStorageContract : ISaleStorageContract
{
query = query.Where(x => x.OrderDishes!.Any(y => y.DishId == dishId));
}
return [.. query.Select(x => _mapper.Map<SaleDataModel>(x))];
return [.. query.Select(x => CustomMapper.MapObject<SaleDataModel>(x))];
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex);
throw new StorageException(ex, _localizer);
}
}
@@ -69,12 +53,12 @@ internal class SaleStorageContract : ISaleStorageContract
{
try
{
return _mapper.Map<SaleDataModel>(GetSaleById(id));
return CustomMapper.MapObjectWithNull<SaleDataModel>(GetSaleById(id));
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex);
throw new StorageException(ex, _localizer);
}
}
@@ -82,13 +66,13 @@ internal class SaleStorageContract : ISaleStorageContract
{
try
{
_dbContext.Sales.Add(_mapper.Map<Sale>(saleDataModel));
_dbContext.Sales.Add(CustomMapper.MapObject<Sale>(saleDataModel));
_dbContext.SaveChanges();
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex);
throw new StorageException(ex, _localizer);
}
}
@@ -96,10 +80,10 @@ internal class SaleStorageContract : ISaleStorageContract
{
try
{
var element = GetSaleById(id) ?? throw new ElementNotFoundException(id);
var element = GetSaleById(id) ?? throw new ElementNotFoundException(id, _localizer);
if (element.IsCancel)
{
throw new ElementDeletedException(id);
throw new ElementDeletedException(id, _localizer);
}
element.IsCancel = true;
_dbContext.SaveChanges();
@@ -112,7 +96,7 @@ internal class SaleStorageContract : ISaleStorageContract
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex);
throw new StorageException(ex, _localizer);
}
}
@@ -124,12 +108,12 @@ internal class SaleStorageContract : ISaleStorageContract
{
var query = _dbContext.Sales.Include(x => x.Buyer).Include(x => x.Worker).Include(x => x.OrderDishes)!.ThenInclude(x => x.Dish).AsQueryable();
query = query.Where(x => x.SaleDate.Date >= startDate.Date && x.SaleDate.Date < endDate.Date);
return Task.FromResult(query.Select(x => _mapper.Map<SaleDataModel>(x)).ToList());
return Task.FromResult(query.Select(x => CustomMapper.MapObject<SaleDataModel>(x)).ToList());
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex);
throw new StorageException(ex, _localizer);
}
}
}

View File

@@ -1,33 +1,24 @@
using AndDietCokeContracts.DataModels;
using AndDietCokeContracts.Exceptions;
using AndDietCokeContracts.Mapper;
using AndDietCokeContracts.Resources;
using AndDietCokeContracts.StoragesContracts;
using AndDietCokeDatabase.Models;
using AutoMapper;
using System;
using System.Collections.Generic;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Localization;
using Npgsql;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AndDietCokeDatabase.Implementations;
internal class WorkerStorageContract : IWorkerStorageContract
{
private readonly AndDietCokeDbContext _dbContext;
private readonly Mapper _mapper;
public WorkerStorageContract(AndDietCokeDbContext dbContext)
private readonly IStringLocalizer<Messages> _localizer;
public WorkerStorageContract(AndDietCokeDbContext dbContext, IStringLocalizer<Messages> localizer)
{
_dbContext = dbContext;
var config = new MapperConfiguration(cfg =>
{
cfg.CreateMap<Post, PostDataModel>()
.ForMember(x => x.Id, x => x.MapFrom(src => src.PostId));
cfg.CreateMap<Worker, WorkerDataModel>();
cfg.CreateMap<WorkerDataModel, Worker>();
});
_mapper = new Mapper(config);
_localizer = localizer;
}
public List<WorkerDataModel> GetList(bool onlyActive = true, string? postId = null, DateTime? fromBirthDate = null, DateTime? toBirthDate = null, DateTime? fromEmploymentDate = null, DateTime? toEmploymentDate = null)
@@ -51,12 +42,12 @@ internal class WorkerStorageContract : IWorkerStorageContract
{
query = query.Where(x => x.EmploymentDate >= fromEmploymentDate && x.EmploymentDate <= toEmploymentDate);
}
return [.. JoinPost(query).Select(x => _mapper.Map<WorkerDataModel>(x))];
return [.. JoinPost(query).Select(x => CustomMapper.MapObject<WorkerDataModel>(x))];
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex);
throw new StorageException(ex, _localizer);
}
}
@@ -64,12 +55,12 @@ internal class WorkerStorageContract : IWorkerStorageContract
{
try
{
return _mapper.Map<WorkerDataModel>(GetWorkerById(id));
return CustomMapper.MapObjectWithNull<WorkerDataModel>(GetWorkerById(id));
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex);
throw new StorageException(ex, _localizer);
}
}
@@ -77,12 +68,12 @@ internal class WorkerStorageContract : IWorkerStorageContract
{
try
{
return _mapper.Map<WorkerDataModel>(AddPost(_dbContext.Workers.FirstOrDefault(x => x.FIO == fio && !x.IsDeleted)));
return CustomMapper.MapObjectWithNull<WorkerDataModel>(AddPost(_dbContext.Workers.FirstOrDefault(x => x.FIO == fio && !x.IsDeleted)));
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex);
throw new StorageException(ex, _localizer);
}
}
@@ -90,18 +81,23 @@ internal class WorkerStorageContract : IWorkerStorageContract
{
try
{
_dbContext.Workers.Add(_mapper.Map<Worker>(workerDataModel));
_dbContext.Workers.Add(CustomMapper.MapObject<Worker>(workerDataModel));
_dbContext.SaveChanges();
}
catch (InvalidOperationException ex) when (ex.TargetSite?.Name == "ThrowIdentityConflict")
{
_dbContext.ChangeTracker.Clear();
throw new ElementExistsException("Id", workerDataModel.Id);
throw new ElementExistsException("Id", workerDataModel.Id, _localizer);
}
catch (DbUpdateException ex) when (ex.InnerException is PostgresException { ConstraintName: "PK_Workers" })
{
_dbContext.ChangeTracker.Clear();
throw new ElementExistsException("Id", workerDataModel.Id, _localizer);
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex);
throw new StorageException(ex, _localizer);
}
}
@@ -116,7 +112,7 @@ internal class WorkerStorageContract : IWorkerStorageContract
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex);
throw new StorageException(ex, _localizer);
}
}
@@ -124,8 +120,8 @@ internal class WorkerStorageContract : IWorkerStorageContract
{
try
{
var element = GetWorkerById(workerDataModel.Id) ?? throw new ElementNotFoundException(workerDataModel.Id);
_dbContext.Workers.Update(_mapper.Map(workerDataModel, element));
var element = GetWorkerById(workerDataModel.Id) ?? throw new ElementNotFoundException(workerDataModel.Id, _localizer);
_dbContext.Workers.Update(CustomMapper.MapObject(workerDataModel, element));
_dbContext.SaveChanges();
}
catch (ElementNotFoundException)
@@ -136,7 +132,7 @@ internal class WorkerStorageContract : IWorkerStorageContract
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex);
throw new StorageException(ex, _localizer);
}
}
@@ -144,7 +140,7 @@ internal class WorkerStorageContract : IWorkerStorageContract
{
try
{
var element = GetWorkerById(id) ?? throw new ElementNotFoundException(id);
var element = GetWorkerById(id) ?? throw new ElementNotFoundException(id, _localizer);
element.IsDeleted = true;
element.DateOfDelete = DateTime.UtcNow;
_dbContext.SaveChanges();
@@ -157,7 +153,7 @@ internal class WorkerStorageContract : IWorkerStorageContract
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex);
throw new StorageException(ex, _localizer);
}
}
private Worker? GetWorkerById(string id) => AddPost(_dbContext.Workers.FirstOrDefault(x => x.Id == id && !x.IsDeleted));

View File

@@ -1,5 +1,4 @@
using AndDietCokeContracts.DataModels;
using AutoMapper;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
@@ -9,7 +8,6 @@ using System.Threading.Tasks;
namespace AndDietCokeDatabase.Models;
[AutoMap(typeof(BuyerDataModel), ReverseMap = true)]
public class Buyer
{
public required string Id { get; set; }

View File

@@ -1,4 +1,5 @@
using AndDietCokeContracts.Enums;
using AndDietCokeContracts.Mapper;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
@@ -18,7 +19,7 @@ public class Dish
public DishType DishType { get; set; }
public double Price { get; set; }
[IgnoreValue]
public bool IsDeleted { get; set; }
[ForeignKey("DishId")]

View File

@@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using AndDietCokeContracts.Mapper;
namespace AndDietCokeDatabase.Models;
@@ -13,7 +14,7 @@ public class DishHistory
public required string DishId { get; set; }
public double OldPrice { get; set; }
[CustomDefault(FuncName = DefaultValuesFunc.UtcNow)]
public DateTime ChangeDate { get; set; }
public Dish? Dish { get; set; }

View File

@@ -1,5 +1,6 @@
using AndDietCokeContracts.Enums;
using AndDietCokeContracts.Infrastrusture.PostConfiguration;
using AndDietCokeContracts.Mapper;
using System;
using System.Collections.Generic;
using System.Linq;
@@ -10,15 +11,18 @@ namespace AndDietCokeDatabase.Models;
public class Post
{
[IgnoreValue]
public required string Id { get; set; } = Guid.NewGuid().ToString();
[AlternativeName("Id")]
public required string PostId { get; set; }
public required string PostName { get; set; }
public PostType PostType { get; set; }
[AlternativeName("ConfigurationModel")]
public required PostConfiguration Configuration { get; set; }
[CustomDefault(DefaultValue = true)]
public bool IsActual { get; set; }
[CustomDefault(FuncName = DefaultValuesFunc.UtcNow)]
public DateTime ChangeDate { get; set; }
}

View File

@@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using AndDietCokeContracts.Mapper;
namespace AndDietCokeDatabase.Models;
@@ -11,9 +12,9 @@ public class Salary
public string Id { get; set; } = Guid.NewGuid().ToString();
public required string WorkerId { get; set; }
[CustomDefault(FuncName = DefaultValuesFunc.UtcNow)]
public DateTime SalaryDate { get; set; }
[AlternativeName("Salary")]
public double WorkerSalary { get; set; }
public Worker? Worker { get; set; }

View File

@@ -1,9 +1,11 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using AndDietCokeContracts.Mapper;
namespace AndDietCokeDatabase.Models;
@@ -14,13 +16,14 @@ public class Sale
public required string WorkerId { get; set; }
public string? BuyerId { get; set; }
[CustomDefault(FuncName = DefaultValuesFunc.UtcNow)]
public DateTime SaleDate { get; set; }
public double Sum { get; set; }
public bool IsConstantClient { get; set; }
[IgnoreValue]
[CustomDefault(DefaultValue = false)]
public bool IsCancel { get; set; }
public Worker? Worker { get; set; }
@@ -28,5 +31,6 @@ public class Sale
public Buyer? Buyer { get; set; }
[ForeignKey("SaleId")]
[AlternativeName("Dishes")]
public List<OrderDish>? OrderDishes { get; set; }
}

View File

@@ -1,15 +1,9 @@
using AndDietCokeContracts.DataModels;
using AutoMapper;
using System;
using System.Collections.Generic;
using AndDietCokeContracts.Mapper;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AndDietCokeDatabase.Models;
[AutoMap(typeof(WorkerDataModel), ReverseMap = true)]
public class Worker
{
public required string Id { get; set; }
@@ -17,12 +11,14 @@ public class Worker
public required string FIO { get; set; }
public required string PostId { get; set; }
[CustomDefault(FuncName = DefaultValuesFunc.UtcNow)]
public DateTime BirthDate { get; set; }
[CustomDefault(FuncName = DefaultValuesFunc.UtcNow)]
public DateTime EmploymentDate { get; set; }
[CustomDefault(DefaultValue = false)]
public bool IsDeleted { get; set; }
public DateTime? DateOfDelete { get; set; }
[IgnoreValue]
[NotMapped]
public Post? Post { get; set; }

View File

@@ -1,4 +1,4 @@
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
@@ -8,13 +8,34 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="AutoMapper" Version="14.0.0" />
<PackageReference Include="EntityFramework" Version="6.5.1" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Abstractions" Version="2.3.0" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Core" Version="2.3.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="9.0.4" />
<PackageReference Include="Microsoft.Extensions.Localization.Abstractions" Version="9.0.5" />
<PackageReference Include="Npgsql" Version="9.0.3" />
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="9.0.4" />
</ItemGroup>
<ItemGroup>
<InternalsVisibleTo Include="AndDietCokeTests" />
<InternalsVisibleTo Include="AndDietCokeWebApi" />
<InternalsVisibleTo Include="AndDietCokeDatabase" />
<InternalsVisibleTo Include="DynamicProxyGenAssembly2" />
<InternalsVisibleTo Include="AndDietCokeBuisnessLogic" />
</ItemGroup>
<ItemGroup>
<Compile Update="Resources\Messages.Designer.cs">
<DesignTime>True</DesignTime>
<AutoGen>True</AutoGen>
<DependentUpon>Messages.resx</DependentUpon>
</Compile>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Update="Resources\Messages.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Messages.Designer.cs</LastGenOutput>
</EmbeddedResource>
</ItemGroup>
</Project>

View File

@@ -7,7 +7,7 @@ using System.Threading.Tasks;
namespace AndDietCokeContracts.BisnessLogicsContracts;
public interface IBuyerBusinessLogicContract
internal interface IBuyerBusinessLogicContract
{
List<BuyerDataModel> GetAllBuyers();
BuyerDataModel GetBuyerByData(string data);

View File

@@ -7,7 +7,7 @@ using System.Threading.Tasks;
namespace AndDietCokeContracts.BisnessLogicsContracts;
public interface IDishBusinessLogicContract
internal interface IDishBusinessLogicContract
{
List<DishDataModel> GetAllDishes(bool onlyActive = true);
List<DishHistoryDataModel> GetDishHistoryByDish(string dishId);

View File

@@ -7,7 +7,7 @@ using System.Threading.Tasks;
namespace AndDietCokeContracts.BisnessLogicsContracts;
public interface IPostBusinessLogicContract
internal interface IPostBusinessLogicContract
{
List<PostDataModel> GetAllPosts(bool onlyActive);
List<PostDataModel> GetAllDataOfPost(string postId);

View File

@@ -2,7 +2,7 @@
namespace AndDietCokeBuisnessLogic.BusinessLogicsContracts
{
public interface IReportContract
internal interface IReportContract
{
Task<List<DishPriceReportDataModel>> GetDataDishPricesAsync(CancellationToken ct);

View File

@@ -7,7 +7,7 @@ using System.Threading.Tasks;
namespace AndDietCokeContracts.BisnessLogicsContracts;
public interface ISalaryBusinessLogicContract
internal interface ISalaryBusinessLogicContract
{
List<SalaryDataModel> GetAllSalariesByPeriod(DateTime fromDate, DateTime toDate);
List<SalaryDataModel> GetAllSalariesByPeriodByWorker(DateTime fromDate, DateTime toDate, string workerId);

View File

@@ -7,7 +7,7 @@ using System.Threading.Tasks;
namespace AndDietCokeContracts.BisnessLogicsContracts;
public interface ISaleBusinessLogicContract
internal interface ISaleBusinessLogicContract
{
List<SaleDataModel> GetAllSalesByPeriod(DateTime fromDate, DateTime toDate);
List<SaleDataModel> GetAllSalesByWorkerByPeriod(string workerId, DateTime fromDate, DateTime toDate);

View File

@@ -7,7 +7,7 @@ using System.Threading.Tasks;
namespace AndDietCokeContracts.BisnessLogicsContracts;
public interface IWorkerBusinessLogicContract
internal interface IWorkerBusinessLogicContract
{
List<WorkerDataModel> GetAllWorkers(bool onlyActive = true);
List<WorkerDataModel> GetAllWorkersByPost(string postId, bool onlyActive = true);

View File

@@ -10,28 +10,32 @@ using static System.Runtime.InteropServices.JavaScript.JSType;
using System.Xml;
using AndDietCokeContracts.Infrastrusture;
using AndDietCokeContracts.Exceptions;
using AndDietCokeContracts.Resources;
using Microsoft.Extensions.Localization;
namespace AndDietCokeContracts.DataModels;
public class BuyerDataModel(string id, string fio, string phoneNumber, double discountSize) : IValidation
internal class BuyerDataModel(string id, string fio, string phoneNumber, double discountSize) : IValidation
{
public string Id { get; private set; } = id;
public string FIO { get; private set; } = fio;
public string PhoneNumber { get; private set; } = phoneNumber;
public double DiscountSize { get; private set; } = discountSize;
public void Validate()
public BuyerDataModel() : this("","","",0)
{ }
public void Validate(IStringLocalizer<Messages> localizer)
{
if (Id.IsEmpty())
throw new ValidationException("Field Id is empty");
throw new ValidationException(string.Format(localizer["ValidationExceptionMessageEmptyField"], "Id"));
if (!Id.IsGuid())
throw new ValidationException("The value in the field Id is not a unique identifier");
throw new ValidationException(string.Format(localizer["ValidationExceptionMessageNotAId"], "Id"));
if (FIO.IsEmpty())
throw new ValidationException("Field FIO is empty");
throw new ValidationException(string.Format(localizer["ValidationExceptionMessageEmptyField"], "FIO"));
if (PhoneNumber.IsEmpty())
throw new ValidationException("Field PhoneNumber is empty");
throw new ValidationException(string.Format(localizer["ValidationExceptionMessageEmptyField"], "PhoneNumber"));
if (!Regex.IsMatch(PhoneNumber, @"^((8|\+7)[\- ]?)?(\(?\d{3}\)?[\- ]?)?[\d\- ]{7,10}$"))
throw new ValidationException("Field PhoneNumber is not a phone number");
throw new ValidationException(localizer["ValidationExceptionMessageIncorrectPhoneNumber"]);
if (!Regex.IsMatch(FIO, @"^[А-ЯЁA-Z][а-яёa-z]+(?:-[А-ЯЁA-Z][а-яёa-z]+)?\s[А-ЯЁA-Z][а-яёa-z]+(?:\s[А-ЯЁA-Z][а-яёa-z]+)?$"))
throw new ValidationException("Incorrect FIO input");
throw new ValidationException(localizer["ValidationExceptionMessageWrongFIO"]);
}
}

View File

@@ -8,10 +8,13 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
using AndDietCokeContracts.Resources;
using Microsoft.Extensions.Localization;
using AndDietCokeContracts.Mapper;
namespace AndDietCokeContracts.DataModels;
public class DishDataModel(string id, string dishName, DishType dishType, double price, bool isDeleted) : IValidation
internal class DishDataModel(string id, string dishName, DishType dishType, double price, bool isDeleted) : IValidation
{
public string Id { get; private set; } = id;
public string DishName { get; private set; } = dishName;
@@ -20,18 +23,21 @@ public class DishDataModel(string id, string dishName, DishType dishType, double
public bool IsDeleted { get; private set; } = isDeleted;
public DishDataModel(string id, string dishName, int dishType, double price) : this(id, dishName, (DishType)dishType, price, false) { }
public DishDataModel() : this("", "", DishType.None, 0, false)
{
public void Validate()
}
public void Validate(IStringLocalizer<Messages> localizer)
{
if (Id.IsEmpty())
throw new ValidationException("Field Id is empty");
throw new ValidationException(string.Format(localizer["ValidationExceptionMessageEmptyField"], "Id"));
if (!Id.IsGuid())
throw new ValidationException("The value in the field Id is not a unique identifier");
throw new ValidationException(string.Format(localizer["ValidationExceptionMessageNotAId"], "Id"));
if (DishName.IsEmpty())
throw new ValidationException("Field DishName is empty");
throw new ValidationException(string.Format(localizer["ValidationExceptionMessageEmptyField"], "DishName"));
if (DishType == DishType.None)
throw new ValidationException("Field DishType is empty");
throw new ValidationException(string.Format(localizer["ValidationExceptionMessageEmptyField"], "DishType"));
if (Price <= 0)
throw new ValidationException("Field Price is less than or equal to 0");
throw new ValidationException(string.Format(localizer["ValidationExceptionMessageLessOrEqualZero"], "Price"));
}
}

View File

@@ -6,11 +6,15 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using AndDietCokeContracts.Resources;
using Microsoft.Extensions.Localization;
using AndDietCokeContracts.Mapper;
namespace AndDietCokeContracts.DataModels;
public class DishHistoryDataModel(string dishId, double oldPrice) : IValidation
internal class DishHistoryDataModel(string dishId, double oldPrice) : IValidation
{
[SourceFromMember(SourcePropertyName = "Dish")]
private readonly DishDataModel? _dish;
public string DishId { get; private set; } = dishId;
public double OldPrice { get; private set; } = oldPrice;
@@ -19,18 +23,21 @@ public class DishHistoryDataModel(string dishId, double oldPrice) : IValidation
public DishHistoryDataModel(string dishId, double oldPrice, DateTime changeDate, DishDataModel dish) : this(dishId, oldPrice)
{
ChangeDate = changeDate;
ChangeDate = changeDate.ToUniversalTime();
_dish = dish;
}
public DishHistoryDataModel() : this ("", 0)
{
public void Validate()
}
public void Validate(IStringLocalizer<Messages> localizer)
{
if (DishId.IsEmpty())
throw new ValidationException("Field DishId is empty");
throw new ValidationException(string.Format(localizer["ValidationExceptionMessageEmptyField"], "DishId"));
if (!DishId.IsGuid())
throw new ValidationException("The value in the field DishId is not a unique identifier");
throw new ValidationException(string.Format(localizer["ValidationExceptionMessageNotAId"], "DishId"));
if (OldPrice <= 0)
throw new ValidationException("Field OldPrice is less than or equal to 0");
throw new ValidationException(string.Format(localizer["ValidationExceptionMessageLessOrEqualZero"], "OldPrice"));
}
}

View File

@@ -1,6 +1,9 @@
using AndDietCokeContracts.Exceptions;
using AndDietCokeContracts.Extensions;
using AndDietCokeContracts.Infrastrusture;
using AndDietCokeContracts.Mapper;
using AndDietCokeContracts.Resources;
using Microsoft.Extensions.Localization;
using System;
using System.Collections.Generic;
using System.Diagnostics;
@@ -10,31 +13,32 @@ using System.Threading.Tasks;
namespace AndDietCokeContracts.DataModels;
public class OrderDishDataModel(string orderId, string dishId, int count, double price) : IValidation
internal class OrderDishDataModel(string orderId, string dishId, int count, double price) : IValidation
{
[SourceFromMember(SourcePropertyName ="Dish")]
private readonly DishDataModel? _dish;
public string OrderId { get; private set; } = orderId;
public string DishId { get; private set; } = dishId;
public int Count { get; private set; } = count;
public double Price { get; private set; } = price;
public string DishName => _dish?.DishName ?? string.Empty;
public OrderDishDataModel() : this ("","",0,0) { }
public OrderDishDataModel(string saleId, string dishId, int count, double price, DishDataModel dish) : this(saleId, dishId, count, price)
{
_dish = dish;
}
public void Validate()
public void Validate(IStringLocalizer<Messages> localizer)
{
if (OrderId.IsEmpty())
throw new ValidationException("Field OrderId is empty");
throw new ValidationException(string.Format(localizer["ValidationExceptionMessageEmptyField"], "OrderId"));
if (!OrderId.IsGuid())
throw new ValidationException("The value in the field OrderId is not a unique identifier");
throw new ValidationException(string.Format(localizer["ValidationExceptionMessageNotAId"], "OrderId"));
if (DishId.IsEmpty())
throw new ValidationException("Field DishId is empty");
throw new ValidationException(string.Format(localizer["ValidationExceptionMessageEmptyField"], "DishId"));
if (!DishId.IsGuid())
throw new ValidationException("The value in the field DishId is not a unique identifier");
throw new ValidationException(string.Format(localizer["ValidationExceptionMessageNotAId"], "DishId"));
if (Count <= 0)
throw new ValidationException("Field Count is less than or equal to 0");
throw new ValidationException(string.Format(localizer["ValidationExceptionMessageLessOrEqualZero"], "Count"));
}
}

View File

@@ -11,42 +11,65 @@ using System.Xml;
using AndDietCokeContracts.Infrastrusture.PostConfiguration;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json;
using AndDietCokeContracts.Resources;
using Microsoft.Extensions.Localization;
using AndDietCokeContracts.Mapper;
namespace AndDietCokeContracts.DataModels;
public class PostDataModel(string postid, string postName, PostType postType, PostConfiguration configuration) : IValidation
internal class PostDataModel(string postid, string postName, PostType postType, PostConfiguration configuration) : IValidation
{
[AlternativeName("PostId")]
public string Id { get; private set; } = postid;
public string PostName { get; private set; } = postName;
public PostType PostType { get; private set; } = postType;
[AlternativeName("Configuration")]
[AlternativeName("ConfigurationJson")]
[PostProcessing(MappingCallMethodName = "ParseJson")]
public PostConfiguration ConfigurationModel { get; private set; } = configuration;
public PostDataModel(string postId, string postName, PostType postType, string configurationJson) : this(postId, postName, postType, (PostConfiguration)null)
{
var obj = JToken.Parse(configurationJson);
if (obj is not null)
{
ConfigurationModel = obj.Value<string>("Type") switch
{
nameof(WaiterPostConfiguration) => JsonConvert.DeserializeObject<WaiterPostConfiguration>(configurationJson)!,
nameof(ChefPostConfiguration) => JsonConvert.DeserializeObject<ChefPostConfiguration>(configurationJson)!,
_ => JsonConvert.DeserializeObject<PostConfiguration>(configurationJson)!,
};
}
}
public void Validate()
public PostDataModel() : this("","",PostType.None, null) { }
public void Validate(IStringLocalizer<Messages> localizer)
{
if (Id.IsEmpty())
throw new ValidationException("Field Id is empty");
throw new ValidationException(string.Format(localizer["ValidationExceptionMessageEmptyField"], "Id"));
if (!Id.IsGuid())
throw new ValidationException("The value in the field Id is not a unique identifier");
throw new ValidationException(string.Format(localizer["ValidationExceptionMessageNotAId"], "Id"));
if (PostName.IsEmpty())
throw new ValidationException("Field PostName is empty");
throw new ValidationException(string.Format(localizer["ValidationExceptionMessageEmptyField"], "PostName"));
if (PostType == PostType.None)
throw new ValidationException("Field PostType is empty");
throw new ValidationException(string.Format(localizer["ValidationExceptionMessageEmptyField"], "PostType"));
if (ConfigurationModel is null)
throw new ValidationException("Field ConfigurationModel is not initialized");
throw new ValidationException(string.Format(localizer["ValidationExceptionMessageNotInitialized"], "ConfigurationModel"));
if (ConfigurationModel!.Rate <= 0)
throw new ValidationException("Field Rate is less or equal zero");
throw new ValidationException(string.Format(localizer["ValidationExceptionMessageLessOrEqualZero"], "Rate"));
}
private PostConfiguration? ParseJson(object json)
{
if (json is PostConfiguration config)
{
return config;
}
if (json is string)
{
var obj = JToken.Parse((string)json);
var type = obj.Value<string>("Type");
switch (type)
{
case nameof(ChefPostConfiguration):
ConfigurationModel = JsonConvert.DeserializeObject<ChefPostConfiguration>((string)json);
break;
case nameof(WaiterPostConfiguration):
ConfigurationModel = JsonConvert.DeserializeObject<WaiterPostConfiguration>((string)json);
break;
default:
ConfigurationModel = JsonConvert.DeserializeObject<PostConfiguration>((string)json);
break;
}
return ConfigurationModel;
}
return null;
}
}

View File

@@ -1,6 +1,9 @@
using AndDietCokeContracts.Exceptions;
using AndDietCokeContracts.Extensions;
using AndDietCokeContracts.Infrastrusture;
using AndDietCokeContracts.Mapper;
using AndDietCokeContracts.Resources;
using Microsoft.Extensions.Localization;
using System;
using System.Collections.Generic;
using System.Linq;
@@ -9,33 +12,38 @@ using System.Threading.Tasks;
namespace AndDietCokeContracts.DataModels;
public class SalaryDataModel(string id, string workerId, DateTime salaryDate, double
internal class SalaryDataModel(string id, string workerId, DateTime salaryDate, double
workerSalary) : IValidation
{
[SourceFromMember(SourcePropertyName ="Worker")]
private readonly WorkerDataModel? _worker;
public string Id { get; private set; } = id;
public string WorkerId { get; private set; } = workerId;
public DateTime SalaryDate { get; private set; } = salaryDate;
public DateTime SalaryDate { get; private set; } = salaryDate.ToUniversalTime();
[AlternativeName("WorkerSalary")]
public double Salary { get; private set; } = workerSalary;
public string WorkerFIO => _worker?.FIO ?? string.Empty;
public SalaryDataModel() : this("", "", DateTime.UtcNow, 0)
{
}
public SalaryDataModel(string id, string workerId, DateTime salaryDate, double workersalary, WorkerDataModel worker) : this(id, workerId, salaryDate, workersalary)
{
_worker = worker;
}
public void Validate()
public void Validate(IStringLocalizer<Messages> localizer)
{
if (Id.IsEmpty())
throw new ValidationException("Salary Id is empty");
throw new ValidationException(string.Format(localizer["ValidationExceptionMessageEmptyField"], "Id"));
if (!Id.IsGuid())
throw new ValidationException("Salary Id is not a valid GUID");
throw new ValidationException(string.Format(localizer["ValidationExceptionMessageNotAId"], "Id"));
if (WorkerId.IsEmpty())
throw new ValidationException("Field WorkerId is empty");
throw new ValidationException(string.Format(localizer["ValidationExceptionMessageEmptyField"], "WorkerId"));
if (!WorkerId.IsGuid())
throw new ValidationException("The value in the field WorkerId is not a unique identifier");
throw new ValidationException(string.Format(localizer["ValidationExceptionMessageNotAId"], "WorkerId"));
if (Salary <= 0)
throw new ValidationException("Field Salary is less than or equal to 0");
throw new ValidationException(string.Format(localizer["ValidationExceptionMessageLessOrEqualZero"], "Salary"));
}
}

View File

@@ -2,6 +2,9 @@
using AndDietCokeContracts.Exceptions;
using AndDietCokeContracts.Extensions;
using AndDietCokeContracts.Infrastrusture;
using AndDietCokeContracts.Mapper;
using AndDietCokeContracts.Resources;
using Microsoft.Extensions.Localization;
using System;
using System.Collections.Generic;
using System.Linq;
@@ -10,11 +13,11 @@ using System.Threading.Tasks;
using System.Xml;
namespace AndDietCokeContracts.DataModels;
public class SaleDataModel : IValidation
internal class SaleDataModel : IValidation
{
[SourceFromMember(SourcePropertyName ="Buyer")]
private readonly BuyerDataModel? _buyer;
[SourceFromMember(SourcePropertyName = "Worker")]
private readonly WorkerDataModel? _worker;
public string Id { get; private set; }
@@ -24,6 +27,7 @@ public class SaleDataModel : IValidation
public double Sum { get; private set; }
public bool IsConstantClient { get; private set; }
public bool IsCancel { get; private set; }
[AlternativeName("OrderDishes")]
public List<OrderDishDataModel>? Dishes { get; private set; }
public string BuyerFIO => _buyer?.FIO ?? string.Empty;
public string WorkerFIO => _worker?.FIO ?? string.Empty;
@@ -45,24 +49,24 @@ public class SaleDataModel : IValidation
_worker = worker;
_buyer = buyer;
}
public SaleDataModel() : this("","","",new List<OrderDishDataModel>()) { }
public SaleDataModel(string id, string workerId, string? buyerId, List<OrderDishDataModel> dishes) : this(id, workerId, buyerId, true, false, dishes) { }
public void Validate()
public void Validate(IStringLocalizer<Messages> localizer)
{
if (Id.IsEmpty())
throw new ValidationException("Field Id is empty");
throw new ValidationException(string.Format(localizer["ValidationExceptionMessageEmptyField"], "Id"));
if (!Id.IsGuid())
throw new ValidationException("The value in the field Id is not a unique identifier");
throw new ValidationException(string.Format(localizer["ValidationExceptionMessageNotAId"], "Id"));
if (WorkerId.IsEmpty())
throw new ValidationException("Field WorkerId is empty");
throw new ValidationException(string.Format(localizer["ValidationExceptionMessageEmptyField"], "WorkerId"));
if (!WorkerId.IsGuid())
throw new ValidationException("The value in the field WorkerId is not a unique identifier");
throw new ValidationException(string.Format(localizer["ValidationExceptionMessageNotAId"], "WorkerId"));
if (!BuyerId?.IsGuid() ?? !BuyerId?.IsEmpty() ?? false)
throw new ValidationException("The value in the field BuyerId is not a unique identifier");
throw new ValidationException(string.Format(localizer["ValidationExceptionMessageNotAId"], "BuyerId"));
if (Sum <= 0)
throw new ValidationException("Field Sum is less than or equal to 0");
throw new ValidationException(string.Format(localizer["ValidationExceptionMessageLessOrEqualZero"], "Sum"));
if ((Dishes?.Count ?? 0) == 0)
throw new ValidationException("The sale must include dishes");
throw new ValidationException(localizer["ValidationExceptionMessageNoDishesInSale"]);
}
}

View File

@@ -1,7 +1,10 @@
using AndDietCokeContracts.Exceptions;
using AndDietCokeContracts.Extensions;
using AndDietCokeContracts.Infrastrusture;
using AndDietCokeContracts.Mapper;
using AndDietCokeContracts.Resources;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Localization;
using System;
using System.Collections.Generic;
using System.Linq;
@@ -12,15 +15,16 @@ using static System.Runtime.InteropServices.JavaScript.JSType;
namespace AndDietCokeContracts.DataModels;
public class WorkerDataModel(string id, string fio, string postId, DateTime
internal class WorkerDataModel(string id, string fio, string postId, DateTime
birthDate, DateTime employmentDate, bool isDeleted) : IValidation
{
[SourceFromMember(SourcePropertyName = "Post")]
private readonly PostDataModel? _post;
public string Id { get; private set; } = id;
public string FIO { get; private set; } = fio;
public string PostId { get; private set; } = postId;
public DateTime BirthDate { get; private set; } = birthDate;
public DateTime EmploymentDate { get; private set; } = employmentDate;
public DateTime BirthDate { get; private set; } = birthDate.ToUniversalTime();
public DateTime EmploymentDate { get; private set; } = employmentDate.ToUniversalTime();
public bool IsDeleted { get; private set; } = isDeleted;
public string PostName => _post?.PostName ?? string.Empty;
@@ -29,24 +33,26 @@ birthDate, DateTime employmentDate, bool isDeleted) : IValidation
_post = post;
}
public WorkerDataModel(string id, string fio,string postId, DateTime birthDate, DateTime employmentDate) : this(id, fio, postId, birthDate, employmentDate, false) { }
public void Validate()
public WorkerDataModel() : this("","","",DateTime.UtcNow,DateTime.UtcNow) { }
public void Validate(IStringLocalizer<Messages> localizer)
{
if (Id.IsEmpty())
throw new ValidationException("Field Id is empty");
throw new ValidationException(string.Format(localizer["ValidationExceptionMessageEmptyField"], "Id"));
if (!Id.IsGuid())
throw new ValidationException("The value in the field Id is not a unique identifier");
throw new ValidationException(string.Format(localizer["ValidationExceptionMessageNotAId"], "Id"));
if (FIO.IsEmpty())
throw new ValidationException("Field FIO is empty");
throw new ValidationException(string.Format(localizer["ValidationExceptionMessageEmptyField"], "FIO"));
if (PostId.IsEmpty())
throw new ValidationException("Field PostId is empty");
throw new ValidationException(string.Format(localizer["ValidationExceptionMessageEmptyField"], "PostId"));
if (!PostId.IsGuid())
throw new ValidationException("The value in the field PostId is not a unique identifier");
if (BirthDate.Date > DateTime.Now.AddYears(-16).Date)
throw new ValidationException($"Minors cannot be hired (BirthDate = {BirthDate.ToShortDateString()})");
if (BirthDate.Date > DateTime.UtcNow.AddYears(-16).Date)
throw new ValidationException(string.Format(localizer["ValidationExceptionMessageMinorsBirthDate"], BirthDate.ToShortDateString()));
if (EmploymentDate.Date < BirthDate.Date)
throw new ValidationException("The date of employment cannot be less than the date of birth");
throw new ValidationException(string.Format(localizer["ValidationExceptionMessageEmploymentDateAndBirthDate"],
EmploymentDate.ToShortDateString(), BirthDate.ToShortDateString()));
if ((EmploymentDate - BirthDate).TotalDays / 365 < 16) //EmploymentDate.Year - BirthDate.Year
throw new ValidationException($"Minors cannot be hired (EmploymentDate - {EmploymentDate.ToShortDateString()}, BirthDate - {BirthDate.ToShortDateString()})");
throw new ValidationException(string.Format(localizer["ValidationExceptionMessageMinorsEmploymentDate"],
EmploymentDate.ToShortDateString(), BirthDate.ToShortDateString()));
}
}

View File

@@ -3,10 +3,11 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using AndDietCokeContracts.Resources;
using Microsoft.Extensions.Localization;
namespace AndDietCokeContracts.Exceptions;
public class ElementDeletedException : Exception
{
public ElementDeletedException(string id) : base($"Cannot modify a deleted item (id: {id})") { }
}
internal class ElementDeletedException(string id, IStringLocalizer<Messages> localizer) :
Exception(string.Format(localizer["ElementDeletedExceptionMessage"], id))
{ }

View File

@@ -3,16 +3,15 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using AndDietCokeContracts.Resources;
using Microsoft.Extensions.Localization;
namespace AndDietCokeContracts.Exceptions;
public class ElementExistsException : Exception
internal class ElementExistsException(string paramName, string paramValue, IStringLocalizer<Messages> localizer) :
Exception(string.Format(localizer["ElementExistsExceptionMessage"], paramValue, paramName))
{
public string ParamName { get; private set; }
public string ParamValue { get; private set; }
public ElementExistsException(string paramName, string paramValue) : base($"There is already an element with value{paramValue} of parameter { paramName}")
{
ParamName = paramName;
ParamValue = paramValue;
}
public string ParamName { get; private set; } = paramName;
public string ParamValue { get; private set; } = paramValue;
}

View File

@@ -3,15 +3,13 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using AndDietCokeContracts.Resources;
using Microsoft.Extensions.Localization;
namespace AndDietCokeContracts.Exceptions;
public class ElementNotFoundException : Exception
internal class ElementNotFoundException(string value, IStringLocalizer<Messages> localizer) :
Exception(string.Format(localizer["ElementNotFoundExceptionMessage"], value))
{
public string Value { get; private set; }
public ElementNotFoundException(string value) : base($"Element not found at value = { value}")
{
Value = value;
}
public string Value { get; private set; } = value;
}

View File

@@ -3,11 +3,12 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using AndDietCokeContracts.Resources;
using Microsoft.Extensions.Localization;
using static System.Runtime.InteropServices.JavaScript.JSType;
namespace AndDietCokeContracts.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}") { }
}
internal class IncorrectDatesException(DateTime start, DateTime end, IStringLocalizer<Messages> localizer) :
Exception(string.Format(localizer["IncorrectDatesExceptionMessage"], start.ToShortDateString(), end.ToShortDateString()))
{ }

View File

@@ -3,11 +3,11 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using AndDietCokeContracts.Resources;
using Microsoft.Extensions.Localization;
namespace AndDietCokeContracts.Exceptions;
public class StorageException : Exception
{
public StorageException(Exception ex) : base($"Error while working in storage: { ex.Message}", ex) { }
}
internal class StorageException(Exception ex, IStringLocalizer<Messages> localizer) :
Exception(string.Format(localizer["StorageExceptionMessage"], ex.Message), ex)
{ }

View File

@@ -6,7 +6,5 @@ using System.Threading.Tasks;
namespace AndDietCokeContracts.Exceptions;
public class ValidationException : Exception
{
public ValidationException(string message) : base(message) { }
}
public class ValidationException(string message) : Exception(message)
{ }

View File

@@ -1,12 +1,10 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using AndDietCokeContracts.Resources;
using Microsoft.Extensions.Localization;
namespace AndDietCokeContracts.Infrastrusture;
public interface IValidation
internal interface IValidation
{
void Validate();
void Validate(IStringLocalizer<Messages> localizer);
}

View File

@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
@@ -11,4 +12,6 @@ public class PostConfiguration
public virtual string Type => nameof(PostConfiguration);
public double Rate { get; set; }
public string CultureName { get; set; } = CultureInfo.CurrentCulture.Name;
}

View File

@@ -0,0 +1,7 @@
namespace AndDietCokeContracts.Mapper;
[AttributeUsage(AttributeTargets.Property, AllowMultiple = true)]
class AlternativeNameAttribute(string alternativeName) : Attribute
{
public string AlternativeName { get; set; } = alternativeName;
}

View File

@@ -0,0 +1,9 @@
namespace AndDietCokeContracts.Mapper;
[AttributeUsage(AttributeTargets.Property, Inherited = true)]
class CustomDefaultAttribute : Attribute
{
public object? DefaultValue { get; set; }
public DefaultValuesFunc FuncName { get; set; }
}

View File

@@ -0,0 +1,216 @@
using System.Collections;
using System.ComponentModel;
using System.Reflection;
namespace AndDietCokeContracts.Mapper;
internal static class CustomMapper
{
public static To MapObject<To>(object obj, To newObject)
{
ArgumentNullException.ThrowIfNull(obj);
ArgumentNullException.ThrowIfNull(newObject);
var typeFrom = obj.GetType();
var typeTo = newObject.GetType();
var propertiesFrom = typeFrom.GetProperties().Where(x => x.CanRead).ToArray();
foreach (var property in typeTo.GetProperties().Where(x => x.CanWrite))
{
//ignore
if(property.GetCustomAttribute(typeof(IgnoreValueAttribute)) != null)
{
FindAndMapDefaultValue(property, newObject);
continue;
}
var propertyFrom = TryGetPropertyFrom(property, propertiesFrom);
if (propertyFrom is null)
{
FindAndMapDefaultValue(property, newObject);
continue;
}
var fromValue = propertyFrom.GetValue(obj);
var postProcessingAttribute = property.GetCustomAttribute<PostProcessingAttribute>();
if ((postProcessingAttribute is not null))
{
var value = PostProcessing(fromValue, postProcessingAttribute, newObject);
if (value is not null)
{
property.SetValue(newObject, value);
}
continue;
}
if (propertyFrom.PropertyType.IsGenericType && propertyFrom.PropertyType.Name.StartsWith("List") && fromValue is not null)
{
fromValue = MapListOfObjects(property, fromValue);
}
if (fromValue is not null)
{
object? finalValue = null;
bool successConversion = false;
var targetType = property.PropertyType;
if (propertyFrom.PropertyType.IsEnum && !targetType.IsEnum)
{
finalValue = fromValue.ToString();
successConversion = true;
}
else if (targetType.IsEnum)
{
successConversion = Enum.TryParse(targetType, fromValue.ToString(), ignoreCase: true, out object? parsedEnum);
if (successConversion)
{
finalValue = parsedEnum;
}
}
else
{
finalValue = fromValue;
successConversion = true;
}
if (successConversion)
{
property.SetValue(newObject, finalValue);
}
}
}
// fields
var fieldsTo = typeTo.GetFields(BindingFlags.NonPublic | BindingFlags.Instance);
foreach (var field in fieldsTo)
{
var mapFromAttr = field.GetCustomAttribute<SourceFromMemberAttribute>();
if (mapFromAttr is null)
continue;
var sourceProp = typeFrom.GetProperty(mapFromAttr.SourcePropertyName);
if (sourceProp is null || !sourceProp.CanRead)
continue;
var sourceValue = sourceProp.GetValue(obj);
if (sourceValue is null)
continue;
var targetFieldType = field.FieldType;
var mappedValue = typeof(CustomMapper)
.GetMethod(nameof(MapObject), new[] { typeof(object) })!
.MakeGenericMethod(targetFieldType)
.Invoke(null, new[] { sourceValue });
if (mappedValue is not null)
{
field.SetValue(newObject, mappedValue);
}
}
var classPostProcessing = typeTo.GetCustomAttribute<PostProcessingAttribute>();
if (classPostProcessing is not null && classPostProcessing.MappingCallMethodName is not null)
{
var methodInfo = typeTo.GetMethod(classPostProcessing.MappingCallMethodName, BindingFlags.NonPublic | BindingFlags.Instance);
methodInfo?.Invoke(newObject, []);
}
return newObject;
}
public static To MapObject<To>(object obj) => MapObject(obj, Activator.CreateInstance<To>()!);
public static To? MapObjectWithNull<To>(object? obj) => obj is null ? default : MapObject(obj, Activator.CreateInstance<To>());
private static PropertyInfo? TryGetPropertyFrom(PropertyInfo propertyTo, PropertyInfo[] propertiesFrom)
{
var customAttribute = propertyTo.GetCustomAttributes<AlternativeNameAttribute>()?
.ToArray()
.FirstOrDefault(x => propertiesFrom.Any(y => y.Name == x.AlternativeName));
if (customAttribute is not null)
{
return propertiesFrom.FirstOrDefault(x => x.Name == customAttribute.AlternativeName);
}
return propertiesFrom.FirstOrDefault(x => x.Name == propertyTo.Name);
}
private static object? PostProcessing<T>(object? value, PostProcessingAttribute postProcessingAttribute, T newObject)
{
if (value is null || newObject is null)
{
return null;
}
if (!string.IsNullOrEmpty(postProcessingAttribute.MappingCallMethodName))
{
var methodInfo =
newObject.GetType().GetMethod(postProcessingAttribute.MappingCallMethodName, BindingFlags.NonPublic | BindingFlags.Instance);
if (methodInfo is not null)
{
return methodInfo.Invoke(newObject, [value]);
}
}
else if (postProcessingAttribute.ActionType != PostProcessingType.None)
{
switch (postProcessingAttribute.ActionType)
{
case PostProcessingType.ToUniversalTime:
return ToUniversalTime(value);
case PostProcessingType.ToLocalTime:
return ToLocalTime(value);
}
}
return null;
}
private static object? ToLocalTime(object? obj)
{
if (obj is DateTime date)
return date.ToLocalTime();
return obj;
}
private static object? ToUniversalTime(object? obj)
{
if (obj is DateTime date)
return date.ToUniversalTime();
return obj;
}
private static void FindAndMapDefaultValue<T>(PropertyInfo property, T newObject)
{
var defaultValueAttribute = property.GetCustomAttribute<CustomDefaultAttribute>();
if (defaultValueAttribute is null)
{
return;
}
if (defaultValueAttribute.DefaultValue is not null)
{
property.SetValue(newObject, defaultValueAttribute.DefaultValue);
return;
}
var value = defaultValueAttribute.FuncName switch
{
DefaultValuesFunc.UtcNow => DateTime.UtcNow,
DefaultValuesFunc.Null => (object?)null,
};
if (value is not null)
{
property.SetValue(newObject, value);
}
}
private static object? MapListOfObjects(PropertyInfo propertyTo, object list)
{
var listResult = Activator.CreateInstance(propertyTo.PropertyType);
foreach (var elem in (IEnumerable)list)
{
var newElem = MapObject(elem, Activator.CreateInstance(propertyTo.PropertyType.GenericTypeArguments[0])!);
if (newElem is not null)
{
propertyTo.PropertyType.GetMethod("Add")!.Invoke(listResult, [newElem]);
}
}
return listResult;
}
}

View File

@@ -0,0 +1,9 @@

namespace AndDietCokeContracts.Mapper
{
enum DefaultValuesFunc
{
Null,
UtcNow
}
}

View File

@@ -0,0 +1,8 @@

namespace AndDietCokeContracts.Mapper
{
[AttributeUsage(AttributeTargets.Property)]
class IgnoreValueAttribute : Attribute
{
}
}

View File

@@ -0,0 +1,10 @@

namespace AndDietCokeContracts.Mapper
{
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Class)]
class PostProcessingAttribute : Attribute
{
public string? MappingCallMethodName { get; set; }
public PostProcessingType ActionType { get; set; } = PostProcessingType.None;
}
}

View File

@@ -0,0 +1,10 @@

namespace AndDietCokeContracts.Mapper
{
enum PostProcessingType
{
None = -1,
ToUniversalTime = 1,
ToLocalTime = 2,
}
}

View File

@@ -0,0 +1,9 @@

namespace AndDietCokeContracts.Mapper
{
[AttributeUsage(AttributeTargets.Field)]
class SourceFromMemberAttribute : Attribute
{
public string? SourcePropertyName { get; set; }
}
}

View File

@@ -0,0 +1,441 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace AndDietCokeContracts.Resources {
using System;
/// <summary>
/// A strongly-typed resource class, for looking up localized strings, etc.
/// </summary>
// This class was auto-generated by the StronglyTypedResourceBuilder
// class via a tool like ResGen or Visual Studio.
// To add or remove a member, edit your .ResX file then rerun ResGen
// with the /str option, or rebuild your VS project.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Messages {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Messages() {
}
/// <summary>
/// Returns the cached ResourceManager instance used by this class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("AndDietCokeContracts.Resources.Messages", typeof(Messages).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Overrides the current thread's CurrentUICulture property for all
/// resource lookups using this strongly typed resource class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
/// <summary>
/// Looks up a localized string similar to Элемент по данным: {0} был удален.
/// </summary>
internal static string AdapterMessageElementDeletedException {
get {
return ResourceManager.GetString("AdapterMessageElementDeletedException", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Не найден элемент по данным: {0}.
/// </summary>
internal static string AdapterMessageElementNotFoundException {
get {
return ResourceManager.GetString("AdapterMessageElementNotFoundException", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Данные пусты.
/// </summary>
internal static string AdapterMessageEmptyData {
get {
return ResourceManager.GetString("AdapterMessageEmptyData", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Неправильные даты: {0}.
/// </summary>
internal static string AdapterMessageIncorrectDatesException {
get {
return ResourceManager.GetString("AdapterMessageIncorrectDatesException", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Ошибка при обработке данных: {0}.
/// </summary>
internal static string AdapterMessageInvalidOperationException {
get {
return ResourceManager.GetString("AdapterMessageInvalidOperationException", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Ошибка при работе с хранилищем данных: {0}.
/// </summary>
internal static string AdapterMessageStorageException {
get {
return ResourceManager.GetString("AdapterMessageStorageException", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Переданы неверные данные: {0}.
/// </summary>
internal static string AdapterMessageValidationException {
get {
return ResourceManager.GetString("AdapterMessageValidationException", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Дата изменения.
/// </summary>
internal static string DocumentDocCaptionDate {
get {
return ResourceManager.GetString("DocumentDocCaptionDate", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Блюдо.
/// </summary>
internal static string DocumentDocCaptionDish {
get {
return ResourceManager.GetString("DocumentDocCaptionDish", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to История изменения.
/// </summary>
internal static string DocumentDocCaptionPriceHistories {
get {
return ResourceManager.GetString("DocumentDocCaptionPriceHistories", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to История цен блюд.
/// </summary>
internal static string DocumentDocHeader {
get {
return ResourceManager.GetString("DocumentDocHeader", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Сформировано на дату {0}.
/// </summary>
internal static string DocumentDocSubHeader {
get {
return ResourceManager.GetString("DocumentDocSubHeader", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Кол-во.
/// </summary>
internal static string DocumentExcelCaptionCount {
get {
return ResourceManager.GetString("DocumentExcelCaptionCount", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Дата.
/// </summary>
internal static string DocumentExcelCaptionDate {
get {
return ResourceManager.GetString("DocumentExcelCaptionDate", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Скидка.
/// </summary>
internal static string DocumentExcelCaptionDiscount {
get {
return ResourceManager.GetString("DocumentExcelCaptionDiscount", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Блюдо.
/// </summary>
internal static string DocumentExcelCaptionDish {
get {
return ResourceManager.GetString("DocumentExcelCaptionDish", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Сумма.
/// </summary>
internal static string DocumentExcelCaptionSum {
get {
return ResourceManager.GetString("DocumentExcelCaptionSum", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Всего.
/// </summary>
internal static string DocumentExcelCaptionTotal {
get {
return ResourceManager.GetString("DocumentExcelCaptionTotal", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Имя работника.
/// </summary>
internal static string DocumentExcelCaptionWorkerName {
get {
return ResourceManager.GetString("DocumentExcelCaptionWorkerName", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Продажи за период.
/// </summary>
internal static string DocumentExcelHeader {
get {
return ResourceManager.GetString("DocumentExcelHeader", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to c {0} по {1}.
/// </summary>
internal static string DocumentExcelSubHeader {
get {
return ResourceManager.GetString("DocumentExcelSubHeader", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Начисления.
/// </summary>
internal static string DocumentPdfDiagramCaption {
get {
return ResourceManager.GetString("DocumentPdfDiagramCaption", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Зарплатная ведомость.
/// </summary>
internal static string DocumentPdfHeader {
get {
return ResourceManager.GetString("DocumentPdfHeader", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to за период с {0} по {1}.
/// </summary>
internal static string DocumentPdfSubHeader {
get {
return ResourceManager.GetString("DocumentPdfSubHeader", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Всего начислено {0}.
/// </summary>
internal static string DocumentPdfTotalSalary {
get {
return ResourceManager.GetString("DocumentPdfTotalSalary", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Нельзя изменить удаленный элемент (идентификатор: {0}).
/// </summary>
internal static string ElementDeletedExceptionMessage {
get {
return ResourceManager.GetString("ElementDeletedExceptionMessage", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Уже существует элемент со значением {0} параметра {1}.
/// </summary>
internal static string ElementExistsExceptionMessage {
get {
return ResourceManager.GetString("ElementExistsExceptionMessage", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Элемент не найден по значению = {0}.
/// </summary>
internal static string ElementNotFoundExceptionMessage {
get {
return ResourceManager.GetString("ElementNotFoundExceptionMessage", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Дата окончания должна быть позже даты начала. Дата начала: {0}. ​​Дата окончания: {1}.
/// </summary>
internal static string IncorrectDatesExceptionMessage {
get {
return ResourceManager.GetString("IncorrectDatesExceptionMessage", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Недостаточно данных для обработки: {0}.
/// </summary>
internal static string NotEnoughDataToProcessExceptionMessage {
get {
return ResourceManager.GetString("NotEnoughDataToProcessExceptionMessage", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Не найдены данные.
/// </summary>
internal static string NotFoundDataMessage {
get {
return ResourceManager.GetString("NotFoundDataMessage", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Ошибка при работе в хранилище: {0}.
/// </summary>
internal static string StorageExceptionMessage {
get {
return ResourceManager.GetString("StorageExceptionMessage", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Дата трудоустройства не может быть раньше даты рождения ({0}, {1}).
/// </summary>
internal static string ValidationExceptionMessageEmploymentDateAndBirthDate {
get {
return ResourceManager.GetString("ValidationExceptionMessageEmploymentDateAndBirthDate", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Значение в поле {0} пусто.
/// </summary>
internal static string ValidationExceptionMessageEmptyField {
get {
return ResourceManager.GetString("ValidationExceptionMessageEmptyField", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Значение в поле Телефонный номер не является телефонным номером.
/// </summary>
internal static string ValidationExceptionMessageIncorrectPhoneNumber {
get {
return ResourceManager.GetString("ValidationExceptionMessageIncorrectPhoneNumber", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Значение в поле {0} меньше или равно 0.
/// </summary>
internal static string ValidationExceptionMessageLessOrEqualZero {
get {
return ResourceManager.GetString("ValidationExceptionMessageLessOrEqualZero", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Несовершеннолетние не могут быть приняты на работу (Дата рождения: {0}).
/// </summary>
internal static string ValidationExceptionMessageMinorsBirthDate {
get {
return ResourceManager.GetString("ValidationExceptionMessageMinorsBirthDate", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Несовершеннолетние не могут быть приняты на работу (Дата трудоустройства {0}, Дата рождения: {1}).
/// </summary>
internal static string ValidationExceptionMessageMinorsEmploymentDate {
get {
return ResourceManager.GetString("ValidationExceptionMessageMinorsEmploymentDate", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to В продаже должен быть хотя бы одно блюдо.
/// </summary>
internal static string ValidationExceptionMessageNoDishesInSale {
get {
return ResourceManager.GetString("ValidationExceptionMessageNoDishesInSale", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Значение в поле {0} не является типом уникального идентификатора.
/// </summary>
internal static string ValidationExceptionMessageNotAId {
get {
return ResourceManager.GetString("ValidationExceptionMessageNotAId", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Значение в поле {0} не проиницализировано.
/// </summary>
internal static string ValidationExceptionMessageNotInitialized {
get {
return ResourceManager.GetString("ValidationExceptionMessageNotInitialized", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Имя фамилия и отчество были введены неправильно.
/// </summary>
internal static string ValidationExceptionMessageWrongFIO {
get {
return ResourceManager.GetString("ValidationExceptionMessageWrongFIO", resourceCulture);
}
}
}
}

View File

@@ -0,0 +1,228 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 1.3
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">1.3</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1">this is my long string</data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
[base64 mime encoded serialized .NET Framework object]
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
[base64 mime encoded string representing a byte array form of the .NET Framework object]
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>1.3</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="DocumentDocCaptionDish" xml:space="preserve">
<value>Dish</value>
</data>
<data name="DocumentDocHeader" xml:space="preserve">
<value>Dish Price History</value>
</data>
<data name="DocumentDocSubHeader" xml:space="preserve">
<value>Generated on {0}</value>
</data>
<data name="DocumentExcelCaptionCount" xml:space="preserve">
<value>Qty</value>
</data>
<data name="DocumentExcelCaptionDiscount" xml:space="preserve">
<value>Discount</value>
</data>
<data name="DocumentExcelCaptionDish" xml:space="preserve">
<value>Dish</value>
</data>
<data name="DocumentExcelCaptionSum" xml:space="preserve">
<value>Amount</value>
</data>
<data name="DocumentExcelCaptionTotal" xml:space="preserve">
<value>Total</value>
</data>
<data name="DocumentExcelHeader" xml:space="preserve">
<value>Sales for the Period</value>
</data>
<data name="DocumentExcelSubHeader" xml:space="preserve">
<value>from {0} to {1}</value>
</data>
<data name="DocumentPdfHeader" xml:space="preserve">
<value>Payroll Statement</value>
</data>
<data name="DocumentPdfSubHeader" xml:space="preserve">
<value>for the period from {0} to {1}</value>
</data>
<data name="DocumentPdfDiagramCaption" xml:space="preserve">
<value>Accruals</value>
</data>
<data name="NotFoundDataMessage" xml:space="preserve">
<value>No data found</value>
</data>
<data name="ValidationExceptionMessageNotAId" xml:space="preserve">
<value>The value in field {0} is not a valid unique identifier</value>
</data>
<data name="ValidationExceptionMessageEmptyField" xml:space="preserve">
<value>The value in field {0} is empty</value>
</data>
<data name="ValidationExceptionMessageIncorrectPhoneNumber" xml:space="preserve">
<value>The value in the Phone Number field is not a valid phone number</value>
</data>
<data name="ValidationExceptionMessageNotInitialized" xml:space="preserve">
<value>The value in field {0} is not initialized</value>
</data>
<data name="ValidationExceptionMessageLessOrEqualZero" xml:space="preserve">
<value>The value in field {0} is less than or equal to 0</value>
</data>
<data name="ValidationExceptionMessageNoDishesInSale" xml:space="preserve">
<value>There must be at least one dish in the sale</value>
</data>
<data name="ValidationExceptionMessageMinorsBirthDate" xml:space="preserve">
<value>Minors cannot be hired (Birth date: {0})</value>
</data>
<data name="ValidationExceptionMessageMinorsEmploymentDate" xml:space="preserve">
<value>Minors cannot be hired (Employment date: {0}, Birth date: {1})</value>
</data>
<data name="ValidationExceptionMessageEmploymentDateAndBirthDate" xml:space="preserve">
<value>The employment date cannot be earlier than the birth date ({0}, {1})</value>
</data>
<data name="AdapterMessageStorageException" xml:space="preserve">
<value>Error accessing data storage: {0}</value>
</data>
<data name="AdapterMessageEmptyData" xml:space="preserve">
<value>Data is empty</value>
</data>
<data name="AdapterMessageElementNotFoundException" xml:space="preserve">
<value>No element found for data: {0}</value>
</data>
<data name="AdapterMessageValidationException" xml:space="preserve">
<value>Invalid data submitted: {0}</value>
</data>
<data name="AdapterMessageElementDeletedException" xml:space="preserve">
<value>The element with data: {0} has been deleted</value>
</data>
<data name="AdapterMessageInvalidOperationException" xml:space="preserve">
<value>Error while processing data: {0}</value>
</data>
<data name="AdapterMessageIncorrectDatesException" xml:space="preserve">
<value>Invalid dates: {0}</value>
</data>
<data name="ElementDeletedExceptionMessage" xml:space="preserve">
<value>Cannot modify a deleted element (ID: {0})</value>
</data>
<data name="ElementExistsExceptionMessage" xml:space="preserve">
<value>An element with the value {0} for parameter {1} already exists</value>
</data>
<data name="ElementNotFoundExceptionMessage" xml:space="preserve">
<value>No element found with value = {0}</value>
</data>
<data name="IncorrectDatesExceptionMessage" xml:space="preserve">
<value>End date must be after start date. Start date: {0}. End date: {1}</value>
</data>
<data name="NotEnoughDataToProcessExceptionMessage" xml:space="preserve">
<value>Not enough data to process: {0}</value>
</data>
<data name="StorageExceptionMessage" xml:space="preserve">
<value>Error accessing storage: {0}</value>
</data>
<data name="ValidationExceptionMessageWrongFIO" xml:space="preserve">
<value>Full name was entered incorrectly</value>
</data>
<data name="DocumentExcelCaptionDate" xml:space="preserve">
<value>Date</value>
</data>
<data name="DocumentExcelCaptionWorkerName" xml:space="preserve">
<value>Worker's Name</value>
</data>
<data name="DocumentDocCaptionDate" xml:space="preserve">
<value>Change Date</value>
</data>
<data name="DocumentDocCaptionPriceHistories" xml:space="preserve">
<value>Change History</value>
</data>
<data name="DocumentPdfTotalSalary" xml:space="preserve">
<value>Total accrued: {0}</value>
</data>
</root>

View File

@@ -0,0 +1,228 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 1.3
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">1.3</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1">this is my long string</data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
[base64 mime encoded serialized .NET Framework object]
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
[base64 mime encoded string representing a byte array form of the .NET Framework object]
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>1.3</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="DocumentDocCaptionDish" xml:space="preserve">
<value>Plato</value>
</data>
<data name="DocumentDocHeader" xml:space="preserve">
<value>Historial de precios de platos</value>
</data>
<data name="DocumentDocSubHeader" xml:space="preserve">
<value>Generado en la fecha {0}</value>
</data>
<data name="DocumentExcelCaptionCount" xml:space="preserve">
<value>Cant.</value>
</data>
<data name="DocumentExcelCaptionDiscount" xml:space="preserve">
<value>Descuento</value>
</data>
<data name="DocumentExcelCaptionDish" xml:space="preserve">
<value>Plato</value>
</data>
<data name="DocumentExcelCaptionSum" xml:space="preserve">
<value>Suma</value>
</data>
<data name="DocumentExcelCaptionTotal" xml:space="preserve">
<value>Total</value>
</data>
<data name="DocumentExcelHeader" xml:space="preserve">
<value>Ventas por período</value>
</data>
<data name="DocumentExcelSubHeader" xml:space="preserve">
<value>del {0} al {1}</value>
</data>
<data name="DocumentPdfHeader" xml:space="preserve">
<value>Nómina salarial</value>
</data>
<data name="DocumentPdfSubHeader" xml:space="preserve">
<value>por el período del {0} al {1}</value>
</data>
<data name="DocumentPdfDiagramCaption" xml:space="preserve">
<value>Devengos</value>
</data>
<data name="NotFoundDataMessage" xml:space="preserve">
<value>No se encontraron datos</value>
</data>
<data name="ValidationExceptionMessageNotAId" xml:space="preserve">
<value>El valor en el campo {0} no es un identificador único válido</value>
</data>
<data name="ValidationExceptionMessageEmptyField" xml:space="preserve">
<value>El campo {0} está vacío</value>
</data>
<data name="ValidationExceptionMessageIncorrectPhoneNumber" xml:space="preserve">
<value>El valor en el campo Número de teléfono no es un número válido</value>
</data>
<data name="ValidationExceptionMessageNotInitialized" xml:space="preserve">
<value>El valor en el campo {0} no está inicializado</value>
</data>
<data name="ValidationExceptionMessageLessOrEqualZero" xml:space="preserve">
<value>El valor en el campo {0} es menor o igual a 0</value>
</data>
<data name="ValidationExceptionMessageNoDishesInSale" xml:space="preserve">
<value>Debe haber al menos un plato en la venta</value>
</data>
<data name="ValidationExceptionMessageMinorsBirthDate" xml:space="preserve">
<value>No se puede emplear a menores de edad (Fecha de nacimiento: {0})</value>
</data>
<data name="ValidationExceptionMessageMinorsEmploymentDate" xml:space="preserve">
<value>No se puede emplear a menores de edad (Fecha de empleo: {0}, Fecha de nacimiento: {1})</value>
</data>
<data name="ValidationExceptionMessageEmploymentDateAndBirthDate" xml:space="preserve">
<value>La fecha de empleo no puede ser anterior a la fecha de nacimiento ({0}, {1})</value>
</data>
<data name="AdapterMessageStorageException" xml:space="preserve">
<value>Error al trabajar con el almacenamiento de datos: {0}</value>
</data>
<data name="AdapterMessageEmptyData" xml:space="preserve">
<value>Los datos están vacíos</value>
</data>
<data name="AdapterMessageElementNotFoundException" xml:space="preserve">
<value>No se encontró el elemento con los datos: {0}</value>
</data>
<data name="AdapterMessageValidationException" xml:space="preserve">
<value>Datos inválidos proporcionados: {0}</value>
</data>
<data name="AdapterMessageElementDeletedException" xml:space="preserve">
<value>El elemento con los datos: {0} fue eliminado</value>
</data>
<data name="AdapterMessageInvalidOperationException" xml:space="preserve">
<value>Error al procesar los datos: {0}</value>
</data>
<data name="AdapterMessageIncorrectDatesException" xml:space="preserve">
<value>Fechas incorrectas: {0}</value>
</data>
<data name="ElementDeletedExceptionMessage" xml:space="preserve">
<value>No se puede modificar un elemento eliminado (ID: {0})</value>
</data>
<data name="ElementExistsExceptionMessage" xml:space="preserve">
<value>Ya existe un elemento con el valor {0} del parámetro {1}</value>
</data>
<data name="ElementNotFoundExceptionMessage" xml:space="preserve">
<value>No se encontró un elemento con el valor = {0}</value>
</data>
<data name="IncorrectDatesExceptionMessage" xml:space="preserve">
<value>La fecha de finalización debe ser posterior a la fecha de inicio. Fecha de inicio: {0}. Fecha de finalización: {1}</value>
</data>
<data name="NotEnoughDataToProcessExceptionMessage" xml:space="preserve">
<value>No hay suficientes datos para procesar: {0}</value>
</data>
<data name="StorageExceptionMessage" xml:space="preserve">
<value>Error al trabajar con el almacenamiento: {0}</value>
</data>
<data name="ValidationExceptionMessageWrongFIO" xml:space="preserve">
<value>El nombre, apellido y segundo nombre fueron ingresados incorrectamente</value>
</data>
<data name="DocumentExcelCaptionDate" xml:space="preserve">
<value>Fecha</value>
</data>
<data name="DocumentExcelCaptionWorkerName" xml:space="preserve">
<value>Nombre del trabajador</value>
</data>
<data name="DocumentDocCaptionDate" xml:space="preserve">
<value>Fecha de cambio</value>
</data>
<data name="DocumentDocCaptionPriceHistories" xml:space="preserve">
<value>Historial de cambios</value>
</data>
<data name="DocumentPdfTotalSalary" xml:space="preserve">
<value>Total acumulado {0}</value>
</data>
</root>

View File

@@ -0,0 +1,246 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="DocumentDocCaptionDish" xml:space="preserve">
<value>Блюдо</value>
</data>
<data name="DocumentDocHeader" xml:space="preserve">
<value>История цен блюд</value>
</data>
<data name="DocumentDocSubHeader" xml:space="preserve">
<value>Сформировано на дату {0}</value>
</data>
<data name="DocumentExcelCaptionCount" xml:space="preserve">
<value>Кол-во</value>
</data>
<data name="DocumentExcelCaptionDiscount" xml:space="preserve">
<value>Скидка</value>
</data>
<data name="DocumentExcelCaptionDish" xml:space="preserve">
<value>Блюдо</value>
</data>
<data name="DocumentExcelCaptionSum" xml:space="preserve">
<value>Сумма</value>
</data>
<data name="DocumentExcelCaptionTotal" xml:space="preserve">
<value>Всего</value>
</data>
<data name="DocumentExcelHeader" xml:space="preserve">
<value>Продажи за период</value>
</data>
<data name="DocumentExcelSubHeader" xml:space="preserve">
<value>c {0} по {1}</value>
</data>
<data name="DocumentPdfHeader" xml:space="preserve">
<value>Зарплатная ведомость</value>
</data>
<data name="DocumentPdfSubHeader" xml:space="preserve">
<value>за период с {0} по {1}</value>
</data>
<data name="DocumentPdfDiagramCaption" xml:space="preserve">
<value>Начисления</value>
</data>
<data name="NotFoundDataMessage" xml:space="preserve">
<value>Не найдены данные</value>
</data>
<data name="ValidationExceptionMessageNotAId" xml:space="preserve">
<value>Значение в поле {0} не является типом уникального идентификатора</value>
</data>
<data name="ValidationExceptionMessageEmptyField" xml:space="preserve">
<value>Значение в поле {0} пусто</value>
</data>
<data name="ValidationExceptionMessageIncorrectPhoneNumber" xml:space="preserve">
<value>Значение в поле Телефонный номер не является телефонным номером</value>
</data>
<data name="ValidationExceptionMessageNotInitialized" xml:space="preserve">
<value>Значение в поле {0} не проиницализировано</value>
</data>
<data name="ValidationExceptionMessageLessOrEqualZero" xml:space="preserve">
<value>Значение в поле {0} меньше или равно 0</value>
</data>
<data name="ValidationExceptionMessageNoDishesInSale" xml:space="preserve">
<value>В продаже должен быть хотя бы одно блюдо</value>
</data>
<data name="ValidationExceptionMessageMinorsBirthDate" xml:space="preserve">
<value>Несовершеннолетние не могут быть приняты на работу (Дата рождения: {0})</value>
</data>
<data name="ValidationExceptionMessageMinorsEmploymentDate" xml:space="preserve">
<value>Несовершеннолетние не могут быть приняты на работу (Дата трудоустройства {0}, Дата рождения: {1})</value>
</data>
<data name="ValidationExceptionMessageEmploymentDateAndBirthDate" xml:space="preserve">
<value>Дата трудоустройства не может быть раньше даты рождения ({0}, {1})</value>
</data>
<data name="AdapterMessageStorageException" xml:space="preserve">
<value>Ошибка при работе с хранилищем данных: {0}</value>
</data>
<data name="AdapterMessageEmptyData" xml:space="preserve">
<value>Данные пусты</value>
</data>
<data name="AdapterMessageElementNotFoundException" xml:space="preserve">
<value>Не найден элемент по данным: {0}</value>
</data>
<data name="AdapterMessageValidationException" xml:space="preserve">
<value>Переданы неверные данные: {0}</value>
</data>
<data name="AdapterMessageElementDeletedException" xml:space="preserve">
<value>Элемент по данным: {0} был удален</value>
</data>
<data name="AdapterMessageInvalidOperationException" xml:space="preserve">
<value>Ошибка при обработке данных: {0}</value>
</data>
<data name="AdapterMessageIncorrectDatesException" xml:space="preserve">
<value>Неправильные даты: {0}</value>
</data>
<data name="ElementDeletedExceptionMessage" xml:space="preserve">
<value>Нельзя изменить удаленный элемент (идентификатор: {0})</value>
</data>
<data name="ElementExistsExceptionMessage" xml:space="preserve">
<value>Уже существует элемент со значением {0} параметра {1}</value>
</data>
<data name="ElementNotFoundExceptionMessage" xml:space="preserve">
<value>Элемент не найден по значению = {0}</value>
</data>
<data name="IncorrectDatesExceptionMessage" xml:space="preserve">
<value>Дата окончания должна быть позже даты начала. Дата начала: {0}. ​​Дата окончания: {1}</value>
</data>
<data name="NotEnoughDataToProcessExceptionMessage" xml:space="preserve">
<value>Недостаточно данных для обработки: {0}</value>
</data>
<data name="StorageExceptionMessage" xml:space="preserve">
<value>Ошибка при работе в хранилище: {0}</value>
</data>
<data name="ValidationExceptionMessageWrongFIO" xml:space="preserve">
<value>Имя фамилия и отчество были введены неправильно</value>
</data>
<data name="DocumentExcelCaptionDate" xml:space="preserve">
<value>Дата</value>
</data>
<data name="DocumentExcelCaptionWorkerName" xml:space="preserve">
<value>Имя работника</value>
</data>
<data name="DocumentDocCaptionDate" xml:space="preserve">
<value>Дата изменения</value>
</data>
<data name="DocumentDocCaptionPriceHistories" xml:space="preserve">
<value>История изменения</value>
</data>
<data name="DocumentPdfTotalSalary" xml:space="preserve">
<value>Всего начислено {0}</value>
</data>
</root>

View File

@@ -7,7 +7,7 @@ using System.Threading.Tasks;
namespace AndDietCokeContracts.StoragesContracts;
public interface IBuyerStorageContract
internal interface IBuyerStorageContract
{
List<BuyerDataModel> GetList();
BuyerDataModel? GetElementById(string id);

View File

@@ -6,7 +6,7 @@ using System.Text;
using System.Threading.Tasks;
namespace AndDietCokeContracts.StoragesContracts;
public interface IDishStorageContract
internal interface IDishStorageContract
{
List<DishDataModel> GetList(bool onlyActive = true);
List<DishHistoryDataModel> GetHistoryByDishId(string dishId);

View File

@@ -7,7 +7,7 @@ using System.Threading.Tasks;
namespace AndDietCokeContracts.StoragesContracts;
public interface IPostStorageContract
internal interface IPostStorageContract
{
List<PostDataModel> GetList(bool onlyActual = true);
List<PostDataModel> GetPostWithHistory(string postId);

View File

@@ -2,7 +2,7 @@
namespace AndDietCokeContracts.StoragesContracts;
public interface ISalaryStorageContract
internal interface ISalaryStorageContract
{
List<SalaryDataModel> GetList(DateTime startDate, DateTime endDate, string?
workerId = null);

View File

@@ -7,7 +7,7 @@ using System.Threading.Tasks;
namespace AndDietCokeContracts.StoragesContracts;
public interface ISaleStorageContract
internal interface ISaleStorageContract
{
List<SaleDataModel> GetList(DateTime? startDate = null, DateTime? endDate = null, string? workerId = null, string? buyerId = null, string? dishId = null);
SaleDataModel? GetElementById(string id);

View File

@@ -7,7 +7,7 @@ using System.Threading.Tasks;
namespace AndDietCokeContracts.StoragesContracts;
public interface IWorkerStorageContract
internal interface IWorkerStorageContract
{
List<WorkerDataModel> GetList(bool onlyActive = true, string? postId = null, DateTime? fromBirthDate = null, DateTime? toBirthDate = null, DateTime? fromEmploymentDate = null, DateTime? toEmploymentDate = null);
WorkerDataModel? GetElementById(string id);

View File

@@ -2,7 +2,10 @@
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
using AndDietCokeContracts.Infrastrusture.PostConfiguration;
using AndDietCokeContracts.Mapper;
namespace AndDietCokeContracts.ViewModels;
@@ -14,5 +17,11 @@ public class PostViewModel
public required string PostType { get; set; }
[AlternativeName("ConfigurationModel")]
[PostProcessing(MappingCallMethodName = "ParseConfiguration")]
public required string Configuration { get; set; }
private string ParseConfiguration(PostConfiguration model) =>
JsonSerializer.Serialize(model, new JsonSerializerOptions() { PropertyNameCaseInsensitive = true });
}

View File

@@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using AndDietCokeContracts.Mapper;
namespace AndDietCokeContracts.ViewModels;
@@ -10,6 +11,7 @@ public class SalaryViewModel
{
public required string WorkerId { get; set; }
public required string WorkerFIO { get; set; }
[PostProcessing(ActionType = PostProcessingType.ToLocalTime)]
public DateTime SalaryDate { get; set; }
public double Salary { get; set; }
}

View File

@@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using AndDietCokeContracts.Mapper;
namespace AndDietCokeContracts.ViewModels;
@@ -17,7 +18,7 @@ public class SaleViewModel
public string? BuyerId { get; set; }
public string? BuyerFIO { get; set; }
[PostProcessing(ActionType = PostProcessingType.ToLocalTime)]
public DateTime SaleDate { get; set; }
public double Sum { get; set; }

View File

@@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using AndDietCokeContracts.Mapper;
namespace AndDietCokeContracts.ViewModels
{
@@ -10,7 +11,9 @@ namespace AndDietCokeContracts.ViewModels
{
public required string WorkerFIO { get; set; }
public double TotalSalary { get; set; }
[PostProcessing(ActionType = PostProcessingType.ToLocalTime)]
public DateTime FromPeriod { get; set; }
[PostProcessing(ActionType = PostProcessingType.ToLocalTime)]
public DateTime ToPeriod { get; set; }
}
}

View File

@@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using AndDietCokeContracts.Mapper;
namespace AndDietCokeContracts.ViewModels;
@@ -17,8 +18,9 @@ public class WorkerViewModel
public required string PostName { get; set; }
public bool IsDeleted { get; set; }
[PostProcessing(ActionType = PostProcessingType.ToLocalTime)]
public DateTime BirthDate { get; set; }
[PostProcessing(ActionType = PostProcessingType.ToLocalTime)]
public DateTime EmploymentDate { get; set; }
}

View File

@@ -11,7 +11,6 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="AutoMapper" Version="14.0.0" />
<PackageReference Include="EntityFramework" Version="6.5.1" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="9.0.4" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Testing" Version="9.0.4" />

View File

@@ -12,6 +12,7 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Moq;
using AndDietCokeTests.Infrastructure;
namespace AndDietCokeTests.BuisnessLogicsContractsTests;
@@ -25,7 +26,7 @@ internal class BuyerBusinessLogicContractTests
public void OneTimeSetUp()
{
_buyerStorageContract = new Mock<IBuyerStorageContract>();
_buyerBusinessLogicContract = new BuyerBusinessLogicContract(_buyerStorageContract.Object, new Mock<ILogger>().Object);
_buyerBusinessLogicContract = new BuyerBusinessLogicContract(_buyerStorageContract.Object, StringLocalizerMockCreator.GetObject(),new Mock<ILogger>().Object);
}
[SetUp]
@@ -65,19 +66,11 @@ internal class BuyerBusinessLogicContractTests
_buyerStorageContract.Verify(x => x.GetList(), Times.Once);
}
[Test]
public void GetAllBuyers_ReturnNull_ThrowException_Test()
{
//Act&Assert
Assert.That(() => _buyerBusinessLogicContract.GetAllBuyers(), Throws.TypeOf<NullListException>());
_buyerStorageContract.Verify(x => x.GetList(), Times.Once);
}
[Test]
public void GetAllBuyers_StorageThrowError_ThrowException_Test()
{
//Arrange
_buyerStorageContract.Setup(x => x.GetList()).Throws(new StorageException(new InvalidOperationException()));
_buyerStorageContract.Setup(x => x.GetList()).Throws(new StorageException(new InvalidOperationException(), StringLocalizerMockCreator.GetObject()));
//Act&Assert
Assert.That(() => _buyerBusinessLogicContract.GetAllBuyers(), Throws.TypeOf<StorageException>());
_buyerStorageContract.Verify(x => x.GetList(), Times.Once);
@@ -173,9 +166,9 @@ internal class BuyerBusinessLogicContractTests
public void GetBuyerByData_StorageThrowError_ThrowException_Test()
{
//Arrange
_buyerStorageContract.Setup(x => x.GetElementById(It.IsAny<string>())).Throws(new StorageException(new InvalidOperationException()));
_buyerStorageContract.Setup(x => x.GetElementByFIO(It.IsAny<string>())).Throws(new StorageException(new InvalidOperationException()));
_buyerStorageContract.Setup(x => x.GetElementByPhoneNumber(It.IsAny<string>())).Throws(new StorageException(new InvalidOperationException()));
_buyerStorageContract.Setup(x => x.GetElementById(It.IsAny<string>())).Throws(new StorageException(new InvalidOperationException(), StringLocalizerMockCreator.GetObject()));
_buyerStorageContract.Setup(x => x.GetElementByFIO(It.IsAny<string>())).Throws(new StorageException(new InvalidOperationException(), StringLocalizerMockCreator.GetObject()));
_buyerStorageContract.Setup(x => x.GetElementByPhoneNumber(It.IsAny<string>())).Throws(new StorageException(new InvalidOperationException(), StringLocalizerMockCreator.GetObject()));
//Act&Assert
Assert.That(() => _buyerBusinessLogicContract.GetBuyerByData(Guid.NewGuid().ToString()), Throws.TypeOf<StorageException>());
Assert.That(() => _buyerBusinessLogicContract.GetBuyerByData("fio"), Throws.TypeOf<StorageException>());
@@ -207,7 +200,7 @@ internal class BuyerBusinessLogicContractTests
public void InsertBuyer_RecordWithExistsData_ThrowException_Test()
{
//Arrange
_buyerStorageContract.Setup(x => x.AddElement(It.IsAny<BuyerDataModel>())).Throws(new ElementExistsException("Data", "Data"));
_buyerStorageContract.Setup(x => x.AddElement(It.IsAny<BuyerDataModel>())).Throws(new ElementExistsException("Data", "Data", StringLocalizerMockCreator.GetObject()));
//Act&Assert
Assert.That(() => _buyerBusinessLogicContract.InsertBuyer(new(Guid.NewGuid().ToString(), "Петров Иван Александрович", "+7-111-111-11-11", 10)), Throws.TypeOf<ElementExistsException>());
_buyerStorageContract.Verify(x => x.AddElement(It.IsAny<BuyerDataModel>()), Times.Once);
@@ -233,7 +226,7 @@ internal class BuyerBusinessLogicContractTests
public void InsertBuyer_StorageThrowError_ThrowException_Test()
{
//Arrange
_buyerStorageContract.Setup(x => x.AddElement(It.IsAny<BuyerDataModel>())).Throws(new StorageException(new InvalidOperationException()));
_buyerStorageContract.Setup(x => x.AddElement(It.IsAny<BuyerDataModel>())).Throws(new StorageException(new InvalidOperationException(), StringLocalizerMockCreator.GetObject()));
//Act&Assert
Assert.That(() => _buyerBusinessLogicContract.InsertBuyer(new(Guid.NewGuid().ToString(), "Петров Иван Александрович", "+7-111-111-11-11", 10)), Throws.TypeOf<StorageException>());
_buyerStorageContract.Verify(x => x.AddElement(It.IsAny<BuyerDataModel>()), Times.Once);
@@ -261,7 +254,7 @@ internal class BuyerBusinessLogicContractTests
public void UpdateBuyer_RecordWithIncorrectData_ThrowException_Test()
{
//Arrange
_buyerStorageContract.Setup(x => x.UpdElement(It.IsAny<BuyerDataModel>())).Throws(new ElementNotFoundException(""));
_buyerStorageContract.Setup(x => x.UpdElement(It.IsAny<BuyerDataModel>())).Throws(new ElementNotFoundException("", StringLocalizerMockCreator.GetObject()));
//Act&Assert
Assert.That(() => _buyerBusinessLogicContract.UpdateBuyer(new(Guid.NewGuid().ToString(), "Петров Иван Александрович", "+7-111-111-11-11", 10)), Throws.TypeOf<ElementNotFoundException>());
_buyerStorageContract.Verify(x => x.UpdElement(It.IsAny<BuyerDataModel>()), Times.Once);
@@ -271,7 +264,7 @@ internal class BuyerBusinessLogicContractTests
public void UpdateBuyer_RecordWithExistsData_ThrowException_Test()
{
//Arrange
_buyerStorageContract.Setup(x => x.UpdElement(It.IsAny<BuyerDataModel>())).Throws(new ElementExistsException("Data", "Data"));
_buyerStorageContract.Setup(x => x.UpdElement(It.IsAny<BuyerDataModel>())).Throws(new ElementExistsException("Data", "Data", StringLocalizerMockCreator.GetObject()));
//Act&Assert
Assert.That(() => _buyerBusinessLogicContract.UpdateBuyer(new(Guid.NewGuid().ToString(), "Петров Иван Александрович", "+7-111-111-11-11", 10)), Throws.TypeOf<ElementExistsException>());
_buyerStorageContract.Verify(x => x.UpdElement(It.IsAny<BuyerDataModel>()), Times.Once);
@@ -297,7 +290,7 @@ internal class BuyerBusinessLogicContractTests
public void UpdateBuyer_StorageThrowError_ThrowException_Test()
{
//Arrange
_buyerStorageContract.Setup(x => x.UpdElement(It.IsAny<BuyerDataModel>())).Throws(new StorageException(new InvalidOperationException()));
_buyerStorageContract.Setup(x => x.UpdElement(It.IsAny<BuyerDataModel>())).Throws(new StorageException(new InvalidOperationException(), StringLocalizerMockCreator.GetObject()));
//Act&Assert
Assert.That(() => _buyerBusinessLogicContract.UpdateBuyer(new(Guid.NewGuid().ToString(), "Петров Иван Александрович", "+7-111-111-11-11", 10)), Throws.TypeOf<StorageException>());
_buyerStorageContract.Verify(x => x.UpdElement(It.IsAny<BuyerDataModel>()), Times.Once);
@@ -321,7 +314,7 @@ internal class BuyerBusinessLogicContractTests
public void DeleteBuyer_RecordWithIncorrectId_ThrowException_Test()
{
//Arrange
_buyerStorageContract.Setup(x => x.DelElement(It.IsAny<string>())).Throws(new ElementNotFoundException(""));
_buyerStorageContract.Setup(x => x.DelElement(It.IsAny<string>())).Throws(new ElementNotFoundException("", StringLocalizerMockCreator.GetObject()));
//Act&Assert
Assert.That(() => _buyerBusinessLogicContract.DeleteBuyer(Guid.NewGuid().ToString()), Throws.TypeOf<ElementNotFoundException>());
_buyerStorageContract.Verify(x => x.DelElement(It.IsAny<string>()), Times.Once);
@@ -348,7 +341,7 @@ internal class BuyerBusinessLogicContractTests
public void DeleteBuyer_StorageThrowError_ThrowException_Test()
{
//Arrange
_buyerStorageContract.Setup(x => x.DelElement(It.IsAny<string>())).Throws(new StorageException(new InvalidOperationException()));
_buyerStorageContract.Setup(x => x.DelElement(It.IsAny<string>())).Throws(new StorageException(new InvalidOperationException(), StringLocalizerMockCreator.GetObject()));
//Act&Assert
Assert.That(() => _buyerBusinessLogicContract.DeleteBuyer(Guid.NewGuid().ToString()), Throws.TypeOf<StorageException>());
_buyerStorageContract.Verify(x => x.DelElement(It.IsAny<string>()), Times.Once);

View File

@@ -12,6 +12,7 @@ using System.Text;
using Microsoft.Extensions.Logging;
using System.Threading.Tasks;
using static NUnit.Framework.Internal.OSPlatform;
using AndDietCokeTests.Infrastructure;
namespace AndDietCokeTests.BuisnessLogicsContractsTests;
@@ -24,7 +25,7 @@ internal class DishBusinessLogicContractTests
public void OneTimeSetUp()
{
_dishStorageContract = new Mock<IDishStorageContract>();
_dishBusinessLogicContract = new DishBusinessLogicContract(_dishStorageContract.Object, new Mock<ILogger>().Object);
_dishBusinessLogicContract = new DishBusinessLogicContract(_dishStorageContract.Object, StringLocalizerMockCreator.GetObject(),new Mock<ILogger>().Object);
}
[SetUp]
@@ -77,20 +78,11 @@ internal class DishBusinessLogicContractTests
});
_dishStorageContract.Verify(x => x.GetList(It.IsAny<bool>()), Times.Exactly(2));
}
[Test]
public void GetAllDishes_ReturnNull_ThrowException_Test()
{
//Act&Assert
Assert.That(() => _dishBusinessLogicContract.GetAllDishes(It.IsAny<bool>()), Throws.TypeOf<NullListException>());
_dishStorageContract.Verify(x => x.GetList(It.IsAny<bool>()), Times.Once);
}
[Test]
public void GetAllDishes_StorageThrowError_ThrowException_Test()
{
//Arrange
_dishStorageContract.Setup(x => x.GetList(It.IsAny<bool>())).Throws(new StorageException(new InvalidOperationException()));
_dishStorageContract.Setup(x => x.GetList(It.IsAny<bool>())).Throws(new StorageException(new InvalidOperationException(), StringLocalizerMockCreator.GetObject()));
//Act&Assert
Assert.That(() => _dishBusinessLogicContract.GetAllDishes(It.IsAny<bool>()), Throws.TypeOf<StorageException>());
_dishStorageContract.Verify(x => x.GetList(It.IsAny<bool>()), Times.Once);
@@ -144,20 +136,11 @@ internal class DishBusinessLogicContractTests
Assert.That(() => _dishBusinessLogicContract.GetDishHistoryByDish("dishId"), Throws.TypeOf<ValidationException>());
_dishStorageContract.Verify(x => x.GetHistoryByDishId(It.IsAny<string>()), Times.Never);
}
[Test]
public void GetDishHistoryByDish_ReturnNull_ThrowException_Test()
{
//Act&Assert
Assert.That(() => _dishBusinessLogicContract.GetDishHistoryByDish(Guid.NewGuid().ToString()), Throws.TypeOf<NullListException>());
_dishStorageContract.Verify(x => x.GetHistoryByDishId(It.IsAny<string>()), Times.Once);
}
[Test]
public void GetDishHistoryByDish_StorageThrowError_ThrowException_Test()
{
//Arrange
_dishStorageContract.Setup(x => x.GetHistoryByDishId(It.IsAny<string>())).Throws(new StorageException(new InvalidOperationException()));
_dishStorageContract.Setup(x => x.GetHistoryByDishId(It.IsAny<string>())).Throws(new StorageException(new InvalidOperationException(), StringLocalizerMockCreator.GetObject()));
//Act&Assert
Assert.That(() => _dishBusinessLogicContract.GetDishHistoryByDish(Guid.NewGuid().ToString()), Throws.TypeOf<StorageException>());
_dishStorageContract.Verify(x => x.GetHistoryByDishId(It.IsAny<string>()), Times.Once);
@@ -223,8 +206,8 @@ internal class DishBusinessLogicContractTests
public void GetDishByData_StorageThrowError_ThrowException_Test()
{
//Arrange
_dishStorageContract.Setup(x => x.GetElementById(It.IsAny<string>())).Throws(new StorageException(new InvalidOperationException()));
_dishStorageContract.Setup(x => x.GetElementByName(It.IsAny<string>())).Throws(new StorageException(new InvalidOperationException()));
_dishStorageContract.Setup(x => x.GetElementById(It.IsAny<string>())).Throws(new StorageException(new InvalidOperationException(), StringLocalizerMockCreator.GetObject()));
_dishStorageContract.Setup(x => x.GetElementByName(It.IsAny<string>())).Throws(new StorageException(new InvalidOperationException(), StringLocalizerMockCreator.GetObject()));
//Act&Assert
Assert.That(() => _dishBusinessLogicContract.GetDishByData(Guid.NewGuid().ToString()), Throws.TypeOf<StorageException>());
Assert.That(() => _dishBusinessLogicContract.GetDishByData("name"), Throws.TypeOf<StorageException>());
@@ -254,7 +237,7 @@ internal class DishBusinessLogicContractTests
public void InsertDish_RecordWithExistsData_ThrowException_Test()
{
//Arrange
_dishStorageContract.Setup(x => x.AddElement(It.IsAny<DishDataModel>())).Throws(new ElementExistsException("Data", "Data"));
_dishStorageContract.Setup(x => x.AddElement(It.IsAny<DishDataModel>())).Throws(new ElementExistsException("Data", "Data", StringLocalizerMockCreator.GetObject()));
//Act&Assert
Assert.That(() => _dishBusinessLogicContract.InsertDish(new(Guid.NewGuid().ToString(), "name", DishType.Dessert, 10, false)), Throws.TypeOf<ElementExistsException>());
_dishStorageContract.Verify(x => x.AddElement(It.IsAny<DishDataModel>()), Times.Once);
@@ -280,7 +263,7 @@ internal class DishBusinessLogicContractTests
public void InsertDish_StorageThrowError_ThrowException_Test()
{
//Arrange
_dishStorageContract.Setup(x => x.AddElement(It.IsAny<DishDataModel>())).Throws(new StorageException(new InvalidOperationException()));
_dishStorageContract.Setup(x => x.AddElement(It.IsAny<DishDataModel>())).Throws(new StorageException(new InvalidOperationException(), StringLocalizerMockCreator.GetObject()));
//Act&Assert
Assert.That(() => _dishBusinessLogicContract.InsertDish(new(Guid.NewGuid().ToString(), "name", DishType.Dessert, 10, false)), Throws.TypeOf<StorageException>());
_dishStorageContract.Verify(x => x.AddElement(It.IsAny<DishDataModel>()), Times.Once);
@@ -308,7 +291,7 @@ internal class DishBusinessLogicContractTests
public void UpdateDish_RecordWithIncorrectData_ThrowException_Test()
{
//Arrange
_dishStorageContract.Setup(x => x.UpdElement(It.IsAny<DishDataModel>())).Throws(new ElementNotFoundException(""));
_dishStorageContract.Setup(x => x.UpdElement(It.IsAny<DishDataModel>())).Throws(new ElementNotFoundException("", StringLocalizerMockCreator.GetObject()));
//Act&Assert
Assert.That(() => _dishBusinessLogicContract.UpdateDish(new(Guid.NewGuid().ToString(), "name", DishType.Dessert, 10, false)), Throws.TypeOf<ElementNotFoundException>());
_dishStorageContract.Verify(x => x.UpdElement(It.IsAny<DishDataModel>()), Times.Once);
@@ -318,7 +301,7 @@ internal class DishBusinessLogicContractTests
public void UpdateDish_RecordWithExistsData_ThrowException_Test()
{
//Arrange
_dishStorageContract.Setup(x => x.UpdElement(It.IsAny<DishDataModel>())).Throws(new ElementExistsException("Data", "Data"));
_dishStorageContract.Setup(x => x.UpdElement(It.IsAny<DishDataModel>())).Throws(new ElementExistsException("Data", "Data", StringLocalizerMockCreator.GetObject()));
//Act&Assert
Assert.That(() => _dishBusinessLogicContract.UpdateDish(new(Guid.NewGuid().ToString(), "anme", DishType.Dessert, 10, false)), Throws.TypeOf<ElementExistsException>());
_dishStorageContract.Verify(x => x.UpdElement(It.IsAny<DishDataModel>()), Times.Once);
@@ -344,7 +327,7 @@ internal class DishBusinessLogicContractTests
public void UpdateDish_StorageThrowError_ThrowException_Test()
{
//Arrange
_dishStorageContract.Setup(x => x.UpdElement(It.IsAny<DishDataModel>())).Throws(new StorageException(new InvalidOperationException()));
_dishStorageContract.Setup(x => x.UpdElement(It.IsAny<DishDataModel>())).Throws(new StorageException(new InvalidOperationException(), StringLocalizerMockCreator.GetObject()));
//Act&Assert
Assert.That(() => _dishBusinessLogicContract.UpdateDish(new(Guid.NewGuid().ToString(), "name", DishType.Dessert, 10, false)), Throws.TypeOf<StorageException>());
_dishStorageContract.Verify(x => x.UpdElement(It.IsAny<DishDataModel>()), Times.Once);
@@ -369,7 +352,7 @@ internal class DishBusinessLogicContractTests
{
//Arrange
var id = Guid.NewGuid().ToString();
_dishStorageContract.Setup(x => x.DelElement(It.IsAny<string>())).Throws(new ElementNotFoundException(id));
_dishStorageContract.Setup(x => x.DelElement(It.IsAny<string>())).Throws(new ElementNotFoundException(id, StringLocalizerMockCreator.GetObject()));
//Act&Assert
Assert.That(() => _dishBusinessLogicContract.DeleteDish(Guid.NewGuid().ToString()), Throws.TypeOf<ElementNotFoundException>());
_dishStorageContract.Verify(x => x.DelElement(It.IsAny<string>()), Times.Once);
@@ -396,7 +379,7 @@ internal class DishBusinessLogicContractTests
public void DeleteDish_StorageThrowError_ThrowException_Test()
{
//Arrange
_dishStorageContract.Setup(x => x.DelElement(It.IsAny<string>())).Throws(new StorageException(new InvalidOperationException()));
_dishStorageContract.Setup(x => x.DelElement(It.IsAny<string>())).Throws(new StorageException(new InvalidOperationException(), StringLocalizerMockCreator.GetObject()));
//Act&Assert
Assert.That(() => _dishBusinessLogicContract.DeleteDish(Guid.NewGuid().ToString()), Throws.TypeOf<StorageException>());
_dishStorageContract.Verify(x => x.DelElement(It.IsAny<string>()), Times.Once);

View File

@@ -13,6 +13,7 @@ using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
using AndDietCokeContracts.Exceptions;
using AndDietCokeContracts.Infrastrusture.PostConfiguration;
using AndDietCokeTests.Infrastructure;
namespace AndDietCokeTests.BuisnessLogicsContractsTests;
@@ -26,7 +27,7 @@ internal class PostBusinessLogicContractTests
{
_postStorageContract = new Mock<IPostStorageContract>();
_postBusinessLogicContract = new
PostBusinessLogicContract(_postStorageContract.Object, new Mock<ILogger>().Object);
PostBusinessLogicContract(_postStorageContract.Object, StringLocalizerMockCreator.GetObject(), new Mock<ILogger>().Object);
}
[SetUp]
public void SetUp()
@@ -73,17 +74,10 @@ internal class PostBusinessLogicContractTests
});
}
[Test]
public void GetAllPosts_ReturnNull_ThrowException_Test()
{
//Act&Assert
Assert.That(() => _postBusinessLogicContract.GetAllPosts(It.IsAny<bool>()), Throws.TypeOf<NullListException>());
_postStorageContract.Verify(x => x.GetList(It.IsAny<bool>()), Times.Once);
}
[Test]
public void GetAllPosts_StorageThrowError_ThrowException_Test()
{
//Arrange
_postStorageContract.Setup(x => x.GetList(It.IsAny<bool>())).Throws(new StorageException(new InvalidOperationException()));
_postStorageContract.Setup(x => x.GetList(It.IsAny<bool>())).Throws(new StorageException(new InvalidOperationException(), StringLocalizerMockCreator.GetObject()));
//Act&Assert
Assert.That(() => _postBusinessLogicContract.GetAllPosts(It.IsAny<bool>()), Throws.TypeOf<StorageException>());
_postStorageContract.Verify(x => x.GetList(It.IsAny<bool>()), Times.Once);
@@ -136,18 +130,10 @@ internal class PostBusinessLogicContractTests
_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()));
_postStorageContract.Setup(x => x.GetPostWithHistory(It.IsAny<string>())).Throws(new StorageException(new InvalidOperationException(), StringLocalizerMockCreator.GetObject()));
//Act&Assert
Assert.That(() => _postBusinessLogicContract.GetAllDataOfPost(Guid.NewGuid().ToString()), Throws.TypeOf<StorageException>());
_postStorageContract.Verify(x =>
@@ -211,8 +197,8 @@ internal class PostBusinessLogicContractTests
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()));
_postStorageContract.Setup(x => x.GetElementById(It.IsAny<string>())).Throws(new StorageException(new InvalidOperationException(), StringLocalizerMockCreator.GetObject()));
_postStorageContract.Setup(x => x.GetElementByName(It.IsAny<string>())).Throws(new StorageException(new InvalidOperationException(), StringLocalizerMockCreator.GetObject()));
//Act&Assert
Assert.That(() => _postBusinessLogicContract.GetPostByData(Guid.NewGuid().ToString()), Throws.TypeOf<StorageException>());
Assert.That(() => _postBusinessLogicContract.GetPostByData("name"), Throws.TypeOf<StorageException>());
@@ -240,7 +226,7 @@ internal class PostBusinessLogicContractTests
public void InsertPost_RecordWithExistsData_ThrowException_Test()
{
//Arrange
_postStorageContract.Setup(x => x.AddElement(It.IsAny<PostDataModel>())).Throws(new ElementExistsException("Data", "Data"));
_postStorageContract.Setup(x => x.AddElement(It.IsAny<PostDataModel>())).Throws(new ElementExistsException("Data", "Data", StringLocalizerMockCreator.GetObject()));
//Act&Assert
Assert.That(() => _postBusinessLogicContract.InsertPost(new(Guid.NewGuid().ToString(), "name", PostType.Chef, new PostConfiguration { Rate = 10 })), Throws.TypeOf<ElementExistsException>());
_postStorageContract.Verify(x => x.AddElement(It.IsAny<PostDataModel>()), Times.Once);
@@ -263,7 +249,7 @@ internal class PostBusinessLogicContractTests
public void InsertPost_StorageThrowError_ThrowException_Test()
{
//Arrange
_postStorageContract.Setup(x => x.AddElement(It.IsAny<PostDataModel>())).Throws(new StorageException(new InvalidOperationException()));
_postStorageContract.Setup(x => x.AddElement(It.IsAny<PostDataModel>())).Throws(new StorageException(new InvalidOperationException(), StringLocalizerMockCreator.GetObject()));
//Act&Assert
Assert.That(() => _postBusinessLogicContract.InsertPost(new(Guid.NewGuid().ToString(), "name", PostType.Chef, new PostConfiguration { Rate = 10 })), Throws.TypeOf<StorageException>());
_postStorageContract.Verify(x => x.AddElement(It.IsAny<PostDataModel>()), Times.Once);
@@ -289,7 +275,7 @@ internal class PostBusinessLogicContractTests
public void UpdatePost_RecordWithIncorrectData_ThrowException_Test()
{
//Arrange
_postStorageContract.Setup(x => x.UpdElement(It.IsAny<PostDataModel>())).Throws(new ElementNotFoundException(""));
_postStorageContract.Setup(x => x.UpdElement(It.IsAny<PostDataModel>())).Throws(new ElementNotFoundException("", StringLocalizerMockCreator.GetObject()));
//Act&Assert
Assert.That(() => _postBusinessLogicContract.UpdatePost(new(Guid.NewGuid().ToString(), "name", PostType.Chef, new PostConfiguration { Rate = 10 })), Throws.TypeOf<ElementNotFoundException>());
_postStorageContract.Verify(x =>
@@ -299,7 +285,7 @@ internal class PostBusinessLogicContractTests
public void UpdatePost_RecordWithExistsData_ThrowException_Test()
{
//Arrange
_postStorageContract.Setup(x => x.UpdElement(It.IsAny<PostDataModel>())).Throws(new ElementExistsException("Data", "Data"));
_postStorageContract.Setup(x => x.UpdElement(It.IsAny<PostDataModel>())).Throws(new ElementExistsException("Data", "Data", StringLocalizerMockCreator.GetObject()));
//Act&Assert
Assert.That(() => _postBusinessLogicContract.UpdatePost(new(Guid.NewGuid().ToString(), "name", PostType.Chef, new PostConfiguration { Rate = 10 })), Throws.TypeOf<ElementExistsException>());
_postStorageContract.Verify(x => x.UpdElement(It.IsAny<PostDataModel>()), Times.Once);
@@ -322,7 +308,7 @@ internal class PostBusinessLogicContractTests
public void UpdatePost_StorageThrowError_ThrowException_Test()
{
//Arrange
_postStorageContract.Setup(x => x.UpdElement(It.IsAny<PostDataModel>())).Throws(new StorageException(new InvalidOperationException()));
_postStorageContract.Setup(x => x.UpdElement(It.IsAny<PostDataModel>())).Throws(new StorageException(new InvalidOperationException(), StringLocalizerMockCreator.GetObject()));
//Act&Assert
Assert.That(() => _postBusinessLogicContract.UpdatePost(new(Guid.NewGuid().ToString(), "name", PostType.Chef, new PostConfiguration { Rate = 10 })), Throws.TypeOf<StorageException>());
_postStorageContract.Verify(x => x.UpdElement(It.IsAny<PostDataModel>()), Times.Once);
@@ -345,7 +331,7 @@ internal class PostBusinessLogicContractTests
{
//Arrange
var id = Guid.NewGuid().ToString();
_postStorageContract.Setup(x => x.DelElement(It.IsAny<string>())).Throws(new ElementNotFoundException(id));
_postStorageContract.Setup(x => x.DelElement(It.IsAny<string>())).Throws(new ElementNotFoundException(id, StringLocalizerMockCreator.GetObject()));
//Act&Assert
Assert.That(() => _postBusinessLogicContract.DeletePost(Guid.NewGuid().ToString()), Throws.TypeOf<ElementNotFoundException>());
_postStorageContract.Verify(x => x.DelElement(It.IsAny<string>()), Times.Once);
@@ -369,7 +355,7 @@ internal class PostBusinessLogicContractTests
public void DeletePost_StorageThrowError_ThrowException_Test()
{
//Arrange
_postStorageContract.Setup(x => x.DelElement(It.IsAny<string>())).Throws(new StorageException(new InvalidOperationException()));
_postStorageContract.Setup(x => x.DelElement(It.IsAny<string>())).Throws(new StorageException(new InvalidOperationException(), StringLocalizerMockCreator.GetObject()));
//Act&Assert
Assert.That(() => _postBusinessLogicContract.DeletePost(Guid.NewGuid().ToString()), Throws.TypeOf<StorageException>());
_postStorageContract.Verify(x => x.DelElement(It.IsAny<string>()), Times.Once);
@@ -392,7 +378,7 @@ internal class PostBusinessLogicContractTests
{
//Arrange
var id = Guid.NewGuid().ToString();
_postStorageContract.Setup(x => x.ResElement(It.IsAny<string>())).Throws(new ElementNotFoundException(id));
_postStorageContract.Setup(x => x.ResElement(It.IsAny<string>())).Throws(new ElementNotFoundException(id, StringLocalizerMockCreator.GetObject()));
//Act&Assert
Assert.That(() => _postBusinessLogicContract.RestorePost(Guid.NewGuid().ToString()), Throws.TypeOf<ElementNotFoundException>());
_postStorageContract.Verify(x => x.ResElement(It.IsAny<string>()), Times.Once);
@@ -416,7 +402,7 @@ internal class PostBusinessLogicContractTests
public void RestorePost_StorageThrowError_ThrowException_Test()
{
//Arrange
_postStorageContract.Setup(x => x.ResElement(It.IsAny<string>())).Throws(new StorageException(new InvalidOperationException()));
_postStorageContract.Setup(x => x.ResElement(It.IsAny<string>())).Throws(new StorageException(new InvalidOperationException(), StringLocalizerMockCreator.GetObject()));
//Act&Assert
Assert.That(() => _postBusinessLogicContract.RestorePost(Guid.NewGuid().ToString()), Throws.TypeOf<StorageException>());
_postStorageContract.Verify(x => x.ResElement(It.IsAny<string>()), Times.Once);

View File

@@ -5,6 +5,7 @@ using AndDietCokeContracts.DataModels;
using AndDietCokeContracts.Enums;
using AndDietCokeContracts.Exceptions;
using AndDietCokeContracts.StoragesContracts;
using AndDietCokeTests.Infrastructure;
using Microsoft.Extensions.Logging;
using Moq;
@@ -28,7 +29,7 @@ namespace AndDietCokeTests.BusinessLogicContractsTests
_baseExcelBuilder = new Mock<BaseExcelBuilder>();
_basePdfBuilder = new Mock<BasePdfBuilder>();
_salaryStorageContractMock = new Mock<ISalaryStorageContract>();
_reportContract = new ReportContract(_dishStorageContractMock.Object, _saleStorageContract.Object, _salaryStorageContractMock.Object, new Mock<ILogger>().Object, _baseWordBuilder.Object, _baseExcelBuilder.Object, _basePdfBuilder.Object);
_reportContract = new ReportContract(_dishStorageContractMock.Object, _saleStorageContract.Object, _salaryStorageContractMock.Object, new Mock<ILogger>().Object, _baseWordBuilder.Object, _baseExcelBuilder.Object, _basePdfBuilder.Object, StringLocalizerMockCreator.GetObject());
}
[SetUp]
public void SetUp()
@@ -72,7 +73,7 @@ namespace AndDietCokeTests.BusinessLogicContractsTests
{
_saleStorageContract.Setup(x => x.GetListAsync(It.IsAny<DateTime>(), It.IsAny<DateTime>(), It.IsAny<CancellationToken>()))
.Throws(new StorageException(new InvalidOperationException()));
.Throws(new StorageException(new InvalidOperationException(), StringLocalizerMockCreator.GetObject()));
Assert.That(async () =>
await _reportContract.GetDataSalesByPeriodAsync(DateTime.UtcNow.AddDays(-1), DateTime.UtcNow.AddDays(1), CancellationToken.None),
Throws.TypeOf<StorageException>());
@@ -219,7 +220,7 @@ namespace AndDietCokeTests.BusinessLogicContractsTests
});
Assert.Multiple(() =>
{
Assert.That(firstRow[0], Is.EqualTo(DateTime.Now.ToShortDateString()));
Assert.That(firstRow[0], Is.EqualTo(DateTime.UtcNow.ToShortDateString()));
Assert.That(firstRow[1], Is.EqualTo(5000.ToString("N2")));
Assert.That(secondRow[3], Is.EqualTo(10.ToString()));
});
@@ -282,7 +283,7 @@ namespace AndDietCokeTests.BusinessLogicContractsTests
public void GetDataBySalaryByPeriod_WhenStorageThrowError_ShouldFail_Test()
{
//Arrange
_salaryStorageContractMock.Setup(x => x.GetListAsync(It.IsAny<DateTime>(), It.IsAny<DateTime>(), It.IsAny<CancellationToken>())).Throws(new StorageException(new InvalidOperationException()));
_salaryStorageContractMock.Setup(x => x.GetListAsync(It.IsAny<DateTime>(), It.IsAny<DateTime>(), It.IsAny<CancellationToken>())).Throws(new StorageException(new InvalidOperationException(), StringLocalizerMockCreator.GetObject()));
//Act&Assert
Assert.That(async () => await _reportContract.GetDataSalaryByPeriodAsync(DateTime.UtcNow.AddDays(-1), DateTime.UtcNow, CancellationToken.None), Throws.TypeOf<StorageException>());
_salaryStorageContractMock.Verify(x => x.GetListAsync(It.IsAny<DateTime>(), It.IsAny<DateTime>(), It.IsAny<CancellationToken>()), Times.Once);

View File

@@ -34,7 +34,7 @@ internal class SalaryBuisnessLogicContractTests
_postStorageContract = new Mock<IPostStorageContract>();
_workerStorageContract = new Mock<IWorkerStorageContract>();
_salaryBusinessLogicContract = new SalaryBusinessLogicContract(_salaryStorageContract.Object,
_saleStorageContract.Object, _postStorageContract.Object, _workerStorageContract.Object, new Mock<ILogger>().Object, _salaryConfigurationTest);
_saleStorageContract.Object, _postStorageContract.Object, _workerStorageContract.Object, new Mock<ILogger>().Object, _salaryConfigurationTest, StringLocalizerMockCreator.GetObject());
}
[SetUp]
@@ -91,19 +91,11 @@ internal class SalaryBuisnessLogicContractTests
_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()));
_salaryStorageContract.Setup(x => x.GetList(It.IsAny<DateTime>(), It.IsAny<DateTime>(), It.IsAny<string>())).Throws(new StorageException(new InvalidOperationException(), StringLocalizerMockCreator.GetObject()));
//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);
@@ -172,19 +164,11 @@ internal class SalaryBuisnessLogicContractTests
_salaryStorageContract.Verify(x => x.GetList(It.IsAny<DateTime>(), It.IsAny<DateTime>(), It.IsAny<string>()), Times.Never);
}
[Test]
public void GetAllSalariesByWorker_ReturnNull_ThrowException_Test()
{
//Act&Assert
Assert.That(() => _salaryBusinessLogicContract.GetAllSalariesByPeriodByWorker(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 GetAllSalariesByWorker_StorageThrowError_ThrowException_Test()
{
//Arrange
_salaryStorageContract.Setup(x => x.GetList(It.IsAny<DateTime>(), It.IsAny<DateTime>(), It.IsAny<string>())).Throws(new StorageException(new InvalidOperationException()));
_salaryStorageContract.Setup(x => x.GetList(It.IsAny<DateTime>(), It.IsAny<DateTime>(), It.IsAny<string>())).Throws(new StorageException(new InvalidOperationException(), StringLocalizerMockCreator.GetObject()));
//Act&Assert
Assert.That(() => _salaryBusinessLogicContract.GetAllSalariesByPeriodByWorker(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);
@@ -298,43 +282,13 @@ internal class SalaryBuisnessLogicContractTests
//Assert
Assert.That(sum, Is.EqualTo(expectedSum));
}
[Test]
public void CalculateSalaryByMounth_SaleStorageReturnNull_ThrowException_Test()
{
//Arrange
var workerId = Guid.NewGuid().ToString();
_postStorageContract.Setup(x => x.GetElementById(It.IsAny<string>()))
.Returns(new PostDataModel(Guid.NewGuid().ToString(), "name", PostType.Chef, new PostConfiguration { Rate = 2000 }));
_workerStorageContract.Setup(x => x.GetList(It.IsAny<bool>(), It.IsAny<string?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>()))
.Returns([new WorkerDataModel(workerId, "Test", Guid.NewGuid().ToString(), DateTime.UtcNow, DateTime.UtcNow, false)]);
//Act&Assert
Assert.That(() => _salaryBusinessLogicContract.CalculateSalaryByMounth(DateTime.UtcNow), Throws.TypeOf<NullListException>());
}
[Test]
public void CalculateSalaryByMounth_WorkerStorageReturnNull_ThrowException_Test()
{
//Arrange
var workerId = Guid.NewGuid().ToString();
_saleStorageContract.Setup(x => x.GetList(It.IsAny<DateTime>(), It.IsAny<DateTime>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>()))
.Returns([new SaleDataModel(Guid.NewGuid().ToString(), workerId, null, true, false, [])]);
_postStorageContract.Setup(x => x.GetElementById(It.IsAny<string>()))
.Returns(new PostDataModel(Guid.NewGuid().ToString(), "name", PostType.Chef, new PostConfiguration { Rate = 2000 }));
//Act&Assert
Assert.That(() => _salaryBusinessLogicContract.CalculateSalaryByMounth(DateTime.UtcNow), Throws.TypeOf<NullListException>());
}
[Test]
public void CalculateSalaryByMounth_SaleStorageThrowException_ThrowException_Test()
{
//Arrange
var workerId = Guid.NewGuid().ToString();
_saleStorageContract.Setup(x => x.GetList(It.IsAny<DateTime>(), It.IsAny<DateTime>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>()))
.Throws(new StorageException(new InvalidOperationException()));
.Throws(new StorageException(new InvalidOperationException(), StringLocalizerMockCreator.GetObject()));
_postStorageContract.Setup(x => x.GetElementById(It.IsAny<string>()))
.Returns(new PostDataModel(Guid.NewGuid().ToString(), "name", PostType.Chef, new PostConfiguration { Rate = 2000 }));
_workerStorageContract.Setup(x => x.GetList(It.IsAny<bool>(), It.IsAny<string?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>()))
@@ -353,7 +307,7 @@ internal class SalaryBuisnessLogicContractTests
_postStorageContract.Setup(x => x.GetElementById(It.IsAny<string>()))
.Returns(new PostDataModel(Guid.NewGuid().ToString(), "name", PostType.Chef, new PostConfiguration { Rate = 2000 }));
_workerStorageContract.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()));
.Throws(new StorageException(new InvalidOperationException(), StringLocalizerMockCreator.GetObject()));
//Act&Assert
Assert.That(() => _salaryBusinessLogicContract.CalculateSalaryByMounth(DateTime.UtcNow), Throws.TypeOf<StorageException>());
}

View File

@@ -2,15 +2,10 @@
using AndDietCokeContracts.DataModels;
using AndDietCokeContracts.Exceptions;
using AndDietCokeContracts.StoragesContracts;
using AndDietCokeContracts.Enums;
using Moq;
using NUnit.Framework;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Extensions.Logging;
using System.Threading.Tasks;
using AndDietCokeTests.Infrastructure;
namespace AndDietCokeTests.BuisnessLogicsContractsTests;
@@ -24,7 +19,7 @@ internal class SaleBuisnessLogicContractTests
public void OneTimeSetUp()
{
_saleStorageContract = new Mock<ISaleStorageContract>();
_saleBusinessLogicContract = new SaleBusinessLogicContract(_saleStorageContract.Object, new Mock<ILogger>().Object);
_saleBusinessLogicContract = new SaleBusinessLogicContract(_saleStorageContract.Object, new Mock<ILogger>().Object, StringLocalizerMockCreator.GetObject());
}
[SetUp]
@@ -76,20 +71,11 @@ internal class SaleBuisnessLogicContractTests
Assert.That(() => _saleBusinessLogicContract.GetAllSalesByPeriod(date, date.AddSeconds(-1)), Throws.TypeOf<IncorrectDatesException>());
_saleStorageContract.Verify(x => x.GetList(It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>()), Times.Never);
}
[Test]
public void GetAllSalesByPeriod_ReturnNull_ThrowException_Test()
{
//Act&Assert
Assert.That(() => _saleBusinessLogicContract.GetAllSalesByPeriod(DateTime.UtcNow, DateTime.UtcNow.AddDays(1)), Throws.TypeOf<NullListException>());
_saleStorageContract.Verify(x => x.GetList(It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>()), Times.Once);
}
[Test]
public void GetAllSalesByPeriod_StorageThrowError_ThrowException_Test()
{
//Arrange
_saleStorageContract.Setup(x => x.GetList(It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>())).Throws(new StorageException(new InvalidOperationException()));
_saleStorageContract.Setup(x => x.GetList(It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>())).Throws(new StorageException(new InvalidOperationException(), StringLocalizerMockCreator.GetObject()));
//Act&Assert
Assert.That(() => _saleBusinessLogicContract.GetAllSalesByPeriod(DateTime.UtcNow, DateTime.UtcNow.AddDays(1)), Throws.TypeOf<StorageException>());
_saleStorageContract.Verify(x => x.GetList(It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>()), Times.Once);
@@ -157,20 +143,11 @@ internal class SaleBuisnessLogicContractTests
Assert.That(() => _saleBusinessLogicContract.GetAllSalesByWorkerByPeriod("workerId", DateTime.UtcNow, DateTime.UtcNow.AddDays(1)), Throws.TypeOf<ValidationException>());
_saleStorageContract.Verify(x => x.GetList(It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>()), Times.Never);
}
[Test]
public void GetAllSalesByWorkerByPeriod_ReturnNull_ThrowException_Test()
{
//Act&Assert
Assert.That(() => _saleBusinessLogicContract.GetAllSalesByWorkerByPeriod(Guid.NewGuid().ToString(), DateTime.UtcNow, DateTime.UtcNow.AddDays(1)), Throws.TypeOf<NullListException>());
_saleStorageContract.Verify(x => x.GetList(It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>()), Times.Once);
}
[Test]
public void GetAllSalesByWorkerByPeriod_StorageThrowError_ThrowException_Test()
{
//Arrange
_saleStorageContract.Setup(x => x.GetList(It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>())).Throws(new StorageException(new InvalidOperationException()));
_saleStorageContract.Setup(x => x.GetList(It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>())).Throws(new StorageException(new InvalidOperationException(), StringLocalizerMockCreator.GetObject()));
//Act&Assert
Assert.That(() => _saleBusinessLogicContract.GetAllSalesByWorkerByPeriod(Guid.NewGuid().ToString(), DateTime.UtcNow, DateTime.UtcNow.AddDays(1)), Throws.TypeOf<StorageException>());
_saleStorageContract.Verify(x => x.GetList(It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>()), Times.Once);
@@ -238,20 +215,11 @@ internal class SaleBuisnessLogicContractTests
Assert.That(() => _saleBusinessLogicContract.GetAllSalesByBuyerByPeriod("buyerId", DateTime.UtcNow, DateTime.UtcNow.AddDays(1)), Throws.TypeOf<ValidationException>());
_saleStorageContract.Verify(x => x.GetList(It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>()), Times.Never);
}
[Test]
public void GetAllSalesByBuyerByPeriod_ReturnNull_ThrowException_Test()
{
//Act&Assert
Assert.That(() => _saleBusinessLogicContract.GetAllSalesByBuyerByPeriod(Guid.NewGuid().ToString(), DateTime.UtcNow, DateTime.UtcNow.AddDays(1)), Throws.TypeOf<NullListException>());
_saleStorageContract.Verify(x => x.GetList(It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>()), Times.Once);
}
[Test]
public void GetAllSalesByBuyerByPeriod_StorageThrowError_ThrowException_Test()
{
//Arrange
_saleStorageContract.Setup(x => x.GetList(It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>())).Throws(new StorageException(new InvalidOperationException()));
_saleStorageContract.Setup(x => x.GetList(It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>())).Throws(new StorageException(new InvalidOperationException(), StringLocalizerMockCreator.GetObject()));
//Act&Assert
Assert.That(() => _saleBusinessLogicContract.GetAllSalesByBuyerByPeriod(Guid.NewGuid().ToString(), DateTime.UtcNow, DateTime.UtcNow.AddDays(1)), Throws.TypeOf<StorageException>());
_saleStorageContract.Verify(x => x.GetList(It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>()), Times.Once);
@@ -319,20 +287,11 @@ internal class SaleBuisnessLogicContractTests
Assert.That(() => _saleBusinessLogicContract.GetAllSalesByDishByPeriod("dishId", DateTime.UtcNow, DateTime.UtcNow.AddDays(1)), Throws.TypeOf<ValidationException>());
_saleStorageContract.Verify(x => x.GetList(It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>()), Times.Never);
}
[Test]
public void GetAllSalesByDishByPeriod_ReturnNull_ThrowException_Test()
{
//Act&Assert
Assert.That(() => _saleBusinessLogicContract.GetAllSalesByDishByPeriod(Guid.NewGuid().ToString(), DateTime.UtcNow, DateTime.UtcNow.AddDays(1)), Throws.TypeOf<NullListException>());
_saleStorageContract.Verify(x => x.GetList(It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>()), Times.Once);
}
[Test]
public void GetAllSalesByDishByPeriod_StorageThrowError_ThrowException_Test()
{
//Arrange
_saleStorageContract.Setup(x => x.GetList(It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>())).Throws(new StorageException(new InvalidOperationException()));
_saleStorageContract.Setup(x => x.GetList(It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>())).Throws(new StorageException(new InvalidOperationException(), StringLocalizerMockCreator.GetObject()));
//Act&Assert
Assert.That(() => _saleBusinessLogicContract.GetAllSalesByDishByPeriod(Guid.NewGuid().ToString(), DateTime.UtcNow, DateTime.UtcNow.AddDays(1)), Throws.TypeOf<StorageException>());
_saleStorageContract.Verify(x => x.GetList(It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>()), Times.Once);
@@ -383,7 +342,7 @@ internal class SaleBuisnessLogicContractTests
public void GetSaleByData_StorageThrowError_ThrowException_Test()
{
//Arrange
_saleStorageContract.Setup(x => x.GetElementById(It.IsAny<string>())).Throws(new StorageException(new InvalidOperationException()));
_saleStorageContract.Setup(x => x.GetElementById(It.IsAny<string>())).Throws(new StorageException(new InvalidOperationException(), StringLocalizerMockCreator.GetObject()));
//Act&Assert
Assert.That(() => _saleBusinessLogicContract.GetSaleByData(Guid.NewGuid().ToString()), Throws.TypeOf<StorageException>());
_saleStorageContract.Verify(x => x.GetElementById(It.IsAny<string>()), Times.Once);
@@ -414,7 +373,7 @@ internal class SaleBuisnessLogicContractTests
public void InsertSale_RecordWithExistsData_ThrowException_Test()
{
//Arrange
_saleStorageContract.Setup(x => x.AddElement(It.IsAny<SaleDataModel>())).Throws(new ElementExistsException("Data", "Data"));
_saleStorageContract.Setup(x => x.AddElement(It.IsAny<SaleDataModel>())).Throws(new ElementExistsException("Data", "Data", StringLocalizerMockCreator.GetObject()));
//Act&Assert
Assert.That(() => _saleBusinessLogicContract.InsertSale(new(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(),
Guid.NewGuid().ToString(), true, false, [new OrderDishDataModel(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), 20, 5)])), Throws.TypeOf<ElementExistsException>());
@@ -441,7 +400,7 @@ internal class SaleBuisnessLogicContractTests
public void InsertSale_StorageThrowError_ThrowException_Test()
{
//Arrange
_saleStorageContract.Setup(x => x.AddElement(It.IsAny<SaleDataModel>())).Throws(new StorageException(new InvalidOperationException()));
_saleStorageContract.Setup(x => x.AddElement(It.IsAny<SaleDataModel>())).Throws(new StorageException(new InvalidOperationException(), StringLocalizerMockCreator.GetObject()));
//Act&Assert
Assert.That(() => _saleBusinessLogicContract.InsertSale(new(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(),
Guid.NewGuid().ToString(), true, false, [new OrderDishDataModel(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), 20, 5)])), Throws.TypeOf<StorageException>());
@@ -467,7 +426,7 @@ internal class SaleBuisnessLogicContractTests
{
//Arrange
var id = Guid.NewGuid().ToString();
_saleStorageContract.Setup(x => x.DelElement(It.IsAny<string>())).Throws(new ElementNotFoundException(id));
_saleStorageContract.Setup(x => x.DelElement(It.IsAny<string>())).Throws(new ElementNotFoundException(id, StringLocalizerMockCreator.GetObject()));
//Act&Assert
Assert.That(() => _saleBusinessLogicContract.CancelSale(Guid.NewGuid().ToString()), Throws.TypeOf<ElementNotFoundException>());
_saleStorageContract.Verify(x => x.DelElement(It.IsAny<string>()), Times.Once);
@@ -494,7 +453,7 @@ internal class SaleBuisnessLogicContractTests
public void CancelSale_StorageThrowError_ThrowException_Test()
{
//Arrange
_saleStorageContract.Setup(x => x.DelElement(It.IsAny<string>())).Throws(new StorageException(new InvalidOperationException()));
_saleStorageContract.Setup(x => x.DelElement(It.IsAny<string>())).Throws(new StorageException(new InvalidOperationException(), StringLocalizerMockCreator.GetObject()));
//Act&Assert
Assert.That(() => _saleBusinessLogicContract.CancelSale(Guid.NewGuid().ToString()), Throws.TypeOf<StorageException>());
_saleStorageContract.Verify(x => x.DelElement(It.IsAny<string>()), Times.Once);

View File

@@ -10,6 +10,7 @@ using Microsoft.Extensions.Logging;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using AndDietCokeTests.Infrastructure;
namespace AndDietCokeTests.BuisnessLogicsContractsTests;
@@ -22,7 +23,7 @@ internal class WorkerBusinessLogicContractTests
public void OneTimeSetUp()
{
_workerStorageContract = new Mock<IWorkerStorageContract>();
_workerBusinessLogicContract = new WorkerBusinessLogicContract(_workerStorageContract.Object, new Mock<ILogger>().Object);
_workerBusinessLogicContract = new WorkerBusinessLogicContract(_workerStorageContract.Object, StringLocalizerMockCreator.GetObject(), new Mock<ILogger>().Object);
}
[SetUp]
@@ -76,19 +77,11 @@ internal class WorkerBusinessLogicContractTests
_workerStorageContract.Verify(x => x.GetList(It.IsAny<bool>(), null, null, null, null, null), Times.Exactly(2));
}
[Test]
public void GetAllWorkers_ReturnNull_ThrowException_Test()
{
//Act&Assert
Assert.That(() => _workerBusinessLogicContract.GetAllWorkers(It.IsAny<bool>()), Throws.TypeOf<NullListException>());
_workerStorageContract.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 GetAllWorkers_StorageThrowError_ThrowException_Test()
{
//Arrange
_workerStorageContract.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()));
_workerStorageContract.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(), StringLocalizerMockCreator.GetObject()));
//Act&Assert
Assert.That(() => _workerBusinessLogicContract.GetAllWorkers(It.IsAny<bool>()), Throws.TypeOf<StorageException>());
_workerStorageContract.Verify(x => x.GetList(It.IsAny<bool>(), null, null, null, null, null), Times.Once);
@@ -156,20 +149,11 @@ internal class WorkerBusinessLogicContractTests
Assert.That(() => _workerBusinessLogicContract.GetAllWorkersByPost("postId", It.IsAny<bool>()), Throws.TypeOf<ValidationException>());
_workerStorageContract.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 GetAllWorkersByPost_ReturnNull_ThrowException_Test()
{
//Act&Assert
Assert.That(() => _workerBusinessLogicContract.GetAllWorkersByPost(Guid.NewGuid().ToString(), It.IsAny<bool>()), Throws.TypeOf<NullListException>());
_workerStorageContract.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 GetAllWorkersByPost_StorageThrowError_ThrowException_Test()
{
//Arrange
_workerStorageContract.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()));
_workerStorageContract.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(), StringLocalizerMockCreator.GetObject()));
//Act&Assert
Assert.That(() => _workerBusinessLogicContract.GetAllWorkersByPost(Guid.NewGuid().ToString(), It.IsAny<bool>()), Throws.TypeOf<StorageException>());
_workerStorageContract.Verify(x => x.GetList(It.IsAny<bool>(), It.IsAny<string?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>()), Times.Once);
@@ -233,19 +217,11 @@ internal class WorkerBusinessLogicContractTests
_workerStorageContract.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 GetAllWorkersByBirthDate_ReturnNull_ThrowException_Test()
{
//Act&Assert
Assert.That(() => _workerBusinessLogicContract.GetAllWorkersByBirthDate(DateTime.UtcNow, DateTime.UtcNow.AddDays(1), It.IsAny<bool>()), Throws.TypeOf<NullListException>());
_workerStorageContract.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 GetAllWorkersByBirthDate_StorageThrowError_ThrowException_Test()
{
//Arrange
_workerStorageContract.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()));
_workerStorageContract.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(), StringLocalizerMockCreator.GetObject()));
//Act&Assert
Assert.That(() => _workerBusinessLogicContract.GetAllWorkersByBirthDate(DateTime.UtcNow, DateTime.UtcNow.AddDays(1), It.IsAny<bool>()), Throws.TypeOf<StorageException>());
_workerStorageContract.Verify(x => x.GetList(It.IsAny<bool>(), It.IsAny<string?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>()), Times.Once);
@@ -308,20 +284,11 @@ internal class WorkerBusinessLogicContractTests
Assert.That(() => _workerBusinessLogicContract.GetAllWorkersByEmploymentDate(date, date.AddSeconds(-1), It.IsAny<bool>()), Throws.TypeOf<IncorrectDatesException>());
_workerStorageContract.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 GetAllWorkersByEmploymentDate_ReturnNull_ThrowException_Test()
{
//Act&Assert
Assert.That(() => _workerBusinessLogicContract.GetAllWorkersByEmploymentDate(DateTime.UtcNow, DateTime.UtcNow.AddDays(1), It.IsAny<bool>()), Throws.TypeOf<NullListException>());
_workerStorageContract.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 GetAllWorkersByEmploymentDate_StorageThrowError_ThrowException_Test()
{
//Arrange
_workerStorageContract.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()));
_workerStorageContract.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(), StringLocalizerMockCreator.GetObject()));
//Act&Assert
Assert.That(() => _workerBusinessLogicContract.GetAllWorkersByEmploymentDate(DateTime.UtcNow, DateTime.UtcNow.AddDays(1), It.IsAny<bool>()), Throws.TypeOf<StorageException>());
_workerStorageContract.Verify(x => x.GetList(It.IsAny<bool>(), It.IsAny<string?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>()), Times.Once);
@@ -389,8 +356,8 @@ internal class WorkerBusinessLogicContractTests
public void GetWorkerByData_StorageThrowError_ThrowException_Test()
{
//Arrange
_workerStorageContract.Setup(x => x.GetElementById(It.IsAny<string>())).Throws(new StorageException(new InvalidOperationException()));
_workerStorageContract.Setup(x => x.GetElementByFIO(It.IsAny<string>())).Throws(new StorageException(new InvalidOperationException()));
_workerStorageContract.Setup(x => x.GetElementById(It.IsAny<string>())).Throws(new StorageException(new InvalidOperationException(), StringLocalizerMockCreator.GetObject()));
_workerStorageContract.Setup(x => x.GetElementByFIO(It.IsAny<string>())).Throws(new StorageException(new InvalidOperationException(), StringLocalizerMockCreator.GetObject()));
//Act&Assert
Assert.That(() => _workerBusinessLogicContract.GetWorkerByData(Guid.NewGuid().ToString()), Throws.TypeOf<StorageException>());
Assert.That(() => _workerBusinessLogicContract.GetWorkerByData("fio"), Throws.TypeOf<StorageException>());
@@ -421,7 +388,7 @@ internal class WorkerBusinessLogicContractTests
public void InsertWorker_RecordWithExistsData_ThrowException_Test()
{
//Arrange
_workerStorageContract.Setup(x => x.AddElement(It.IsAny<WorkerDataModel>())).Throws(new ElementExistsException("Data", "Data"));
_workerStorageContract.Setup(x => x.AddElement(It.IsAny<WorkerDataModel>())).Throws(new ElementExistsException("Data", "Data", StringLocalizerMockCreator.GetObject()));
//Act&Assert
Assert.That(() => _workerBusinessLogicContract.InsertWorker(new(Guid.NewGuid().ToString(), "fio", Guid.NewGuid().ToString(), DateTime.Now.AddYears(-16).AddDays(-1), DateTime.Now, false)), Throws.TypeOf<ElementExistsException>());
_workerStorageContract.Verify(x => x.AddElement(It.IsAny<WorkerDataModel>()), Times.Once);
@@ -447,7 +414,7 @@ internal class WorkerBusinessLogicContractTests
public void InsertWorker_StorageThrowError_ThrowException_Test()
{
//Arrange
_workerStorageContract.Setup(x => x.AddElement(It.IsAny<WorkerDataModel>())).Throws(new StorageException(new InvalidOperationException()));
_workerStorageContract.Setup(x => x.AddElement(It.IsAny<WorkerDataModel>())).Throws(new StorageException(new InvalidOperationException(), StringLocalizerMockCreator.GetObject()));
//Act&Assert
Assert.That(() => _workerBusinessLogicContract.InsertWorker(new(Guid.NewGuid().ToString(), "fio", Guid.NewGuid().ToString(), DateTime.Now.AddYears(-16).AddDays(-1), DateTime.Now, false)), Throws.TypeOf<StorageException>());
_workerStorageContract.Verify(x => x.AddElement(It.IsAny<WorkerDataModel>()), Times.Once);
@@ -476,7 +443,7 @@ internal class WorkerBusinessLogicContractTests
public void UpdateWorker_RecordWithIncorrectData_ThrowException_Test()
{
//Arrange
_workerStorageContract.Setup(x => x.UpdElement(It.IsAny<WorkerDataModel>())).Throws(new ElementNotFoundException(""));
_workerStorageContract.Setup(x => x.UpdElement(It.IsAny<WorkerDataModel>())).Throws(new ElementNotFoundException("", StringLocalizerMockCreator.GetObject()));
//Act&Assert
Assert.That(() => _workerBusinessLogicContract.UpdateWorker(new(Guid.NewGuid().ToString(), "fio", Guid.NewGuid().ToString(), DateTime.Now.AddYears(-16).AddDays(-1), DateTime.Now, false)), Throws.TypeOf<ElementNotFoundException>());
_workerStorageContract.Verify(x => x.UpdElement(It.IsAny<WorkerDataModel>()), Times.Once);
@@ -502,7 +469,7 @@ internal class WorkerBusinessLogicContractTests
public void UpdateWorker_StorageThrowError_ThrowException_Test()
{
//Arrange
_workerStorageContract.Setup(x => x.UpdElement(It.IsAny<WorkerDataModel>())).Throws(new StorageException(new InvalidOperationException()));
_workerStorageContract.Setup(x => x.UpdElement(It.IsAny<WorkerDataModel>())).Throws(new StorageException(new InvalidOperationException(), StringLocalizerMockCreator.GetObject()));
//Act&Assert
Assert.That(() => _workerBusinessLogicContract.UpdateWorker(new(Guid.NewGuid().ToString(), "fio", Guid.NewGuid().ToString(), DateTime.Now.AddYears(-16).AddDays(-1), DateTime.Now, false)), Throws.TypeOf<StorageException>());
_workerStorageContract.Verify(x => x.UpdElement(It.IsAny<WorkerDataModel>()), Times.Once);
@@ -527,7 +494,7 @@ internal class WorkerBusinessLogicContractTests
{
//Arrange
var id = Guid.NewGuid().ToString();
_workerStorageContract.Setup(x => x.DelElement(It.Is((string x) => x != id))).Throws(new ElementNotFoundException(id));
_workerStorageContract.Setup(x => x.DelElement(It.Is((string x) => x != id))).Throws(new ElementNotFoundException(id, StringLocalizerMockCreator.GetObject()));
//Act&Assert
Assert.That(() => _workerBusinessLogicContract.DeleteWorker(Guid.NewGuid().ToString()), Throws.TypeOf<ElementNotFoundException>());
_workerStorageContract.Verify(x => x.DelElement(It.IsAny<string>()), Times.Once);
@@ -554,7 +521,7 @@ internal class WorkerBusinessLogicContractTests
public void DeleteWorker_StorageThrowError_ThrowException_Test()
{
//Arrange
_workerStorageContract.Setup(x => x.DelElement(It.IsAny<string>())).Throws(new StorageException(new InvalidOperationException()));
_workerStorageContract.Setup(x => x.DelElement(It.IsAny<string>())).Throws(new StorageException(new InvalidOperationException(), StringLocalizerMockCreator.GetObject()));
//Act&Assert
Assert.That(() => _workerBusinessLogicContract.DeleteWorker(Guid.NewGuid().ToString()), Throws.TypeOf<StorageException>());
_workerStorageContract.Verify(x => x.DelElement(It.IsAny<string>()), Times.Once);

View File

@@ -1,5 +1,6 @@
using AndDietCokeContracts.DataModels;
using AndDietCokeContracts.Exceptions;
using AndDietCokeTests.Infrastructure;
using NUnit.Framework;
using System;
using System.Collections.Generic;
@@ -16,38 +17,38 @@ internal class BuyerDataModelTests
public void IdIsNullOrEmptyTest()
{
var buyer = CreateDataModel(null, "Ivanov Ivan", "number");
Assert.That(() => buyer.Validate(), Throws.TypeOf<ValidationException>());
Assert.That(() => buyer.Validate(StringLocalizerMockCreator.GetObject()), Throws.TypeOf<ValidationException>());
buyer = CreateDataModel(string.Empty, "Ivanov Ivan", "number");
Assert.That(() => buyer.Validate(), Throws.TypeOf<ValidationException>());
Assert.That(() => buyer.Validate(StringLocalizerMockCreator.GetObject()), Throws.TypeOf<ValidationException>());
}
[Test]
public void IdIsNotGuidTest()
{
var buyer = CreateDataModel("id", "Ivanov Ivan", "number");
Assert.That(() => buyer.Validate(), Throws.TypeOf<ValidationException>());
Assert.That(() => buyer.Validate(StringLocalizerMockCreator.GetObject()), Throws.TypeOf<ValidationException>());
}
[Test]
public void FIOIsNullOrEmptyTest()
{
var buyer = CreateDataModel(Guid.NewGuid().ToString(), null, "number");
Assert.That(() => buyer.Validate(), Throws.TypeOf<ValidationException>());
Assert.That(() => buyer.Validate(StringLocalizerMockCreator.GetObject()), Throws.TypeOf<ValidationException>());
buyer = CreateDataModel(Guid.NewGuid().ToString(), string.Empty, "number");
Assert.That(() => buyer.Validate(), Throws.TypeOf<ValidationException>());
Assert.That(() => buyer.Validate(StringLocalizerMockCreator.GetObject()), Throws.TypeOf<ValidationException>());
}
[Test]
public void PhoneNumberIsNullOrEmptyTest()
{
var buyer = CreateDataModel(Guid.NewGuid().ToString(), "Ivanov Ivan", null);
Assert.That(() => buyer.Validate(),
Assert.That(() => buyer.Validate(StringLocalizerMockCreator.GetObject()),
Throws.TypeOf<ValidationException>());
buyer = CreateDataModel(Guid.NewGuid().ToString(), "Ivanov Ivan", string.Empty);
Assert.That(() => buyer.Validate(), Throws.TypeOf<ValidationException>());
Assert.That(() => buyer.Validate(StringLocalizerMockCreator.GetObject()), Throws.TypeOf<ValidationException>());
}
[Test]
public void PhoneNumberIsIncorrectTest()
{
var buyer = CreateDataModel(Guid.NewGuid().ToString(), "Ivanov Ivan", "777");
Assert.That(() => buyer.Validate(), Throws.TypeOf<ValidationException>());
Assert.That(() => buyer.Validate(StringLocalizerMockCreator.GetObject()), Throws.TypeOf<ValidationException>());
}
[Test]
public void AllFieldsIsCorrectTest()
@@ -56,7 +57,7 @@ internal class BuyerDataModelTests
var fio = "Ivanov Ivan";
var phoneNumber = "+7-777-777-77-77";
var buyer = CreateDataModel(buyerId, fio, phoneNumber);
Assert.That(() => buyer.Validate(), Throws.Nothing);
Assert.That(() => buyer.Validate(StringLocalizerMockCreator.GetObject()), Throws.Nothing);
Assert.Multiple(() =>
{
Assert.That(buyer.Id, Is.EqualTo(buyerId));

View File

@@ -8,6 +8,7 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static NUnit.Framework.Internal.OSPlatform;
using AndDietCokeTests.Infrastructure;
namespace AndDietCokeTests.DataModelsTests;
@@ -18,41 +19,41 @@ internal class DishDataModelTests
public void IdIsNullOrEmptyTest()
{
var dish = CreateDataModel(null, "name", DishType.Drink, 10, false);
Assert.That(() => dish.Validate(), Throws.TypeOf<ValidationException>());
Assert.That(() => dish.Validate(StringLocalizerMockCreator.GetObject()), Throws.TypeOf<ValidationException>());
dish = CreateDataModel(string.Empty, "name", DishType.Drink, 10, false);
Assert.That(() => dish.Validate(), Throws.TypeOf<ValidationException>());
Assert.That(() => dish.Validate(StringLocalizerMockCreator.GetObject()), Throws.TypeOf<ValidationException>());
}
[Test]
public void IdIsNotGuidTest()
{
var dish = CreateDataModel("id", "name", DishType.Drink, 10, false);
Assert.That(() => dish.Validate(), Throws.TypeOf<ValidationException>());
Assert.That(() => dish.Validate(StringLocalizerMockCreator.GetObject()), Throws.TypeOf<ValidationException>());
}
[Test]
public void DishNameIsEmptyTest()
{
var dish = CreateDataModel(Guid.NewGuid().ToString(), null, DishType.Drink, 10, false);
Assert.That(() => dish.Validate(), Throws.TypeOf<ValidationException>());
Assert.That(() => dish.Validate(StringLocalizerMockCreator.GetObject()), Throws.TypeOf<ValidationException>());
dish = CreateDataModel(Guid.NewGuid().ToString(), string.Empty, DishType.Drink, 10, false);
Assert.That(() => dish.Validate(), Throws.TypeOf<ValidationException>());
Assert.That(() => dish.Validate(StringLocalizerMockCreator.GetObject()), Throws.TypeOf<ValidationException>());
}
[Test]
public void DishTypeIsNoneTest()
{
var dish = CreateDataModel(Guid.NewGuid().ToString(), null, DishType.None, 10, false);
Assert.That(() => dish.Validate(), Throws.TypeOf<ValidationException>());
Assert.That(() => dish.Validate(StringLocalizerMockCreator.GetObject()), Throws.TypeOf<ValidationException>());
}
[Test]
public void PriceIsLessOrZeroTest()
{
var dish = CreateDataModel(Guid.NewGuid().ToString(), "name", DishType.Drink, 0, false);
Assert.That(() => dish.Validate(), Throws.TypeOf<ValidationException>());
Assert.That(() => dish.Validate(StringLocalizerMockCreator.GetObject()), Throws.TypeOf<ValidationException>());
dish = CreateDataModel(Guid.NewGuid().ToString(), "name", DishType.Drink, -10, false);
Assert.That(() => dish.Validate(), Throws.TypeOf<ValidationException>());
Assert.That(() => dish.Validate(StringLocalizerMockCreator.GetObject()), Throws.TypeOf<ValidationException>());
}
[Test]
@@ -64,7 +65,7 @@ internal class DishDataModelTests
var dishPrice = 10;
var dishIsDelete = false;
var dish = CreateDataModel(dishId, dishName, dishType, dishPrice, dishIsDelete);
Assert.That(() => dish.Validate(), Throws.Nothing);
Assert.That(() => dish.Validate(StringLocalizerMockCreator.GetObject()), Throws.Nothing);
Assert.Multiple(() =>
{
Assert.That(dish.Id, Is.EqualTo(dishId));

View File

@@ -6,6 +6,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using AndDietCokeTests.Infrastructure;
namespace AndDietCokeTests.DataModelsTests;
@@ -16,25 +17,25 @@ internal class DishHistoryDataModelTests
public void DishIdIsNullOrEmptyTest()
{
var dish = CreateDataModel(null, 10);
Assert.That(() => dish.Validate(), Throws.TypeOf<ValidationException>());
Assert.That(() => dish.Validate(StringLocalizerMockCreator.GetObject()), Throws.TypeOf<ValidationException>());
dish = CreateDataModel(string.Empty, 10);
Assert.That(() => dish.Validate(), Throws.TypeOf<ValidationException>());
Assert.That(() => dish.Validate(StringLocalizerMockCreator.GetObject()), Throws.TypeOf<ValidationException>());
}
[Test]
public void DishIdIsNotGuidTest()
{
var dish = CreateDataModel("id", 10);
Assert.That(() => dish.Validate(), Throws.TypeOf<ValidationException>());
Assert.That(() => dish.Validate(StringLocalizerMockCreator.GetObject()), Throws.TypeOf<ValidationException>());
}
[Test]
public void OldPriceIsLessOrZeroTest()
{
var dish = CreateDataModel(Guid.NewGuid().ToString(), 0);
Assert.That(() => dish.Validate(), Throws.TypeOf<ValidationException>());
Assert.That(() => dish.Validate(StringLocalizerMockCreator.GetObject()), Throws.TypeOf<ValidationException>());
dish = CreateDataModel(Guid.NewGuid().ToString(), -10);
Assert.That(() => dish.Validate(), Throws.TypeOf<ValidationException>());
Assert.That(() => dish.Validate(StringLocalizerMockCreator.GetObject()), Throws.TypeOf<ValidationException>());
}
[Test]
@@ -43,7 +44,7 @@ internal class DishHistoryDataModelTests
var dishId = Guid.NewGuid().ToString();
var oldPrice = 10;
var dishHistory = CreateDataModel(dishId, oldPrice);
Assert.That(() => dishHistory.Validate(), Throws.Nothing);
Assert.That(() => dishHistory.Validate(StringLocalizerMockCreator.GetObject()), Throws.Nothing);
Assert.Multiple(() =>
{
Assert.That(dishHistory.DishId, Is.EqualTo(dishId));

View File

@@ -1,5 +1,6 @@
using AndDietCokeContracts.DataModels;
using AndDietCokeContracts.Exceptions;
using AndDietCokeTests.Infrastructure;
using NUnit.Framework;
using System;
using System.Collections.Generic;
@@ -16,41 +17,41 @@ internal class OrderDataModelTests
public void OrderIdIsNullOrEmptyTest()
{
var orderDish = CreateDataModel(null, Guid.NewGuid().ToString(), 10, 20);
Assert.That(() => orderDish.Validate(), Throws.TypeOf<ValidationException>());
Assert.That(() => orderDish.Validate(StringLocalizerMockCreator.GetObject()), Throws.TypeOf<ValidationException>());
orderDish = CreateDataModel(string.Empty, Guid.NewGuid().ToString(), 10, 20);
Assert.That(() => orderDish.Validate(), Throws.TypeOf<ValidationException>());
Assert.That(() => orderDish.Validate(StringLocalizerMockCreator.GetObject()), Throws.TypeOf<ValidationException>());
}
[Test]
public void OrderIdIsNotGuidTest()
{
var orderDish = CreateDataModel("saleId", Guid.NewGuid().ToString(), 10, 20);
Assert.That(() => orderDish.Validate(), Throws.TypeOf<ValidationException>());
Assert.That(() => orderDish.Validate(StringLocalizerMockCreator.GetObject()), Throws.TypeOf<ValidationException>());
}
[Test]
public void DishIdIsNullOrEmptyTest()
{
var orderDish = CreateDataModel(Guid.NewGuid().ToString(), null, 10, 20);
Assert.That(() => orderDish.Validate(), Throws.TypeOf<ValidationException>());
Assert.That(() => orderDish.Validate(StringLocalizerMockCreator.GetObject()), Throws.TypeOf<ValidationException>());
orderDish = CreateDataModel(string.Empty, Guid.NewGuid().ToString(), 10, 20);
Assert.That(() => orderDish.Validate(), Throws.TypeOf<ValidationException>());
Assert.That(() => orderDish.Validate(StringLocalizerMockCreator.GetObject()), Throws.TypeOf<ValidationException>());
}
[Test]
public void DishIdIsNotGuidTest()
{
var orderDish = CreateDataModel(Guid.NewGuid().ToString(), "dishId", 10, 20);
Assert.That(() => orderDish.Validate(), Throws.TypeOf<ValidationException>());
Assert.That(() => orderDish.Validate(StringLocalizerMockCreator.GetObject()), Throws.TypeOf<ValidationException>());
}
[Test]
public void CountIsLessOrZeroTest()
{
var orderDish = CreateDataModel(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), 0, 20);
Assert.That(() => orderDish.Validate(), Throws.TypeOf<ValidationException>());
Assert.That(() => orderDish.Validate(StringLocalizerMockCreator.GetObject()), Throws.TypeOf<ValidationException>());
orderDish = CreateDataModel(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), -10, 20);
Assert.That(() => orderDish.Validate(), Throws.TypeOf<ValidationException>());
Assert.That(() => orderDish.Validate(StringLocalizerMockCreator.GetObject()), Throws.TypeOf<ValidationException>());
}
[Test]
@@ -61,7 +62,7 @@ internal class OrderDataModelTests
var count = 10;
var price = 20;
var orderDish = CreateDataModel(orderId, dishId, count, price);
Assert.That(() => orderDish.Validate(), Throws.Nothing);
Assert.That(() => orderDish.Validate(StringLocalizerMockCreator.GetObject()), Throws.Nothing);
Assert.Multiple(() =>
{
Assert.That(orderDish.OrderId, Is.EqualTo(orderId));

View File

@@ -2,6 +2,7 @@
using AndDietCokeContracts.Enums;
using AndDietCokeContracts.Exceptions;
using AndDietCokeContracts.Infrastrusture.PostConfiguration;
using AndDietCokeTests.Infrastructure;
using NUnit.Framework;
using System;
using System.Collections.Generic;
@@ -19,59 +20,59 @@ internal class PostDataModelTests
public void IdIsNullOrEmptyTest()
{
var post = CreateDataModel("0", "name", PostType.Waiter, new PostConfiguration() { Rate = 10 });
Assert.That(() => post.Validate(), Throws.TypeOf<ValidationException>());
Assert.That(() => post.Validate(StringLocalizerMockCreator.GetObject()), Throws.TypeOf<ValidationException>());
post = CreateDataModel(string.Empty, "name", PostType.Waiter, new PostConfiguration() { Rate = 10 });
Assert.That(() => post.Validate(), Throws.TypeOf<ValidationException>());
Assert.That(() => post.Validate(StringLocalizerMockCreator.GetObject()), Throws.TypeOf<ValidationException>());
}
[Test]
public void IdIsNotGuidTest()
{
var post = CreateDataModel("id", "name", PostType.Waiter, new PostConfiguration() { Rate = 10 });
Assert.That(() => post.Validate(), Throws.TypeOf<ValidationException>());
Assert.That(() => post.Validate(StringLocalizerMockCreator.GetObject()), Throws.TypeOf<ValidationException>());
}
[Test]
public void PostIdIsNullEmptyTest()
{
var post = CreateDataModel("0", "name", PostType.Waiter, new PostConfiguration() { Rate = 10 });
Assert.That(() => post.Validate(), Throws.TypeOf<ValidationException>());
Assert.That(() => post.Validate(StringLocalizerMockCreator.GetObject()), Throws.TypeOf<ValidationException>());
post = CreateDataModel("0", "name", PostType.Waiter, new PostConfiguration() { Rate = 10 });
Assert.That(() => post.Validate(), Throws.TypeOf<ValidationException>());
Assert.That(() => post.Validate(StringLocalizerMockCreator.GetObject()), Throws.TypeOf<ValidationException>());
}
[Test]
public void PostIdIsNotGuidTest()
{
var post = CreateDataModel("0", "name", PostType.Waiter, new PostConfiguration() { Rate = 110 });
Assert.That(() => post.Validate(), Throws.TypeOf<ValidationException>());
Assert.That(() => post.Validate(StringLocalizerMockCreator.GetObject()), Throws.TypeOf<ValidationException>());
}
[Test]
public void PostNameIsEmptyTest()
{
var manufacturer = CreateDataModel(Guid.NewGuid().ToString(), null, PostType.Waiter, new PostConfiguration() { Rate = 10 });
Assert.That(() => manufacturer.Validate(), Throws.TypeOf<ValidationException>());
Assert.That(() => manufacturer.Validate(StringLocalizerMockCreator.GetObject()), Throws.TypeOf<ValidationException>());
manufacturer = CreateDataModel(Guid.NewGuid().ToString(), string.Empty, PostType.Waiter, new PostConfiguration() { Rate = 10 });
Assert.That(() => manufacturer.Validate(), Throws.TypeOf<ValidationException>());
Assert.That(() => manufacturer.Validate(StringLocalizerMockCreator.GetObject()), Throws.TypeOf<ValidationException>());
}
[Test]
public void PostTypeIsNoneTest()
{
var post = CreateDataModel(Guid.NewGuid().ToString(), "name", PostType.None, new PostConfiguration() { Rate = 10 });
Assert.That(() => post.Validate(), Throws.TypeOf<ValidationException>());
Assert.That(() => post.Validate(StringLocalizerMockCreator.GetObject()), Throws.TypeOf<ValidationException>());
}
[Test]
public void ConfigurationModelIsNullTest()
{
var post = CreateDataModel(Guid.NewGuid().ToString(), "name", PostType.Waiter, null);
Assert.That(() => post.Validate(), Throws.TypeOf<ValidationException>());
Assert.That(() => post.Validate(StringLocalizerMockCreator.GetObject()), Throws.TypeOf<ValidationException>());
}
[Test]
public void RateIsLessOrZeroTest()
{
var post = CreateDataModel(Guid.NewGuid().ToString(), "name", PostType.Waiter, new PostConfiguration() { Rate = 0 });
Assert.That(() => post.Validate(), Throws.TypeOf<ValidationException>());
Assert.That(() => post.Validate(StringLocalizerMockCreator.GetObject()), Throws.TypeOf<ValidationException>());
post = CreateDataModel(Guid.NewGuid().ToString(), "name", PostType.Waiter, new PostConfiguration() { Rate = -10 });
Assert.That(() => post.Validate(), Throws.TypeOf<ValidationException>());
Assert.That(() => post.Validate(StringLocalizerMockCreator.GetObject()), Throws.TypeOf<ValidationException>());
}
[Test]
@@ -83,7 +84,7 @@ internal class PostDataModelTests
var postType = PostType.Waiter;
var configuration = new PostConfiguration() { Rate = 10 };
var post = CreateDataModel(postId, postName, postType, configuration);
Assert.That(() => post.Validate(), Throws.Nothing);
Assert.That(() => post.Validate(StringLocalizerMockCreator.GetObject()), Throws.Nothing);
Assert.Multiple(() =>
{
Assert.That(post.Id, Is.EqualTo(postId));
@@ -91,6 +92,7 @@ internal class PostDataModelTests
Assert.That(post.PostType, Is.EqualTo(postType));
Assert.That(post.ConfigurationModel, Is.EqualTo(configuration));
Assert.That(post.ConfigurationModel.Rate, Is.EqualTo(configuration.Rate));
Assert.That(post.ConfigurationModel.CultureName, Is.Not.Empty);
});
}
private static PostDataModel CreateDataModel(string id, string postName, PostType postType, PostConfiguration configuration) => new(id, postName, postType, configuration);

View File

@@ -1,5 +1,6 @@
using AndDietCokeContracts.DataModels;
using AndDietCokeContracts.Exceptions;
using AndDietCokeTests.Infrastructure;
using NUnit.Framework;
using System;
using System.Collections.Generic;
@@ -16,24 +17,24 @@ internal class SalaryDataModelTests
public void WorkerIdIsEmptyTest()
{
var salary = CreateDataModel(null, DateTime.Now, 10);
Assert.That(() => salary.Validate(), Throws.TypeOf<ValidationException>());
Assert.That(() => salary.Validate(StringLocalizerMockCreator.GetObject()), Throws.TypeOf<ValidationException>());
salary = CreateDataModel(string.Empty, DateTime.Now, 10);
Assert.That(() => salary.Validate(), Throws.TypeOf<ValidationException>());
Assert.That(() => salary.Validate(StringLocalizerMockCreator.GetObject()), Throws.TypeOf<ValidationException>());
}
[Test]
public void WorkerIdIsNotGuidTest()
{
var salary = CreateDataModel("workerId", DateTime.Now, 10);
Assert.That(() => salary.Validate(), Throws.TypeOf<ValidationException>());
Assert.That(() => salary.Validate(StringLocalizerMockCreator.GetObject()), Throws.TypeOf<ValidationException>());
}
[Test]
public void PriceIsLessOrZeroTest()
{
var salary = CreateDataModel(Guid.NewGuid().ToString(), DateTime.Now, 0);
Assert.That(() => salary.Validate(), Throws.TypeOf<ValidationException>());
Assert.That(() => salary.Validate(StringLocalizerMockCreator.GetObject()), Throws.TypeOf<ValidationException>());
salary = CreateDataModel(Guid.NewGuid().ToString(), DateTime.Now, -10);
Assert.That(() => salary.Validate(), Throws.TypeOf<ValidationException>());
Assert.That(() => salary.Validate(StringLocalizerMockCreator.GetObject()), Throws.TypeOf<ValidationException>());
}
[Test]
@@ -43,11 +44,11 @@ internal class SalaryDataModelTests
var salaryDate = DateTime.Now.AddDays(-3).AddMinutes(-5);
var workerSalary = 10;
var salary = CreateDataModel(workerId, salaryDate, workerSalary);
Assert.That(() => salary.Validate(), Throws.Nothing);
Assert.That(() => salary.Validate(StringLocalizerMockCreator.GetObject()), Throws.Nothing);
Assert.Multiple(() =>
{
Assert.That(salary.WorkerId, Is.EqualTo(workerId));
Assert.That(salary.SalaryDate, Is.EqualTo(salaryDate));
Assert.That(salary.SalaryDate, Is.EqualTo(salaryDate.ToUniversalTime()));
Assert.That(salary.Salary, Is.EqualTo(workerSalary));
});
}

View File

@@ -1,5 +1,6 @@
using AndDietCokeContracts.DataModels;
using AndDietCokeContracts.Exceptions;
using AndDietCokeTests.Infrastructure;
using NUnit.Framework;
using System;
using System.Collections.Generic;
@@ -16,57 +17,57 @@ internal class SaleDataModelTests
public void IdIsNullOrEmptyTest()
{
var sale = CreateDataModel(null, Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), 10, true, false, CreateSubDataModel());
Assert.That(() => sale.Validate(), Throws.TypeOf<ValidationException>());
Assert.That(() => sale.Validate(StringLocalizerMockCreator.GetObject()), Throws.TypeOf<ValidationException>());
sale = CreateDataModel(string.Empty, Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), 10, true, false, CreateSubDataModel());
Assert.That(() => sale.Validate(), Throws.TypeOf<ValidationException>());
Assert.That(() => sale.Validate(StringLocalizerMockCreator.GetObject()), Throws.TypeOf<ValidationException>());
}
[Test]
public void IdIsNotGuidTest()
{
var sale = CreateDataModel("id", Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), 10, true, false, CreateSubDataModel());
Assert.That(() => sale.Validate(), Throws.TypeOf<ValidationException>());
Assert.That(() => sale.Validate(StringLocalizerMockCreator.GetObject()), Throws.TypeOf<ValidationException>());
}
[Test]
public void WorkerIdIsNullOrEmptyTest()
{
var sale = CreateDataModel(Guid.NewGuid().ToString(), null, Guid.NewGuid().ToString(), 10, true, false, CreateSubDataModel());
Assert.That(() => sale.Validate(), Throws.TypeOf<ValidationException>());
Assert.That(() => sale.Validate(StringLocalizerMockCreator.GetObject()), Throws.TypeOf<ValidationException>());
sale = CreateDataModel(Guid.NewGuid().ToString(), string.Empty, Guid.NewGuid().ToString(), 10, true, false, CreateSubDataModel());
Assert.That(() => sale.Validate(), Throws.TypeOf<ValidationException>());
Assert.That(() => sale.Validate(StringLocalizerMockCreator.GetObject()), Throws.TypeOf<ValidationException>());
}
[Test]
public void WorkerIdIsNotGuidTest()
{
var sale = CreateDataModel(Guid.NewGuid().ToString(), "workerId", Guid.NewGuid().ToString(), 10, true, false, CreateSubDataModel());
Assert.That(() => sale.Validate(), Throws.TypeOf<ValidationException>());
Assert.That(() => sale.Validate(StringLocalizerMockCreator.GetObject()), Throws.TypeOf<ValidationException>());
}
[Test]
public void BuyerIdIsNotGuidTest()
{
var sale = CreateDataModel(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), "buyerId", 10, true, false, CreateSubDataModel());
Assert.That(() => sale.Validate(), Throws.TypeOf<ValidationException>());
Assert.That(() => sale.Validate(StringLocalizerMockCreator.GetObject()), Throws.TypeOf<ValidationException>());
}
[Test]
public void SumIsLessOrZeroTest()
{
var sale = CreateDataModel(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), 0, true, false, CreateSubDataModel());
Assert.That(() => sale.Validate(), Throws.TypeOf<ValidationException>());
Assert.That(() => sale.Validate(StringLocalizerMockCreator.GetObject()), Throws.TypeOf<ValidationException>());
sale = CreateDataModel(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), -10, true, false, CreateSubDataModel());
Assert.That(() => sale.Validate(), Throws.TypeOf<ValidationException>());
Assert.That(() => sale.Validate(StringLocalizerMockCreator.GetObject()), Throws.TypeOf<ValidationException>());
}
[Test]
public void DishesIsNullOrEmptyTest()
{
var sale = CreateDataModel(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), 10, true, false, null);
Assert.That(() => sale.Validate(), Throws.TypeOf<ValidationException>());
Assert.That(() => sale.Validate(StringLocalizerMockCreator.GetObject()), Throws.TypeOf<ValidationException>());
sale = CreateDataModel(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), 10, true, false, []);
Assert.That(() => sale.Validate(), Throws.TypeOf<ValidationException>());
Assert.That(() => sale.Validate(StringLocalizerMockCreator.GetObject()), Throws.TypeOf<ValidationException>());
}
[Test]
@@ -80,7 +81,7 @@ internal class SaleDataModelTests
var isCancel = true;
var dishes = CreateSubDataModel();
var sale = CreateDataModel(saleId, workerId, buyerId, sum, isConstantClient, isCancel, dishes);
Assert.That(() => sale.Validate(), Throws.Nothing);
Assert.That(() => sale.Validate(StringLocalizerMockCreator.GetObject()), Throws.Nothing);
Assert.Multiple(() =>
{
Assert.That(sale.Id, Is.EqualTo(saleId));

View File

@@ -1,5 +1,6 @@
using AndDietCokeContracts.DataModels;
using AndDietCokeContracts.Exceptions;
using AndDietCokeTests.Infrastructure;
using NUnit.Framework;
using System;
using System.Collections.Generic;
@@ -16,9 +17,9 @@ internal class WorkerDataModelTests
public void IdIsNullOrEmptyTest()
{
var worker = CreateDataModel(null, "fio", Guid.NewGuid().ToString(), DateTime.Now.AddYears(-18), DateTime.Now, false);
Assert.That(() => worker.Validate(), Throws.TypeOf<ValidationException>());
Assert.That(() => worker.Validate(StringLocalizerMockCreator.GetObject()), Throws.TypeOf<ValidationException>());
worker = CreateDataModel(string.Empty, "fio", Guid.NewGuid().ToString(), DateTime.Now.AddYears(-18), DateTime.Now, false);
Assert.That(() => worker.Validate(), Throws.TypeOf<ValidationException>());
Assert.That(() => worker.Validate(StringLocalizerMockCreator.GetObject()), Throws.TypeOf<ValidationException>());
}
[Test]
@@ -26,7 +27,7 @@ internal class WorkerDataModelTests
{
var worker = CreateDataModel("id", "fio", Guid.NewGuid().ToString(),
DateTime.Now.AddYears(-18), DateTime.Now, false);
Assert.That(() => worker.Validate(),
Assert.That(() => worker.Validate(StringLocalizerMockCreator.GetObject()),
Throws.TypeOf<ValidationException>());
}
@@ -34,41 +35,41 @@ internal class WorkerDataModelTests
public void FIOIsNullOrEmptyTest()
{
var worker = CreateDataModel(Guid.NewGuid().ToString(), null, Guid.NewGuid().ToString(), DateTime.Now.AddYears(-18), DateTime.Now, false);
Assert.That(() => worker.Validate(), Throws.TypeOf<ValidationException>());
Assert.That(() => worker.Validate(StringLocalizerMockCreator.GetObject()), Throws.TypeOf<ValidationException>());
worker = CreateDataModel(Guid.NewGuid().ToString(), string.Empty, Guid.NewGuid().ToString(), DateTime.Now.AddYears(-18), DateTime.Now, false);
Assert.That(() => worker.Validate(), Throws.TypeOf<ValidationException>());
Assert.That(() => worker.Validate(StringLocalizerMockCreator.GetObject()), Throws.TypeOf<ValidationException>());
}
[Test]
public void PostIdIsNullOrEmptyTest()
{
var worker = CreateDataModel(Guid.NewGuid().ToString(), "fio", null, DateTime.Now.AddYears(-18), DateTime.Now, false);
Assert.That(() => worker.Validate(), Throws.TypeOf<ValidationException>());
Assert.That(() => worker.Validate(StringLocalizerMockCreator.GetObject()), Throws.TypeOf<ValidationException>());
worker = CreateDataModel(Guid.NewGuid().ToString(), "fio", string.Empty, DateTime.Now.AddYears(-18), DateTime.Now, false);
Assert.That(() => worker.Validate(), Throws.TypeOf<ValidationException>());
Assert.That(() => worker.Validate(StringLocalizerMockCreator.GetObject()), Throws.TypeOf<ValidationException>());
}
[Test]
public void PostIdIsNotGuidTest()
{
var worker = CreateDataModel(Guid.NewGuid().ToString(), "fio", "postId", DateTime.Now.AddYears(-18), DateTime.Now, false);
Assert.That(() => worker.Validate(), Throws.TypeOf<ValidationException>());
Assert.That(() => worker.Validate(StringLocalizerMockCreator.GetObject()), Throws.TypeOf<ValidationException>());
}
[Test]
public void BirthDateIsNotCorrectTest()
{
var worker = CreateDataModel(Guid.NewGuid().ToString(), "fio", Guid.NewGuid().ToString(), DateTime.Now.AddYears(-16).AddDays(1), DateTime.Now, false);
Assert.That(() => worker.Validate(), Throws.TypeOf<ValidationException>());
Assert.That(() => worker.Validate(StringLocalizerMockCreator.GetObject()), Throws.TypeOf<ValidationException>());
}
[Test]
public void BirthDateAndEmploymentDateIsNotCorrectTest()
{
var worker = CreateDataModel(Guid.NewGuid().ToString(), "fio", Guid.NewGuid().ToString(), DateTime.Now.AddYears(-18), DateTime.Now.AddYears(-18).AddDays(-1), false);
Assert.That(() => worker.Validate(), Throws.TypeOf<ValidationException>());
Assert.That(() => worker.Validate(StringLocalizerMockCreator.GetObject()), Throws.TypeOf<ValidationException>());
worker = CreateDataModel(Guid.NewGuid().ToString(), "fio", Guid.NewGuid().ToString(), DateTime.Now.AddYears(-18), DateTime.Now.AddYears(-16), false);
Assert.That(() => worker.Validate(), Throws.TypeOf<ValidationException>());
Assert.That(() => worker.Validate(StringLocalizerMockCreator.GetObject()), Throws.TypeOf<ValidationException>());
}
[Test]
@@ -81,14 +82,14 @@ internal class WorkerDataModelTests
var employmentDate = DateTime.Now;
var isDelete = false;
var worker = CreateDataModel(workerId, fio, postId, birthDate, employmentDate, isDelete);
Assert.That(() => worker.Validate(), Throws.Nothing);
Assert.That(() => worker.Validate(StringLocalizerMockCreator.GetObject()), Throws.Nothing);
Assert.Multiple(() =>
{
Assert.That(worker.Id, Is.EqualTo(workerId));
Assert.That(worker.FIO, Is.EqualTo(fio));
Assert.That(worker.PostId, Is.EqualTo(postId));
Assert.That(worker.BirthDate, Is.EqualTo(birthDate));
Assert.That(worker.EmploymentDate, Is.EqualTo(employmentDate));
Assert.That(worker.BirthDate, Is.EqualTo(birthDate.ToUniversalTime()));
Assert.That(worker.EmploymentDate, Is.EqualTo(employmentDate.ToUniversalTime()));
Assert.That(worker.IsDeleted, Is.EqualTo(isDelete));
});
}

View File

@@ -0,0 +1,20 @@
using AndDietCokeContracts.Resources;
using Microsoft.Extensions.Localization;
using Moq;
namespace AndDietCokeTests.Infrastructure;
internal static class StringLocalizerMockCreator
{
private static Mock<IStringLocalizer<Messages>>? _mockObject = null;
public static IStringLocalizer<Messages> GetObject()
{
if (_mockObject is null)
{
_mockObject = new Mock<IStringLocalizer<Messages>>();
_mockObject.Setup(_ => _[It.IsAny<string>()]).Returns(new LocalizedString("name", "value"));
}
return _mockObject!.Object;
}
}

View File

@@ -0,0 +1,314 @@
using AndDietCokeContracts.BindingModels;
using AndDietCokeContracts.Enums;
using AndDietCokeContracts.Infrastrusture.PostConfiguration;
using AndDietCokeDatabase;
using AndDietCokeTests.Infrastructure;
using Microsoft.AspNetCore.Mvc.Testing;
using Microsoft.AspNetCore.TestHost;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json.Linq;
using Serilog;
using System.Net;
using System.Text;
using System.Text.Json;
namespace AndDietCokeTests.LocalizationTests
{
internal abstract class BaseLocalizationControllerTest
{
protected abstract string GetLocale();
private WebApplicationFactory<Program> _webApplication;
protected HttpClient HttpClient { get; private set; }
protected static AndDietCokeDbContext AndDietCokeDbContext { get; private set; }
protected static readonly JsonSerializerOptions JsonSerializerOptions = new() { PropertyNameCaseInsensitive = true };
private static string _workerId;
private static string _dishId;
private static string _postId;
private static string _buyerId;
[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}");
HttpClient.DefaultRequestHeaders.Add("Accept-Language", GetLocale());
AndDietCokeDbContext = _webApplication.Services.GetRequiredService<AndDietCokeDbContext>();
AndDietCokeDbContext.Database.EnsureDeleted();
AndDietCokeDbContext.Database.EnsureCreated();
}
[SetUp]
public void SetUp()
{
_workerId = AndDietCokeDbContext.InsertWorkerToDatabaseAndReturn(fio: "Worker").Id;
_dishId = AndDietCokeDbContext.InsertDishToDatabaseAndReturn(dishName: "Dish1").Id;
_postId = AndDietCokeDbContext.InsertPostToDatabaseAndReturn(postName: "Post").PostId;
_buyerId = AndDietCokeDbContext.InsertBuyerToDatabaseAndReturn(fio:"Ivanov Ivan Ivan",phoneNumber: "+7-777-777-77-70").Id;
}
[TearDown]
public void TearDown()
{
AndDietCokeDbContext.RemoveSalariesFromDatabase();
AndDietCokeDbContext.RemoveSalesFromDatabase();
AndDietCokeDbContext.RemoveWorkersFromDatabase();
AndDietCokeDbContext.RemovePostsFromDatabase();
AndDietCokeDbContext.RemoveBuyersFromDatabase();
AndDietCokeDbContext.RemoveDishesFromDatabase();
}
[OneTimeTearDown]
public void OneTimeTearDown()
{
AndDietCokeDbContext?.Database.EnsureDeleted();
AndDietCokeDbContext?.Dispose();
HttpClient?.Dispose();
_webApplication?.Dispose();
}
[Test]
public async Task LoadDishes_WhenHaveRecords_ShouldSuccess()
{
// Arrange
var dish = AndDietCokeDbContext.InsertDishToDatabaseAndReturn(Guid.NewGuid().ToString(), dishName:"name1");
var dish2 = AndDietCokeDbContext.InsertDishToDatabaseAndReturn(Guid.NewGuid().ToString(), dishName: "name2");
AndDietCokeDbContext.InsertDishHistoryToDatabaseAndReturn(dish.Id, 100, DateTime.UtcNow.AddDays(-5));
AndDietCokeDbContext.InsertDishHistoryToDatabaseAndReturn(dish.Id, 200, DateTime.UtcNow.AddDays(-10));
AndDietCokeDbContext.InsertDishHistoryToDatabaseAndReturn(dish2.Id, 300, DateTime.UtcNow);
// Act
var result = await HttpClient.GetAsync("/api/Report/LoadDishes");
await AssertStreamAsync(result, $"file-{GetLocale()}.docx");
}
[Test]
public async Task LoadSales_WhenHaveRecords_ShouldSucces()
{
// Arrange
var date = DateTime.UtcNow.AddMinutes(-1);
var worker = AndDietCokeDbContext.InsertWorkerToDatabaseAndReturn(fio: "Работник 1");
var worker2 = AndDietCokeDbContext.InsertWorkerToDatabaseAndReturn(fio: "Работник 2");
var dish = AndDietCokeDbContext.InsertDishToDatabaseAndReturn();
var dish2 = AndDietCokeDbContext.InsertDishToDatabaseAndReturn(dishName: "CustomNameOfDish");
var sale = AndDietCokeDbContext.InsertSaleToDatabaseAndReturn( worker.Id, buyerId: _buyerId, dishes: [(dish.Id, 10, 1.5), (dish2.Id, 8, 1.7)]);
var sale2 = AndDietCokeDbContext.InsertSaleToDatabaseAndReturn(worker2.Id, buyerId: _buyerId, dishes: [(dish.Id, 5, 2)]);
// Act
var result = await HttpClient.GetAsync($"/api/Report/LoadSales?fromDate={date:MM/dd/yyyy HH:mm:ss}&toDate={date.AddDays(1):MM/dd/yyyy HH:mm:ss}");
await AssertStreamAsync(result, $"file-{GetLocale()}.xlsx");
}
[Test]
public async Task LoadSalary_WhenHaveRecords_ShouldSuccess_Test()
{
//Arrange
var post = AndDietCokeDbContext.InsertPostToDatabaseAndReturn();
var worker1 = AndDietCokeDbContext.InsertWorkerToDatabaseAndReturn(fio: "fio 2", postId: post.PostId).AddPost(post);
var worker2 = AndDietCokeDbContext.InsertWorkerToDatabaseAndReturn(fio: "fio 2", postId: post.PostId).AddPost(post);
AndDietCokeDbContext.InsertSalaryToDatabaseAndReturn(worker1.Id, workerSalary: 100, salaryDate: DateTime.UtcNow.AddDays(-10));
AndDietCokeDbContext.InsertSalaryToDatabaseAndReturn(worker1.Id, workerSalary: 1000, salaryDate: DateTime.UtcNow.AddDays(-5));
AndDietCokeDbContext.InsertSalaryToDatabaseAndReturn(worker1.Id, workerSalary: 200, salaryDate: DateTime.UtcNow.AddDays(5));
AndDietCokeDbContext.InsertSalaryToDatabaseAndReturn(worker2.Id, workerSalary: 500, salaryDate: DateTime.UtcNow.AddDays(-5));
AndDietCokeDbContext.InsertSalaryToDatabaseAndReturn(worker2.Id, workerSalary: 300, salaryDate: DateTime.UtcNow.AddDays(-3));
//Act
var response = await HttpClient.GetAsync($"/api/report/loadsalary?fromDate={DateTime.UtcNow.AddDays(-7):MM/dd/yyyy HH:mm:ss}&toDate={DateTime.UtcNow.AddDays(-1):MM/dd/yyyy HH:mm:ss}");
//Assert
await AssertStreamAsync(response, $"file-{GetLocale()}.pdf");
}
private static async Task AssertStreamAsync(HttpResponseMessage response, string fileNameForSave = "")
{
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
using var data = await response.Content.ReadAsStreamAsync();
Assert.That(data, Is.Not.Null);
Assert.That(data.Length, Is.GreaterThan(0));
await SaveStreamAsync(data, fileNameForSave);
}
private static async Task SaveStreamAsync(Stream stream, string fileName)
{
if (string.IsNullOrEmpty(fileName))
{
return;
}
var path = Path.Combine(Directory.GetCurrentDirectory(), fileName);
if (File.Exists(path))
{
File.Delete(path);
}
stream.Position = 0;
using var fileStream = new FileStream(path, FileMode.OpenOrCreate);
await stream.CopyToAsync(fileStream);
}
protected abstract string MessageElementNotFound();
[TestCase("buyers")]
[TestCase("posts")]
[TestCase("dishes/getrecord")]
[TestCase("sales/getrecord")]
[TestCase("workers/getrecord")]
public async Task Api_GetElement_NotFound_Test(string path)
{
var currentLocale = GetLocale();
//Act
var response = await HttpClient.GetAsync($"/api/{path}/{Guid.NewGuid()}");
//Assert
Assert.That(JToken.Parse(await response.Content.ReadAsStringAsync()).ToString(), Does.StartWith(MessageElementNotFound()));
}
[TestCase("buyers")]
[TestCase("posts")]
[TestCase("dishes/delete")]
[TestCase("sales/cancel")]
[TestCase("workers/delete")]
public async Task Api_DeleteElement_NotFound_Test(string path)
{
var currentLocale = GetLocale();
//Act
var response = await HttpClient.DeleteAsync($"/api/{path}/{Guid.NewGuid()}");
//Assert
Assert.That(JToken.Parse(await response.Content.ReadAsStringAsync()).ToString(), Does.StartWith(MessageElementNotFound()));
}
private static IEnumerable<TestCaseData> TestDataElementExists()
{
yield return new TestCaseData(() => {
var model = CreateCustomerBindingModel();
AndDietCokeDbContext.InsertBuyerToDatabaseAndReturn(model.Id);
return model;
}, "buyers");
yield return new TestCaseData(() => {
var model = CreatePostModel();
AndDietCokeDbContext.InsertPostToDatabaseAndReturn(model.Id);
return model;
}, "posts");
yield return new TestCaseData(() => {
var model = CreateDishModel();
AndDietCokeDbContext.InsertDishToDatabaseAndReturn(model.Id);
return model;
}, "dishes/register");
yield return new TestCaseData(() => {
var model = CreateEmployeeModel(_postId);
AndDietCokeDbContext.InsertWorkerToDatabaseAndReturn(model.Id, postId: model.PostId);
return model;
}, "workers/register");
}
protected abstract string MessageElementExists();
[TestCaseSource(nameof(TestDataElementExists))]
public async Task Api_Post_WhenHaveRecordWithSameId_ShouldBadRequest_Test(Func<object> createModel, string path)
{
//Arrange
var model = createModel();
var currentLocale = GetLocale();
//Act
var response = await HttpClient.PostAsync($"/api/{path}", MakeContent(model));
var result = await response.Content.ReadAsStringAsync();
//Assert
Assert.That(JToken.Parse(await response.Content.ReadAsStringAsync()).ToString(), Does.Contain(MessageElementExists()));
}
private static IEnumerable<TestCaseData> TestDataElementWrongIds()
{
yield return new TestCaseData(() => {
var model = CreateCustomerBindingModel();
model.Id = "notaid";
return model;
}, "buyers");
yield return new TestCaseData(() => {
var model = CreatePostModel();
model.Id = "notaid";
return model;
}, "posts");
yield return new TestCaseData(() => {
var model = CreateDishModel();
model.Id = "notaid";
return model;
}, "dishes/changeinfo");
yield return new TestCaseData(() => {
var model = CreateEmployeeModel(_postId);
model.Id = "notaid";
return model;
}, "workers/changeinfo");
}
protected abstract string MessageElementWrongId();
[TestCaseSource(nameof(TestDataElementWrongIds))]
public async Task Api_Put_WhenWrongData_ShouldBadRequest(Func<object> createModel, string path)
{
//Arrange
var model = createModel();
var currentLocale = GetLocale();
//Act
var response = await HttpClient.PutAsync($"/api/{path}", MakeContent(model));
var result = await response.Content.ReadAsStringAsync();
//Assert
Assert.That(JToken.Parse(await response.Content.ReadAsStringAsync()).ToString(), Does.StartWith(MessageElementWrongId()));
}
private static StringContent MakeContent(object model) =>
new(JsonSerializer.Serialize(model), Encoding.UTF8, "application/json");
private static BuyerBindingModel CreateCustomerBindingModel(string? id = null, string fio = "Ivan Ivan", string phoneNumber = "+7-777-777-77-77", double discountSize = 10) =>
new()
{
Id = id ?? Guid.NewGuid().ToString(),
FIO = fio,
PhoneNumber = phoneNumber,
DiscountSize = discountSize
};
private static PostBindingModel CreatePostModel(string? postId = null, string postName = "name", PostType postType = PostType.Chef, string? configuration = null)
=> new()
{
Id = postId ?? Guid.NewGuid().ToString(),
PostName = postName,
PostType = postType.ToString(),
ConfigurationJson = configuration ?? JsonSerializer.Serialize(new PostConfiguration() { Rate = 10 })
};
private static DishBindingModel CreateDishModel(string? id = null, string name = "name", DishType dishType = DishType.Base, double price = 1)
=> new()
{
Id = id ?? Guid.NewGuid().ToString(),
DishName = name,
DishType =(int) dishType,
Price = price
};
private static WorkerBindingModel CreateEmployeeModel(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
};
}
}
}

View File

@@ -0,0 +1,13 @@
namespace AndDietCokeTests.LocalizationTests;
[TestFixture]
internal class DefaultTests : BaseLocalizationControllerTest
{
protected override string GetLocale() => "bla-BLA";
protected override string MessageElementExists() => "Уже существует элемент со значением";
protected override string MessageElementNotFound() => "Не найден элемент по данным";
protected override string MessageElementWrongId() => "Переданы неверные данные:";
}

View File

@@ -0,0 +1,13 @@
namespace AndDietCokeTests.LocalizationTests;
[TestFixture]
internal class EnUSTests : BaseLocalizationControllerTest
{
protected override string GetLocale() => "en-US";
protected override string MessageElementExists() => "already exists";
protected override string MessageElementNotFound() => "No element found for";
protected override string MessageElementWrongId() => "Invalid data submitted";
}

View File

@@ -0,0 +1,13 @@
namespace AndDietCokeTests.LocalizationTests;
[TestFixture]
internal class EsESTests : BaseLocalizationControllerTest
{
protected override string GetLocale() => "es-ES";
protected override string MessageElementExists() => "Ya existe un elemento con el ";
protected override string MessageElementNotFound() => "No se encontró el elemento con los datos:";
protected override string MessageElementWrongId() => "Datos inválidos proporcionados:";
}

View File

@@ -0,0 +1,13 @@
namespace AndDietCokeTests.LocalizationTests;
[TestFixture]
internal class RuRUTests : BaseLocalizationControllerTest
{
protected override string GetLocale() => "ru-RU";
protected override string MessageElementExists() => "Уже существует элемент со значением";
protected override string MessageElementNotFound() => "Не найден элемент по данным";
protected override string MessageElementWrongId() => "Переданы неверные данные:";
}

View File

@@ -18,7 +18,7 @@ internal class BuyerStorageContractTests : BaseStorageContractTest
[SetUp]
public void SetUp()
{
_buyerStorageContract = new BuyerStorageContract(AndDietCokeDbContext);
_buyerStorageContract = new BuyerStorageContract(AndDietCokeDbContext, StringLocalizerMockCreator.GetObject());
}
[TearDown]

View File

@@ -23,7 +23,7 @@ internal class DishStorageContractTests : BaseStorageContractTest
[SetUp]
public void SetUp()
{
_dishStorageContract = new DishStorageContract(AndDietCokeDbContext);
_dishStorageContract = new DishStorageContract(AndDietCokeDbContext, StringLocalizerMockCreator.GetObject());
}
[TearDown]

View File

@@ -24,7 +24,7 @@ internal class PostStorageContractTests : BaseStorageContractTest
[SetUp]
public void SetUp()
{
_postStorageContract = new PostStorageContract(AndDietCokeDbContext);
_postStorageContract = new PostStorageContract(AndDietCokeDbContext, StringLocalizerMockCreator.GetObject());
}
[TearDown]

View File

@@ -9,6 +9,7 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using AndDietCokeTests.Infrastructure;
namespace AndDietCokeTests.StoragesContracts;
@@ -21,7 +22,7 @@ internal class SalaryStorageContractTests : BaseStorageContractTest
[SetUp]
public void SetUp()
{
_salaryStorageContract = new SalaryStorageContract(AndDietCokeDbContext);
_salaryStorageContract = new SalaryStorageContract(AndDietCokeDbContext, StringLocalizerMockCreator.GetObject());
_worker = InsertWorkerToDatabaseAndReturn();
}

View File

@@ -21,7 +21,7 @@ internal class SaleStorageContractTests : BaseStorageContractTest
[SetUp]
public void SetUp()
{
_saletStorageContract = new SaleStorageContract(AndDietCokeDbContext);
_saletStorageContract = new SaleStorageContract(AndDietCokeDbContext, StringLocalizerMockCreator.GetObject());
_buyer = AndDietCokeDbContext.InsertBuyerToDatabaseAndReturn();
_worker = AndDietCokeDbContext.InsertWorkerToDatabaseAndReturn();
_dish = AndDietCokeDbContext.InsertDishToDatabaseAndReturn();

View File

@@ -23,7 +23,7 @@ internal class WorkerStorageContractTests : BaseStorageContractTest
[SetUp]
public void SetUp()
{
_workerStorageContract = new WorkerStorageContract(AndDietCokeDbContext);
_workerStorageContract = new WorkerStorageContract(AndDietCokeDbContext, StringLocalizerMockCreator.GetObject());
}
[TearDown]

View File

@@ -30,7 +30,7 @@ internal class SalaryControllerTests : BaseWebApiControllerTest
AndDietCokeDbContext.InsertSalaryToDatabaseAndReturn(worker.Id);
AndDietCokeDbContext.InsertSalaryToDatabaseAndReturn(worker.Id);
//Act
var response = await HttpClient.GetAsync($"/api/salary/getrecords?fromDate={DateTime.UtcNow.AddDays(-10):MM/dd/yyyy HH:mm:ss}&toDate={DateTime.UtcNow.AddDays(10):MM/dd/yyyy HH:mm:ss}");
var response = await HttpClient.GetAsync($"/api/salary/getrecords?fromDate={DateTime.Now.AddDays(-10):MM/dd/yyyy HH:mm:ss}&toDate={DateTime.Now.AddDays(10):MM/dd/yyyy HH:mm:ss}");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
var data = await GetModelFromResponseAsync<List<SalaryViewModel>>(response);
@@ -45,7 +45,7 @@ internal class SalaryControllerTests : BaseWebApiControllerTest
public async Task GetList_WhenNoRecords_ShouldSuccess_Test()
{
//Act
var response = await HttpClient.GetAsync($"/api/salary/getrecords?fromDate={DateTime.UtcNow.AddDays(-1):MM/dd/yyyy HH:mm:ss}&toDate={DateTime.UtcNow.AddDays(1):MM/dd/yyyy HH:mm:ss}");
var response = await HttpClient.GetAsync($"/api/salary/getrecords?fromDate={DateTime.Now.AddDays(-1):MM/dd/yyyy HH:mm:ss}&toDate={DateTime.Now.AddDays(1):MM/dd/yyyy HH:mm:ss}");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
var data = await GetModelFromResponseAsync<List<SalaryViewModel>>(response);
@@ -66,7 +66,7 @@ internal class SalaryControllerTests : BaseWebApiControllerTest
AndDietCokeDbContext.InsertSalaryToDatabaseAndReturn(worker.Id, salaryDate: DateTime.UtcNow.AddDays(1).AddMinutes(-5));
AndDietCokeDbContext.InsertSalaryToDatabaseAndReturn(worker.Id, salaryDate: DateTime.UtcNow.AddDays(-2));
//Act
var response = await HttpClient.GetAsync($"/api/salary/getrecords?fromDate={DateTime.UtcNow.AddDays(-1):MM/dd/yyyy HH:mm:ss}&toDate={DateTime.UtcNow.AddDays(1):MM/dd/yyyy HH:mm:ss}");
var response = await HttpClient.GetAsync($"/api/salary/getrecords?fromDate={DateTime.Now.AddDays(-1):MM/dd/yyyy HH:mm:ss}&toDate={DateTime.Now.AddDays(1):MM/dd/yyyy HH:mm:ss}");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
var data = await GetModelFromResponseAsync<List<SalaryViewModel>>(response);
@@ -81,7 +81,7 @@ internal class SalaryControllerTests : BaseWebApiControllerTest
public async Task GetList_WhenDatesAreIncorrect_ShouldBadRequest_Test()
{
//Act
var response = await HttpClient.GetAsync($"/api/salary/getrecords?fromDate={DateTime.UtcNow.AddDays(1):MM/dd/yyyy HH:mm:ss}&toDate={DateTime.UtcNow.AddDays(-1):MM/dd/yyyy HH:mm:ss}");
var response = await HttpClient.GetAsync($"/api/salary/getrecords?fromDate={DateTime.Now.AddDays(1):MM/dd/yyyy HH:mm:ss}&toDate={DateTime.Now.AddDays(-1):MM/dd/yyyy HH:mm:ss}");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest));
}
@@ -98,7 +98,7 @@ internal class SalaryControllerTests : BaseWebApiControllerTest
AndDietCokeDbContext.InsertSalaryToDatabaseAndReturn(worker2.Id);
//Act
var response = await HttpClient.GetAsync($"/api/salary/getemployeerecords?fromDate={DateTime.UtcNow.AddDays(-1):MM/dd/yyyy HH:mm:ss}&toDate={DateTime.UtcNow.AddDays(1):MM/dd/yyyy HH:mm:ss}&id={worker1.Id}");
var response = await HttpClient.GetAsync($"/api/salary/getemployeerecords?fromDate={DateTime.Now.AddDays(-1):MM/dd/yyyy HH:mm:ss}&toDate={DateTime.Now.AddDays(1):MM/dd/yyyy HH:mm:ss}&id={worker1.Id}");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
var data = await GetModelFromResponseAsync<List<SalaryViewModel>>(response);
@@ -123,7 +123,7 @@ internal class SalaryControllerTests : BaseWebApiControllerTest
AndDietCokeDbContext.InsertSalaryToDatabaseAndReturn(worker2.Id, salaryDate: DateTime.UtcNow.AddDays(1).AddMinutes(-5));
AndDietCokeDbContext.InsertSalaryToDatabaseAndReturn(worker1.Id, salaryDate: DateTime.UtcNow.AddDays(-2));
//Act
var response = await HttpClient.GetAsync($"/api/salary/getemployeerecords?fromDate={DateTime.UtcNow.AddDays(-1):MM/dd/yyyy HH:mm:ss}&toDate={DateTime.UtcNow.AddDays(1):MM/dd/yyyy HH:mm:ss}&id={worker1.Id}");
var response = await HttpClient.GetAsync($"/api/salary/getemployeerecords?fromDate={DateTime.Now.AddDays(-1):MM/dd/yyyy HH:mm:ss}&toDate={DateTime.Now.AddDays(1):MM/dd/yyyy HH:mm:ss}&id={worker1.Id}");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
var data = await GetModelFromResponseAsync<List<SalaryViewModel>>(response);
@@ -141,7 +141,7 @@ internal class SalaryControllerTests : BaseWebApiControllerTest
//Arrange
var worker = AndDietCokeDbContext.InsertWorkerToDatabaseAndReturn();
//Act
var response = await HttpClient.GetAsync($"/api/salary/getemployeerecords?fromDate={DateTime.UtcNow.AddDays(1):MM/dd/yyyy HH:mm:ss}&toDate={DateTime.UtcNow.AddDays(-1):MM/dd/yyyy HH:mm:ss}&id={worker.Id}");
var response = await HttpClient.GetAsync($"/api/salary/getemployeerecords?fromDate={DateTime.Now.AddDays(1):MM/dd/yyyy HH:mm:ss}&toDate={DateTime.Now.AddDays(-1):MM/dd/yyyy HH:mm:ss}&id={worker.Id}");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest));
}
@@ -150,7 +150,7 @@ internal class SalaryControllerTests : BaseWebApiControllerTest
public async Task GetList_ByWorker_WhenIdIsNotGuid_ShouldBadRequest_Test()
{
//Act
var response = await HttpClient.GetAsync($"/api/salary/getemployeerecords?fromDate={DateTime.UtcNow.AddDays(-1):MM/dd/yyyy HH:mm:ss}&toDate={DateTime.UtcNow.AddDays(1):MM/dd/yyyy HH:mm:ss}&id=id");
var response = await HttpClient.GetAsync($"/api/salary/getemployeerecords?fromDate={DateTime.Now.AddDays(-1):MM/dd/yyyy HH:mm:ss}&toDate={DateTime.Now.AddDays(1):MM/dd/yyyy HH:mm:ss}&id=id");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest));
}
@@ -164,7 +164,7 @@ internal class SalaryControllerTests : BaseWebApiControllerTest
var sale = AndDietCokeDbContext.InsertSaleToDatabaseAndReturn(worker.Id);
//Act
var response = await HttpClient.PostAsync($"/api/salary/calculate?date={DateTime.UtcNow:MM/dd/yyyy}", null);
var response = await HttpClient.PostAsync($"/api/salary/calculate?date={DateTime.Now:MM/dd/yyyy}", null);
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.NoContent));
var salaries = AndDietCokeDbContext.GetSalariesFromDatabaseByWorkerId(worker.Id);
@@ -172,7 +172,7 @@ internal class SalaryControllerTests : BaseWebApiControllerTest
{
Assert.That(salaries, Has.Length.EqualTo(1));
Assert.That(salaries.First().WorkerSalary, Is.EqualTo(1000));
Assert.That(salaries.First().SalaryDate.Month, Is.EqualTo(DateTime.UtcNow.Month));
Assert.That(salaries.First().SalaryDate.ToUniversalTime().Month, Is.EqualTo(DateTime.UtcNow.Month));
});
}
@@ -180,7 +180,7 @@ internal class SalaryControllerTests : BaseWebApiControllerTest
public async Task Calculate_WhenAllWorkersWithoutSales_ShouldSuccess_Test()
{
//Act
var response = await HttpClient.PostAsync($"/api/salary/calculate?date={DateTime.UtcNow:MM/dd/yyyy}", null);
var response = await HttpClient.PostAsync($"/api/salary/calculate?date={DateTime.Now:MM/dd/yyyy}", null);
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.NoContent));
var salaries = AndDietCokeDbContext.Salaries.ToArray();
@@ -196,7 +196,7 @@ internal class SalaryControllerTests : BaseWebApiControllerTest
var worker2 = AndDietCokeDbContext.InsertWorkerToDatabaseAndReturn(fio: "fio 2", postId: post.PostId);
var sale = AndDietCokeDbContext.InsertSaleToDatabaseAndReturn(worker1.Id);
//Act
var response = await HttpClient.PostAsync($"/api/salary/calculate?date={DateTime.UtcNow:MM/dd/yyyy}", null);
var response = await HttpClient.PostAsync($"/api/salary/calculate?date={DateTime.Now:MM/dd/yyyy}", null);
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.NoContent));
var salary1 = AndDietCokeDbContext.GetSalariesFromDatabaseByWorkerId(worker1.Id).First().WorkerSalary;

View File

@@ -160,7 +160,7 @@ internal class WorkerControllerTests : BaseWebApiControllerTest
AndDietCokeDbContext.InsertWorkerToDatabaseAndReturn(fio: "fio 3", birthDate: DateTime.UtcNow.AddYears(-20), isDeleted: true);
AndDietCokeDbContext.InsertWorkerToDatabaseAndReturn(fio: "fio 4", birthDate: DateTime.UtcNow.AddYears(-19));
//Act
var response = await HttpClient.GetAsync($"/api/workers/getbirthdaterecords?fromDate={DateTime.UtcNow.AddYears(-21).AddMinutes(-1):MM/dd/yyyy HH:mm:ss}&toDate={DateTime.UtcNow.AddYears(-20).AddMinutes(1):MM/dd/yyyy HH:mm:ss}&includeDeleted=true");
var response = await HttpClient.GetAsync($"/api/workers/getbirthdaterecords?fromDate={DateTime.Now.AddYears(-21).AddMinutes(-1):MM/dd/yyyy HH:mm:ss}&toDate={DateTime.Now.AddYears(-20).AddMinutes(1):MM/dd/yyyy HH:mm:ss}&includeDeleted=true");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
var data = await GetModelFromResponseAsync<List<WorkerViewModel>>(response);
@@ -175,7 +175,7 @@ internal class WorkerControllerTests : BaseWebApiControllerTest
public async Task GetList_ByBirthDate_WhenDateIsIncorrect_ShouldBadRequest_Test()
{
//Act
var response = await HttpClient.GetAsync($"/api/workers/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");
var response = await HttpClient.GetAsync($"/api/workers/getbirthdaterecords?fromDate={DateTime.Now.AddMinutes(1):MM/dd/yyyy HH:mm:ss}&toDate={DateTime.Now.AddMinutes(-1):MM/dd/yyyy HH:mm:ss}&includeDeleted=true");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest));
}
@@ -189,7 +189,7 @@ internal class WorkerControllerTests : BaseWebApiControllerTest
AndDietCokeDbContext.InsertWorkerToDatabaseAndReturn(fio: "fio 3", employmentDate: DateTime.UtcNow.AddDays(1), isDeleted: true);
AndDietCokeDbContext.InsertWorkerToDatabaseAndReturn(fio: "fio 4", employmentDate: DateTime.UtcNow.AddDays(2));
//Act
var response = await HttpClient.GetAsync($"/api/workers/getemploymentrecords?fromDate={DateTime.UtcNow.AddDays(-1).AddMinutes(-1):MM/dd/yyyy HH:mm:ss}&toDate={DateTime.UtcNow.AddDays(1).AddMinutes(1):MM/dd/yyyy HH:mm:ss}&includeDeleted=true");
var response = await HttpClient.GetAsync($"/api/workers/getemploymentrecords?fromDate={DateTime.Now.AddDays(-1).AddMinutes(-1):MM/dd/yyyy HH:mm:ss}&toDate={DateTime.Now.AddDays(1).AddMinutes(1):MM/dd/yyyy HH:mm:ss}&includeDeleted=true");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
var data = await GetModelFromResponseAsync<List<WorkerViewModel>>(response);
@@ -204,7 +204,7 @@ internal class WorkerControllerTests : BaseWebApiControllerTest
public async Task GetList_ByEmploymentDate_WhenDateIsIncorrect_ShouldBadRequest_Test()
{
//Act
var response = await HttpClient.GetAsync($"/api/workers/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");
var response = await HttpClient.GetAsync($"/api/workers/getemploymentrecords?fromDate={DateTime.Now.AddMinutes(1):MM/dd/yyyy HH:mm:ss}&toDate={DateTime.Now.AddMinutes(-1):MM/dd/yyyy HH:mm:ss}&includeDeleted=true");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest));
}
@@ -479,8 +479,8 @@ internal class WorkerControllerTests : BaseWebApiControllerTest
Assert.That(actual.PostId, Is.EqualTo(expected.PostId));
Assert.That(actual.PostName, Is.EqualTo(expected.Post!.PostName));
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.BirthDate.ToUniversalTime().ToString(), Is.EqualTo(expected.BirthDate.ToUniversalTime().ToString()));
Assert.That(actual.EmploymentDate.ToUniversalTime().ToString(), Is.EqualTo(expected.EmploymentDate.ToUniversalTime().ToString()));
Assert.That(actual.IsDeleted, Is.EqualTo(expected.IsDeleted));
});
}

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