Compare commits
11 Commits
Task_2_Bui
...
Task_3_Sto
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ef340be62a | ||
|
|
37affb0114 | ||
|
|
a325a6558c | ||
|
|
822291ea91 | ||
|
|
0dd30af08c | ||
|
|
8493b4e3c2 | ||
|
|
d9e9892505 | ||
|
|
1d1812acea | ||
|
|
6654a24aff | ||
|
|
edb377c4bb | ||
|
|
c28280efa3 |
13
TwoFromTheCasketContratcs/.idea/.idea.TwoFromTheCasketContratcs/.idea/.gitignore
generated
vendored
Normal file
13
TwoFromTheCasketContratcs/.idea/.idea.TwoFromTheCasketContratcs/.idea/.gitignore
generated
vendored
Normal file
@@ -0,0 +1,13 @@
|
||||
# Default ignored files
|
||||
/shelf/
|
||||
/workspace.xml
|
||||
# Rider ignored files
|
||||
/.idea.TwoFromTheCasketContratcs.iml
|
||||
/projectSettingsUpdater.xml
|
||||
/modules.xml
|
||||
/contentModel.xml
|
||||
# Editor-based HTTP Client requests
|
||||
/httpRequests/
|
||||
# Datasource local storage ignored files
|
||||
/dataSources/
|
||||
/dataSources.local.xml
|
||||
4
TwoFromTheCasketContratcs/.idea/.idea.TwoFromTheCasketContratcs/.idea/encodings.xml
generated
Normal file
4
TwoFromTheCasketContratcs/.idea/.idea.TwoFromTheCasketContratcs/.idea/encodings.xml
generated
Normal file
@@ -0,0 +1,4 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="Encoding" addBOMForNewFiles="with BOM under Windows, with no BOM otherwise" />
|
||||
</project>
|
||||
8
TwoFromTheCasketContratcs/.idea/.idea.TwoFromTheCasketContratcs/.idea/indexLayout.xml
generated
Normal file
8
TwoFromTheCasketContratcs/.idea/.idea.TwoFromTheCasketContratcs/.idea/indexLayout.xml
generated
Normal file
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="UserContentModel">
|
||||
<attachedFolders />
|
||||
<explicitIncludes />
|
||||
<explicitExcludes />
|
||||
</component>
|
||||
</project>
|
||||
6
TwoFromTheCasketContratcs/.idea/.idea.TwoFromTheCasketContratcs/.idea/vcs.xml
generated
Normal file
6
TwoFromTheCasketContratcs/.idea/.idea.TwoFromTheCasketContratcs/.idea/vcs.xml
generated
Normal file
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="$PROJECT_DIR$/.." vcs="Git" />
|
||||
</component>
|
||||
</project>
|
||||
@@ -12,13 +12,14 @@ namespace TwoFromTheCasketBuisnessLogic.Implementations
|
||||
{
|
||||
internal class SalaryBusinessLogicContract(ISalaryStorageContract
|
||||
salaryStorageContract, IPostStorageContract
|
||||
postStorageContract, IMasterStorageContract _masterStorageContract, ILogger
|
||||
logger) : ISalaryBuisnessLogicContract
|
||||
postStorageContract, IMasterStorageContract masterStorageContract, ILogger
|
||||
logger, IOrderStorageContract orderStorageContract) : ISalaryBuisnessLogicContract
|
||||
{
|
||||
private readonly ILogger _logger;
|
||||
private readonly ISalaryStorageContract _salaryStorageContract;
|
||||
private readonly IPostStorageContract _postStorageContract;
|
||||
private readonly IMasterStorageContract _masterStorageContract;
|
||||
private readonly ILogger _logger = logger;
|
||||
private readonly ISalaryStorageContract _salaryStorageContract = salaryStorageContract;
|
||||
private readonly IPostStorageContract _postStorageContract = postStorageContract;
|
||||
private readonly IMasterStorageContract _masterStorageContract = masterStorageContract;
|
||||
private readonly IOrderStorageContract _orderStorageContract = orderStorageContract;
|
||||
|
||||
|
||||
public List<SalaryDataModel> GetAllSalariesByPeriod(DateTime fromDate, DateTime toDate)
|
||||
@@ -56,7 +57,7 @@ logger) : ISalaryBuisnessLogicContract
|
||||
|
||||
public void CalculateSalaryByMonth(DateTime date)
|
||||
{
|
||||
//_logger.LogInformation("CalculateSalaryByMonth: {date}", date);
|
||||
_logger.LogInformation("CalculateSalaryByMonth: {date}", date);
|
||||
|
||||
var startDate = new DateTime(date.Year, date.Month, 1);
|
||||
var finishDate = new DateTime(date.Year, date.Month, DateTime.DaysInMonth(date.Year, date.Month));
|
||||
@@ -67,6 +68,8 @@ logger) : ISalaryBuisnessLogicContract
|
||||
{
|
||||
master.Validate(); // Проверяем валидность данных
|
||||
|
||||
var orders = _orderStorageContract.GetList()?.Count(x => x.Id.IsGuid()) ??
|
||||
throw new NullListException();
|
||||
var post = _postStorageContract.GetElementById(master.PostId) ?? throw new NullListException();
|
||||
|
||||
var baseSalary = post.Salary; // Основная зарплата
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="9.0.3" />
|
||||
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="9.0.4" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
||||
@@ -9,6 +9,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TwoFromTheCasketTest", "Two
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TwoFromTheCasketBuisnessLogic", "TwoFromTheCasketBuisnessLogic\TwoFromTheCasketBuisnessLogic.csproj", "{371435E4-6D04-4302-86C8-23F063FBE57A}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TwoFromTheCasketDatabase", "TwoFromTheCasketDatabase\TwoFromTheCasketDatabase.csproj", "{C77C86D0-B620-4737-93D9-1A5A69BD7128}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
@@ -27,6 +29,10 @@ Global
|
||||
{371435E4-6D04-4302-86C8-23F063FBE57A}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{371435E4-6D04-4302-86C8-23F063FBE57A}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{371435E4-6D04-4302-86C8-23F063FBE57A}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{C77C86D0-B620-4737-93D9-1A5A69BD7128}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{C77C86D0-B620-4737-93D9-1A5A69BD7128}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{C77C86D0-B620-4737-93D9-1A5A69BD7128}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{C77C86D0-B620-4737-93D9-1A5A69BD7128}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
|
||||
@@ -11,11 +11,11 @@ using TwoFromTheCasketContratcs.Infrastructure;
|
||||
|
||||
namespace TwoFromTheCasketContratcs.DataModels;
|
||||
|
||||
public class OrderDataModel( string id, DateTime dataTime, StatusType status, RoomType roomType) : IValidation
|
||||
public class OrderDataModel( string id, DateTime data, StatusType status, RoomType roomType) : IValidation
|
||||
{
|
||||
public string Id { get; private set; } = id;
|
||||
|
||||
public DateTime Date { get; private set; } = dataTime;
|
||||
public DateTime Date { get; private set; } = data;
|
||||
|
||||
public StatusType Status { get; private set; } = status;
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@ using TwoFromTheCasketContratcs.Infrastructure;
|
||||
namespace TwoFromTheCasketContratcs.DataModels;
|
||||
|
||||
public class PostDataModel(string id, string postName, PostType
|
||||
postType, double salary) : IValidation
|
||||
postType, double salary, bool isActual, DateTime changeDate) : IValidation
|
||||
{
|
||||
public string Id { get; private set; } = id;
|
||||
|
||||
@@ -22,8 +22,12 @@ postType, double salary) : IValidation
|
||||
|
||||
public double Salary { get; private set; } = salary;
|
||||
|
||||
public bool IsActual { get; private set; } = isActual;
|
||||
|
||||
public void Validate()
|
||||
public DateTime ChangeDate { get; private set; } = changeDate;
|
||||
|
||||
|
||||
public void Validate()
|
||||
{
|
||||
if (Id.IsEmpty())
|
||||
throw new ValidationException("Field Id is empty");
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace TwoFromTheCasketContratcs.Exceptions;
|
||||
|
||||
public class ElementDeletedException : Exception
|
||||
{
|
||||
public ElementDeletedException(string id) : base($"Cannot modify a deleteditem(id: { id})") { }
|
||||
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace TwoFromTheCasketContratcs.Infrastructure;
|
||||
|
||||
public interface IConfigurationDatabase
|
||||
{
|
||||
string ConnectionString { get; }
|
||||
}
|
||||
@@ -9,7 +9,7 @@ namespace TwoFromTheCasketContratcs.StorageContracts;
|
||||
|
||||
public interface IPostStorageContract
|
||||
{
|
||||
List<PostDataModel> GetList();
|
||||
List<PostDataModel> GetList(bool onlyActual = true);
|
||||
|
||||
List<PostDataModel> GetPostWithHistory(string postId);
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@ namespace TwoFromTheCasketContratcs.StorageContracts;
|
||||
public interface ISalaryStorageContract
|
||||
{
|
||||
List<SalaryDataModel> GetList(DateTime startDate, DateTime endDate, string?
|
||||
workerId = null);
|
||||
masterId = null);
|
||||
|
||||
SalaryDataModel? GetElementByMasterId(string masterId);
|
||||
|
||||
@@ -19,7 +19,5 @@ workerId = null);
|
||||
|
||||
void AddElement(SalaryDataModel salaryDataModel);
|
||||
|
||||
void UpdElement(SalaryDataModel salaryDataModel);
|
||||
|
||||
void DelElement(string id);
|
||||
}
|
||||
|
||||
@@ -6,4 +6,8 @@
|
||||
<Nullable>enable</Nullable>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="9.0.4" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
||||
@@ -0,0 +1,164 @@
|
||||
using AutoMapper;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Npgsql;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Xml.Linq;
|
||||
using TwoFromTheCasketContratcs.DataModels;
|
||||
using TwoFromTheCasketContratcs.Exceptions;
|
||||
using TwoFromTheCasketContratcs.StorageContracts;
|
||||
using TwoFromTheCasketDatabase.Models;
|
||||
|
||||
namespace TwoFromTheCasketDatabase.Implementation;
|
||||
|
||||
internal class MasterStorageContract : IMasterStorageContract
|
||||
{
|
||||
private readonly TwoFromTheCasketDbContext _dbContext;
|
||||
|
||||
private readonly Mapper _mapper;
|
||||
public MasterStorageContract(TwoFromTheCasketDbContext twoFromTheCasketDbContext)
|
||||
{
|
||||
_dbContext = twoFromTheCasketDbContext;
|
||||
var config = new MapperConfiguration(cfg =>
|
||||
{
|
||||
cfg.AddMaps(typeof(Master));
|
||||
});
|
||||
_mapper = new Mapper(config);
|
||||
}
|
||||
|
||||
public List<MasterDataModel> GetList(bool onlyActive = true, string? postId = null, DateTime? fromBirthDate = null, DateTime? toBirthDate = null, DateTime? fromEmploymentDate = null, DateTime? toEmploymentDate = null)
|
||||
{
|
||||
try
|
||||
{
|
||||
var query = _dbContext.Masters.AsQueryable();
|
||||
if (onlyActive) query = query.Where(x => !x.IsDeleted);
|
||||
if (postId is not null) query = query.Where(x => x.PostId == postId);
|
||||
if (fromBirthDate is not null && toBirthDate is not null)
|
||||
query = query.Where(x => x.BirthDate >= fromBirthDate && x.BirthDate <= toBirthDate);
|
||||
if (fromEmploymentDate is not null && toEmploymentDate is not null)
|
||||
query = query.Where(x => x.EmploymentDate >= fromEmploymentDate
|
||||
&& x.EmploymentDate <= toEmploymentDate);
|
||||
return [.. query.Select(x => _mapper.Map<MasterDataModel>(x))];
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
_dbContext.ChangeTracker.Clear();
|
||||
throw new StorageException(ex);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public MasterDataModel? GetElementById(string id)
|
||||
{
|
||||
try
|
||||
{
|
||||
return _mapper.Map<MasterDataModel>(GetMasterById(id));
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_dbContext.ChangeTracker.Clear();
|
||||
throw new StorageException(ex);
|
||||
}
|
||||
}
|
||||
public MasterDataModel? GetElementByFIO(string name)
|
||||
{
|
||||
try
|
||||
{
|
||||
return _mapper.Map<MasterDataModel>(_dbContext.Masters.FirstOrDefault(x => x.FIO == name));
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_dbContext.ChangeTracker.Clear();
|
||||
throw new StorageException(ex);
|
||||
}
|
||||
}
|
||||
|
||||
public MasterDataModel? GetElementByPostId(string postId)
|
||||
{
|
||||
try
|
||||
{
|
||||
return _mapper.Map<MasterDataModel>(_dbContext.Masters.FirstOrDefault(x => x.PostId == postId));
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_dbContext.ChangeTracker.Clear();
|
||||
throw new StorageException(ex);
|
||||
}
|
||||
}
|
||||
public void AddElement(MasterDataModel masterDataModel)
|
||||
{
|
||||
try
|
||||
{
|
||||
_dbContext.Masters.Add(_mapper.Map<Master>(masterDataModel));
|
||||
_dbContext.SaveChanges();
|
||||
}
|
||||
catch(InvalidOperationException ex) when (ex.TargetSite?.Name == "ThrowIdentityConflict")
|
||||
{
|
||||
_dbContext.ChangeTracker.Clear();
|
||||
throw new ElementExistsException("Id", masterDataModel.Id);
|
||||
}
|
||||
catch (DbUpdateException ex) when (ex.InnerException is PostgresException { ConstraintName : "IX_Master_FIO" } )
|
||||
{
|
||||
_dbContext.ChangeTracker.Clear();
|
||||
throw new ElementExistsException("FIO", masterDataModel.FIO);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_dbContext.ChangeTracker.Clear();
|
||||
throw new StorageException(ex);
|
||||
}
|
||||
}
|
||||
public void UpdElement(MasterDataModel masterDataModel)
|
||||
{
|
||||
try
|
||||
{
|
||||
var element = GetMasterById(masterDataModel.Id) ?? throw new ElementNotFoundException(masterDataModel.Id);
|
||||
_dbContext.Masters.Update(_mapper.Map(masterDataModel,element));
|
||||
_dbContext.SaveChanges();
|
||||
}
|
||||
catch (ElementNotFoundException)
|
||||
{
|
||||
_dbContext.ChangeTracker.Clear();
|
||||
throw;
|
||||
}
|
||||
catch (DbUpdateException ex) when (ex.InnerException is PostgresException { ConstraintName: "IX_Master_FIO" })
|
||||
{
|
||||
_dbContext.ChangeTracker.Clear();
|
||||
throw new ElementExistsException("FIO", masterDataModel.FIO);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_dbContext.ChangeTracker.Clear();
|
||||
throw new StorageException(ex);
|
||||
}
|
||||
}
|
||||
|
||||
public void DelElement(string id)
|
||||
{
|
||||
try
|
||||
{
|
||||
var element = GetMasterById(id) ?? throw new ElementNotFoundException(id);
|
||||
element.IsDeleted = true;
|
||||
_dbContext.SaveChanges();
|
||||
}
|
||||
catch (ElementNotFoundException)
|
||||
{
|
||||
_dbContext.ChangeTracker.Clear();
|
||||
throw;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_dbContext.ChangeTracker.Clear();
|
||||
throw new StorageException(ex);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
private Master? GetMasterById(string id) => _dbContext.Masters.FirstOrDefault(x => x.Id == id && !x.IsDeleted);
|
||||
}
|
||||
@@ -0,0 +1,157 @@
|
||||
using AutoMapper;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Npgsql;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using TwoFromTheCasketContratcs.DataModels;
|
||||
using TwoFromTheCasketContratcs.Enums;
|
||||
using TwoFromTheCasketContratcs.Exceptions;
|
||||
using TwoFromTheCasketContratcs.StorageContracts;
|
||||
using TwoFromTheCasketDatabase.Models;
|
||||
using static System.Runtime.InteropServices.JavaScript.JSType;
|
||||
|
||||
namespace TwoFromTheCasketDatabase.Implementation;
|
||||
|
||||
internal class OrderStorageContract : IOrderStorageContract
|
||||
{
|
||||
private readonly TwoFromTheCasketDbContext _dbContext;
|
||||
|
||||
private readonly Mapper _mapper;
|
||||
public OrderStorageContract(TwoFromTheCasketDbContext twoFromTheCasketDbContext)
|
||||
{
|
||||
_dbContext = twoFromTheCasketDbContext;
|
||||
|
||||
var config = new MapperConfiguration(cfg =>
|
||||
{
|
||||
|
||||
cfg.CreateMap<Order, OrderDataModel>()
|
||||
.ConstructUsing(src => new OrderDataModel(
|
||||
src.Id.ToString(),
|
||||
src.Date,
|
||||
src.Status,
|
||||
src.RoomType));
|
||||
|
||||
|
||||
cfg.CreateMap<OrderDataModel, Order>()
|
||||
.ForMember(dest => dest.Id, opt => opt.MapFrom(src => Guid.Parse(src.Id)))
|
||||
.ForMember(dest => dest.Date, opt => opt.MapFrom(src => src.Date))
|
||||
.ForMember(dest => dest.Status, opt => opt.MapFrom(src => src.Status))
|
||||
.ForMember(dest => dest.RoomType, opt => opt.MapFrom(src => src.RoomType));
|
||||
|
||||
});
|
||||
|
||||
_mapper = new Mapper(config);
|
||||
}
|
||||
public List<OrderDataModel> GetList()
|
||||
{
|
||||
try
|
||||
{
|
||||
return [.. _dbContext.Orders.Select(x => _mapper.Map<OrderDataModel>(x))];
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_dbContext.ChangeTracker.Clear();
|
||||
throw new StorageException(ex);
|
||||
}
|
||||
}
|
||||
public OrderDataModel? GetElementById(string id)
|
||||
{
|
||||
try
|
||||
{
|
||||
return _mapper.Map<OrderDataModel>(GetOrderById(id));
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_dbContext.ChangeTracker.Clear();
|
||||
throw new StorageException(ex);
|
||||
}
|
||||
}
|
||||
public OrderDataModel? GetElementByDate(DateTime date)
|
||||
{
|
||||
try
|
||||
{
|
||||
return _mapper.Map<OrderDataModel>(_dbContext.Orders.FirstOrDefault(x => x.Date == date));
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_dbContext.ChangeTracker.Clear();
|
||||
throw new StorageException(ex);
|
||||
}
|
||||
}
|
||||
public OrderDataModel? GetElementByStatus(StatusType status)
|
||||
{
|
||||
try
|
||||
{
|
||||
return _mapper.Map<OrderDataModel>(_dbContext.Orders.FirstOrDefault(x => x.Status == status));
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_dbContext.ChangeTracker.Clear();
|
||||
throw new StorageException(ex);
|
||||
}
|
||||
}
|
||||
|
||||
public void AddElement(OrderDataModel orderDataModel)
|
||||
{
|
||||
try
|
||||
{
|
||||
_dbContext.Orders.Add(_mapper.Map<Order>(orderDataModel));
|
||||
_dbContext.SaveChanges();
|
||||
}
|
||||
catch (InvalidOperationException ex) when (ex.TargetSite?.Name == "ThrowIdentityConflict")
|
||||
{
|
||||
_dbContext.ChangeTracker.Clear();
|
||||
throw new ElementExistsException("Id", orderDataModel.Id);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_dbContext.ChangeTracker.Clear();
|
||||
throw new StorageException(ex);
|
||||
}
|
||||
}
|
||||
public void UpdElement(OrderDataModel orderDataModel)
|
||||
{
|
||||
try
|
||||
{
|
||||
var element = GetOrderById(orderDataModel.Id) ?? throw new ElementNotFoundException(orderDataModel.Id);
|
||||
_dbContext.Orders.Update(_mapper.Map(orderDataModel, element));
|
||||
_dbContext.SaveChanges();
|
||||
}
|
||||
catch (ElementNotFoundException)
|
||||
{
|
||||
_dbContext.ChangeTracker.Clear();
|
||||
throw;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_dbContext.ChangeTracker.Clear();
|
||||
throw new StorageException(ex);
|
||||
}
|
||||
}
|
||||
public void DelElement(string id)
|
||||
{
|
||||
try
|
||||
{
|
||||
var element = GetOrderById(id) ?? throw new ElementNotFoundException(id);
|
||||
_dbContext.Orders.Remove(element);
|
||||
_dbContext.SaveChanges();
|
||||
}
|
||||
catch (ElementNotFoundException)
|
||||
{
|
||||
_dbContext.ChangeTracker.Clear();
|
||||
throw;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_dbContext.ChangeTracker.Clear();
|
||||
throw new StorageException(ex);
|
||||
}
|
||||
}
|
||||
|
||||
private Order? GetOrderById(string id) => _dbContext.Orders.FirstOrDefault(x => x.Id == id);
|
||||
|
||||
}
|
||||
@@ -0,0 +1,191 @@
|
||||
using AutoMapper;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Npgsql;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using TwoFromTheCasketContratcs.DataModels;
|
||||
using TwoFromTheCasketContratcs.Exceptions;
|
||||
using TwoFromTheCasketContratcs.StorageContracts;
|
||||
using TwoFromTheCasketDatabase.Models;
|
||||
|
||||
namespace TwoFromTheCasketDatabase.Implementation;
|
||||
|
||||
internal class PostStorageContract : IPostStorageContract
|
||||
{
|
||||
private readonly TwoFromTheCasketDbContext _dbContext;
|
||||
private readonly Mapper _mapper;
|
||||
|
||||
public PostStorageContract(TwoFromTheCasketDbContext dbContext)
|
||||
{
|
||||
_dbContext = dbContext;
|
||||
var config = new MapperConfiguration(cfg =>
|
||||
{
|
||||
cfg.CreateMap<Post, PostDataModel>()
|
||||
.ForMember(x => x.Id, x => x.MapFrom(src => src.PostId));
|
||||
cfg.CreateMap<PostDataModel, Post>()
|
||||
.ForMember(x => x.Id, x => x.Ignore())
|
||||
.ForMember(x => x.PostId, x => x.MapFrom(src => src.Id))
|
||||
.ForMember(x => x.IsActual, x => x.MapFrom(src => true))
|
||||
.ForMember(x => x.ChangeDate, x => x.MapFrom(src => DateTime.UtcNow));
|
||||
});
|
||||
_mapper = new Mapper(config);
|
||||
}
|
||||
|
||||
public List<PostDataModel> GetList(bool onlyActual = true)
|
||||
{
|
||||
try
|
||||
{
|
||||
var query = _dbContext.Posts.AsQueryable();
|
||||
if (onlyActual) query = query.Where(x => x.IsActual);
|
||||
return [.. query.Select(x => _mapper.Map<PostDataModel>(x))];
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_dbContext.ChangeTracker.Clear();
|
||||
throw new StorageException(ex);
|
||||
}
|
||||
}
|
||||
|
||||
public List<PostDataModel> GetPostWithHistory(string postId)
|
||||
{
|
||||
try
|
||||
{
|
||||
return [.. _dbContext.Posts.Where(x => x.PostId == postId).Select(x => _mapper.Map<PostDataModel>(x))];
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_dbContext.ChangeTracker.Clear();
|
||||
throw new StorageException(ex);
|
||||
}
|
||||
}
|
||||
|
||||
public PostDataModel? GetElementById(string id)
|
||||
{
|
||||
try
|
||||
{
|
||||
return _mapper.Map<PostDataModel>(_dbContext.Posts.FirstOrDefault(x => x.PostId == id && x.IsActual));
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_dbContext.ChangeTracker.Clear();
|
||||
throw new StorageException(ex);
|
||||
}
|
||||
}
|
||||
|
||||
public PostDataModel? GetElementByName(string name)
|
||||
{
|
||||
try
|
||||
{
|
||||
return _mapper.Map<PostDataModel>(_dbContext.Posts.FirstOrDefault(x => x.PostName == name && x.IsActual));
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_dbContext.ChangeTracker.Clear();
|
||||
throw new StorageException(ex);
|
||||
}
|
||||
}
|
||||
|
||||
public void AddElement(PostDataModel postDataModel)
|
||||
{
|
||||
try
|
||||
{
|
||||
_dbContext.Posts.Add(_mapper.Map<Post>(postDataModel));
|
||||
_dbContext.SaveChanges();
|
||||
}
|
||||
catch (DbUpdateException ex)
|
||||
when (ex.InnerException is PostgresException { ConstraintName: "IX_Posts_PostName_IsActual" })
|
||||
{
|
||||
_dbContext.ChangeTracker.Clear();
|
||||
throw new ElementExistsException("PostName", postDataModel.PostName);
|
||||
}
|
||||
catch (DbUpdateException ex)
|
||||
when (ex.InnerException is PostgresException { ConstraintName: "IX_Posts_PostId_IsActual" })
|
||||
{
|
||||
_dbContext.ChangeTracker.Clear();
|
||||
throw new ElementExistsException("PostId", postDataModel.Id);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_dbContext.ChangeTracker.Clear();
|
||||
throw new StorageException(ex);
|
||||
}
|
||||
}
|
||||
|
||||
public void UpdElement(PostDataModel postDataModel)
|
||||
{
|
||||
try
|
||||
{
|
||||
var transaction = _dbContext.Database.BeginTransaction();
|
||||
try
|
||||
{
|
||||
var element = GetPostById(postDataModel.Id) ?? throw new ElementNotFoundException(postDataModel.Id);
|
||||
if (!element.IsActual) throw new ElementDeletedException(postDataModel.Id);
|
||||
|
||||
element.IsActual = false;
|
||||
_dbContext.SaveChanges();
|
||||
var newElement = _mapper.Map<Post>(postDataModel);
|
||||
_dbContext.Posts.Add(newElement);
|
||||
_dbContext.SaveChanges();
|
||||
transaction.Commit();
|
||||
}
|
||||
catch
|
||||
{
|
||||
transaction.Rollback();
|
||||
throw;
|
||||
}
|
||||
}
|
||||
catch (DbUpdateException ex)
|
||||
when (ex.InnerException is PostgresException { ConstraintName: "IX_Posts_PostName_IsActual" })
|
||||
{
|
||||
_dbContext.ChangeTracker.Clear();
|
||||
throw new ElementExistsException("PostName", postDataModel.PostName);
|
||||
}
|
||||
catch (Exception ex) when (ex is ElementDeletedException || ex is ElementNotFoundException)
|
||||
{
|
||||
_dbContext.ChangeTracker.Clear();
|
||||
throw;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_dbContext.ChangeTracker.Clear();
|
||||
throw new StorageException(ex);
|
||||
}
|
||||
}
|
||||
|
||||
public void DelElement(string id)
|
||||
{
|
||||
try
|
||||
{
|
||||
var element = GetPostById(id) ?? throw new ElementNotFoundException(id);
|
||||
if (!element.IsActual) throw new ElementDeletedException(id);
|
||||
element.IsActual = false;
|
||||
_dbContext.SaveChanges();
|
||||
}
|
||||
catch
|
||||
{
|
||||
_dbContext.ChangeTracker.Clear();
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
public void ResElement(string id)
|
||||
{
|
||||
try
|
||||
{
|
||||
var element = GetPostById(id) ?? throw new ElementNotFoundException(id);
|
||||
element.IsActual = true;
|
||||
_dbContext.SaveChanges();
|
||||
}
|
||||
catch
|
||||
{
|
||||
_dbContext.ChangeTracker.Clear();
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
private Post? GetPostById(string id) => _dbContext.Posts.Where(x => x.PostId == id)
|
||||
.OrderByDescending(x => x.ChangeDate).FirstOrDefault();
|
||||
}
|
||||
@@ -0,0 +1,104 @@
|
||||
using AutoMapper;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using TwoFromTheCasketContratcs.DataModels;
|
||||
using TwoFromTheCasketContratcs.Exceptions;
|
||||
using TwoFromTheCasketContratcs.StorageContracts;
|
||||
using TwoFromTheCasketDatabase.Models;
|
||||
using static System.Runtime.InteropServices.JavaScript.JSType;
|
||||
|
||||
namespace TwoFromTheCasketDatabase.Implementation;
|
||||
|
||||
internal class SalaryStorageContract : ISalaryStorageContract
|
||||
{
|
||||
TwoFromTheCasketDbContext _dbContext;
|
||||
|
||||
Mapper _mapper;
|
||||
|
||||
public SalaryStorageContract(TwoFromTheCasketDbContext twoFromTheCasketDbContext)
|
||||
{
|
||||
_dbContext = twoFromTheCasketDbContext;
|
||||
|
||||
var config = new MapperConfiguration(cfg =>
|
||||
{
|
||||
|
||||
cfg.CreateMap<Salary, SalaryDataModel>()
|
||||
.ConstructUsing(src => new SalaryDataModel(
|
||||
src.MasterId.ToString(),
|
||||
src.SalaryDate,
|
||||
src.SalarySize,
|
||||
src.Prize));
|
||||
|
||||
|
||||
cfg.CreateMap<SalaryDataModel, Salary>()
|
||||
.ForMember(dest => dest.MasterId, opt => opt.MapFrom(src => Guid.Parse(src.MasterId)))
|
||||
.ForMember(dest => dest.SalaryDate, opt => opt.MapFrom(src => src.SalaryDate))
|
||||
.ForMember(dest => dest.SalarySize, opt => opt.MapFrom(src => src.Salary))
|
||||
.ForMember(dest => dest.Prize, opt => opt.MapFrom(src => src.Prize));
|
||||
});
|
||||
|
||||
_mapper = new Mapper(config);
|
||||
}
|
||||
|
||||
public List<SalaryDataModel> GetList(DateTime startDate, DateTime endDate, string? masterId = null)
|
||||
{
|
||||
try
|
||||
{
|
||||
var query = _dbContext.Salaries.Where(x => x.SalaryDate >= startDate && x.SalaryDate <= endDate);
|
||||
if (masterId is not null) query = query.Where(x => x.MasterId == masterId);
|
||||
return [.. query.Select(x => _mapper.Map<SalaryDataModel>(x))];
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_dbContext.ChangeTracker.Clear();
|
||||
throw new StorageException(ex);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public SalaryDataModel? GetElementByMasterId(string masterId)
|
||||
{
|
||||
try
|
||||
{
|
||||
return _mapper.Map<SalaryDataModel>(_dbContext.Salaries.FirstOrDefault(x => x.MasterId == masterId));
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_dbContext.ChangeTracker.Clear();
|
||||
throw new StorageException(ex);
|
||||
}
|
||||
}
|
||||
|
||||
public SalaryDataModel? GetElementBySalaryDate(DateTime salaryDate)
|
||||
{
|
||||
try
|
||||
{
|
||||
return _mapper.Map<SalaryDataModel>(_dbContext.Salaries.FirstOrDefault(x => x.SalaryDate == salaryDate));
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_dbContext.ChangeTracker.Clear();
|
||||
throw new StorageException(ex);
|
||||
}
|
||||
}
|
||||
public void AddElement(SalaryDataModel salaryDataModel)
|
||||
{
|
||||
try
|
||||
{
|
||||
_dbContext.Salaries.Add(_mapper.Map<Salary>(salaryDataModel));
|
||||
_dbContext.SaveChanges();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_dbContext.ChangeTracker.Clear();
|
||||
throw new StorageException(ex);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,206 @@
|
||||
using AutoMapper;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Npgsql;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using TwoFromTheCasketContratcs.DataModels;
|
||||
using TwoFromTheCasketContratcs.Exceptions;
|
||||
using TwoFromTheCasketContratcs.StorageContracts;
|
||||
using TwoFromTheCasketDatabase.Models;
|
||||
|
||||
namespace TwoFromTheCasketDatabase.Implementation;
|
||||
|
||||
internal class ServiceStorageContract : IServiceStorageContract
|
||||
{
|
||||
private readonly TwoFromTheCasketDbContext _dbContext;
|
||||
|
||||
private readonly Mapper _mapper;
|
||||
|
||||
public ServiceStorageContract(TwoFromTheCasketDbContext dbContext)
|
||||
{
|
||||
_dbContext = dbContext;
|
||||
var config = new MapperConfiguration(cfg =>
|
||||
{
|
||||
cfg.CreateMap<Service, ServiceDataModel>();
|
||||
cfg.CreateMap<ServiceDataModel, Service>()
|
||||
.ForMember(x => x.IsDeleted, x => x.MapFrom(src => false));
|
||||
|
||||
|
||||
cfg.CreateMap<ServiceHistory, ServiceHistoryDataModel>();
|
||||
cfg.CreateMap<ServiceHistoryDataModel, ServiceHistory>();
|
||||
});
|
||||
_mapper = new Mapper(config);
|
||||
}
|
||||
|
||||
public List<ServiceDataModel> GetList()
|
||||
{
|
||||
try
|
||||
{
|
||||
return [.. _dbContext.Services.Select(x => _mapper.Map<ServiceDataModel>(x))];
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_dbContext.ChangeTracker.Clear();
|
||||
throw new StorageException(ex);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public ServiceDataModel? GetElementById(string id)
|
||||
{
|
||||
try
|
||||
{
|
||||
return _mapper.Map<ServiceDataModel>(_dbContext.Services.FirstOrDefault(x => x.Id == id && !x.IsDeleted));
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_dbContext.ChangeTracker.Clear();
|
||||
throw new StorageException(ex);
|
||||
}
|
||||
}
|
||||
|
||||
public List<ServiceDataModel>? GetElementByMasterId(string masterId)
|
||||
{
|
||||
try
|
||||
{
|
||||
return [.. _dbContext.Services.Select(x => _mapper.Map<ServiceDataModel>(_dbContext.Services.FirstOrDefault(x => x.MasterId == masterId && !x.IsDeleted)))];
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_dbContext.ChangeTracker.Clear();
|
||||
throw new StorageException(ex);
|
||||
}
|
||||
}
|
||||
|
||||
public List<ServiceDataModel>? GetElementByServiceName(string name)
|
||||
{
|
||||
try
|
||||
{
|
||||
return [.. _dbContext.Services.Select(x => _mapper.Map<ServiceDataModel>(_dbContext.Services.FirstOrDefault(x => x.ServiceName == name && !x.IsDeleted)))];
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_dbContext.ChangeTracker.Clear();
|
||||
throw new StorageException(ex);
|
||||
}
|
||||
}
|
||||
|
||||
public List<ServiceHistoryDataModel> GetHistoryByServiceId(string serviceId)
|
||||
{
|
||||
try
|
||||
{
|
||||
return [.. _dbContext.ServiceHistories.Where(x => x.ServiceId == serviceId).OrderByDescending(x => x.ChangeDate).Select(x => _mapper.Map<ServiceHistoryDataModel>(x))];
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_dbContext.ChangeTracker.Clear();
|
||||
throw new StorageException(ex);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void AddElement(ServiceDataModel serviceDataModel)
|
||||
{
|
||||
try
|
||||
{
|
||||
_dbContext.Services.Add(_mapper.Map<Service>(serviceDataModel));
|
||||
_dbContext.SaveChanges();
|
||||
}
|
||||
catch (InvalidOperationException ex) when (ex.TargetSite?.Name ==
|
||||
"ThrowIdentityConflict")
|
||||
{
|
||||
_dbContext.ChangeTracker.Clear();
|
||||
throw new ElementExistsException("Id", serviceDataModel.Id);
|
||||
}
|
||||
catch (DbUpdateException ex) when (ex.InnerException is
|
||||
PostgresException { ConstraintName: "IX_Service_ServiceName_IsDeleted" })
|
||||
{
|
||||
_dbContext.ChangeTracker.Clear();
|
||||
throw new ElementExistsException("ServiceName",
|
||||
serviceDataModel.ServiceName);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_dbContext.ChangeTracker.Clear();
|
||||
throw new StorageException(ex);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
public void UpdElement(ServiceDataModel serviceDataModel)
|
||||
{
|
||||
try
|
||||
{
|
||||
var transaction = _dbContext.Database.BeginTransaction();
|
||||
try
|
||||
{
|
||||
var element = GetServiceById(serviceDataModel.Id) ??
|
||||
throw new ElementNotFoundException(serviceDataModel.Id);
|
||||
if (element.Price != serviceDataModel.Price)
|
||||
{
|
||||
_dbContext.ServiceHistories.Add(new
|
||||
ServiceHistory() { ServiceId = element.Id, OldPrice = element.Price});
|
||||
_dbContext.SaveChanges();
|
||||
}
|
||||
_dbContext.Services.Update(_mapper.Map(serviceDataModel,
|
||||
element));
|
||||
_dbContext.SaveChanges();
|
||||
transaction.Commit();
|
||||
}
|
||||
catch
|
||||
{
|
||||
transaction.Rollback();
|
||||
throw;
|
||||
}
|
||||
|
||||
}
|
||||
catch (DbUpdateException ex) when (ex.InnerException is
|
||||
PostgresException { ConstraintName: "IX_Products_ProductName_IsDeleted" })
|
||||
{
|
||||
_dbContext.ChangeTracker.Clear();
|
||||
throw new ElementExistsException("ProductName",
|
||||
serviceDataModel.ServiceName);
|
||||
}
|
||||
catch (Exception ex) when (ex is ElementDeletedException || ex is
|
||||
ElementNotFoundException)
|
||||
{
|
||||
_dbContext.ChangeTracker.Clear();
|
||||
throw;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_dbContext.ChangeTracker.Clear();
|
||||
throw new StorageException(ex);
|
||||
}
|
||||
|
||||
}
|
||||
public void DelElement(string id)
|
||||
{
|
||||
try
|
||||
{
|
||||
var element = GetServiceById(id) ?? throw new
|
||||
ElementNotFoundException(id);
|
||||
element.IsDeleted = true;
|
||||
_dbContext.SaveChanges();
|
||||
}
|
||||
catch (ElementNotFoundException ex)
|
||||
{
|
||||
_dbContext.ChangeTracker.Clear();
|
||||
throw;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_dbContext.ChangeTracker.Clear();
|
||||
throw new StorageException(ex);
|
||||
}
|
||||
}
|
||||
private Service? GetServiceById(string id) => _dbContext.Services.FirstOrDefault(x => x.Id == id && !x.IsDeleted);
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel.DataAnnotations.Schema;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using AutoMapper;
|
||||
using TwoFromTheCasketContratcs.DataModels;
|
||||
|
||||
namespace TwoFromTheCasketDatabase.Models;
|
||||
|
||||
[AutoMap(typeof(MasterDataModel), ReverseMap = true)]
|
||||
internal class Master
|
||||
{
|
||||
public required string Id { get; set; }
|
||||
|
||||
public required string FIO { get; set; }
|
||||
|
||||
[ForeignKey("PostId")]
|
||||
public required string PostId { get; set; }
|
||||
|
||||
public DateTime BirthDate { get; set; }
|
||||
|
||||
public DateTime EmploymentDate { get; set; }
|
||||
|
||||
public bool IsDeleted { get; set; }
|
||||
[ForeignKey("ServiceId")]
|
||||
public List<Service>? Services { get; set; }
|
||||
|
||||
[ForeignKey("SalaryId")]
|
||||
public List<Salary>? Salaries { get; set; }
|
||||
|
||||
[ForeignKey("ServiceOrderId")]
|
||||
public List<ServiceOrder>? ServiceOrders { get; set; }
|
||||
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
using AutoMapper;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using TwoFromTheCasketContratcs.DataModels;
|
||||
using TwoFromTheCasketContratcs.Enums;
|
||||
|
||||
namespace TwoFromTheCasketDatabase.Models;
|
||||
|
||||
|
||||
internal class Order
|
||||
{
|
||||
public required string Id { get; set; }
|
||||
|
||||
public DateTime Date { get; set; }
|
||||
|
||||
public StatusType Status { get; set; }
|
||||
|
||||
public RoomType RoomType { get; set; }
|
||||
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel.DataAnnotations.Schema;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using TwoFromTheCasketContratcs.Enums;
|
||||
|
||||
namespace TwoFromTheCasketDatabase.Models;
|
||||
|
||||
internal class Post
|
||||
{
|
||||
public required string Id { get; set; } = Guid.NewGuid().ToString();
|
||||
|
||||
public required string PostId { get; set; }
|
||||
|
||||
public required string PostName { get; set; }
|
||||
|
||||
public PostType PostType { get; set; }
|
||||
|
||||
public double Salary { get; set; }
|
||||
|
||||
public bool IsActual { get; set; }
|
||||
|
||||
public DateTime ChangeDate { get; set; }
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
using AutoMapper;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel.DataAnnotations.Schema;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using TwoFromTheCasketContratcs.DataModels;
|
||||
|
||||
namespace TwoFromTheCasketDatabase.Models;
|
||||
|
||||
[AutoMap(typeof(SalaryDataModel), ReverseMap = true)]
|
||||
internal class Salary
|
||||
{
|
||||
public string Id { get; set; } = Guid.NewGuid().ToString();
|
||||
public required string MasterId { get; set; }
|
||||
|
||||
public DateTime SalaryDate { get; set; }
|
||||
|
||||
public required double SalarySize { get; set; }
|
||||
|
||||
public double Prize { get; set; }
|
||||
|
||||
public Master? Master { get; set; }
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel.DataAnnotations.Schema;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using TwoFromTheCasketContratcs.Enums;
|
||||
|
||||
namespace TwoFromTheCasketDatabase.Models;
|
||||
|
||||
internal class Service
|
||||
{
|
||||
public required string Id { get; set; }
|
||||
|
||||
public required string ServiceName { get; set; }
|
||||
|
||||
public required ServiceType ServiceType { get; set; }
|
||||
|
||||
public required string MasterId { get; set; }
|
||||
|
||||
public required double Price { get; set; }
|
||||
|
||||
public required bool IsDeleted { get; set; }
|
||||
|
||||
[ForeignKey("ServiceId")]
|
||||
public List<ServiceHistory>? ServiceHistory { get; set; }
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel.DataAnnotations.Schema;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace TwoFromTheCasketDatabase.Models;
|
||||
|
||||
internal class ServiceHistory
|
||||
{
|
||||
public required string ServiceId { get; set; }
|
||||
|
||||
public required double OldPrice { get; set; }
|
||||
|
||||
public DateTime ChangeDate { get; set; } = DateTime.UtcNow;
|
||||
|
||||
public Service? Service { get; set; }
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel.DataAnnotations.Schema;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace TwoFromTheCasketDatabase.Models;
|
||||
|
||||
internal class ServiceOrder
|
||||
{
|
||||
|
||||
public required string OrderId { get; set; }
|
||||
|
||||
public required string ServiceId { get; set; }
|
||||
|
||||
public required string MasterId { get; set; }
|
||||
|
||||
public int TimeOfWorking { get; set; }
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net9.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="AutoMapper" Version="14.0.0" />
|
||||
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="9.0.4" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\TwoFromTheCasketContratcs\TwoFromTheCasketContratcs.csproj" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\TwoFromTheCasketContratcs\TwoFromTheCasketContratcs.csproj" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<InternalsVisibleTo Include="TwoFromTheCasketTest" />
|
||||
<InternalsVisibleTo Include="DynamicProxyGenAssembly2" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
@@ -0,0 +1,65 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using TwoFromTheCasketContratcs.Infrastructure;
|
||||
using TwoFromTheCasketDatabase.Models;
|
||||
|
||||
namespace TwoFromTheCasketDatabase;
|
||||
|
||||
internal class TwoFromTheCasketDbContext(IConfigurationDatabase configurationDatabase) : DbContext
|
||||
{
|
||||
private readonly IConfigurationDatabase? _configurationDatebase = configurationDatabase;
|
||||
|
||||
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
|
||||
{
|
||||
optionsBuilder.UseNpgsql(_configurationDatebase?.ConnectionString, o => o.SetPostgresVersion(12, 2));
|
||||
base.OnConfiguring(optionsBuilder);
|
||||
}
|
||||
|
||||
protected override void OnModelCreating(ModelBuilder modelBuilder)
|
||||
{
|
||||
base.OnModelCreating(modelBuilder);
|
||||
|
||||
modelBuilder.Entity<Master>().HasIndex(e => new { e.Id, e.IsDeleted }).IsUnique().HasFilter($"\"{nameof(Master.IsDeleted)}\" = FALSE");
|
||||
|
||||
modelBuilder.Entity<Order>().HasIndex(x => x.Id).IsUnique();
|
||||
|
||||
modelBuilder.Entity<Post>()
|
||||
.HasIndex(e => new { e.PostName, e.IsActual })
|
||||
.IsUnique()
|
||||
.HasFilter($"\"{nameof(Post.IsActual)}\" = TRUE");
|
||||
|
||||
modelBuilder.Entity<Post>()
|
||||
.HasIndex(e => new { e.PostId, e.IsActual })
|
||||
.IsUnique()
|
||||
.HasFilter($"\"{nameof(Post.IsActual)}\" = TRUE");
|
||||
|
||||
modelBuilder.Entity<ServiceHistory>().HasKey(x => x.ServiceId);
|
||||
|
||||
modelBuilder.Entity<Service>().HasIndex(e => new { e.ServiceName, e.IsDeleted }).IsUnique().HasFilter($"\"{nameof(Service.IsDeleted)}\" = FALSE");
|
||||
|
||||
modelBuilder.Entity<ServiceOrder>().HasKey(x => new { x.ServiceId, x.MasterId, x.OrderId });
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
public DbSet<Master> Masters { get; set; }
|
||||
|
||||
public DbSet<Order> Orders { get; set; }
|
||||
|
||||
public DbSet<Post> Posts { get; set; }
|
||||
|
||||
public DbSet<Salary> Salaries { get; set; }
|
||||
|
||||
public DbSet<Service> Services { get; set; }
|
||||
|
||||
public DbSet<ServiceHistory> ServiceHistories { get; set; }
|
||||
|
||||
public DbSet<ServiceOrder> ServiceOrders { get; set; }
|
||||
}
|
||||
@@ -37,11 +37,11 @@ internal class PostBusinessLogicContractTests
|
||||
// Arrange
|
||||
var listOriginal = new List<PostDataModel>()
|
||||
{
|
||||
new(Guid.NewGuid().ToString(), "name 1", PostType.Carpenter, 10),
|
||||
new(Guid.NewGuid().ToString(), "name 2", PostType.Carpenter, 10),
|
||||
new(Guid.NewGuid().ToString(), "name 3", PostType.Carpenter, 10),
|
||||
new(Guid.NewGuid().ToString(), "name 1", PostType.Carpenter, 10, true, default),
|
||||
new(Guid.NewGuid().ToString(), "name 2", PostType.Carpenter, 10, true, default),
|
||||
new(Guid.NewGuid().ToString(), "name 3", PostType.Carpenter, 10, true, default),
|
||||
};
|
||||
_postStorageContract.Setup(x => x.GetList()).Returns(listOriginal);
|
||||
_postStorageContract.Setup(x => x.GetList(It.IsAny<bool>())).Returns(listOriginal);
|
||||
|
||||
// Act
|
||||
var list = _postBusinessLogicContract.GetAllPosts();
|
||||
@@ -52,14 +52,14 @@ internal class PostBusinessLogicContractTests
|
||||
Assert.That(list, Is.Not.Null);
|
||||
Assert.That(list, Is.EquivalentTo(listOriginal));
|
||||
});
|
||||
_postStorageContract.Verify(x => x.GetList(), Times.Once);
|
||||
_postStorageContract.Verify(x => x.GetList(It.IsAny<bool>()), Times.Once);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void GetAllPosts_ReturnEmptyList_Test()
|
||||
{
|
||||
// Arrange
|
||||
_postStorageContract.Setup(x => x.GetList()).Returns([]);
|
||||
_postStorageContract.Setup(x => x.GetList(It.IsAny<bool>())).Returns([]);
|
||||
|
||||
// Act
|
||||
var list = _postBusinessLogicContract.GetAllPosts();
|
||||
@@ -77,18 +77,20 @@ internal class PostBusinessLogicContractTests
|
||||
{
|
||||
// Act & Assert
|
||||
Assert.That(() => _postBusinessLogicContract.GetAllPosts(), Throws.TypeOf<NullListException>());
|
||||
_postStorageContract.Verify(x => x.GetList(), Times.Once);
|
||||
_postStorageContract.Verify(x => x.GetList(It.IsAny<bool>()), Times.Once);
|
||||
_postStorageContract.Verify(x => x.GetList(It.IsAny<bool>()), Times.Once);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void GetAllPosts_StorageThrowError_ThrowException_Test()
|
||||
{
|
||||
// Arrange
|
||||
_postStorageContract.Setup(x => x.GetList()).Throws(new StorageException(new InvalidOperationException()));
|
||||
_postStorageContract.Setup(x => x.GetList(It.IsAny<bool>())).Throws(new StorageException(new InvalidOperationException()));
|
||||
|
||||
// Act & Assert
|
||||
Assert.That(() => _postBusinessLogicContract.GetAllPosts(), Throws.TypeOf<StorageException>());
|
||||
_postStorageContract.Verify(x => x.GetList(), Times.Once);
|
||||
_postStorageContract.Verify(x => x.GetList(It.IsAny<bool>()), Times.Once);
|
||||
_postStorageContract.Verify(x => x.GetList(It.IsAny<bool>()), Times.Once);
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -98,8 +100,8 @@ internal class PostBusinessLogicContractTests
|
||||
var postId = Guid.NewGuid().ToString();
|
||||
var listOriginal = new List<PostDataModel>()
|
||||
{
|
||||
new(postId, "name 1", PostType.Painter, 10),
|
||||
new(postId, "name 2", PostType.Painter, 10)
|
||||
new(postId, "name 1", PostType.Painter, 10, true,default),
|
||||
new(postId, "name 2", PostType.Painter, 10, true, default)
|
||||
};
|
||||
_postStorageContract.Setup(x => x.GetPostWithHistory(It.IsAny<string>())).Returns(listOriginal);
|
||||
|
||||
@@ -168,7 +170,7 @@ internal class PostBusinessLogicContractTests
|
||||
{
|
||||
// Arrange
|
||||
var id = Guid.NewGuid().ToString();
|
||||
var record = new PostDataModel(id, "name", PostType.Painter, 10);
|
||||
var record = new PostDataModel(id, "name", PostType.Painter, 10, true, default);
|
||||
_postStorageContract.Setup(x => x.GetElementById(id)).Returns(record);
|
||||
|
||||
// Act
|
||||
@@ -185,7 +187,7 @@ internal class PostBusinessLogicContractTests
|
||||
{
|
||||
// Arrange
|
||||
var postName = "name";
|
||||
var record = new PostDataModel(Guid.NewGuid().ToString(), postName, PostType.Plasterer, 10);
|
||||
var record = new PostDataModel(Guid.NewGuid().ToString(), postName, PostType.Plasterer, 10, true, default);
|
||||
_postStorageContract.Setup(x => x.GetElementByName(postName)).Returns(record);
|
||||
|
||||
// Act
|
||||
@@ -244,7 +246,7 @@ internal class PostBusinessLogicContractTests
|
||||
{
|
||||
// Arrange
|
||||
var flag = false;
|
||||
var record = new PostDataModel(Guid.NewGuid().ToString(), "name 1", PostType.Plasterer, 10);
|
||||
var record = new PostDataModel(Guid.NewGuid().ToString(), "name 1", PostType.Plasterer, 10, true, default);
|
||||
_postStorageContract.Setup(x => x.AddElement(It.IsAny<PostDataModel>()))
|
||||
.Callback((PostDataModel x) =>
|
||||
{
|
||||
@@ -266,7 +268,7 @@ internal class PostBusinessLogicContractTests
|
||||
_postStorageContract.Setup(x => x.AddElement(It.IsAny<PostDataModel>())).Throws(new ElementExistsException("Data", "Data"));
|
||||
|
||||
// Act & Assert
|
||||
Assert.That(() => _postBusinessLogicContract.InsertPost(new(Guid.NewGuid().ToString(), "postName", PostType.Plasterer, 10)), Throws.TypeOf<ElementExistsException>());
|
||||
Assert.That(() => _postBusinessLogicContract.InsertPost(new(Guid.NewGuid().ToString(), "postName", PostType.Plasterer, 10, true, default)), Throws.TypeOf<ElementExistsException>());
|
||||
_postStorageContract.Verify(x => x.AddElement(It.IsAny<PostDataModel>()), Times.Once);
|
||||
}
|
||||
|
||||
@@ -282,7 +284,7 @@ internal class PostBusinessLogicContractTests
|
||||
public void InsertPost_InvalidRecord_ThrowException_Test()
|
||||
{
|
||||
// Act & Assert
|
||||
Assert.That(() => _postBusinessLogicContract.InsertPost(new PostDataModel("id", "postName", PostType.Plasterer, 10)), Throws.TypeOf<ValidationException>());
|
||||
Assert.That(() => _postBusinessLogicContract.InsertPost(new PostDataModel("id", "postName", PostType.Plasterer, 10, true, default)), Throws.TypeOf<ValidationException>());
|
||||
_postStorageContract.Verify(x => x.AddElement(It.IsAny<PostDataModel>()), Times.Never);
|
||||
}
|
||||
|
||||
@@ -293,7 +295,7 @@ internal class PostBusinessLogicContractTests
|
||||
_postStorageContract.Setup(x => x.AddElement(It.IsAny<PostDataModel>())).Throws(new StorageException(new InvalidOperationException()));
|
||||
|
||||
// Act & Assert
|
||||
Assert.That(() => _postBusinessLogicContract.InsertPost(new(Guid.NewGuid().ToString(), "postName", PostType.Plasterer, 10)), Throws.TypeOf<StorageException>());
|
||||
Assert.That(() => _postBusinessLogicContract.InsertPost(new(Guid.NewGuid().ToString(), "postName", PostType.Plasterer, 10, true, default)), Throws.TypeOf<StorageException>());
|
||||
_postStorageContract.Verify(x => x.AddElement(It.IsAny<PostDataModel>()), Times.Once);
|
||||
}
|
||||
|
||||
@@ -302,7 +304,7 @@ internal class PostBusinessLogicContractTests
|
||||
{
|
||||
// Arrange
|
||||
var flag = false;
|
||||
var record = new PostDataModel(Guid.NewGuid().ToString(), "postName", PostType.Plasterer, 10);
|
||||
var record = new PostDataModel(Guid.NewGuid().ToString(), "postName", PostType.Plasterer, 10, true, default);
|
||||
_postStorageContract.Setup(x => x.UpdElement(It.IsAny<PostDataModel>()))
|
||||
.Callback((PostDataModel x) =>
|
||||
{
|
||||
@@ -324,7 +326,7 @@ internal class PostBusinessLogicContractTests
|
||||
_postStorageContract.Setup(x => x.UpdElement(It.IsAny<PostDataModel>())).Throws(new ElementNotFoundException(""));
|
||||
|
||||
// Act & Assert
|
||||
Assert.That(() => _postBusinessLogicContract.UpdatePost(new(Guid.NewGuid().ToString(), "postName", PostType.Plasterer, 10)), Throws.TypeOf<ElementNotFoundException>());
|
||||
Assert.That(() => _postBusinessLogicContract.UpdatePost(new(Guid.NewGuid().ToString(), "postName", PostType.Plasterer, 10, true, default)), Throws.TypeOf<ElementNotFoundException>());
|
||||
_postStorageContract.Verify(x => x.UpdElement(It.IsAny<PostDataModel>()), Times.Once);
|
||||
}
|
||||
|
||||
@@ -335,7 +337,7 @@ internal class PostBusinessLogicContractTests
|
||||
_postStorageContract.Setup(x => x.UpdElement(It.IsAny<PostDataModel>())).Throws(new ElementExistsException("Data", "Data"));
|
||||
|
||||
// Act & Assert
|
||||
Assert.That(() => _postBusinessLogicContract.UpdatePost(new(Guid.NewGuid().ToString(), "postName", PostType.Plasterer, 10)), Throws.TypeOf<ElementExistsException>());
|
||||
Assert.That(() => _postBusinessLogicContract.UpdatePost(new(Guid.NewGuid().ToString(), "postName", PostType.Plasterer, 10, true, default)), Throws.TypeOf<ElementExistsException>());
|
||||
_postStorageContract.Verify(x => x.UpdElement(It.IsAny<PostDataModel>()), Times.Once);
|
||||
}
|
||||
|
||||
@@ -351,7 +353,7 @@ internal class PostBusinessLogicContractTests
|
||||
public void UpdatePost_InvalidRecord_ThrowException_Test()
|
||||
{
|
||||
// Act & Assert
|
||||
Assert.That(() => _postBusinessLogicContract.UpdatePost(new PostDataModel("id", "postName", PostType.Plasterer, 10)), Throws.TypeOf<ValidationException>());
|
||||
Assert.That(() => _postBusinessLogicContract.UpdatePost(new PostDataModel("id", "postName", PostType.Plasterer, 10, true, default)), Throws.TypeOf<ValidationException>());
|
||||
_postStorageContract.Verify(x => x.UpdElement(It.IsAny<PostDataModel>()), Times.Never);
|
||||
}
|
||||
|
||||
@@ -362,7 +364,7 @@ internal class PostBusinessLogicContractTests
|
||||
_postStorageContract.Setup(x => x.UpdElement(It.IsAny<PostDataModel>())).Throws(new StorageException(new InvalidOperationException()));
|
||||
|
||||
// Act & Assert
|
||||
Assert.That(() => _postBusinessLogicContract.UpdatePost(new(Guid.NewGuid().ToString(), "postName", PostType.Plasterer, 10)), Throws.TypeOf<StorageException>());
|
||||
Assert.That(() => _postBusinessLogicContract.UpdatePost(new(Guid.NewGuid().ToString(), "postName", PostType.Plasterer, 10, true, default)), Throws.TypeOf<StorageException>());
|
||||
_postStorageContract.Verify(x => x.UpdElement(It.IsAny<PostDataModel>()), Times.Once);
|
||||
}
|
||||
|
||||
|
||||
@@ -16,8 +16,10 @@ namespace TwoFromTheCasketTest.BuisnessLogicContractTests;
|
||||
[TestFixture]
|
||||
internal class SalaryBusinessLogicContractTests
|
||||
{
|
||||
|
||||
private SalaryBusinessLogicContract _salaryBusinessLogicContract;
|
||||
private Mock<ISalaryStorageContract> _salaryStorageContract;
|
||||
private Mock<IOrderStorageContract> _orderStorageContract;
|
||||
private Mock<IPostStorageContract> _postStorageContract;
|
||||
private Mock<IMasterStorageContract> _masterStorageContract;
|
||||
|
||||
@@ -25,196 +27,406 @@ internal class SalaryBusinessLogicContractTests
|
||||
public void OneTimeSetUp()
|
||||
{
|
||||
_salaryStorageContract = new Mock<ISalaryStorageContract>();
|
||||
_orderStorageContract = new Mock<IOrderStorageContract>();
|
||||
_postStorageContract = new Mock<IPostStorageContract>();
|
||||
_masterStorageContract = new Mock<IMasterStorageContract>();
|
||||
|
||||
_salaryBusinessLogicContract = new SalaryBusinessLogicContract(
|
||||
_salaryStorageContract.Object,
|
||||
_postStorageContract.Object,
|
||||
_masterStorageContract.Object,
|
||||
new Mock<ILogger>().Object
|
||||
);
|
||||
_salaryBusinessLogicContract = new SalaryBusinessLogicContract(_salaryStorageContract.Object,
|
||||
_postStorageContract.Object, _masterStorageContract.Object,
|
||||
new Mock<ILogger>().Object, _orderStorageContract.Object);
|
||||
}
|
||||
|
||||
[SetUp]
|
||||
public void SetUp()
|
||||
{
|
||||
_salaryStorageContract.Reset();
|
||||
_orderStorageContract.Reset();
|
||||
_postStorageContract.Reset();
|
||||
_masterStorageContract.Reset();
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void GetAllSalariesByPeriod_ReturnListOfRecords_Test()
|
||||
public void GetAllSalaries_ReturnListOfRecords_Test()
|
||||
{
|
||||
// Arrange
|
||||
//Arrange
|
||||
var startDate = DateTime.UtcNow;
|
||||
var endDate = DateTime.UtcNow.AddDays(1);
|
||||
var listOriginal = new List<SalaryDataModel>
|
||||
var listOriginal = new List<SalaryDataModel>()
|
||||
{
|
||||
new SalaryDataModel(Guid.NewGuid().ToString(), DateTime.UtcNow, 1000, 200),
|
||||
new SalaryDataModel(Guid.NewGuid().ToString(), DateTime.UtcNow.AddDays(1), 1500, 300),
|
||||
new SalaryDataModel(Guid.NewGuid().ToString(), DateTime.UtcNow.AddDays(-1), 1200, 250)
|
||||
new(Guid.NewGuid().ToString(), DateTime.UtcNow, 10, 10),
|
||||
new(Guid.NewGuid().ToString(), DateTime.UtcNow.AddDays(1), 14, 10),
|
||||
new(Guid.NewGuid().ToString(), DateTime.UtcNow.AddDays(-1), 30, 10),
|
||||
};
|
||||
|
||||
_salaryStorageContract.Setup(x => x.GetList(It.IsAny<DateTime>(), It.IsAny<DateTime>(), It.IsAny<string>())).Returns(listOriginal);
|
||||
|
||||
// Act
|
||||
_salaryStorageContract.Setup(x => x.GetList(It.IsAny<DateTime>(), It.IsAny<DateTime>(), It.IsAny<string>()))
|
||||
.Returns(listOriginal);
|
||||
//Act
|
||||
var list = _salaryBusinessLogicContract.GetAllSalariesByPeriod(startDate, endDate);
|
||||
|
||||
// Assert
|
||||
//Assert
|
||||
Assert.That(list, Is.Not.Null);
|
||||
Assert.That(list, Is.EquivalentTo(listOriginal));
|
||||
_salaryStorageContract.Verify(x => x.GetList(It.IsAny<DateTime>(), It.IsAny<DateTime>(), It.IsAny<string>()), Times.Once);
|
||||
_salaryStorageContract.Verify(x => x.GetList(startDate, endDate, null), Times.Once);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void GetAllSalariesByPeriod_ReturnEmptyList_Test()
|
||||
public void GetAllSalaries_ReturnEmptyList_Test()
|
||||
{
|
||||
// Arrange
|
||||
_salaryStorageContract.Setup(x => x.GetList(It.IsAny<DateTime>(), It.IsAny<DateTime>(), It.IsAny<string>())).Returns(new List<SalaryDataModel>());
|
||||
|
||||
// Act
|
||||
//Arrange
|
||||
_salaryStorageContract.Setup(x => x.GetList(It.IsAny<DateTime>(), It.IsAny<DateTime>(), It.IsAny<string>()))
|
||||
.Returns([]);
|
||||
//Act
|
||||
var list = _salaryBusinessLogicContract.GetAllSalariesByPeriod(DateTime.UtcNow, DateTime.UtcNow.AddDays(1));
|
||||
|
||||
// Assert
|
||||
//Assert
|
||||
Assert.That(list, Is.Not.Null);
|
||||
Assert.That(list.Count, Is.EqualTo(0));
|
||||
_salaryStorageContract.Verify(x => x.GetList(It.IsAny<DateTime>(), It.IsAny<DateTime>(), It.IsAny<string>()), Times.Once);
|
||||
Assert.That(list, Has.Count.EqualTo(0));
|
||||
_salaryStorageContract.Verify(x => x.GetList(It.IsAny<DateTime>(), It.IsAny<DateTime>(), It.IsAny<string>()),
|
||||
Times.Once);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void GetAllSalariesByPeriod_StorageThrowError_ThrowException_Test()
|
||||
public void GetAllSalaries_IncorrectDates_ThrowException_Test()
|
||||
{
|
||||
// Arrange
|
||||
_salaryStorageContract.Setup(x => x.GetList(It.IsAny<DateTime>(), It.IsAny<DateTime>(), It.IsAny<string>())).Throws(new StorageException(new InvalidOperationException()));
|
||||
//Arrange
|
||||
var dateTime = DateTime.UtcNow;
|
||||
//Act&Assert
|
||||
Assert.That(() => _salaryBusinessLogicContract.GetAllSalariesByPeriod(dateTime, dateTime),
|
||||
Throws.TypeOf<IncorrectDatesException>());
|
||||
Assert.That(() => _salaryBusinessLogicContract.GetAllSalariesByPeriod(dateTime, dateTime.AddSeconds(-1)),
|
||||
Throws.TypeOf<IncorrectDatesException>());
|
||||
_salaryStorageContract.Verify(x => x.GetList(It.IsAny<DateTime>(), It.IsAny<DateTime>(), It.IsAny<string>()),
|
||||
Times.Never);
|
||||
}
|
||||
|
||||
// Act & Assert
|
||||
Assert.That(() => _salaryBusinessLogicContract.GetAllSalariesByPeriod(DateTime.UtcNow, DateTime.UtcNow.AddDays(1)),
|
||||
[Test]
|
||||
public void GetAllSalaries_ReturnNull_ThrowException_Test()
|
||||
{
|
||||
//Act&Assert
|
||||
Assert.That(
|
||||
() => _salaryBusinessLogicContract.GetAllSalariesByPeriod(DateTime.UtcNow, DateTime.UtcNow.AddDays(1)),
|
||||
Throws.TypeOf<NullListException>());
|
||||
_salaryStorageContract.Verify(x => x.GetList(It.IsAny<DateTime>(), It.IsAny<DateTime>(), It.IsAny<string>()),
|
||||
Times.Once);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void GetAllSalaries_StorageThrowError_ThrowException_Test()
|
||||
{
|
||||
//Arrange
|
||||
_salaryStorageContract.Setup(x => x.GetList(It.IsAny<DateTime>(), It.IsAny<DateTime>(), It.IsAny<string>()))
|
||||
.Throws(new StorageException(new InvalidOperationException()));
|
||||
//Act&Assert
|
||||
Assert.That(
|
||||
() => _salaryBusinessLogicContract.GetAllSalariesByPeriod(DateTime.UtcNow, DateTime.UtcNow.AddDays(1)),
|
||||
Throws.TypeOf<StorageException>());
|
||||
_salaryStorageContract.Verify(x => x.GetList(It.IsAny<DateTime>(), It.IsAny<DateTime>(), It.IsAny<string>()), Times.Once);
|
||||
_salaryStorageContract.Verify(x => x.GetList(It.IsAny<DateTime>(), It.IsAny<DateTime>(), It.IsAny<string>()),
|
||||
Times.Once);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void GetAllSalariesByPeriodByMaster_ReturnListOfRecords_Test()
|
||||
public void GetAllSalariesByMaster_ReturnListOfRecords_Test()
|
||||
{
|
||||
// Arrange
|
||||
//Arrange
|
||||
var startDate = DateTime.UtcNow;
|
||||
var endDate = DateTime.UtcNow.AddDays(1);
|
||||
var masterId = Guid.NewGuid().ToString();
|
||||
var listOriginal = new List<SalaryDataModel>
|
||||
var listOriginal = new List<SalaryDataModel>()
|
||||
{
|
||||
new SalaryDataModel(masterId, DateTime.UtcNow, 1000, 200),
|
||||
new SalaryDataModel(masterId, DateTime.UtcNow.AddDays(1), 1500, 300)
|
||||
new(Guid.NewGuid().ToString(), DateTime.UtcNow, 10, 10),
|
||||
new(Guid.NewGuid().ToString(), DateTime.UtcNow.AddDays(1), 14, 10),
|
||||
new(Guid.NewGuid().ToString(), DateTime.UtcNow.AddDays(-1), 30, 10),
|
||||
};
|
||||
|
||||
_salaryStorageContract.Setup(x => x.GetList(It.IsAny<DateTime>(), It.IsAny<DateTime>(), It.IsAny<string>())).Returns(listOriginal);
|
||||
|
||||
// Act
|
||||
_salaryStorageContract.Setup(x => x.GetList(It.IsAny<DateTime>(), It.IsAny<DateTime>(), It.IsAny<string>()))
|
||||
.Returns(listOriginal);
|
||||
//Act
|
||||
var list = _salaryBusinessLogicContract.GetAllSalariesByPeriodByMaster(startDate, endDate, masterId);
|
||||
|
||||
// Assert
|
||||
//Assert
|
||||
Assert.That(list, Is.Not.Null);
|
||||
Assert.That(list, Is.EquivalentTo(listOriginal));
|
||||
_salaryStorageContract.Verify(x => x.GetList(It.IsAny<DateTime>(), It.IsAny<DateTime>(), It.IsAny<string>()), Times.Once);
|
||||
_salaryStorageContract.Verify(x => x.GetList(startDate, endDate, masterId), Times.Once);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void GetAllSalariesByPeriodByMaster_ReturnEmptyList_Test()
|
||||
public void GetAllSalariesByMaster_ReturnEmptyList_Test()
|
||||
{
|
||||
// Arrange
|
||||
var masterId = Guid.NewGuid().ToString();
|
||||
_salaryStorageContract.Setup(x => x.GetList(It.IsAny<DateTime>(), It.IsAny<DateTime>(), masterId)).Returns(new List<SalaryDataModel>());
|
||||
|
||||
// Act
|
||||
var list = _salaryBusinessLogicContract.GetAllSalariesByPeriodByMaster(DateTime.UtcNow, DateTime.UtcNow.AddDays(1), masterId);
|
||||
|
||||
// Assert
|
||||
//Arrange
|
||||
_salaryStorageContract.Setup(x => x.GetList(It.IsAny<DateTime>(), It.IsAny<DateTime>(), It.IsAny<string>()))
|
||||
.Returns([]);
|
||||
//Act
|
||||
var list = _salaryBusinessLogicContract.GetAllSalariesByPeriodByMaster(DateTime.UtcNow,
|
||||
DateTime.UtcNow.AddDays(1), Guid.NewGuid().ToString());
|
||||
//Assert
|
||||
Assert.That(list, Is.Not.Null);
|
||||
Assert.That(list.Count, Is.EqualTo(0));
|
||||
_salaryStorageContract.Verify(x => x.GetList(It.IsAny<DateTime>(), It.IsAny<DateTime>(), masterId), Times.Once);
|
||||
Assert.That(list, Has.Count.EqualTo(0));
|
||||
_salaryStorageContract.Verify(x => x.GetList(It.IsAny<DateTime>(), It.IsAny<DateTime>(), It.IsAny<string>()),
|
||||
Times.Once);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void GetAllSalariesByPeriodByMaster_MasterIdIsNull_ThrowException_Test()
|
||||
public void GetAllSalariesByMaster_IncorrectDates_ThrowException_Test()
|
||||
{
|
||||
// Act & Assert
|
||||
Assert.That(() => _salaryBusinessLogicContract.GetAllSalariesByPeriodByMaster(DateTime.UtcNow, DateTime.UtcNow.AddDays(1), null),
|
||||
Throws.TypeOf<ArgumentNullException>());
|
||||
_salaryStorageContract.Verify(x => x.GetList(It.IsAny<DateTime>(), It.IsAny<DateTime>(), It.IsAny<string>()), Times.Never);
|
||||
//Arrange
|
||||
var dateTime = DateTime.UtcNow;
|
||||
//Act&Assert
|
||||
Assert.That(
|
||||
() => _salaryBusinessLogicContract.GetAllSalariesByPeriodByMaster(dateTime, dateTime,
|
||||
Guid.NewGuid().ToString()), Throws.TypeOf<IncorrectDatesException>());
|
||||
Assert.That(
|
||||
() => _salaryBusinessLogicContract.GetAllSalariesByPeriodByMaster(dateTime, dateTime.AddSeconds(-1),
|
||||
Guid.NewGuid().ToString()), Throws.TypeOf<IncorrectDatesException>());
|
||||
_salaryStorageContract.Verify(x => x.GetList(It.IsAny<DateTime>(), It.IsAny<DateTime>(), It.IsAny<string>()),
|
||||
Times.Never);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void GetAllSalariesByPeriodByMaster_MasterIdIsEmpty_ThrowException_Test()
|
||||
public void GetAllSalariesByMaster_MasterIdIsNUllOrEmpty_ThrowException_Test()
|
||||
{
|
||||
// Act & Assert
|
||||
Assert.That(() => _salaryBusinessLogicContract.GetAllSalariesByPeriodByMaster(DateTime.UtcNow, DateTime.UtcNow.AddDays(1), string.Empty),
|
||||
Throws.TypeOf<ArgumentNullException>());
|
||||
_salaryStorageContract.Verify(x => x.GetList(It.IsAny<DateTime>(), It.IsAny<DateTime>(), It.IsAny<string>()), Times.Never);
|
||||
//Act&Assert
|
||||
Assert.That(
|
||||
() => _salaryBusinessLogicContract.GetAllSalariesByPeriodByMaster(DateTime.UtcNow,
|
||||
DateTime.UtcNow.AddDays(1), null), Throws.TypeOf<ArgumentNullException>());
|
||||
Assert.That(
|
||||
() => _salaryBusinessLogicContract.GetAllSalariesByPeriodByMaster(DateTime.UtcNow,
|
||||
DateTime.UtcNow.AddDays(1), string.Empty), Throws.TypeOf<ArgumentNullException>());
|
||||
_salaryStorageContract.Verify(x => x.GetList(It.IsAny<DateTime>(), It.IsAny<DateTime>(), It.IsAny<string>()),
|
||||
Times.Never);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CalculateSalaryByMonth_CalculateSalary_Test()
|
||||
public void GetAllSalariesByMaster_MasterIdIsNotGuid_ThrowException_Test()
|
||||
{
|
||||
// Arrange
|
||||
//Act&Assert
|
||||
Assert.That(
|
||||
() => _salaryBusinessLogicContract.GetAllSalariesByPeriodByMaster(DateTime.UtcNow,
|
||||
DateTime.UtcNow.AddDays(1), "masterId"), Throws.TypeOf<ValidationException>());
|
||||
_salaryStorageContract.Verify(x => x.GetList(It.IsAny<DateTime>(), It.IsAny<DateTime>(), It.IsAny<string>()),
|
||||
Times.Never);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void GetAllSalariesByMaster_ReturnNull_ThrowException_Test()
|
||||
{
|
||||
//Act&Assert
|
||||
Assert.That(
|
||||
() => _salaryBusinessLogicContract.GetAllSalariesByPeriodByMaster(DateTime.UtcNow,
|
||||
DateTime.UtcNow.AddDays(1), Guid.NewGuid().ToString()), Throws.TypeOf<NullListException>());
|
||||
_salaryStorageContract.Verify(x => x.GetList(It.IsAny<DateTime>(), It.IsAny<DateTime>(), It.IsAny<string>()),
|
||||
Times.Once);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void GetAllSalariesByMaster_StorageThrowError_ThrowException_Test()
|
||||
{
|
||||
//Arrange
|
||||
_salaryStorageContract.Setup(x => x.GetList(It.IsAny<DateTime>(), It.IsAny<DateTime>(), It.IsAny<string>()))
|
||||
.Throws(new StorageException(new InvalidOperationException()));
|
||||
//Act&Assert
|
||||
Assert.That(
|
||||
() => _salaryBusinessLogicContract.GetAllSalariesByPeriodByMaster(DateTime.UtcNow,
|
||||
DateTime.UtcNow.AddDays(1), Guid.NewGuid().ToString()), Throws.TypeOf<StorageException>());
|
||||
_salaryStorageContract.Verify(x => x.GetList(It.IsAny<DateTime>(), It.IsAny<DateTime>(), It.IsAny<string>()),
|
||||
Times.Once);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CalculateSalaryByMounth_CalculateSalary_Test()
|
||||
{
|
||||
//Arrange
|
||||
var masterId = Guid.NewGuid().ToString();
|
||||
var expectedSalary = 2000.0;
|
||||
var expectedPrize = 500.0;
|
||||
|
||||
var master = new MasterDataModel(
|
||||
id: masterId,
|
||||
fio: "Иванов Иван Иванович",
|
||||
postId: Guid.NewGuid().ToString(),
|
||||
birthDate: DateTime.Now.AddYears(-30),
|
||||
employmentDate: DateTime.Now.AddYears(-5),
|
||||
isDeleted: false
|
||||
);
|
||||
|
||||
// Устанавливаем mock-поведение для метода GetList
|
||||
_masterStorageContract.Setup(x => x.GetList(true, It.IsAny<string>(), null, null, null, null))
|
||||
.Returns(new List<MasterDataModel> { master });
|
||||
|
||||
// Act
|
||||
var orderSum = 200.0;
|
||||
var postSalary = 2000.0;
|
||||
_orderStorageContract.Setup(x => x.GetList())
|
||||
.Returns([
|
||||
new OrderDataModel(Guid.NewGuid().ToString(), DateTime.Now, StatusType.Ready, RoomType.Industrial)
|
||||
]);
|
||||
_postStorageContract.Setup(x => x.GetElementById(It.IsAny<string>()))
|
||||
.Returns(new PostDataModel(Guid.NewGuid().ToString(), "name", PostType.Plasterer, postSalary, true,default));
|
||||
_masterStorageContract.Setup(x => x.GetList(It.IsAny<bool>(), It.IsAny<string?>(), It.IsAny<DateTime?>(),
|
||||
It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>()))
|
||||
.Returns([
|
||||
new MasterDataModel(masterId, "А А А", Guid.NewGuid().ToString(), DateTime.UtcNow.AddYears(-19), DateTime.UtcNow,
|
||||
false)
|
||||
]);
|
||||
var sum = 0.0;
|
||||
var expectedSum = postSalary + 500;
|
||||
_salaryStorageContract.Setup(x => x.AddElement(It.IsAny<SalaryDataModel>()))
|
||||
.Callback((SalaryDataModel x) => { sum = x.Salary; });
|
||||
//Act
|
||||
_salaryBusinessLogicContract.CalculateSalaryByMonth(DateTime.UtcNow);
|
||||
|
||||
// Assert
|
||||
_salaryStorageContract.Verify(x => x.AddElement(It.Is<SalaryDataModel>(s =>
|
||||
s.MasterId == masterId &&
|
||||
s.Salary == expectedSalary &&
|
||||
s.Prize == expectedPrize)), Times.Once);
|
||||
//Assert
|
||||
Assert.That(sum, Is.EqualTo(expectedSum));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CalculateSalaryByMonth_MasterStorageThrowError_ThrowException_Test()
|
||||
public void CalculateSalaryByMounth_WithSeveralMasters_Test()
|
||||
{
|
||||
// Arrange
|
||||
_postStorageContract.Setup(x => x.GetElementById(It.IsAny<string>())).Throws(new StorageException(new InvalidOperationException()));
|
||||
//Arrange
|
||||
var master1Id = Guid.NewGuid().ToString();
|
||||
var master2Id = Guid.NewGuid().ToString();
|
||||
var master3Id = Guid.NewGuid().ToString();
|
||||
var list = new List<MasterDataModel>()
|
||||
{
|
||||
new MasterDataModel(master1Id, "А А А", Guid.NewGuid().ToString(), DateTime.UtcNow.AddYears(-19), DateTime.UtcNow,
|
||||
false),
|
||||
new MasterDataModel(master2Id, "А А А", Guid.NewGuid().ToString(), DateTime.UtcNow.AddYears(-19), DateTime.UtcNow,
|
||||
false),
|
||||
new MasterDataModel(master3Id, "А А А", Guid.NewGuid().ToString(), DateTime.UtcNow.AddYears(-19), DateTime.UtcNow,
|
||||
false)
|
||||
};
|
||||
_orderStorageContract.Setup(x => x.GetList())
|
||||
.Returns([
|
||||
new OrderDataModel(Guid.NewGuid().ToString(), DateTime.Now, StatusType.Ready, RoomType.Industrial),
|
||||
new OrderDataModel(Guid.NewGuid().ToString(), DateTime.Now, StatusType.Ready, RoomType.Industrial),
|
||||
new OrderDataModel(Guid.NewGuid().ToString(), DateTime.Now, StatusType.Ready, RoomType.Industrial),
|
||||
new OrderDataModel(Guid.NewGuid().ToString(), DateTime.Now, StatusType.Ready, RoomType.Industrial),
|
||||
new OrderDataModel(Guid.NewGuid().ToString(), DateTime.Now, StatusType.Ready, RoomType.Industrial)
|
||||
]);
|
||||
_postStorageContract.Setup(x => x.GetElementById(It.IsAny<string>()))
|
||||
.Returns(new PostDataModel(Guid.NewGuid().ToString(), "name", PostType.Plasterer, 2000, true, default));
|
||||
_masterStorageContract.Setup(x => x.GetList(It.IsAny<bool>(), It.IsAny<string?>(), It.IsAny<DateTime?>(),
|
||||
It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>()))
|
||||
.Returns(list);
|
||||
//Act
|
||||
_salaryBusinessLogicContract.CalculateSalaryByMonth(DateTime.UtcNow);
|
||||
//Assert
|
||||
_salaryStorageContract.Verify(x => x.AddElement(It.IsAny<SalaryDataModel>()), Times.Exactly(list.Count));
|
||||
}
|
||||
|
||||
// Act & Assert
|
||||
[Test]
|
||||
public void CalculateSalaryByMounth_WithoitOrdersByMaster_Test()
|
||||
{
|
||||
//Arrange
|
||||
var postSalary = 2000.0;
|
||||
var masterId = Guid.NewGuid().ToString();
|
||||
_orderStorageContract.Setup(x => x.GetList())
|
||||
.Returns([]);
|
||||
_postStorageContract.Setup(x => x.GetElementById(It.IsAny<string>()))
|
||||
.Returns(new PostDataModel(Guid.NewGuid().ToString(), "name", PostType.Plasterer, postSalary, true, default));
|
||||
_masterStorageContract.Setup(x => x.GetList(It.IsAny<bool>(), It.IsAny<string?>(), It.IsAny<DateTime?>(),
|
||||
It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>()))
|
||||
.Returns([
|
||||
new MasterDataModel(masterId, "А А А", Guid.NewGuid().ToString(), DateTime.UtcNow.AddYears(-19), DateTime.UtcNow,
|
||||
false)
|
||||
]);
|
||||
var sum = 0.0;
|
||||
var expectedSum = postSalary + 500;
|
||||
_salaryStorageContract.Setup(x => x.AddElement(It.IsAny<SalaryDataModel>()))
|
||||
.Callback((SalaryDataModel x) => { sum = x.Salary; });
|
||||
//Act
|
||||
_salaryBusinessLogicContract.CalculateSalaryByMonth(DateTime.UtcNow);
|
||||
//Assert
|
||||
Assert.That(sum, Is.EqualTo(expectedSum));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CalculateSalaryByMounth_OrderStorageReturnNull_ThrowException_Test()
|
||||
{
|
||||
//Arrange
|
||||
var masterId = Guid.NewGuid().ToString();
|
||||
_postStorageContract.Setup(x => x.GetElementById(It.IsAny<string>()))
|
||||
.Returns(new PostDataModel(Guid.NewGuid().ToString(), "name", PostType.Plasterer, 2000, true, default));
|
||||
_masterStorageContract.Setup(x => x.GetList(It.IsAny<bool>(), It.IsAny<string?>(), It.IsAny<DateTime?>(),
|
||||
It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>()))
|
||||
.Returns([
|
||||
new MasterDataModel(masterId, "А А А", Guid.NewGuid().ToString(), DateTime.UtcNow.AddYears(-19), DateTime.UtcNow,
|
||||
false)
|
||||
]);
|
||||
//Act&Assert
|
||||
Assert.That(() => _salaryBusinessLogicContract.CalculateSalaryByMonth(DateTime.UtcNow),
|
||||
Throws.TypeOf<NullListException>());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CalculateSalaryByMounth_PostStorageReturnNull_ThrowException_Test()
|
||||
{
|
||||
//Arrange
|
||||
var masterId = Guid.NewGuid().ToString();
|
||||
_orderStorageContract.Setup(x => x.GetList())
|
||||
.Returns([
|
||||
new OrderDataModel(Guid.NewGuid().ToString(), DateTime.Now, StatusType.Ready, RoomType.Industrial)
|
||||
]);
|
||||
_masterStorageContract.Setup(x => x.GetList(It.IsAny<bool>(), It.IsAny<string?>(), It.IsAny<DateTime?>(),
|
||||
It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>()))
|
||||
.Returns([
|
||||
new MasterDataModel(masterId, "А А А", Guid.NewGuid().ToString(), DateTime.UtcNow.AddYears(-19), DateTime.UtcNow,
|
||||
false)
|
||||
]);
|
||||
//Act&Assert
|
||||
Assert.That(() => _salaryBusinessLogicContract.CalculateSalaryByMonth(DateTime.UtcNow),
|
||||
Throws.TypeOf<NullListException>());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CalculateSalaryByMounth_MasterStorageReturnNull_ThrowException_Test()
|
||||
{
|
||||
//Arrange
|
||||
var masterId = Guid.NewGuid().ToString();
|
||||
_orderStorageContract.Setup(x => x.GetList())
|
||||
.Returns([
|
||||
new OrderDataModel(Guid.NewGuid().ToString(), DateTime.Now, StatusType.Ready, RoomType.Industrial)
|
||||
]);
|
||||
_postStorageContract.Setup(x => x.GetElementById(It.IsAny<string>()))
|
||||
.Returns(new PostDataModel(Guid.NewGuid().ToString(), "name", PostType.Plasterer, 2000, true, default));
|
||||
//Act&Assert
|
||||
Assert.That(() => _salaryBusinessLogicContract.CalculateSalaryByMonth(DateTime.UtcNow),
|
||||
Throws.TypeOf<NullListException>());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CalculateSalaryByMounth_OrderStorageThrowException_ThrowException_Test()
|
||||
{
|
||||
//Arrange
|
||||
var masterId = Guid.NewGuid().ToString();
|
||||
_orderStorageContract.Setup(x => x.GetList())
|
||||
.Throws(new StorageException(new InvalidOperationException()));
|
||||
_postStorageContract.Setup(x => x.GetElementById(It.IsAny<string>()))
|
||||
.Returns(new PostDataModel(Guid.NewGuid().ToString(), "name", PostType.Plasterer, 2000, true, default));
|
||||
_masterStorageContract.Setup(x => x.GetList(It.IsAny<bool>(), It.IsAny<string?>(), It.IsAny<DateTime?>(),
|
||||
It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>()))
|
||||
.Returns([
|
||||
new MasterDataModel(masterId, "А А А", Guid.NewGuid().ToString(), DateTime.UtcNow.AddYears(-19), DateTime.UtcNow,
|
||||
false)
|
||||
]);
|
||||
//Act&Assert
|
||||
Assert.That(() => _salaryBusinessLogicContract.CalculateSalaryByMonth(DateTime.UtcNow),
|
||||
Throws.TypeOf<StorageException>());
|
||||
_postStorageContract.Verify(x => x.GetElementById(It.IsAny<string>()), Times.Once);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CalculateSalaryByMonth_MasterDataInvalid_ThrowValidationException_Test()
|
||||
public void CalculateSalaryByMounth_PostStorageThrowException_ThrowException_Test()
|
||||
{
|
||||
// Arrange
|
||||
//Arrange
|
||||
var masterId = Guid.NewGuid().ToString();
|
||||
var master = new MasterDataModel(
|
||||
id: masterId,
|
||||
fio: "Invalid FIO", // Некорректное ФИО
|
||||
postId: Guid.NewGuid().ToString(),
|
||||
birthDate: DateTime.Now.AddYears(-30),
|
||||
employmentDate: DateTime.Now.AddYears(-5),
|
||||
isDeleted: false
|
||||
);
|
||||
|
||||
_masterStorageContract.Setup(x => x.GetElementById(masterId)).Returns(master);
|
||||
|
||||
// Act & Assert
|
||||
_orderStorageContract.Setup(x => x.GetList())
|
||||
.Returns([
|
||||
new OrderDataModel(Guid.NewGuid().ToString(), DateTime.Now, StatusType.Ready, RoomType.Industrial)
|
||||
]);
|
||||
_postStorageContract.Setup(x => x.GetElementById(It.IsAny<string>()))
|
||||
.Throws(new StorageException(new InvalidOperationException()));
|
||||
_masterStorageContract.Setup(x => x.GetList(It.IsAny<bool>(), It.IsAny<string?>(), It.IsAny<DateTime?>(),
|
||||
It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>()))
|
||||
.Returns([
|
||||
new MasterDataModel(masterId, "А А А", Guid.NewGuid().ToString(), DateTime.UtcNow.AddYears(-19), DateTime.UtcNow,
|
||||
false)
|
||||
]);
|
||||
//Act&Assert
|
||||
Assert.That(() => _salaryBusinessLogicContract.CalculateSalaryByMonth(DateTime.UtcNow),
|
||||
Throws.TypeOf<ValidationException>());
|
||||
_masterStorageContract.Verify(x => x.GetElementById(masterId), Times.Once);
|
||||
Throws.TypeOf<StorageException>());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CalculateSalaryByMounth_MasterStorageThrowException_ThrowException_Test()
|
||||
{
|
||||
//Arrange
|
||||
var masterId = Guid.NewGuid().ToString();
|
||||
_orderStorageContract.Setup(x => x.GetList())
|
||||
.Returns([
|
||||
new OrderDataModel(Guid.NewGuid().ToString(), DateTime.Now, StatusType.Ready, RoomType.Industrial)
|
||||
]);
|
||||
_postStorageContract.Setup(x => x.GetElementById(It.IsAny<string>()))
|
||||
.Returns(new PostDataModel(Guid.NewGuid().ToString(), "name", PostType.Plasterer, 2000, true, default));
|
||||
_masterStorageContract.Setup(x => x.GetList(It.IsAny<bool>(), It.IsAny<string?>(), It.IsAny<DateTime?>(),
|
||||
It.IsAny<DateTime?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>()))
|
||||
.Throws(new StorageException(new InvalidOperationException()));
|
||||
//Act&Assert
|
||||
Assert.That(() => _salaryBusinessLogicContract.CalculateSalaryByMonth(DateTime.UtcNow),
|
||||
Throws.TypeOf<StorageException>());
|
||||
}
|
||||
}
|
||||
@@ -15,14 +15,14 @@ public class PostDataModelTests
|
||||
[Test]
|
||||
public void IdIsNullOrEmptyTest()
|
||||
{
|
||||
var post = CreateDataModel(string.Empty, "Manager", PostType.Plasterer, 50000);
|
||||
var post = CreateDataModel(string.Empty, "Manager", PostType.Plasterer, 50000, true, default);
|
||||
Assert.That(() => post.Validate(), Throws.TypeOf<ValidationException>());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void IdIsNotGuidTest()
|
||||
{
|
||||
var post = CreateDataModel("invalid-guid", "Manager", PostType.Plasterer, 50000);
|
||||
var post = CreateDataModel("invalid-guid", "Manager", PostType.Plasterer, 50000, true, default);
|
||||
Assert.That(() => post.Validate(), Throws.TypeOf<ValidationException>());
|
||||
}
|
||||
|
||||
@@ -31,24 +31,24 @@ public class PostDataModelTests
|
||||
[Test]
|
||||
public void PostNameIsNullOrEmptyTest()
|
||||
{
|
||||
var post = CreateDataModel(Guid.NewGuid().ToString(), string.Empty, PostType.Plasterer, 50000);
|
||||
var post = CreateDataModel(Guid.NewGuid().ToString(), string.Empty, PostType.Plasterer, 50000, true, default);
|
||||
Assert.That(() => post.Validate(), Throws.TypeOf<ValidationException>());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void PostTypeIsNoneTest()
|
||||
{
|
||||
var post = CreateDataModel(Guid.NewGuid().ToString(), "Manager", PostType.None, 50000);
|
||||
var post = CreateDataModel(Guid.NewGuid().ToString(), "Manager", PostType.None, 50000, true, default);
|
||||
Assert.That(() => post.Validate(), Throws.TypeOf<ValidationException>());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void SalaryIsLessOrEqualToZeroTest()
|
||||
{
|
||||
var post = CreateDataModel(Guid.NewGuid().ToString(), "Manager", PostType.Plasterer, 0);
|
||||
var post = CreateDataModel(Guid.NewGuid().ToString(), "Manager", PostType.Plasterer, 0, true, default);
|
||||
Assert.That(() => post.Validate(), Throws.TypeOf<ValidationException>());
|
||||
|
||||
post = CreateDataModel(Guid.NewGuid().ToString(), "Manager", PostType.Plasterer, -1000);
|
||||
post = CreateDataModel(Guid.NewGuid().ToString(), "Manager", PostType.Plasterer, -1000, true, default);
|
||||
Assert.That(() => post.Validate(), Throws.TypeOf<ValidationException>());
|
||||
}
|
||||
|
||||
@@ -62,7 +62,7 @@ public class PostDataModelTests
|
||||
var isActual = true;
|
||||
var changeDate = DateTime.Now;
|
||||
|
||||
var post = CreateDataModel(id, postName, postType, salary);
|
||||
var post = CreateDataModel(id, postName, postType, salary, true, default);
|
||||
|
||||
Assert.That(() => post.Validate(), Throws.Nothing);
|
||||
|
||||
@@ -76,8 +76,8 @@ public class PostDataModelTests
|
||||
});
|
||||
}
|
||||
|
||||
private static PostDataModel CreateDataModel(string id, string postName, PostType postType, double salary)
|
||||
private static PostDataModel CreateDataModel(string id, string postName, PostType postType, double salary, bool isActual, DateTime changeDate)
|
||||
{
|
||||
return new PostDataModel(id, postName, postType, salary);
|
||||
return new PostDataModel(id, postName, postType, salary, isActual, default);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,7 +9,7 @@ using TwoFromTheCasketContratcs.Exceptions;
|
||||
namespace TwoFromTheCasketTest.DataModelsTest;
|
||||
|
||||
[TestFixture]
|
||||
public class SalaryDataModellTests
|
||||
public class SalaryDataModelTests
|
||||
{
|
||||
[Test]
|
||||
public void MasterIdIsNullOrEmptyTest()
|
||||
|
||||
@@ -49,7 +49,7 @@ public class ServiceHistoryDataModelTests
|
||||
{
|
||||
Assert.That(serviceHistory.ServiceId, Is.EqualTo(serviceId));
|
||||
Assert.That(serviceHistory.OldPrice, Is.EqualTo(oldPrice));
|
||||
Assert.That(serviceHistory.ChangeDate, Is.EqualTo(DateTime.UtcNow).Within(TimeSpan.FromSeconds(1)));
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using TwoFromTheCasketContratcs.Infrastructure;
|
||||
|
||||
namespace TwoFromTheCasketTest.Infrastructureж
|
||||
{
|
||||
internal class ConfigurationDatabaseTest : IConfigurationDatabase
|
||||
{
|
||||
public string ConnectionString =>
|
||||
"Host=127.0.0.1;Port=5432;Database=TwoFromTheCasketTest;Username=postgres;Password=123;";
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using TwoFromTheCasketDatabase;
|
||||
using TwoFromTheCasketTest.Infrastructureж;
|
||||
|
||||
namespace TwoFromTheCasketTest.StoragesContractsTests;
|
||||
|
||||
internal abstract class BaseStorageContractTest
|
||||
{
|
||||
protected TwoFromTheCasketDbContext TwoFromTheCasketDbContext { get; private set; }
|
||||
[OneTimeSetUp]
|
||||
public void OneTimeSetUp()
|
||||
{
|
||||
TwoFromTheCasketDbContext = new TwoFromTheCasketDbContext(new
|
||||
ConfigurationDatabaseTest());
|
||||
TwoFromTheCasketDbContext.Database.EnsureDeleted();
|
||||
TwoFromTheCasketDbContext.Database.EnsureCreated();
|
||||
}
|
||||
[OneTimeTearDown]
|
||||
public void OneTimeTearDown()
|
||||
{
|
||||
TwoFromTheCasketDbContext.Database.EnsureDeleted();
|
||||
TwoFromTheCasketDbContext.Dispose();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,255 @@
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using TwoFromTheCasketContratcs.DataModels;
|
||||
using TwoFromTheCasketContratcs.Exceptions;
|
||||
using TwoFromTheCasketDatabase.Implementation;
|
||||
using TwoFromTheCasketDatabase.Models;
|
||||
|
||||
namespace TwoFromTheCasketTest.StoragesContractsTests;
|
||||
|
||||
[TestFixture]
|
||||
internal class MasterStorageContractTests : BaseStorageContractTest
|
||||
{
|
||||
private MasterStorageContract _masterStorageContract;
|
||||
|
||||
[SetUp]
|
||||
public void SetUp()
|
||||
{
|
||||
_masterStorageContract = new MasterStorageContract(TwoFromTheCasketDbContext);
|
||||
}
|
||||
[TearDown]
|
||||
public void TearDown()
|
||||
{
|
||||
TwoFromTheCasketDbContext.Database.ExecuteSqlRaw("TRUNCATE \"Masters\"CASCADE; ");
|
||||
}
|
||||
[Test]
|
||||
public void Try_GetList_WhenHaveRecords_Test()
|
||||
{
|
||||
var master =
|
||||
InsertMasterToDatabaseAndReturn(Guid.NewGuid().ToString(), "fio 1");
|
||||
InsertMasterToDatabaseAndReturn(Guid.NewGuid().ToString(), "fio 2");
|
||||
InsertMasterToDatabaseAndReturn(Guid.NewGuid().ToString(), "fio 3");
|
||||
var list = _masterStorageContract.GetList();
|
||||
Assert.That(list, Is.Not.Null);
|
||||
Assert.That(list, Has.Count.EqualTo(3));
|
||||
AssertElement(list.First(), master);
|
||||
}
|
||||
[Test]
|
||||
public void Try_GetList_WhenNoRecords_Test()
|
||||
{
|
||||
var list = _masterStorageContract.GetList();
|
||||
Assert.That(list, Is.Not.Null);
|
||||
Assert.That(list, Is.Empty);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Try_GetList_ByPostId_Test()
|
||||
{
|
||||
var postId = Guid.NewGuid().ToString();
|
||||
InsertMasterToDatabaseAndReturn(Guid.NewGuid().ToString(), "fio 1",
|
||||
postId);
|
||||
InsertMasterToDatabaseAndReturn(Guid.NewGuid().ToString(), "fio 2",
|
||||
postId);
|
||||
InsertMasterToDatabaseAndReturn(Guid.NewGuid().ToString(), "fio 3",
|
||||
postId);
|
||||
var list = _masterStorageContract.GetList(postId: postId);
|
||||
Assert.That(list, Is.Not.Null);
|
||||
Assert.That(list, Has.Count.EqualTo(3));
|
||||
Assert.That(list.All(x => x.PostId == postId));
|
||||
}
|
||||
[Test]
|
||||
public void Try_GetList_ByBirthDate_Test()
|
||||
{
|
||||
InsertMasterToDatabaseAndReturn(Guid.NewGuid().ToString(), "fio 1",
|
||||
birthDate: DateTime.UtcNow.AddYears(-25));
|
||||
InsertMasterToDatabaseAndReturn(Guid.NewGuid().ToString(), "fio 2",
|
||||
birthDate: DateTime.UtcNow.AddYears(-21));
|
||||
InsertMasterToDatabaseAndReturn(Guid.NewGuid().ToString(), "fio 3",
|
||||
birthDate: DateTime.UtcNow.AddYears(-20));
|
||||
InsertMasterToDatabaseAndReturn(Guid.NewGuid().ToString(), "fio 4",
|
||||
birthDate: DateTime.UtcNow.AddYears(-19));
|
||||
|
||||
var list = _masterStorageContract.GetList(fromBirthDate:
|
||||
DateTime.UtcNow.AddYears(-21).AddMinutes(-1), toBirthDate:
|
||||
DateTime.UtcNow.AddYears(-20).AddMinutes(1));
|
||||
Assert.That(list, Is.Not.Null);
|
||||
Assert.That(list, Has.Count.EqualTo(2));
|
||||
}
|
||||
[Test]
|
||||
public void Try_GetList_ByEmploymentDate_Test()
|
||||
{
|
||||
InsertMasterToDatabaseAndReturn(Guid.NewGuid().ToString(), "fio 1",
|
||||
employmentDate: DateTime.UtcNow.AddDays(-2));
|
||||
InsertMasterToDatabaseAndReturn(Guid.NewGuid().ToString(), "fio 2",
|
||||
employmentDate: DateTime.UtcNow.AddDays(-1));
|
||||
InsertMasterToDatabaseAndReturn(Guid.NewGuid().ToString(), "fio 3", employmentDate: DateTime.UtcNow.AddDays(1));
|
||||
InsertMasterToDatabaseAndReturn(Guid.NewGuid().ToString(), "fio 4", employmentDate: DateTime.UtcNow.AddDays(2));
|
||||
var list = _masterStorageContract.GetList(fromEmploymentDate: DateTime.UtcNow.AddDays(-1).AddMinutes(-1),
|
||||
toEmploymentDate: DateTime.UtcNow.AddDays(1).AddMinutes(1));
|
||||
Assert.That(list, Is.Not.Null);
|
||||
Assert.That(list, Has.Count.EqualTo(2));
|
||||
}
|
||||
[Test]
|
||||
public void Try_GetList_ByAllParameters_Test()
|
||||
{
|
||||
var postId = Guid.NewGuid().ToString();
|
||||
InsertMasterToDatabaseAndReturn(Guid.NewGuid().ToString(), "fio 1", postId,
|
||||
birthDate: DateTime.UtcNow.AddYears(-25), employmentDate: DateTime.UtcNow.AddDays(-2));
|
||||
InsertMasterToDatabaseAndReturn(Guid.NewGuid().ToString(), "fio 2", postId,
|
||||
birthDate: DateTime.UtcNow.AddYears(-22), employmentDate: DateTime.UtcNow.AddDays(-1));
|
||||
InsertMasterToDatabaseAndReturn(Guid.NewGuid().ToString(), "fio 3", postId,
|
||||
birthDate: DateTime.UtcNow.AddYears(-21), employmentDate: DateTime.UtcNow.AddDays(-1));
|
||||
InsertMasterToDatabaseAndReturn(Guid.NewGuid().ToString(), "fio 4",birthDate: DateTime.UtcNow.AddYears(-20),
|
||||
employmentDate: DateTime.UtcNow.AddDays(1));
|
||||
var list = _masterStorageContract.GetList(postId: postId,
|
||||
fromBirthDate: DateTime.UtcNow.AddYears(-21).AddMinutes(-1),
|
||||
toBirthDate: DateTime.UtcNow.AddYears(-20).AddMinutes(1),
|
||||
fromEmploymentDate: DateTime.UtcNow.AddDays(-1).AddMinutes(-1),
|
||||
toEmploymentDate: DateTime.UtcNow.AddDays(1).AddMinutes(1));
|
||||
Assert.That(list, Is.Not.Null);
|
||||
Assert.That(list, Has.Count.EqualTo(1));
|
||||
}
|
||||
[Test]
|
||||
public void Try_GetElementById_WhenHaveRecord_Test()
|
||||
{
|
||||
var master = InsertMasterToDatabaseAndReturn(Guid.NewGuid().ToString());
|
||||
AssertElement(_masterStorageContract.GetElementById(master.Id), master);
|
||||
}
|
||||
[Test]
|
||||
public void Try_GetElementById_WhenNoRecord_Test()
|
||||
{
|
||||
Assert.That(() => _masterStorageContract.GetElementById(Guid.NewGuid().ToString()), Is.Null);
|
||||
}
|
||||
[Test]
|
||||
public void Try_GetElementByFIO_WhenHaveRecord_Test()
|
||||
{
|
||||
var master = InsertMasterToDatabaseAndReturn(Guid.NewGuid().ToString());
|
||||
AssertElement(_masterStorageContract.GetElementByFIO(master.FIO), master);
|
||||
}
|
||||
[Test]
|
||||
public void Try_GetElementByFIO_WhenNoRecord_Test()
|
||||
{
|
||||
Assert.That(() => _masterStorageContract.GetElementByFIO("New Fio"), Is.Null);
|
||||
}
|
||||
[Test]
|
||||
public void Try_AddElement_Test()
|
||||
{
|
||||
var master = CreateModel(Guid.NewGuid().ToString());
|
||||
_masterStorageContract.AddElement(master);
|
||||
AssertElement(GetMasterFromDatabase(master.Id), master);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Try_AddElement_WhenHaveRecordWithSameId_Test()
|
||||
{
|
||||
var master = CreateModel(Guid.NewGuid().ToString());
|
||||
InsertMasterToDatabaseAndReturn(master.Id);
|
||||
Assert.That(() => _masterStorageContract.AddElement(master), Throws.TypeOf<ElementExistsException>());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Try_UpdElement_Test()
|
||||
{
|
||||
var master = CreateModel(Guid.NewGuid().ToString(), "New Fio");
|
||||
InsertMasterToDatabaseAndReturn(master.Id);
|
||||
_masterStorageContract.UpdElement(master);
|
||||
AssertElement(GetMasterFromDatabase(master.Id), master);
|
||||
}
|
||||
[Test]
|
||||
public void Try_UpdElement_WhenNoRecordWithThisId_Test()
|
||||
{
|
||||
Assert.That(() => _masterStorageContract.UpdElement(CreateModel(Guid.NewGuid().ToString())),
|
||||
Throws.TypeOf<ElementNotFoundException>());
|
||||
}
|
||||
[Test]
|
||||
public void Try_UpdElement_WhenNoRecordWasDeleted_Test()
|
||||
{
|
||||
var master = CreateModel(Guid.NewGuid().ToString());
|
||||
InsertMasterToDatabaseAndReturn(master.Id, isDeleted: true);
|
||||
Assert.That(() => _masterStorageContract.UpdElement(master), Throws.TypeOf<ElementNotFoundException>());
|
||||
}
|
||||
[Test]
|
||||
public void Try_DelElement_Test()
|
||||
{
|
||||
var master = InsertMasterToDatabaseAndReturn(Guid.NewGuid().ToString());
|
||||
_masterStorageContract.DelElement(master.Id);
|
||||
var element = GetMasterFromDatabase(master.Id);
|
||||
Assert.That(element, Is.Not.Null);
|
||||
Assert.That(element.IsDeleted);
|
||||
}
|
||||
[Test]
|
||||
public void Try_DelElement_WhenNoRecordWasDeleted_Test()
|
||||
{
|
||||
var master = CreateModel(Guid.NewGuid().ToString());
|
||||
InsertMasterToDatabaseAndReturn(master.Id, isDeleted: true);
|
||||
Assert.That(() => _masterStorageContract.DelElement(master.Id), Throws.TypeOf<ElementNotFoundException>());
|
||||
}
|
||||
[Test]
|
||||
public void Try_DelElement_WhenNoRecordWithThisId_Test()
|
||||
{
|
||||
Assert.That(() => _masterStorageContract.DelElement(Guid.NewGuid().ToString()),
|
||||
Throws.TypeOf<ElementNotFoundException>());
|
||||
}
|
||||
|
||||
private Master InsertMasterToDatabaseAndReturn(string id, string fio = "test", string? postId = null, DateTime? birthDate = null, DateTime?
|
||||
employmentDate = null, bool isDeleted = false)
|
||||
{
|
||||
var master = new Master()
|
||||
{
|
||||
Id = id,
|
||||
FIO = fio,
|
||||
PostId = postId ??
|
||||
Guid.NewGuid().ToString(),
|
||||
BirthDate = birthDate ?? DateTime.UtcNow.AddYears(-
|
||||
20),
|
||||
EmploymentDate = employmentDate ?? DateTime.UtcNow,
|
||||
IsDeleted = isDeleted
|
||||
};
|
||||
TwoFromTheCasketDbContext.Masters.Add(master);
|
||||
TwoFromTheCasketDbContext.SaveChanges();
|
||||
return master;
|
||||
}
|
||||
private static void AssertElement(MasterDataModel? actual, Master expected)
|
||||
{
|
||||
Assert.That(actual, Is.Not.Null);
|
||||
Assert.Multiple(() =>
|
||||
{
|
||||
Assert.That(actual.Id, Is.EqualTo(expected.Id));
|
||||
Assert.That(actual.PostId, Is.EqualTo(expected.PostId));
|
||||
Assert.That(actual.FIO, Is.EqualTo(expected.FIO));
|
||||
Assert.That(actual.BirthDate, Is.EqualTo(expected.BirthDate));
|
||||
Assert.That(actual.EmploymentDate,
|
||||
Is.EqualTo(expected.EmploymentDate));
|
||||
Assert.That(actual.IsDeleted, Is.EqualTo(expected.IsDeleted));
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
private Master? GetMasterFromDatabase(string id) => TwoFromTheCasketDbContext.Masters.FirstOrDefault(x => x.Id == id);
|
||||
|
||||
|
||||
private static MasterDataModel CreateModel(string id, string fio = "fio", string? postId = null, DateTime? birthDate = null, DateTime? employmentDate = null,
|
||||
bool isDeleted = false) => new(id, fio, postId ?? Guid.NewGuid().ToString(), birthDate ??DateTime.UtcNow.AddYears(-20), employmentDate ?? DateTime.UtcNow, isDeleted);
|
||||
|
||||
private static void AssertElement(Master? actual, MasterDataModel expected)
|
||||
{
|
||||
Assert.That(actual, Is.Not.Null);
|
||||
|
||||
Assert.Multiple(() =>
|
||||
{
|
||||
Assert.That(actual.Id, Is.EqualTo(expected.Id));
|
||||
Assert.That(actual.PostId, Is.EqualTo(expected.PostId));
|
||||
Assert.That(actual.FIO, Is.EqualTo(expected.FIO));
|
||||
Assert.That(actual.BirthDate, Is.EqualTo(expected.BirthDate));
|
||||
Assert.That(actual.EmploymentDate, Is.EqualTo(expected.EmploymentDate));
|
||||
Assert.That(actual.IsDeleted, Is.EqualTo(expected.IsDeleted));
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,184 @@
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using TwoFromTheCasketContratcs.DataModels;
|
||||
using TwoFromTheCasketContratcs.Enums;
|
||||
using TwoFromTheCasketContratcs.Exceptions;
|
||||
using TwoFromTheCasketDatabase.Implementation;
|
||||
using TwoFromTheCasketDatabase.Models;
|
||||
using NUnit.Framework;
|
||||
using TwoFromTheCasketContratcs.StorageContracts;
|
||||
|
||||
namespace TwoFromTheCasketTest.StoragesContractsTests
|
||||
{
|
||||
[TestFixture]
|
||||
internal class OrderStorageContractTests : BaseStorageContractTest
|
||||
{
|
||||
private OrderStorageContract _orderStorageContract;
|
||||
|
||||
[SetUp]
|
||||
public void SetUp()
|
||||
{
|
||||
_orderStorageContract = new OrderStorageContract(TwoFromTheCasketDbContext);
|
||||
}
|
||||
|
||||
[TearDown]
|
||||
public void TearDown()
|
||||
{
|
||||
TwoFromTheCasketDbContext.Database.ExecuteSqlRaw("TRUNCATE \"Orders\" CASCADE;");
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Try_GetList_WhenHaveRecords_Test()
|
||||
{
|
||||
var order = InsertOrderToDatabaseAndReturn(Guid.NewGuid().ToString());
|
||||
InsertOrderToDatabaseAndReturn(Guid.NewGuid().ToString());
|
||||
InsertOrderToDatabaseAndReturn(Guid.NewGuid().ToString());
|
||||
var list = _orderStorageContract.GetList();
|
||||
Assert.That(list, Is.Not.Null);
|
||||
Assert.That(list, Has.Count.EqualTo(3));
|
||||
AssertElement(list.First(x => x.Id == order.Id), order);
|
||||
|
||||
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Try_GetList_WhenNoRecords_Test()
|
||||
{
|
||||
var list = _orderStorageContract.GetList();
|
||||
Assert.That(list, Is.Not.Null);
|
||||
Assert.That(list, Is.Empty);
|
||||
}
|
||||
[Test]
|
||||
public void Try_GetElementById_WhenHaveRecord_Test()
|
||||
{
|
||||
var service = InsertOrderToDatabaseAndReturn(Guid.NewGuid().ToString());
|
||||
AssertElement(_orderStorageContract.GetElementById(service.Id), service);
|
||||
}
|
||||
[Test]
|
||||
public void Try_GetElementByDate_WhenNoRecord_Test()
|
||||
{
|
||||
Assert.That(() => _orderStorageContract.GetElementByDate(DateTime.UtcNow), Is.Null);
|
||||
}
|
||||
[Test]
|
||||
public void Try_GetElementByDate_WhenHaveRecord_Test()
|
||||
{
|
||||
var order = InsertOrderToDatabaseAndReturn(Guid.NewGuid().ToString(), DateTime.UtcNow);
|
||||
InsertOrderToDatabaseAndReturn(Guid.NewGuid().ToString(), DateTime.UtcNow);
|
||||
Assert.That(order, Is.Not.Null);
|
||||
}
|
||||
[Test]
|
||||
public void Try_GetElementByStatus_WhenNoRecord_Test()
|
||||
{
|
||||
Assert.That(() => _orderStorageContract.GetElementByStatus(StatusType.None), Is.Null);
|
||||
}
|
||||
[Test]
|
||||
public void Try_GetElementByStatus_WhenHaveRecord_Test()
|
||||
{
|
||||
var order = InsertOrderToDatabaseAndReturn(Guid.NewGuid().ToString(), DateTime.UtcNow, StatusType.None);
|
||||
InsertOrderToDatabaseAndReturn(Guid.NewGuid().ToString(), DateTime.UtcNow, StatusType.None);
|
||||
Assert.That(order, Is.Not.Null);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Try_AddElement_Test()
|
||||
{
|
||||
var order = CreateModel(Guid.NewGuid().ToString());
|
||||
_orderStorageContract.AddElement(order);
|
||||
AssertElement(GetOrderFromDatabase(order.Id), order);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Try_AddElement_WhenHaveRecordWithSameId_Test()
|
||||
{
|
||||
var order = CreateModel(Guid.NewGuid().ToString());
|
||||
InsertOrderToDatabaseAndReturn(order.Id);
|
||||
Assert.That(() => _orderStorageContract.AddElement(order), Throws.TypeOf<ElementExistsException>());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Try_UpdElement_Test()
|
||||
{
|
||||
var order = CreateModel(Guid.NewGuid().ToString());
|
||||
InsertOrderToDatabaseAndReturn(order.Id);
|
||||
_orderStorageContract.UpdElement(order);
|
||||
AssertElement(GetOrderFromDatabase(order.Id), order);
|
||||
}
|
||||
[Test]
|
||||
public void Try_UpdElement_WhenNoRecordWithThisId_Test()
|
||||
{
|
||||
Assert.That(() => _orderStorageContract.UpdElement(CreateModel(Guid.NewGuid().ToString())),
|
||||
Throws.TypeOf<ElementNotFoundException>());
|
||||
}
|
||||
[Test]
|
||||
public void Try_DelElement_Test()
|
||||
{
|
||||
var order = InsertOrderToDatabaseAndReturn(Guid.NewGuid().ToString());
|
||||
|
||||
|
||||
_orderStorageContract.DelElement(order.Id);
|
||||
|
||||
|
||||
var element = GetOrderFromDatabase(order.Id);
|
||||
Assert.That(element, Is.Null);
|
||||
}
|
||||
[Test]
|
||||
public void Try_DelElement_WhenNoRecordWasDeleted_Test()
|
||||
{
|
||||
var order = CreateModel(Guid.NewGuid().ToString());
|
||||
Assert.That(() => _orderStorageContract.DelElement(order.Id), Throws.TypeOf<ElementNotFoundException>());
|
||||
}
|
||||
[Test]
|
||||
public void Try_DelElement_WhenNoRecordWithThisId_Test()
|
||||
{
|
||||
Assert.That(() => _orderStorageContract.DelElement(Guid.NewGuid().ToString()),
|
||||
Throws.TypeOf<ElementNotFoundException>());
|
||||
}
|
||||
|
||||
|
||||
|
||||
private Order InsertOrderToDatabaseAndReturn(string id, DateTime? date = null, StatusType? status = null, RoomType? roomType = null)
|
||||
{
|
||||
var order = new Order()
|
||||
{
|
||||
Id = id
|
||||
|
||||
};
|
||||
TwoFromTheCasketDbContext.Orders.Add(order);
|
||||
TwoFromTheCasketDbContext.SaveChanges();
|
||||
return order;
|
||||
}
|
||||
|
||||
private static void AssertElement(OrderDataModel? actual, Order expected)
|
||||
{
|
||||
Assert.That(actual, Is.Not.Null);
|
||||
Assert.Multiple(() =>
|
||||
{
|
||||
Assert.That(actual.Id, Is.EqualTo(expected.Id));
|
||||
Assert.That(actual.Status, Is.EqualTo(expected.Status));
|
||||
Assert.That(actual.Date, Is.EqualTo(expected.Date));
|
||||
Assert.That(actual.RoomType, Is.EqualTo(expected.RoomType));
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
private static OrderDataModel CreateModel(string id, DateTime? date = null, StatusType? status = null, RoomType? roomType = null) =>
|
||||
new(id, date ?? DateTime.UtcNow, status ?? StatusType.None, roomType ?? RoomType.None);
|
||||
|
||||
private Order? GetOrderFromDatabase(string id) => TwoFromTheCasketDbContext.Orders.FirstOrDefault(x => x.Id == id);
|
||||
|
||||
private static void AssertElement(Order? actual, OrderDataModel expected)
|
||||
{
|
||||
Assert.That(actual, Is.Not.Null);
|
||||
Assert.Multiple(() =>
|
||||
{
|
||||
Assert.That(actual.Id, Is.EqualTo(expected.Id));
|
||||
Assert.That(actual.Status, Is.EqualTo(expected.Status));
|
||||
Assert.That(actual.Date, Is.EqualTo(expected.Date));
|
||||
Assert.That(actual.RoomType, Is.EqualTo(expected.RoomType));
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,319 @@
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using TwoFromTheCasketContratcs.DataModels;
|
||||
using TwoFromTheCasketContratcs.Enums;
|
||||
using TwoFromTheCasketContratcs.Exceptions;
|
||||
using TwoFromTheCasketDatabase.Implementation;
|
||||
using TwoFromTheCasketDatabase.Models;
|
||||
|
||||
namespace TwoFromTheCasketTest.StoragesContractsTests;
|
||||
|
||||
[TestFixture]
|
||||
internal class PostStorageContractTests : BaseStorageContractTest
|
||||
{
|
||||
private PostStorageContract _postStorageContract;
|
||||
|
||||
[SetUp]
|
||||
public void SetUp()
|
||||
{
|
||||
_postStorageContract = new PostStorageContract(TwoFromTheCasketDbContext);
|
||||
}
|
||||
|
||||
[TearDown]
|
||||
public void TearDown()
|
||||
{
|
||||
TwoFromTheCasketDbContext.Database.ExecuteSqlRaw("TRUNCATE \"Posts\" CASCADE;");
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Try_GetList_WhenHaveRecords_Test()
|
||||
{
|
||||
var post = InsertPostToDatabaseAndReturn(Guid.NewGuid().ToString(), "name 1");
|
||||
InsertPostToDatabaseAndReturn(Guid.NewGuid().ToString(), "name 2");
|
||||
InsertPostToDatabaseAndReturn(Guid.NewGuid().ToString(), "name 3");
|
||||
var list = _postStorageContract.GetList();
|
||||
Assert.That(list, Is.Not.Null);
|
||||
Assert.That(list, Has.Count.EqualTo(3));
|
||||
AssertElement(list.First(x => x.Id == post.Id), post);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Try_GetList_WhenNoRecords_Test()
|
||||
{
|
||||
var list = _postStorageContract.GetList();
|
||||
Assert.That(list, Is.Not.Null);
|
||||
Assert.That(list, Is.Empty);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Try_GetList_OnlyActual_Test()
|
||||
{
|
||||
InsertPostToDatabaseAndReturn(Guid.NewGuid().ToString(), "name 1", isActual: true);
|
||||
InsertPostToDatabaseAndReturn(Guid.NewGuid().ToString(), "name 2", isActual: true);
|
||||
InsertPostToDatabaseAndReturn(Guid.NewGuid().ToString(), "name 3", isActual: false);
|
||||
var list = _postStorageContract.GetList(onlyActual: true);
|
||||
Assert.That(list, Is.Not.Null);
|
||||
Assert.Multiple(() =>
|
||||
{
|
||||
Assert.That(list, Has.Count.EqualTo(2));
|
||||
Assert.That(!list.Any(x => !x.IsActual));
|
||||
});
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Try_GetList_IncludeNoActual_Test()
|
||||
{
|
||||
InsertPostToDatabaseAndReturn(Guid.NewGuid().ToString(), "name 1", isActual: true);
|
||||
InsertPostToDatabaseAndReturn(Guid.NewGuid().ToString(), "name 2", isActual: true);
|
||||
InsertPostToDatabaseAndReturn(Guid.NewGuid().ToString(), "name 3", isActual: false);
|
||||
var list = _postStorageContract.GetList(onlyActual: false);
|
||||
Assert.That(list, Is.Not.Null);
|
||||
Assert.Multiple(() =>
|
||||
{
|
||||
Assert.That(list, Has.Count.EqualTo(3));
|
||||
Assert.That(list.Count(x => x.IsActual), Is.EqualTo(2));
|
||||
Assert.That(list.Count(x => !x.IsActual), Is.EqualTo(1));
|
||||
});
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Try_GetPostWithHistory_WhenHaveRecords_Test()
|
||||
{
|
||||
var postId = Guid.NewGuid().ToString();
|
||||
InsertPostToDatabaseAndReturn(Guid.NewGuid().ToString(), "name 1", isActual: true);
|
||||
InsertPostToDatabaseAndReturn(postId, "name 2", isActual: true);
|
||||
InsertPostToDatabaseAndReturn(postId, "name 2", isActual: false);
|
||||
var list = _postStorageContract.GetPostWithHistory(postId);
|
||||
Assert.That(list, Is.Not.Null);
|
||||
Assert.That(list, Has.Count.EqualTo(2));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Try_GetElementById_WhenHaveRecord_Test()
|
||||
{
|
||||
var post = InsertPostToDatabaseAndReturn(Guid.NewGuid().ToString());
|
||||
AssertElement(_postStorageContract.GetElementById(post.PostId), post);
|
||||
}
|
||||
[Test]
|
||||
public void Try_GetElementById_WhenNoRecord_Test()
|
||||
{
|
||||
InsertPostToDatabaseAndReturn(Guid.NewGuid().ToString());
|
||||
Assert.That(() => _postStorageContract.GetElementById(Guid.NewGuid().ToString()), Is.Null);
|
||||
}
|
||||
[Test]
|
||||
public void Try_GetElementById_WhenRecordHasDeleted_Test()
|
||||
{
|
||||
var post = InsertPostToDatabaseAndReturn(Guid.NewGuid().ToString(), isActual: false);
|
||||
Assert.That(() => _postStorageContract.GetElementById(post.PostId), Is.Null);
|
||||
}
|
||||
[Test]
|
||||
public void Try_GetElementById_WhenTrySearchById_Test()
|
||||
{
|
||||
var post = InsertPostToDatabaseAndReturn(Guid.NewGuid().ToString());
|
||||
Assert.That(() => _postStorageContract.GetElementById(post.Id), Is.Null);
|
||||
}
|
||||
[Test]
|
||||
public void Try_GetElementByName_WhenHaveRecord_Test()
|
||||
{
|
||||
var post = InsertPostToDatabaseAndReturn(Guid.NewGuid().ToString());
|
||||
AssertElement(_postStorageContract.GetElementByName(post.PostName), post);
|
||||
}
|
||||
[Test]
|
||||
public void Try_GetElementByName_WhenNoRecord_Test()
|
||||
{
|
||||
InsertPostToDatabaseAndReturn(Guid.NewGuid().ToString());
|
||||
Assert.That(() => _postStorageContract.GetElementByName("name"), Is.Null);
|
||||
}
|
||||
[Test]
|
||||
public void Try_GetElementByName_WhenRecordHasDeleted_Test()
|
||||
{
|
||||
var post = InsertPostToDatabaseAndReturn(Guid.NewGuid().ToString(), isActual: false);
|
||||
Assert.That(() => _postStorageContract.GetElementById(post.PostName), Is.Null);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Try_AddElement_Test()
|
||||
{
|
||||
var post = CreateModel(Guid.NewGuid().ToString(), isActual: true);
|
||||
_postStorageContract.AddElement(post);
|
||||
AssertElement(GetPostFromDatabaseByPostId(post.Id), post);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Try_AddElement_WhenActualIsFalse_Test()
|
||||
{
|
||||
var post = CreateModel(Guid.NewGuid().ToString(), isActual: false);
|
||||
Assert.That(() => _postStorageContract.AddElement(post), Throws.Nothing);
|
||||
AssertElement(GetPostFromDatabaseByPostId(post.Id), CreateModel(post.Id, isActual: true));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Try_AddElement_WhenHaveRecordWithSameName_Test()
|
||||
{
|
||||
var post = CreateModel(Guid.NewGuid().ToString(), "name unique", isActual: true);
|
||||
InsertPostToDatabaseAndReturn(Guid.NewGuid().ToString(), postName: post.PostName, isActual: true);
|
||||
Assert.That(() => _postStorageContract.AddElement(post), Throws.TypeOf<ElementExistsException>());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Try_AddElement_WhenHaveRecordWithSamePostIdAndActualIsTrue_Test()
|
||||
{
|
||||
var post = CreateModel(Guid.NewGuid().ToString(), isActual: true);
|
||||
InsertPostToDatabaseAndReturn(post.Id, isActual: true);
|
||||
Assert.That(() => _postStorageContract.AddElement(post), Throws.TypeOf<ElementExistsException>());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Try_UpdElement_Test()
|
||||
{
|
||||
var post = CreateModel(Guid.NewGuid().ToString());
|
||||
InsertPostToDatabaseAndReturn(post.Id, isActual: true);
|
||||
_postStorageContract.UpdElement(post);
|
||||
var posts = TwoFromTheCasketDbContext.Posts.Where(x => x.PostId == post.Id).OrderByDescending(x => x.ChangeDate);
|
||||
Assert.That(posts.Count(), Is.EqualTo(2));
|
||||
AssertElement(posts.First(), CreateModel(post.Id, isActual: true));
|
||||
AssertElement(posts.Last(), CreateModel(post.Id, isActual: false));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Try_UpdElement_WhenActualIsFalse_Test()
|
||||
{
|
||||
var post = CreateModel(Guid.NewGuid().ToString(), isActual: false);
|
||||
InsertPostToDatabaseAndReturn(post.Id, isActual: true);
|
||||
_postStorageContract.UpdElement(post);
|
||||
AssertElement(GetPostFromDatabaseByPostId(post.Id), CreateModel(post.Id, isActual: true));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Try_UpdElement_WhenNoRecordWithThisId_Test()
|
||||
{
|
||||
Assert.That(() => _postStorageContract.UpdElement(CreateModel(Guid.NewGuid().ToString())),
|
||||
Throws.TypeOf<ElementNotFoundException>());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Try_UpdElement_WhenHaveRecordWithSameName_Test()
|
||||
{
|
||||
var post = CreateModel(Guid.NewGuid().ToString(), "New Name");
|
||||
InsertPostToDatabaseAndReturn(post.Id, postName: "name");
|
||||
InsertPostToDatabaseAndReturn(Guid.NewGuid().ToString(), postName: post.PostName);
|
||||
Assert.That(() => _postStorageContract.UpdElement(post), Throws.TypeOf<ElementExistsException>());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Try_UpdElement_WhenRecordWasDeleted_Test()
|
||||
{
|
||||
var post = CreateModel(Guid.NewGuid().ToString());
|
||||
InsertPostToDatabaseAndReturn(post.Id, isActual: false);
|
||||
Assert.That(() => _postStorageContract.UpdElement(post), Throws.TypeOf<ElementDeletedException>());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Try_DelElement_Test()
|
||||
{
|
||||
var post = InsertPostToDatabaseAndReturn(Guid.NewGuid().ToString(), isActual: true);
|
||||
_postStorageContract.DelElement(post.PostId);
|
||||
var element = GetPostFromDatabaseByPostId(post.PostId);
|
||||
Assert.Multiple(() =>
|
||||
{
|
||||
Assert.That(element, Is.Not.Null);
|
||||
Assert.That(!element!.IsActual);
|
||||
});
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Try_DelElement_WhenNoRecordWithThisId_Test()
|
||||
{
|
||||
Assert.That(() => _postStorageContract.DelElement(Guid.NewGuid().ToString()),
|
||||
Throws.TypeOf<ElementNotFoundException>());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Try_DelElement_WhenRecordWasDeleted_Test()
|
||||
{
|
||||
var post = InsertPostToDatabaseAndReturn(Guid.NewGuid().ToString(), isActual: false);
|
||||
Assert.That(() => _postStorageContract.DelElement(post.PostId), Throws.TypeOf<ElementDeletedException>());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Try_ResElement_Test()
|
||||
{
|
||||
var post = InsertPostToDatabaseAndReturn(Guid.NewGuid().ToString(), isActual: false);
|
||||
_postStorageContract.ResElement(post.PostId);
|
||||
var element = GetPostFromDatabaseByPostId(post.PostId);
|
||||
Assert.Multiple(() =>
|
||||
{
|
||||
Assert.That(element, Is.Not.Null);
|
||||
Assert.That(element!.IsActual);
|
||||
});
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Try_ResElement_WhenNoRecordWithThisId_Test()
|
||||
{
|
||||
Assert.That(() => _postStorageContract.ResElement(Guid.NewGuid().ToString()),
|
||||
Throws.TypeOf<ElementNotFoundException>());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Try_ResElement_WhenRecordNotWasDeleted_Test()
|
||||
{
|
||||
var post = InsertPostToDatabaseAndReturn(Guid.NewGuid().ToString(), isActual: true);
|
||||
Assert.That(() => _postStorageContract.ResElement(post.PostId), Throws.Nothing);
|
||||
}
|
||||
|
||||
private Post InsertPostToDatabaseAndReturn(string id, string postName = "test",
|
||||
PostType postType = PostType.None, double salary = 10, bool isActual = true, DateTime? changeDate = null)
|
||||
{
|
||||
var post = new Post()
|
||||
{
|
||||
Id = Guid.NewGuid().ToString(),
|
||||
PostId = id,
|
||||
PostName = postName,
|
||||
PostType = postType,
|
||||
Salary = salary,
|
||||
IsActual = isActual,
|
||||
ChangeDate = changeDate ?? DateTime.UtcNow
|
||||
};
|
||||
TwoFromTheCasketDbContext.Posts.Add(post);
|
||||
TwoFromTheCasketDbContext.SaveChanges();
|
||||
return post;
|
||||
}
|
||||
|
||||
private static void AssertElement(PostDataModel? actual, Post expected)
|
||||
{
|
||||
Assert.That(actual, Is.Not.Null);
|
||||
Assert.Multiple(() =>
|
||||
{
|
||||
Assert.That(actual.Id, Is.EqualTo(expected.Id));
|
||||
Assert.That(actual.PostName, Is.EqualTo(expected.PostName));
|
||||
Assert.That(actual.PostType, Is.EqualTo(expected.PostType));
|
||||
Assert.That(actual.Salary, Is.EqualTo(expected.Salary));
|
||||
Assert.That(actual.IsActual, Is.EqualTo(expected.IsActual));
|
||||
});
|
||||
}
|
||||
|
||||
private static PostDataModel CreateModel(string postId, string postName = "test",
|
||||
PostType postType = PostType.None, double salary = 10, bool isActual = false, DateTime? changeDate = null)
|
||||
=> new(postId, postName, postType, salary, isActual, changeDate ?? DateTime.UtcNow);
|
||||
|
||||
private Post? GetPostFromDatabaseByPostId(string id) => TwoFromTheCasketDbContext.Posts.Where(x => x.PostId == id)
|
||||
.OrderByDescending(x => x.ChangeDate).FirstOrDefault();
|
||||
|
||||
private static void AssertElement(Post? actual, PostDataModel expected)
|
||||
{
|
||||
Assert.That(actual, Is.Not.Null);
|
||||
Assert.Multiple(() =>
|
||||
{
|
||||
Assert.That(actual.PostId, Is.EqualTo(expected.Id));
|
||||
Assert.That(actual.PostName, Is.EqualTo(expected.PostName));
|
||||
Assert.That(actual.PostType, Is.EqualTo(expected.PostType));
|
||||
Assert.That(actual.Salary, Is.EqualTo(expected.Salary));
|
||||
Assert.That(actual.IsActual, Is.EqualTo(expected.IsActual));
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,157 @@
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using TwoFromTheCasketContratcs.DataModels;
|
||||
using TwoFromTheCasketDatabase;
|
||||
using TwoFromTheCasketDatabase.Implementation;
|
||||
using TwoFromTheCasketDatabase.Models;
|
||||
|
||||
namespace TwoFromTheCasketTest.StoragesContractsTests;
|
||||
|
||||
[TestFixture]
|
||||
internal class SalaryStorageContractTests : BaseStorageContractTest
|
||||
{
|
||||
private SalaryStorageContract _salaryStorageContract;
|
||||
private Master _master;
|
||||
|
||||
[SetUp]
|
||||
public void SetUp()
|
||||
{
|
||||
_salaryStorageContract = new SalaryStorageContract(TwoFromTheCasketDbContext);
|
||||
_master = InsertMasterToDatabaseAndReturn();
|
||||
}
|
||||
|
||||
[TearDown]
|
||||
public void TearDown()
|
||||
{
|
||||
TwoFromTheCasketDbContext.Database.ExecuteSqlRaw("TRUNCATE \"Salaries\" CASCADE;");
|
||||
TwoFromTheCasketDbContext.Database.ExecuteSqlRaw("TRUNCATE \"Masters\" CASCADE;");
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Try_GetList_WhenHaveRecords_Test()
|
||||
{
|
||||
var masterId = Guid.NewGuid().ToString();
|
||||
var salary = InsertSalaryToDatabaseAndReturn(masterId, salarySize: 100);
|
||||
InsertSalaryToDatabaseAndReturn(masterId);
|
||||
InsertSalaryToDatabaseAndReturn(masterId);
|
||||
var list = _salaryStorageContract.GetList(DateTime.UtcNow.AddDays(-10), DateTime.UtcNow.AddDays(10));
|
||||
Assert.That(list, Is.Not.Null);
|
||||
Assert.That(list, Has.Count.EqualTo(3));
|
||||
AssertElement(list.First(), salary);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Try_GetList_WhenNoRecords_Test()
|
||||
{
|
||||
var list = _salaryStorageContract.GetList(DateTime.UtcNow.AddDays(-10), DateTime.UtcNow.AddDays(10));
|
||||
Assert.That(list, Is.Not.Null);
|
||||
Assert.That(list, Is.Empty);
|
||||
}
|
||||
[Test]
|
||||
public void Try_GetList_OnlyInDatePeriod_Test()
|
||||
{
|
||||
InsertSalaryToDatabaseAndReturn(_master.Id, salaryDate: DateTime.UtcNow.AddDays(-2));
|
||||
InsertSalaryToDatabaseAndReturn(_master.Id, salaryDate: DateTime.UtcNow.AddDays(-1).AddMinutes(-5));
|
||||
InsertSalaryToDatabaseAndReturn(_master.Id, salaryDate: DateTime.UtcNow.AddDays(-1).AddMinutes(5));
|
||||
InsertSalaryToDatabaseAndReturn(_master.Id, salaryDate: DateTime.UtcNow.AddDays(1).AddMinutes(-5));
|
||||
InsertSalaryToDatabaseAndReturn(_master.Id, salaryDate: DateTime.UtcNow.AddDays(1).AddMinutes(5));
|
||||
InsertSalaryToDatabaseAndReturn(_master.Id, salaryDate: DateTime.UtcNow.AddDays(-2));
|
||||
var list = _salaryStorageContract.GetList(DateTime.UtcNow.AddDays(-1), DateTime.UtcNow.AddDays(1));
|
||||
Assert.That(list, Is.Not.Null);
|
||||
Assert.Multiple(() => { Assert.That(list, Has.Count.EqualTo(2)); });
|
||||
}
|
||||
[Test]
|
||||
public void Try_GetList_ByMaster_Test()
|
||||
{
|
||||
var master = InsertMasterToDatabaseAndReturn(Guid.NewGuid().ToString());
|
||||
InsertSalaryToDatabaseAndReturn(_master.Id);
|
||||
InsertSalaryToDatabaseAndReturn(_master.Id);
|
||||
InsertSalaryToDatabaseAndReturn(master.Id);
|
||||
var list = _salaryStorageContract.GetList(DateTime.UtcNow.AddDays(-1), DateTime.UtcNow.AddDays(1), _master.Id);
|
||||
Assert.That(list, Is.Not.Null);
|
||||
Assert.Multiple(() =>
|
||||
{
|
||||
Assert.That(list, Has.Count.EqualTo(2));
|
||||
Assert.That(list.All(x => x.MasterId == _master.Id));
|
||||
});
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Try_GetList_ByMasterOnlyInDatePeriod_Test()
|
||||
{
|
||||
var master = InsertMasterToDatabaseAndReturn(Guid.NewGuid().ToString());
|
||||
InsertSalaryToDatabaseAndReturn(_master.Id, salaryDate: DateTime.UtcNow.AddDays(-2));
|
||||
InsertSalaryToDatabaseAndReturn(_master.Id, salaryDate: DateTime.UtcNow.AddDays(-1).AddMinutes(5));
|
||||
InsertSalaryToDatabaseAndReturn(master.Id, salaryDate: DateTime.UtcNow.AddDays(-1).AddMinutes(5));
|
||||
InsertSalaryToDatabaseAndReturn(_master.Id, salaryDate: DateTime.UtcNow.AddDays(1).AddMinutes(-5));
|
||||
InsertSalaryToDatabaseAndReturn(master.Id, salaryDate: DateTime.UtcNow.AddDays(1).AddMinutes(-5));
|
||||
InsertSalaryToDatabaseAndReturn(_master.Id, salaryDate: DateTime.UtcNow.AddDays(-2));
|
||||
var list = _salaryStorageContract.GetList(DateTime.UtcNow.AddDays(-1), DateTime.UtcNow.AddDays(1), _master.Id);
|
||||
Assert.That(list, Is.Not.Null);
|
||||
Assert.Multiple(() =>
|
||||
{
|
||||
Assert.That(list, Has.Count.EqualTo(2));
|
||||
Assert.That(list.All(x => x.MasterId == _master.Id));
|
||||
});
|
||||
}
|
||||
[Test]
|
||||
public void Try_AddElement_Test()
|
||||
{
|
||||
var salary = CreateModel(_master.Id);
|
||||
_salaryStorageContract.AddElement(salary);
|
||||
AssertElement(GetSalaryFromDatabaseByMasterId(_master.Id), salary);
|
||||
}
|
||||
|
||||
private Master InsertMasterToDatabaseAndReturn(string masterFIO = "fio fio fio")
|
||||
{
|
||||
var master = new Master()
|
||||
{
|
||||
Id = Guid.NewGuid().ToString(),
|
||||
PostId = Guid.NewGuid().ToString(),
|
||||
FIO = masterFIO,
|
||||
IsDeleted = false
|
||||
};
|
||||
TwoFromTheCasketDbContext.Masters.Add(master);
|
||||
TwoFromTheCasketDbContext.SaveChanges();
|
||||
return master;
|
||||
}
|
||||
private Salary InsertSalaryToDatabaseAndReturn(string masterId, double salarySize = 1,
|
||||
DateTime? salaryDate = null)
|
||||
{
|
||||
var salary = new Salary()
|
||||
{ MasterId = masterId, SalarySize = salarySize, SalaryDate = salaryDate ?? DateTime.UtcNow };
|
||||
TwoFromTheCasketDbContext.Salaries.Add(salary);
|
||||
TwoFromTheCasketDbContext.SaveChanges();
|
||||
return salary;
|
||||
}
|
||||
|
||||
private static void AssertElement(SalaryDataModel? actual, Salary expected)
|
||||
{
|
||||
Assert.That(actual, Is.Not.Null);
|
||||
Assert.Multiple(() =>
|
||||
{
|
||||
Assert.That(actual.MasterId, Is.EqualTo(expected.MasterId));
|
||||
Assert.That(actual.Salary, Is.EqualTo(expected.SalarySize));
|
||||
});
|
||||
}
|
||||
|
||||
private static SalaryDataModel CreateModel(string workerId, DateTime? salaryDate = null, double workerSalary = 1,double salarySize = 1) => new(workerId,
|
||||
salaryDate ?? DateTime.UtcNow, workerSalary, salarySize);
|
||||
|
||||
private Salary? GetSalaryFromDatabaseByMasterId(string id) =>
|
||||
TwoFromTheCasketDbContext.Salaries.FirstOrDefault(x => x.MasterId == id);
|
||||
|
||||
private static void AssertElement(Salary? actual, SalaryDataModel expected)
|
||||
{
|
||||
Assert.That(actual, Is.Not.Null);
|
||||
Assert.Multiple(() =>
|
||||
{
|
||||
Assert.That(actual.MasterId, Is.EqualTo(expected.MasterId));
|
||||
Assert.That(actual.SalarySize, Is.EqualTo(expected.Salary));
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,208 @@
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Microsoft.EntityFrameworkCore.Infrastructure;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel.DataAnnotations.Schema;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using TwoFromTheCasketContratcs.DataModels;
|
||||
using TwoFromTheCasketContratcs.Enums;
|
||||
using TwoFromTheCasketContratcs.Exceptions;
|
||||
using TwoFromTheCasketContratcs.StorageContracts;
|
||||
using TwoFromTheCasketDatabase.Implementation;
|
||||
using TwoFromTheCasketDatabase.Models;
|
||||
|
||||
namespace TwoFromTheCasketTest.StoragesContractsTests;
|
||||
|
||||
[TestFixture]
|
||||
internal class ServiceStorageContractTests : BaseStorageContractTest
|
||||
{
|
||||
private ServiceStorageContract _serviceStorageContract;
|
||||
|
||||
[SetUp]
|
||||
public void SetUp()
|
||||
{
|
||||
_serviceStorageContract = new ServiceStorageContract(TwoFromTheCasketDbContext);
|
||||
}
|
||||
|
||||
[TearDown]
|
||||
public void TearDown()
|
||||
{
|
||||
TwoFromTheCasketDbContext.Database.ExecuteSqlRaw("TRUNCATE \"Services\" CASCADE;");
|
||||
|
||||
}
|
||||
|
||||
|
||||
[Test]
|
||||
public void Try_GetList_WhenHaveRecords_Test()
|
||||
{
|
||||
var service =
|
||||
InsertServiceToDatabaseAndReturn(Guid.NewGuid().ToString(), "fio 1");
|
||||
InsertServiceToDatabaseAndReturn(Guid.NewGuid().ToString(), "fio 2");
|
||||
InsertServiceToDatabaseAndReturn(Guid.NewGuid().ToString(), "fio 3");
|
||||
var list = _serviceStorageContract.GetList();
|
||||
Assert.That(list, Is.Not.Null);
|
||||
Assert.That(list, Has.Count.EqualTo(3));
|
||||
AssertElement(list.First(), service);
|
||||
}
|
||||
[Test]
|
||||
public void Try_GetList_WhenNoRecords_Test()
|
||||
{
|
||||
var list = _serviceStorageContract.GetList();
|
||||
Assert.That(list, Is.Not.Null);
|
||||
Assert.That(list, Is.Empty);
|
||||
}
|
||||
[Test]
|
||||
public void Try_GetElementById_WhenHaveRecord_Test()
|
||||
{
|
||||
var service = InsertServiceToDatabaseAndReturn(Guid.NewGuid().ToString());
|
||||
AssertElement(_serviceStorageContract.GetElementById(service.Id), service);
|
||||
}
|
||||
[Test]
|
||||
public void Try_GetElementById_WhenNoRecord_Test()
|
||||
{
|
||||
Assert.That(() => _serviceStorageContract.GetElementById(Guid.NewGuid().ToString()), Is.Null);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Try_GetElementByMasterId_WhenHaveRecord_Test()
|
||||
{
|
||||
var masterId = Guid.NewGuid().ToString();
|
||||
InsertServiceToDatabaseAndReturn(Guid.NewGuid().ToString(), "name 1", masterId);
|
||||
InsertServiceToDatabaseAndReturn(Guid.NewGuid().ToString(), "name 2", masterId);
|
||||
InsertServiceToDatabaseAndReturn(Guid.NewGuid().ToString(), "name 3", masterId);
|
||||
var list = _serviceStorageContract.GetElementByMasterId(masterId);
|
||||
Assert.That(list, Is.Not.Null);
|
||||
Assert.That(list, Has.Count.EqualTo(3));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Try_GetElementByMasterId_WhenNoRecords_Test()
|
||||
{
|
||||
var serviceId = Guid.NewGuid().ToString();
|
||||
var list = _serviceStorageContract.GetElementByMasterId(serviceId);
|
||||
Assert.That(list, Is.Not.Null);
|
||||
Assert.That(list, Is.Empty);
|
||||
}
|
||||
[Test]
|
||||
public void Try_GetElementByServiceName_WhenHaveRecord_Test()
|
||||
{
|
||||
var name = "name 1";
|
||||
InsertServiceToDatabaseAndReturn(Guid.NewGuid().ToString(), "name 1");
|
||||
InsertServiceToDatabaseAndReturn(Guid.NewGuid().ToString(), "name 2");
|
||||
var list = _serviceStorageContract.GetElementByServiceName(name);
|
||||
Assert.That(list, Is.Not.Null);
|
||||
Assert.That(list, Has.Count.EqualTo(2));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Try_GetElementByServiceName_WhenNoRecords_Test()
|
||||
{
|
||||
var name = "name 1";
|
||||
var list = _serviceStorageContract.GetElementByMasterId(name);
|
||||
Assert.That(list, Is.Not.Null);
|
||||
Assert.That(list, Is.Empty);
|
||||
}
|
||||
[Test]
|
||||
public void Try_GetServicetWithHistory_WhenHaveRecords_Test()
|
||||
{
|
||||
var serviceId = Guid.NewGuid().ToString();
|
||||
InsertServiceToDatabaseAndReturn(Guid.NewGuid().ToString(), "name 1");
|
||||
InsertServiceToDatabaseAndReturn(serviceId, "name 2");
|
||||
|
||||
var list = _serviceStorageContract.GetHistoryByServiceId(serviceId);
|
||||
Assert.That(list, Is.Not.Null);
|
||||
Assert.That(list, Has.Count.EqualTo(0));
|
||||
}
|
||||
[Test]
|
||||
public void Try_AddElement_Test()
|
||||
{
|
||||
var service = CreateModel(Guid.NewGuid().ToString());
|
||||
_serviceStorageContract.AddElement(service);
|
||||
AssertElement(service, GetServiceFromDatabase(service.Id));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Try_AddElement_WhenHaveRecordWithSameId_Test()
|
||||
{
|
||||
var service = CreateModel(Guid.NewGuid().ToString());
|
||||
InsertServiceToDatabaseAndReturn(service.Id);
|
||||
Assert.That(() => _serviceStorageContract.AddElement(service), Throws.TypeOf<ElementExistsException>());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Try_UpdElement_Test()
|
||||
{
|
||||
var service = CreateModel(Guid.NewGuid().ToString(), "New Fio");
|
||||
InsertServiceToDatabaseAndReturn(service.Id);
|
||||
_serviceStorageContract.UpdElement(service);
|
||||
AssertElement(service, GetServiceFromDatabase(service.Id));
|
||||
}
|
||||
[Test]
|
||||
public void Try_UpdElement_WhenNoRecordWithThisId_Test()
|
||||
{
|
||||
Assert.That(() => _serviceStorageContract.UpdElement(CreateModel(Guid.NewGuid().ToString())),
|
||||
Throws.TypeOf<ElementNotFoundException>());
|
||||
}
|
||||
[Test]
|
||||
public void Try_UpdElement_WhenNoRecordWasDeleted_Test()
|
||||
{
|
||||
var service = CreateModel(Guid.NewGuid().ToString());
|
||||
InsertServiceToDatabaseAndReturn(service.Id, isDeleted: true);
|
||||
Assert.That(() => _serviceStorageContract.UpdElement(service), Throws.TypeOf<ElementNotFoundException>());
|
||||
}
|
||||
[Test]
|
||||
public void Try_DelElement_Test()
|
||||
{
|
||||
var service = InsertServiceToDatabaseAndReturn(Guid.NewGuid().ToString(), "sads", Guid.NewGuid().ToString());
|
||||
_serviceStorageContract.DelElement(service.Id);
|
||||
var element = GetServiceFromDatabase(service.Id);
|
||||
Assert.That(element, Is.Not.Null);
|
||||
Assert.That(element.IsDeleted);
|
||||
}
|
||||
[Test]
|
||||
public void Try_DelElement_WhenNoRecordWasDeleted_Test()
|
||||
{
|
||||
var master = CreateModel(Guid.NewGuid().ToString());
|
||||
InsertServiceToDatabaseAndReturn(master.Id, isDeleted: true);
|
||||
Assert.That(() => _serviceStorageContract.DelElement(master.Id), Throws.TypeOf<ElementNotFoundException>());
|
||||
}
|
||||
[Test]
|
||||
public void Try_DelElement_WhenNoRecordWithThisId_Test()
|
||||
{
|
||||
Assert.That(() => _serviceStorageContract.DelElement(Guid.NewGuid().ToString()),
|
||||
Throws.TypeOf<ElementNotFoundException>());
|
||||
}
|
||||
private Service InsertServiceToDatabaseAndReturn(string id, string serviceName = "test", string masterId = "id-1", ServiceType serviceType = ServiceType.Plastering, double price = 1, bool isDeleted = false)
|
||||
{
|
||||
var servise = new Service()
|
||||
{
|
||||
Id = id,
|
||||
ServiceName = serviceName,
|
||||
ServiceType = serviceType,
|
||||
MasterId = masterId,
|
||||
Price = price,
|
||||
IsDeleted = isDeleted
|
||||
};
|
||||
TwoFromTheCasketDbContext.Services.Add(servise);
|
||||
TwoFromTheCasketDbContext.SaveChanges();
|
||||
return servise;
|
||||
}
|
||||
private Service? GetServiceFromDatabase(string id) => TwoFromTheCasketDbContext.Services.FirstOrDefault(x => x.Id == id);
|
||||
|
||||
private static void AssertElement(ServiceDataModel actual, Service expected)
|
||||
{
|
||||
Assert.That(actual, Is.Not.Null);
|
||||
Assert.Multiple(() =>
|
||||
{
|
||||
Assert.That(actual.Id, Is.EqualTo(expected.Id));
|
||||
Assert.That(actual.Price, Is.EqualTo(expected.Price));
|
||||
Assert.That(actual.ServiceName, Is.EqualTo(expected.ServiceName));
|
||||
Assert.That(actual.ServiceType, Is.EqualTo(expected.ServiceType));
|
||||
Assert.That(actual.MasterId, Is.EqualTo(expected.MasterId));
|
||||
Assert.That(actual.IsDeleted, Is.EqualTo(expected.IsDeleted));
|
||||
});
|
||||
}
|
||||
private static ServiceDataModel CreateModel(string id, string serviceName = "test", string masterId = "id-1", ServiceType serviceType = ServiceType.Plastering, double price = 1, bool isDeleted = false) => new(id,serviceName, serviceType,masterId, price, isDeleted);
|
||||
}
|
||||
@@ -12,6 +12,7 @@
|
||||
<PackageReference Include="coverlet.collector" Version="6.0.2" />
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.11.1" />
|
||||
<PackageReference Include="Moq" Version="4.20.72" />
|
||||
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="9.0.4" />
|
||||
<PackageReference Include="NUnit" Version="4.2.2" />
|
||||
<PackageReference Include="NUnit.Analyzers" Version="4.3.0" />
|
||||
<PackageReference Include="NUnit3TestAdapter" Version="4.6.0" />
|
||||
@@ -20,6 +21,7 @@
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\TwoFromTheCasketBuisnessLogic\TwoFromTheCasketBuisnessLogic.csproj" />
|
||||
<ProjectReference Include="..\TwoFromTheCasketContratcs\TwoFromTheCasketContratcs.csproj" />
|
||||
<ProjectReference Include="..\TwoFromTheCasketDatabase\TwoFromTheCasketDatabase.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
||||
Reference in New Issue
Block a user