From 741fccb38a8ab3a5e20a5069e167b43cba7e571b Mon Sep 17 00:00:00 2001 From: xom9k Date: Mon, 14 Apr 2025 19:55:32 +0400 Subject: [PATCH] =?UTF-8?q?=D1=82=D0=B5=D1=81=D1=82=D1=8B=20=D0=B8=20?= =?UTF-8?q?=D0=BD=D0=B5=20=D1=82=D0=BE=D0=BB=D1=8C=D0=BA=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AgencyOperationResponse .cs | 1 + .../DataModels/AgencyDataModel.cs | 4 +- .../DataModels/SuppliesDataModel.cs | 4 +- .../Infrastructure/OperationResponse.cs | 4 +- .../AgencyViewModel.cs | 5 +- .../Implementations/AgencyStorageContract.cs | 2 +- .../MagicCarpetDatabase/Models/Agency.cs | 3 +- .../SaleBusinessLogicContractTests.cs | 13 +- .../TourBusinessLogicContractTests.cs | 4 +- .../DataModelTests/AgencyDataModelTests.cs | 2 +- .../MagicCarpetDbContextExtensions.cs | 8 +- .../AgencyStorageContractTests.cs | 6 +- .../SuppliesStorageContractTests.cs | 4 +- .../SuppliesAdapterTests.cs | 297 ++++++++++++++++++ .../AgencyControllerTests.cs | 31 +- .../SaleControllerTests.cs | 2 + .../SuppliesControllerTests.cs | 254 +++++++++++++++ .../Controllers/AgencyController.cs | 3 + .../Controllers/SuppliesController.cs | 3 + 19 files changed, 605 insertions(+), 45 deletions(-) rename MagicCarpetProject/MagicCarpetContracts/{DataModels => ViewModels}/AgencyViewModel.cs (68%) create mode 100644 MagicCarpetProject/MagicCarpetTests/WebApiAdapterTests/SuppliesAdapterTests.cs create mode 100644 MagicCarpetProject/MagicCarpetTests/WebApiControllersTests/SuppliesControllerTests.cs diff --git a/MagicCarpetProject/MagicCarpetContracts/AdapterContracts/OperationResponses/AgencyOperationResponse .cs b/MagicCarpetProject/MagicCarpetContracts/AdapterContracts/OperationResponses/AgencyOperationResponse .cs index 684c2b4..aae63e8 100644 --- a/MagicCarpetProject/MagicCarpetContracts/AdapterContracts/OperationResponses/AgencyOperationResponse .cs +++ b/MagicCarpetProject/MagicCarpetContracts/AdapterContracts/OperationResponses/AgencyOperationResponse .cs @@ -1,5 +1,6 @@ using MagicCarpetContracts.DataModels; using MagicCarpetContracts.Infrastructure; +using MagicCarpetContracts.ViewModels; using System; using System.Collections.Generic; using System.Linq; diff --git a/MagicCarpetProject/MagicCarpetContracts/DataModels/AgencyDataModel.cs b/MagicCarpetProject/MagicCarpetContracts/DataModels/AgencyDataModel.cs index ca84381..38cf21d 100644 --- a/MagicCarpetProject/MagicCarpetContracts/DataModels/AgencyDataModel.cs +++ b/MagicCarpetProject/MagicCarpetContracts/DataModels/AgencyDataModel.cs @@ -13,7 +13,7 @@ namespace MagicCarpetContracts.DataModels; public class AgencyDataModel(string id, TourType tourType, int count, List tours) : IValidation { public string Id { get; private set; } = id; - public TourType Type { get; private set; } = tourType; + public TourType TourType { get; private set; } = tourType; public int Count { get; private set; } = count; public List Tours { get; private set; } = tours; @@ -23,7 +23,7 @@ public class AgencyDataModel(string id, TourType tourType, int count, List tours) : IValidation +public class SuppliesDataModel(string id, TourType tourType, DateTime productuionDate, int count, List tours) : IValidation { public string Id { get; private set; } = id; public TourType TourType { get; private set; } = tourType; - public DateTime ProductuionDate { get; private set; } = date; + public DateTime ProductuionDate { get; private set; } = productuionDate; public int Count { get; private set; } = count; public List Tours { get; private set; } = tours; diff --git a/MagicCarpetProject/MagicCarpetContracts/Infrastructure/OperationResponse.cs b/MagicCarpetProject/MagicCarpetContracts/Infrastructure/OperationResponse.cs index e819bce..85934ea 100644 --- a/MagicCarpetProject/MagicCarpetContracts/Infrastructure/OperationResponse.cs +++ b/MagicCarpetProject/MagicCarpetContracts/Infrastructure/OperationResponse.cs @@ -11,9 +11,9 @@ namespace MagicCarpetContracts.Infrastructure; public class OperationResponse { - protected HttpStatusCode StatusCode { get; set; } + public HttpStatusCode StatusCode { get; set; } - protected object? Result { get; set; } + public object? Result { get; set; } public IActionResult GetResponse(HttpRequest request, HttpResponse response) { diff --git a/MagicCarpetProject/MagicCarpetContracts/DataModels/AgencyViewModel.cs b/MagicCarpetProject/MagicCarpetContracts/ViewModels/AgencyViewModel.cs similarity index 68% rename from MagicCarpetProject/MagicCarpetContracts/DataModels/AgencyViewModel.cs rename to MagicCarpetProject/MagicCarpetContracts/ViewModels/AgencyViewModel.cs index 50fe90d..d622e48 100644 --- a/MagicCarpetProject/MagicCarpetContracts/DataModels/AgencyViewModel.cs +++ b/MagicCarpetProject/MagicCarpetContracts/ViewModels/AgencyViewModel.cs @@ -1,17 +1,16 @@ using MagicCarpetContracts.Enums; -using MagicCarpetContracts.ViewModels; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; -namespace MagicCarpetContracts.DataModels; +namespace MagicCarpetContracts.ViewModels; public class AgencyViewModel { public required string Id { get; set; } public required TourType TourType { get; set; } public required int Count { get; set; } - public required List Components { get; set; } + public required List Tours { get; set; } } diff --git a/MagicCarpetProject/MagicCarpetDatabase/Implementations/AgencyStorageContract.cs b/MagicCarpetProject/MagicCarpetDatabase/Implementations/AgencyStorageContract.cs index 5c5818a..fca854e 100644 --- a/MagicCarpetProject/MagicCarpetDatabase/Implementations/AgencyStorageContract.cs +++ b/MagicCarpetProject/MagicCarpetDatabase/Implementations/AgencyStorageContract.cs @@ -114,7 +114,7 @@ public class AgencyStorageContract : IAgencyStorageContract foreach (SaleTourDataModel sale_tour in saleDataModel.Tours) { var tour = _dbContext.Tours.FirstOrDefault(x => x.Id == sale_tour.TourId); - var agency = _dbContext.Agencies.FirstOrDefault(x => x.Type == tour.TourType && x.Count >= sale_tour.Count); + var agency = _dbContext.Agencies.FirstOrDefault(x => x.TourType == tour.TourType && x.Count >= sale_tour.Count); if (agency == null) { diff --git a/MagicCarpetProject/MagicCarpetDatabase/Models/Agency.cs b/MagicCarpetProject/MagicCarpetDatabase/Models/Agency.cs index dd8573b..8027fd2 100644 --- a/MagicCarpetProject/MagicCarpetDatabase/Models/Agency.cs +++ b/MagicCarpetProject/MagicCarpetDatabase/Models/Agency.cs @@ -10,10 +10,11 @@ using System.Threading.Tasks; namespace MagicCarpetDatabase.Models; +[AutoMap(typeof(AgencyDataModel), ReverseMap = true)] public class Agency { public required string Id { get; set; } - public required TourType Type { get; set; } + public required TourType TourType { get; set; } public required int Count { get; set; } [ForeignKey("AgencyId")] diff --git a/MagicCarpetProject/MagicCarpetTests/BusinessLogicContractsTests/SaleBusinessLogicContractTests.cs b/MagicCarpetProject/MagicCarpetTests/BusinessLogicContractsTests/SaleBusinessLogicContractTests.cs index 9b4151a..0c0cce9 100644 --- a/MagicCarpetProject/MagicCarpetTests/BusinessLogicContractsTests/SaleBusinessLogicContractTests.cs +++ b/MagicCarpetProject/MagicCarpetTests/BusinessLogicContractsTests/SaleBusinessLogicContractTests.cs @@ -398,8 +398,8 @@ internal class SaleBusinessLogicContractTests { //Arrange var flag = false; - var record = new SaleDataModel(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), 10, DiscountType.None, 10, - false, [new SaleTourDataModel(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), 5)]); + var record = new SaleDataModel(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), DiscountType.None, + false, [new SaleTourDataModel(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), 5, 1.2)]); _agencyStorageContract.Setup(x => x.CheckComponents(It.IsAny())).Returns(true); _saleStorageContract.Setup(x => x.AddElement(It.IsAny())) .Callback((SaleDataModel x) => @@ -427,7 +427,7 @@ internal class SaleBusinessLogicContractTests _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(), - Guid.NewGuid().ToString(), 10, DiscountType.None, 10, false, [new SaleTourDataModel(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), 5)])), Throws.TypeOf()); + Guid.NewGuid().ToString(), DiscountType.None, false, [new SaleTourDataModel(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), 5, 1.2)])), Throws.TypeOf()); _saleStorageContract.Verify(x => x.AddElement(It.IsAny()), Times.Once); _agencyStorageContract.Verify(x => x.CheckComponents(It.IsAny()), Times.Once); } @@ -456,7 +456,7 @@ internal class SaleBusinessLogicContractTests _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(), - Guid.NewGuid().ToString(), 10, DiscountType.None, 10, false, [new SaleTourDataModel(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), 5)])), Throws.TypeOf()); + Guid.NewGuid().ToString(), DiscountType.None, false, [new SaleTourDataModel(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), 5, 1.2)])), Throws.TypeOf()); _agencyStorageContract.Verify(x => x.CheckComponents(It.IsAny()), Times.Once); _saleStorageContract.Verify(x => x.AddElement(It.IsAny()), Times.Once); } @@ -466,9 +466,8 @@ internal class SaleBusinessLogicContractTests { //Arrange _agencyStorageContract.Setup(x => x.CheckComponents(It.IsAny())).Returns(false); - Assert.That(() => _saleBusinessLogicContract.InsertSale(new SaleDataModel(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), - Guid.NewGuid().ToString(), 10, DiscountType.None, 10, false, - [new SaleTourDataModel(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), 5)])), Throws.TypeOf()); + Assert.That(() => _saleBusinessLogicContract.InsertSale(new(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), + Guid.NewGuid().ToString(), DiscountType.None, false, [new SaleTourDataModel(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), 5, 1.2)])), Throws.TypeOf()); //Act&Assert _agencyStorageContract.Verify(x => x.CheckComponents(It.IsAny()), Times.Once); } diff --git a/MagicCarpetProject/MagicCarpetTests/BusinessLogicContractsTests/TourBusinessLogicContractTests.cs b/MagicCarpetProject/MagicCarpetTests/BusinessLogicContractsTests/TourBusinessLogicContractTests.cs index 8d4165c..02b90ab 100644 --- a/MagicCarpetProject/MagicCarpetTests/BusinessLogicContractsTests/TourBusinessLogicContractTests.cs +++ b/MagicCarpetProject/MagicCarpetTests/BusinessLogicContractsTests/TourBusinessLogicContractTests.cs @@ -249,7 +249,7 @@ internal class TourBusinessLogicContractTests _tourStorageContract.Setup(x => x.AddElement(It.IsAny())) .Callback((TourDataModel x) => { - flag = x.Id == record.Id && x.TourName == record.TourName && x.TourCountry == record.TourCountry + flag = x.Id == record.Id && x.TourName == record.TourName && x.TourCountry == record.TourCountry && x.Price == record.Price && x.TourType == record.TourType; }); //Act @@ -295,7 +295,7 @@ internal class TourBusinessLogicContractTests } [Test] - public void InsertFurniture_InsufficientError_ThrowException_Test() + public void InsertTour_InsufficientError_ThrowException_Test() { //Arrange Assert.That(() => _tourBusinessLogicContract.InsertTour(new TourDataModel(Guid.NewGuid().ToString(), "name", "country", 10, TourType.Ski)),Throws.TypeOf()); diff --git a/MagicCarpetProject/MagicCarpetTests/DataModelTests/AgencyDataModelTests.cs b/MagicCarpetProject/MagicCarpetTests/DataModelTests/AgencyDataModelTests.cs index ac7dd8b..80ac245 100644 --- a/MagicCarpetProject/MagicCarpetTests/DataModelTests/AgencyDataModelTests.cs +++ b/MagicCarpetProject/MagicCarpetTests/DataModelTests/AgencyDataModelTests.cs @@ -66,7 +66,7 @@ internal class AgencyDataModelTests Assert.Multiple(() => { Assert.That(model.Id, Is.EqualTo(id)); - Assert.That(model.Type, Is.EqualTo(type)); + Assert.That(model.TourType, Is.EqualTo(type)); Assert.That(model.Count, Is.EqualTo(count)); Assert.That(model.Tours, Is.EqualTo(tours)); }); diff --git a/MagicCarpetProject/MagicCarpetTests/Infrastructure/MagicCarpetDbContextExtensions.cs b/MagicCarpetProject/MagicCarpetTests/Infrastructure/MagicCarpetDbContextExtensions.cs index 48fc1cc..1be6dc4 100644 --- a/MagicCarpetProject/MagicCarpetTests/Infrastructure/MagicCarpetDbContextExtensions.cs +++ b/MagicCarpetProject/MagicCarpetTests/Infrastructure/MagicCarpetDbContextExtensions.cs @@ -77,17 +77,17 @@ internal static class MagicCarpetDbContextExtensions public static Agency InsertAgencyToDatabaseAndReturn(this MagicCarpetDbContext dbContext, string? id = null, TourType tourType = TourType.Beach, int count = 20, List<(string, int)>? tours = null) { - var warehouse = new Agency() { Id = id ?? Guid.NewGuid().ToString(), Type = tourType, Count = count, Tours = [] }; + var agency = new Agency() { Id = id ?? Guid.NewGuid().ToString(), TourType = tourType, Count = count, Tours = [] }; if (tours is not null) { foreach (var elem in tours) { - warehouse.Tours.Add(new TourAgency { AgencyId = warehouse.Id, TourId = elem.Item1, Count = elem.Item2 }); + agency.Tours.Add(new TourAgency { AgencyId = agency.Id, TourId = elem.Item1, Count = elem.Item2 }); } } - dbContext.Agencies.Add(warehouse); + dbContext.Agencies.Add(agency); dbContext.SaveChanges(); - return warehouse; + return agency; } public static Supplies InsertSuppliesToDatabaseAndReturn(this MagicCarpetDbContext dbContext, string? id = null, TourType type = TourType.Beach, int count = 20, DateTime? date = null, List<(string, int)>? tours = null) diff --git a/MagicCarpetProject/MagicCarpetTests/StoragesContractsTests/AgencyStorageContractTests.cs b/MagicCarpetProject/MagicCarpetTests/StoragesContractsTests/AgencyStorageContractTests.cs index 5111477..b183447 100644 --- a/MagicCarpetProject/MagicCarpetTests/StoragesContractsTests/AgencyStorageContractTests.cs +++ b/MagicCarpetProject/MagicCarpetTests/StoragesContractsTests/AgencyStorageContractTests.cs @@ -133,7 +133,7 @@ internal class AgencyStorageContractTests : BaseStorageContractTest private Agency InsertAgencyToDatabaseAndReturn(string id, TourType type, int count, List<(string, int)>? tours = null) { - var agency = new Agency { Id = id, Type = type, Count = count, Tours = [] }; + var agency = new Agency { Id = id, TourType = type, Count = count, Tours = [] }; if (tours is not null) { foreach (var elem in tours) @@ -152,7 +152,7 @@ internal class AgencyStorageContractTests : BaseStorageContractTest Assert.Multiple(() => { Assert.That(actual.Id, Is.EqualTo(expected.Id)); - Assert.That(actual.Type, Is.EqualTo(expected.Type)); + Assert.That(actual.TourType, Is.EqualTo(expected.TourType)); Assert.That(actual.Count, Is.EqualTo(expected.Count)); }); if (expected.Tours is not null) @@ -180,7 +180,7 @@ internal class AgencyStorageContractTests : BaseStorageContractTest Assert.Multiple(() => { Assert.That(actual.Id, Is.EqualTo(expected.Id)); - Assert.That(actual.Type, Is.EqualTo(expected.Type)); + Assert.That(actual.TourType, Is.EqualTo(expected.TourType)); Assert.That(actual.Count, Is.EqualTo(expected.Count)); }); if (expected.Tours is not null) diff --git a/MagicCarpetProject/MagicCarpetTests/StoragesContractsTests/SuppliesStorageContractTests.cs b/MagicCarpetProject/MagicCarpetTests/StoragesContractsTests/SuppliesStorageContractTests.cs index 7ffec7a..71b0064 100644 --- a/MagicCarpetProject/MagicCarpetTests/StoragesContractsTests/SuppliesStorageContractTests.cs +++ b/MagicCarpetProject/MagicCarpetTests/StoragesContractsTests/SuppliesStorageContractTests.cs @@ -125,7 +125,7 @@ internal class SuppliesStorageContractTests : BaseStorageContractTest Assert.Multiple(() => { Assert.That(actual.Id, Is.EqualTo(expected.Id)); - Assert.That(actual.Type, Is.EqualTo(expected.Type)); + Assert.That(actual.TourType, Is.EqualTo(expected.Type)); Assert.That(actual.ProductuionDate, Is.EqualTo(expected.ProductuionDate)); Assert.That(actual.Count, Is.EqualTo(expected.Count)); }); @@ -154,7 +154,7 @@ internal class SuppliesStorageContractTests : BaseStorageContractTest Assert.Multiple(() => { Assert.That(actual.Id, Is.EqualTo(expected.Id)); - Assert.That(actual.Type, Is.EqualTo(expected.Type)); + Assert.That(actual.Type, Is.EqualTo(expected.TourType)); Assert.That(actual.ProductuionDate, Is.EqualTo(expected.ProductuionDate)); Assert.That(actual.Count, Is.EqualTo(expected.Count)); }); diff --git a/MagicCarpetProject/MagicCarpetTests/WebApiAdapterTests/SuppliesAdapterTests.cs b/MagicCarpetProject/MagicCarpetTests/WebApiAdapterTests/SuppliesAdapterTests.cs new file mode 100644 index 0000000..bc100ce --- /dev/null +++ b/MagicCarpetProject/MagicCarpetTests/WebApiAdapterTests/SuppliesAdapterTests.cs @@ -0,0 +1,297 @@ +using AutoMapper; +using MagicCarpetContracts.BindingModels; +using MagicCarpetContracts.BusinessLogicContracts; +using MagicCarpetContracts.DataModels; +using MagicCarpetContracts.Enums; +using MagicCarpetContracts.Exceptions; +using MagicCarpetContracts.ViewModels; +using MagicCarpetWebApi.Adapters; +using Microsoft.Extensions.Logging; +using Moq; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Text; +using System.Threading.Tasks; + +namespace MagicCarpetTests.WebApiAdapterTests; + +[TestFixture] +internal class SuppliesAdapterTests +{ + private Mock _suppliesBusinessLogicContract; + private SuppliesAdapter _adapter; + private Mock> _logger; + private IMapper? _mapper; + + [OneTimeSetUp] + public void OneTimeSetUp() + { + _suppliesBusinessLogicContract = new Mock(); + _logger = new Mock>(); + _adapter = new SuppliesAdapter(_suppliesBusinessLogicContract.Object, _logger.Object); + } + + [Test] + public void GetAllComponents_WhenSuppliesExist_ReturnOk() + { + // Arrange + var supplies = new List + { + new SuppliesDataModel(Guid.NewGuid().ToString(), TourType.Ski, DateTime.Now, 5, []), + new SuppliesDataModel(Guid.NewGuid().ToString(), TourType.Ski, DateTime.Now.AddDays(1), 10, []) + }; + _suppliesBusinessLogicContract.Setup(x => x.GetAllComponents()).Returns(supplies); + // Act + var result = _adapter.GetAllComponents(); + var list = (List)result.Result!; + // Assert + Assert.That(result.StatusCode, Is.EqualTo(HttpStatusCode.OK)); + Assert.That(list.Count, Is.EqualTo(2)); + } + + [Test] + public void GetAllComponents_WhenListNull_ReturnNotFound() + { + // Arrange + _suppliesBusinessLogicContract.Setup(x => x.GetAllComponents()).Throws(new NullListException()); + // Act + var result = _adapter.GetAllComponents(); + // Assert + Assert.That(result.StatusCode, Is.EqualTo(HttpStatusCode.NotFound)); + } + + [Test] + public void GetAllComponents_WhenStorageException_ReturnsInternalServerError() + { + // Arrange + _suppliesBusinessLogicContract.Setup(x => x.GetAllComponents()).Throws(new StorageException(new InvalidOperationException())); + // Act + var result = _adapter.GetAllComponents(); + // Assert + Assert.That(result.StatusCode, Is.EqualTo(HttpStatusCode.InternalServerError)); + } + + [Test] + public void GetComponentByData_WhenSupplies_ReturnOK() + { + var supply = new SuppliesDataModel(Guid.NewGuid().ToString(), TourType.Ski, DateTime.Now, 5, []); + // Arrange + _suppliesBusinessLogicContract.Setup(x => x.GetComponentByData(supply.Id)).Returns(supply); + // Act + var result = _adapter.GetComponentByData(supply.Id); + Assert.That(result.StatusCode, Is.EqualTo(HttpStatusCode.OK)); + var resultData = (SuppliesViewModel)result.Result!; + Assert.That(resultData.Id!, Is.EqualTo(supply.Id)); + } + + [Test] + public void GetComponentByData_WhenComponentNotFound_ReturnsNotFound() + { + // Arrange + var data = "test"; + _suppliesBusinessLogicContract.Setup(x => x.GetComponentByData(data)).Throws(new ElementNotFoundException("")); + // Act + var result = _adapter.GetComponentByData(data); + // Assert + Assert.That(result.StatusCode, Is.EqualTo(HttpStatusCode.NotFound)); + } + + [Test] + public void GetComponentByData_WhenStorageException_ReturnInternalServerError() + { + // Arrange + var data = "test"; + _suppliesBusinessLogicContract.Setup(x => x.GetComponentByData(data)).Throws(new StorageException(new InvalidOperationException())); + // Act + var result = _adapter.GetComponentByData(data); + // Assert + Assert.That(result.StatusCode, Is.EqualTo(HttpStatusCode.InternalServerError)); + } + + [Test] + public void InsertComponent_WhenValidData_ReturnsNoContent() + { + // Arrange + var supply = new SuppliesBindingModel + { + Id = Guid.NewGuid().ToString(), + TourType = TourType.Ski, + ProductuionDate = DateTime.Now, + Count = 5, + Tours = [new TourSuppliesBindingModel { TourId = Guid.NewGuid().ToString(), SuppliesId = Guid.NewGuid().ToString(), Count = 5 }] + }; + _suppliesBusinessLogicContract.Setup(x => x.InsertComponent(It.IsAny())); + // Act + var result = _adapter.InsertComponent(supply); + // Assert + Assert.That(result.StatusCode, Is.EqualTo(HttpStatusCode.NoContent)); + } + + [Test] + public void InsertComponent_WhenDataIsNull_ReturnsBadRequest() + { + // Arrange + _suppliesBusinessLogicContract.Setup(x => x.InsertComponent(null)).Throws(new ArgumentNullException()); + // Act + var result = _adapter.InsertComponent(null); + // Assert + Assert.That(result.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest)); + } + + [Test] + public void InsertComponent_WhenValidationError_ReturnBadRequest() + { + // Arrange + var supply = new SuppliesBindingModel + { + Id = Guid.NewGuid().ToString(), + TourType = TourType.None, + ProductuionDate = DateTime.Now, + Count = 5, + Tours = [] + }; + // Act + var result = _adapter.InsertComponent(supply); + // Assert + Assert.That(result.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest)); + } + + [Test] + public void InsertComponent_WhenElementExistException_ReturnBadRequest() + { + // Arrange + var supply1 = new SuppliesBindingModel + { + Id = Guid.NewGuid().ToString(), + TourType = TourType.None, + ProductuionDate = DateTime.Now, + Count = 5, + Tours = [] + }; + _suppliesBusinessLogicContract.Setup(x => x.InsertComponent(It.IsAny())).Throws(new ElementExistsException("Data", "Data")); + // Act + var result = _adapter.InsertComponent(supply1); + // Assert + Assert.That(result.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest)); + } + + [Test] + public void InsertComponent_WhenStorageException_ReturnBadRequest() + { + // Arrange + var supply = new SuppliesBindingModel + { + Id = Guid.NewGuid().ToString(), + TourType = TourType.Ski, + ProductuionDate = DateTime.Now, + Count = 5, + Tours = new List() + }; + _suppliesBusinessLogicContract.Setup(x => x.InsertComponent(It.IsAny())).Throws(new StorageException(new InvalidOperationException())); + // Act + var result = _adapter.InsertComponent(supply); + // Assert + Assert.That(result.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest)); + } + + [Test] + public void UpdateComponent_WhenValidData_ReturnsNoContent() + { + // Arrange + var supply = new SuppliesBindingModel { Id = Guid.NewGuid().ToString() }; + _suppliesBusinessLogicContract.Setup(x => x.UpdateComponent(It.IsAny())); + // Act + var result = _adapter.UpdateComponent(supply); + // Assert + Assert.That(result.StatusCode, Is.EqualTo(HttpStatusCode.NoContent)); + } + + [Test] + public void UpdateComponent_WhenDataIsNull_ReturnsBadRequest() + { + // Arrange + var component = new SuppliesBindingModel { Id = Guid.NewGuid().ToString() }; + _suppliesBusinessLogicContract.Setup(x => x.UpdateComponent(It.IsAny())).Throws(new ElementNotFoundException("")); + // Act + var result = _adapter.UpdateComponent(component); + // Assert + Assert.That(result.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest)); + } + + [Test] + public void UpdateComponent_WhenValidationError_ReturnBadRequest() + { + // Arrange + var supply = new SuppliesBindingModel + { + Id = Guid.NewGuid().ToString(), + TourType = TourType.Ski, + ProductuionDate = DateTime.Now, + Count = 5, + Tours = [] + }; + _suppliesBusinessLogicContract.Setup(x => x.UpdateComponent(It.IsAny())).Throws(new ValidationException("")); + // Act + var result = _adapter.UpdateComponent(supply); + // Assert + Assert.That(result.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest)); + } + + [Test] + public void UpdateComponent_WhenElementNotFoundException_ReturnBadRequest() + { + // Arrange + var supply = new SuppliesBindingModel + { + Id = Guid.NewGuid().ToString(), + TourType = TourType.None, + ProductuionDate = DateTime.Now, + Count = 5, + Tours = [] + }; + _suppliesBusinessLogicContract.Setup(x => x.UpdateComponent(It.IsAny())).Throws(new ElementNotFoundException("")); + // Act + var result = _adapter.UpdateComponent(supply); + // Assert + Assert.That(result.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest)); + } + + [Test] + public void UpdateComponent_WhenElementExistException_ReturnBadRequest() + { + // Arrange + var supply1 = new SuppliesBindingModel + { + Id = Guid.NewGuid().ToString(), + TourType = TourType.None, + ProductuionDate = DateTime.Now, + Count = 5, + Tours = [] + }; + _suppliesBusinessLogicContract.Setup(x => x.UpdateComponent(It.IsAny())).Throws(new ElementExistsException("Data", "Data")); + // Act + var result = _adapter.UpdateComponent(supply1); + Assert.That(result.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest)); + } + + [Test] + public void UpdateComponent_WhenStorageException_ReturnBadRequest() + { + // Arrange + var supply = new SuppliesBindingModel + { + Id = Guid.NewGuid().ToString(), + TourType = TourType.Ski, + ProductuionDate = DateTime.Now, + Count = 5, + Tours = new List() + }; + _suppliesBusinessLogicContract.Setup(x => x.UpdateComponent(It.IsAny())).Throws(new StorageException(new InvalidOperationException())); + // Act + var result = _adapter.UpdateComponent(supply); + // Assert + Assert.That(result.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest)); + } +} diff --git a/MagicCarpetProject/MagicCarpetTests/WebApiControllersTests/AgencyControllerTests.cs b/MagicCarpetProject/MagicCarpetTests/WebApiControllersTests/AgencyControllerTests.cs index 9be9755..9c11d80 100644 --- a/MagicCarpetProject/MagicCarpetTests/WebApiControllersTests/AgencyControllerTests.cs +++ b/MagicCarpetProject/MagicCarpetTests/WebApiControllersTests/AgencyControllerTests.cs @@ -1,6 +1,7 @@ using MagicCarpetContracts.BindingModels; using MagicCarpetContracts.DataModels; using MagicCarpetContracts.Enums; +using MagicCarpetContracts.ViewModels; using MagicCarpetDatabase.Models; using MagicCarpetTests.Infrastructure; using System; @@ -15,12 +16,12 @@ namespace MagicCarpetTests.WebApiControllersTests; [TestFixture] internal class AgencyControllerTests : BaseWebApiControllerTest { - private string _componentId; + private string _tourId; [SetUp] public void SetUp() { - _componentId = MagicCarpetDbContext.InsertTourToDatabaseAndReturn().Id; + _tourId = MagicCarpetDbContext.InsertTourToDatabaseAndReturn().Id; } [TearDown] @@ -31,7 +32,7 @@ internal class AgencyControllerTests : BaseWebApiControllerTest } [Test] - public async Task GetAllAgencys_WhenHaveRecords_ShouldSuccess_Test() + public async Task GetAllAgencies_WhenHaveRecords_ShouldSuccess_Test() { // Arrange var agency = MagicCarpetDbContext.InsertAgencyToDatabaseAndReturn(); @@ -92,8 +93,8 @@ internal class AgencyControllerTests : BaseWebApiControllerTest public async Task Post_ShouldSuccess_Test() { //Arrange - MagicCarpetDbContext.InsertAgencyToDatabaseAndReturn(tours: [(_componentId, 5)]); - var agency = CreateModel(components: [(_componentId, 5)]); + MagicCarpetDbContext.InsertAgencyToDatabaseAndReturn(tours: [(_tourId, 5)]); + var agency = CreateModel(tours: [(_tourId, 5)]); //Act var response = await HttpClient.PostAsync($"/api/agency", MakeContent(agency)); //Assert @@ -141,7 +142,7 @@ internal class AgencyControllerTests : BaseWebApiControllerTest { //Arrange MagicCarpetDbContext.InsertAgencyToDatabaseAndReturn(); - var agency = CreateModel(components: [(_componentId, 5)]); + var agency = CreateModel(tours: [(_tourId, 5)]); MagicCarpetDbContext.InsertAgencyToDatabaseAndReturn(agency.Id); //Act var response = await HttpClient.PutAsync($"/api/agency", MakeContent(agency)); @@ -218,12 +219,12 @@ internal class AgencyControllerTests : BaseWebApiControllerTest Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest)); } - private static AgencyBindingModel CreateModel(string? id = null, TourType tourType = TourType.Beach, int count = 21, List<(string, int)>? components = null) + private static AgencyBindingModel CreateModel(string? id = null, TourType tourType = TourType.Ski, int count = 21, List<(string, int)>? tours = null) { var agency = new AgencyBindingModel() { Id = id ?? Guid.NewGuid().ToString(), TourType = tourType, Count = count, Tours = [] }; - if (components is not null) + if (tours is not null) { - foreach (var elem in components) + foreach (var elem in tours) { agency.Tours.Add(new TourAgencyBindingModel { AgencyId = agency.Id, TourId = elem.Item1, Count = elem.Item2 }); } @@ -241,20 +242,20 @@ internal class AgencyControllerTests : BaseWebApiControllerTest }); if (expected.Tours is not null) { - Assert.That(actual.Components, Is.Not.Null); - Assert.That(actual.Components, Has.Count.EqualTo(expected.Tours.Count)); - for (int i = 0; i < actual.Components.Count; ++i) + Assert.That(actual.Tours, Is.Not.Null); + Assert.That(actual.Tours, Has.Count.EqualTo(expected.Tours.Count)); + for (int i = 0; i < actual.Tours.Count; ++i) { Assert.Multiple(() => { - Assert.That(actual.Components[i].TourId, Is.EqualTo(expected.Tours[i].TourId)); - Assert.That(actual.Components[i].Count, Is.EqualTo(expected.Tours[i].Count)); + Assert.That(actual.Tours[i].TourId, Is.EqualTo(expected.Tours[i].TourId)); + Assert.That(actual.Tours[i].Count, Is.EqualTo(expected.Tours[i].Count)); }); } } else { - Assert.That(actual.Components, Is.Null); + Assert.That(actual.Tours, Is.Null); } } diff --git a/MagicCarpetProject/MagicCarpetTests/WebApiControllersTests/SaleControllerTests.cs b/MagicCarpetProject/MagicCarpetTests/WebApiControllersTests/SaleControllerTests.cs index 62cdc2a..8c7e745 100644 --- a/MagicCarpetProject/MagicCarpetTests/WebApiControllersTests/SaleControllerTests.cs +++ b/MagicCarpetProject/MagicCarpetTests/WebApiControllersTests/SaleControllerTests.cs @@ -34,6 +34,7 @@ internal class SaleControllerTests : BaseWebApiControllerTest MagicCarpetDbContext.RemoveEmployeesFromDatabase(); MagicCarpetDbContext.RemoveClientsFromDatabase(); MagicCarpetDbContext.RemoveToursFromDatabase(); + MagicCarpetDbContext.RemoveAgenciesFromDatabase(); } [Test] @@ -310,6 +311,7 @@ internal class SaleControllerTests : BaseWebApiControllerTest public async Task Post_ShouldSuccess_Test() { //Arrange + MagicCarpetDbContext.InsertAgencyToDatabaseAndReturn(); MagicCarpetDbContext.InsertSaleToDatabaseAndReturn(_employeeId, null, tours: [(_tourId, 5, 1.1)]); var saleModel = CreateModel(_employeeId, _clientId, _tourId); //Act diff --git a/MagicCarpetProject/MagicCarpetTests/WebApiControllersTests/SuppliesControllerTests.cs b/MagicCarpetProject/MagicCarpetTests/WebApiControllersTests/SuppliesControllerTests.cs new file mode 100644 index 0000000..1260439 --- /dev/null +++ b/MagicCarpetProject/MagicCarpetTests/WebApiControllersTests/SuppliesControllerTests.cs @@ -0,0 +1,254 @@ +using MagicCarpetContracts.BindingModels; +using MagicCarpetContracts.DataModels; +using MagicCarpetContracts.Enums; +using MagicCarpetContracts.ViewModels; +using MagicCarpetDatabase.Models; +using MagicCarpetTests.Infrastructure; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Text; +using System.Threading.Tasks; + +namespace MagicCarpetTests.WebApiControllersTests; + +[TestFixture] +internal class SuppliesControllerTests : BaseWebApiControllerTest +{ + private string _componentId; + + [SetUp] + public void SetUp() + { + _componentId = MagicCarpetDbContext.InsertTourToDatabaseAndReturn().Id; + } + + [TearDown] + public void TearDown() + { + MagicCarpetDbContext.RemoveToursFromDatabase(); + MagicCarpetDbContext.RemoveSuppliesFromDatabase(); + } + + [Test] + public async Task GetAllWarehouses_WhenHaveRecords_ShouldSuccess_Test() + { + // Arrange + var supply = MagicCarpetDbContext.InsertSuppliesToDatabaseAndReturn(); + MagicCarpetDbContext.InsertSuppliesToDatabaseAndReturn(); + MagicCarpetDbContext.InsertSuppliesToDatabaseAndReturn(); + // Act + var response = await HttpClient.GetAsync("/api/supplies"); + // Assert + Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK)); + var data = await GetModelFromResponseAsync>(response); + Assert.Multiple(() => + { + Assert.That(data, Is.Not.Null); + Assert.That(data, Has.Count.EqualTo(3)); + }); + AssertElement(data.First(x => x.Id == supply.Id), supply); + } + + [Test] + public async Task GetList_WhenNoRecords_ShouldSuccess_Test() + { + //Act + var response = await HttpClient.GetAsync("/api/supplies"); + //Assert + Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK)); + var data = await GetModelFromResponseAsync>(response); + Assert.Multiple(() => + { + Assert.That(data, Is.Not.Null); + Assert.That(data, Has.Count.EqualTo(0)); + }); + } + + [Test] + public async Task GetElement_ById_WhenHaveRecord_ShouldSuccess_Test() + { + //Arrange + var supplies = MagicCarpetDbContext.InsertSuppliesToDatabaseAndReturn(); + //Act + var response = await HttpClient.GetAsync($"/api/supplies/{supplies.Id}"); + //Assert + Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK)); + AssertElement(await GetModelFromResponseAsync(response), supplies); + } + + [Test] + public async Task GetElement_ById_WhenNoRecord_ShouldNotFound_Test() + { + //Arrange + MagicCarpetDbContext.InsertSuppliesToDatabaseAndReturn(); + //Act + var response = await HttpClient.GetAsync($"/api/supplies/{Guid.NewGuid()}"); + //Assert + Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.NotFound)); + } + + [Test] + public async Task Post_ShouldSuccess_Test() + { + //Arrange + MagicCarpetDbContext.InsertSuppliesToDatabaseAndReturn(tours: [(_componentId, 5)]); + var supplies = CreateModel(components: [(_componentId, 5)]); + //Act + var response = await HttpClient.PostAsync($"/api/supplies", MakeContent(supplies)); + //Assert + Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.NoContent)); + AssertElement(MagicCarpetDbContext.GetSuppliesFromDatabaseById(supplies.Id!), supplies); + } + + [Test] + public async Task Post_WhenSendEmptyData_ShouldBadRequest_Test() + { + //Act + var response = await HttpClient.PostAsync($"/api/supplies", MakeContent(string.Empty)); + //Assert + Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest)); + } + + [Test] + public async Task Post_WhenSendWrongFormatData_ShouldBadRequest_Test() + { + //Act + var response = await HttpClient.PostAsync($"/api/supplies", MakeContent(new { Data = "test", Position = 10 })); + //Assert + Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest)); + } + + [Test] + public async Task Post_WhenDataIsIncorrect_ShouldBadRequest_Test() + { + //Arrange + var suppliesIdIncorrect = new SuppliesViewModel { Id = "Id", TourType = TourType.None, Tours = [] }; + var suppliesWithTypeIncorrect = new SuppliesViewModel { Id = Guid.NewGuid().ToString(), TourType = TourType.None, Tours = [] }; + //Act + var responseWithIdIncorrect = await HttpClient.PostAsync($"/api/supplies", MakeContent(suppliesIdIncorrect)); + var responseWithTypeIncorrect = await HttpClient.PostAsync($"/api/supplies", MakeContent(suppliesWithTypeIncorrect)); + //Assert + Assert.Multiple(() => + { + Assert.That(responseWithIdIncorrect.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest), "Id is incorrect"); + Assert.That(responseWithTypeIncorrect.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest), "Type is incorrect"); + }); + } + + [Test] + public async Task Put_ShouldSuccess_Test() + { + //Arrange + MagicCarpetDbContext.InsertSuppliesToDatabaseAndReturn(); + var supplies = CreateModel(components: [(_componentId, 5)]); + MagicCarpetDbContext.InsertSuppliesToDatabaseAndReturn(supplies.Id); + //Act + var response = await HttpClient.PutAsync($"/api/supplies", MakeContent(supplies)); + //Assert + Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.NoContent)); + MagicCarpetDbContext.ChangeTracker.Clear(); + AssertElement(MagicCarpetDbContext.GetSuppliesFromDatabaseById(supplies.Id!), supplies); + } + + [Test] + public async Task Put_WhenNoFoundRecord_ShouldBadRequest_Test() + { + //Arrange + var furniture = CreateModel(); + MagicCarpetDbContext.InsertSuppliesToDatabaseAndReturn(); + //Act + var response = await HttpClient.PutAsync($"/api/supplies", MakeContent(furniture)); + //Assert + Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest)); + } + + [Test] + public async Task Put_WhenSendEmptyData_ShouldBadRequest_Test() + { + //Act + var response = await HttpClient.PutAsync($"/api/supplies", MakeContent(string.Empty)); + //Assert + Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest)); + } + + [Test] + public async Task Put_WhenSendWrongFormatData_ShouldBadRequest_Test() + { + //Act + var response = await HttpClient.PutAsync($"/api/supplies", MakeContent(new { Data = "test", Position = 10 })); + //Assert + Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest)); + } + + + private static SuppliesBindingModel CreateModel(string? id = null, TourType type = TourType.Ski, int count = 21, DateTime? date = null, List<(string, int)>? components = null) + { + var Supply = new SuppliesBindingModel() { Id = id ?? Guid.NewGuid().ToString(), TourType = type, Count = count, ProductuionDate = date ?? DateTime.UtcNow,Tours = [] }; + if (components is not null) + { + foreach (var elem in components) + { + Supply.Tours.Add(new TourSuppliesBindingModel { SuppliesId = Supply.Id, TourId = elem.Item1, Count = elem.Item2 }); + } + } + return Supply; + } + + private static void AssertElement(SuppliesViewModel? actual, Supplies expected) + { + Assert.That(actual, Is.Not.Null); + Assert.Multiple(() => + { + Assert.That(actual.Id, Is.EqualTo(expected.Id)); + Assert.That(actual.Count, Is.EqualTo(expected.Count)); + Assert.That(actual.ProductuionDate.Date, Is.EqualTo(expected.ProductuionDate.Date)); + }); + if (expected.Tours is not null) + { + Assert.That(actual.Tours, Is.Not.Null); + Assert.That(actual.Tours, Has.Count.EqualTo(expected.Tours.Count)); + for (int i = 0; i < actual.Tours.Count; ++i) + { + Assert.Multiple(() => + { + Assert.That(actual.Tours[i].TourId, Is.EqualTo(expected.Tours[i].TourId)); + Assert.That(actual.Tours[i].Count, Is.EqualTo(expected.Tours[i].Count)); + }); + } + } + else + { + Assert.That(actual.Tours, Is.Null); + } + } + + private static void AssertElement(Supplies? actual, SuppliesBindingModel expected) + { + Assert.That(actual, Is.Not.Null); + Assert.Multiple(() => + { + Assert.That(actual.Id, Is.EqualTo(expected.Id)); + Assert.That(actual.Count, Is.EqualTo(expected.Count)); + Assert.That(actual.ProductuionDate.Date, Is.EqualTo(expected.ProductuionDate.Date)); + }); + if (expected.Tours is not null) + { + Assert.That(actual.Tours, Is.Not.Null); + Assert.That(actual.Tours, Has.Count.EqualTo(expected.Tours.Count)); + for (int i = 0; i < actual.Tours.Count; ++i) + { + Assert.Multiple(() => + { + Assert.That(actual.Tours[i].TourId, Is.EqualTo(expected.Tours[i].TourId)); + Assert.That(actual.Tours[i].Count, Is.EqualTo(expected.Tours[i].Count)); + }); + } + } + else + { + Assert.That(actual.Tours, Is.Null); + } + } +} diff --git a/MagicCarpetProject/MagicCarpetWebApi/Controllers/AgencyController.cs b/MagicCarpetProject/MagicCarpetWebApi/Controllers/AgencyController.cs index 9e30893..3b48c1d 100644 --- a/MagicCarpetProject/MagicCarpetWebApi/Controllers/AgencyController.cs +++ b/MagicCarpetProject/MagicCarpetWebApi/Controllers/AgencyController.cs @@ -1,12 +1,15 @@ using MagicCarpetContracts.AdapterContracts; using MagicCarpetContracts.BindingModels; +using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; namespace MagicCarpetWebApi.Controllers; +[Authorize] [Route("api/[controller]")] [ApiController] +[Produces("application/json")] public class AgencyController(IAgencyAdapter adapter) : ControllerBase { private readonly IAgencyAdapter _adapter = adapter; diff --git a/MagicCarpetProject/MagicCarpetWebApi/Controllers/SuppliesController.cs b/MagicCarpetProject/MagicCarpetWebApi/Controllers/SuppliesController.cs index 1ad3f37..25c8296 100644 --- a/MagicCarpetProject/MagicCarpetWebApi/Controllers/SuppliesController.cs +++ b/MagicCarpetProject/MagicCarpetWebApi/Controllers/SuppliesController.cs @@ -1,12 +1,15 @@ using MagicCarpetContracts.AdapterContracts; using MagicCarpetContracts.BindingModels; +using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; namespace MagicCarpetWebApi.Controllers; +[Authorize] [Route("api/[controller]")] [ApiController] +[Produces("application/json")] public class SuppliesController(ISuppliesAdapter adapter) : ControllerBase { private readonly ISuppliesAdapter _adapter = adapter;