From f16055973e7eef765e0c1f63c0d4c561076c3aeb Mon Sep 17 00:00:00 2001 From: Tonb73 Date: Tue, 18 Feb 2025 10:55:27 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9A=D1=80=D0=B0=D1=81=D0=BD=D0=B0=D1=8F=20?= =?UTF-8?q?=D0=B7=D0=BE=D0=BD=D0=B0=20=D0=BD=D0=B0=20=D1=82=D0=B5=D1=81?= =?UTF-8?q?=D1=82=D0=B0=D1=85=20=D0=BF=D0=BE=20=D0=B7=D0=B0=D0=B3=D0=BE?= =?UTF-8?q?=D1=82=D0=BE=D0=B2=D0=BA=D0=B0=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BlankBusinessLogicContract.cs | 4 +- .../PapaCarloBusinessLogic.csproj | 5 + .../Exceptions/ElementExistsException.cs | 20 ++ .../Exceptions/ElementNotFoundException.cs | 17 ++ .../Exceptions/NullListException.cs | 12 + .../Exceptions/StorageException.cs | 12 + ...ionException.cs => ValidationException.cs} | 0 .../IBlankStorageContract.cs | 2 +- .../BlankBusinessLogicContractTests.cs | 284 ++++++++++++++++++ .../PapaCarloTests/PapaCarloTests.csproj | 2 + 10 files changed, 356 insertions(+), 2 deletions(-) create mode 100644 PapaCarloProject/PapaCarloContracts/Exceptions/ElementExistsException.cs create mode 100644 PapaCarloProject/PapaCarloContracts/Exceptions/ElementNotFoundException.cs create mode 100644 PapaCarloProject/PapaCarloContracts/Exceptions/NullListException.cs create mode 100644 PapaCarloProject/PapaCarloContracts/Exceptions/StorageException.cs rename PapaCarloProject/PapaCarloContracts/Exceptions/{IValidationException.cs => ValidationException.cs} (100%) create mode 100644 PapaCarloProject/PapaCarloTests/BusinessLogicsContracts/BlankBusinessLogicContractTests.cs diff --git a/PapaCarloProject/PapaCarloBusinessLogic/Implementations/BlankBusinessLogicContract.cs b/PapaCarloProject/PapaCarloBusinessLogic/Implementations/BlankBusinessLogicContract.cs index 9325f7b..ec3e9de 100644 --- a/PapaCarloProject/PapaCarloBusinessLogic/Implementations/BlankBusinessLogicContract.cs +++ b/PapaCarloProject/PapaCarloBusinessLogic/Implementations/BlankBusinessLogicContract.cs @@ -1,5 +1,6 @@ using PapaCarloContracts.BusinessLogicContracts; using PapaCarloContracts.DataModels; +using PapaCarloContracts.StoragesContracts; using System; using System.Collections.Generic; using System.Linq; @@ -8,8 +9,9 @@ using System.Threading.Tasks; namespace PapaCarloBusinessLogic.Implementations { - internal class BlankBusinessLogicContract : IBlankBusinessLogicContract + internal class BlankBusinessLogicContract(IBlankStorageContract storageContract) : IBlankBusinessLogicContract { + private IBlankStorageContract _storageContract = storageContract; public void DeleteBlank(string id) { } diff --git a/PapaCarloProject/PapaCarloBusinessLogic/PapaCarloBusinessLogic.csproj b/PapaCarloProject/PapaCarloBusinessLogic/PapaCarloBusinessLogic.csproj index aefae07..16e76b6 100644 --- a/PapaCarloProject/PapaCarloBusinessLogic/PapaCarloBusinessLogic.csproj +++ b/PapaCarloProject/PapaCarloBusinessLogic/PapaCarloBusinessLogic.csproj @@ -5,6 +5,11 @@ enable enable + + + + + diff --git a/PapaCarloProject/PapaCarloContracts/Exceptions/ElementExistsException.cs b/PapaCarloProject/PapaCarloContracts/Exceptions/ElementExistsException.cs new file mode 100644 index 0000000..5c06c9b --- /dev/null +++ b/PapaCarloProject/PapaCarloContracts/Exceptions/ElementExistsException.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace PapaCarloContracts.Exceptions; + +public class ElementExistsException : Exception +{ + public string ParamName { get; private set; } + + public string ParamValue { get; private set; } + + public ElementExistsException(string paramName, string paramValue) : base($"There is already an element with value{paramValue} of parameter {paramName}") + { + ParamName = paramName; + ParamValue = paramValue; + } +} diff --git a/PapaCarloProject/PapaCarloContracts/Exceptions/ElementNotFoundException.cs b/PapaCarloProject/PapaCarloContracts/Exceptions/ElementNotFoundException.cs new file mode 100644 index 0000000..e5fe646 --- /dev/null +++ b/PapaCarloProject/PapaCarloContracts/Exceptions/ElementNotFoundException.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace PapaCarloContracts.Exceptions; + +public class ElementNotFoundException : Exception +{ + public string Value { get; private set; } + + public ElementNotFoundException(string value) : base($"Element not found at value = {value}") + { + Value = value; + } +} diff --git a/PapaCarloProject/PapaCarloContracts/Exceptions/NullListException.cs b/PapaCarloProject/PapaCarloContracts/Exceptions/NullListException.cs new file mode 100644 index 0000000..24db2a2 --- /dev/null +++ b/PapaCarloProject/PapaCarloContracts/Exceptions/NullListException.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace PapaCarloContracts.Exceptions; + +public class NullListException : Exception +{ + public NullListException() : base("The returned list is null") { } +} diff --git a/PapaCarloProject/PapaCarloContracts/Exceptions/StorageException.cs b/PapaCarloProject/PapaCarloContracts/Exceptions/StorageException.cs new file mode 100644 index 0000000..3550201 --- /dev/null +++ b/PapaCarloProject/PapaCarloContracts/Exceptions/StorageException.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace PapaCarloContracts.Exceptions; + +public class StorageException : Exception +{ + public StorageException(Exception ex) : base($"Error while working in storage: {ex.Message}", ex) { } +} diff --git a/PapaCarloProject/PapaCarloContracts/Exceptions/IValidationException.cs b/PapaCarloProject/PapaCarloContracts/Exceptions/ValidationException.cs similarity index 100% rename from PapaCarloProject/PapaCarloContracts/Exceptions/IValidationException.cs rename to PapaCarloProject/PapaCarloContracts/Exceptions/ValidationException.cs diff --git a/PapaCarloProject/PapaCarloContracts/StoragesContracts/IBlankStorageContract.cs b/PapaCarloProject/PapaCarloContracts/StoragesContracts/IBlankStorageContract.cs index 6889f15..af99a26 100644 --- a/PapaCarloProject/PapaCarloContracts/StoragesContracts/IBlankStorageContract.cs +++ b/PapaCarloProject/PapaCarloContracts/StoragesContracts/IBlankStorageContract.cs @@ -7,7 +7,7 @@ using System.Threading.Tasks; namespace PapaCarloContracts.StoragesContracts; -public interface IManufacturerStorageContract +public interface IBlankStorageContract { List GetList(); BlankDataModel? GetElementById(string id); diff --git a/PapaCarloProject/PapaCarloTests/BusinessLogicsContracts/BlankBusinessLogicContractTests.cs b/PapaCarloProject/PapaCarloTests/BusinessLogicsContracts/BlankBusinessLogicContractTests.cs new file mode 100644 index 0000000..7012bab --- /dev/null +++ b/PapaCarloProject/PapaCarloTests/BusinessLogicsContracts/BlankBusinessLogicContractTests.cs @@ -0,0 +1,284 @@ +using Moq; +using NUnit.Framework; +using PapaCarloBusinessLogic.Implementations; +using PapaCarloContracts.BusinessLogicContracts; +using PapaCarloContracts.DataModels; +using PapaCarloContracts.Exceptions; +using PapaCarloContracts.StoragesContracts; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace PapaCarloTests.BusinessLogicsContracts; + +[TestFixture] +internal class BlankBusinessLogicContractTests +{ + private IBlankBusinessLogicContract _blankBusinessLogicContract; + private Mock _blankStorageContract; + + [OneTimeSetUp] + public void OneTimeSetUp() + { + _blankStorageContract = new Mock(); + _blankBusinessLogicContract = new BlankBusinessLogicContract(_blankStorageContract.Object); + } + + [SetUp] + public void SetUp() + { + _blankStorageContract.Reset(); + } + + [Test] + public void GetAllBlanks_ReturnListOfRecords_Test() + { + var listOriginal = new List() + { + new(Guid.NewGuid().ToString(),"Mahogany","",""), + new(Guid.NewGuid().ToString(),"Birch","",""), + new(Guid.NewGuid().ToString(),"Spruce","","") + }; + + _blankStorageContract.Setup(x=> x.GetList()).Returns(listOriginal); + + var list = _blankBusinessLogicContract.GetAllBlanks(); + + Assert.That(list, Is.Not.Null); + Assert.That(list, Is.EquivalentTo(listOriginal)); + } + + [Test] + public void GetAllBlanks_ReturnEmptyList_Test() + { + + + _blankStorageContract.Setup(x => x.GetList()).Returns([]); + + var list = _blankBusinessLogicContract.GetAllBlanks(); + + Assert.That(list, Is.Not.Null); + Assert.That(list, Has.Count.EqualTo(0)); + _blankStorageContract.Verify(x => x.GetList(), Times.Once); + } + + [Test] + public void GetAllBlanks_ReturnNull_ThrowException_Test() + { + Assert.That(() => _blankBusinessLogicContract.GetAllBlanks(), Throws.TypeOf()); + _blankStorageContract.Verify(x => x.GetList(), Times.Once); + } + + [Test] + public void GetAllBlanks_StorageThrowError_ThrowException_Test() + { + _blankStorageContract.Setup(x => x.GetList()).Throws(new StorageException(new InvalidOperationException())); + + Assert.That(() => _blankBusinessLogicContract.GetAllBlanks(), Throws.TypeOf()); + _blankStorageContract.Verify(x => x.GetList(), Times.Once); + } + + [Test] + public void GetBlankByData_GetById_ReturnRecord_Test() + { + var id = Guid.NewGuid().ToString(); + var record = new BlankDataModel(id, "Spruce", "", ""); + _blankStorageContract.Setup(x => x.GetElementById(id)).Returns(record); + + var element = _blankBusinessLogicContract.GetBlankByData(id); + + Assert.That(element, Is.Not.Null); + Assert.That(element.Id, Is.EqualTo(id)); + _blankStorageContract.Verify(x => x.GetElementById(It.IsAny()), Times.Once); + } + + [Test] + public void GetBlankByData_GetByName_ReturnRecord_Test() + { + var name = "Spruce"; + var record = new BlankDataModel(Guid.NewGuid().ToString(), name, "", ""); + _blankStorageContract.Setup(x => x.GetElementByName(name)).Returns(record); + + var element = _blankBusinessLogicContract.GetBlankByData(name); + + Assert.That(element, Is.Not.Null); + Assert.That(element.BlankName, Is.EqualTo(name)); + _blankStorageContract.Verify(x => x.GetElementByName(It.IsAny()), Times.Once); + } + + public void GetBlankByData_GetByOldName_ReturnRecord_Test() + { + var oldName = "Spruce"; + var record = new BlankDataModel(Guid.NewGuid().ToString(), "Birch", oldName, ""); + _blankStorageContract.Setup(x => x.GetElementByOldName(oldName)).Returns(record); + + var element = _blankBusinessLogicContract.GetBlankByData(oldName); + + Assert.That(element, Is.Not.Null); + Assert.That(element.PrevBlankName, Is.EqualTo(oldName)); + _blankStorageContract.Verify(x => x.GetElementByOldName(It.IsAny()), Times.Once); + } + + [Test] + public void GetBlankByData_EmptyData_ThrowException_Test() + { + Assert.That(() => _blankBusinessLogicContract.GetBlankByData(null), Throws.TypeOf()); + Assert.That(() => _blankBusinessLogicContract.GetBlankByData(String.Empty), Throws.TypeOf()); + + _blankStorageContract.Verify(x => x.GetElementById(It.IsAny()), Times.Never); + _blankStorageContract.Verify(x => x.GetElementByName(It.IsAny()), Times.Never); + _blankStorageContract.Verify(x => x.GetElementByOldName(It.IsAny()), Times.Never); + } + + [Test] + public void GetBlankByData_GetById_NotFoundRecord_ThrowException_Test() + { + Assert.That(() => _blankBusinessLogicContract.GetBlankByData(Guid.NewGuid().ToString()), Throws.TypeOf()); + _blankStorageContract.Verify(x => x.GetElementById(It.IsAny()), Times.Once); + _blankStorageContract.Verify(x => x.GetElementByName(It.IsAny()), Times.Never); + _blankStorageContract.Verify(x => x.GetElementByOldName(It.IsAny()), Times.Never); + } + + [Test] + public void GetBlankByData_GetByName_NotFoundRecord_ThrowException_Test() + { + Assert.That(() => _blankBusinessLogicContract.GetBlankByData("Name"), Throws.TypeOf()); + _blankStorageContract.Verify(x => x.GetElementById(It.IsAny()), Times.Never); + _blankStorageContract.Verify(x => x.GetElementByName(It.IsAny()), Times.Once); + _blankStorageContract.Verify(x => x.GetElementByOldName(It.IsAny()), Times.Never); + } + [Test] + public void GetBlankByData_StorageThrowError_ThrowException_Test() + { + _blankStorageContract.Setup(x => x.GetElementById(It.IsAny())).Throws(new StorageException(new InvalidOperationException())); + _blankStorageContract.Setup(x => x.GetElementByName(It.IsAny())).Throws(new StorageException(new InvalidOperationException())); + + Assert.That(() => _blankBusinessLogicContract.GetBlankByData(Guid.NewGuid().ToString()), Throws.TypeOf()); + Assert.That(() => _blankBusinessLogicContract.GetBlankByData("Name"), Throws.TypeOf()); + + _blankStorageContract.Verify(x => x.GetElementById(It.IsAny()), Times.Once); + _blankStorageContract.Verify(x => x.GetElementByName(It.IsAny()), Times.Once); + } + + [Test] + public void InsertBlank_CorrectRecord_Test() + { + var flag = false; + var record = new BlankDataModel(Guid.NewGuid().ToString(), "Spruce", "", ""); + _blankStorageContract.Setup(x => x.AddElement(It.IsAny())) + .Callback((BlankDataModel x) => + { + flag = x.Id == record.Id && x.BlankName == record.BlankName; + }); + _blankBusinessLogicContract.InsertBlank(record); + + _blankStorageContract.Verify(x => x.AddElement(It.IsAny()), Times.Once); + Assert.That(flag); + } + + [Test] + public void InsertBlank_RecordWithExistData_ThrowException_Test() + { + _blankStorageContract.Setup(x => x.AddElement(It.IsAny())).Throws(new ElementExistsException("Data", "Data")); + + Assert.That(() => _blankBusinessLogicContract.InsertBlank(new(Guid.NewGuid().ToString(), "Spruce", "", "")), Throws.TypeOf()); + _blankStorageContract.Verify(x => x.AddElement(It.IsAny()), Times.Once); + } + + [Test] + public void InsertBlank_NullRecord_ThrowException_Test() + { + Assert.That(() => _blankBusinessLogicContract.InsertBlank(null), Throws.TypeOf()); + _blankStorageContract.Verify(x => x.AddElement(It.IsAny()), Times.Never); + } + + [Test] + public void InsertBlank_InvalidRecord_ThrowException_Test() + { + Assert.That(() => _blankBusinessLogicContract.InsertBlank(new BlankDataModel("id", "name", "", "")), Throws.TypeOf()); + _blankStorageContract.Verify(x => x.AddElement(It.IsAny()), Times.Never); + } + [Test] + public void InsertBlank_StorageThrowError_ThrowException_Test() + { + _blankStorageContract.Setup(x => x.AddElement(It.IsAny())).Throws(new StorageException(new InvalidOperationException())); + + Assert.That(() => _blankBusinessLogicContract.InsertBlank(new(Guid.NewGuid().ToString(), "Spruce", "", "")), Throws.TypeOf()); + _blankStorageContract.Verify(x => x.AddElement(It.IsAny()), Times.Once); + } + [Test] + public void UpdateBlank_RecordWithIncorrectData_ThrowException_Test() + { + _blankStorageContract.Setup(x => x.UpdElement(It.IsAny())).Throws(new ElementNotFoundException("")); + + Assert.That(() => _blankBusinessLogicContract.UpdateBlank(new(Guid.NewGuid().ToString(), "Spruce", "", "")), Throws.TypeOf()); + _blankStorageContract.Verify(x => x.UpdElement(It.IsAny()), Times.Once); + } + [Test] + public void UpdateBlank_RecordWithExistData_ThrowException_Test() + { + _blankStorageContract.Setup(x => x.UpdElement(It.IsAny())).Throws(new ElementExistsException("Data","Data")); + + Assert.That(() => _blankBusinessLogicContract.UpdateBlank(new(Guid.NewGuid().ToString(), "Spruce", "", "")), Throws.TypeOf()); + _blankStorageContract.Verify(x => x.UpdElement(It.IsAny()), Times.Once); + } + [Test] + public void UpdateBlank_NullRecord_ThrowException_Test() + { + Assert.That(() => _blankBusinessLogicContract.UpdateBlank(null), Throws.TypeOf()); + _blankStorageContract.Verify(x => x.UpdElement(It.IsAny()), Times.Never); + } + [Test] + public void UpdateBlank_InvalidRecord_ThrowException_Test() + { + + Assert.That(() => _blankBusinessLogicContract.UpdateBlank(new("id", "Spruce", "", "")), Throws.TypeOf()); + _blankStorageContract.Verify(x => x.UpdElement(It.IsAny()), Times.Never); + } + [Test] + public void DeleteBlank_CorrectRecord_Test() + { + var id = Guid.NewGuid().ToString(); + var flag = false; + _blankStorageContract.Setup(x => x.DelElement(It.Is((string x) => x == id))).Callback(() => { flag = true; }); + + _blankBusinessLogicContract.DeleteBlank(id); + + _blankStorageContract.Verify(x => x.DelElement(It.IsAny()), Times.Once); + Assert.That(flag); + } + [Test] + public void DeleteBlank_RecordWithIncorrectId_ThrowException_Test() + { + _blankStorageContract.Setup(x => x.DelElement(It.IsAny())).Throws(new ElementNotFoundException("")); + + Assert.That(() => _blankBusinessLogicContract.DeleteBlank(Guid.NewGuid().ToString()), Throws.TypeOf()); + _blankStorageContract.Verify(x => x.DelElement(It.IsAny()), Times.Once); + } + [Test] + public void DeleteBlank_IdIsNullOrEmpty_ThrowException_Test() + { + Assert.That(() => _blankBusinessLogicContract.DeleteBlank(null), Throws.TypeOf()); + Assert.That(() => _blankBusinessLogicContract.DeleteBlank(string.Empty), Throws.TypeOf()); + _blankStorageContract.Verify(x => x.DelElement(It.IsAny()), Times.Never); + } + [Test] + public void DeleteBlank_IdIsNotGuid_ThrowException_Test() + { + Assert.That(() => _blankBusinessLogicContract.DeleteBlank("id"), Throws.TypeOf()); + _blankStorageContract.Verify(x => x.DelElement(It.IsAny()), Times.Never); + } + [Test] + public void DeleteBlank_StorageThrowError_ThrowException_Test() + { + _blankStorageContract.Setup(x => x.DelElement(It.IsAny())).Throws(new StorageException(new InvalidOperationException())); + + Assert.That(() => _blankBusinessLogicContract.DeleteBlank(Guid.NewGuid().ToString()), Throws.TypeOf()); + _blankStorageContract.Verify(x => x.DelElement(It.IsAny()), Times.Once); + } + + + +} diff --git a/PapaCarloProject/PapaCarloTests/PapaCarloTests.csproj b/PapaCarloProject/PapaCarloTests/PapaCarloTests.csproj index a28ae93..04cba49 100644 --- a/PapaCarloProject/PapaCarloTests/PapaCarloTests.csproj +++ b/PapaCarloProject/PapaCarloTests/PapaCarloTests.csproj @@ -11,12 +11,14 @@ + +