From e813332890150e10952099f930bae68cbabfb658 Mon Sep 17 00:00:00 2001 From: Bill Wagner Date: Thu, 27 Apr 2017 17:45:34 -0400 Subject: [PATCH 1/2] Fix API signatures for collections The methods that return collections should return Task> not Task --- .../Ordering.API/Application/Queries/IOrderQueries.cs | 5 +++-- .../Ordering.API/Application/Queries/OrderQueries.cs | 8 ++++---- .../UnitTest/Ordering/Application/OrdersWebApiTest.cs | 5 +++-- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/Services/Ordering/Ordering.API/Application/Queries/IOrderQueries.cs b/src/Services/Ordering/Ordering.API/Application/Queries/IOrderQueries.cs index 8d78524ea..253b01e9c 100644 --- a/src/Services/Ordering/Ordering.API/Application/Queries/IOrderQueries.cs +++ b/src/Services/Ordering/Ordering.API/Application/Queries/IOrderQueries.cs @@ -1,13 +1,14 @@ namespace Microsoft.eShopOnContainers.Services.Ordering.API.Application.Queries { + using System.Collections.Generic; using System.Threading.Tasks; public interface IOrderQueries { Task GetOrderAsync(int id); - Task GetOrdersAsync(); + Task> GetOrdersAsync(); - Task GetCardTypesAsync(); + Task> GetCardTypesAsync(); } } diff --git a/src/Services/Ordering/Ordering.API/Application/Queries/OrderQueries.cs b/src/Services/Ordering/Ordering.API/Application/Queries/OrderQueries.cs index 9d909e254..afcfc71b5 100644 --- a/src/Services/Ordering/Ordering.API/Application/Queries/OrderQueries.cs +++ b/src/Services/Ordering/Ordering.API/Application/Queries/OrderQueries.cs @@ -44,13 +44,13 @@ } } - public async Task GetOrdersAsync() + public Task> GetOrdersAsync() { using (var connection = new SqlConnection(_connectionString)) { connection.Open(); - return await connection.QueryAsync(@"SELECT o.[Id] as ordernumber,o.[OrderDate] as [date],os.[Name] as [status],SUM(oi.units*oi.unitprice) as total + return connection.QueryAsync(@"SELECT o.[Id] as ordernumber,o.[OrderDate] as [date],os.[Name] as [status],SUM(oi.units*oi.unitprice) as total FROM [ordering].[Orders] o LEFT JOIN[ordering].[orderitems] oi ON o.Id = oi.orderid LEFT JOIN[ordering].[orderstatus] os on o.OrderStatusId = os.Id @@ -58,13 +58,13 @@ } } - public async Task GetCardTypesAsync() + public Task> GetCardTypesAsync() { using (var connection = new SqlConnection(_connectionString)) { connection.Open(); - return await connection.QueryAsync("SELECT * FROM ordering.cardtypes"); + return connection.QueryAsync("SELECT * FROM ordering.cardtypes"); } } diff --git a/test/Services/UnitTest/Ordering/Application/OrdersWebApiTest.cs b/test/Services/UnitTest/Ordering/Application/OrdersWebApiTest.cs index 8c7659862..c0656f050 100644 --- a/test/Services/UnitTest/Ordering/Application/OrdersWebApiTest.cs +++ b/test/Services/UnitTest/Ordering/Application/OrdersWebApiTest.cs @@ -6,6 +6,7 @@ using Microsoft.eShopOnContainers.Services.Ordering.API.Controllers; using Microsoft.eShopOnContainers.Services.Ordering.API.Infrastructure.Services; using Moq; using System; +using System.Linq; using System.Threading.Tasks; using Xunit; @@ -59,7 +60,7 @@ namespace UnitTest.Ordering.Application public async Task Get_orders_success() { //Arrange - var fakeDynamicResult = new Object(); + var fakeDynamicResult = Enumerable.Empty(); _orderQueriesMock.Setup(x => x.GetOrdersAsync()) .Returns(Task.FromResult(fakeDynamicResult)); @@ -92,7 +93,7 @@ namespace UnitTest.Ordering.Application public async Task Get_cardTypes_success() { //Arrange - var fakeDynamicResult = new Object(); + var fakeDynamicResult = Enumerable.Empty(); _orderQueriesMock.Setup(x => x.GetCardTypesAsync()) .Returns(Task.FromResult(fakeDynamicResult)); From aa69e110959ee900c943fc2604efead1ef414a77 Mon Sep 17 00:00:00 2001 From: BillWagner Date: Tue, 2 May 2017 16:21:21 -0400 Subject: [PATCH 2/2] add back the async state machine Because of the using blocks, these one line methods need the async modifier so that the that async state machiner is created. Otherwise, if the method does not complete synchronously, the connection is closed before the database has returned its results. --- .../Ordering.API/Application/Queries/OrderQueries.cs | 8 ++++---- .../Ordering/Ordering.API/Controllers/OrdersController.cs | 5 +++-- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/Services/Ordering/Ordering.API/Application/Queries/OrderQueries.cs b/src/Services/Ordering/Ordering.API/Application/Queries/OrderQueries.cs index afcfc71b5..e51cf04ce 100644 --- a/src/Services/Ordering/Ordering.API/Application/Queries/OrderQueries.cs +++ b/src/Services/Ordering/Ordering.API/Application/Queries/OrderQueries.cs @@ -44,13 +44,13 @@ } } - public Task> GetOrdersAsync() + public async Task> GetOrdersAsync() { using (var connection = new SqlConnection(_connectionString)) { connection.Open(); - return connection.QueryAsync(@"SELECT o.[Id] as ordernumber,o.[OrderDate] as [date],os.[Name] as [status],SUM(oi.units*oi.unitprice) as total + return await connection.QueryAsync(@"SELECT o.[Id] as ordernumber,o.[OrderDate] as [date],os.[Name] as [status],SUM(oi.units*oi.unitprice) as total FROM [ordering].[Orders] o LEFT JOIN[ordering].[orderitems] oi ON o.Id = oi.orderid LEFT JOIN[ordering].[orderstatus] os on o.OrderStatusId = os.Id @@ -58,13 +58,13 @@ } } - public Task> GetCardTypesAsync() + public async Task> GetCardTypesAsync() { using (var connection = new SqlConnection(_connectionString)) { connection.Open(); - return connection.QueryAsync("SELECT * FROM ordering.cardtypes"); + return await connection.QueryAsync("SELECT * FROM ordering.cardtypes"); } } diff --git a/src/Services/Ordering/Ordering.API/Controllers/OrdersController.cs b/src/Services/Ordering/Ordering.API/Controllers/OrdersController.cs index 05a9cd193..20c1e023f 100644 --- a/src/Services/Ordering/Ordering.API/Controllers/OrdersController.cs +++ b/src/Services/Ordering/Ordering.API/Controllers/OrdersController.cs @@ -68,8 +68,9 @@ namespace Microsoft.eShopOnContainers.Services.Ordering.API.Controllers [HttpGet] public async Task GetOrders() { - var orders = await _orderQueries - .GetOrdersAsync(); + var orderTask = _orderQueries.GetOrdersAsync(); + + var orders = await orderTask; return Ok(orders); }