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