forked from dotnet-architecture/eShopOnWeb
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Mediatr example (dotnet-architecture#325)
* 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 constant
- Loading branch information
1 parent
1bae9e6
commit 29d1497
Showing
12 changed files
with
240 additions
and
67 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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; | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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() | ||
}); | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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; | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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() | ||
}; | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
38 changes: 38 additions & 0 deletions
38
tests/UnitTests/MediatorHandlers/OrdersTests/GetMyOrders_Should.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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); | ||
} | ||
} | ||
} |
Oops, something went wrong.