Remove basket items when basket is deleted (#170)
* Proving out removing the basket items at the same time the basket is deleted * Fixing existing unit tests * Adding a unit test for the Deletebasket method * Rename test and deleting basket items before basket * Added integration test for DeleteAsync method for BasketItems - Also added a BasketBuilder to create a Basket with no items, or one item.
This commit is contained in:
committed by
Steve Smith
parent
95285593c9
commit
eb02750841
@@ -12,6 +12,7 @@ namespace Microsoft.eShopWeb.ApplicationCore.Services
|
|||||||
public class BasketService : IBasketService
|
public class BasketService : IBasketService
|
||||||
{
|
{
|
||||||
private readonly IAsyncRepository<Basket> _basketRepository;
|
private readonly IAsyncRepository<Basket> _basketRepository;
|
||||||
|
private readonly IAsyncRepository<BasketItem> _basketItemRepository;
|
||||||
private readonly IUriComposer _uriComposer;
|
private readonly IUriComposer _uriComposer;
|
||||||
private readonly IAppLogger<BasketService> _logger;
|
private readonly IAppLogger<BasketService> _logger;
|
||||||
private readonly IRepository<CatalogItem> _itemRepository;
|
private readonly IRepository<CatalogItem> _itemRepository;
|
||||||
@@ -19,12 +20,14 @@ namespace Microsoft.eShopWeb.ApplicationCore.Services
|
|||||||
public BasketService(IAsyncRepository<Basket> basketRepository,
|
public BasketService(IAsyncRepository<Basket> basketRepository,
|
||||||
IRepository<CatalogItem> itemRepository,
|
IRepository<CatalogItem> itemRepository,
|
||||||
IUriComposer uriComposer,
|
IUriComposer uriComposer,
|
||||||
IAppLogger<BasketService> logger)
|
IAppLogger<BasketService> logger,
|
||||||
|
IAsyncRepository<BasketItem> basketItemRepository)
|
||||||
{
|
{
|
||||||
_basketRepository = basketRepository;
|
_basketRepository = basketRepository;
|
||||||
_uriComposer = uriComposer;
|
_uriComposer = uriComposer;
|
||||||
_logger = logger;
|
_logger = logger;
|
||||||
_itemRepository = itemRepository;
|
_itemRepository = itemRepository;
|
||||||
|
_basketItemRepository = basketItemRepository;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task AddItemToBasket(int basketId, int catalogItemId, decimal price, int quantity)
|
public async Task AddItemToBasket(int basketId, int catalogItemId, decimal price, int quantity)
|
||||||
@@ -40,6 +43,11 @@ namespace Microsoft.eShopWeb.ApplicationCore.Services
|
|||||||
{
|
{
|
||||||
var basket = await _basketRepository.GetByIdAsync(basketId);
|
var basket = await _basketRepository.GetByIdAsync(basketId);
|
||||||
|
|
||||||
|
foreach (var item in basket.Items)
|
||||||
|
{
|
||||||
|
await _basketItemRepository.DeleteAsync(item);
|
||||||
|
}
|
||||||
|
|
||||||
await _basketRepository.DeleteAsync(basket);
|
await _basketRepository.DeleteAsync(basket);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,46 @@
|
|||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using Microsoft.eShopWeb.ApplicationCore.Entities.BasketAggregate;
|
||||||
|
using Microsoft.eShopWeb.Infrastructure.Data;
|
||||||
|
using Microsoft.eShopWeb.UnitTests.Builders;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Xunit;
|
||||||
|
using Xunit.Abstractions;
|
||||||
|
|
||||||
|
namespace Microsoft.eShopWeb.IntegrationTests.Repositories.BasketItemRepositoryTests
|
||||||
|
{
|
||||||
|
public class DeleteAsync_Should
|
||||||
|
{
|
||||||
|
private readonly CatalogContext _catalogContext;
|
||||||
|
private readonly EfRepository<Basket> _basketRepository;
|
||||||
|
private readonly EfRepository<BasketItem> _basketItemRepository;
|
||||||
|
private BasketBuilder BasketBuilder { get; } = new BasketBuilder();
|
||||||
|
private readonly ITestOutputHelper _output;
|
||||||
|
|
||||||
|
public DeleteAsync_Should(ITestOutputHelper output)
|
||||||
|
{
|
||||||
|
_output = output;
|
||||||
|
var dbOptions = new DbContextOptionsBuilder<CatalogContext>()
|
||||||
|
.UseInMemoryDatabase(databaseName: "TestCatalog")
|
||||||
|
.Options;
|
||||||
|
_catalogContext = new CatalogContext(dbOptions);
|
||||||
|
_basketRepository = new EfRepository<Basket>(_catalogContext);
|
||||||
|
_basketItemRepository = new EfRepository<BasketItem>(_catalogContext);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task DeleteItemFromBasket()
|
||||||
|
{
|
||||||
|
var existingBasket = BasketBuilder.WithOneBasketItem();
|
||||||
|
_catalogContext.Add(existingBasket);
|
||||||
|
_catalogContext.SaveChanges();
|
||||||
|
|
||||||
|
await _basketItemRepository.DeleteAsync(existingBasket.Items.FirstOrDefault());
|
||||||
|
_catalogContext.SaveChanges();
|
||||||
|
|
||||||
|
var basketFromDB = _basketRepository.GetById(BasketBuilder.BasketId);
|
||||||
|
|
||||||
|
Assert.Equal(0, basketFromDB.Items.Count);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
using Microsoft.eShopWeb.ApplicationCore.Entities.BasketAggregate;
|
||||||
|
using Microsoft.eShopWeb.ApplicationCore.Interfaces;
|
||||||
|
using Microsoft.eShopWeb.ApplicationCore.Services;
|
||||||
|
using Moq;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Xunit;
|
||||||
|
|
||||||
|
namespace Microsoft.eShopWeb.UnitTests.ApplicationCore.Services.BasketServiceTests
|
||||||
|
{
|
||||||
|
public class DeleteBasket
|
||||||
|
{
|
||||||
|
private Mock<IAsyncRepository<Basket>> _mockBasketRepo;
|
||||||
|
private Mock<IAsyncRepository<BasketItem>> _mockBasketItemRepo;
|
||||||
|
|
||||||
|
public DeleteBasket()
|
||||||
|
{
|
||||||
|
_mockBasketRepo = new Mock<IAsyncRepository<Basket>>();
|
||||||
|
_mockBasketItemRepo = new Mock<IAsyncRepository<BasketItem>>();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task Should_InvokeBasketRepoOnceAndBasketItemRepoTwice_Given_TwoItemsInBasket()
|
||||||
|
{
|
||||||
|
var basket = new Basket();
|
||||||
|
basket.AddItem(1, It.IsAny<decimal>(), It.IsAny<int>());
|
||||||
|
basket.AddItem(2, It.IsAny<decimal>(), It.IsAny<int>());
|
||||||
|
_mockBasketRepo.Setup(x => x.GetByIdAsync(It.IsAny<int>()))
|
||||||
|
.ReturnsAsync(basket);
|
||||||
|
var basketService = new BasketService(_mockBasketRepo.Object, null, null, null, _mockBasketItemRepo.Object);
|
||||||
|
|
||||||
|
await basketService.DeleteBasketAsync(It.IsAny<int>());
|
||||||
|
|
||||||
|
_mockBasketRepo.Verify(x => x.DeleteAsync(It.IsAny<Basket>()), Times.Once);
|
||||||
|
_mockBasketItemRepo.Verify(x => x.DeleteAsync(It.IsAny<BasketItem>()), Times.Exactly(2));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -21,7 +21,7 @@ namespace Microsoft.eShopWeb.UnitTests.ApplicationCore.Services.BasketServiceTes
|
|||||||
[Fact]
|
[Fact]
|
||||||
public async void ThrowsGivenInvalidBasketId()
|
public async void ThrowsGivenInvalidBasketId()
|
||||||
{
|
{
|
||||||
var basketService = new BasketService(_mockBasketRepo.Object, null, null, null);
|
var basketService = new BasketService(_mockBasketRepo.Object, null, null, null, null);
|
||||||
|
|
||||||
await Assert.ThrowsAsync<BasketNotFoundException>(async () =>
|
await Assert.ThrowsAsync<BasketNotFoundException>(async () =>
|
||||||
await basketService.SetQuantities(_invalidId, new System.Collections.Generic.Dictionary<string, int>()));
|
await basketService.SetQuantities(_invalidId, new System.Collections.Generic.Dictionary<string, int>()));
|
||||||
@@ -30,7 +30,7 @@ namespace Microsoft.eShopWeb.UnitTests.ApplicationCore.Services.BasketServiceTes
|
|||||||
[Fact]
|
[Fact]
|
||||||
public async void ThrowsGivenNullQuantities()
|
public async void ThrowsGivenNullQuantities()
|
||||||
{
|
{
|
||||||
var basketService = new BasketService(null, null, null, null);
|
var basketService = new BasketService(null, null, null, null, null);
|
||||||
|
|
||||||
await Assert.ThrowsAsync<ArgumentNullException>(async () =>
|
await Assert.ThrowsAsync<ArgumentNullException>(async () =>
|
||||||
await basketService.SetQuantities(123, null));
|
await basketService.SetQuantities(123, null));
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ namespace Microsoft.eShopWeb.UnitTests.ApplicationCore.Services.BasketServiceTes
|
|||||||
[Fact]
|
[Fact]
|
||||||
public async void ThrowsGivenNullAnonymousId()
|
public async void ThrowsGivenNullAnonymousId()
|
||||||
{
|
{
|
||||||
var basketService = new BasketService(null, null, null, null);
|
var basketService = new BasketService(null, null, null, null, null);
|
||||||
|
|
||||||
await Assert.ThrowsAsync<ArgumentNullException>(async () => await basketService.TransferBasketAsync(null, "steve"));
|
await Assert.ThrowsAsync<ArgumentNullException>(async () => await basketService.TransferBasketAsync(null, "steve"));
|
||||||
}
|
}
|
||||||
@@ -17,7 +17,7 @@ namespace Microsoft.eShopWeb.UnitTests.ApplicationCore.Services.BasketServiceTes
|
|||||||
[Fact]
|
[Fact]
|
||||||
public async void ThrowsGivenNullUserId()
|
public async void ThrowsGivenNullUserId()
|
||||||
{
|
{
|
||||||
var basketService = new BasketService(null, null, null, null);
|
var basketService = new BasketService(null, null, null, null, null);
|
||||||
|
|
||||||
await Assert.ThrowsAsync<ArgumentNullException>(async () => await basketService.TransferBasketAsync("abcdefg", null));
|
await Assert.ThrowsAsync<ArgumentNullException>(async () => await basketService.TransferBasketAsync("abcdefg", null));
|
||||||
}
|
}
|
||||||
|
|||||||
34
tests/UnitTests/Builders/BasketBuilder.cs
Normal file
34
tests/UnitTests/Builders/BasketBuilder.cs
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
using Microsoft.eShopWeb.ApplicationCore.Entities.BasketAggregate;
|
||||||
|
|
||||||
|
namespace Microsoft.eShopWeb.UnitTests.Builders
|
||||||
|
{
|
||||||
|
public class BasketBuilder
|
||||||
|
{
|
||||||
|
private Basket _basket;
|
||||||
|
public string BasketBuyerId => "testbuyerId@test.com";
|
||||||
|
public int BasketId => 1;
|
||||||
|
|
||||||
|
public BasketBuilder()
|
||||||
|
{
|
||||||
|
_basket = WithNoItems();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Basket Build()
|
||||||
|
{
|
||||||
|
return _basket;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Basket WithNoItems()
|
||||||
|
{
|
||||||
|
_basket = new Basket { BuyerId = BasketBuyerId, Id = BasketId };
|
||||||
|
return _basket;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Basket WithOneBasketItem()
|
||||||
|
{
|
||||||
|
_basket = new Basket { BuyerId = BasketBuyerId, Id = BasketId };
|
||||||
|
_basket.AddItem(2, 3.40m, 4);
|
||||||
|
return _basket;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user