From 8a45a2c858e2ad21c3a26d6fd815ecd6b4897f33 Mon Sep 17 00:00:00 2001 From: Steve Smith Date: Mon, 25 Oct 2021 15:13:02 -0400 Subject: [PATCH] Update Specification and other packages to latest version (#582) * Updating repositories and specification version Need to fix broken tests * removing test that would just be testing mocked result now * Refactored from IAsyncRepository and removed it. Tests pass. * Update packages --- src/ApplicationCore/ApplicationCore.csproj | 2 +- .../Interfaces/IAsyncRepository.cs | 21 --- .../Interfaces/IOrderRepository.cs | 8 +- .../Interfaces/IReadRepository.cs | 8 ++ src/ApplicationCore/Interfaces/IRepository.cs | 8 ++ src/ApplicationCore/Services/BasketService.cs | 12 +- src/ApplicationCore/Services/OrderService.cs | 14 +- .../BasketWithItemsSpecification.cs | 2 +- .../Specifications/OrderWithItemsByIdSpec.cs | 16 +++ src/BlazorAdmin/Services/HttpService.cs | 1 - src/Infrastructure/Data/EfRepository.cs | 122 +++++++++--------- src/Infrastructure/Data/OrderRepository.cs | 26 ++-- src/Infrastructure/Infrastructure.csproj | 2 +- src/PublicApi/CatalogBrandEndpoints/List.cs | 6 +- src/PublicApi/CatalogItemEndpoints/Create.cs | 5 +- src/PublicApi/CatalogItemEndpoints/Delete.cs | 4 +- src/PublicApi/CatalogItemEndpoints/GetById.cs | 4 +- .../CatalogItemEndpoints/ListPaged.cs | 4 +- src/PublicApi/CatalogItemEndpoints/Update.cs | 4 +- src/PublicApi/CatalogTypeEndpoints/List.cs | 6 +- src/PublicApi/PublicApi.csproj | 4 +- src/PublicApi/Startup.cs | 3 +- .../Configuration/ConfigureCoreServices.cs | 10 +- .../Features/MyOrders/GetMyOrdersHandler.cs | 8 +- .../OrderDetails/GetOrderDetailsHandler.cs | 12 +- src/Web/Services/BasketViewModelService.cs | 10 +- .../Services/CatalogItemViewModelService.cs | 4 +- src/Web/Services/CatalogViewModelService.cs | 16 +-- src/Web/Web.csproj | 4 +- .../BasketRepositoryTests/SetQuantities.cs | 2 +- .../OrderRepositoryTests/GetById.cs | 6 +- .../GetByIdWithItemsAsync.cs | 8 +- .../BasketServiceTests/AddItemToBasket.cs | 13 +- .../BasketServiceTests/DeleteBasket.cs | 7 +- .../BasketServiceTests/SetQuantities.cs | 71 +++++----- .../BasketServiceTests/TransferBasket.cs | 73 +++++------ .../BasketWithItemsSpecification.cs | 18 +-- .../OrdersTests/GetMyOrders.cs | 6 +- .../OrdersTests/GetOrderDetails.cs | 20 +-- 39 files changed, 281 insertions(+), 289 deletions(-) delete mode 100644 src/ApplicationCore/Interfaces/IAsyncRepository.cs create mode 100644 src/ApplicationCore/Interfaces/IReadRepository.cs create mode 100644 src/ApplicationCore/Interfaces/IRepository.cs create mode 100644 src/ApplicationCore/Specifications/OrderWithItemsByIdSpec.cs diff --git a/src/ApplicationCore/ApplicationCore.csproj b/src/ApplicationCore/ApplicationCore.csproj index a121120..6cf98bc 100644 --- a/src/ApplicationCore/ApplicationCore.csproj +++ b/src/ApplicationCore/ApplicationCore.csproj @@ -7,7 +7,7 @@ - + diff --git a/src/ApplicationCore/Interfaces/IAsyncRepository.cs b/src/ApplicationCore/Interfaces/IAsyncRepository.cs deleted file mode 100644 index 94eff20..0000000 --- a/src/ApplicationCore/Interfaces/IAsyncRepository.cs +++ /dev/null @@ -1,21 +0,0 @@ -using Ardalis.Specification; -using Microsoft.eShopWeb.ApplicationCore.Entities; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; - -namespace Microsoft.eShopWeb.ApplicationCore.Interfaces -{ - public interface IAsyncRepository where T : BaseEntity, IAggregateRoot - { - Task GetByIdAsync(int id, CancellationToken cancellationToken = default); - Task> ListAllAsync(CancellationToken cancellationToken = default); - Task> ListAsync(ISpecification spec, CancellationToken cancellationToken = default); - Task AddAsync(T entity, CancellationToken cancellationToken = default); - Task UpdateAsync(T entity, CancellationToken cancellationToken = default); - Task DeleteAsync(T entity, CancellationToken cancellationToken = default); - Task CountAsync(ISpecification spec, CancellationToken cancellationToken = default); - Task FirstAsync(ISpecification spec, CancellationToken cancellationToken = default); - Task FirstOrDefaultAsync(ISpecification spec, CancellationToken cancellationToken = default); - } -} diff --git a/src/ApplicationCore/Interfaces/IOrderRepository.cs b/src/ApplicationCore/Interfaces/IOrderRepository.cs index f6081e1..9341587 100644 --- a/src/ApplicationCore/Interfaces/IOrderRepository.cs +++ b/src/ApplicationCore/Interfaces/IOrderRepository.cs @@ -4,8 +4,8 @@ using System.Threading.Tasks; namespace Microsoft.eShopWeb.ApplicationCore.Interfaces { - public interface IOrderRepository : IAsyncRepository - { - Task GetByIdWithItemsAsync(int id); - } + //public interface IOrderRepository : IAsyncRepository + //{ + // Task GetByIdWithItemsAsync(int id); + //} } diff --git a/src/ApplicationCore/Interfaces/IReadRepository.cs b/src/ApplicationCore/Interfaces/IReadRepository.cs new file mode 100644 index 0000000..81ec491 --- /dev/null +++ b/src/ApplicationCore/Interfaces/IReadRepository.cs @@ -0,0 +1,8 @@ +using Ardalis.Specification; + +namespace Microsoft.eShopWeb.ApplicationCore.Interfaces +{ + public interface IReadRepository : IReadRepositoryBase where T : class, IAggregateRoot + { + } +} diff --git a/src/ApplicationCore/Interfaces/IRepository.cs b/src/ApplicationCore/Interfaces/IRepository.cs new file mode 100644 index 0000000..c427396 --- /dev/null +++ b/src/ApplicationCore/Interfaces/IRepository.cs @@ -0,0 +1,8 @@ +using Ardalis.Specification; + +namespace Microsoft.eShopWeb.ApplicationCore.Interfaces +{ + public interface IRepository : IRepositoryBase where T : class, IAggregateRoot + { + } +} diff --git a/src/ApplicationCore/Services/BasketService.cs b/src/ApplicationCore/Services/BasketService.cs index bce7935..2b6697d 100644 --- a/src/ApplicationCore/Services/BasketService.cs +++ b/src/ApplicationCore/Services/BasketService.cs @@ -9,10 +9,10 @@ namespace Microsoft.eShopWeb.ApplicationCore.Services { public class BasketService : IBasketService { - private readonly IAsyncRepository _basketRepository; + private readonly IRepository _basketRepository; private readonly IAppLogger _logger; - public BasketService(IAsyncRepository basketRepository, + public BasketService(IRepository basketRepository, IAppLogger logger) { _basketRepository = basketRepository; @@ -22,7 +22,7 @@ namespace Microsoft.eShopWeb.ApplicationCore.Services public async Task AddItemToBasket(int basketId, int catalogItemId, decimal price, int quantity = 1) { var basketSpec = new BasketWithItemsSpecification(basketId); - var basket = await _basketRepository.FirstOrDefaultAsync(basketSpec); + var basket = await _basketRepository.GetBySpecAsync(basketSpec); Guard.Against.NullBasket(basketId, basket); basket.AddItem(catalogItemId, price, quantity); @@ -40,7 +40,7 @@ namespace Microsoft.eShopWeb.ApplicationCore.Services { Guard.Against.Null(quantities, nameof(quantities)); var basketSpec = new BasketWithItemsSpecification(basketId); - var basket = await _basketRepository.FirstOrDefaultAsync(basketSpec); + var basket = await _basketRepository.GetBySpecAsync(basketSpec); Guard.Against.NullBasket(basketId, basket); foreach (var item in basket.Items) @@ -60,10 +60,10 @@ namespace Microsoft.eShopWeb.ApplicationCore.Services Guard.Against.NullOrEmpty(anonymousId, nameof(anonymousId)); Guard.Against.NullOrEmpty(userName, nameof(userName)); var anonymousBasketSpec = new BasketWithItemsSpecification(anonymousId); - var anonymousBasket = await _basketRepository.FirstOrDefaultAsync(anonymousBasketSpec); + var anonymousBasket = await _basketRepository.GetBySpecAsync(anonymousBasketSpec); if (anonymousBasket == null) return; var userBasketSpec = new BasketWithItemsSpecification(userName); - var userBasket = await _basketRepository.FirstOrDefaultAsync(userBasketSpec); + var userBasket = await _basketRepository.GetBySpecAsync(userBasketSpec); if (userBasket == null) { userBasket = new Basket(userName); diff --git a/src/ApplicationCore/Services/OrderService.cs b/src/ApplicationCore/Services/OrderService.cs index 3bd63a9..d4119b1 100644 --- a/src/ApplicationCore/Services/OrderService.cs +++ b/src/ApplicationCore/Services/OrderService.cs @@ -11,14 +11,14 @@ namespace Microsoft.eShopWeb.ApplicationCore.Services { public class OrderService : IOrderService { - private readonly IAsyncRepository _orderRepository; + private readonly IRepository _orderRepository; private readonly IUriComposer _uriComposer; - private readonly IAsyncRepository _basketRepository; - private readonly IAsyncRepository _itemRepository; + private readonly IRepository _basketRepository; + private readonly IRepository _itemRepository; - public OrderService(IAsyncRepository basketRepository, - IAsyncRepository itemRepository, - IAsyncRepository orderRepository, + public OrderService(IRepository basketRepository, + IRepository itemRepository, + IRepository orderRepository, IUriComposer uriComposer) { _orderRepository = orderRepository; @@ -30,7 +30,7 @@ namespace Microsoft.eShopWeb.ApplicationCore.Services public async Task CreateOrderAsync(int basketId, Address shippingAddress) { var basketSpec = new BasketWithItemsSpecification(basketId); - var basket = await _basketRepository.FirstOrDefaultAsync(basketSpec); + var basket = await _basketRepository.GetBySpecAsync(basketSpec); Guard.Against.NullBasket(basketId, basket); Guard.Against.EmptyBasketOnCheckout(basket.Items); diff --git a/src/ApplicationCore/Specifications/BasketWithItemsSpecification.cs b/src/ApplicationCore/Specifications/BasketWithItemsSpecification.cs index c716db3..457e25f 100644 --- a/src/ApplicationCore/Specifications/BasketWithItemsSpecification.cs +++ b/src/ApplicationCore/Specifications/BasketWithItemsSpecification.cs @@ -3,7 +3,7 @@ using Microsoft.eShopWeb.ApplicationCore.Entities.BasketAggregate; namespace Microsoft.eShopWeb.ApplicationCore.Specifications { - public sealed class BasketWithItemsSpecification : Specification + public sealed class BasketWithItemsSpecification : Specification, ISingleResultSpecification { public BasketWithItemsSpecification(int basketId) { diff --git a/src/ApplicationCore/Specifications/OrderWithItemsByIdSpec.cs b/src/ApplicationCore/Specifications/OrderWithItemsByIdSpec.cs new file mode 100644 index 0000000..73aeff7 --- /dev/null +++ b/src/ApplicationCore/Specifications/OrderWithItemsByIdSpec.cs @@ -0,0 +1,16 @@ +using Ardalis.Specification; +using Microsoft.eShopWeb.ApplicationCore.Entities.OrderAggregate; + +namespace Microsoft.eShopWeb.ApplicationCore.Specifications +{ + public class OrderWithItemsByIdSpec : Specification, ISingleResultSpecification + { + public OrderWithItemsByIdSpec(int orderId) + { + Query + .Where(order => order.Id == orderId) + .Include(o => o.OrderItems) + .ThenInclude(i => i.ItemOrdered); + } + } +} diff --git a/src/BlazorAdmin/Services/HttpService.cs b/src/BlazorAdmin/Services/HttpService.cs index 489a7a4..d0b8584 100644 --- a/src/BlazorAdmin/Services/HttpService.cs +++ b/src/BlazorAdmin/Services/HttpService.cs @@ -11,7 +11,6 @@ namespace BlazorAdmin.Services private readonly HttpClient _httpClient; private readonly string _apiUrl; - public HttpService(HttpClient httpClient, BaseUrlConfiguration baseUrlConfiguration) { _httpClient = httpClient; diff --git a/src/Infrastructure/Data/EfRepository.cs b/src/Infrastructure/Data/EfRepository.cs index f454c12..8ae0186 100644 --- a/src/Infrastructure/Data/EfRepository.cs +++ b/src/Infrastructure/Data/EfRepository.cs @@ -10,79 +10,85 @@ using System.Threading.Tasks; namespace Microsoft.eShopWeb.Infrastructure.Data { + public class EfRepository : RepositoryBase, IReadRepository, IRepository where T : class, IAggregateRoot +{ + public EfRepository(CatalogContext dbContext) : base(dbContext) + { + } +} /// /// "There's some repetition here - couldn't we have some the sync methods call the async?" /// https://blogs.msdn.microsoft.com/pfxteam/2012/04/13/should-i-expose-synchronous-wrappers-for-asynchronous-methods/ /// /// - public class EfRepository : IAsyncRepository where T : BaseEntity, IAggregateRoot - { - protected readonly CatalogContext _dbContext; + // public class EfRepository : IAsyncRepository where T : BaseEntity, IAggregateRoot + // { + // protected readonly CatalogContext _dbContext; - public EfRepository(CatalogContext dbContext) - { - _dbContext = dbContext; - } + // public EfRepository(CatalogContext dbContext) + // { + // _dbContext = dbContext; + // } - public virtual async Task GetByIdAsync(int id, CancellationToken cancellationToken = default) - { - var keyValues = new object[] { id }; - return await _dbContext.Set().FindAsync(keyValues, cancellationToken); - } + // public virtual async Task GetByIdAsync(int id, CancellationToken cancellationToken = default) + // { + // var keyValues = new object[] { id }; + // return await _dbContext.Set().FindAsync(keyValues, cancellationToken); + // } - public async Task> ListAllAsync(CancellationToken cancellationToken = default) - { - return await _dbContext.Set().ToListAsync(cancellationToken); - } + // public async Task> ListAllAsync(CancellationToken cancellationToken = default) + // { + // return await _dbContext.Set().ToListAsync(cancellationToken); + // } - public async Task> ListAsync(ISpecification spec, CancellationToken cancellationToken = default) - { - var specificationResult = ApplySpecification(spec); - return await specificationResult.ToListAsync(cancellationToken); - } + // public async Task> ListAsync(ISpecification spec, CancellationToken cancellationToken = default) + // { + // var specificationResult = ApplySpecification(spec); + // return await specificationResult.ToListAsync(cancellationToken); + // } - public async Task CountAsync(ISpecification spec, CancellationToken cancellationToken = default) - { - var specificationResult = ApplySpecification(spec); - return await specificationResult.CountAsync(cancellationToken); - } + // public async Task CountAsync(ISpecification spec, CancellationToken cancellationToken = default) + // { + // var specificationResult = ApplySpecification(spec); + // return await specificationResult.CountAsync(cancellationToken); + // } - public async Task AddAsync(T entity, CancellationToken cancellationToken = default) - { - await _dbContext.Set().AddAsync(entity, cancellationToken); - await _dbContext.SaveChangesAsync(cancellationToken); + // public async Task AddAsync(T entity, CancellationToken cancellationToken = default) + // { + // await _dbContext.Set().AddAsync(entity, cancellationToken); + // await _dbContext.SaveChangesAsync(cancellationToken); - return entity; - } + // return entity; + // } - public async Task UpdateAsync(T entity, CancellationToken cancellationToken = default) - { - _dbContext.Entry(entity).State = EntityState.Modified; - await _dbContext.SaveChangesAsync(cancellationToken); - } + // public async Task UpdateAsync(T entity, CancellationToken cancellationToken = default) + // { + // _dbContext.Entry(entity).State = EntityState.Modified; + // await _dbContext.SaveChangesAsync(cancellationToken); + // } - public async Task DeleteAsync(T entity, CancellationToken cancellationToken = default) - { - _dbContext.Set().Remove(entity); - await _dbContext.SaveChangesAsync(cancellationToken); - } + // public async Task DeleteAsync(T entity, CancellationToken cancellationToken = default) + // { + // _dbContext.Set().Remove(entity); + // await _dbContext.SaveChangesAsync(cancellationToken); + // } - public async Task FirstAsync(ISpecification spec, CancellationToken cancellationToken = default) - { - var specificationResult = ApplySpecification(spec); - return await specificationResult.FirstAsync(cancellationToken); - } + // public async Task FirstAsync(ISpecification spec, CancellationToken cancellationToken = default) + // { + // var specificationResult = ApplySpecification(spec); + // return await specificationResult.FirstAsync(cancellationToken); + // } - public async Task FirstOrDefaultAsync(ISpecification spec, CancellationToken cancellationToken = default) - { - var specificationResult = ApplySpecification(spec); - return await specificationResult.FirstOrDefaultAsync(cancellationToken); - } + // public async Task FirstOrDefaultAsync(ISpecification spec, CancellationToken cancellationToken = default) + // { + // var specificationResult = ApplySpecification(spec); + // return await specificationResult.FirstOrDefaultAsync(cancellationToken); + // } - private IQueryable ApplySpecification(ISpecification spec) - { - var evaluator = new SpecificationEvaluator(); - return evaluator.GetQuery(_dbContext.Set().AsQueryable(), spec); - } - } + // private IQueryable ApplySpecification(ISpecification spec) + // { + // var evaluator = new SpecificationEvaluator(); + // return evaluator.GetQuery(_dbContext.Set().AsQueryable(), spec); + // } + // } } \ No newline at end of file diff --git a/src/Infrastructure/Data/OrderRepository.cs b/src/Infrastructure/Data/OrderRepository.cs index 57c3226..cfb5410 100644 --- a/src/Infrastructure/Data/OrderRepository.cs +++ b/src/Infrastructure/Data/OrderRepository.cs @@ -5,18 +5,18 @@ using System.Threading.Tasks; namespace Microsoft.eShopWeb.Infrastructure.Data { - public class OrderRepository : EfRepository, IOrderRepository - { - public OrderRepository(CatalogContext dbContext) : base(dbContext) - { - } + //public class OrderRepository : EfRepository, IOrderRepository + //{ + // public OrderRepository(CatalogContext dbContext) : base(dbContext) + // { + // } - public Task GetByIdWithItemsAsync(int id) - { - return _dbContext.Orders - .Include(o => o.OrderItems) - .ThenInclude(i => i.ItemOrdered) - .FirstOrDefaultAsync(x => x.Id == id); - } - } + // public Task GetByIdWithItemsAsync(int id) + // { + // return _dbContext.Orders + // .Include(o => o.OrderItems) + // .ThenInclude(i => i.ItemOrdered) + // .FirstOrDefaultAsync(x => x.Id == id); + // } + //} } diff --git a/src/Infrastructure/Infrastructure.csproj b/src/Infrastructure/Infrastructure.csproj index b5f04b2..09bb44f 100644 --- a/src/Infrastructure/Infrastructure.csproj +++ b/src/Infrastructure/Infrastructure.csproj @@ -6,7 +6,7 @@ - + diff --git a/src/PublicApi/CatalogBrandEndpoints/List.cs b/src/PublicApi/CatalogBrandEndpoints/List.cs index 585ea2c..6a2f0aa 100644 --- a/src/PublicApi/CatalogBrandEndpoints/List.cs +++ b/src/PublicApi/CatalogBrandEndpoints/List.cs @@ -14,10 +14,10 @@ namespace Microsoft.eShopWeb.PublicApi.CatalogBrandEndpoints .WithoutRequest .WithResponse { - private readonly IAsyncRepository _catalogBrandRepository; + private readonly IRepository _catalogBrandRepository; private readonly IMapper _mapper; - public List(IAsyncRepository catalogBrandRepository, + public List(IRepository catalogBrandRepository, IMapper mapper) { _catalogBrandRepository = catalogBrandRepository; @@ -35,7 +35,7 @@ namespace Microsoft.eShopWeb.PublicApi.CatalogBrandEndpoints { var response = new ListCatalogBrandsResponse(); - var items = await _catalogBrandRepository.ListAllAsync(cancellationToken); + var items = await _catalogBrandRepository.ListAsync(cancellationToken); response.CatalogBrands.AddRange(items.Select(_mapper.Map)); diff --git a/src/PublicApi/CatalogItemEndpoints/Create.cs b/src/PublicApi/CatalogItemEndpoints/Create.cs index 1cb5eee..cb3f10a 100644 --- a/src/PublicApi/CatalogItemEndpoints/Create.cs +++ b/src/PublicApi/CatalogItemEndpoints/Create.cs @@ -17,10 +17,11 @@ namespace Microsoft.eShopWeb.PublicApi.CatalogItemEndpoints .WithRequest .WithResponse { - private readonly IAsyncRepository _itemRepository; + private readonly IRepository _itemRepository; private readonly IUriComposer _uriComposer; - public Create(IAsyncRepository itemRepository, IUriComposer uriComposer) + public Create(IRepository itemRepository, + IUriComposer uriComposer) { _itemRepository = itemRepository; _uriComposer = uriComposer; diff --git a/src/PublicApi/CatalogItemEndpoints/Delete.cs b/src/PublicApi/CatalogItemEndpoints/Delete.cs index f7f4a97..960c064 100644 --- a/src/PublicApi/CatalogItemEndpoints/Delete.cs +++ b/src/PublicApi/CatalogItemEndpoints/Delete.cs @@ -15,9 +15,9 @@ namespace Microsoft.eShopWeb.PublicApi.CatalogItemEndpoints .WithRequest .WithResponse { - private readonly IAsyncRepository _itemRepository; + private readonly IRepository _itemRepository; - public Delete(IAsyncRepository itemRepository) + public Delete(IRepository itemRepository) { _itemRepository = itemRepository; } diff --git a/src/PublicApi/CatalogItemEndpoints/GetById.cs b/src/PublicApi/CatalogItemEndpoints/GetById.cs index 3b34958..29501bb 100644 --- a/src/PublicApi/CatalogItemEndpoints/GetById.cs +++ b/src/PublicApi/CatalogItemEndpoints/GetById.cs @@ -12,10 +12,10 @@ namespace Microsoft.eShopWeb.PublicApi.CatalogItemEndpoints .WithRequest .WithResponse { - private readonly IAsyncRepository _itemRepository; + private readonly IRepository _itemRepository; private readonly IUriComposer _uriComposer; - public GetById(IAsyncRepository itemRepository, IUriComposer uriComposer) + public GetById(IRepository itemRepository, IUriComposer uriComposer) { _itemRepository = itemRepository; _uriComposer = uriComposer; diff --git a/src/PublicApi/CatalogItemEndpoints/ListPaged.cs b/src/PublicApi/CatalogItemEndpoints/ListPaged.cs index c997d43..d6f0d08 100644 --- a/src/PublicApi/CatalogItemEndpoints/ListPaged.cs +++ b/src/PublicApi/CatalogItemEndpoints/ListPaged.cs @@ -16,11 +16,11 @@ namespace Microsoft.eShopWeb.PublicApi.CatalogItemEndpoints .WithRequest .WithResponse { - private readonly IAsyncRepository _itemRepository; + private readonly IRepository _itemRepository; private readonly IUriComposer _uriComposer; private readonly IMapper _mapper; - public ListPaged(IAsyncRepository itemRepository, + public ListPaged(IRepository itemRepository, IUriComposer uriComposer, IMapper mapper) { diff --git a/src/PublicApi/CatalogItemEndpoints/Update.cs b/src/PublicApi/CatalogItemEndpoints/Update.cs index 97b45a4..bdd4cf8 100644 --- a/src/PublicApi/CatalogItemEndpoints/Update.cs +++ b/src/PublicApi/CatalogItemEndpoints/Update.cs @@ -16,10 +16,10 @@ namespace Microsoft.eShopWeb.PublicApi.CatalogItemEndpoints .WithRequest .WithResponse { - private readonly IAsyncRepository _itemRepository; + private readonly IRepository _itemRepository; private readonly IUriComposer _uriComposer; - public Update(IAsyncRepository itemRepository, IUriComposer uriComposer) + public Update(IRepository itemRepository, IUriComposer uriComposer) { _itemRepository = itemRepository; _uriComposer = uriComposer; diff --git a/src/PublicApi/CatalogTypeEndpoints/List.cs b/src/PublicApi/CatalogTypeEndpoints/List.cs index 6621bf4..f25c4a0 100644 --- a/src/PublicApi/CatalogTypeEndpoints/List.cs +++ b/src/PublicApi/CatalogTypeEndpoints/List.cs @@ -14,10 +14,10 @@ namespace Microsoft.eShopWeb.PublicApi.CatalogTypeEndpoints .WithoutRequest .WithResponse { - private readonly IAsyncRepository _catalogTypeRepository; + private readonly IRepository _catalogTypeRepository; private readonly IMapper _mapper; - public List(IAsyncRepository catalogTypeRepository, + public List(IRepository catalogTypeRepository, IMapper mapper) { _catalogTypeRepository = catalogTypeRepository; @@ -35,7 +35,7 @@ namespace Microsoft.eShopWeb.PublicApi.CatalogTypeEndpoints { var response = new ListCatalogTypesResponse(); - var items = await _catalogTypeRepository.ListAllAsync(cancellationToken); + var items = await _catalogTypeRepository.ListAsync(cancellationToken); response.CatalogTypes.AddRange(items.Select(_mapper.Map)); diff --git a/src/PublicApi/PublicApi.csproj b/src/PublicApi/PublicApi.csproj index 2c71d02..42572d3 100644 --- a/src/PublicApi/PublicApi.csproj +++ b/src/PublicApi/PublicApi.csproj @@ -13,8 +13,8 @@ - - + + diff --git a/src/PublicApi/Startup.cs b/src/PublicApi/Startup.cs index 0747537..7b4f083 100644 --- a/src/PublicApi/Startup.cs +++ b/src/PublicApi/Startup.cs @@ -88,7 +88,8 @@ namespace Microsoft.eShopWeb.PublicApi .AddEntityFrameworkStores() .AddDefaultTokenProviders(); - services.AddScoped(typeof(IAsyncRepository<>), typeof(EfRepository<>)); + services.AddScoped(typeof(IRepository<>), typeof(EfRepository<>)); + services.AddScoped(typeof(IReadRepository<>), typeof(EfRepository<>)); services.Configure(Configuration); services.AddSingleton(new UriComposer(Configuration.Get())); services.AddScoped(typeof(IAppLogger<>), typeof(LoggerAdapter<>)); diff --git a/src/Web/Configuration/ConfigureCoreServices.cs b/src/Web/Configuration/ConfigureCoreServices.cs index 039e13a..5e152a2 100644 --- a/src/Web/Configuration/ConfigureCoreServices.cs +++ b/src/Web/Configuration/ConfigureCoreServices.cs @@ -10,12 +10,16 @@ namespace Microsoft.eShopWeb.Web.Configuration { public static class ConfigureCoreServices { - public static IServiceCollection AddCoreServices(this IServiceCollection services, IConfiguration configuration) + public static IServiceCollection AddCoreServices(this IServiceCollection services, + IConfiguration configuration) { - services.AddScoped(typeof(IAsyncRepository<>), typeof(EfRepository<>)); + //services.AddScoped(typeof(IAsyncRepository<>), typeof(EfRepository<>)); + services.AddScoped(typeof(IReadRepository<>), typeof(EfRepository<>)); + services.AddScoped(typeof(IRepository<>), typeof(EfRepository<>)); + services.AddScoped(); services.AddScoped(); - services.AddScoped(); + //services.AddScoped(); services.AddSingleton(new UriComposer(configuration.Get())); services.AddScoped(typeof(IAppLogger<>), typeof(LoggerAdapter<>)); services.AddTransient(); diff --git a/src/Web/Features/MyOrders/GetMyOrdersHandler.cs b/src/Web/Features/MyOrders/GetMyOrdersHandler.cs index e66c38a..f78bfae 100644 --- a/src/Web/Features/MyOrders/GetMyOrdersHandler.cs +++ b/src/Web/Features/MyOrders/GetMyOrdersHandler.cs @@ -1,4 +1,5 @@ using MediatR; +using Microsoft.eShopWeb.ApplicationCore.Entities.OrderAggregate; using Microsoft.eShopWeb.ApplicationCore.Interfaces; using Microsoft.eShopWeb.ApplicationCore.Specifications; using Microsoft.eShopWeb.Web.ViewModels; @@ -11,14 +12,15 @@ namespace Microsoft.eShopWeb.Web.Features.MyOrders { public class GetMyOrdersHandler : IRequestHandler> { - private readonly IOrderRepository _orderRepository; + private readonly IReadRepository _orderRepository; - public GetMyOrdersHandler(IOrderRepository orderRepository) + public GetMyOrdersHandler(IReadRepository orderRepository) { _orderRepository = orderRepository; } - public async Task> Handle(GetMyOrders request, CancellationToken cancellationToken) + public async Task> Handle(GetMyOrders request, + CancellationToken cancellationToken) { var specification = new CustomerOrdersWithItemsSpecification(request.UserName); var orders = await _orderRepository.ListAsync(specification, cancellationToken); diff --git a/src/Web/Features/OrderDetails/GetOrderDetailsHandler.cs b/src/Web/Features/OrderDetails/GetOrderDetailsHandler.cs index 420e18e..44c270b 100644 --- a/src/Web/Features/OrderDetails/GetOrderDetailsHandler.cs +++ b/src/Web/Features/OrderDetails/GetOrderDetailsHandler.cs @@ -1,4 +1,5 @@ using MediatR; +using Microsoft.eShopWeb.ApplicationCore.Entities.OrderAggregate; using Microsoft.eShopWeb.ApplicationCore.Interfaces; using Microsoft.eShopWeb.ApplicationCore.Specifications; using Microsoft.eShopWeb.Web.ViewModels; @@ -10,17 +11,18 @@ namespace Microsoft.eShopWeb.Web.Features.OrderDetails { public class GetOrderDetailsHandler : IRequestHandler { - private readonly IOrderRepository _orderRepository; + private readonly IReadRepository _orderRepository; - public GetOrderDetailsHandler(IOrderRepository orderRepository) + public GetOrderDetailsHandler(IReadRepository orderRepository) { _orderRepository = orderRepository; } - public async Task Handle(GetOrderDetails request, CancellationToken cancellationToken) + public async Task Handle(GetOrderDetails request, + CancellationToken cancellationToken) { - var customerOrders = await _orderRepository.ListAsync(new CustomerOrdersWithItemsSpecification(request.UserName), cancellationToken); - var order = customerOrders.FirstOrDefault(o => o.Id == request.OrderId); + var spec = new OrderWithItemsByIdSpec(request.OrderId); + var order = await _orderRepository.GetBySpecAsync(spec, cancellationToken); if (order == null) { diff --git a/src/Web/Services/BasketViewModelService.cs b/src/Web/Services/BasketViewModelService.cs index b6a948c..4c032da 100644 --- a/src/Web/Services/BasketViewModelService.cs +++ b/src/Web/Services/BasketViewModelService.cs @@ -12,12 +12,12 @@ namespace Microsoft.eShopWeb.Web.Services { public class BasketViewModelService : IBasketViewModelService { - private readonly IAsyncRepository _basketRepository; + private readonly IRepository _basketRepository; private readonly IUriComposer _uriComposer; - private readonly IAsyncRepository _itemRepository; + private readonly IRepository _itemRepository; - public BasketViewModelService(IAsyncRepository basketRepository, - IAsyncRepository itemRepository, + public BasketViewModelService(IRepository basketRepository, + IRepository itemRepository, IUriComposer uriComposer) { _basketRepository = basketRepository; @@ -28,7 +28,7 @@ namespace Microsoft.eShopWeb.Web.Services public async Task GetOrCreateBasketForUser(string userName) { var basketSpec = new BasketWithItemsSpecification(userName); - var basket = (await _basketRepository.FirstOrDefaultAsync(basketSpec)); + var basket = (await _basketRepository.GetBySpecAsync(basketSpec)); if (basket == null) { diff --git a/src/Web/Services/CatalogItemViewModelService.cs b/src/Web/Services/CatalogItemViewModelService.cs index fad2852..f7bbd75 100644 --- a/src/Web/Services/CatalogItemViewModelService.cs +++ b/src/Web/Services/CatalogItemViewModelService.cs @@ -8,9 +8,9 @@ namespace Microsoft.eShopWeb.Web.Services { public class CatalogItemViewModelService : ICatalogItemViewModelService { - private readonly IAsyncRepository _catalogItemRepository; + private readonly IRepository _catalogItemRepository; - public CatalogItemViewModelService(IAsyncRepository catalogItemRepository) + public CatalogItemViewModelService(IRepository catalogItemRepository) { _catalogItemRepository = catalogItemRepository; } diff --git a/src/Web/Services/CatalogViewModelService.cs b/src/Web/Services/CatalogViewModelService.cs index 0e44854..b803764 100644 --- a/src/Web/Services/CatalogViewModelService.cs +++ b/src/Web/Services/CatalogViewModelService.cs @@ -18,16 +18,16 @@ namespace Microsoft.eShopWeb.Web.Services public class CatalogViewModelService : ICatalogViewModelService { private readonly ILogger _logger; - private readonly IAsyncRepository _itemRepository; - private readonly IAsyncRepository _brandRepository; - private readonly IAsyncRepository _typeRepository; + private readonly IRepository _itemRepository; + private readonly IRepository _brandRepository; + private readonly IRepository _typeRepository; private readonly IUriComposer _uriComposer; public CatalogViewModelService( ILoggerFactory loggerFactory, - IAsyncRepository itemRepository, - IAsyncRepository brandRepository, - IAsyncRepository typeRepository, + IRepository itemRepository, + IRepository brandRepository, + IRepository typeRepository, IUriComposer uriComposer) { _logger = loggerFactory.CreateLogger(); @@ -80,7 +80,7 @@ namespace Microsoft.eShopWeb.Web.Services public async Task> GetBrands() { _logger.LogInformation("GetBrands called."); - var brands = await _brandRepository.ListAllAsync(); + var brands = await _brandRepository.ListAsync(); var items = brands .Select(brand => new SelectListItem() { Value = brand.Id.ToString(), Text = brand.Brand }) @@ -96,7 +96,7 @@ namespace Microsoft.eShopWeb.Web.Services public async Task> GetTypes() { _logger.LogInformation("GetTypes called."); - var types = await _typeRepository.ListAllAsync(); + var types = await _typeRepository.ListAsync(); var items = types .Select(type => new SelectListItem() { Value = type.Id.ToString(), Text = type.Type }) diff --git a/src/Web/Web.csproj b/src/Web/Web.csproj index 0f786d2..bf42b5a 100644 --- a/src/Web/Web.csproj +++ b/src/Web/Web.csproj @@ -22,14 +22,14 @@ - + - + diff --git a/tests/IntegrationTests/Repositories/BasketRepositoryTests/SetQuantities.cs b/tests/IntegrationTests/Repositories/BasketRepositoryTests/SetQuantities.cs index 2720262..b01da70 100644 --- a/tests/IntegrationTests/Repositories/BasketRepositoryTests/SetQuantities.cs +++ b/tests/IntegrationTests/Repositories/BasketRepositoryTests/SetQuantities.cs @@ -13,7 +13,7 @@ namespace Microsoft.eShopWeb.IntegrationTests.Repositories.BasketRepositoryTests public class SetQuantities { private readonly CatalogContext _catalogContext; - private readonly IAsyncRepository _basketRepository; + private readonly EfRepository _basketRepository; private readonly BasketBuilder BasketBuilder = new BasketBuilder(); public SetQuantities() diff --git a/tests/IntegrationTests/Repositories/OrderRepositoryTests/GetById.cs b/tests/IntegrationTests/Repositories/OrderRepositoryTests/GetById.cs index 85e53be..beb1688 100644 --- a/tests/IntegrationTests/Repositories/OrderRepositoryTests/GetById.cs +++ b/tests/IntegrationTests/Repositories/OrderRepositoryTests/GetById.cs @@ -1,4 +1,5 @@ using Microsoft.EntityFrameworkCore; +using Microsoft.eShopWeb.ApplicationCore.Entities.OrderAggregate; using Microsoft.eShopWeb.Infrastructure.Data; using Microsoft.eShopWeb.UnitTests.Builders; using System.Linq; @@ -11,7 +12,7 @@ namespace Microsoft.eShopWeb.IntegrationTests.Repositories.OrderRepositoryTests public class GetById { private readonly CatalogContext _catalogContext; - private readonly OrderRepository _orderRepository; + private readonly EfRepository _orderRepository; private OrderBuilder OrderBuilder { get; } = new OrderBuilder(); private readonly ITestOutputHelper _output; public GetById(ITestOutputHelper output) @@ -21,7 +22,7 @@ namespace Microsoft.eShopWeb.IntegrationTests.Repositories.OrderRepositoryTests .UseInMemoryDatabase(databaseName: "TestCatalog") .Options; _catalogContext = new CatalogContext(dbOptions); - _orderRepository = new OrderRepository(_catalogContext); + _orderRepository = new EfRepository(_catalogContext); } [Fact] @@ -37,6 +38,7 @@ namespace Microsoft.eShopWeb.IntegrationTests.Repositories.OrderRepositoryTests Assert.Equal(OrderBuilder.TestBuyerId, orderFromRepo.BuyerId); // Note: Using InMemoryDatabase OrderItems is available. Will be null if using SQL DB. + // Use the OrderWithItemsByIdSpec instead of just GetById to get the full aggregate var firstItem = orderFromRepo.OrderItems.FirstOrDefault(); Assert.Equal(OrderBuilder.TestUnits, firstItem.Units); } diff --git a/tests/IntegrationTests/Repositories/OrderRepositoryTests/GetByIdWithItemsAsync.cs b/tests/IntegrationTests/Repositories/OrderRepositoryTests/GetByIdWithItemsAsync.cs index 15d4d1f..14ae1fb 100644 --- a/tests/IntegrationTests/Repositories/OrderRepositoryTests/GetByIdWithItemsAsync.cs +++ b/tests/IntegrationTests/Repositories/OrderRepositoryTests/GetByIdWithItemsAsync.cs @@ -1,5 +1,6 @@ using Microsoft.EntityFrameworkCore; using Microsoft.eShopWeb.ApplicationCore.Entities.OrderAggregate; +using Microsoft.eShopWeb.ApplicationCore.Specifications; using Microsoft.eShopWeb.Infrastructure.Data; using Microsoft.eShopWeb.UnitTests.Builders; using System.Collections.Generic; @@ -12,7 +13,7 @@ namespace Microsoft.eShopWeb.IntegrationTests.Repositories.OrderRepositoryTests public class GetByIdWithItemsAsync { private readonly CatalogContext _catalogContext; - private readonly OrderRepository _orderRepository; + private readonly EfRepository _orderRepository; private OrderBuilder OrderBuilder { get; } = new OrderBuilder(); public GetByIdWithItemsAsync() @@ -21,7 +22,7 @@ namespace Microsoft.eShopWeb.IntegrationTests.Repositories.OrderRepositoryTests .UseInMemoryDatabase(databaseName: "TestCatalog") .Options; _catalogContext = new CatalogContext(dbOptions); - _orderRepository = new OrderRepository(_catalogContext); + _orderRepository = new EfRepository(_catalogContext); } [Fact] @@ -47,7 +48,8 @@ namespace Microsoft.eShopWeb.IntegrationTests.Repositories.OrderRepositoryTests _catalogContext.SaveChanges(); //Act - var orderFromRepo = await _orderRepository.GetByIdWithItemsAsync(secondOrderId); + var spec = new OrderWithItemsByIdSpec(secondOrderId); + var orderFromRepo = await _orderRepository.GetBySpecAsync(spec); //Assert Assert.Equal(secondOrderId, orderFromRepo.Id); diff --git a/tests/UnitTests/ApplicationCore/Services/BasketServiceTests/AddItemToBasket.cs b/tests/UnitTests/ApplicationCore/Services/BasketServiceTests/AddItemToBasket.cs index 457d0d9..4e38b04 100644 --- a/tests/UnitTests/ApplicationCore/Services/BasketServiceTests/AddItemToBasket.cs +++ b/tests/UnitTests/ApplicationCore/Services/BasketServiceTests/AddItemToBasket.cs @@ -11,25 +11,20 @@ namespace Microsoft.eShopWeb.UnitTests.ApplicationCore.Services.BasketServiceTes public class AddItemToBasket { private readonly string _buyerId = "Test buyerId"; - private readonly Mock> _mockBasketRepo; - - public AddItemToBasket() - { - _mockBasketRepo = new Mock>(); - } + private readonly Mock> _mockBasketRepo = new(); [Fact] public async Task InvokesBasketRepositoryFirstOrDefaultAsyncOnce() { var basket = new Basket(_buyerId); basket.AddItem(1, It.IsAny(), It.IsAny()); - _mockBasketRepo.Setup(x => x.FirstOrDefaultAsync(It.IsAny(), default)).ReturnsAsync(basket); + _mockBasketRepo.Setup(x => x.GetBySpecAsync(It.IsAny(), default)).ReturnsAsync(basket); var basketService = new BasketService(_mockBasketRepo.Object, null); await basketService.AddItemToBasket(basket.Id, 1, 1.50m); - _mockBasketRepo.Verify(x => x.FirstOrDefaultAsync(It.IsAny(), default), Times.Once); + _mockBasketRepo.Verify(x => x.GetBySpecAsync(It.IsAny(), default), Times.Once); } [Fact] @@ -37,7 +32,7 @@ namespace Microsoft.eShopWeb.UnitTests.ApplicationCore.Services.BasketServiceTes { var basket = new Basket(_buyerId); basket.AddItem(1, It.IsAny(), It.IsAny()); - _mockBasketRepo.Setup(x => x.FirstOrDefaultAsync(It.IsAny(), default)).ReturnsAsync(basket); + _mockBasketRepo.Setup(x => x.GetBySpecAsync(It.IsAny(), default)).ReturnsAsync(basket); var basketService = new BasketService(_mockBasketRepo.Object, null); diff --git a/tests/UnitTests/ApplicationCore/Services/BasketServiceTests/DeleteBasket.cs b/tests/UnitTests/ApplicationCore/Services/BasketServiceTests/DeleteBasket.cs index 17ca679..2787a09 100644 --- a/tests/UnitTests/ApplicationCore/Services/BasketServiceTests/DeleteBasket.cs +++ b/tests/UnitTests/ApplicationCore/Services/BasketServiceTests/DeleteBasket.cs @@ -10,12 +10,7 @@ namespace Microsoft.eShopWeb.UnitTests.ApplicationCore.Services.BasketServiceTes public class DeleteBasket { private readonly string _buyerId = "Test buyerId"; - private readonly Mock> _mockBasketRepo; - - public DeleteBasket() - { - _mockBasketRepo = new Mock>(); - } + private readonly Mock> _mockBasketRepo = new(); [Fact] public async Task ShouldInvokeBasketRepositoryDeleteAsyncOnce() diff --git a/tests/UnitTests/ApplicationCore/Services/BasketServiceTests/SetQuantities.cs b/tests/UnitTests/ApplicationCore/Services/BasketServiceTests/SetQuantities.cs index 27ae4b4..df17749 100644 --- a/tests/UnitTests/ApplicationCore/Services/BasketServiceTests/SetQuantities.cs +++ b/tests/UnitTests/ApplicationCore/Services/BasketServiceTests/SetQuantities.cs @@ -1,40 +1,35 @@ -using Microsoft.eShopWeb.ApplicationCore.Entities.BasketAggregate; -using Microsoft.eShopWeb.ApplicationCore.Exceptions; -using Microsoft.eShopWeb.ApplicationCore.Interfaces; -using Microsoft.eShopWeb.ApplicationCore.Services; -using Moq; -using System; +using Microsoft.eShopWeb.ApplicationCore.Entities.BasketAggregate; +using Microsoft.eShopWeb.ApplicationCore.Exceptions; +using Microsoft.eShopWeb.ApplicationCore.Interfaces; +using Microsoft.eShopWeb.ApplicationCore.Services; +using Moq; +using System; using System.Threading.Tasks; -using Xunit; +using Xunit; -namespace Microsoft.eShopWeb.UnitTests.ApplicationCore.Services.BasketServiceTests -{ - public class SetQuantities - { - private readonly int _invalidId = -1; - private readonly Mock> _mockBasketRepo; - - public SetQuantities() - { - _mockBasketRepo = new Mock>(); - } - - [Fact] - public async Task ThrowsGivenInvalidBasketId() - { - var basketService = new BasketService(_mockBasketRepo.Object, null); - - await Assert.ThrowsAsync(async () => - await basketService.SetQuantities(_invalidId, new System.Collections.Generic.Dictionary())); - } - - [Fact] - public async Task ThrowsGivenNullQuantities() - { - var basketService = new BasketService(null, null); - - await Assert.ThrowsAsync(async () => - await basketService.SetQuantities(123, null)); - } - } -} +namespace Microsoft.eShopWeb.UnitTests.ApplicationCore.Services.BasketServiceTests +{ + public class SetQuantities + { + private readonly int _invalidId = -1; + private readonly Mock> _mockBasketRepo = new(); + + [Fact] + public async Task ThrowsGivenInvalidBasketId() + { + var basketService = new BasketService(_mockBasketRepo.Object, null); + + await Assert.ThrowsAsync(async () => + await basketService.SetQuantities(_invalidId, new System.Collections.Generic.Dictionary())); + } + + [Fact] + public async Task ThrowsGivenNullQuantities() + { + var basketService = new BasketService(null, null); + + await Assert.ThrowsAsync(async () => + await basketService.SetQuantities(123, null)); + } + } +} diff --git a/tests/UnitTests/ApplicationCore/Services/BasketServiceTests/TransferBasket.cs b/tests/UnitTests/ApplicationCore/Services/BasketServiceTests/TransferBasket.cs index 8843d87..0932963 100644 --- a/tests/UnitTests/ApplicationCore/Services/BasketServiceTests/TransferBasket.cs +++ b/tests/UnitTests/ApplicationCore/Services/BasketServiceTests/TransferBasket.cs @@ -1,41 +1,36 @@ using Microsoft.eShopWeb.ApplicationCore.Entities.BasketAggregate; using Microsoft.eShopWeb.ApplicationCore.Interfaces; -using Microsoft.eShopWeb.ApplicationCore.Services; +using Microsoft.eShopWeb.ApplicationCore.Services; using Microsoft.eShopWeb.ApplicationCore.Specifications; using Moq; -using System; +using System; using System.Threading.Tasks; -using Xunit; - -namespace Microsoft.eShopWeb.UnitTests.ApplicationCore.Services.BasketServiceTests -{ - public class TransferBasket - { - private readonly string _nonexistentAnonymousBasketBuyerId = "nonexistent-anonymous-basket-buyer-id"; - private readonly string _existentAnonymousBasketBuyerId = "existent-anonymous-basket-buyer-id"; - private readonly string _nonexistentUserBasketBuyerId = "newuser@microsoft.com"; - private readonly string _existentUserBasketBuyerId = "testuser@microsoft.com"; - private readonly Mock> _mockBasketRepo; - - public TransferBasket() +using Xunit; + +namespace Microsoft.eShopWeb.UnitTests.ApplicationCore.Services.BasketServiceTests +{ + public class TransferBasket + { + private readonly string _nonexistentAnonymousBasketBuyerId = "nonexistent-anonymous-basket-buyer-id"; + private readonly string _existentAnonymousBasketBuyerId = "existent-anonymous-basket-buyer-id"; + private readonly string _nonexistentUserBasketBuyerId = "newuser@microsoft.com"; + private readonly string _existentUserBasketBuyerId = "testuser@microsoft.com"; + private readonly Mock> _mockBasketRepo = new(); + + [Fact] + public async Task ThrowsGivenNullAnonymousId() { - _mockBasketRepo = new Mock>(); - } - - [Fact] - public async Task ThrowsGivenNullAnonymousId() - { - var basketService = new BasketService(null, null); - - await Assert.ThrowsAsync(async () => await basketService.TransferBasketAsync(null, "steve")); - } - - [Fact] - public async Task ThrowsGivenNullUserId() - { - var basketService = new BasketService(null, null); - - await Assert.ThrowsAsync(async () => await basketService.TransferBasketAsync("abcdefg", null)); + var basketService = new BasketService(null, null); + + await Assert.ThrowsAsync(async () => await basketService.TransferBasketAsync(null, "steve")); + } + + [Fact] + public async Task ThrowsGivenNullUserId() + { + var basketService = new BasketService(null, null); + + await Assert.ThrowsAsync(async () => await basketService.TransferBasketAsync("abcdefg", null)); } [Fact] @@ -43,12 +38,12 @@ namespace Microsoft.eShopWeb.UnitTests.ApplicationCore.Services.BasketServiceTes { var anonymousBasket = null as Basket; var userBasket = new Basket(_existentUserBasketBuyerId); - _mockBasketRepo.SetupSequence(x => x.FirstOrDefaultAsync(It.IsAny(), default)) + _mockBasketRepo.SetupSequence(x => x.GetBySpecAsync(It.IsAny(), default)) .ReturnsAsync(anonymousBasket) .ReturnsAsync(userBasket); var basketService = new BasketService(_mockBasketRepo.Object, null); await basketService.TransferBasketAsync(_nonexistentAnonymousBasketBuyerId, _existentUserBasketBuyerId); - _mockBasketRepo.Verify(x => x.FirstOrDefaultAsync(It.IsAny(), default), Times.Once); + _mockBasketRepo.Verify(x => x.GetBySpecAsync(It.IsAny(), default), Times.Once); } [Fact] @@ -60,7 +55,7 @@ namespace Microsoft.eShopWeb.UnitTests.ApplicationCore.Services.BasketServiceTes var userBasket = new Basket(_existentUserBasketBuyerId); userBasket.AddItem(1, 10, 4); userBasket.AddItem(2, 99, 3); - _mockBasketRepo.SetupSequence(x => x.FirstOrDefaultAsync(It.IsAny(), default)) + _mockBasketRepo.SetupSequence(x => x.GetBySpecAsync(It.IsAny(), default)) .ReturnsAsync(anonymousBasket) .ReturnsAsync(userBasket); var basketService = new BasketService(_mockBasketRepo.Object, null); @@ -77,7 +72,7 @@ namespace Microsoft.eShopWeb.UnitTests.ApplicationCore.Services.BasketServiceTes { var anonymousBasket = new Basket(_existentAnonymousBasketBuyerId); var userBasket = new Basket(_existentUserBasketBuyerId); - _mockBasketRepo.SetupSequence(x => x.FirstOrDefaultAsync(It.IsAny(), default)) + _mockBasketRepo.SetupSequence(x => x.GetBySpecAsync(It.IsAny(), default)) .ReturnsAsync(anonymousBasket) .ReturnsAsync(userBasket); var basketService = new BasketService(_mockBasketRepo.Object, null); @@ -91,12 +86,12 @@ namespace Microsoft.eShopWeb.UnitTests.ApplicationCore.Services.BasketServiceTes { var anonymousBasket = new Basket(_existentAnonymousBasketBuyerId); var userBasket = null as Basket; - _mockBasketRepo.SetupSequence(x => x.FirstOrDefaultAsync(It.IsAny(), default)) + _mockBasketRepo.SetupSequence(x => x.GetBySpecAsync(It.IsAny(), default)) .ReturnsAsync(anonymousBasket) .ReturnsAsync(userBasket); var basketService = new BasketService(_mockBasketRepo.Object, null); await basketService.TransferBasketAsync(_existentAnonymousBasketBuyerId, _nonexistentUserBasketBuyerId); _mockBasketRepo.Verify(x => x.AddAsync(It.Is(x => x.BuyerId == _nonexistentUserBasketBuyerId), default), Times.Once); } - } -} + } +} diff --git a/tests/UnitTests/ApplicationCore/Specifications/BasketWithItemsSpecification.cs b/tests/UnitTests/ApplicationCore/Specifications/BasketWithItemsSpecification.cs index 2b6297a..ee8ec53 100644 --- a/tests/UnitTests/ApplicationCore/Specifications/BasketWithItemsSpecification.cs +++ b/tests/UnitTests/ApplicationCore/Specifications/BasketWithItemsSpecification.cs @@ -1,5 +1,4 @@ -using Ardalis.Specification.EntityFrameworkCore; -using Microsoft.eShopWeb.ApplicationCore.Entities.BasketAggregate; +using Microsoft.eShopWeb.ApplicationCore.Entities.BasketAggregate; using Microsoft.eShopWeb.ApplicationCore.Specifications; using Moq; using System.Collections.Generic; @@ -13,16 +12,12 @@ namespace Microsoft.eShopWeb.UnitTests.ApplicationCore.Specifications private readonly int _testBasketId = 123; private readonly string _buyerId = "Test buyerId"; - // tests with specifications can use an evaluator or just WhereExpressions.FirstOrDefault if only one - private readonly SpecificationEvaluator _evaluator = new SpecificationEvaluator(); - [Fact] public void MatchesBasketWithGivenBasketId() { var spec = new BasketWithItemsSpecification(_testBasketId); - var result = _evaluator.GetQuery(GetTestBasketCollection().AsQueryable(), spec) - .FirstOrDefault(); + var result = spec.Evaluate(GetTestBasketCollection()).FirstOrDefault(); Assert.NotNull(result); Assert.Equal(_testBasketId, result.Id); @@ -34,8 +29,7 @@ namespace Microsoft.eShopWeb.UnitTests.ApplicationCore.Specifications int badBasketId = -1; var spec = new BasketWithItemsSpecification(badBasketId); - var result = _evaluator.GetQuery(GetTestBasketCollection().AsQueryable(), spec) - .Any(); + var result = spec.Evaluate(GetTestBasketCollection()).Any(); Assert.False(result); } @@ -45,8 +39,7 @@ namespace Microsoft.eShopWeb.UnitTests.ApplicationCore.Specifications { var spec = new BasketWithItemsSpecification(_buyerId); - var result = _evaluator.GetQuery(GetTestBasketCollection().AsQueryable(), spec) - .FirstOrDefault(); + var result = spec.Evaluate(GetTestBasketCollection()).FirstOrDefault(); Assert.NotNull(result); Assert.Equal(_buyerId, result.BuyerId); @@ -58,8 +51,7 @@ namespace Microsoft.eShopWeb.UnitTests.ApplicationCore.Specifications string badBuyerId = "badBuyerId"; var spec = new BasketWithItemsSpecification(badBuyerId); - var result = _evaluator.GetQuery(GetTestBasketCollection().AsQueryable(), spec) - .Any(); + var result = spec.Evaluate(GetTestBasketCollection()).Any(); Assert.False(result); } diff --git a/tests/UnitTests/MediatorHandlers/OrdersTests/GetMyOrders.cs b/tests/UnitTests/MediatorHandlers/OrdersTests/GetMyOrders.cs index 3ee3e5c..c693b40 100644 --- a/tests/UnitTests/MediatorHandlers/OrdersTests/GetMyOrders.cs +++ b/tests/UnitTests/MediatorHandlers/OrdersTests/GetMyOrders.cs @@ -12,7 +12,7 @@ namespace Microsoft.eShopWeb.UnitTests.MediatorHandlers.OrdersTests { public class GetMyOrders { - private readonly Mock _mockOrderRepository; + private readonly Mock> _mockOrderRepository; public GetMyOrders() { @@ -20,12 +20,12 @@ namespace Microsoft.eShopWeb.UnitTests.MediatorHandlers.OrdersTests var address = new Address(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()); Order order = new Order("buyerId", address, new List { item }); - _mockOrderRepository = new Mock(); + _mockOrderRepository = new Mock>(); _mockOrderRepository.Setup(x => x.ListAsync(It.IsAny>(),default)).ReturnsAsync(new List { order }); } [Fact] - public async Task NotReturnNullIfOrdersArePresent() + public async Task NotReturnNullIfOrdersArePresIent() { var request = new eShopWeb.Web.Features.MyOrders.GetMyOrders("SomeUserName"); diff --git a/tests/UnitTests/MediatorHandlers/OrdersTests/GetOrderDetails.cs b/tests/UnitTests/MediatorHandlers/OrdersTests/GetOrderDetails.cs index bd1d032..76afcec 100644 --- a/tests/UnitTests/MediatorHandlers/OrdersTests/GetOrderDetails.cs +++ b/tests/UnitTests/MediatorHandlers/OrdersTests/GetOrderDetails.cs @@ -1,6 +1,7 @@ using Ardalis.Specification; using Microsoft.eShopWeb.ApplicationCore.Entities.OrderAggregate; using Microsoft.eShopWeb.ApplicationCore.Interfaces; +using Microsoft.eShopWeb.ApplicationCore.Specifications; using Microsoft.eShopWeb.Web.Features.OrderDetails; using Moq; using System.Collections.Generic; @@ -12,7 +13,7 @@ namespace Microsoft.eShopWeb.UnitTests.MediatorHandlers.OrdersTests { public class GetOrderDetails { - private readonly Mock _mockOrderRepository; + private readonly Mock> _mockOrderRepository; public GetOrderDetails() { @@ -20,8 +21,9 @@ namespace Microsoft.eShopWeb.UnitTests.MediatorHandlers.OrdersTests var address = new Address(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()); Order order = new Order("buyerId", address, new List { item }); - _mockOrderRepository = new Mock(); - _mockOrderRepository.Setup(x => x.ListAsync(It.IsAny>(),default)).ReturnsAsync(new List { order }); + _mockOrderRepository = new Mock>(); + _mockOrderRepository.Setup(x => x.GetBySpecAsync(It.IsAny(),default)) + .ReturnsAsync(order); } [Fact] @@ -35,17 +37,5 @@ namespace Microsoft.eShopWeb.UnitTests.MediatorHandlers.OrdersTests Assert.NotNull(result); } - - [Fact] - public async Task BeNullIfOrderNotFound() - { - var request = new eShopWeb.Web.Features.OrderDetails.GetOrderDetails("SomeUserName", 100); - - var handler = new GetOrderDetailsHandler(_mockOrderRepository.Object); - - var result = await handler.Handle(request, CancellationToken.None); - - Assert.Null(result); - } } }