Add initial implementation of product management API
This commit is contained in:
90
EndavaTask.Tests/ProductServiceTests.cs
Normal file
90
EndavaTask.Tests/ProductServiceTests.cs
Normal file
@@ -0,0 +1,90 @@
|
||||
using EndavaTask.Contracts;
|
||||
using EndavaTask.Data;
|
||||
using EndavaTask.Dtos;
|
||||
using EndavaTask.Exceptions;
|
||||
using EndavaTask.Models;
|
||||
using EndavaTask.Services;
|
||||
using Moq;
|
||||
using Xunit;
|
||||
|
||||
namespace EndavaTask.Tests;
|
||||
|
||||
public class ProductServiceTests
|
||||
{
|
||||
[Fact]
|
||||
public void GetProducts_WithRepositoryResult_MapsAndReturnsPagedResult()
|
||||
{
|
||||
var categoryId = Guid.Parse("aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa");
|
||||
var repositoryMock = new Mock<IProductRepository>();
|
||||
|
||||
repositoryMock
|
||||
.Setup(r => r.CategoryExists(categoryId))
|
||||
.Returns(true);
|
||||
|
||||
repositoryMock
|
||||
.Setup(r => r.GetFilteredProducts(It.IsAny<ProductFilterQuery>(), It.IsAny<PaginationQuery>()))
|
||||
.Returns(new PagedResult<Product>
|
||||
{
|
||||
Items =
|
||||
[
|
||||
new Product { Id = Guid.NewGuid(), Name = "Laptop", Price = 1200m, CategoryId = categoryId },
|
||||
new Product { Id = Guid.NewGuid(), Name = "Headphones", Price = 180m, CategoryId = categoryId }
|
||||
],
|
||||
PageNumber = 1,
|
||||
PageSize = 2,
|
||||
TotalCount = 3,
|
||||
TotalPages = 2
|
||||
});
|
||||
|
||||
var service = new ProductService(repositoryMock.Object);
|
||||
var result = service.GetProducts(new ProductFilterQuery { CategoryId = categoryId }, new PaginationQuery { PageNumber = 1, PageSize = 2 });
|
||||
var value = Assert.IsType<PagedResult<ProductDto>>(result);
|
||||
|
||||
Assert.Equal(2, value.Items.Count);
|
||||
Assert.Equal(3, value.TotalCount);
|
||||
Assert.Equal(2, value.TotalPages);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void UpdateProduct_WithRepositoryEntity_ReturnsMappedDto()
|
||||
{
|
||||
var productId = Guid.Parse("55555555-5555-5555-5555-555555555555");
|
||||
var categoryId = Guid.Parse("aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa");
|
||||
|
||||
var repositoryMock = new Mock<IProductRepository>();
|
||||
|
||||
repositoryMock
|
||||
.Setup(r => r.UpdateProduct(productId, It.IsAny<UpdateProductRequest>()))
|
||||
.Returns(new Product
|
||||
{
|
||||
Id = productId,
|
||||
Name = "Updated Monitor",
|
||||
Price = 350m,
|
||||
CategoryId = categoryId
|
||||
});
|
||||
|
||||
var service = new ProductService(repositoryMock.Object);
|
||||
var result = service.UpdateProduct(productId, new UpdateProductRequest { Name = "Updated Monitor", Price = 350m });
|
||||
var value = Assert.IsType<ProductDto>(result);
|
||||
|
||||
Assert.Equal("Updated Monitor", value.Name);
|
||||
Assert.Equal(350m, value.Price);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void GetProducts_WithUnknownCategory_ThrowsValidationException()
|
||||
{
|
||||
var repositoryMock = new Mock<IProductRepository>();
|
||||
|
||||
repositoryMock
|
||||
.Setup(r => r.CategoryExists(It.IsAny<Guid>()))
|
||||
.Returns(false);
|
||||
|
||||
var service = new ProductService(repositoryMock.Object);
|
||||
|
||||
var exception = Assert.Throws<ApiValidationException>(() =>
|
||||
service.GetProducts(new ProductFilterQuery { CategoryId = Guid.NewGuid() }, new PaginationQuery()));
|
||||
|
||||
Assert.True(exception.Errors.ContainsKey(nameof(ProductFilterQuery.CategoryId)));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user