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 ComponentBusinessLogicContractTests { private ComponentBusinessLogicContract _componentBusinessLogicContract; private Mock _componentStorageContract; [OneTimeSetUp] public void OneTimeSetUp() { _componentStorageContract = new Mock(); _componentBusinessLogicContract = new ComponentBusinessLogicContract(_componentStorageContract.Object, new Mock().Object); } [TearDown] public void TearDown() { _componentStorageContract.Reset(); } [Test] public void GetAllComponents_ReturnListOfRecords_Test() { // Arrange var listOriginal = new List() { new(Guid.NewGuid().ToString(), "name 1", ComponentType.Other, 10, false), new(Guid.NewGuid().ToString(), "name 2", ComponentType.Other, 10, true), new(Guid.NewGuid().ToString(), "name 3", ComponentType.Other, 10, false), }; _componentStorageContract.Setup(x => x.GetList(It.IsAny())).Returns(listOriginal); // Act var listOnlyActive = _componentBusinessLogicContract.GetAllComponents(true); var list = _componentBusinessLogicContract.GetAllComponents(false); // Assert Assert.Multiple(() => { Assert.That(listOnlyActive, Is.Not.Null); Assert.That(list, Is.Not.Null); Assert.That(listOnlyActive, Is.EquivalentTo(listOriginal)); Assert.That(list, Is.EquivalentTo(listOriginal)); }); _componentStorageContract.Verify(x => x.GetList(true), Times.Once); _componentStorageContract.Verify(x => x.GetList(false), Times.Once); } [Test] public void GetAllComponents_ReturnEmptyList_Test() { // Arrange _componentStorageContract.Setup(x => x.GetList(It.IsAny())).Returns(new List()); // Act var listOnlyActive = _componentBusinessLogicContract.GetAllComponents(true); var list = _componentBusinessLogicContract.GetAllComponents(false); // Assert Assert.Multiple(() => { Assert.That(listOnlyActive, Is.Not.Null); Assert.That(list, Is.Not.Null); Assert.That(listOnlyActive, Has.Count.EqualTo(0)); Assert.That(list, Has.Count.EqualTo(0)); }); _componentStorageContract.Verify(x => x.GetList(It.IsAny()), Times.Exactly(2)); } [Test] public void GetAllComponents_ReturnNull_ThrowException_Test() { // Act & Assert Assert.That(() => _componentBusinessLogicContract.GetAllComponents(It.IsAny()), Throws.TypeOf()); _componentStorageContract.Verify(x => x.GetList(It.IsAny()), Times.Once); } [Test] public void GetAllComponents_StorageThrowError_ThrowException_Test() { // Arrange _componentStorageContract.Setup(x => x.GetList(It.IsAny())).Throws(new StorageException(new InvalidOperationException())); // Act & Assert Assert.That(() => _componentBusinessLogicContract.GetAllComponents(It.IsAny()), Throws.TypeOf()); _componentStorageContract.Verify(x => x.GetList(It.IsAny()), Times.Once); } [Test] public void GetComponentByData_GetById_ReturnRecord_Test() { // Arrange var id = Guid.NewGuid().ToString(); var record = new ComponentDataModel(id, "name", ComponentType.Other, 10, false); _componentStorageContract.Setup(x => x.GetElementById(id)).Returns(record); // Act var element = _componentBusinessLogicContract.GetComponentByData(id); // Assert Assert.That(element, Is.Not.Null); Assert.That(element.Id, Is.EqualTo(id)); _componentStorageContract.Verify(x => x.GetElementById(It.IsAny()), Times.Once); } [Test] public void GetComponentByData_GetByName_ReturnRecord_Test() { // Arrange var name = "name"; var record = new ComponentDataModel(Guid.NewGuid().ToString(), name, ComponentType.Other, 10, false); _componentStorageContract.Setup(x => x.GetElementByName(name)).Returns(record); // Act var element = _componentBusinessLogicContract.GetComponentByData(name); // Assert Assert.That(element, Is.Not.Null); Assert.That(element.ComponentName, Is.EqualTo(name)); _componentStorageContract.Verify(x => x.GetElementByName(It.IsAny()), Times.Once); } [Test] public void GetComponentByData_EmptyData_ThrowException_Test() { // Act & Assert Assert.That(() => _componentBusinessLogicContract.GetComponentByData(null), Throws.TypeOf()); Assert.That(() => _componentBusinessLogicContract.GetComponentByData(string.Empty), Throws.TypeOf()); _componentStorageContract.Verify(x => x.GetElementByName(It.IsAny()), Times.Never); _componentStorageContract.Verify(x => x.GetElementById(It.IsAny()), Times.Never); } [Test] public void GetComponentByData_GetById_NotFoundRecord_ThrowException_Test() { // Act & Assert Assert.That(() => _componentBusinessLogicContract.GetComponentByData(Guid.NewGuid().ToString()), Throws.TypeOf()); _componentStorageContract.Verify(x => x.GetElementById(It.IsAny()), Times.Once); } [Test] public void GetComponentByData_GetByName_NotFoundRecord_ThrowException_Test() { // Act & Assert Assert.That(() => _componentBusinessLogicContract.GetComponentByData("name"), Throws.TypeOf()); _componentStorageContract.Verify(x => x.GetElementByName(It.IsAny()), Times.Once); } [Test] public void GetComponentByData_StorageThrowError_ThrowException_Test() { // Arrange _componentStorageContract.Setup(x => x.GetElementById(It.IsAny())).Throws(new StorageException(new InvalidOperationException())); _componentStorageContract.Setup(x => x.GetElementByName(It.IsAny())).Throws(new StorageException(new InvalidOperationException())); // Act & Assert Assert.That(() => _componentBusinessLogicContract.GetComponentByData(Guid.NewGuid().ToString()), Throws.TypeOf()); Assert.That(() => _componentBusinessLogicContract.GetComponentByData("name"), Throws.TypeOf()); _componentStorageContract.Verify(x => x.GetElementById(It.IsAny()), Times.Once); _componentStorageContract.Verify(x => x.GetElementByName(It.IsAny()), Times.Once); } [Test] public void InsertComponent_CorrectRecord_Test() { // Arrange var flag = false; var record = new ComponentDataModel(Guid.NewGuid().ToString(), "name", ComponentType.Other, 10, false); _componentStorageContract.Setup(x => x.AddElement(It.IsAny())) .Callback((ComponentDataModel x) => { flag = x.Id == record.Id && x.ComponentName == record.ComponentName && x.ComponentType == record.ComponentType && x.Price == record.Price && x.IsDeleted == record.IsDeleted; }); // Act _componentBusinessLogicContract.InsertComponent(record); // Assert _componentStorageContract.Verify(x => x.AddElement(It.IsAny()), Times.Once); Assert.That(flag); } [Test] public void InsertComponent_RecordWithExistsData_ThrowException_Test() { // Arrange _componentStorageContract.Setup(x => x.AddElement(It.IsAny())).Throws(new ElementExistsException("Data", "Data")); // Act & Assert Assert.That(() => _componentBusinessLogicContract.InsertComponent(new(Guid.NewGuid().ToString(), "name", ComponentType.Other, 10, false)), Throws.TypeOf()); _componentStorageContract.Verify(x => x.AddElement(It.IsAny()), Times.Once); } [Test] public void InsertComponent_NullRecord_ThrowException_Test() { // Act & Assert Assert.That(() => _componentBusinessLogicContract.InsertComponent(null), Throws.TypeOf()); _componentStorageContract.Verify(x => x.AddElement(It.IsAny()), Times.Never); } [Test] public void InsertComponent_InvalidRecord_ThrowException_Test() { // Act & Assert Assert.That(() => _componentBusinessLogicContract.InsertComponent(new ComponentDataModel("id", "name", ComponentType.Other, 10, false)), Throws.TypeOf()); _componentStorageContract.Verify(x => x.AddElement(It.IsAny()), Times.Never); } [Test] public void InsertComponent_StorageThrowError_ThrowException_Test() { // Arrange _componentStorageContract.Setup(x => x.AddElement(It.IsAny())).Throws(new StorageException(new InvalidOperationException())); // Act & Assert Assert.That(() => _componentBusinessLogicContract.InsertComponent(new(Guid.NewGuid().ToString(), "name", ComponentType.Other, 10, false)), Throws.TypeOf()); _componentStorageContract.Verify(x => x.AddElement(It.IsAny()), Times.Once); } [Test] public void UpdateComponent_CorrectRecord_Test() { // Arrange var flag = false; var record = new ComponentDataModel(Guid.NewGuid().ToString(), "name", ComponentType.Other, 10, false); _componentStorageContract.Setup(x => x.UpdElement(It.IsAny())) .Callback((ComponentDataModel x) => { flag = x.Id == record.Id && x.ComponentName == record.ComponentName && x.ComponentType == record.ComponentType && x.Price == record.Price && x.IsDeleted == record.IsDeleted; }); // Act _componentBusinessLogicContract.UpdateComponent(record); // Assert _componentStorageContract.Verify(x => x.UpdElement(It.IsAny()), Times.Once); Assert.That(flag); } [Test] public void UpdateComponent_RecordWithIncorrectData_ThrowException_Test() { // Arrange _componentStorageContract.Setup(x => x.UpdElement(It.IsAny())).Throws(new ElementNotFoundException("")); // Act & Assert Assert.That(() => _componentBusinessLogicContract.UpdateComponent(new(Guid.NewGuid().ToString(), "name", ComponentType.Other, 10, false)), Throws.TypeOf()); _componentStorageContract.Verify(x => x.UpdElement(It.IsAny()), Times.Once); } [Test] public void UpdateComponent_RecordWithExistsData_ThrowException_Test() { // Arrange _componentStorageContract.Setup(x => x.UpdElement(It.IsAny())).Throws(new ElementExistsException("Data", "Data")); // Act & Assert Assert.That(() => _componentBusinessLogicContract.UpdateComponent(new(Guid.NewGuid().ToString(), "anme", ComponentType.Other, 10, false)), Throws.TypeOf()); _componentStorageContract.Verify(x => x.UpdElement(It.IsAny()), Times.Once); } [Test] public void UpdateComponent_NullRecord_ThrowException_Test() { // Act & Assert Assert.That(() => _componentBusinessLogicContract.UpdateComponent(null), Throws.TypeOf()); _componentStorageContract.Verify(x => x.UpdElement(It.IsAny()), Times.Never); } [Test] public void UpdateComponent_InvalidRecord_ThrowException_Test() { // Act & Assert Assert.That(() => _componentBusinessLogicContract.UpdateComponent(new ComponentDataModel("id", "name", ComponentType.Other, 10, false)), Throws.TypeOf()); _componentStorageContract.Verify(x => x.UpdElement(It.IsAny()), Times.Never); } [Test] public void UpdateComponent_StorageThrowError_ThrowException_Test() { // Arrange _componentStorageContract.Setup(x => x.UpdElement(It.IsAny())).Throws(new StorageException(new InvalidOperationException())); // Act & Assert Assert.That(() => _componentBusinessLogicContract.UpdateComponent(new(Guid.NewGuid().ToString(), "name", ComponentType.Other, 10, false)), Throws.TypeOf()); _componentStorageContract.Verify(x => x.UpdElement(It.IsAny()), Times.Once); } [Test] public void DeleteComponent_CorrectRecord_Test() { // Arrange var id = Guid.NewGuid().ToString(); var flag = false; _componentStorageContract.Setup(x => x.DelElement(It.Is((string x) => x == id))).Callback(() => { flag = true; }); // Act _componentBusinessLogicContract.DeleteComponent(id); // Assert _componentStorageContract.Verify(x => x.DelElement(It.IsAny()), Times.Once); Assert.That(flag); } [Test] public void DeleteComponent_RecordWithIncorrectId_ThrowException_Test() { // Arrange var id = Guid.NewGuid().ToString(); _componentStorageContract.Setup(x => x.DelElement(It.IsAny())).Throws(new ElementNotFoundException(id)); // Act & Assert Assert.That(() => _componentBusinessLogicContract.DeleteComponent(Guid.NewGuid().ToString()), Throws.TypeOf()); _componentStorageContract.Verify(x => x.DelElement(It.IsAny()), Times.Once); } [Test] public void DeleteComponent_IdIsNullOrEmpty_ThrowException_Test() { // Act & Assert Assert.That(() => _componentBusinessLogicContract.DeleteComponent(null), Throws.TypeOf()); Assert.That(() => _componentBusinessLogicContract.DeleteComponent(string.Empty), Throws.TypeOf()); _componentStorageContract.Verify(x => x.DelElement(It.IsAny()), Times.Never); } [Test] public void DeleteComponent_IdIsNotGuid_ThrowException_Test() { // Act & Assert Assert.That(() => _componentBusinessLogicContract.DeleteComponent("id"), Throws.TypeOf()); _componentStorageContract.Verify(x => x.DelElement(It.IsAny()), Times.Never); } [Test] public void DeleteComponent_StorageThrowError_ThrowException_Test() { // Arrange _componentStorageContract.Setup(x => x.DelElement(It.IsAny())).Throws(new StorageException(new InvalidOperationException())); // Act & Assert Assert.That(() => _componentBusinessLogicContract.DeleteComponent(Guid.NewGuid().ToString()), Throws.TypeOf()); _componentStorageContract.Verify(x => x.DelElement(It.IsAny()), Times.Once); } }