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.Exceptions; using TheButcherShopContracts.StoragesContracts; namespace ButcherShopTests.BusinessLogicsContractsTests; internal class SaleBusinessLogicContractTests { private SaleBusinessLogicContract _saleBusinessLogicContract; private Mock _saleStorageContract; [OneTimeSetUp] public void OneTimeSetUp() { _saleStorageContract = new Mock(); _saleBusinessLogicContract = new SaleBusinessLogicContract(_saleStorageContract.Object, new Mock().Object); } [SetUp] public void SetUp() { _saleStorageContract.Reset(); } [Test] public void GetAllSalesByPeriod_ReturnListOfRecords_Test() { //Arrange var date = DateTime.UtcNow; var listOriginal = new List() { new(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), 10, false, [new SaleProductDataModel(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), 5)]), new(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), 10, false, []), new(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), 10, false, []), }; _saleStorageContract.Setup(x => x.GetList(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())).Returns(listOriginal); //Act var list = _saleBusinessLogicContract.GetAllSalesByPeriod(date, date.AddDays(1)); //Assert Assert.That(list, Is.Not.Null); Assert.That(list, Is.EquivalentTo(listOriginal)); _saleStorageContract.Verify(x => x.GetList(date, date.AddDays(1), null, null), Times.Once); } [Test] public void GetAllSalesByPeriod_ReturnEmptyList_Test() { //Arrange _saleStorageContract.Setup(x => x.GetList(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())).Returns([]); //Act var list = _saleBusinessLogicContract.GetAllSalesByPeriod(DateTime.UtcNow, DateTime.UtcNow.AddDays(1)); //Assert Assert.That(list, Is.Not.Null); Assert.That(list, Has.Count.EqualTo(0)); _saleStorageContract.Verify(x => x.GetList(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()), Times.Once); } [Test] public void GetAllSalesByPeriod_IncorrectDates_ThrowException_Test() { //Arrange var date = DateTime.UtcNow; //Act&Assert Assert.That(() => _saleBusinessLogicContract.GetAllSalesByPeriod(date, date), Throws.TypeOf()); Assert.That(() => _saleBusinessLogicContract.GetAllSalesByPeriod(date, date.AddSeconds(-1)), Throws.TypeOf()); _saleStorageContract.Verify(x => x.GetList(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()), Times.Never); } [Test] public void GetAllSalesByPeriod_ReturnNull_ThrowException_Test() { //Act&Assert Assert.That(() => _saleBusinessLogicContract.GetAllSalesByPeriod(DateTime.UtcNow, DateTime.UtcNow.AddDays(1)), Throws.TypeOf()); _saleStorageContract.Verify(x => x.GetList(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()), Times.Once); } [Test] public void GetAllSalesByPeriod_StorageThrowError_ThrowException_Test() { //Arrange _saleStorageContract.Setup(x => x.GetList(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())).Throws(new StorageException(new InvalidOperationException())); //Act&Assert Assert.That(() => _saleBusinessLogicContract.GetAllSalesByPeriod(DateTime.UtcNow, DateTime.UtcNow.AddDays(1)), Throws.TypeOf()); _saleStorageContract.Verify(x => x.GetList(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()), Times.Once); } [Test] public void GetAllSalesByWorkerByPeriod_ReturnListOfRecords_Test() { //Arrange var date = DateTime.UtcNow; var workerId = Guid.NewGuid().ToString(); var listOriginal = new List() { new(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), 10, false, [new SaleProductDataModel(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), 5)]), new(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), 10, false, []), new(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), 10, false, []), }; _saleStorageContract.Setup(x => x.GetList(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())).Returns(listOriginal); //Act var list = _saleBusinessLogicContract.GetAllSalesByWorkerByPeriod(workerId, date, date.AddDays(1)); //Assert Assert.That(list, Is.Not.Null); Assert.That(list, Is.EquivalentTo(listOriginal)); _saleStorageContract.Verify(x => x.GetList(date, date.AddDays(1), workerId, null), Times.Once); } [Test] public void GetAllSalesByWorkerByPeriod_ReturnEmptyList_Test() { //Arrange _saleStorageContract.Setup(x => x.GetList(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())).Returns([]); //Act var list = _saleBusinessLogicContract.GetAllSalesByWorkerByPeriod(Guid.NewGuid().ToString(), DateTime.UtcNow, DateTime.UtcNow.AddDays(1)); //Assert Assert.That(list, Is.Not.Null); Assert.That(list, Has.Count.EqualTo(0)); _saleStorageContract.Verify(x => x.GetList(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()), Times.Once); } [Test] public void GetAllSalesByWorkerByPeriod_IncorrectDates_ThrowException_Test() { //Arrange var date = DateTime.UtcNow; //Act&Assert Assert.That(() => _saleBusinessLogicContract.GetAllSalesByWorkerByPeriod(Guid.NewGuid().ToString(), date, date), Throws.TypeOf()); Assert.That(() => _saleBusinessLogicContract.GetAllSalesByWorkerByPeriod(Guid.NewGuid().ToString(), date, date.AddSeconds(-1)), Throws.TypeOf()); _saleStorageContract.Verify(x => x.GetList(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()), Times.Never); } [Test] public void GetAllSalesByWorkerByPeriod_WorkerIdIsNullOrEmpty_ThrowException_Test() { //Act&Assert Assert.That(() => _saleBusinessLogicContract.GetAllSalesByWorkerByPeriod(null, DateTime.UtcNow, DateTime.UtcNow.AddDays(1)), Throws.TypeOf()); Assert.That(() => _saleBusinessLogicContract.GetAllSalesByWorkerByPeriod(string.Empty, DateTime.UtcNow, DateTime.UtcNow.AddDays(1)), Throws.TypeOf()); _saleStorageContract.Verify(x => x.GetList(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()), Times.Never); } [Test] public void GetAllSalesByWorkerByPeriod_WorkerIdIsNotGuid_ThrowException_Test() { //Act&Assert Assert.That(() => _saleBusinessLogicContract.GetAllSalesByWorkerByPeriod("workerId", DateTime.UtcNow, DateTime.UtcNow.AddDays(1)), Throws.TypeOf()); _saleStorageContract.Verify(x => x.GetList(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()), Times.Never); } [Test] public void GetAllSalesByWorkerByPeriod_ReturnNull_ThrowException_Test() { //Act&Assert Assert.That(() => _saleBusinessLogicContract.GetAllSalesByWorkerByPeriod(Guid.NewGuid().ToString(), DateTime.UtcNow, DateTime.UtcNow.AddDays(1)), Throws.TypeOf()); _saleStorageContract.Verify(x => x.GetList(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()), Times.Once); } [Test] public void GetAllSalesByWorkerByPeriod_StorageThrowError_ThrowException_Test() { //Arrange _saleStorageContract.Setup(x => x.GetList(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())).Throws(new StorageException(new InvalidOperationException())); //Act&Assert Assert.That(() => _saleBusinessLogicContract.GetAllSalesByWorkerByPeriod(Guid.NewGuid().ToString(), DateTime.UtcNow, DateTime.UtcNow.AddDays(1)), Throws.TypeOf()); _saleStorageContract.Verify(x => x.GetList(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()), Times.Once); } [Test] public void GetAllSalesByProductByPeriod_ReturnListOfRecords_Test() { //Arrange var date = DateTime.UtcNow; var productId = Guid.NewGuid().ToString(); var listOriginal = new List() { new(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), 10, false, [new SaleProductDataModel(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), 5)]), new(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), 10, false, []), new(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), 10, false, []), }; _saleStorageContract.Setup(x => x.GetList(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())).Returns(listOriginal); //Act var list = _saleBusinessLogicContract.GetAllSalesByProductByPeriod(productId, date, date.AddDays(1)); //Assert Assert.That(list, Is.Not.Null); Assert.That(list, Is.EquivalentTo(listOriginal)); _saleStorageContract.Verify(x => x.GetList(date, date.AddDays(1), null, productId), Times.Once); } [Test] public void GetAllSalesByProductByPeriod_ReturnEmptyList_Test() { //Arrange _saleStorageContract.Setup(x => x.GetList(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())).Returns([]); //Act var list = _saleBusinessLogicContract.GetAllSalesByProductByPeriod(Guid.NewGuid().ToString(), DateTime.UtcNow, DateTime.UtcNow.AddDays(1)); //Assert Assert.That(list, Is.Not.Null); Assert.That(list, Has.Count.EqualTo(0)); _saleStorageContract.Verify(x => x.GetList(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()), Times.Once); } [Test] public void GetAllSalesByProductByPeriod_IncorrectDates_ThrowException_Test() { //Arrange var date = DateTime.UtcNow; //Act&Assert Assert.That(() => _saleBusinessLogicContract.GetAllSalesByProductByPeriod(Guid.NewGuid().ToString(), date, date), Throws.TypeOf()); Assert.That(() => _saleBusinessLogicContract.GetAllSalesByProductByPeriod(Guid.NewGuid().ToString(), date, date.AddSeconds(-1)), Throws.TypeOf()); _saleStorageContract.Verify(x => x.GetList(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()), Times.Never); } [Test] public void GetAllSalesByProductByPeriod_ProductIdIsNullOrEmpty_ThrowException_Test() { //Act&Assert Assert.That(() => _saleBusinessLogicContract.GetAllSalesByProductByPeriod(null, DateTime.UtcNow, DateTime.UtcNow.AddDays(1)), Throws.TypeOf()); Assert.That(() => _saleBusinessLogicContract.GetAllSalesByProductByPeriod(string.Empty, DateTime.UtcNow, DateTime.UtcNow.AddDays(1)), Throws.TypeOf()); _saleStorageContract.Verify(x => x.GetList(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()), Times.Never); } [Test] public void GetAllSalesByProductByPeriod_ProductIdIsNotGuid_ThrowException_Test() { //Act&Assert Assert.That(() => _saleBusinessLogicContract.GetAllSalesByProductByPeriod("productId", DateTime.UtcNow, DateTime.UtcNow.AddDays(1)), Throws.TypeOf()); _saleStorageContract.Verify(x => x.GetList(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()), Times.Never); } [Test] public void GetAllSalesByProductByPeriod_ReturnNull_ThrowException_Test() { //Act&Assert Assert.That(() => _saleBusinessLogicContract.GetAllSalesByProductByPeriod(Guid.NewGuid().ToString(), DateTime.UtcNow, DateTime.UtcNow.AddDays(1)), Throws.TypeOf()); _saleStorageContract.Verify(x => x.GetList(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()), Times.Once); } [Test] public void GetAllSalesByProductByPeriod_StorageThrowError_ThrowException_Test() { //Arrange _saleStorageContract.Setup(x => x.GetList(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())).Throws(new StorageException(new InvalidOperationException())); //Act&Assert Assert.That(() => _saleBusinessLogicContract.GetAllSalesByProductByPeriod(Guid.NewGuid().ToString(), DateTime.UtcNow, DateTime.UtcNow.AddDays(1)), Throws.TypeOf()); _saleStorageContract.Verify(x => x.GetList(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()), Times.Once); } [Test] public void GetSaleByData_GetById_ReturnRecord_Test() { //Arrange var id = Guid.NewGuid().ToString(); var record = new SaleDataModel(id, Guid.NewGuid().ToString(), 10, false, [new SaleProductDataModel(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), 5)]); _saleStorageContract.Setup(x => x.GetElementById(id)).Returns(record); //Act var element = _saleBusinessLogicContract.GetSaleByData(id); //Assert Assert.That(element, Is.Not.Null); Assert.That(element.Id, Is.EqualTo(id)); _saleStorageContract.Verify(x => x.GetElementById(It.IsAny()), Times.Once); } [Test] public void GetSaleByData_EmptyData_ThrowException_Test() { //Act&Assert Assert.That(() => _saleBusinessLogicContract.GetSaleByData(null), Throws.TypeOf()); Assert.That(() => _saleBusinessLogicContract.GetSaleByData(string.Empty), Throws.TypeOf()); _saleStorageContract.Verify(x => x.GetElementById(It.IsAny()), Times.Never); } [Test] public void GetSaleByData_IdIsNotGuid_ThrowException_Test() { //Act&Assert Assert.That(() => _saleBusinessLogicContract.GetSaleByData("saleId"), Throws.TypeOf()); _saleStorageContract.Verify(x => x.GetElementById(It.IsAny()), Times.Never); } [Test] public void GetSaleByData_GetById_NotFoundRecord_ThrowException_Test() { //Act&Assert Assert.That(() => _saleBusinessLogicContract.GetSaleByData(Guid.NewGuid().ToString()), Throws.TypeOf()); _saleStorageContract.Verify(x => x.GetElementById(It.IsAny()), Times.Once); } [Test] public void GetSaleByData_StorageThrowError_ThrowException_Test() { //Arrange _saleStorageContract.Setup(x => x.GetElementById(It.IsAny())).Throws(new StorageException(new InvalidOperationException())); //Act&Assert Assert.That(() => _saleBusinessLogicContract.GetSaleByData(Guid.NewGuid().ToString()), Throws.TypeOf()); _saleStorageContract.Verify(x => x.GetElementById(It.IsAny()), Times.Once); } [Test] public void InsertSale_CorrectRecord_Test() { //Arrange var flag = false; var record = new SaleDataModel(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), 10, false, [new SaleProductDataModel(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), 5)]); _saleStorageContract.Setup(x => x.AddElement(It.IsAny())) .Callback((SaleDataModel x) => { flag = x.Id == record.Id && x.WorkerId == record.WorkerId && x.SaleDate == record.SaleDate && x.Sum == record.Sum && x.IsCancel == record.IsCancel && x.Products.Count == record.Products.Count && x.Products.First().ProductId == record.Products.First().ProductId && x.Products.First().SaleId == record.Products.First().SaleId && x.Products.First().Count == record.Products.First().Count; }); //Act _saleBusinessLogicContract.InsertSale(record); //Assert _saleStorageContract.Verify(x => x.AddElement(It.IsAny()), Times.Once); Assert.That(flag); } [Test] public void InsertSale_RecordWithExistsData_ThrowException_Test() { //Arrange _saleStorageContract.Setup(x => x.AddElement(It.IsAny())).Throws(new ElementExistsException("Data", "Data")); //Act&Assert Assert.That(() => _saleBusinessLogicContract.InsertSale(new(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), 10, false, [new SaleProductDataModel(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), 5)])), Throws.TypeOf()); _saleStorageContract.Verify(x => x.AddElement(It.IsAny()), Times.Once); } [Test] public void InsertSale_NullRecord_ThrowException_Test() { //Act&Assert Assert.That(() => _saleBusinessLogicContract.InsertSale(null), Throws.TypeOf()); _saleStorageContract.Verify(x => x.AddElement(It.IsAny()), Times.Never); } [Test] public void InsertSale_InvalidRecord_ThrowException_Test() { //Act&Assert Assert.That(() => _saleBusinessLogicContract.InsertSale(new SaleDataModel("id", Guid.NewGuid().ToString(), 10, false, [])), Throws.TypeOf()); _saleStorageContract.Verify(x => x.AddElement(It.IsAny()), Times.Never); } [Test] public void InsertSale_StorageThrowError_ThrowException_Test() { //Arrange _saleStorageContract.Setup(x => x.AddElement(It.IsAny())).Throws(new StorageException(new InvalidOperationException())); //Act&Assert Assert.That(() => _saleBusinessLogicContract.InsertSale(new(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), 10, false, [new SaleProductDataModel(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), 5)])), Throws.TypeOf()); _saleStorageContract.Verify(x => x.AddElement(It.IsAny()), Times.Once); } [Test] public void CancelSale_CorrectRecord_Test() { //Arrange var id = Guid.NewGuid().ToString(); var flag = false; _saleStorageContract.Setup(x => x.DelElement(It.Is((string x) => x == id))).Callback(() => { flag = true; }); //Act _saleBusinessLogicContract.CancelSale(id); //Assert _saleStorageContract.Verify(x => x.DelElement(It.IsAny()), Times.Once); Assert.That(flag); } [Test] public void CancelSale_RecordWithIncorrectId_ThrowException_Test() { //Arrange var id = Guid.NewGuid().ToString(); _saleStorageContract.Setup(x => x.DelElement(It.IsAny())).Throws(new ElementNotFoundException(id)); //Act&Assert Assert.That(() => _saleBusinessLogicContract.CancelSale(Guid.NewGuid().ToString()), Throws.TypeOf()); _saleStorageContract.Verify(x => x.DelElement(It.IsAny()), Times.Once); } [Test] public void CancelSale_IdIsNullOrEmpty_ThrowException_Test() { //Act&Assert Assert.That(() => _saleBusinessLogicContract.CancelSale(null), Throws.TypeOf()); Assert.That(() => _saleBusinessLogicContract.CancelSale(string.Empty), Throws.TypeOf()); _saleStorageContract.Verify(x => x.DelElement(It.IsAny()), Times.Never); } [Test] public void CancelSale_IdIsNotGuid_ThrowException_Test() { //Act&Assert Assert.That(() => _saleBusinessLogicContract.CancelSale("id"), Throws.TypeOf()); _saleStorageContract.Verify(x => x.DelElement(It.IsAny()), Times.Never); } [Test] public void CancelSale_StorageThrowError_ThrowException_Test() { //Arrange _saleStorageContract.Setup(x => x.DelElement(It.IsAny())).Throws(new StorageException(new InvalidOperationException())); //Act&Assert Assert.That(() => _saleBusinessLogicContract.CancelSale(Guid.NewGuid().ToString()), Throws.TypeOf()); _saleStorageContract.Verify(x => x.DelElement(It.IsAny()), Times.Once); } }