using ButcherShopBusinessLogic.Implementations; using Microsoft.Extensions.Logging; using Moq; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using TheButcherShopContracts.DataModels; using TheButcherShopContracts.Enums; using TheButcherShopContracts.Exceptions; using TheButcherShopContracts.StoragesContracts; namespace ButcherShopTests.BusinessLogicsContractsTests; [TestFixture] internal class SalaryBusinessLogicContractTests { private SalaryBusinessLogicContract _salaryBusinessLogicContract; private Mock _salaryStorageContract; private Mock _saleStorageContract; private Mock _postStorageContract; private Mock _workerStorageContract; [OneTimeSetUp] public void OneTimeSetUp() { _salaryStorageContract = new Mock(); _saleStorageContract = new Mock(); _postStorageContract = new Mock(); _workerStorageContract = new Mock(); _salaryBusinessLogicContract = new SalaryBusinessLogicContract(_salaryStorageContract.Object, _saleStorageContract.Object, _postStorageContract.Object, _workerStorageContract.Object, new Mock().Object); } [SetUp] public void SetUp() { _salaryStorageContract.Reset(); _saleStorageContract.Reset(); _postStorageContract.Reset(); _workerStorageContract.Reset(); } [Test] public void GetAllSalaries_ReturnListOfRecords_Test() { //Arrange var startDate = DateTime.UtcNow; var endDate = DateTime.UtcNow.AddDays(1); var listOriginal = new List() { new(Guid.NewGuid().ToString(), DateTime.UtcNow, 10), new(Guid.NewGuid().ToString(), DateTime.UtcNow.AddDays(1), 14), new(Guid.NewGuid().ToString(), DateTime.UtcNow.AddDays(-1), 30), }; _salaryStorageContract.Setup(x => x.GetList(It.IsAny(), It.IsAny(), It.IsAny())).Returns(listOriginal); //Act var list = _salaryBusinessLogicContract.GetAllSalariesByPeriod(startDate, endDate); //Assert Assert.That(list, Is.Not.Null); Assert.That(list, Is.EquivalentTo(listOriginal)); _salaryStorageContract.Verify(x => x.GetList(startDate, endDate, null), Times.Once); } [Test] public void GetAllSalaries_ReturnEmptyList_Test() { //Arrange _salaryStorageContract.Setup(x => x.GetList(It.IsAny(), It.IsAny(), It.IsAny())).Returns([]); //Act var list = _salaryBusinessLogicContract.GetAllSalariesByPeriod(DateTime.UtcNow, DateTime.UtcNow.AddDays(1)); //Assert Assert.That(list, Is.Not.Null); Assert.That(list, Has.Count.EqualTo(0)); _salaryStorageContract.Verify(x => x.GetList(It.IsAny(), It.IsAny(), It.IsAny()), Times.Once); } [Test] public void GetAllSalaries_IncorrectDates_ThrowException_Test() { //Arrange var dateTime = DateTime.UtcNow; //Act&Assert Assert.That(() => _salaryBusinessLogicContract.GetAllSalariesByPeriod(dateTime, dateTime), Throws.TypeOf()); Assert.That(() => _salaryBusinessLogicContract.GetAllSalariesByPeriod(dateTime, dateTime.AddSeconds(-1)), Throws.TypeOf()); _salaryStorageContract.Verify(x => x.GetList(It.IsAny(), It.IsAny(), It.IsAny()), Times.Never); } [Test] public void GetAllSalaries_ReturnNull_ThrowException_Test() { //Act&Assert Assert.That(() => _salaryBusinessLogicContract.GetAllSalariesByPeriod(DateTime.UtcNow, DateTime.UtcNow.AddDays(1)), Throws.TypeOf()); _salaryStorageContract.Verify(x => x.GetList(It.IsAny(), It.IsAny(), It.IsAny()), Times.Once); } [Test] public void GetAllSalaries_StorageThrowError_ThrowException_Test() { //Arrange _salaryStorageContract.Setup(x => x.GetList(It.IsAny(), It.IsAny(), It.IsAny())).Throws(new StorageException(new InvalidOperationException())); //Act&Assert Assert.That(() => _salaryBusinessLogicContract.GetAllSalariesByPeriod(DateTime.UtcNow, DateTime.UtcNow.AddDays(1)), Throws.TypeOf()); _salaryStorageContract.Verify(x => x.GetList(It.IsAny(), It.IsAny(), It.IsAny()), Times.Once); } [Test] public void GetAllSalariesByWorker_ReturnListOfRecords_Test() { //Arrange var startDate = DateTime.UtcNow; var endDate = DateTime.UtcNow.AddDays(1); var workerId = Guid.NewGuid().ToString(); var listOriginal = new List() { new(Guid.NewGuid().ToString(), DateTime.UtcNow, 10), new(Guid.NewGuid().ToString(), DateTime.UtcNow.AddDays(1), 14), new(Guid.NewGuid().ToString(), DateTime.UtcNow.AddDays(-1), 30), }; _salaryStorageContract.Setup(x => x.GetList(It.IsAny(), It.IsAny(), It.IsAny())).Returns(listOriginal); //Act var list = _salaryBusinessLogicContract.GetAllSalariesByPeriodByWorker(startDate, endDate, workerId); //Assert Assert.That(list, Is.Not.Null); Assert.That(list, Is.EquivalentTo(listOriginal)); _salaryStorageContract.Verify(x => x.GetList(startDate, endDate, workerId), Times.Once); } [Test] public void GetAllSalariesByWorker_ReturnEmptyList_Test() { //Arrange _salaryStorageContract.Setup(x => x.GetList(It.IsAny(), It.IsAny(), It.IsAny())).Returns([]); //Act var list = _salaryBusinessLogicContract.GetAllSalariesByPeriodByWorker(DateTime.UtcNow, DateTime.UtcNow.AddDays(1), Guid.NewGuid().ToString()); //Assert Assert.That(list, Is.Not.Null); Assert.That(list, Has.Count.EqualTo(0)); _salaryStorageContract.Verify(x => x.GetList(It.IsAny(), It.IsAny(), It.IsAny()), Times.Once); } [Test] public void GetAllSalariesByWorker_IncorrectDates_ThrowException_Test() { //Arrange var dateTime = DateTime.UtcNow; //Act&Assert Assert.That(() => _salaryBusinessLogicContract.GetAllSalariesByPeriodByWorker(dateTime, dateTime, Guid.NewGuid().ToString()), Throws.TypeOf()); Assert.That(() => _salaryBusinessLogicContract.GetAllSalariesByPeriodByWorker(dateTime, dateTime.AddSeconds(-1), Guid.NewGuid().ToString()), Throws.TypeOf()); _salaryStorageContract.Verify(x => x.GetList(It.IsAny(), It.IsAny(), It.IsAny()), Times.Never); } [Test] public void GetAllSalariesByWorker_WorkerIdIsNUllOrEmpty_ThrowException_Test() { //Act&Assert Assert.That(() => _salaryBusinessLogicContract.GetAllSalariesByPeriodByWorker(DateTime.UtcNow, DateTime.UtcNow.AddDays(1), null), Throws.TypeOf()); Assert.That(() => _salaryBusinessLogicContract.GetAllSalariesByPeriodByWorker(DateTime.UtcNow, DateTime.UtcNow.AddDays(1), string.Empty), Throws.TypeOf()); _salaryStorageContract.Verify(x => x.GetList(It.IsAny(), It.IsAny(), It.IsAny()), Times.Never); } [Test] public void GetAllSalariesByWorker_WorkerIdIsNotGuid_ThrowException_Test() { //Act&Assert Assert.That(() => _salaryBusinessLogicContract.GetAllSalariesByPeriodByWorker(DateTime.UtcNow, DateTime.UtcNow.AddDays(1), "workerId"), Throws.TypeOf()); _salaryStorageContract.Verify(x => x.GetList(It.IsAny(), It.IsAny(), It.IsAny()), Times.Never); } [Test] public void GetAllSalariesByWorker_ReturnNull_ThrowException_Test() { //Act&Assert Assert.That(() => _salaryBusinessLogicContract.GetAllSalariesByPeriodByWorker(DateTime.UtcNow, DateTime.UtcNow.AddDays(1), Guid.NewGuid().ToString()), Throws.TypeOf()); _salaryStorageContract.Verify(x => x.GetList(It.IsAny(), It.IsAny(), It.IsAny()), Times.Once); } [Test] public void GetAllSalariesByWorker_StorageThrowError_ThrowException_Test() { //Arrange _salaryStorageContract.Setup(x => x.GetList(It.IsAny(), It.IsAny(), It.IsAny())).Throws(new StorageException(new InvalidOperationException())); //Act&Assert Assert.That(() => _salaryBusinessLogicContract.GetAllSalariesByPeriodByWorker(DateTime.UtcNow, DateTime.UtcNow.AddDays(1), Guid.NewGuid().ToString()), Throws.TypeOf()); _salaryStorageContract.Verify(x => x.GetList(It.IsAny(), It.IsAny(), It.IsAny()), Times.Once); } [Test] public void CalculateSalaryByMounth_CalculateSalary_Test() { //Arrange var workerId = Guid.NewGuid().ToString(); var saleSum = 200.0; var postSalary = 2000.0; _saleStorageContract.Setup(x => x.GetList(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .Returns([new SaleDataModel(Guid.NewGuid().ToString(), workerId, saleSum, false, [])]); _postStorageContract.Setup(x => x.GetElementById(It.IsAny())) .Returns(new PostDataModel(Guid.NewGuid().ToString(), "name", PostType.Butcher, postSalary, true, DateTime.UtcNow)); _workerStorageContract.Setup(x => x.GetList(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .Returns([new WorkerDataModel(workerId, "Test", "+7-111-111-11-11", Guid.NewGuid().ToString(), DateTime.UtcNow, DateTime.UtcNow, false)]); var sum = 0.0; var expectedSum = postSalary + saleSum * 0.1; _salaryStorageContract.Setup(x => x.AddElement(It.IsAny())) .Callback((SalaryDataModel x) => { sum = x.Salary; }); //Act _salaryBusinessLogicContract.CalculateSalaryByMounth(DateTime.UtcNow); //Assert Assert.That(sum, Is.EqualTo(expectedSum)); } [Test] public void CalculateSalaryByMounth_WithSeveralWorkers_Test() { //Arrange var worker1Id = Guid.NewGuid().ToString(); var worker2Id = Guid.NewGuid().ToString(); var worker3Id = Guid.NewGuid().ToString(); var list = new List() { new(worker1Id, "Test", "+7-111-111-11-11", Guid.NewGuid().ToString(), DateTime.UtcNow, DateTime.UtcNow, false), new(worker2Id, "Test", "+7-111-111-11-11", Guid.NewGuid().ToString(), DateTime.UtcNow, DateTime.UtcNow, false), new(worker3Id, "Test", "+7-111-111-11-11", Guid.NewGuid().ToString(), DateTime.UtcNow, DateTime.UtcNow, false) }; _saleStorageContract.Setup(x => x.GetList(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .Returns([new SaleDataModel(Guid.NewGuid().ToString(), worker1Id, 1, false, []), new SaleDataModel(Guid.NewGuid().ToString(), worker1Id, 1, false, []), new SaleDataModel(Guid.NewGuid().ToString(), worker2Id, 1, false, []), new SaleDataModel(Guid.NewGuid().ToString(), worker3Id, 1, false, []), new SaleDataModel(Guid.NewGuid().ToString(), worker3Id, 1, false, [])]); _postStorageContract.Setup(x => x.GetElementById(It.IsAny())) .Returns(new PostDataModel(Guid.NewGuid().ToString(), "name", PostType.Butcher, 2000, true, DateTime.UtcNow)); _workerStorageContract.Setup(x => x.GetList(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .Returns(list); //Act _salaryBusinessLogicContract.CalculateSalaryByMounth(DateTime.UtcNow); //Assert _salaryStorageContract.Verify(x => x.AddElement(It.IsAny()), Times.Exactly(list.Count)); } [Test] public void CalculateSalaryByMounth_WithoitSalesByWorker_Test() { //Arrange var postSalary = 2000.0; var workerId = Guid.NewGuid().ToString(); _saleStorageContract.Setup(x => x.GetList(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .Returns([]); _postStorageContract.Setup(x => x.GetElementById(It.IsAny())) .Returns(new PostDataModel(Guid.NewGuid().ToString(), "name", PostType.Butcher, postSalary, true, DateTime.UtcNow)); _workerStorageContract.Setup(x => x.GetList(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .Returns([new WorkerDataModel(workerId, "Test", "+7-111-111-11-11", Guid.NewGuid().ToString(), DateTime.UtcNow, DateTime.UtcNow, false)]); var sum = 0.0; var expectedSum = postSalary; _salaryStorageContract.Setup(x => x.AddElement(It.IsAny())) .Callback((SalaryDataModel x) => { sum = x.Salary; }); //Act _salaryBusinessLogicContract.CalculateSalaryByMounth(DateTime.UtcNow); //Assert Assert.That(sum, Is.EqualTo(expectedSum)); } [Test] public void CalculateSalaryByMounth_SaleStorageReturnNull_ThrowException_Test() { //Arrange var workerId = Guid.NewGuid().ToString(); _postStorageContract.Setup(x => x.GetElementById(It.IsAny())) .Returns(new PostDataModel(Guid.NewGuid().ToString(), "name", PostType.Butcher, 2000, true, DateTime.UtcNow)); _workerStorageContract.Setup(x => x.GetList(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .Returns([new WorkerDataModel(workerId, "Test", "+7-111-111-11-11", Guid.NewGuid().ToString(), DateTime.UtcNow, DateTime.UtcNow, false)]); //Act&Assert Assert.That(() => _salaryBusinessLogicContract.CalculateSalaryByMounth(DateTime.UtcNow), Throws.TypeOf()); } [Test] public void CalculateSalaryByMounth_PostStorageReturnNull_ThrowException_Test() { //Arrange var workerId = Guid.NewGuid().ToString(); _saleStorageContract.Setup(x => x.GetList(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .Returns([new SaleDataModel(Guid.NewGuid().ToString(), workerId, 200, false, [])]); _workerStorageContract.Setup(x => x.GetList(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .Returns([new WorkerDataModel(workerId, "Test", "+7-111-111-11-11", Guid.NewGuid().ToString(), DateTime.UtcNow, DateTime.UtcNow, false)]); //Act&Assert Assert.That(() => _salaryBusinessLogicContract.CalculateSalaryByMounth(DateTime.UtcNow), Throws.TypeOf()); } [Test] public void CalculateSalaryByMounth_WorkerStorageReturnNull_ThrowException_Test() { //Arrange var workerId = Guid.NewGuid().ToString(); _saleStorageContract.Setup(x => x.GetList(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .Returns([new SaleDataModel(Guid.NewGuid().ToString(), workerId, 200, false, [])]); _postStorageContract.Setup(x => x.GetElementById(It.IsAny())) .Returns(new PostDataModel(Guid.NewGuid().ToString(), "name", PostType.Butcher, 2000, true, DateTime.UtcNow)); //Act&Assert Assert.That(() => _salaryBusinessLogicContract.CalculateSalaryByMounth(DateTime.UtcNow), Throws.TypeOf()); } [Test] public void CalculateSalaryByMounth_SaleStorageThrowException_ThrowException_Test() { //Arrange var workerId = Guid.NewGuid().ToString(); _saleStorageContract.Setup(x => x.GetList(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .Throws(new StorageException(new InvalidOperationException())); _postStorageContract.Setup(x => x.GetElementById(It.IsAny())) .Returns(new PostDataModel(Guid.NewGuid().ToString(), "name", PostType.Butcher, 2000, true, DateTime.UtcNow)); _workerStorageContract.Setup(x => x.GetList(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .Returns([new WorkerDataModel(workerId, "Test", "+7-111-111-11-11", Guid.NewGuid().ToString(), DateTime.UtcNow, DateTime.UtcNow, false)]); //Act&Assert Assert.That(() => _salaryBusinessLogicContract.CalculateSalaryByMounth(DateTime.UtcNow), Throws.TypeOf()); } [Test] public void CalculateSalaryByMounth_PostStorageThrowException_ThrowException_Test() { //Arrange var workerId = Guid.NewGuid().ToString(); _saleStorageContract.Setup(x => x.GetList(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .Returns([new SaleDataModel(Guid.NewGuid().ToString(), workerId, 200, false, [])]); _postStorageContract.Setup(x => x.GetElementById(It.IsAny())) .Throws(new StorageException(new InvalidOperationException())); _workerStorageContract.Setup(x => x.GetList(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .Returns([new WorkerDataModel(workerId, "Test", "+7-111-111-11-11", Guid.NewGuid().ToString(), DateTime.UtcNow, DateTime.UtcNow, false)]); //Act&Assert Assert.That(() => _salaryBusinessLogicContract.CalculateSalaryByMounth(DateTime.UtcNow), Throws.TypeOf()); } [Test] public void CalculateSalaryByMounth_WorkerStorageThrowException_ThrowException_Test() { //Arrange var workerId = Guid.NewGuid().ToString(); _saleStorageContract.Setup(x => x.GetList(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .Returns([new SaleDataModel(Guid.NewGuid().ToString(), workerId, 200, false, [])]); _postStorageContract.Setup(x => x.GetElementById(It.IsAny())) .Returns(new PostDataModel(Guid.NewGuid().ToString(), "name", PostType.Butcher, 2000, true, DateTime.UtcNow)); _workerStorageContract.Setup(x => x.GetList(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .Throws(new StorageException(new InvalidOperationException())); //Act&Assert Assert.That(() => _salaryBusinessLogicContract.CalculateSalaryByMounth(DateTime.UtcNow), Throws.TypeOf()); } }