Добавил адаптер

This commit is contained in:
2025-04-19 10:03:52 +04:00
parent 01d5a1e48f
commit 8169d53deb
3 changed files with 429 additions and 1 deletions

View File

@@ -0,0 +1,426 @@
using System.Net;
using System.Net.NetworkInformation;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using Moq;
using NUnit.Framework;
using TwoFromTheCasketContracts.BindingModels;
using TwoFromTheCasketContracts.BusinessLogicsContracts;
using TwoFromTheCasketContracts.DataModels;
using TwoFromTheCasketContracts.Exceptions;
using TwoFromTheCasketContracts.ViewModels;
using TwoFromTheCasketWebApi.Adapters;
namespace TwoFromTheCasketTests.AdapterTests;
[TestFixture]
public class WarehouseAdapterTests
{
private WarehouseAdapter _adapter;
private Mock<IWarehouseBuisnessLogicContract> _logic;
private Mock<ILogger<WarehouseAdapter>> _logger;
private Mock<HttpRequest> _request;
private Mock<HttpResponse> _response;
private int _status;
[OneTimeSetUp]
public void OneTimeSetUp()
{
_logic = new Mock<IWarehouseBuisnessLogicContract>();
_logger = new Mock<ILogger<WarehouseAdapter>>();
_adapter = new WarehouseAdapter(_logic.Object, _logger.Object);
_request = new Mock<HttpRequest>();
}
[SetUp]
public void SetUp()
{
_status = 0;
_response = CreateMockResponse();
}
[TearDown]
public void TearDown()
{
_logic.Reset();
_request.Reset();
_response.Reset();
}
private Mock<HttpResponse> CreateMockResponse()
{
var mock = new Mock<HttpResponse>();
mock.Setup(x => x.StatusCode).Returns(_status);
mock.SetupSet(x => x.StatusCode = It.IsAny<int>())
.Callback<int>(code => _status = code);
return mock;
}
[Test]
public void GetList_ReturnsRecords()
{
var data = new List<WarehouseDataModel>
{
new("id1", "W1", "L1", []),
new("id2", "W2", "L2", [])
};
_logic.Setup(x => x.GetWarehousesByName(It.IsAny<string>())).Returns(data);
var r = _adapter.GetList().GetResponse(_request.Object, _response.Object) as ObjectResult;
Assert.That(_status, Is.EqualTo((int)HttpStatusCode.OK));
var list = r?.Value as List<WarehouseViewModel>;
Assert.That(list?.Count, Is.EqualTo(data.Count));
}
[Test]
public void GetList_ReturnsEmpty()
{
_logic.Setup(x => x.GetWarehousesByName(It.IsAny<string>())).Returns([]);
var r = _adapter.GetList().GetResponse(_request.Object, _response.Object) as ObjectResult;
Assert.That(_status, Is.EqualTo((int)HttpStatusCode.OK));
var list = r?.Value as List<WarehouseViewModel>;
Assert.That(list, Is.Empty);
}
[Test]
public void GetList_NullList()
{
_logic.Setup(x => x.GetWarehousesByName(It.IsAny<string>())).Throws<NullListException>();
var r = _adapter.GetList().GetResponse(_request.Object, _response.Object) as ObjectResult;
Assert.That(_status, Is.EqualTo((int)HttpStatusCode.NotFound));
}
[Test]
public void GetList_StorageException()
{
_logic.Setup(x => x.GetWarehousesByName(It.IsAny<string>()))
.Throws(new StorageException(new System.Exception("err")));
var r = _adapter.GetList().GetResponse(_request.Object, _response.Object) as ObjectResult;
Assert.That(_status, Is.EqualTo((int)HttpStatusCode.InternalServerError));
}
[Test]
public void GetList_GenericException()
{
_logic.Setup(x => x.GetWarehousesByName(It.IsAny<string>()))
.Throws(new System.Exception());
var r = _adapter.GetList().GetResponse(_request.Object, _response.Object) as ObjectResult;
Assert.That(_status, Is.EqualTo((int)HttpStatusCode.InternalServerError));
}
[Test]
public void GetElement_ReturnsRecord()
{
var id = Guid.NewGuid().ToString();
var data = new WarehouseDataModel(id, "Name", "Loc", []);
_logic.Setup(l => l.GetWarehouseByData(id)).Returns(data);
var res = _adapter.GetElement(id).GetResponse(_request.Object, _response.Object) as ObjectResult;
Assert.That(_status, Is.EqualTo((int)HttpStatusCode.OK));
var vm = res?.Value as WarehouseViewModel;
Assert.That(vm?.Id, Is.EqualTo(id));
}
[Test]
public void GetElement_ArgumentNullException()
{
_logic.Setup(l => l.GetWarehouseByData(It.IsAny<string>()))
.Throws<ArgumentNullException>();
_adapter.GetElement("").GetResponse(_request.Object, _response.Object);
Assert.That(_status, Is.EqualTo((int)HttpStatusCode.BadRequest));
}
[Test]
public void GetElement_ElementNotFoundException()
{
_logic.Setup(l => l.GetWarehouseByData(It.IsAny<string>()))
.Throws(new ElementNotFoundException("msg"));
_adapter.GetElement("id").GetResponse(_request.Object, _response.Object);
Assert.That(_status, Is.EqualTo((int)HttpStatusCode.NotFound));
}
[Test]
public void GetElement_StorageException()
{
_logic.Setup(l => l.GetWarehouseByData(It.IsAny<string>()))
.Throws(new StorageException(new Exception("inner")));
_adapter.GetElement("id").GetResponse(_request.Object, _response.Object);
Assert.That(_status, Is.EqualTo((int)HttpStatusCode.InternalServerError));
}
[Test]
public void GetElement_GenericException()
{
_logic.Setup(l => l.GetWarehouseByData(It.IsAny<string>()))
.Throws(new Exception());
_adapter.GetElement("id").GetResponse(_request.Object, _response.Object);
Assert.That(_status, Is.EqualTo((int)HttpStatusCode.InternalServerError));
}
[Test]
public void Register_ValidRecord()
{
var bm = new WarehouseBindingModel { Id = Guid.NewGuid().ToString(), Name = "N", Location = "L" };
var flag = false;
_logic.Setup(l => l.InsertWarehouse(It.IsAny<WarehouseDataModel>()))
.Callback<WarehouseDataModel>(dm => flag = dm.Id == bm.Id && dm.Name == bm.Name && dm.Location == bm.Location);
var res = _adapter.Register(bm).GetResponse(_request.Object, _response.Object) as StatusCodeResult;
Assert.Multiple(() =>
{
Assert.That(_status, Is.EqualTo((int)HttpStatusCode.NoContent));
Assert.That(flag, Is.True);
_logic.Verify(l => l.InsertWarehouse(It.IsAny<WarehouseDataModel>()), Times.Once);
});
}
[Test]
public void Register_ArgumentNullException()
{
_logic.Setup(l => l.InsertWarehouse(It.IsAny<WarehouseDataModel>()))
.Throws<ArgumentNullException>();
_adapter.Register(new WarehouseBindingModel())
.GetResponse(_request.Object, _response.Object);
Assert.That(_status, Is.EqualTo((int)HttpStatusCode.BadRequest));
}
[Test]
public void Register_ValidationException()
{
_logic.Setup(l => l.InsertWarehouse(It.IsAny<WarehouseDataModel>()))
.Throws(new ValidationException("bad"));
_adapter.Register(new WarehouseBindingModel())
.GetResponse(_request.Object, _response.Object);
Assert.That(_status, Is.EqualTo((int)HttpStatusCode.BadRequest));
}
[Test]
public void Register_ElementExistsException()
{
_logic.Setup(l => l.InsertWarehouse(It.IsAny<WarehouseDataModel>()))
.Throws(new ElementExistsException("exists", "Id"));
_adapter.Register(new WarehouseBindingModel())
.GetResponse(_request.Object, _response.Object);
Assert.That(_status, Is.EqualTo((int)HttpStatusCode.BadRequest));
}
[Test]
public void Register_StorageException()
{
_logic.Setup(l => l.InsertWarehouse(It.IsAny<WarehouseDataModel>()))
.Throws(new StorageException(new Exception("inner")));
_adapter.Register(new WarehouseBindingModel())
.GetResponse(_request.Object, _response.Object);
Assert.That(_status, Is.EqualTo((int)HttpStatusCode.InternalServerError));
}
[Test]
public void Register_GenericException()
{
_logic.Setup(l => l.InsertWarehouse(It.IsAny<WarehouseDataModel>()))
.Throws(new Exception("oops"));
_adapter.Register(new WarehouseBindingModel())
.GetResponse(_request.Object, _response.Object);
Assert.That(_status, Is.EqualTo((int)HttpStatusCode.InternalServerError));
}
[Test]
public void ChangeInfo_ValidRecord()
{
var bm = new WarehouseBindingModel { Id = Guid.NewGuid().ToString(), Name = "Upd", Location = "Loc" };
var flag = false;
_logic.Setup(l => l.UpdateWarehouse(It.IsAny<WarehouseDataModel>()))
.Callback<WarehouseDataModel>(dm => flag = dm.Id == bm.Id && dm.Name == bm.Name && dm.Location == bm.Location);
var res = _adapter.ChangeInfo(bm).GetResponse(_request.Object, _response.Object) as StatusCodeResult;
Assert.Multiple(() =>
{
Assert.That(_status, Is.EqualTo((int)HttpStatusCode.NoContent));
Assert.That(flag, Is.True);
_logic.Verify(l => l.UpdateWarehouse(It.IsAny<WarehouseDataModel>()), Times.Once);
});
}
[Test]
public void ChangeInfo_ArgumentNullException()
{
_logic.Setup(l => l.UpdateWarehouse(It.IsAny<WarehouseDataModel>()))
.Throws<ArgumentNullException>();
_adapter.ChangeInfo(new WarehouseBindingModel())
.GetResponse(_request.Object, _response.Object);
Assert.That(_status, Is.EqualTo((int)HttpStatusCode.BadRequest));
}
[Test]
public void ChangeInfo_ValidationException()
{
_logic.Setup(l => l.UpdateWarehouse(It.IsAny<WarehouseDataModel>()))
.Throws(new ValidationException("bad"));
_adapter.ChangeInfo(new WarehouseBindingModel())
.GetResponse(_request.Object, _response.Object);
Assert.That(_status, Is.EqualTo((int)HttpStatusCode.BadRequest));
}
[Test]
public void ChangeInfo_ElementNotFoundException()
{
var id = Guid.NewGuid().ToString();
_logic.Setup(l => l.UpdateWarehouse(It.IsAny<WarehouseDataModel>()))
.Throws(new ElementNotFoundException(id));
var bm = new WarehouseBindingModel { Id = id };
_adapter.ChangeInfo(bm).GetResponse(_request.Object, _response.Object);
Assert.That(_status, Is.EqualTo((int)HttpStatusCode.NotFound));
}
[Test]
public void ChangeInfo_ElementExistsException()
{
_logic.Setup(l => l.UpdateWarehouse(It.IsAny<WarehouseDataModel>()))
.Throws(new ElementExistsException("exists", "Id"));
_adapter.ChangeInfo(new WarehouseBindingModel())
.GetResponse(_request.Object, _response.Object);
Assert.That(_status, Is.EqualTo((int)HttpStatusCode.BadRequest));
}
[Test]
public void ChangeInfo_StorageException()
{
_logic.Setup(l => l.UpdateWarehouse(It.IsAny<WarehouseDataModel>()))
.Throws(new StorageException(new Exception("inner")));
_adapter.ChangeInfo(new WarehouseBindingModel())
.GetResponse(_request.Object, _response.Object);
Assert.That(_status, Is.EqualTo((int)HttpStatusCode.InternalServerError));
}
[Test]
public void ChangeInfo_GenericException()
{
_logic.Setup(l => l.UpdateWarehouse(It.IsAny<WarehouseDataModel>()))
.Throws(new Exception("oops"));
_adapter.ChangeInfo(new WarehouseBindingModel())
.GetResponse(_request.Object, _response.Object);
Assert.That(_status, Is.EqualTo((int)HttpStatusCode.InternalServerError));
}
[Test]
public void Remove_Valid()
{
var flag = false;
const string id = "goodid";
_logic.Setup(l => l.DeleteWarehouse(It.IsAny<string>()))
.Callback<string>(x => flag = x == id);
var res = _adapter.Remove(id).GetResponse(_request.Object, _response.Object) as StatusCodeResult;
Assert.Multiple(() =>
{
Assert.That(_status, Is.EqualTo((int)HttpStatusCode.NoContent));
Assert.That(flag, Is.True);
_logic.Verify(l => l.DeleteWarehouse(It.IsAny<string>()), Times.Once);
});
}
[Test]
public void Remove_ArgumentNullException()
{
_logic.Setup(l => l.DeleteWarehouse(It.IsAny<string>()))
.Throws<ArgumentNullException>();
_adapter.Remove("").GetResponse(_request.Object, _response.Object);
Assert.That(_status, Is.EqualTo((int)HttpStatusCode.BadRequest));
}
[Test]
public void Remove_ValidationException()
{
_logic.Setup(l => l.DeleteWarehouse(It.IsAny<string>()))
.Throws(new ValidationException("bad"));
_adapter.Remove("bad").GetResponse(_request.Object, _response.Object);
Assert.That(_status, Is.EqualTo((int)HttpStatusCode.BadRequest));
}
[Test]
public void Remove_ElementNotFoundException()
{
const string id = "missing";
_logic.Setup(l => l.DeleteWarehouse(It.IsAny<string>()))
.Throws(new ElementNotFoundException(id));
_adapter.Remove(id).GetResponse(_request.Object, _response.Object);
Assert.That(_status, Is.EqualTo((int)HttpStatusCode.NotFound));
}
[Test]
public void Remove_StorageException()
{
_logic.Setup(l => l.DeleteWarehouse(It.IsAny<string>()))
.Throws(new StorageException(new Exception("inner")));
_adapter.Remove("id").GetResponse(_request.Object, _response.Object);
Assert.That(_status, Is.EqualTo((int)HttpStatusCode.InternalServerError));
}
[Test]
public void Remove_GenericException()
{
_logic.Setup(l => l.DeleteWarehouse(It.IsAny<string>()))
.Throws(new Exception("oops"));
_adapter.Remove("id").GetResponse(_request.Object, _response.Object);
Assert.That(_status, Is.EqualTo((int)HttpStatusCode.InternalServerError));
}
}

View File

@@ -9,5 +9,5 @@ namespace TwoFromTheCasketTests.Infrastructure;
public class ConfigurationDatabaseTest : IConfigurationDatabase
{
public string ConnectionString => "Host=localhost;Port=5432;Database=TwoFromTheCasketDb2;Username=postgres;Password=123456";
public string ConnectionString => "Host=localhost;Port=5432;Database=TwoFromTheCasketDb2;Username=postgres;Password=1234";
}

View File

@@ -114,4 +114,6 @@ public class WarehouseAdapter : IWarehouseAdapter
_ => WarehouseOperationResponse.InternalServerError(ex.Message)
};
}
}