lab_4 complete

This commit is contained in:
2025-04-10 09:07:45 +04:00
parent 5e249e488c
commit fddb9c9d83
37 changed files with 1786 additions and 178 deletions

View File

@@ -57,22 +57,17 @@ internal class SalaryBusinessLogicContract(ISalaryStorageContract salaryStorageC
{
_logger.LogInformation("CalculateSalaryByMounth: {date}", date);
var startDate = new DateTime(date.Year, date.Month, 1);
var finishDate = new DateTime(date.Year, date.Month,
DateTime.DaysInMonth(date.Year, date.Month));
var workers = _workerStorageContract.GetList() ?? throw new
NullListException();
var finishDate = new DateTime(date.Year, date.Month, DateTime.DaysInMonth(date.Year, date.Month));
var workers = _workerStorageContract.GetList() ?? throw new NullListException();
foreach (var worker in workers)
{
var requests = _requestStorageContract.GetList(startDate,
finishDate, workerId: worker.Id)?.Sum(x => x.Sum) ??
throw new NullListException();
var post = _postStorageContract.GetElementById(worker.PostId)
??
throw new NullListException();
var requests = _requestStorageContract.GetList(startDate, finishDate, workerId: worker.Id)?.Sum(x => x.Sum) ??
throw new NullListException();
var post = _postStorageContract.GetElementById(worker.PostId) ??
throw new NullListException();
var salary = post.Salary + requests * 0.1;
_logger.LogDebug("The employee {workerId} was paid a salary of { salary} ", worker.Id, salary);
_salaryStorageContract.AddElement(new
SalaryDataModel(worker.Id, finishDate, salary));
_logger.LogDebug("The employee {workerId} was paid a salary of {salary}", worker.Id, salary);
_salaryStorageContract.AddElement(new SalaryDataModel(worker.Id, finishDate, salary));
}
}
}

View File

@@ -0,0 +1,15 @@
using SmallSoftwareContracts.AdapterContracts.OperationResponses;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SmallSoftwareContracts.AdapterContracts;
public interface ISalaryAdapter
{
SalaryOperationResponse GetListByPeriod(DateTime fromDate, DateTime toDate);
SalaryOperationResponse GetListByPeriodByWorker(DateTime fromDate, DateTime toDate, string workerId);
SalaryOperationResponse CalculateSalary(DateTime date);
}

View File

@@ -0,0 +1,23 @@
using SmallSoftwareContracts.AdapterContracts.OperationResponses;
using SmallSoftwareContracts.BindingModels;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SmallSoftwareContracts.AdapterContracts;
public interface IWorkerAdapter
{
WorkerOperationResponse GetList(bool includeDeleted);
WorkerOperationResponse GetPostList(string id, bool includeDeleted);
WorkerOperationResponse GetListByBirthDate(DateTime fromDate, DateTime toDate, bool includeDeleted);
WorkerOperationResponse GetListByEmploymentDate(DateTime fromDate, DateTime
toDate, bool includeDeleted);
WorkerOperationResponse GetElement(string data);
WorkerOperationResponse RegisterWorker(WorkerBindingModel workerModel);
WorkerOperationResponse ChangeWorkerInfo(WorkerBindingModel workerModel);
WorkerOperationResponse RemoveWorker(string id);
}

View File

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

View File

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

View File

@@ -5,7 +5,6 @@ namespace SmallSoftwareContracts.BindingModels;
public class RequestBindingModel
{
public string? Id { get; set; }
public string? WorkerId { get; set; }
public string? Email { get; set; }
public string? WorkerId { get; set; }
public List<InstallationRequestBindingModel>? Softwares { get; set; }
}

View File

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

View File

@@ -12,10 +12,7 @@ public interface IRequestBusinessLogicContract
List<RequestDataModel> GetAllRequestsByPeriod(DateTime fromDate, DateTime toDate);
List<RequestDataModel> GetAllRequestsByWorkerByPeriod(string workerId, DateTime fromDate, DateTime toDate);
List<RequestDataModel> GetAllRequestsBySoftwareByPeriod(string softwareId, DateTime fromDate, DateTime toDate);
RequestDataModel GetRequestByData(string data);
void InsertRequest(RequestDataModel requestDataModel);
void CancelRequest(string id);

View File

@@ -13,12 +13,13 @@ public class RequestDataModel : IValidation
private readonly WorkerDataModel? _worker;
public string Id { get; private set; }
public string WorkerId { get; private set; }
public DateTime RequestDate { get; private set; } = DateTime.UtcNow;
public string Email { get; private set; }
public double Sum { get; private set; }
public bool IsCancel { get; private set; }
public List<InstallationRequestDataModel>? Softwares { get; private set; }
public string WorkerFIO => _worker?.FIO ?? string.Empty;
public RequestDataModel(string id, string workerId, string email, bool isCancel, List<InstallationRequestDataModel> installationRequests)
public RequestDataModel(string id, string workerId, string email, bool isCancel, List<InstallationRequestDataModel> installationRequests, DateTime requestDate)
{
Id = id;
WorkerId = workerId;
@@ -27,26 +28,29 @@ public class RequestDataModel : IValidation
Softwares = installationRequests;
Sum = Softwares?.Sum(x => x.Price * x.Count) ?? 0;
}
public RequestDataModel(string id, string workerId, string email, double sum, bool isCancel,
List<InstallationRequestDataModel> installationRequests, WorkerDataModel worker) : this(id, workerId, email,isCancel, installationRequests )
public RequestDataModel(string id, string workerId, string email, double sum, bool isCancel,
List<InstallationRequestDataModel> installationRequests, WorkerDataModel worker, DateTime requestDate)
: this(id, workerId, email, isCancel, installationRequests, requestDate)
{
Sum = sum;
_worker = worker;
}
public void Validate()
{
if (Id.IsEmpty())
throw new ValidationException("Field Id is empty");
if (!Id.IsGuid())
throw new ValidationException("The value in the field Id is not a unique identifier");
if (WorkerId.IsEmpty())
if (WorkerId.IsEmpty())
throw new ValidationException("Field WorkerId is empty");
if (!WorkerId.IsGuid())
throw new ValidationException("The value in the field WorkerId is not a unique identifier");
if (Sum <= 0)
throw new ValidationException("Field Sum is less than or equal to 0");
if ((Softwares?.Count ?? 0) == 0)
if (Sum <= 0)
throw new ValidationException("Field Sum is less than or equal to 0");
if ((Softwares?.Count ?? 0) == 0)
throw new ValidationException("The request must include products");
if (!Regex.IsMatch(Email, @"^[^@\s]+@[^@\s]+\.[^@\s]+$"))
{

View File

@@ -1,20 +1,23 @@
using SmallSoftwareContracts.Exceptions;
using SmallSoftwareContracts.Extensions;
using SmallSoftwareContracts.Infrastructure;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SmallSoftwareContracts.DataModels;
public class SalaryDataModel(string workerId, DateTime salaryDate, double
workerSalary) : IValidation
{
private readonly WorkerDataModel? _worker;
public string WorkerId { get; private set; } = workerId;
public DateTime SalaryDate { get; private set; } = salaryDate;
public double Salary { get; private set; } = workerSalary;
public string WorkerFIO => _worker?.FIO ?? string.Empty;
public SalaryDataModel(string workerId, DateTime salaryDate, double workerSalary, WorkerDataModel worker) : this(workerId, salaryDate, workerSalary)
{
_worker = worker;
}
public void Validate()
{
if (WorkerId.IsEmpty())

View File

@@ -7,12 +7,26 @@ namespace SmallSoftwareContracts.DataModels;
public class WorkerDataModel(string id, string fio, string postId, DateTime
birthDate, DateTime employmentDate, bool isDeleted) : IValidation
{
private readonly PostDataModel? _post;
public string Id { get; private set; } = id;
public string FIO { get; private set; } = fio;
public string PostId { get; private set; } = postId;
public DateTime BirthDate { get; private set; } = birthDate;
public DateTime EmploymentDate { get; private set; } = employmentDate;
public bool IsDeleted { get; private set; } = isDeleted;
public string PostName => _post?.PostName ?? string.Empty;
public WorkerDataModel(string id, string fio, string postId,
DateTime birthDate, DateTime employmentDate, bool isDeleted, PostDataModel post) :
this(id, fio, postId, birthDate, employmentDate, isDeleted)
{
_post = post;
}
public WorkerDataModel(string id, string fio, string postId,
DateTime birthDate, DateTime employmentDate) : this(id, fio, postId, birthDate, employmentDate, false)
{ }
public void Validate()
{
if (Id.IsEmpty())

View File

@@ -6,6 +6,7 @@ public class RequestViewModel
public required string Id { get; set; }
public required string WorkerId { get; set; }
public required string WorkerFIO { get; set; }
public DateTime RequestDate { get; set; }
public double Sum { get; set; }
public bool IsCancel { get; set; }
public required List<InstallationRequestViewModel> Softwares { get; set; }

View File

@@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SmallSoftwareContracts.ViewModels;
public class SalaryViewModel
{
public required string WorkerId { get; set; }
public required string WorkerFIO { get; set; }
public DateTime SalaryDate { get; set; }
public double Salary { get; set; }
}

View File

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

View File

@@ -28,8 +28,8 @@ internal class RequestStorageContract : IRequestStorageContract
.ForMember(x => x.IsCancel, x => x.MapFrom(src => false))
.ForMember(x => x.InstallationRequests, x => x.MapFrom(src => src.Softwares))
.ForMember(x => x.Worker, x => x.Ignore())
;
.ForMember(dest => dest.RequestDate, opt => opt.MapFrom(src => src.RequestDate))
.ForMember(dest => dest.RequestDate, opt => opt.MapFrom(src => src.RequestDate));
});
_mapper = new Mapper(config);
}
@@ -47,7 +47,6 @@ internal class RequestStorageContract : IRequestStorageContract
{
query = query.Where(x => x.InstallationRequests!.Any(y => y.SoftwareId == softwareId));
}
return [.. query.Select(x => _mapper.Map<RequestDataModel>(x))];
}
catch (Exception ex)
@@ -110,5 +109,10 @@ internal class RequestStorageContract : IRequestStorageContract
}
}
private Request? GetRequestById(string id) => _dbContext.Requests.Include(x => x.Worker).Include(x => x.InstallationRequests).ThenInclude(x => x.Software).FirstOrDefault(x => x.Id == id);
private Request? GetRequestById(string id) =>
_dbContext.Requests
.Include(x => x.Worker)
.Include(x => x.InstallationRequests)!
.ThenInclude(x => x.Software)
.FirstOrDefault(x => x.Id == id);
}

View File

@@ -1,4 +1,5 @@
using AutoMapper;
using Microsoft.EntityFrameworkCore;
using SmallSoftwareContracts.DataModels;
using SmallSoftwareContracts.Exceptions;
using SmallSoftwareContracts.StoragesContracts;
@@ -15,20 +16,18 @@ internal class SalaryStorageContract : ISalaryStorageContract
_dbContext = dbContext;
var config = new MapperConfiguration(cfg =>
{
cfg.CreateMap<Worker, WorkerDataModel>();
cfg.CreateMap<Salary, SalaryDataModel>();
cfg.CreateMap<SalaryDataModel, Salary>()
.ForMember(dest => dest.WorkerSalary, opt =>
opt.MapFrom(src => src.Salary));
.ForMember(dest => dest.WorkerSalary, opt => opt.MapFrom(src => src.Salary));
});
_mapper = new Mapper(config);
}
public List<SalaryDataModel> GetList(DateTime startDate, DateTime endDate,
string? workerId = null)
public List<SalaryDataModel> GetList(DateTime startDate, DateTime endDate, string? workerId = null)
{
try
{
var query = _dbContext.Salaries.Where(x => x.SalaryDate >=
startDate && x.SalaryDate <= endDate);
var query = _dbContext.Salaries.Include(x => x.Worker).Where(x => x.SalaryDate >= startDate && x.SalaryDate <= endDate);
if (workerId is not null)
{
query = query.Where(x => x.WorkerId == workerId);

View File

@@ -11,7 +11,7 @@ using System.Threading.Tasks;
namespace SmallSoftwareDatabase.Implementations;
internal class WorkerStorageContract : IWorkerStorageContract
internal class WorkerStorageContract : IWorkerStorageContract
{
private readonly SmallSoftwareDbContext _dbContext;
private readonly Mapper _mapper;
@@ -20,13 +20,18 @@ internal class WorkerStorageContract : IWorkerStorageContract
_dbContext = dbContext;
var config = new MapperConfiguration(cfg =>
{
cfg.AddMaps(typeof(Worker).Assembly);
cfg.CreateMap<Post, PostDataModel>()
.ForMember(x => x.Id, x => x.MapFrom(src =>
src.PostId));
cfg.CreateMap<Worker, WorkerDataModel>();
cfg.CreateMap<WorkerDataModel, Worker>()
.ForMember(x => x.Post, x => x.Ignore());
});
_mapper = new Mapper(config);
}
public List<WorkerDataModel> GetList(bool onlyActive = true, string? postId
= null, DateTime? fromBirthDate = null, DateTime? toBirthDate = null, DateTime?
fromEmploymentDate = null, DateTime? toEmploymentDate = null)
= null, DateTime? fromBirthDate = null, DateTime? toBirthDate = null, DateTime?
fromEmploymentDate = null, DateTime? toEmploymentDate = null)
{
try
{
@@ -50,7 +55,7 @@ internal class WorkerStorageContract : IWorkerStorageContract
query = query.Where(x => x.EmploymentDate >=
fromEmploymentDate && x.EmploymentDate <= toEmploymentDate);
}
return [.. query.Select(x => _mapper.Map<WorkerDataModel>(x))];
return [.. JoinPost(query).Select(x => _mapper.Map<WorkerDataModel>(x))];
}
catch (Exception ex)
{
@@ -69,14 +74,13 @@ internal class WorkerStorageContract : IWorkerStorageContract
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex);
}
}
}
public WorkerDataModel? GetElementByFIO(string fio)
{
try
{
return
_mapper.Map<WorkerDataModel>(_dbContext.Workers.FirstOrDefault(x => x.FIO ==
fio));
{
return
_mapper.Map<WorkerDataModel>(AddPost(_dbContext.Workers.FirstOrDefault(x => x.FIO == fio && !x.IsDeleted)));
}
catch (Exception ex)
{
@@ -129,12 +133,12 @@ internal class WorkerStorageContract : IWorkerStorageContract
{
var element = GetWorkerById(id) ?? throw new
ElementNotFoundException(id);
element.IsDeleted = true;
element.IsDeleted = true;
_dbContext.SaveChanges();
}
catch (ElementNotFoundException)
{
_dbContext.ChangeTracker.Clear();
{
_dbContext.ChangeTracker.Clear();
throw;
}
catch (Exception ex)
@@ -144,5 +148,13 @@ internal class WorkerStorageContract : IWorkerStorageContract
}
}
private Worker? GetWorkerById(string id) =>
_dbContext.Workers.FirstOrDefault(x => x.Id == id && !x.IsDeleted);
}
AddPost(_dbContext.Workers.FirstOrDefault(x => x.Id == id && !x.IsDeleted));
private IQueryable<Worker> JoinPost(IQueryable<Worker> query)
=> query.GroupJoin(_dbContext.Posts.Where(x => x.IsActual), x =>
x.PostId, y => y.PostId, (x, y) => new { Worker = x, Post = y })
.SelectMany(xy => xy.Post.DefaultIfEmpty(), (x, y) =>
x.Worker.AddPost(y));
private Worker? AddPost(Worker? worker)
=> worker?.AddPost(_dbContext.Posts.FirstOrDefault(x => x.PostId ==
worker.PostId && x.IsActual));
}

View File

@@ -1,9 +1,4 @@
using SmallSoftwareContracts.Enums;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SmallSoftwareContracts.Enums;
namespace SmallSoftwareDatabase.Models;

View File

@@ -1,18 +1,13 @@
using SmallSoftwareContracts.DataModels;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ComponentModel.DataAnnotations.Schema;
namespace SmallSoftwareDatabase.Models;
internal class Request
{
public string Id { get; set; } = Guid.NewGuid().ToString();
public required string WorkerId { get; set; }
public required string Email { get; set; }
public required string WorkerId { get; set; }
public DateTime RequestDate { get; set; }
public required string Email { get; set; }
public double Sum { get; set; }
public bool IsCancel { get; set; }
public Worker? Worker { get; set; }

View File

@@ -1,10 +1,4 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SmallSoftwareDatabase.Models;
namespace SmallSoftwareDatabase.Models;
internal class Salary
{

View File

@@ -1,12 +1,6 @@
using AutoMapper;
using SmallSoftwareContracts.DataModels;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SmallSoftwareContracts.DataModels;
using System.ComponentModel.DataAnnotations.Schema;
namespace SmallSoftwareDatabase.Models;
[AutoMap(typeof(WorkerDataModel), ReverseMap = true)]
internal class Worker
@@ -17,10 +11,16 @@ internal class Worker
public DateTime BirthDate { get; set; }
public DateTime EmploymentDate { get; set; }
public bool IsDeleted { get; set; }
[NotMapped]
public Post? Post { get; set; }
[ForeignKey("WorkerId")]
public List<Salary>? Salaries { get; set; }
[ForeignKey("WorkerId")]
public List<Request>? Requests { get; set; }
public Worker AddPost(Post? post)
{
Post = post;
return this;
}
}

View File

@@ -9,9 +9,17 @@ using System.Threading.Tasks;
namespace SmallSoftwareDatabase;
internal class SmallSoftwareDbContext(IConfigurationDatabase configurationDatabase) : DbContext
internal class SmallSoftwareDbContext : DbContext
{
private readonly IConfigurationDatabase? _configurationDatabase = configurationDatabase;
private readonly IConfigurationDatabase? _configurationDatabase;
public SmallSoftwareDbContext(IConfigurationDatabase configurationDatabase)
{
_configurationDatabase = configurationDatabase;
AppContext.SetSwitch("Npgsql.EnableLegacyTimestampBehavior", true);
AppContext.SetSwitch("Npgsql.DisableDateTimeInfinityConversions", true);
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseNpgsql(_configurationDatabase?.ConnectionString, o => o.SetPostgresVersion(12, 2));

View File

@@ -34,8 +34,8 @@ internal class RequestBusinessLogicContractTests
var date = DateTime.UtcNow;
var listOriginal = new List<RequestDataModel>()
{
new(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), "test@mail.ru", false, [new InstallationRequestDataModel(Guid.NewGuid().ToString(),Guid.NewGuid().ToString(), 5, 10)]),
new(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), "test@mail.ru", false, []), new(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), "test@mail.ru", false, []),
new(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), "test@mail.ru", false, [new InstallationRequestDataModel(Guid.NewGuid().ToString(),Guid.NewGuid().ToString(), 5, 10)], DateTime.UtcNow),
new(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), "test@mail.ru", false, [], DateTime.UtcNow), new(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), "test@mail.ru", false, [], DateTime.UtcNow),
};
_requestStorageContract.Setup(x => x.GetList(It.IsAny<DateTime?>(),
It.IsAny<DateTime?>(), It.IsAny<string>(), It.IsAny<string>())).Returns(listOriginal);
@@ -112,8 +112,8 @@ internal class RequestBusinessLogicContractTests
var workerId = Guid.NewGuid().ToString();
var listOriginal = new List<RequestDataModel>()
{
new(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), false, [new InstallationRequestDataModel(Guid.NewGuid().ToString(),Guid.NewGuid().ToString(), 5, 10)]),
new(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), false, []), new(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), false, []),
new(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), false, [new InstallationRequestDataModel(Guid.NewGuid().ToString(),Guid.NewGuid().ToString(), 5, 10)], DateTime.UtcNow),
new(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), false, [], DateTime.UtcNow), new(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), false, [], DateTime.UtcNow),
};
_requestStorageContract.Setup(x => x.GetList(It.IsAny<DateTime?>(),
It.IsAny<DateTime?>(), It.IsAny<string>(),
@@ -229,9 +229,9 @@ internal class RequestBusinessLogicContractTests
var softwareId = Guid.NewGuid().ToString();
var listOriginal = new List<RequestDataModel>()
{
new(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), "test@mail.ru", false, [new InstallationRequestDataModel(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), 5, 10)]),
new(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), "test@mail.ru", false, []),
new(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), "test@mail.ru", false, []),
new(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), "test@mail.ru", false, [new InstallationRequestDataModel(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), 5, 10)], DateTime.UtcNow),
new(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), "test@mail.ru", false, [], DateTime.UtcNow),
new(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), "test@mail.ru", false, [], DateTime.UtcNow),
};
_requestStorageContract.Setup(x => x.GetList(It.IsAny<DateTime?>(),
It.IsAny<DateTime?>(), It.IsAny<string>(),
@@ -343,7 +343,7 @@ internal class RequestBusinessLogicContractTests
{
//Arrange
var id = Guid.NewGuid().ToString();
var record = new RequestDataModel(id, Guid.NewGuid().ToString(), "test@mail.ru", false, [new InstallationRequestDataModel(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), 5, 10)]);
var record = new RequestDataModel(id, Guid.NewGuid().ToString(), "test@mail.ru", false, [new InstallationRequestDataModel(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), 5, 10)], DateTime.UtcNow);
_requestStorageContract.Setup(x =>
x.GetElementById(id)).Returns(record);
//Act
@@ -405,7 +405,7 @@ internal class RequestBusinessLogicContractTests
//Arrange
var flag = false;
var record = new RequestDataModel(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), "valid.email@example.com", false,
[new InstallationRequestDataModel(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), 5, 10)]);
[new InstallationRequestDataModel(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), 5, 10)], DateTime.UtcNow);
_requestStorageContract.Setup(x => x.AddElement(It.IsAny<RequestDataModel>()))
.Callback((RequestDataModel x) =>
{
@@ -435,7 +435,7 @@ internal class RequestBusinessLogicContractTests
//Act&Assert
Assert.That(() =>
_requestBusinessLogicContract.InsertRequest(new(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), "test@example.com", false,
[new InstallationRequestDataModel(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), 5, 10)])), Throws.TypeOf<ElementExistsException>());
[new InstallationRequestDataModel(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), 5, 10)], DateTime.UtcNow)), Throws.TypeOf<ElementExistsException>());
_requestStorageContract.Verify(x => x.AddElement(It.IsAny<RequestDataModel>()), Times.Once);
}
[Test]
@@ -451,7 +451,7 @@ internal class RequestBusinessLogicContractTests
public void InsertRequest_InvalidRecord_ThrowException_Test()
{
//Act&Assert
Assert.That(() => _requestBusinessLogicContract.InsertRequest(new RequestDataModel("id", Guid.NewGuid().ToString(), "test@mail.ru", false, [])), Throws.TypeOf<ValidationException>());
Assert.That(() => _requestBusinessLogicContract.InsertRequest(new RequestDataModel("id", Guid.NewGuid().ToString(), "test@mail.ru", false, [], DateTime.UtcNow)), Throws.TypeOf<ValidationException>());
_requestStorageContract.Verify(x =>
x.AddElement(It.IsAny<RequestDataModel>()), Times.Never);
}
@@ -464,7 +464,7 @@ internal class RequestBusinessLogicContractTests
InvalidOperationException()));
//Act&Assert
Assert.That(() =>
_requestBusinessLogicContract.InsertRequest(new(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), "test@example.com", false, [new InstallationRequestDataModel(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), 5, 10)])), Throws.TypeOf<StorageException>());
_requestBusinessLogicContract.InsertRequest(new(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), "test@example.com", false, [new InstallationRequestDataModel(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), 5, 10)], DateTime.UtcNow)), Throws.TypeOf<StorageException>());
_requestStorageContract.Verify(x =>
x.AddElement(It.IsAny<RequestDataModel>()), Times.Once);
}

View File

@@ -250,15 +250,15 @@ internal class SalaryBusinessLogicContractTests
_requestStorageContract.Setup(x => x.GetList(It.IsAny<DateTime>(),
It.IsAny<DateTime>(), It.IsAny<string>(), It.IsAny<string>()))
.Returns([new RequestDataModel(Guid.NewGuid().ToString(),
worker1Id, Guid.NewGuid().ToString(), false, []),
worker1Id, Guid.NewGuid().ToString(), false, [], DateTime.UtcNow),
new RequestDataModel(Guid.NewGuid().ToString(), worker1Id, Guid.NewGuid().ToString(),
false, []),
false, [], DateTime.UtcNow),
new RequestDataModel(Guid.NewGuid().ToString(), worker2Id, Guid.NewGuid().ToString(),
false, []),
false, [], DateTime.UtcNow),
new RequestDataModel(Guid.NewGuid().ToString(), worker3Id, Guid.NewGuid().ToString(),
false, []),
false, [], DateTime.UtcNow),
new RequestDataModel(Guid.NewGuid().ToString(), worker3Id, Guid.NewGuid().ToString(),
false, [])]);
false, [], DateTime.UtcNow)]);
_postStorageContract.Setup(x => x.GetElementById(It.IsAny<string>()))
.Returns(new PostDataModel(Guid.NewGuid().ToString(), "name",
PostType.SoftInstaller, 2000));
@@ -329,7 +329,7 @@ Guid.NewGuid().ToString(), DateTime.UtcNow, DateTime.UtcNow, false)]);
var workerId = Guid.NewGuid().ToString();
_requestStorageContract.Setup(x => x.GetList(It.IsAny<DateTime>(),
It.IsAny<DateTime>(), It.IsAny<string>(), It.IsAny<string>()))
.Returns([new RequestDataModel(Guid.NewGuid().ToString(), workerId, Guid.NewGuid().ToString(), false, [])]);
.Returns([new RequestDataModel(Guid.NewGuid().ToString(), workerId, Guid.NewGuid().ToString(), false, [], DateTime.UtcNow)]);
_workerStorageContract.Setup(x => x.GetList(It.IsAny<bool>(),
It.IsAny<string?>(), It.IsAny<DateTime?>(), It.IsAny<DateTime?>(),
It.IsAny<DateTime?>(), It.IsAny<DateTime?>()))
@@ -349,7 +349,7 @@ Guid.NewGuid().ToString(), DateTime.UtcNow, DateTime.UtcNow, false)]);
_requestStorageContract.Setup(x => x.GetList(It.IsAny<DateTime>(),
It.IsAny<DateTime>(), It.IsAny<string>(), It.IsAny<string>()))
.Returns([new RequestDataModel(Guid.NewGuid().ToString(),
workerId, Guid.NewGuid().ToString(), false, [])]);
workerId, Guid.NewGuid().ToString(), false, [], DateTime.UtcNow)]);
_postStorageContract.Setup(x => x.GetElementById(It.IsAny<string>()))
.Returns(new PostDataModel(Guid.NewGuid().ToString(), "name",
PostType.SoftInstaller, 2000));
@@ -390,7 +390,7 @@ Guid.NewGuid().ToString(), DateTime.UtcNow, DateTime.UtcNow, false)]);
_requestStorageContract.Setup(x => x.GetList(It.IsAny<DateTime>(),
It.IsAny<DateTime>(), It.IsAny<string>(), It.IsAny<string>()))
.Returns([new RequestDataModel(Guid.NewGuid().ToString(),
workerId, Guid.NewGuid().ToString(), false, [])]);
workerId, Guid.NewGuid().ToString(), false, [], DateTime.UtcNow)]);
_postStorageContract.Setup(x => x.GetElementById(It.IsAny<string>()))
.Throws(new StorageException(new
InvalidOperationException()));
@@ -412,7 +412,7 @@ Guid.NewGuid().ToString(), DateTime.UtcNow, DateTime.UtcNow, false)]);
var workerId = Guid.NewGuid().ToString();
_requestStorageContract.Setup(x => x.GetList(It.IsAny<DateTime>(),
It.IsAny<DateTime>(), It.IsAny<string>(), It.IsAny<string>()))
.Returns([new RequestDataModel(Guid.NewGuid().ToString(), workerId, Guid.NewGuid().ToString(), false, [])]);
.Returns([new RequestDataModel(Guid.NewGuid().ToString(), workerId, Guid.NewGuid().ToString(), false, [], DateTime.UtcNow)]);
_postStorageContract.Setup(x => x.GetElementById(It.IsAny<string>()))
.Returns(new PostDataModel(Guid.NewGuid().ToString(), "name",
PostType.SoftInstaller, 2000));

View File

@@ -9,44 +9,44 @@ internal class RequestDataModelTests
[Test]
public void IdIsNullOrEmptyTest()
{
var request = CreateDataModel(null, Guid.NewGuid().ToString(), "test@example.com", false, CreateSubDataModel());
var request = CreateDataModel(null, Guid.NewGuid().ToString(), "test@example.com", false, CreateSubDataModel() , DateTime.UtcNow);
Assert.That(() => request.Validate(), Throws.TypeOf<ValidationException>());
request = CreateDataModel(string.Empty, Guid.NewGuid().ToString(), "test@example.com", false, CreateSubDataModel());
request = CreateDataModel(string.Empty, Guid.NewGuid().ToString(), "test@example.com", false, CreateSubDataModel(), DateTime.UtcNow);
Assert.That(() => request.Validate(), Throws.TypeOf<ValidationException>());
}
[Test]
public void IdIsNotGuidTest()
{
var request = CreateDataModel("id", Guid.NewGuid().ToString(), "test@example.com", false, CreateSubDataModel());
var request = CreateDataModel("id", Guid.NewGuid().ToString(), "test@example.com", false, CreateSubDataModel(), DateTime.UtcNow);
Assert.That(() => request.Validate(), Throws.TypeOf<ValidationException>());
}
[Test]
public void WorkerIdIsNullOrEmptyTest()
{
var request = CreateDataModel(Guid.NewGuid().ToString(), null, "test@example.com", false, CreateSubDataModel());
var request = CreateDataModel(Guid.NewGuid().ToString(), null, "test@example.com", false, CreateSubDataModel(), DateTime.UtcNow);
Assert.That(() => request.Validate(), Throws.TypeOf<ValidationException>());
request = CreateDataModel(Guid.NewGuid().ToString(), string.Empty, "test@example.com", false, CreateSubDataModel());
request = CreateDataModel(Guid.NewGuid().ToString(), string.Empty, "test@example.com", false, CreateSubDataModel(), DateTime.UtcNow);
Assert.That(() => request.Validate(), Throws.TypeOf<ValidationException>());
}
[Test]
public void WorkerIdIsNotGuidTest()
{
var request = CreateDataModel(Guid.NewGuid().ToString(), "workerId", "test@example.com", false, CreateSubDataModel());
var request = CreateDataModel(Guid.NewGuid().ToString(), "workerId", "test@example.com", false, CreateSubDataModel(), DateTime.UtcNow);
Assert.That(() => request.Validate(), Throws.TypeOf<ValidationException>());
}
[Test]
public void EmailIsInvalidTest()
{
var request = CreateDataModel(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), "invalid_email", false, CreateSubDataModel());
var request = CreateDataModel(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), "invalid_email", false, CreateSubDataModel(), DateTime.UtcNow);
Assert.That(() => request.Validate(), Throws.TypeOf<ValidationException>());
request = CreateDataModel(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), "@", false, CreateSubDataModel());
request = CreateDataModel(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), "@", false, CreateSubDataModel(), DateTime.UtcNow);
Assert.That(() => request.Validate(), Throws.TypeOf<ValidationException>());
}
@@ -54,10 +54,10 @@ internal class RequestDataModelTests
[Test]
public void SoftwaresIsNullOrEmptyTest()
{
var request = CreateDataModel(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), "test@example.com", false, null);
var request = CreateDataModel(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), "test@example.com", false, null, DateTime.UtcNow);
Assert.That(() => request.Validate(), Throws.TypeOf<ValidationException>());
request = CreateDataModel(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), "test@example.com", false, new List<InstallationRequestDataModel>());
request = CreateDataModel(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), "test@example.com", false, new List<InstallationRequestDataModel>(), DateTime.UtcNow);
Assert.That(() => request.Validate(), Throws.TypeOf<ValidationException>());
}
@@ -71,7 +71,7 @@ internal class RequestDataModelTests
var isCancel = true;
var softwares = CreateSubDataModel();
var request = CreateDataModel(requestId, workerId, email, isCancel, softwares);
var request = CreateDataModel(requestId, workerId, email, isCancel, softwares, DateTime.UtcNow);
Assert.That(() => request.Validate(), Throws.Nothing);
Assert.Multiple(() =>
@@ -85,8 +85,8 @@ internal class RequestDataModelTests
});
}
private static RequestDataModel CreateDataModel(string? id, string? workerId, string email, bool isCancel, List<InstallationRequestDataModel>? softwares) =>
new(id, workerId, email, isCancel, softwares);
private static RequestDataModel CreateDataModel(string? id, string? workerId, string email, bool isCancel, List<InstallationRequestDataModel>? softwares, DateTime requestDate) =>
new(id, workerId, email, isCancel, softwares, requestDate );
private static List<InstallationRequestDataModel> CreateSubDataModel() =>
[new InstallationRequestDataModel(Guid.NewGuid().ToString(), "SoftwareName", 1, 10)];

View File

@@ -78,51 +78,47 @@ internal static class SmallSoftwareDbContextExtensions
dbContext.SaveChanges();
return softwareHistory;
}
public static Salary InsertSalaryToDatabaseAndReturn(this
SmallSoftwareDbContext dbContext, string workerId, double workerSalary = 1,
DateTime? salaryDate = null)
public static Salary InsertSalaryToDatabaseAndReturn(this SmallSoftwareDbContext dbContext, string workerId, double workerSalary = 1, DateTime? salaryDate = null)
{
var salary = new Salary()
{
WorkerId = workerId,
WorkerSalary =
workerSalary,
SalaryDate = salaryDate ?? DateTime.UtcNow
};
var salary = new Salary() { WorkerId = workerId, WorkerSalary = workerSalary, SalaryDate = salaryDate ?? DateTime.UtcNow };
dbContext.Salaries.Add(salary);
dbContext.SaveChanges();
return salary;
}
public static Request InsertRequestToDatabaseAndReturn(this SmallSoftwareDbContext
dbContext, string workerId, string email = "test@mail.ru", double sum = 1, bool isCancel = false, List<(string, int, double)>? softwares = null)
public static Request InsertRequestToDatabaseAndReturn(this SmallSoftwareDbContext dbContext,
string workerId, string email = "test@mail.ru", double sum = 1, bool isCancel = false,
List<(string, int, double)>? softwares = null, DateTime? requestDate = null)
{
var Request = new Request()
var request = new Request()
{
WorkerId = workerId,
Email = email,
Sum = sum,
IsCancel = isCancel,
RequestDate = (requestDate ?? DateTime.UtcNow).ToUniversalTime(),
InstallationRequests = []
};
if (softwares is not null)
{
foreach (var elem in softwares)
{
var software = dbContext.Softwares.Find(elem.Item1);
Request.InstallationRequests.Add(new InstallationRequest
var software = dbContext.Softwares.Find(elem.Item1);
request.InstallationRequests.Add(new InstallationRequest
{
SoftwareId = elem.Item1,
Software = software!,
RequestId = Request.Id,
RequestId = request.Id,
Count = elem.Item2,
Price = elem.Item3
});
}
}
dbContext.Requests.Add(Request);
dbContext.Requests.Add(request);
dbContext.SaveChanges();
return Request;
return request;
}
public static Worker InsertWorkerToDatabaseAndReturn(this SmallSoftwareDbContext dbContext,

View File

@@ -34,8 +34,8 @@ internal class RequestStorageContractTests : BaseStorageContractTest
[Test]
public void Try_GetList_WhenHaveRecords_Test()
{
var request = SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_worker.Id, "test@mail.ru", 1, softwares: [(_software.Id, 1, 1.2)]);
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_worker.Id, "test@mail.ru", 1, softwares: [(_software.Id, 5, 1.2)]);
var request = SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_worker.Id, "test@mail.ru", 1, softwares: [(_software.Id, 1, 1.2)], requestDate: DateTime.UtcNow.AddHours(-12));
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_worker.Id, "test@mail.ru", 1, softwares: [(_software.Id, 5, 1.2)], requestDate: DateTime.UtcNow.AddHours(-12));
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_worker.Id, "", 10, softwares: [(_software.Id, 10, 1.2)]);
var list = _requesttStorageContract.GetList();
Assert.That(list, Is.Not.Null);
@@ -52,10 +52,10 @@ internal class RequestStorageContractTests : BaseStorageContractTest
[Test]
public void Try_GetList_ByPeriod_Test()
{
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_worker.Id, "test@mail.ru", 1, softwares: [(_software.Id, 1, 1.2)]);
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_worker.Id, "test@mail.ru", 1, softwares: [(_software.Id, 1, 1.2)]);
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_worker.Id, "", 1, softwares: [(_software.Id, 1, 1.2)]);
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_worker.Id, "", 1, softwares: [(_software.Id, 1, 1.2)]);
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_worker.Id, "test@mail.ru", 1, softwares: [(_software.Id, 1, 1.2)], requestDate: DateTime.UtcNow.AddHours(-12));
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_worker.Id, "test@mail.ru", 1, softwares: [(_software.Id, 1, 1.2)], requestDate: DateTime.UtcNow.AddHours(-12));
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_worker.Id, "", 1, softwares: [(_software.Id, 1, 1.2)], requestDate: DateTime.UtcNow.AddHours(-12));
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_worker.Id, "", 1, softwares: [(_software.Id, 1, 1.2)], requestDate: DateTime.UtcNow.AddHours(-12));
var list = _requesttStorageContract.GetList(startDate:
DateTime.UtcNow.AddDays(-1), endDate: DateTime.UtcNow.AddDays(1));
Assert.That(list, Is.Not.Null);
@@ -66,11 +66,11 @@ internal class RequestStorageContractTests : BaseStorageContractTest
{
var worker = InsertWorkerToDatabaseAndReturn("Other worker");
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_worker.Id, "test@mail.ru", 1, softwares:
[(_software.Id, 1, 1.2)]);
[(_software.Id, 1, 1.2)], requestDate: DateTime.UtcNow.AddHours(-12));
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_worker.Id, "test@mail.ru", 1, softwares:
[(_software.Id, 1, 1.2)]);
[(_software.Id, 1, 1.2)], requestDate: DateTime.UtcNow.AddHours(-12));
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(worker.Id, "", 1, softwares:
[(_software.Id, 1, 1.2)]);
[(_software.Id, 1, 1.2)], requestDate: DateTime.UtcNow.AddHours(-12));
var list = _requesttStorageContract.GetList(workerId: _worker.Id);
Assert.That(list, Is.Not.Null);
Assert.That(list, Has.Count.EqualTo(2));
@@ -82,9 +82,9 @@ internal class RequestStorageContractTests : BaseStorageContractTest
{
var software = InsertSoftwareToDatabaseAndReturn("Other name");
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_worker.Id, "test@mail.ru", 1, softwares:
[(_software.Id, 5, 1.2)]);
[(_software.Id, 5, 1.2)], requestDate: DateTime.UtcNow.AddHours(-12));
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_worker.Id, "test@mail.ru", 1, softwares:
[(_software.Id, 1, 1.2), (software.Id, 4, 1.2)]);
[(_software.Id, 1, 1.2), (software.Id, 4, 1.2)], requestDate: DateTime.UtcNow.AddHours(-12));
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_worker.Id, "", 1, softwares:
[(software.Id, 1, 1.2)]);
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_worker.Id, "", 1, softwares:
@@ -100,13 +100,13 @@ internal class RequestStorageContractTests : BaseStorageContractTest
{
var worker = InsertWorkerToDatabaseAndReturn("Other worker");
var software = InsertSoftwareToDatabaseAndReturn("Other name");
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_worker.Id, "test@mail.ru", 1, softwares: [(_software.Id, 1, 1.2)]);
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(worker.Id, "", 1, softwares: [(_software.Id, 1, 1.2)]);
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(worker.Id, "test@mail.ru", 1, softwares: [(_software.Id, 1, 1.2)]);
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(worker.Id, "test@mail.ru", 1, softwares: [(software.Id, 1, 1.2)]);
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_worker.Id, "test@mail.ru", 1, softwares: [(_software.Id, 1, 1.2)]);
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_worker.Id, "test@mail.ru", 1, softwares: [(software.Id, 1, 1.2)]);
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(worker.Id, "", 1, softwares: [(_software.Id, 1, 1.2)]);
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_worker.Id, "test@mail.ru", 1, softwares: [(_software.Id, 1, 1.2)], requestDate: DateTime.UtcNow.AddHours(-12));
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(worker.Id, "", 1, softwares: [(_software.Id, 1, 1.2)], requestDate: DateTime.UtcNow.AddHours(-12));
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(worker.Id, "test@mail.ru", 1, softwares: [(_software.Id, 1, 1.2)], requestDate: DateTime.UtcNow.AddHours(-12));
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(worker.Id, "test@mail.ru", 1, softwares: [(software.Id, 1, 1.2)], requestDate: DateTime.UtcNow.AddHours(-12));
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_worker.Id, "test@mail.ru", 1, softwares: [(_software.Id, 1, 1.2)], requestDate: DateTime.UtcNow.AddHours(-12));
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_worker.Id, "test@mail.ru", 1, softwares: [(software.Id, 1, 1.2)], requestDate: DateTime.UtcNow.AddHours(-12));
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(worker.Id, "", 1, softwares: [(_software.Id, 1, 1.2)], requestDate: DateTime.UtcNow.AddHours(-12));
var list = _requesttStorageContract.GetList(startDate:
DateTime.UtcNow.AddDays(-1), endDate: DateTime.UtcNow.AddDays(1), workerId:
_worker.Id, softwareId: _software.Id);
@@ -117,14 +117,14 @@ internal class RequestStorageContractTests : BaseStorageContractTest
public void Try_GetElementById_WhenHaveRecord_Test()
{
var request = SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_worker.Id, "test@mail.ru", 1,
softwares: [(_software.Id, 1, 1.2)]);
softwares: [(_software.Id, 1, 1.2)], requestDate: DateTime.UtcNow.AddHours(-12));
AssertElement(_requesttStorageContract.GetElementById(request.Id), request);
}
[Test]
public void Try_GetElementById_WhenNoRecord_Test()
{
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_worker.Id, "test@mail.ru", 1, softwares:
[(_software.Id, 1, 1.2)]);
[(_software.Id, 1, 1.2)], requestDate: DateTime.UtcNow.AddHours(-12));
Assert.That(() =>
_requesttStorageContract.GetElementById(Guid.NewGuid().ToString()), Is.Null);
}
@@ -138,17 +138,17 @@ internal class RequestStorageContractTests : BaseStorageContractTest
[Test]
public void Try_AddElement_Test()
{
var request = CreateModel(Guid.NewGuid().ToString(), _worker.Id,"", 0, false, [_software.Id]);
var request = CreateModel(Guid.NewGuid().ToString(), _worker.Id,"", 0, false, [_software.Id], DateTime.UtcNow);
_requesttStorageContract.AddElement(request);
AssertElement(GetRequestFromDatabaseById(request.Id), request);
}
[Test]
public void Try_AddElement_WhenIsDeletedIsTrue_Test()
{
var request = CreateModel(Guid.NewGuid().ToString(), _worker.Id, "test@mail.ru", 1, true, [_software.Id]);
var request = CreateModel(Guid.NewGuid().ToString(), _worker.Id, "test@mail.ru", 1, true, [_software.Id], DateTime.UtcNow);
Assert.That(() => _requesttStorageContract.AddElement(request),Throws.Nothing);
AssertElement(GetRequestFromDatabaseById(request.Id), CreateModel(request.Id,
_worker.Id, "test@mail.ru", 1, false, [_software.Id]));
_worker.Id, "test@mail.ru", 1, false, [_software.Id], DateTime.UtcNow));
}
[Test]
public void Try_DelElement_Test()
@@ -250,10 +250,10 @@ internal class RequestStorageContractTests : BaseStorageContractTest
Assert.That(actual.Softwares, Is.Null);
}
}
private static RequestDataModel CreateModel(string id, string workerId, string email, double sum, bool isCancel, List<string> softwareIds)
private static RequestDataModel CreateModel(string id, string workerId, string email, double sum, bool isCancel, List<string> softwareIds, DateTime requestDate)
{
var installationRequests = softwareIds.Select(x => new InstallationRequestDataModel(x, id, 1, 1.1)).ToList();
return new(id, workerId, email, isCancel, installationRequests);
return new(id, workerId, email, isCancel, installationRequests, requestDate);
}
private Request? GetRequestFromDatabaseById(string id) =>
SmallSoftwareDbContext.Requests.Include(x => x.InstallationRequests).FirstOrDefault(x => x.Id == id);
@@ -269,8 +269,7 @@ internal class RequestStorageContractTests : BaseStorageContractTest
if (expected.Softwares is not null)
{
Assert.That(actual.InstallationRequests, Is.Not.Null);
Assert.That(actual.InstallationRequests,
Has.Count.EqualTo(expected.Softwares.Count));
Assert.That(actual.InstallationRequests, Has.Count.EqualTo(expected.Softwares.Count));
for (int i = 0; i < actual.InstallationRequests.Count; ++i)
{
Assert.Multiple(() =>

View File

@@ -32,7 +32,7 @@ internal class SalaryStorageContractTests : BaseStorageContractTest
[Test]
public void Try_GetList_WhenHaveRecords_Test()
{
var salary = SmallSoftwareDbContext.InsertSalaryToDatabaseAndReturn(_worker.Id, workerSalary: 100);
var salary = SmallSoftwareDbContext.InsertSalaryToDatabaseAndReturn(_worker.Id, workerSalary: 1);
SmallSoftwareDbContext.InsertSalaryToDatabaseAndReturn(_worker.Id);
SmallSoftwareDbContext.InsertSalaryToDatabaseAndReturn(_worker.Id);
var list = _salaryStorageContract.GetList(DateTime.UtcNow.AddDays(-

View File

@@ -27,18 +27,17 @@ internal class WorkerStorageContractTests : BaseStorageContractTest
{
SmallSoftwareDbContext.RemoveWorkersFromDatabase();
}
}
[Test]
public void Try_GetList_WhenHaveRecords_Test()
{
var worker =
SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn(Guid.NewGuid().ToString(), "fio 1");
SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn(Guid.NewGuid().ToString(), "fio 2");
SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn(Guid.NewGuid().ToString(), "fio 3");
var worker = SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn(fio: "fio 1");
SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn(fio: "fio 2");
SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn(fio: "fio 3");
var list = _workerStorageContract.GetList();
Assert.That(list, Is.Not.Null);
Assert.That(list, Has.Count.EqualTo(3));
AssertElement(list.First(), worker);
AssertElement(list.First(x => x.FIO == worker.FIO), worker);
}
[Test]
public void Try_GetList_WhenNoRecords_Test()

View File

@@ -40,6 +40,8 @@ internal class RequestControllerTests : BaseWebApiControllerTest
//Act
var response = await HttpClient.GetAsync($"/api/requests/getrecords?fromDate={DateTime.UtcNow.AddDays(-1):MM/dd/yyyy HH:mm:ss}&toDate={DateTime.UtcNow.AddDays(1):MM/dd/yyyy HH:mm:ss}");
var responseContent = await response.Content.ReadAsStringAsync();
Console.WriteLine($"Response: {response.StatusCode}, Content: {responseContent}");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
var data = await GetModelFromResponseAsync<List<RequestViewModel>>(response);
@@ -125,12 +127,14 @@ internal class RequestControllerTests : BaseWebApiControllerTest
{
//Arrange
var software = SmallSoftwareDbContext.InsertSoftwareToDatabaseAndReturn(_manufacturerId, softwareName: "Other name");
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_workerId, "test@mail.ru", sum: 10, false, softwares: [(_softwareId, 10, 1.1)]);
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_workerId, "test@mail.ru", softwares: [(_softwareId, 1, 1.1), (software.Id, 4, 1.1)]);
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_workerId, "test@mail.ru", sum: 10, false, softwares: [(software.Id, 10, 1.1)]);
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_workerId, "test@mail.ru", softwares: [(software.Id, 1, 1.1), (_softwareId, 1, 1.1)]);
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_workerId, "test@mail.ru", sum: 10, false, softwares: [(_softwareId, 10, 1.1)], requestDate: DateTime.UtcNow.AddHours(12));
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_workerId, "test@mail.ru", softwares: [(_softwareId, 1, 1.1), (software.Id, 4, 1.1)], requestDate: DateTime.UtcNow.AddHours(12));
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_workerId, "test@mail.ru", sum: 10, false, softwares: [(software.Id, 10, 1.1)], requestDate: DateTime.UtcNow.AddHours(12));
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_workerId, "test@mail.ru", softwares: [(software.Id, 1, 1.1), (_softwareId, 1, 1.1)], requestDate: DateTime.UtcNow.AddHours(12));
//Act
var response = await HttpClient.GetAsync($"/api/requests/getsoftwarerecords?id={_softwareId}&fromDate={DateTime.UtcNow.AddDays(-1):MM/dd/yyyy HH:mm:ss}&toDate={DateTime.UtcNow.AddDays(1):MM/dd/yyyy HH:mm:ss}");
var responseContent = await response.Content.ReadAsStringAsync();
Console.WriteLine($"Response: {response.StatusCode}, Content: {responseContent}");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
var data = await GetModelFromResponseAsync<List<RequestViewModel>>(response);
@@ -150,6 +154,8 @@ internal class RequestControllerTests : BaseWebApiControllerTest
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(_workerId, "test@mail.ru", sum: 10, false, softwares: [(_softwareId, 10, 1.1)]);
//Act
var response = await HttpClient.GetAsync($"/api/requests/getsoftwarerecords?id={software.Id}&fromDate={DateTime.UtcNow.AddDays(-1):MM/dd/yyyy HH:mm:ss}&toDate={DateTime.UtcNow.AddDays(1):MM/dd/yyyy HH:mm:ss}");
var responseContent = await response.Content.ReadAsStringAsync();
Console.WriteLine($"Response: {response.StatusCode}, Content: {responseContent}");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
var data = await GetModelFromResponseAsync<List<RequestViewModel>>(response);

View File

@@ -0,0 +1,253 @@
using SmallSoftwareContracts.ViewModels;
using SmallSoftwareDatabase.Models;
using SmallSoftwareTests.Infrastructure;
using System;
using System.Net;
namespace SmallSoftwareTests.WebApiControllersApi;
[TestFixture]
internal class SalaryControllerTests : BaseWebApiControllerTest
{
[TearDown]
public void TearDown()
{
SmallSoftwareDbContext.RemovePostsFromDatabase();
SmallSoftwareDbContext.RemoveRequestsFromDatabase();
SmallSoftwareDbContext.RemoveSoftwaresFromDatabase();
SmallSoftwareDbContext.RemoveManufacturersFromDatabase();
SmallSoftwareDbContext.RemoveSalariesFromDatabase();
SmallSoftwareDbContext.RemoveWorkersFromDatabase();
}
[Test]
public async Task GetList_WhenHaveRecords_ShouldSuccess_Test()
{
//Arrange
var worker = SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn(fio: "Иванов И.И.");
var salary = SmallSoftwareDbContext.InsertSalaryToDatabaseAndReturn(worker.Id, workerSalary: 100);
SmallSoftwareDbContext.InsertSalaryToDatabaseAndReturn(worker.Id);
SmallSoftwareDbContext.InsertSalaryToDatabaseAndReturn(worker.Id);
//Act
var response = await HttpClient.GetAsync($"/api/salaries/getrecords?fromDate={DateTime.UtcNow.AddDays(-1):MM/dd/yyyy HH:mm:ss}&toDate={DateTime.UtcNow.AddDays(1):MM/dd/yyyy HH:mm:ss}");
var responseContent = await response.Content.ReadAsStringAsync();
Console.WriteLine($"Response: {response.StatusCode}, Content: {responseContent}");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
var data = await GetModelFromResponseAsync<List<SalaryViewModel>>(response);
Assert.Multiple(() =>
{
Assert.That(data, Is.Not.Null);
Assert.That(data, Has.Count.EqualTo(3));
});
}
[Test]
public async Task GetList_WhenNoRecords_ShouldSuccess_Test()
{
//Act
var response = await HttpClient.GetAsync($"/api/salaries/getrecords?fromDate={DateTime.UtcNow.AddDays(-1):MM/dd/yyyy HH:mm:ss}&toDate={DateTime.UtcNow.AddDays(1):MM/dd/yyyy HH:mm:ss}");
var responseContent = await response.Content.ReadAsStringAsync();
Console.WriteLine($"Response: {response.StatusCode}, Content: {responseContent}");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
var data = await GetModelFromResponseAsync<List<SalaryViewModel>>(response);
Assert.Multiple(() =>
{
Assert.That(data, Is.Not.Null);
Assert.That(data, Has.Count.EqualTo(0));
});
}
[Test]
public async Task GetList_OnlyInDatePeriod_ShouldSuccess_Test()
{
//Arrange
var worker = SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn();
SmallSoftwareDbContext.InsertSalaryToDatabaseAndReturn(worker.Id, salaryDate: DateTime.UtcNow.AddDays(-2));
SmallSoftwareDbContext.InsertSalaryToDatabaseAndReturn(worker.Id, salaryDate: DateTime.UtcNow.AddDays(-1).AddMinutes(-5));
SmallSoftwareDbContext.InsertSalaryToDatabaseAndReturn(worker.Id, salaryDate: DateTime.UtcNow.AddDays(-1).AddMinutes(5));
SmallSoftwareDbContext.InsertSalaryToDatabaseAndReturn(worker.Id, salaryDate: DateTime.UtcNow.AddDays(1).AddMinutes(-5));
SmallSoftwareDbContext.InsertSalaryToDatabaseAndReturn(worker.Id, salaryDate: DateTime.UtcNow.AddDays(1).AddMinutes(5));
SmallSoftwareDbContext.InsertSalaryToDatabaseAndReturn(worker.Id, salaryDate: DateTime.UtcNow.AddDays(-2));
//Act
var response = await HttpClient.GetAsync($"/api/salaries/getrecords?fromDate={DateTime.UtcNow.AddDays(-1):MM/dd/yyyy HH:mm:ss}&toDate={DateTime.UtcNow.AddDays(1):MM/dd/yyyy HH:mm:ss}");
var responseContent = await response.Content.ReadAsStringAsync();
Console.WriteLine($"Response: {response.StatusCode}, Content: {responseContent}");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
var data = await GetModelFromResponseAsync<List<SalaryViewModel>>(response);
Assert.That(data, Is.Not.Null);
Assert.Multiple(() =>
{
Assert.That(data, Has.Count.EqualTo(2));
});
}
[Test]
public async Task GetList_WhenDateIsIncorrect_ShouldBadRequest_Test()
{
//Act
var response = await HttpClient.GetAsync($"/api/salaries/getworkerrecords?fromDate={DateTime.UtcNow.AddDays(1):MM/dd/yyyy HH:mm:ss}&toDate={DateTime.UtcNow.AddDays(-1):MM/dd/yyyy HH:mm:ss}");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest));
}
[Test]
public async Task GetList_ByWorker_ShouldSuccess_Test()
{
//Arrange
var worker1 = SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn();
var worker2 = SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn();
SmallSoftwareDbContext.InsertSalaryToDatabaseAndReturn(worker1.Id);
SmallSoftwareDbContext.InsertSalaryToDatabaseAndReturn(worker1.Id);
SmallSoftwareDbContext.InsertSalaryToDatabaseAndReturn(worker2.Id);
//Act
var response = await HttpClient.GetAsync($"/api/salaries/getworkerrecords?fromDate={DateTime.UtcNow.AddDays(-1):MM/dd/yyyy HH:mm:ss}&toDate={DateTime.UtcNow.AddDays(1):MM/dd/yyyy HH:mm:ss}&id={worker1.Id}");
var responseContent = await response.Content.ReadAsStringAsync();
Console.WriteLine($"Response: {response.StatusCode}, Content: {responseContent}");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
var data = await GetModelFromResponseAsync<List<SalaryViewModel>>(response);
Assert.That(data, Is.Not.Null);
Assert.Multiple(() =>
{
Assert.That(data, Has.Count.EqualTo(2));
Assert.That(data.All(x => x.WorkerId == worker1.Id));
});
}
[Test]
public async Task GetList_ByWorker_OnlyInDatePeriod_ShouldSuccess_Test()
{
//Arrange
var worker1 = SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn();
var worker2 = SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn();
SmallSoftwareDbContext.InsertSalaryToDatabaseAndReturn(worker1.Id, salaryDate: DateTime.UtcNow.AddDays(-2));
SmallSoftwareDbContext.InsertSalaryToDatabaseAndReturn(worker1.Id, salaryDate: DateTime.UtcNow.AddDays(-1).AddMinutes(5));
SmallSoftwareDbContext.InsertSalaryToDatabaseAndReturn(worker2.Id, salaryDate: DateTime.UtcNow.AddDays(-1).AddMinutes(5));
SmallSoftwareDbContext.InsertSalaryToDatabaseAndReturn(worker1.Id, salaryDate: DateTime.UtcNow.AddDays(1).AddMinutes(-5));
SmallSoftwareDbContext.InsertSalaryToDatabaseAndReturn(worker2.Id, salaryDate: DateTime.UtcNow.AddDays(1).AddMinutes(-5));
SmallSoftwareDbContext.InsertSalaryToDatabaseAndReturn(worker1.Id, salaryDate: DateTime.UtcNow.AddDays(-2));
//Act
var response = await HttpClient.GetAsync($"/api/salaries/getworkerrecords?fromDate={DateTime.UtcNow.AddDays(-1):MM/dd/yyyy HH:mm:ss}&toDate={DateTime.UtcNow.AddDays(1):MM/dd/yyyy HH:mm:ss}&id={worker1.Id}");
var responseContent = await response.Content.ReadAsStringAsync();
Console.WriteLine($"Response: {response.StatusCode}, Content: {responseContent}");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
var data = await GetModelFromResponseAsync<List<SalaryViewModel>>(response);
Assert.That(data, Is.Not.Null);
Assert.Multiple(() =>
{
Assert.That(data, Has.Count.EqualTo(2));
Assert.That(data.All(x => x.WorkerId == worker1.Id));
});
}
[Test]
public async Task GetList_ByWorker_WhenDateIsIncorrect_ShouldBadRequest_Test()
{
//Arrange
var worker = SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn();
//Act
var response = await HttpClient.GetAsync($"/api/salaries/getworkerrecords?fromDate={DateTime.UtcNow.AddDays(1):MM/dd/yyyy HH:mm:ss}&toDate={DateTime.UtcNow.AddDays(-1):MM/dd/yyyy HH:mm:ss}&id={worker.Id}");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest));
}
[Test]
public async Task GetList_ByWorker_WhenIdIsNotGuid_ShouldBadRequest_Test()
{
//Act
var response = await HttpClient.GetAsync($"/api/salaries/getworkerrecords?fromDate={DateTime.UtcNow.AddDays(-1):MM/dd/yyyy HH:mm:ss}&toDate={DateTime.UtcNow.AddDays(1):MM/dd/yyyy HH:mm:ss}&id=id");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest));
}
[Test]
public async Task Calculate_ShouldSuccess_Test()
{
//Arrange
var post = SmallSoftwareDbContext.InsertPostToDatabaseAndReturn();
var worker = SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn(postId: post.PostId);
var manufacturer = SmallSoftwareDbContext.InsertManufacturerToDatabaseAndReturn();
var software = SmallSoftwareDbContext.InsertSoftwareToDatabaseAndReturn(manufacturer.Id, softwareName: "test", isDeleted: false);
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(worker.Id, email: "ntrrvj@mail.ru", sum: 1, false, softwares: [(software.Id, 10, 1.0)]);
//Act
var response = await HttpClient.PostAsync($"/api/salaries/calculate?date={DateTime.UtcNow:MM/dd/yyyy}", null);
var responseContent = await response.Content.ReadAsStringAsync();
Console.WriteLine($"Response: {response.StatusCode}, Content: {responseContent}");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.NoContent));
var salaries = SmallSoftwareDbContext.GetSalariesFromDatabaseByWorkerId(worker.Id);
Assert.Multiple(() =>
{
Assert.That(salaries, Has.Length.EqualTo(1));
Assert.That(salaries.First().WorkerSalary, Is.EqualTo(10.1d));
Assert.That(salaries.First().SalaryDate.Month, Is.EqualTo(DateTime.UtcNow.Month));
});
}
[Test]
public async Task Calculate_WithoutWorkers_ShouldSuccess_Test()
{
//Act
var response = await HttpClient.PostAsync($"/api/salaries/calculate?date={DateTime.UtcNow:MM/dd/yyyy}", null);
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.NoContent));
var salaries = SmallSoftwareDbContext.Salaries.ToArray();
Assert.That(salaries, Has.Length.EqualTo(0));
}
[Test]
public async Task Calculate_WithoutRequestsByWorker_ShouldSuccess_Test()
{
//Arrange
var post = SmallSoftwareDbContext.InsertPostToDatabaseAndReturn(salary: 111);
var worker1 = SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn(postId: post.PostId);
var worker2 = SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn(postId: post.PostId);
var manufacturer = SmallSoftwareDbContext.InsertManufacturerToDatabaseAndReturn();
var software = SmallSoftwareDbContext.InsertSoftwareToDatabaseAndReturn(manufacturer.Id,
softwareName: "test", isDeleted: false);
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(worker1.Id, email: "neeeeevj@mail.ru",sum: 2, softwares: [(software.Id, 10, 1.1)]);
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(worker2.Id, email: "oiuy@mail.ru", sum: 2, softwares: [(software.Id, 10, 1.1)]);
//Act
var response = await HttpClient.PostAsync($"/api/salaries/calculate?date={DateTime.UtcNow:MM/dd/yyyy}", null);
var responseContent = await response.Content.ReadAsStringAsync();
Console.WriteLine($"Response: {response.StatusCode}, Content: {responseContent}");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.NoContent));
var salary1 = SmallSoftwareDbContext.GetSalariesFromDatabaseByWorkerId(worker1.Id).First().WorkerSalary;
var salary2 = SmallSoftwareDbContext.GetSalariesFromDatabaseByWorkerId(worker2.Id).First().WorkerSalary;
Assert.That(salary1, Is.EqualTo(salary2));
}
[Test]
public async Task Calculate_PostNotFound_ShouldNotFound_Test()
{
//Arrange
SmallSoftwareDbContext.InsertPostToDatabaseAndReturn();
var worker = SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn(postId: Guid.NewGuid().ToString());
var manufacturer = SmallSoftwareDbContext.InsertManufacturerToDatabaseAndReturn();
var software = SmallSoftwareDbContext.InsertSoftwareToDatabaseAndReturn(manufacturer.Id,
softwareName: "test", isDeleted: false);
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(worker.Id, email: "nvbvbvj@mail.ru", sum: 2, softwares: [(software.Id, 10, 1.1)], requestDate: DateTime.UtcNow);
SmallSoftwareDbContext.InsertRequestToDatabaseAndReturn(worker.Id, email: "qqq@mail.ru", sum: 2, softwares: [(software.Id, 10, 1.1)], requestDate: DateTime.UtcNow);
//Act
var response = await HttpClient.PostAsync($"/api/salaries/calculate?date={DateTime.UtcNow:MM/dd/yyyy}", null);
var responseContent = await response.Content.ReadAsStringAsync();
Console.WriteLine($"Response: {response.StatusCode}, Content: {responseContent}");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.NotFound));
}
private static void AssertElement(SalaryViewModel? actual, Salary expected)
{
Assert.That(actual, Is.Not.Null);
Assert.Multiple(() =>
{
Assert.That(actual.WorkerFIO, Is.EqualTo(expected.Worker!.FIO));
Assert.That(actual.Salary, Is.EqualTo(expected.WorkerSalary));
});
}
}

View File

@@ -0,0 +1,682 @@
using SmallSoftwareContracts.BindingModels;
using SmallSoftwareContracts.ViewModels;
using SmallSoftwareDatabase.Models;
using SmallSoftwareTests.Infrastructure;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
namespace SmallSoftwareTests.WebApiControllersApi;
[TestFixture]
internal class WorkerControllerTests : BaseWebApiControllerTest
{
private Post _post;
[SetUp]
public void SetUp()
{
_post = SmallSoftwareDbContext.InsertPostToDatabaseAndReturn();
}
[TearDown]
public void TearDown()
{
SmallSoftwareDbContext.RemovePostsFromDatabase();
SmallSoftwareDbContext.RemoveWorkersFromDatabase();
}
[Test]
public async Task GetList_WhenHaveRecords_ShouldSuccess_Test()
{
//Arrange
var worker = SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn(fio:
"fio 1", postId: _post.PostId)
.AddPost(_post);
SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn(fio: "fio 2",
postId: _post.PostId);
SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn(fio: "fio 3",
postId: _post.PostId);
//Act
var response = await HttpClient.GetAsync("/api/workers/getrecords");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
var data = await
GetModelFromResponseAsync<List<WorkerViewModel>>(response);
Assert.Multiple(() =>
{
Assert.That(data, Is.Not.Null);
Assert.That(data, Has.Count.EqualTo(3));
});
AssertElement(data.First(x => x.Id == worker.Id), worker);
}
[Test]
public async Task GetList_WhenNoRecords_ShouldSuccess_Test()
{
//Act
var response = await HttpClient.GetAsync("/api/workers/getrecords");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
var data = await
GetModelFromResponseAsync<List<WorkerViewModel>>(response);
Assert.Multiple(() =>
{
Assert.That(data, Is.Not.Null);
Assert.That(data, Has.Count.EqualTo(0));
});
}
[Test]
public async Task GetList_OnlyActual_ShouldSuccess_Test()
{
//Arrange
SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn(fio: "fio 1",
postId: _post.PostId, isDeleted: true);
SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn(fio: "fio 2",
postId: _post.PostId, isDeleted: false);
SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn(fio: "fio 3",
postId: _post.PostId, isDeleted: false);
//Act
var response = await
HttpClient.GetAsync("/api/workers/getrecords?includeDeleted=false");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
var data = await
GetModelFromResponseAsync<List<WorkerViewModel>>(response);
Assert.That(data, Is.Not.Null);
Assert.Multiple(() =>
{
Assert.That(data, Has.Count.EqualTo(2));
Assert.That(data.All(x => !x.IsDeleted));
});
}
[Test]
public async Task GetList_IncludeNoActual_ShouldSuccess_Test()
{
//Arrange
SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn(fio: "fio 1",
postId: _post.PostId, isDeleted: true);
SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn(fio: "fio 2",
postId: _post.PostId, isDeleted: true);
SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn(fio: "fio 3",
postId: _post.PostId, isDeleted: false);
//Act
var response = await
HttpClient.GetAsync("/api/workers/getrecords?includeDeleted=true");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
var data = await
GetModelFromResponseAsync<List<WorkerViewModel>>(response);
Assert.That(data, Is.Not.Null);
Assert.Multiple(() =>
{
Assert.That(data, Has.Count.EqualTo(3));
Assert.That(data.Any(x => x.IsDeleted));
Assert.That(data.Any(x => !x.IsDeleted));
});
}
[Test]
public async Task GetList_ByPostId_ShouldSuccess_Test()
{
//Arrange
SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn(fio: "fio 1",
postId: _post.PostId);
SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn(fio: "fio 2",
postId: _post.PostId);
SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn(fio: "fio 3",
postId: _post.PostId, isDeleted: true);
SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn(fio: "fio 4");
//Act
var response = await
HttpClient.GetAsync($"/api/workers/getpostrecords?id={_post.PostId}&includeDeleted=true");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
var data = await
GetModelFromResponseAsync<List<WorkerViewModel>>(response);
Assert.That(data, Is.Not.Null);
Assert.Multiple(() =>
{
Assert.That(data, Has.Count.EqualTo(3));
Assert.That(data.All(x => x.PostId == _post.PostId));
});
}
[Test]
public async Task GetList_ByPostId_WhenNoRecords_ShouldSuccess_Test()
{
//Arrange
SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn(fio: "fio 1",
postId: _post.PostId);
SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn(fio: "fio 4");
//Act
var response = await
HttpClient.GetAsync($"/api/workers/getpostrecords?id={Guid.NewGuid()}&includeDeleted = true");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
var data = await
GetModelFromResponseAsync<List<WorkerViewModel>>(response);
Assert.That(data, Is.Not.Null);
Assert.That(data, Has.Count.EqualTo(0));
}
[Test]
public async Task
GetList_ByPostId_WhenIdIsIncorrect_ShouldBadRequest_Test()
{
//Act
var response = await
HttpClient.GetAsync($"/api/workers/getpostrecords?id=id&includeDeleted=true");
//Assert
Assert.That(response.StatusCode,
Is.EqualTo(HttpStatusCode.BadRequest));
}
[Test]
public async Task GetList_ByBirthDate_ShouldSuccess_Test()
{
//Arrange
SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn(fio: "fio 1",
birthDate: DateTime.UtcNow.AddYears(-25));
SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn(fio: "fio 2",
birthDate: DateTime.UtcNow.AddYears(-21));
SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn(fio: "fio 3",
birthDate: DateTime.UtcNow.AddYears(-20), isDeleted: true);
SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn(fio: "fio 4",
birthDate: DateTime.UtcNow.AddYears(-19));
//Act
var fromDate = DateTime.UtcNow.AddYears(-21).AddMinutes(-1).ToString("o");
var toDate = DateTime.UtcNow.AddYears(-20).AddMinutes(1).ToString("o");
var response = await HttpClient
.GetAsync($"/api/workers/getbirthdaterecords?fromDate={fromDate}&toDate={toDate}&includeDeleted=true");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
var data = await
GetModelFromResponseAsync<List<WorkerViewModel>>(response);
Assert.That(data, Is.Not.Null);
Assert.Multiple(() =>
{
Assert.That(data, Has.Count.EqualTo(2));
});
}
[Test]
public async Task
GetList_ByBirthDate_WhenDateIsIncorrect_ShouldBadRequest_Test()
{
//Act
var response = await
HttpClient.GetAsync($"/api/workers/getbirthdaterecords?fromDate={DateTime.UtcNow.
AddMinutes(1):MM/dd/yyyy HH:mm:ss}&toDate={DateTime.UtcNow.AddMinutes(-
1):MM/dd/yyyy HH:mm:ss}&includeDeleted=true");
//Assert
Assert.That(response.StatusCode,
Is.EqualTo(HttpStatusCode.BadRequest));
}
[Test]
public async Task GetList_ByEmploymentDate_ShouldSuccess_Test()
{
//Arrange
SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn(fio: "fio 1",
employmentDate: DateTime.UtcNow.AddDays(-2));
SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn(fio: "fio 2",
employmentDate: DateTime.UtcNow.AddDays(-1));
SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn(fio: "fio 3",
employmentDate: DateTime.UtcNow.AddDays(1), isDeleted: true);
SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn(fio: "fio 4",
employmentDate: DateTime.UtcNow.AddDays(2));
//Act
var response = await
HttpClient.GetAsync($"/api/workers/getemploymentrecords?fromDate={DateTime.UtcNow
.AddDays(-1).AddMinutes(-1):o}&toDate={DateTime.UtcNow
.AddDays(1).AddMinutes(1):o}&includeDeleted=true");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
var data = await
GetModelFromResponseAsync<List<WorkerViewModel>>(response);
Assert.That(data, Is.Not.Null);
Assert.Multiple(() =>
{
Assert.That(data, Has.Count.EqualTo(2));
});
}
[Test]
public async Task
GetList_ByEmploymentDate_WhenDateIsIncorrect_ShouldBadRequest_Test()
{
//Act
var response = await
HttpClient.GetAsync($"/api/workers/getemploymentrecords?fromDate={DateTime.UtcNow
.AddMinutes(1):MM/dd/yyyy HH:mm:ss}&toDate={DateTime.UtcNow.AddMinutes(-
1):MM/dd/yyyy HH:mm:ss}&includeDeleted=true");
//Assert
Assert.That(response.StatusCode,
Is.EqualTo(HttpStatusCode.BadRequest));
}
[Test]
public async Task GetElement_ById_WhenHaveRecord_ShouldSuccess_Test()
{
//Arrange
var worker =
SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn(postId:
_post.PostId).AddPost(_post);
//Act
var response = await
HttpClient.GetAsync($"/api/workers/getrecord/{worker.Id}");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
AssertElement(await
GetModelFromResponseAsync<WorkerViewModel>(response), worker);
}
[Test]
public async Task GetElement_ById_WhenNoRecord_ShouldNotFound_Test()
{
//Arrange
SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn();
//Act
var response = await
HttpClient.GetAsync($"/api/workers/getrecord/{Guid.NewGuid()}");
//Assert
Assert.That(response.StatusCode,
Is.EqualTo(HttpStatusCode.NotFound));
}
[Test]
public async Task
GetElement_ById_WhenRecordWasDeleted_ShouldNotFound_Test()
{
//Arrange
var worker =
SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn(postId: _post.PostId,
isDeleted: true);
//Act
var response = await
HttpClient.GetAsync($"/api/workers/getrecord/{worker.Id}");
//Assert
Assert.That(response.StatusCode,
Is.EqualTo(HttpStatusCode.NotFound));
}
[Test]
public async Task GetElement_ByFIO_WhenHaveRecord_ShouldSuccess_Test()
{
//Arrange
var worker =
SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn(postId:
_post.PostId).AddPost(_post);
//Act
var response = await
HttpClient.GetAsync($"/api/workers/getrecord/{worker.FIO}");
//Assert
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
AssertElement(await
GetModelFromResponseAsync<WorkerViewModel>(response), worker);
}
[Test]
public async Task GetElement_ByFIO_WhenNoRecord_ShouldNotFound_Test()
{
//Arrange
SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn();
//Act
var response = await
HttpClient.GetAsync($"/api/workers/getrecord/New%20Fio");
//Assert
Assert.That(response.StatusCode,
Is.EqualTo(HttpStatusCode.NotFound));
}
[Test]
public async Task
GetElement_ByFIO_WhenRecordWasDeleted_ShouldNotFound_Test()
{
//Arrange
var worker =
SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn(postId: _post.PostId,
isDeleted: true);
//Act
var response = await
HttpClient.GetAsync($"/api/workers/getrecord/{worker.FIO}");
//Assert
Assert.That(response.StatusCode,
Is.EqualTo(HttpStatusCode.NotFound));
}
[Test]
public async Task Post_ShouldSuccess_Test()
{
//Arrange
SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn();
var workerModel = CreateModel(_post.Id);
//Act
var response = await HttpClient.PostAsync($"/api/workers/register",
MakeContent(workerModel));
//Assert
Assert.That(response.StatusCode,
Is.EqualTo(HttpStatusCode.NoContent));
AssertElement(SmallSoftwareDbContext.GetWorkerFromDatabaseById(workerModel.Id!
), workerModel);
}
[Test]
public async Task Post_WhenHaveRecordWithSameId_ShouldBadRequest_Test()
{
//Arrange
var workerModel = CreateModel(_post.Id);
SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn(workerModel.Id);
//Act
var response = await HttpClient.PostAsync($"/api/workers/register",
MakeContent(workerModel));
//Assert
Assert.That(response.StatusCode,
Is.EqualTo(HttpStatusCode.BadRequest));
}
[Test]
public async Task Post_WhenDataIsIncorrect_ShouldBadRequest_Test()
{
//Arrange
var workerModelWithIdIncorrect = new WorkerBindingModel
{
Id = "Id",
FIO = "fio",
BirthDate = DateTime.UtcNow.AddYears(-22),
EmploymentDate =
DateTime.UtcNow.AddDays(-5),
PostId = _post.Id
};
var workerModelWithFioIncorrect = new WorkerBindingModel
{
Id =
Guid.NewGuid().ToString(),
FIO = string.Empty,
BirthDate =
DateTime.UtcNow.AddYears(-22),
EmploymentDate = DateTime.UtcNow.AddDays(-5),
PostId = _post.Id
};
var workerModelWithPostIdIncorrect = new WorkerBindingModel
{
Id =
Guid.NewGuid().ToString(),
FIO = "fio",
BirthDate = DateTime.UtcNow.AddYears(-
22),
EmploymentDate = DateTime.UtcNow.AddDays(-5),
PostId = "Id"
};
var workerModelWithBirthDateIncorrect = new WorkerBindingModel
{
Id =
Guid.NewGuid().ToString(),
FIO = "fio",
BirthDate = DateTime.UtcNow.AddYears(-
15),
EmploymentDate = DateTime.UtcNow.AddDays(-5),
PostId = _post.Id
};
//Act
var responseWithIdIncorrect = await
HttpClient.PostAsync($"/api/workers/register",
MakeContent(workerModelWithIdIncorrect));
var responseWithFioIncorrect = await
HttpClient.PostAsync($"/api/workers/register",
MakeContent(workerModelWithFioIncorrect));
var responseWithPostIdIncorrect = await
HttpClient.PostAsync($"/api/workers/register",
MakeContent(workerModelWithPostIdIncorrect));
var responseWithBirthDateIncorrect = await
HttpClient.PostAsync($"/api/workers/register",
MakeContent(workerModelWithBirthDateIncorrect));
//Assert
Assert.Multiple(() =>
{
Assert.That(responseWithIdIncorrect.StatusCode,
Is.EqualTo(HttpStatusCode.BadRequest), "Id is incorrect");
Assert.That(responseWithFioIncorrect.StatusCode,
Is.EqualTo(HttpStatusCode.BadRequest), "Fio is incorrect");
Assert.That(responseWithPostIdIncorrect.StatusCode,
Is.EqualTo(HttpStatusCode.BadRequest), "PostId is incorrect");
Assert.That(responseWithBirthDateIncorrect.StatusCode,
Is.EqualTo(HttpStatusCode.BadRequest), "BirthDate is incorrect");
});
}
[Test]
public async Task Post_WhenSendEmptyData_ShouldBadRequest_Test()
{
//Act
var response = await HttpClient.PostAsync($"/api/workers/register",
MakeContent(string.Empty));
//Assert
Assert.That(response.StatusCode,
Is.EqualTo(HttpStatusCode.BadRequest));
}
[Test]
public async Task Post_WhenSendWrongFormatData_ShouldBadRequest_Test()
{
//Act
var response = await HttpClient.PostAsync($"/api/workers/register",
MakeContent(new { Data = "test", Position = 10 }));
//Assert
Assert.That(response.StatusCode,
Is.EqualTo(HttpStatusCode.BadRequest));
}
[Test]
public async Task Put_ShouldSuccess_Test()
{
//Arrange
var workerModel = CreateModel(_post.Id);
SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn(workerModel.Id);
//Act
var response = await HttpClient.PutAsync($"/api/workers/changeinfo",
MakeContent(workerModel));
//Assert
Assert.That(response.StatusCode,
Is.EqualTo(HttpStatusCode.NoContent));
SmallSoftwareDbContext.ChangeTracker.Clear();
AssertElement(SmallSoftwareDbContext.GetWorkerFromDatabaseById(workerModel.Id!), workerModel);
}
[Test]
public async Task Put_WhenNoFoundRecord_ShouldBadRequest_Test()
{
//Arrange
var workerModel = CreateModel(_post.Id, fio: "new fio");
SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn();
//Act
var response = await HttpClient.PutAsync($"/api/workers/changeinfo",
MakeContent(workerModel));
//Assert
Assert.That(response.StatusCode,
Is.EqualTo(HttpStatusCode.BadRequest));
}
[Test]
public async Task Put_WhenRecordWasDeleted_ShouldBadRequest_Test()
{
//Arrange
var workerModel = CreateModel(_post.Id, fio: "new fio");
SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn(workerModel.Id,
isDeleted: true);
//Act
var response = await HttpClient.PutAsync($"/api/workers/changeinfo",
MakeContent(workerModel));
//Assert
Assert.That(response.StatusCode,
Is.EqualTo(HttpStatusCode.BadRequest));
}
[Test]
public async Task Put_WhenDataIsIncorrect_ShouldBadRequest_Test()
{
//Arrange
var workerModelWithIdIncorrect = new WorkerBindingModel
{
Id = "Id",
FIO = "fio",
BirthDate = DateTime.UtcNow.AddYears(-22),
EmploymentDate =
DateTime.UtcNow.AddDays(-5),
PostId = _post.Id
};
var workerModelWithFioIncorrect = new WorkerBindingModel
{
Id =
Guid.NewGuid().ToString(),
FIO = string.Empty,
BirthDate =
DateTime.UtcNow.AddYears(-22),
EmploymentDate = DateTime.UtcNow.AddDays(-5),
PostId = _post.Id
};
var workerModelWithPostIdIncorrect = new WorkerBindingModel
{
Id =
Guid.NewGuid().ToString(),
FIO = "fio",
BirthDate = DateTime.UtcNow.AddYears(-
22),
EmploymentDate = DateTime.UtcNow.AddDays(-5),
PostId = "Id"
};
var workerModelWithBirthDateIncorrect = new WorkerBindingModel
{
Id =
Guid.NewGuid().ToString(),
FIO = "fio",
BirthDate = DateTime.UtcNow.AddYears(-
15),
EmploymentDate = DateTime.UtcNow.AddDays(-5),
PostId = _post.Id
};
//Act
var responseWithIdIncorrect = await
HttpClient.PutAsync($"/api/workers/changeinfo",
MakeContent(workerModelWithIdIncorrect));
var responseWithFioIncorrect = await
HttpClient.PutAsync($"/api/workers/changeinfo",
MakeContent(workerModelWithFioIncorrect));
var responseWithPostIdIncorrect = await
HttpClient.PutAsync($"/api/workers/changeinfo",
MakeContent(workerModelWithPostIdIncorrect));
var responseWithBirthDateIncorrect = await
HttpClient.PutAsync($"/api/workers/changeinfo",
MakeContent(workerModelWithBirthDateIncorrect));
//Assert
Assert.Multiple(() =>
{
Assert.That(responseWithIdIncorrect.StatusCode,
Is.EqualTo(HttpStatusCode.BadRequest), "Id is incorrect");
Assert.That(responseWithFioIncorrect.StatusCode,
Is.EqualTo(HttpStatusCode.BadRequest), "Fio is incorrect");
Assert.That(responseWithPostIdIncorrect.StatusCode,
Is.EqualTo(HttpStatusCode.BadRequest), "PostId is incorrect");
Assert.That(responseWithBirthDateIncorrect.StatusCode,
Is.EqualTo(HttpStatusCode.BadRequest), "BirthDate is incorrect");
});
}
[Test]
public async Task Put_WhenSendEmptyData_ShouldBadRequest_Test()
{
//Act
var response = await HttpClient.PutAsync($"/api/workers/changeinfo",
MakeContent(string.Empty));
//Assert
Assert.That(response.StatusCode,
Is.EqualTo(HttpStatusCode.BadRequest));
}
[Test]
public async Task Put_WhenSendWrongFormatData_ShouldBadRequest_Test()
{
//Act
var response = await HttpClient.PutAsync($"/api/workers/changeinfo",
MakeContent(new { Data = "test", Position = 10 }));
//Assert
Assert.That(response.StatusCode,
Is.EqualTo(HttpStatusCode.BadRequest));
}
[Test]
public async Task Delete_ShouldSuccess_Test()
{
//Arrange
var workerId = Guid.NewGuid().ToString();
SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn(workerId);
//Act
var response = await
HttpClient.DeleteAsync($"/api/workers/delete/{workerId}");
SmallSoftwareDbContext.ChangeTracker.Clear();
//Assert
Assert.Multiple(() =>
{
Assert.That(response.StatusCode,
Is.EqualTo(HttpStatusCode.NoContent));
Assert.That(SmallSoftwareDbContext.GetWorkerFromDatabaseById(workerId)!.IsDeleted);
});
}
[Test]
public async Task Delete_WhenNoFoundRecord_ShouldBadRequest_Test()
{
//Arrange
SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn();
//Act
var response = await
HttpClient.DeleteAsync($"/api/workers/delete/{Guid.NewGuid()}");
//Assert
Assert.That(response.StatusCode,
Is.EqualTo(HttpStatusCode.BadRequest));
}
[Test]
public async Task Delete_WhenSendWrongFormatData_ShouldBadRequest_Test()
{
//Act
var response = await
HttpClient.DeleteAsync($"/api/workers/delete/id");
//Assert
Assert.That(response.StatusCode,
Is.EqualTo(HttpStatusCode.BadRequest));
}
[Test]
public async Task Delete_WhenRecordWasDeleted_ShouldBadRequest_Test()
{
//Arrange
var workerId =
SmallSoftwareDbContext.InsertWorkerToDatabaseAndReturn(isDeleted: true).Id;
//Act
var response = await
HttpClient.DeleteAsync($"/api/workers/delete/{workerId}");
//Assert
Assert.That(response.StatusCode,
Is.EqualTo(HttpStatusCode.BadRequest));
}
private static void AssertElement(WorkerViewModel? actual, Worker 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.PostName,
Is.EqualTo(expected.Post!.PostName));
Assert.That(actual.FIO, Is.EqualTo(expected.FIO));
Assert.That(actual.BirthDate.ToString(),
Is.EqualTo(expected.BirthDate.ToString()));
Assert.That(actual.EmploymentDate.ToString(),
Is.EqualTo(expected.EmploymentDate.ToString()));
Assert.That(actual.IsDeleted, Is.EqualTo(expected.IsDeleted));
});
}
private static WorkerBindingModel CreateModel(string postId, string? id =
null, string fio = "fio", DateTime? birthDate = null, DateTime? employmentDate =
null)
{
return new()
{
Id = id ?? Guid.NewGuid().ToString(),
FIO = fio,
BirthDate = birthDate ?? DateTime.UtcNow.AddYears(-22),
EmploymentDate = employmentDate ?? DateTime.UtcNow.AddDays(-
5),
PostId = postId
};
}
private static void AssertElement(Worker? actual, WorkerBindingModel
expected)
{
Assert.That(actual, Is.Not.Null);
Assert.Multiple(() =>
{
Assert.That(actual.Id, Is.EqualTo(expected.Id));
Assert.That(actual.PostId, Is.EqualTo(expected.PostId));
Assert.That(actual.FIO, Is.EqualTo(expected.FIO));
Assert.That(actual.BirthDate.ToString(), Is.EqualTo(expected.BirthDate.ToString()));
Assert.That(actual.EmploymentDate.ToString(), Is.EqualTo(expected.EmploymentDate.ToString()));
Assert.That(!actual.IsDeleted);
});
}
}

View File

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

View File

@@ -0,0 +1,299 @@
using AutoMapper;
using SmallSoftwareContracts.AdapterContracts.OperationResponses;
using SmallSoftwareContracts.AdapterContracts;
using SmallSoftwareContracts.BindingModels;
using SmallSoftwareContracts.BusinessLogicsContracts;
using SmallSoftwareContracts.DataModels;
using SmallSoftwareContracts.Exceptions;
using SmallSoftwareContracts.ViewModels;
using SmallSoftwareDatabase.Models;
using static System.Runtime.InteropServices.JavaScript.JSType;
namespace SmallSoftwareWebApi.Adapters;
public class WorkerAdapter : IWorkerAdapter
{
private readonly IWorkerBusinessLogicContract _workerBusinessLogicContract;
private readonly ILogger _logger;
private readonly Mapper _mapper;
public WorkerAdapter(IWorkerBusinessLogicContract
workerBusinessLogicContract, ILogger<WorkerAdapter> logger)
{
_workerBusinessLogicContract = workerBusinessLogicContract;
_logger = logger;
var config = new MapperConfiguration(cfg =>
{
cfg.CreateMap<WorkerBindingModel, WorkerDataModel>();
cfg.CreateMap<WorkerDataModel, WorkerViewModel>();
});
_mapper = new Mapper(config);
}
public WorkerOperationResponse GetList(bool includeDeleted)
{
try
{
return WorkerOperationResponse.OK([.. _workerBusinessLogicContract.GetAllWorkers(!includeDeleted)
.Select(x => _mapper.Map<WorkerViewModel>(x))]);
}
catch (NullListException)
{
_logger.LogError("NullListException");
return WorkerOperationResponse.NotFound("The list is not initialized");
}
catch (StorageException ex)
{
_logger.LogError(ex, "StorageException");
return WorkerOperationResponse
.InternalServerError($"Error while working with data storage: { ex.InnerException!.Message}");
}
catch (Exception ex)
{
_logger.LogError(ex, "Exception");
return
WorkerOperationResponse.InternalServerError(ex.Message);
}
}
public WorkerOperationResponse GetPostList(string id, bool includeDeleted)
{
try
{
return WorkerOperationResponse.OK([..
_workerBusinessLogicContract.GetAllWorkersByPost(id, !includeDeleted).Select(x => _mapper.Map<WorkerViewModel>(x))]);
}
catch (ValidationException ex)
{
_logger.LogError(ex, "ValidationException");
return WorkerOperationResponse.BadRequest($"Incorrect data transmitted: { ex.Message}");
}
catch (NullListException)
{
_logger.LogError("NullListException");
return WorkerOperationResponse.NotFound("The list is not initialized");
}
catch (StorageException ex)
{
_logger.LogError(ex, "StorageException");
return WorkerOperationResponse
.InternalServerError($"Error while working with data storage: { ex.InnerException!.Message}");
}
catch (Exception ex)
{
_logger.LogError(ex, "Exception");
return
WorkerOperationResponse.InternalServerError(ex.Message);
}
}
public WorkerOperationResponse GetListByBirthDate(DateTime fromDate,
DateTime toDate, bool includeDeleted)
{
try
{
return WorkerOperationResponse.OK([..
_workerBusinessLogicContract.GetAllWorkersByBirthDate(fromDate, toDate,
!includeDeleted).Select(x => _mapper.Map<WorkerViewModel>(x))]);
}
catch (IncorrectDatesException ex)
{
_logger.LogError(ex, "IncorrectDatesException");
return WorkerOperationResponse.BadRequest($"Incorrect dates: { ex.Message}");
}
catch (NullListException)
{
_logger.LogError("NullListException");
return WorkerOperationResponse.NotFound("The list is not initialized");
}
catch (StorageException ex)
{
_logger.LogError(ex, "StorageException");
return WorkerOperationResponse
.InternalServerError($"Error while working with data storage: { ex.InnerException!.Message}");
}
catch (Exception ex)
{
_logger.LogError(ex, "Exception");
return
WorkerOperationResponse.InternalServerError(ex.Message);
}
}
public WorkerOperationResponse GetListByEmploymentDate(DateTime fromDate,
DateTime toDate, bool includeDeleted)
{
try
{
return WorkerOperationResponse.OK([..
_workerBusinessLogicContract.GetAllWorkersByEmploymentDate(fromDate, toDate,
!includeDeleted).Select(x => _mapper.Map<WorkerViewModel>(x))]);
}
catch (IncorrectDatesException ex)
{
_logger.LogError(ex, "IncorrectDatesException");
return WorkerOperationResponse.BadRequest($"Incorrect dates: { ex.Message}");
}
catch (NullListException)
{
_logger.LogError("NullListException");
return WorkerOperationResponse.NotFound("The list is not initialized");
}
catch (StorageException ex)
{
_logger.LogError(ex, "StorageException");
return WorkerOperationResponse
.InternalServerError($"Error while working with data storage: { ex.InnerException!.Message}");
}
catch (Exception ex)
{
_logger.LogError(ex, "Exception");
return
WorkerOperationResponse.InternalServerError(ex.Message);
}
}
public WorkerOperationResponse GetElement(string data)
{
try
{
return
WorkerOperationResponse.OK(_mapper.Map<WorkerViewModel>(_workerBusinessLogicContract.GetWorkerByData(data)));
}
catch (ArgumentNullException ex)
{
_logger.LogError(ex, "ArgumentNullException");
return WorkerOperationResponse.BadRequest("Data is empty");
}
catch (ValidationException ex)
{
_logger.LogError(ex, "ValidationException");
return WorkerOperationResponse.BadRequest($"Incorrect data transmitted: { ex.Message}");
}
catch (ElementNotFoundException ex)
{
_logger.LogError(ex, "ElementNotFoundException");
return WorkerOperationResponse.NotFound($"Not found element by data { data}");
}
catch (StorageException ex)
{
_logger.LogError(ex, "StorageException");
return WorkerOperationResponse
.InternalServerError($"Error while working with data storage: { ex.InnerException!.Message}");
}
catch (Exception ex)
{
_logger.LogError(ex, "Exception");
return
WorkerOperationResponse.InternalServerError(ex.Message);
}
}
public WorkerOperationResponse RegisterWorker(WorkerBindingModel
workerModel)
{
try
{
_workerBusinessLogicContract.InsertWorker(_mapper.Map<WorkerDataModel>(workerModel));
return WorkerOperationResponse.NoContent();
}
catch (ArgumentNullException ex)
{
_logger.LogError(ex, "ArgumentNullException");
return WorkerOperationResponse.BadRequest("Data is empty");
}
catch (ValidationException ex)
{
_logger.LogError(ex, "ValidationException");
return WorkerOperationResponse.BadRequest($"Incorrect data transmitted: { ex.Message}");
}
catch (ElementExistsException ex)
{
_logger.LogError(ex, "ElementExistsException");
return WorkerOperationResponse.BadRequest(ex.Message);
}
catch (StorageException ex)
{
_logger.LogError(ex, "StorageException");
return WorkerOperationResponse
.BadRequest($"Error while working with data storage: { ex.InnerException!.Message}");
}
catch (Exception ex)
{
_logger.LogError(ex, "Exception");
return
WorkerOperationResponse.InternalServerError(ex.Message);
}
}
public WorkerOperationResponse ChangeWorkerInfo(WorkerBindingModel
workerModel)
{
try
{
_workerBusinessLogicContract.UpdateWorker(_mapper.Map<WorkerDataModel>(workerModel));
return WorkerOperationResponse.NoContent();
}
catch (ArgumentNullException ex)
{
_logger.LogError(ex, "ArgumentNullException");
return WorkerOperationResponse.BadRequest("Data is empty");
}
catch (ValidationException ex)
{
_logger.LogError(ex, "ValidationException");
return WorkerOperationResponse.BadRequest($"Incorrect data transmitted: { ex.Message}");
}
catch (ElementNotFoundException ex)
{
_logger.LogError(ex, "ElementNotFoundException");
return WorkerOperationResponse.BadRequest($"Not found element by Id { workerModel.Id}");
}
catch (ElementExistsException ex)
{
_logger.LogError(ex, "ElementExistsException");
return WorkerOperationResponse.BadRequest(ex.Message);
}
catch (StorageException ex)
{
_logger.LogError(ex, "StorageException");
return WorkerOperationResponse
.BadRequest($"Error while working with data storage: { ex.InnerException!.Message}");
}
catch (Exception ex)
{
_logger.LogError(ex, "Exception");
return
WorkerOperationResponse.InternalServerError(ex.Message);
}
}
public WorkerOperationResponse RemoveWorker(string id)
{
try
{
_workerBusinessLogicContract.DeleteWorker(id);
return WorkerOperationResponse.NoContent();
}
catch (ArgumentNullException ex)
{
_logger.LogError(ex, "ArgumentNullException");
return WorkerOperationResponse.BadRequest("Id is empty");
}
catch (ValidationException ex)
{
_logger.LogError(ex, "ValidationException");
return WorkerOperationResponse.BadRequest($"Incorrect data transmitted: { ex.Message}");
}
catch (ElementNotFoundException ex)
{
_logger.LogError(ex, "ElementNotFoundException");
return WorkerOperationResponse.BadRequest($"Not found element by id: { id}");
}
catch (StorageException ex)
{
_logger.LogError(ex, "StorageException");
return WorkerOperationResponse
.BadRequest($"Error while working with data storage: { ex.InnerException!.Message}");
}
catch (Exception ex)
{
_logger.LogError(ex, "Exception");
return
WorkerOperationResponse.InternalServerError(ex.Message);
}
}
}

View File

@@ -0,0 +1,42 @@
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using SmallSoftwareContracts.AdapterContracts;
using SmallSoftwareContracts.Exceptions;
namespace SmallSoftwareWebApi.Controllers;
[Authorize]
[Route("api/[controller]/[action]")]
[ApiController]
[Produces("application/json")]
public class SalariesController(ISalaryAdapter adapter) : ControllerBase
{
private readonly ISalaryAdapter _adapter = adapter;
[HttpGet]
public IActionResult GetRecords(DateTime fromDate, DateTime toDate)
{
return _adapter.GetListByPeriod(fromDate, toDate).GetResponse(Request, Response);
}
[HttpGet]
public IActionResult GetWorkerRecords(string id, DateTime fromDate, DateTime toDate)
{
return _adapter.GetListByPeriodByWorker(fromDate, toDate, id).GetResponse(Request, Response);
}
[HttpPost]
public IActionResult Calculate(DateTime date)
{
try
{
return _adapter.CalculateSalary(date).GetResponse(Request, Response);
}
catch (Exception ex)
{
return StatusCode(500, "Internal error");
}
}
}

View File

@@ -0,0 +1,63 @@
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using SmallSoftwareContracts.AdapterContracts;
using SmallSoftwareContracts.BindingModels;
namespace SmallSoftwareWebApi.Controllers;
[Authorize]
[Route("api/[controller]/[action]")]
[ApiController]
[Produces("application/json")]
public class WorkersController(IWorkerAdapter adapter) : ControllerBase
{
private readonly IWorkerAdapter _adapter = adapter;
[HttpGet]
public IActionResult GetRecords(bool includeDeleted = false)
{
return _adapter.GetList(includeDeleted).GetResponse(Request,
Response);
}
[HttpGet]
public IActionResult GetPostRecords(string id, bool includeDeleted = false)
{
return _adapter.GetPostList(id, includeDeleted).GetResponse(Request,
Response);
}
[HttpGet]
public IActionResult GetBirthDateRecords(DateTime fromDate, DateTime toDate, bool includeDeleted = false)
{
return _adapter.GetListByBirthDate(fromDate, toDate,
includeDeleted).GetResponse(Request, Response);
}
[HttpGet]
public IActionResult GetEmploymentRecords(DateTime fromDate, DateTime
toDate, bool includeDeleted = false)
{
return _adapter.GetListByEmploymentDate(fromDate, toDate,
includeDeleted).GetResponse(Request, Response);
}
[HttpGet("{data}")]
public IActionResult GetRecord(string data)
{
return _adapter.GetElement(data).GetResponse(Request, Response);
}
[HttpPost]
public IActionResult Register([FromBody] WorkerBindingModel model)
{
return _adapter.RegisterWorker(model).GetResponse(Request, Response);
}
[HttpPut]
public IActionResult ChangeInfo([FromBody] WorkerBindingModel model)
{
return _adapter.ChangeWorkerInfo(model).GetResponse(Request,
Response);
}
[HttpDelete("{id}")]
public IActionResult Delete(string id)
{
return _adapter.RemoveWorker(id).GetResponse(Request, Response);
}
}

View File

@@ -68,6 +68,8 @@ builder.Services.AddTransient<IManufacturerAdapter, ManufacturerAdapter>();
builder.Services.AddTransient<IPostAdapter, PostAdapter>();
builder.Services.AddTransient<ISoftwareAdapter, SoftwareAdapter>();
builder.Services.AddTransient<IRequestAdapter, RequestAdapter>();
builder.Services.AddTransient<IWorkerAdapter, WorkerAdapter>();
builder.Services.AddTransient<ISalaryAdapter, SalaryAdapter>();
// Learn more about configuring OpenAPI at https://aka.ms/aspnet/openapi
builder.Services.AddOpenApi();