using Microsoft.Extensions.Logging; using Moq; using TheCyclopsBusinessLogic.Implementations; using TheCyclopsContracts.DataModels; using TheCyclopsContracts.Enums; using TheCyclopsContracts.Exceptions; using TheCyclopsContracts.StoragesContracts; namespace TheCyclopsTests.BusinessLogicsContractsTests; [TestFixture] internal class SalaryBusinessLogicContractTest { private SalaryBusinessLogicContract _salaryBusinessLogicContract; private Mock _salaryStorageContract; private Mock _installationStorageContract; private Mock _postStorageContract; private Mock _employeeStorageContract; [OneTimeSetUp] public void OneTimeSetUp() { _salaryStorageContract = new Mock(); _installationStorageContract = new Mock(); _postStorageContract = new Mock(); _employeeStorageContract = new Mock(); _salaryBusinessLogicContract = new SalaryBusinessLogicContract(_salaryStorageContract.Object, _installationStorageContract.Object, _postStorageContract.Object, _employeeStorageContract.Object, new Mock().Object); } [TearDown] public void TearDown() { _salaryStorageContract.Reset(); _installationStorageContract.Reset(); _postStorageContract.Reset(); _employeeStorageContract.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 GetAllSalariesByEmployee_ReturnListOfRecords_Test() { //Arrange var startDate = DateTime.UtcNow; var endDate = DateTime.UtcNow.AddDays(1); var employeeId = 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.GetAllSalariesByPeriodByEmployee(startDate, endDate, employeeId); //Assert Assert.That(list, Is.Not.Null); Assert.That(list, Is.EquivalentTo(listOriginal)); _salaryStorageContract.Verify(x => x.GetList(startDate, endDate, employeeId), Times.Once); } [Test] public void GetAllSalariesByEmployee_ReturnEmptyList_Test() { //Arrange _salaryStorageContract.Setup(x => x.GetList(It.IsAny(), It.IsAny(), It.IsAny())).Returns([]); //Act var list = _salaryBusinessLogicContract.GetAllSalariesByPeriodByEmployee(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 GetAllSalariesByEmployee_IncorrectDates_ThrowException_Test() { //Arrange var dateTime = DateTime.UtcNow; //Act&Assert Assert.That(() => _salaryBusinessLogicContract.GetAllSalariesByPeriodByEmployee(dateTime, dateTime, Guid.NewGuid().ToString()), Throws.TypeOf()); Assert.That(() => _salaryBusinessLogicContract.GetAllSalariesByPeriodByEmployee(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 GetAllSalariesByEmployee_EmployeeIdIsNUllOrEmpty_ThrowException_Test() { //Act&Assert Assert.That(() => _salaryBusinessLogicContract.GetAllSalariesByPeriodByEmployee(DateTime.UtcNow, DateTime.UtcNow.AddDays(1), null), Throws.TypeOf()); Assert.That(() => _salaryBusinessLogicContract.GetAllSalariesByPeriodByEmployee(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 GetAllSalariesByEmployee_EmployeeIdIsNotGuid_ThrowException_Test() { //Act&Assert Assert.That(() => _salaryBusinessLogicContract.GetAllSalariesByPeriodByEmployee(DateTime.UtcNow, DateTime.UtcNow.AddDays(1), "employeeId"), Throws.TypeOf()); _salaryStorageContract.Verify(x => x.GetList(It.IsAny(), It.IsAny(), It.IsAny()), Times.Never); } [Test] public void GetAllSalariesByEmployee_ReturnNull_ThrowException_Test() { //Act&Assert Assert.That(() => _salaryBusinessLogicContract.GetAllSalariesByPeriodByEmployee(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 GetAllSalariesByEmployee_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.GetAllSalariesByPeriodByEmployee(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 employeeId = Guid.NewGuid().ToString(); var installationPrice = 200.0; var installationSum = 200.0; var postSalary = 2000.0; _installationStorageContract.Setup(x => x.GetList(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .Returns([new InstallationDataModel(Guid.NewGuid().ToString(), employeeId, DateTime.UtcNow, installationPrice, installationSum, false, [])]); _postStorageContract.Setup(x => x.GetElementById(It.IsAny())) .Returns(new PostDataModel(Guid.NewGuid().ToString(), "name", PostType.Designer, postSalary, true, DateTime.UtcNow)); _employeeStorageContract.Setup(x => x.GetList(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .Returns([new EmployeeDataModel(employeeId, "Test", "email@mail.com", Guid.NewGuid().ToString(), DateTime.UtcNow, DateTime.UtcNow, false)]); var sum = 0.0; var expectedSum = postSalary + installationPrice * 0.1; _salaryStorageContract.Setup(x => x.AddElement(It.IsAny())) .Callback((SalaryDataModel x) => { installationSum = x.Salary; }); //Act _salaryBusinessLogicContract.CalculateSalaryByMounth(DateTime.UtcNow); //Assert Assert.That(installationSum, Is.EqualTo(expectedSum)); } [Test] public void CalculateSalaryByMounth_WithSeveralEmployees_Test() { //Arrange var employee1Id = Guid.NewGuid().ToString(); var employee2Id = Guid.NewGuid().ToString(); var employee3Id = Guid.NewGuid().ToString(); var list = new List() { new(employee1Id, "Test", "email@mail.com", Guid.NewGuid().ToString(), DateTime.UtcNow, DateTime.UtcNow, false), new(employee2Id, "Test", "email@mail.com", Guid.NewGuid().ToString(), DateTime.UtcNow, DateTime.UtcNow, false), new(employee3Id, "Test", "email@mail.com", Guid.NewGuid().ToString(), DateTime.UtcNow, DateTime.UtcNow, false) }; _installationStorageContract.Setup(x => x.GetList(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .Returns([new InstallationDataModel(Guid.NewGuid().ToString(), employee1Id, DateTime.UtcNow, 1, 0, false, []), new InstallationDataModel(Guid.NewGuid().ToString(), employee1Id, DateTime.UtcNow, 1, 0, false, []), new InstallationDataModel(Guid.NewGuid().ToString(), employee2Id, DateTime.UtcNow, 1, 0, false, []), new InstallationDataModel(Guid.NewGuid().ToString(), employee3Id, DateTime.UtcNow, 1, 0, false, []), new InstallationDataModel(Guid.NewGuid().ToString(), employee3Id, DateTime.UtcNow, 1, 0, false, [])]); _postStorageContract.Setup(x => x.GetElementById(It.IsAny())) .Returns(new PostDataModel(Guid.NewGuid().ToString(), "name", PostType.Designer, 2000, true, DateTime.UtcNow)); _employeeStorageContract.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_WithoitInstallationsByEmployee_Test() { //Arrange var postSalary = 2000.0; var employeeId = Guid.NewGuid().ToString(); _installationStorageContract.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.Designer, postSalary, true, DateTime.UtcNow)); _employeeStorageContract.Setup(x => x.GetList(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .Returns([new EmployeeDataModel(employeeId, "Test", "email@mail.com", 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_InstallationStorageReturnNull_ThrowException_Test() { //Arrange var employeeId = Guid.NewGuid().ToString(); _postStorageContract.Setup(x => x.GetElementById(It.IsAny())) .Returns(new PostDataModel(Guid.NewGuid().ToString(), "name", PostType.Designer, 2000, true, DateTime.UtcNow)); _employeeStorageContract.Setup(x => x.GetList(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .Returns([new EmployeeDataModel(employeeId, "Test", "email@mail.com", 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 employeeId = Guid.NewGuid().ToString(); _installationStorageContract.Setup(x => x.GetList(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .Returns([new InstallationDataModel(Guid.NewGuid().ToString(), employeeId, DateTime.UtcNow, 0, 0, false, [])]); _employeeStorageContract.Setup(x => x.GetList(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .Returns([new EmployeeDataModel(employeeId, "Test", "email@mail.com", Guid.NewGuid().ToString(), DateTime.UtcNow, DateTime.UtcNow, false)]); //Act&Assert Assert.That(() => _salaryBusinessLogicContract.CalculateSalaryByMounth(DateTime.UtcNow), Throws.TypeOf()); } [Test] public void CalculateSalaryByMounth_EmployeeStorageReturnNull_ThrowException_Test() { //Arrange var employeeId = Guid.NewGuid().ToString(); _installationStorageContract.Setup(x => x.GetList(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .Returns([new InstallationDataModel(Guid.NewGuid().ToString(), employeeId, DateTime.UtcNow, 0, 0, false, [])]); _postStorageContract.Setup(x => x.GetElementById(It.IsAny())) .Returns(new PostDataModel(Guid.NewGuid().ToString(), "name", PostType.Designer, 2000, true, DateTime.UtcNow)); //Act&Assert Assert.That(() => _salaryBusinessLogicContract.CalculateSalaryByMounth(DateTime.UtcNow), Throws.TypeOf()); } [Test] public void CalculateSalaryByMounth_InstallationStorageThrowException_ThrowException_Test() { //Arrange var employeeId = Guid.NewGuid().ToString(); _installationStorageContract.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.Designer, 2000, true, DateTime.UtcNow)); _employeeStorageContract.Setup(x => x.GetList(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .Returns([new EmployeeDataModel(employeeId, "Test", "email@mail.com", 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 employeeId = Guid.NewGuid().ToString(); _installationStorageContract.Setup(x => x.GetList(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .Returns([new InstallationDataModel(Guid.NewGuid().ToString(), employeeId, DateTime.UtcNow, 0, 0, false, [])]); _postStorageContract.Setup(x => x.GetElementById(It.IsAny())) .Throws(new StorageException(new InvalidOperationException())); _employeeStorageContract.Setup(x => x.GetList(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .Returns([new EmployeeDataModel(employeeId, "Test", "email@mail.com", Guid.NewGuid().ToString(), DateTime.UtcNow, DateTime.UtcNow, false)]); //Act&Assert Assert.That(() => _salaryBusinessLogicContract.CalculateSalaryByMounth(DateTime.UtcNow), Throws.TypeOf()); } [Test] public void CalculateSalaryByMounth_EmployeeStorageThrowException_ThrowException_Test() { //Arrange var employeeId = Guid.NewGuid().ToString(); _installationStorageContract.Setup(x => x.GetList(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .Returns([new InstallationDataModel(Guid.NewGuid().ToString(), employeeId, DateTime.UtcNow, 0, 0, false, [])]); _postStorageContract.Setup(x => x.GetElementById(It.IsAny())) .Returns(new PostDataModel(Guid.NewGuid().ToString(), "name", PostType.Designer, 2000, true, DateTime.UtcNow)); _employeeStorageContract.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()); } }