using Moq; using NUnit.Framework; using System; using System.Collections.Generic; using CandyHouseBase.DataModels; using CandyHouseBase.Enums; using CandyHouseBase.Exceptions; using CandyHouseBase.Extensions; using CandyHouseBase.Implementations; using CandyHouseBase.Interfaces.BusinessLogicsContracts; using CandyHouseBase.Interfaces.StoragesContracts; using Microsoft.Extensions.Logging; namespace CandyHouseTests.BusinessLogicsContractsTests { [TestFixture] internal class OrderBusinessLogicContractTests { private OrderBusinessLogicContract _orderBusinessLogicContract; private Mock _orderStorageContact; private Mock _pekarStorageContact; private Mock _productStorageContact; [OneTimeSetUp] public void OneTimeSetUp() { _orderStorageContact = new Mock(); _pekarStorageContact = new Mock(); _productStorageContact = new Mock(); _orderBusinessLogicContract = new OrderBusinessLogicContract( _orderStorageContact.Object, _pekarStorageContact.Object, _productStorageContact.Object, new Mock().Object ); } [SetUp] public void SetUp() { _orderStorageContact.Reset(); _pekarStorageContact.Reset(); _productStorageContact.Reset(); } [Test] public void GetAllOrders_ReturnsListOfRecords_Test() { // Arrange var pekarId = Guid.NewGuid().ToString(); var productId = Guid.NewGuid().ToString(); var orders = new List { new OrderDataModel( Guid.NewGuid().ToString(), "John Doe", DateTime.Now.AddDays(-1), 100.50m, 10.50m, productId, pekarId, StatusType.Pending ), new OrderDataModel( Guid.NewGuid().ToString(), "Jane Smith", DateTime.Now, 200.00m, 20.00m, productId, pekarId, StatusType.Completed ) }; _orderStorageContact.Setup(x => x.GetOrders()).Returns(orders); _pekarStorageContact.Setup(x => x.GetElementById(pekarId)) .Returns(new PekarDataModel(pekarId, "Ivan Ivanov", "Baker", 1.5m, new List())); _productStorageContact.Setup(x => x.GetElementById(productId)) .Returns(new ProductDataModel(productId, "Cake", "Super soft cake", new List())); // Act var list = _orderBusinessLogicContract.GetAllOrders(); // Assert Assert.That(list, Is.Not.Null); Assert.That(list, Is.EquivalentTo(orders)); } [Test] public void GetAllOrders_ReturnsEmptyList_Test() { // Arrange _orderStorageContact.Setup(x => x.GetOrders()).Returns(new List()); // Act var list = _orderBusinessLogicContract.GetAllOrders(); // Assert Assert.That(list, Is.Not.Null); Assert.That(list, Has.Count.EqualTo(0)); _orderStorageContact.Verify(x => x.GetOrders(), Times.Once); } [Test] public void GetAllOrders_ReturnsNull_ThrowException_Test() { // Arrange _orderStorageContact.Setup(x => x.GetOrders()).Returns((List)null); // Act & Assert Assert.That(() => _orderBusinessLogicContract.GetAllOrders(), Throws.TypeOf()); _orderStorageContact.Verify(x => x.GetOrders(), Times.Once); } [Test] public void GetAllOrders_StorageThrowError_ThrowException_Test() { // Arrange _orderStorageContact.Setup(x => x.GetOrders()) .Throws(new StorageException(new InvalidOperationException())); // Act & Assert Assert.That(() => _orderBusinessLogicContract.GetAllOrders(), Throws.TypeOf()); _orderStorageContact.Verify(x => x.GetOrders(), Times.Once); } [Test] public void GetOrderByData_ReturnsOrderById_Test() { // Arrange var id = Guid.NewGuid().ToString(); var order = new OrderDataModel( id, "John Doe", DateTime.Now, 100.50m, 10.50m, Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), StatusType.Pending ); _orderStorageContact.Setup(x => x.GetElementById(id)).Returns(order); // Act var element = _orderBusinessLogicContract.GetOrderByData(id); // Assert Assert.That(element, Is.Not.Null); Assert.That(element.Id, Is.EqualTo(id)); _orderStorageContact.Verify(x => x.GetElementById(id), Times.Once); } [Test] public void GetOrderByData_EmptyData_ThrowException_Test() { // Act & Assert Assert.That(() => _orderBusinessLogicContract.GetOrderByData(null), Throws.TypeOf()); Assert.That(() => _orderBusinessLogicContract.GetOrderByData(string.Empty), Throws.TypeOf()); _orderStorageContact.Verify(x => x.GetElementById(It.IsAny()), Times.Never); } [Test] public void GetOrderByData_NotFoundRecord_ThrowException_Test() { // Arrange var id = Guid.NewGuid().ToString(); _orderStorageContact.Setup(x => x.GetElementById(id)).Returns((OrderDataModel)null); // Act & Assert Assert.That(() => _orderBusinessLogicContract.GetOrderByData(id), Throws.TypeOf()); _orderStorageContact.Verify(x => x.GetElementById(id), Times.Once); } [Test] public void GetOrderByData_StorageThrowError_ThrowException_Test() { // Arrange _orderStorageContact.Setup(x => x.GetElementById(It.IsAny())) .Throws(new StorageException(new InvalidOperationException())); // Act & Assert Assert.That(() => _orderBusinessLogicContract.GetOrderByData(Guid.NewGuid().ToString()), Throws.TypeOf()); _orderStorageContact.Verify(x => x.GetElementById(It.IsAny()), Times.Once); } [Test] public void InsertOrder_CorrectRecord_Test() { // Arrange var pekarId = Guid.NewGuid().ToString(); var productId = Guid.NewGuid().ToString(); var flag = false; var order = new OrderDataModel( Guid.NewGuid().ToString(), "John Doe", DateTime.Now, 100.50m, 10.50m, productId, pekarId, StatusType.Pending ); _orderStorageContact.Setup(x => x.GetElementById(order.Id)).Returns((OrderDataModel)null); // No existing order _orderStorageContact.Setup(x => x.AddElement(It.Is(o => o.Id == order.Id))) .Callback((OrderDataModel x) => { flag = x.Id == order.Id && x.CustomerName == order.CustomerName && x.OrderDate == order.OrderDate && x.TotalAmount == order.TotalAmount && x.DiscountAmount == order.DiscountAmount && x.ProductId == order.ProductId && x.PekarId == order.PekarId && x.StatusType == order.StatusType; }) .Verifiable(); _pekarStorageContact.Setup(x => x.GetElementById(pekarId)) .Returns(new PekarDataModel(pekarId, "Ivan Ivanov", "Baker", 1.5m, new List())); _productStorageContact.Setup(x => x.GetElementById(productId)) .Returns(new ProductDataModel(productId, "Cake", "Super soft cake", new List())); // Act _orderBusinessLogicContract.InsertOrder(order); // Assert _orderStorageContact.Verify(x => x.AddElement(It.Is(o => o.Id == order.Id)), Times.Once); Assert.That(flag); } [Test] public void InsertOrder_RecordWithExistsData_ThrowException_Test() { // Arrange var pekarId = Guid.NewGuid().ToString(); var productId = Guid.NewGuid().ToString(); var order = new OrderDataModel( Guid.NewGuid().ToString(), "John Doe", DateTime.Now, 100.50m, 10.50m, productId, pekarId, StatusType.Pending ); _orderStorageContact.Setup(x => x.GetElementById(order.Id)).Returns(order); // Existing order _pekarStorageContact.Setup(x => x.GetElementById(pekarId)) .Returns(new PekarDataModel(pekarId, "Ivan Ivanov", "Baker", 1.5m, new List())); _productStorageContact.Setup(x => x.GetElementById(productId)) .Returns(new ProductDataModel(productId, "Cake", "Super soft cake", new List())); // Act & Assert Assert.That(() => _orderBusinessLogicContract.InsertOrder(order), Throws.TypeOf()); _orderStorageContact.Verify(x => x.GetElementById(order.Id), Times.Once); } [Test] public void InsertOrder_NullRecord_ThrowException_Test() { // Act & Assert Assert.That(() => _orderBusinessLogicContract.InsertOrder(null), Throws.TypeOf()); _orderStorageContact.Verify(x => x.AddElement(It.IsAny()), Times.Never); } [Test] public void InsertOrder_InvalidRecord_ThrowException_Test() { // Act & Assert Assert.That(() => _orderBusinessLogicContract.InsertOrder(new OrderDataModel( "", "", DateTime.Now, -100.50m, -10.50m, "", "", StatusType.Pending )), Throws.TypeOf()); _orderStorageContact.Verify(x => x.AddElement(It.IsAny()), Times.Never); } [Test] public void InsertOrder_StorageThrowError_ThrowException_Test() { // Arrange var pekarId = Guid.NewGuid().ToString(); var productId = Guid.NewGuid().ToString(); var order = new OrderDataModel( Guid.NewGuid().ToString(), "John Doe", DateTime.Now, 100.50m, 10.50m, productId, pekarId, StatusType.Pending ); _orderStorageContact.Setup(x => x.GetElementById(order.Id)).Returns((OrderDataModel)null); // No existing order _pekarStorageContact.Setup(x => x.GetElementById(pekarId)) .Returns(new PekarDataModel(pekarId, "Ivan Ivanov", "Baker", 1.5m, new List())); _productStorageContact.Setup(x => x.GetElementById(productId)) .Returns(new ProductDataModel(productId, "Cake", "Super soft cake", new List())); _orderStorageContact.Setup(x => x.AddElement(It.Is(o => o.Id == order.Id))) .Throws(new StorageException(new InvalidOperationException())); // Act & Assert Assert.That(() => _orderBusinessLogicContract.InsertOrder(order), Throws.TypeOf()); _orderStorageContact.Verify(x => x.GetElementById(order.Id), Times.Once); _orderStorageContact.Verify(x => x.AddElement(It.Is(o => o.Id == order.Id)), Times.Once); } [Test] public void UpdateOrder_CorrectRecord_Test() { // Arrange var pekarId = Guid.NewGuid().ToString(); var productId = Guid.NewGuid().ToString(); var flag = false; var order = new OrderDataModel( Guid.NewGuid().ToString(), "John Doe", DateTime.Now, 100.50m, 10.50m, productId, pekarId, StatusType.Pending ); _orderStorageContact.Setup(x => x.UpdateElement(It.Is(o => o.Id == order.Id))) .Callback((OrderDataModel x) => { flag = x.Id == order.Id && x.CustomerName == order.CustomerName && x.OrderDate == order.OrderDate && x.TotalAmount == order.TotalAmount && x.DiscountAmount == order.DiscountAmount && x.ProductId == order.ProductId && x.PekarId == order.PekarId && x.StatusType == order.StatusType; }) .Verifiable(); _pekarStorageContact.Setup(x => x.GetElementById(pekarId)) .Returns(new PekarDataModel(pekarId, "Ivan Ivanov", "Baker", 1.5m, new List())); _productStorageContact.Setup(x => x.GetElementById(productId)) .Returns(new ProductDataModel(productId, "Cake", "Super soft cake", new List())); // Act _orderBusinessLogicContract.UpdateOrder(order); // Assert _orderStorageContact.Verify(x => x.UpdateElement(It.Is(o => o.Id == order.Id)), Times.Once); Assert.That(flag); } [Test] public void UpdateOrder_RecordNotFound_ThrowException_Test() { // Arrange var pekarId = Guid.NewGuid().ToString(); var productId = Guid.NewGuid().ToString(); var order = new OrderDataModel( Guid.NewGuid().ToString(), "John Doe", DateTime.Now, 100.50m, 10.50m, productId, pekarId, StatusType.Pending ); _pekarStorageContact.Setup(x => x.GetElementById(pekarId)).Returns((PekarDataModel)null); // Trigger not found _orderStorageContact.Setup(x => x.UpdateElement(It.Is(o => o.Id == order.Id))) .Verifiable(); // Act & Assert Assert.That(() => _orderBusinessLogicContract.UpdateOrder(order), Throws.TypeOf()); _orderStorageContact.Verify(x => x.UpdateElement(It.Is(o => o.Id == order.Id)), Times.Never); } [Test] public void UpdateOrder_NullRecord_ThrowException_Test() { // Act & Assert Assert.That(() => _orderBusinessLogicContract.UpdateOrder(null), Throws.TypeOf()); _orderStorageContact.Verify(x => x.UpdateElement(It.IsAny()), Times.Never); } [Test] public void UpdateOrder_InvalidRecord_ThrowException_Test() { // Act & Assert Assert.That(() => _orderBusinessLogicContract.UpdateOrder(new OrderDataModel( "", "", DateTime.Now, -100.50m, -10.50m, "", "", StatusType.Pending )), Throws.TypeOf()); _orderStorageContact.Verify(x => x.UpdateElement(It.IsAny()), Times.Never); } [Test] public void UpdateOrder_StorageThrowError_ThrowException_Test() { // Arrange var pekarId = Guid.NewGuid().ToString(); var productId = Guid.NewGuid().ToString(); var order = new OrderDataModel( Guid.NewGuid().ToString(), "John Doe", DateTime.Now, 100.50m, 10.50m, productId, pekarId, StatusType.Pending ); _pekarStorageContact.Setup(x => x.GetElementById(pekarId)) .Returns(new PekarDataModel(pekarId, "Ivan Ivanov", "Baker", 1.5m, new List())); _productStorageContact.Setup(x => x.GetElementById(productId)) .Returns(new ProductDataModel(productId, "Cake", "Super soft cake", new List())); _orderStorageContact.Setup(x => x.UpdateElement(It.Is(o => o.Id == order.Id))) .Throws(new StorageException(new InvalidOperationException())); // Act & Assert Assert.That(() => _orderBusinessLogicContract.UpdateOrder(order), Throws.TypeOf()); _orderStorageContact.Verify(x => x.UpdateElement(It.Is(o => o.Id == order.Id)), Times.Once); } [Test] public void DeleteOrder_CorrectId_Test() { // Arrange var id = Guid.NewGuid().ToString(); var order = new OrderDataModel( id, "John Doe", DateTime.Now, 100.50m, 10.50m, Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), StatusType.Pending ); var flag = false; _orderStorageContact.Setup(x => x.GetElementById(id)).Returns(order); _orderStorageContact.Setup(x => x.DeleteElement(order)).Callback(() => { flag = true; }); // Act _orderBusinessLogicContract.DeleteOrder(id); // Assert _orderStorageContact.Verify(x => x.DeleteElement(order), Times.Once); Assert.That(flag); Assert.That(Guid.TryParse(order.Id, out _), Is.True); Assert.That(!order.CustomerName.IsEmpty()); Assert.That(order.TotalAmount >= 0); Assert.That(order.DiscountAmount >= 0); } [Test] public void DeleteOrder_RecordNotFound_ThrowException_Test() { // Arrange var id = Guid.NewGuid().ToString(); _orderStorageContact.Setup(x => x.GetElementById(id)).Returns((OrderDataModel)null); // Act & Assert Assert.That(() => _orderBusinessLogicContract.DeleteOrder(id), Throws.TypeOf()); _orderStorageContact.Verify(x => x.GetElementById(id), Times.Once); } [Test] public void DeleteOrder_NullOrEmptyId_ThrowException_Test() { // Act & Assert Assert.That(() => _orderBusinessLogicContract.DeleteOrder(null), Throws.TypeOf()); Assert.That(() => _orderBusinessLogicContract.DeleteOrder(string.Empty), Throws.TypeOf()); _orderStorageContact.Verify(x => x.DeleteElement(It.IsAny()), Times.Never); } [Test] public void DeleteOrder_InvalidId_ThrowException_Test() { // Act & Assert Assert.That(() => _orderBusinessLogicContract.DeleteOrder("invalid"), Throws.TypeOf()); _orderStorageContact.Verify(x => x.DeleteElement(It.IsAny()), Times.Never); } [Test] public void DeleteOrder_StorageThrowError_ThrowException_Test() { // Arrange var id = Guid.NewGuid().ToString(); var order = new OrderDataModel(id, "John Doe", DateTime.Now, 100.50m, 10.50m, Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), StatusType.Pending); _orderStorageContact.Setup(x => x.GetElementById(id)).Returns(order); _orderStorageContact.Setup(x => x.DeleteElement(order)).Throws(new StorageException(new InvalidOperationException())); // Act & Assert Assert.That(() => _orderBusinessLogicContract.DeleteOrder(id), Throws.TypeOf()); _orderStorageContact.Verify(x => x.GetElementById(id), Times.Once); _orderStorageContact.Verify(x => x.DeleteElement(order), Times.Once); } } }