Browse Source
* Updates based on documentation * Getting the build passing * Getting app functioning * A few cleanups to confirm it's working as expected * Fixing functional tests * Updating dockerfile for 3.0 * Functional Tests now run sequentially * Updating to latest version of moq * Adding migration for post 3.0 upgrades * Removing commented out lines * Moving address and catalogitemordered configuration in to classes that own them * Installing MediatR nuget packages * Configure MediatR in Startup * Creating GetMyOrders MediatR query and handler * Adding GetOrderDetails MediatR handler * Refactoring out default values * Added tests for GetOrderDetails mediator handler * Defaulting values on Models for now * Removing some spaces * Splitting files * Splitting out the GetOrderDetails files * Adding test for GetMyOrders * restructuing folders * Using constantmain
committed by
Steve Smith
12 changed files with 240 additions and 67 deletions
@ -0,0 +1,16 @@ |
|||||
|
using MediatR; |
||||
|
using Microsoft.eShopWeb.Web.ViewModels; |
||||
|
using System.Collections.Generic; |
||||
|
|
||||
|
namespace Microsoft.eShopWeb.Web.Features.MyOrders |
||||
|
{ |
||||
|
public class GetMyOrders : IRequest<IEnumerable<OrderViewModel>> |
||||
|
{ |
||||
|
public string UserName { get; set; } |
||||
|
|
||||
|
public GetMyOrders(string userName) |
||||
|
{ |
||||
|
UserName = userName; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,43 @@ |
|||||
|
using MediatR; |
||||
|
using Microsoft.eShopWeb.ApplicationCore.Interfaces; |
||||
|
using Microsoft.eShopWeb.ApplicationCore.Specifications; |
||||
|
using Microsoft.eShopWeb.Web.ViewModels; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Linq; |
||||
|
using System.Threading; |
||||
|
using System.Threading.Tasks; |
||||
|
|
||||
|
namespace Microsoft.eShopWeb.Web.Features.MyOrders |
||||
|
{ |
||||
|
public class GetMyOrdersHandler : IRequestHandler<GetMyOrders, IEnumerable<OrderViewModel>> |
||||
|
{ |
||||
|
private readonly IOrderRepository _orderRepository; |
||||
|
|
||||
|
public GetMyOrdersHandler(IOrderRepository orderRepository) |
||||
|
{ |
||||
|
_orderRepository = orderRepository; |
||||
|
} |
||||
|
|
||||
|
public async Task<IEnumerable<OrderViewModel>> Handle(GetMyOrders request, CancellationToken cancellationToken) |
||||
|
{ |
||||
|
var specification = new CustomerOrdersWithItemsSpecification(request.UserName); |
||||
|
var orders = await _orderRepository.ListAsync(specification); |
||||
|
|
||||
|
return orders.Select(o => new OrderViewModel |
||||
|
{ |
||||
|
OrderDate = o.OrderDate, |
||||
|
OrderItems = o.OrderItems?.Select(oi => new OrderItemViewModel() |
||||
|
{ |
||||
|
PictureUrl = oi.ItemOrdered.PictureUri, |
||||
|
ProductId = oi.ItemOrdered.CatalogItemId, |
||||
|
ProductName = oi.ItemOrdered.ProductName, |
||||
|
UnitPrice = oi.UnitPrice, |
||||
|
Units = oi.Units |
||||
|
}).ToList(), |
||||
|
OrderNumber = o.Id, |
||||
|
ShippingAddress = o.ShipToAddress, |
||||
|
Total = o.Total() |
||||
|
}); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,17 @@ |
|||||
|
using MediatR; |
||||
|
using Microsoft.eShopWeb.Web.ViewModels; |
||||
|
|
||||
|
namespace Microsoft.eShopWeb.Web.Features.OrderDetails |
||||
|
{ |
||||
|
public class GetOrderDetails : IRequest<OrderViewModel> |
||||
|
{ |
||||
|
public string UserName { get; set; } |
||||
|
public int OrderId { get; set; } |
||||
|
|
||||
|
public GetOrderDetails(string userName, int orderId) |
||||
|
{ |
||||
|
UserName = userName; |
||||
|
OrderId = orderId; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,47 @@ |
|||||
|
using MediatR; |
||||
|
using Microsoft.eShopWeb.ApplicationCore.Interfaces; |
||||
|
using Microsoft.eShopWeb.ApplicationCore.Specifications; |
||||
|
using Microsoft.eShopWeb.Web.ViewModels; |
||||
|
using System.Linq; |
||||
|
using System.Threading; |
||||
|
using System.Threading.Tasks; |
||||
|
|
||||
|
namespace Microsoft.eShopWeb.Web.Features.OrderDetails |
||||
|
{ |
||||
|
public class GetOrderDetailsHandler : IRequestHandler<GetOrderDetails, OrderViewModel> |
||||
|
{ |
||||
|
private readonly IOrderRepository _orderRepository; |
||||
|
|
||||
|
public GetOrderDetailsHandler(IOrderRepository orderRepository) |
||||
|
{ |
||||
|
_orderRepository = orderRepository; |
||||
|
} |
||||
|
|
||||
|
public async Task<OrderViewModel> Handle(GetOrderDetails request, CancellationToken cancellationToken) |
||||
|
{ |
||||
|
var customerOrders = await _orderRepository.ListAsync(new CustomerOrdersWithItemsSpecification(request.UserName)); |
||||
|
var order = customerOrders.FirstOrDefault(o => o.Id == request.OrderId); |
||||
|
|
||||
|
if (order == null) |
||||
|
{ |
||||
|
return null; |
||||
|
} |
||||
|
|
||||
|
return new OrderViewModel |
||||
|
{ |
||||
|
OrderDate = order.OrderDate, |
||||
|
OrderItems = order.OrderItems.Select(oi => new OrderItemViewModel |
||||
|
{ |
||||
|
PictureUrl = oi.ItemOrdered.PictureUri, |
||||
|
ProductId = oi.ItemOrdered.CatalogItemId, |
||||
|
ProductName = oi.ItemOrdered.ProductName, |
||||
|
UnitPrice = oi.UnitPrice, |
||||
|
Units = oi.Units |
||||
|
}).ToList(), |
||||
|
OrderNumber = order.Id, |
||||
|
ShippingAddress = order.ShipToAddress, |
||||
|
Total = order.Total() |
||||
|
}; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,38 @@ |
|||||
|
using Microsoft.eShopWeb.ApplicationCore.Entities.OrderAggregate; |
||||
|
using Microsoft.eShopWeb.ApplicationCore.Interfaces; |
||||
|
using Microsoft.eShopWeb.Web.Features.MyOrders; |
||||
|
using Moq; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Threading; |
||||
|
using System.Threading.Tasks; |
||||
|
using Xunit; |
||||
|
|
||||
|
namespace Microsoft.eShopWeb.UnitTests.MediatorHandlers.OrdersTests |
||||
|
{ |
||||
|
public class GetMyOrders_Should |
||||
|
{ |
||||
|
private readonly Mock<IOrderRepository> _mockOrderRepository; |
||||
|
|
||||
|
public GetMyOrders_Should() |
||||
|
{ |
||||
|
var item = new OrderItem(new CatalogItemOrdered(1, "ProductName", "URI"), 10.00m, 10); |
||||
|
var address = new Address(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>()); |
||||
|
Order order = new Order("buyerId", address, new List<OrderItem> { item }); |
||||
|
|
||||
|
_mockOrderRepository = new Mock<IOrderRepository>(); |
||||
|
_mockOrderRepository.Setup(x => x.ListAsync(It.IsAny<ISpecification<Order>>())).ReturnsAsync(new List<Order> { order }); |
||||
|
} |
||||
|
|
||||
|
[Fact] |
||||
|
public async Task NotReturnNull_If_OrdersArePresent() |
||||
|
{ |
||||
|
var request = new GetMyOrders("SomeUserName"); |
||||
|
|
||||
|
var handler = new GetMyOrdersHandler(_mockOrderRepository.Object); |
||||
|
|
||||
|
var result = await handler.Handle(request, CancellationToken.None); |
||||
|
|
||||
|
Assert.NotNull(result); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,50 @@ |
|||||
|
using Microsoft.eShopWeb.ApplicationCore.Entities.OrderAggregate; |
||||
|
using Microsoft.eShopWeb.ApplicationCore.Interfaces; |
||||
|
using Microsoft.eShopWeb.Web.Features.OrderDetails; |
||||
|
using Moq; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Threading; |
||||
|
using System.Threading.Tasks; |
||||
|
using Xunit; |
||||
|
|
||||
|
namespace Microsoft.eShopWeb.UnitTests.MediatorHandlers.OrdersTests |
||||
|
{ |
||||
|
public class GetOrderDetails_Should |
||||
|
{ |
||||
|
private readonly Mock<IOrderRepository> _mockOrderRepository; |
||||
|
|
||||
|
public GetOrderDetails_Should() |
||||
|
{ |
||||
|
var item = new OrderItem(new CatalogItemOrdered(1, "ProductName", "URI"), 10.00m, 10); |
||||
|
var address = new Address(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>()); |
||||
|
Order order = new Order("buyerId", address, new List<OrderItem> { item }); |
||||
|
|
||||
|
_mockOrderRepository = new Mock<IOrderRepository>(); |
||||
|
_mockOrderRepository.Setup(x => x.ListAsync(It.IsAny<ISpecification<Order>>())).ReturnsAsync(new List<Order> { order }); |
||||
|
} |
||||
|
|
||||
|
[Fact] |
||||
|
public async Task NotBeNull_If_Order_Exists() |
||||
|
{ |
||||
|
var request = new GetOrderDetails("SomeUserName", 0); |
||||
|
|
||||
|
var handler = new GetOrderDetailsHandler(_mockOrderRepository.Object); |
||||
|
|
||||
|
var result = await handler.Handle(request, CancellationToken.None); |
||||
|
|
||||
|
Assert.NotNull(result); |
||||
|
} |
||||
|
|
||||
|
[Fact] |
||||
|
public async Task BeNull_If_Order_Not_found() |
||||
|
{ |
||||
|
var request = new GetOrderDetails("SomeUserName", 100); |
||||
|
|
||||
|
var handler = new GetOrderDetailsHandler(_mockOrderRepository.Object); |
||||
|
|
||||
|
var result = await handler.Handle(request, CancellationToken.None); |
||||
|
|
||||
|
Assert.Null(result); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
Loading…
Reference in new issue