From ac146f44759ba08d9a2b2bfa0834719df09bfcb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Ca=C3=B1izares=20Est=C3=A9vez?= Date: Thu, 22 Dec 2016 13:20:12 +0100 Subject: [PATCH] Added Unit Test Project for services --- docker-compose.override.yml | 2 +- eShopOnContainers.sln | 100 ++++++------ .../Configuration/Config.cs | 3 +- .../Controllers/OrdersController.cs | 25 ++- .../Services/IIdentityService.cs | 12 ++ .../Services/IdentityService.cs | 29 ++++ src/Services/Ordering/Ordering.API/Startup.cs | 5 + .../Queries/OrderQueries.cs | 29 +++- src/Web/WebMVC/Startup.cs | 8 +- .../UnitTest/Catalog/CatalogControllertest.cs | 34 ++++ .../Application/NewOrderCommandHandlerTest.cs | 92 +++++++++++ .../Controllers/OrderControllerTest.cs | 152 ++++++++++++++++++ .../UnitTest/Properties/AssemblyInfo.cs | 19 +++ test/Services/UnitTest/UnitTest.xproj | 22 +++ test/Services/UnitTest/project.json | 24 +++ .../UnitTests/Ordering/OrderControllerTest.cs | 50 ++++++ .../UnitTests/Properties/AssemblyInfo.cs | 36 +++++ .../UnitTests__/UnitTests/UnitTests.csproj | 117 ++++++++++++++ .../UnitTests__/UnitTests/packages.config | 12 ++ 19 files changed, 696 insertions(+), 75 deletions(-) create mode 100644 src/Services/Ordering/Ordering.API/Infrastructure/Services/IIdentityService.cs create mode 100644 src/Services/Ordering/Ordering.API/Infrastructure/Services/IdentityService.cs create mode 100644 test/Services/UnitTest/Catalog/CatalogControllertest.cs create mode 100644 test/Services/UnitTest/Ordering/Application/NewOrderCommandHandlerTest.cs create mode 100644 test/Services/UnitTest/Ordering/Controllers/OrderControllerTest.cs create mode 100644 test/Services/UnitTest/Properties/AssemblyInfo.cs create mode 100644 test/Services/UnitTest/UnitTest.xproj create mode 100644 test/Services/UnitTest/project.json create mode 100644 test/Services/UnitTests__/UnitTests/Ordering/OrderControllerTest.cs create mode 100644 test/Services/UnitTests__/UnitTests/Properties/AssemblyInfo.cs create mode 100644 test/Services/UnitTests__/UnitTests/UnitTests.csproj create mode 100644 test/Services/UnitTests__/UnitTests/packages.config diff --git a/docker-compose.override.yml b/docker-compose.override.yml index f8138e794..5cd817bb8 100644 --- a/docker-compose.override.yml +++ b/docker-compose.override.yml @@ -62,7 +62,7 @@ services: - SpaClient=http://localhost:5104 - ConnectionStrings__DefaultConnection=Server=sql.data;Database=Microsoft.eShopOnContainers.Service.IdentityDb;User Id=sa;Password=Pass@word #- MvcClient=http://13.88.8.119:5100 #Remote: VM Needs to have public access at 5105. - - MvcClient=http://localhost:5100 #Local: You need a entry in windows host file to run identity in local docker. + #- MvcClient=http://localhost:5100 #Local: You need a entry in windows host file to run identity in local docker. - MvcClient=http://10.0.75.1:5100 #Local: You need to open windows firewall at range 5100-5105. ports: - "5105:5105" diff --git a/eShopOnContainers.sln b/eShopOnContainers.sln index f23ec5b12..53013c1cb 100644 --- a/eShopOnContainers.sln +++ b/eShopOnContainers.sln @@ -73,7 +73,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "eShopOnContainers.UITests", EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "eShopOnContainers.Core", "src\Mobile\eShopOnContainers\eShopOnContainers.Core\eShopOnContainers.Core.csproj", "{67F9D3A8-F71E-4428-913F-C37AE82CDB24}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Ordering.Application", "src\Services\Ordering\Ordering.Application\Ordering.Application.xproj", "{4193CAA3-A1C3-4818-A06F-A2D85FDE77E7}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "UnitTest", "test\Services\UnitTest\UnitTest.xproj", "{7796F5D8-31FC-45A4-B673-19DE5BA194CF}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -908,54 +908,54 @@ Global {67F9D3A8-F71E-4428-913F-C37AE82CDB24}.Release|x64.Build.0 = Release|Any CPU {67F9D3A8-F71E-4428-913F-C37AE82CDB24}.Release|x86.ActiveCfg = Release|Any CPU {67F9D3A8-F71E-4428-913F-C37AE82CDB24}.Release|x86.Build.0 = Release|Any CPU - {4193CAA3-A1C3-4818-A06F-A2D85FDE77E7}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU - {4193CAA3-A1C3-4818-A06F-A2D85FDE77E7}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU - {4193CAA3-A1C3-4818-A06F-A2D85FDE77E7}.Ad-Hoc|ARM.ActiveCfg = Debug|Any CPU - {4193CAA3-A1C3-4818-A06F-A2D85FDE77E7}.Ad-Hoc|ARM.Build.0 = Debug|Any CPU - {4193CAA3-A1C3-4818-A06F-A2D85FDE77E7}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU - {4193CAA3-A1C3-4818-A06F-A2D85FDE77E7}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU - {4193CAA3-A1C3-4818-A06F-A2D85FDE77E7}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Debug|Any CPU - {4193CAA3-A1C3-4818-A06F-A2D85FDE77E7}.Ad-Hoc|iPhoneSimulator.Build.0 = Debug|Any CPU - {4193CAA3-A1C3-4818-A06F-A2D85FDE77E7}.Ad-Hoc|x64.ActiveCfg = Debug|Any CPU - {4193CAA3-A1C3-4818-A06F-A2D85FDE77E7}.Ad-Hoc|x64.Build.0 = Debug|Any CPU - {4193CAA3-A1C3-4818-A06F-A2D85FDE77E7}.Ad-Hoc|x86.ActiveCfg = Debug|Any CPU - {4193CAA3-A1C3-4818-A06F-A2D85FDE77E7}.Ad-Hoc|x86.Build.0 = Debug|Any CPU - {4193CAA3-A1C3-4818-A06F-A2D85FDE77E7}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU - {4193CAA3-A1C3-4818-A06F-A2D85FDE77E7}.AppStore|Any CPU.Build.0 = Debug|Any CPU - {4193CAA3-A1C3-4818-A06F-A2D85FDE77E7}.AppStore|ARM.ActiveCfg = Debug|Any CPU - {4193CAA3-A1C3-4818-A06F-A2D85FDE77E7}.AppStore|ARM.Build.0 = Debug|Any CPU - {4193CAA3-A1C3-4818-A06F-A2D85FDE77E7}.AppStore|iPhone.ActiveCfg = Debug|Any CPU - {4193CAA3-A1C3-4818-A06F-A2D85FDE77E7}.AppStore|iPhone.Build.0 = Debug|Any CPU - {4193CAA3-A1C3-4818-A06F-A2D85FDE77E7}.AppStore|iPhoneSimulator.ActiveCfg = Debug|Any CPU - {4193CAA3-A1C3-4818-A06F-A2D85FDE77E7}.AppStore|iPhoneSimulator.Build.0 = Debug|Any CPU - {4193CAA3-A1C3-4818-A06F-A2D85FDE77E7}.AppStore|x64.ActiveCfg = Debug|Any CPU - {4193CAA3-A1C3-4818-A06F-A2D85FDE77E7}.AppStore|x64.Build.0 = Debug|Any CPU - {4193CAA3-A1C3-4818-A06F-A2D85FDE77E7}.AppStore|x86.ActiveCfg = Debug|Any CPU - {4193CAA3-A1C3-4818-A06F-A2D85FDE77E7}.AppStore|x86.Build.0 = Debug|Any CPU - {4193CAA3-A1C3-4818-A06F-A2D85FDE77E7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4193CAA3-A1C3-4818-A06F-A2D85FDE77E7}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4193CAA3-A1C3-4818-A06F-A2D85FDE77E7}.Debug|ARM.ActiveCfg = Debug|Any CPU - {4193CAA3-A1C3-4818-A06F-A2D85FDE77E7}.Debug|ARM.Build.0 = Debug|Any CPU - {4193CAA3-A1C3-4818-A06F-A2D85FDE77E7}.Debug|iPhone.ActiveCfg = Debug|Any CPU - {4193CAA3-A1C3-4818-A06F-A2D85FDE77E7}.Debug|iPhone.Build.0 = Debug|Any CPU - {4193CAA3-A1C3-4818-A06F-A2D85FDE77E7}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU - {4193CAA3-A1C3-4818-A06F-A2D85FDE77E7}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU - {4193CAA3-A1C3-4818-A06F-A2D85FDE77E7}.Debug|x64.ActiveCfg = Debug|Any CPU - {4193CAA3-A1C3-4818-A06F-A2D85FDE77E7}.Debug|x64.Build.0 = Debug|Any CPU - {4193CAA3-A1C3-4818-A06F-A2D85FDE77E7}.Debug|x86.ActiveCfg = Debug|Any CPU - {4193CAA3-A1C3-4818-A06F-A2D85FDE77E7}.Debug|x86.Build.0 = Debug|Any CPU - {4193CAA3-A1C3-4818-A06F-A2D85FDE77E7}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4193CAA3-A1C3-4818-A06F-A2D85FDE77E7}.Release|Any CPU.Build.0 = Release|Any CPU - {4193CAA3-A1C3-4818-A06F-A2D85FDE77E7}.Release|ARM.ActiveCfg = Release|Any CPU - {4193CAA3-A1C3-4818-A06F-A2D85FDE77E7}.Release|ARM.Build.0 = Release|Any CPU - {4193CAA3-A1C3-4818-A06F-A2D85FDE77E7}.Release|iPhone.ActiveCfg = Release|Any CPU - {4193CAA3-A1C3-4818-A06F-A2D85FDE77E7}.Release|iPhone.Build.0 = Release|Any CPU - {4193CAA3-A1C3-4818-A06F-A2D85FDE77E7}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU - {4193CAA3-A1C3-4818-A06F-A2D85FDE77E7}.Release|iPhoneSimulator.Build.0 = Release|Any CPU - {4193CAA3-A1C3-4818-A06F-A2D85FDE77E7}.Release|x64.ActiveCfg = Release|Any CPU - {4193CAA3-A1C3-4818-A06F-A2D85FDE77E7}.Release|x64.Build.0 = Release|Any CPU - {4193CAA3-A1C3-4818-A06F-A2D85FDE77E7}.Release|x86.ActiveCfg = Release|Any CPU - {4193CAA3-A1C3-4818-A06F-A2D85FDE77E7}.Release|x86.Build.0 = Release|Any CPU + {7796F5D8-31FC-45A4-B673-19DE5BA194CF}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU + {7796F5D8-31FC-45A4-B673-19DE5BA194CF}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU + {7796F5D8-31FC-45A4-B673-19DE5BA194CF}.Ad-Hoc|ARM.ActiveCfg = Debug|Any CPU + {7796F5D8-31FC-45A4-B673-19DE5BA194CF}.Ad-Hoc|ARM.Build.0 = Debug|Any CPU + {7796F5D8-31FC-45A4-B673-19DE5BA194CF}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU + {7796F5D8-31FC-45A4-B673-19DE5BA194CF}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU + {7796F5D8-31FC-45A4-B673-19DE5BA194CF}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {7796F5D8-31FC-45A4-B673-19DE5BA194CF}.Ad-Hoc|iPhoneSimulator.Build.0 = Debug|Any CPU + {7796F5D8-31FC-45A4-B673-19DE5BA194CF}.Ad-Hoc|x64.ActiveCfg = Debug|Any CPU + {7796F5D8-31FC-45A4-B673-19DE5BA194CF}.Ad-Hoc|x64.Build.0 = Debug|Any CPU + {7796F5D8-31FC-45A4-B673-19DE5BA194CF}.Ad-Hoc|x86.ActiveCfg = Debug|Any CPU + {7796F5D8-31FC-45A4-B673-19DE5BA194CF}.Ad-Hoc|x86.Build.0 = Debug|Any CPU + {7796F5D8-31FC-45A4-B673-19DE5BA194CF}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU + {7796F5D8-31FC-45A4-B673-19DE5BA194CF}.AppStore|Any CPU.Build.0 = Debug|Any CPU + {7796F5D8-31FC-45A4-B673-19DE5BA194CF}.AppStore|ARM.ActiveCfg = Debug|Any CPU + {7796F5D8-31FC-45A4-B673-19DE5BA194CF}.AppStore|ARM.Build.0 = Debug|Any CPU + {7796F5D8-31FC-45A4-B673-19DE5BA194CF}.AppStore|iPhone.ActiveCfg = Debug|Any CPU + {7796F5D8-31FC-45A4-B673-19DE5BA194CF}.AppStore|iPhone.Build.0 = Debug|Any CPU + {7796F5D8-31FC-45A4-B673-19DE5BA194CF}.AppStore|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {7796F5D8-31FC-45A4-B673-19DE5BA194CF}.AppStore|iPhoneSimulator.Build.0 = Debug|Any CPU + {7796F5D8-31FC-45A4-B673-19DE5BA194CF}.AppStore|x64.ActiveCfg = Debug|Any CPU + {7796F5D8-31FC-45A4-B673-19DE5BA194CF}.AppStore|x64.Build.0 = Debug|Any CPU + {7796F5D8-31FC-45A4-B673-19DE5BA194CF}.AppStore|x86.ActiveCfg = Debug|Any CPU + {7796F5D8-31FC-45A4-B673-19DE5BA194CF}.AppStore|x86.Build.0 = Debug|Any CPU + {7796F5D8-31FC-45A4-B673-19DE5BA194CF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7796F5D8-31FC-45A4-B673-19DE5BA194CF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7796F5D8-31FC-45A4-B673-19DE5BA194CF}.Debug|ARM.ActiveCfg = Debug|Any CPU + {7796F5D8-31FC-45A4-B673-19DE5BA194CF}.Debug|ARM.Build.0 = Debug|Any CPU + {7796F5D8-31FC-45A4-B673-19DE5BA194CF}.Debug|iPhone.ActiveCfg = Debug|Any CPU + {7796F5D8-31FC-45A4-B673-19DE5BA194CF}.Debug|iPhone.Build.0 = Debug|Any CPU + {7796F5D8-31FC-45A4-B673-19DE5BA194CF}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {7796F5D8-31FC-45A4-B673-19DE5BA194CF}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU + {7796F5D8-31FC-45A4-B673-19DE5BA194CF}.Debug|x64.ActiveCfg = Debug|Any CPU + {7796F5D8-31FC-45A4-B673-19DE5BA194CF}.Debug|x64.Build.0 = Debug|Any CPU + {7796F5D8-31FC-45A4-B673-19DE5BA194CF}.Debug|x86.ActiveCfg = Debug|Any CPU + {7796F5D8-31FC-45A4-B673-19DE5BA194CF}.Debug|x86.Build.0 = Debug|Any CPU + {7796F5D8-31FC-45A4-B673-19DE5BA194CF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7796F5D8-31FC-45A4-B673-19DE5BA194CF}.Release|Any CPU.Build.0 = Release|Any CPU + {7796F5D8-31FC-45A4-B673-19DE5BA194CF}.Release|ARM.ActiveCfg = Release|Any CPU + {7796F5D8-31FC-45A4-B673-19DE5BA194CF}.Release|ARM.Build.0 = Release|Any CPU + {7796F5D8-31FC-45A4-B673-19DE5BA194CF}.Release|iPhone.ActiveCfg = Release|Any CPU + {7796F5D8-31FC-45A4-B673-19DE5BA194CF}.Release|iPhone.Build.0 = Release|Any CPU + {7796F5D8-31FC-45A4-B673-19DE5BA194CF}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU + {7796F5D8-31FC-45A4-B673-19DE5BA194CF}.Release|iPhoneSimulator.Build.0 = Release|Any CPU + {7796F5D8-31FC-45A4-B673-19DE5BA194CF}.Release|x64.ActiveCfg = Release|Any CPU + {7796F5D8-31FC-45A4-B673-19DE5BA194CF}.Release|x64.Build.0 = Release|Any CPU + {7796F5D8-31FC-45A4-B673-19DE5BA194CF}.Release|x86.ActiveCfg = Release|Any CPU + {7796F5D8-31FC-45A4-B673-19DE5BA194CF}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -990,6 +990,6 @@ Global {621E7211-58D0-45FD-9600-1CB490BD930E} = {EF0337F2-ED00-4643-89FD-EE10863F1870} {E3B18084-842C-4B80-8E4A-A7E588EC3137} = {B7B1D395-4E06-4036-BE86-C216756B9367} {67F9D3A8-F71E-4428-913F-C37AE82CDB24} = {778289CA-31F7-4464-8C2A-612EE846F8A7} - {4193CAA3-A1C3-4818-A06F-A2D85FDE77E7} = {0BD0DB92-2D98-44D9-9AC0-C59186D59B0B} + {7796F5D8-31FC-45A4-B673-19DE5BA194CF} = {EF0337F2-ED00-4643-89FD-EE10863F1870} EndGlobalSection EndGlobal diff --git a/src/Services/Identity/eShopOnContainers.Identity/Configuration/Config.cs b/src/Services/Identity/eShopOnContainers.Identity/Configuration/Config.cs index 5a5989b56..c8a434215 100644 --- a/src/Services/Identity/eShopOnContainers.Identity/Configuration/Config.cs +++ b/src/Services/Identity/eShopOnContainers.Identity/Configuration/Config.cs @@ -82,7 +82,8 @@ namespace eShopOnContainers.Identity.Configuration RedirectUris = new List { $"{clientsUrl["Mvc"]}/signin-oidc", - "http://104.40.62.65:5100/signin-oidc" + "http://104.40.62.65:5100/signin-oidc", + "http://localhost:5100" }, PostLogoutRedirectUris = new List { diff --git a/src/Services/Ordering/Ordering.API/Controllers/OrdersController.cs b/src/Services/Ordering/Ordering.API/Controllers/OrdersController.cs index 518332cf9..7ca26f9ba 100644 --- a/src/Services/Ordering/Ordering.API/Controllers/OrdersController.cs +++ b/src/Services/Ordering/Ordering.API/Controllers/OrdersController.cs @@ -3,6 +3,7 @@ using Api.Application.Commands; using Api.Application.Queries; using AspNetCore.Authorization; + using Infrastructure.Services; using MediatR; using Microsoft.AspNetCore.Mvc; using Models; @@ -16,8 +17,9 @@ { private readonly IMediator _mediator; private readonly IOrderQueries _orderQueries; + private readonly IIdentityService _identityService; - public OrdersController(IMediator mediator, IOrderQueries orderQueries) + public OrdersController(IMediator mediator, IOrderQueries orderQueries, IIdentityService identityService) { if (mediator == null) { @@ -29,21 +31,24 @@ throw new ArgumentNullException(nameof(orderQueries)); } + if (identityService == null) + { + throw new ArgumentException(nameof(identityService)); + } + _mediator = mediator; _orderQueries = orderQueries; + _identityService = identityService; } [Route("new")] [HttpPost] public async Task AddOrder([FromBody]NewOrderRequest order) { - if (order.CardExpiration == DateTime.MinValue) - order.CardExpiration = DateTime.Now.AddYears(5); - if (order.CardTypeId == 0) order.CardTypeId = 1; - order.Buyer = GetUserName(); + order.Buyer = _identityService.GetUserIdentity(); var added = await _mediator.SendAsync(order); if (added) @@ -86,17 +91,7 @@ return Ok(cardTypes); } - - /// - /// Returns the GUID corresponding to the Id of the authenticated user. - /// - /// GUID (string) - string GetUserName() - { - return HttpContext.User.FindFirst("sub").Value; - } } - } diff --git a/src/Services/Ordering/Ordering.API/Infrastructure/Services/IIdentityService.cs b/src/Services/Ordering/Ordering.API/Infrastructure/Services/IIdentityService.cs new file mode 100644 index 000000000..4864234dc --- /dev/null +++ b/src/Services/Ordering/Ordering.API/Infrastructure/Services/IIdentityService.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace Microsoft.eShopOnContainers.Services.Ordering.API.Infrastructure.Services +{ + public interface IIdentityService + { + string GetUserIdentity(); + } +} diff --git a/src/Services/Ordering/Ordering.API/Infrastructure/Services/IdentityService.cs b/src/Services/Ordering/Ordering.API/Infrastructure/Services/IdentityService.cs new file mode 100644 index 000000000..e897b61c7 --- /dev/null +++ b/src/Services/Ordering/Ordering.API/Infrastructure/Services/IdentityService.cs @@ -0,0 +1,29 @@ + +using Microsoft.AspNetCore.Http; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace Microsoft.eShopOnContainers.Services.Ordering.API.Infrastructure.Services +{ + public class IdentityService : IIdentityService + { + private IHttpContextAccessor _context; + + public IdentityService(IHttpContextAccessor context) + { + if (context == null) + { + throw new ArgumentNullException(nameof(context)); + } + + _context = context; + } + + public string GetUserIdentity() + { + return _context.HttpContext.User.FindFirst("sub").Value; + } + } +} diff --git a/src/Services/Ordering/Ordering.API/Startup.cs b/src/Services/Ordering/Ordering.API/Startup.cs index 8ab54aa23..a9883c764 100644 --- a/src/Services/Ordering/Ordering.API/Startup.cs +++ b/src/Services/Ordering/Ordering.API/Startup.cs @@ -1,10 +1,12 @@ namespace Microsoft.eShopOnContainers.Services.Ordering.API { + using AspNetCore.Http; using Autofac; using Autofac.Extensions.DependencyInjection; using Infrastructure; using Infrastructure.AutofacModules; using Infrastructure.Filters; + using Infrastructure.Services; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.EntityFrameworkCore; @@ -74,7 +76,10 @@ .AllowCredentials()); }); + // Add application services. + services.AddSingleton(); services.AddSingleton(this.Configuration); + services.AddTransient(); services.AddOptions(); diff --git a/src/Services/Ordering/Ordering.Application/Queries/OrderQueries.cs b/src/Services/Ordering/Ordering.Application/Queries/OrderQueries.cs index db877cf31..80cf57d68 100644 --- a/src/Services/Ordering/Ordering.Application/Queries/OrderQueries.cs +++ b/src/Services/Ordering/Ordering.Application/Queries/OrderQueries.cs @@ -7,9 +7,10 @@ using System; using System.Dynamic; using System.Collections.Generic; + using System.Linq; public class OrderQueries - :IOrderQueries + : IOrderQueries { private string _connectionString = string.Empty; @@ -97,5 +98,31 @@ return order; } + + //TODO/CCE: try to use this method instead actual. + //private object MapOrderItems(dynamic result) + //{ + // IEnumerable items = (result as System.Collections.IEnumerable).Cast(); + // var order = new + // { + // ordernumber = result[0].ordernumbe, + // date = result[0].date, + // status = result[0].status, + // street = result[0].street, + // city = result[0].city, + // zipcode = result[0].zipcode, + // country = result[0].country, + // total = items.Select(r => (int)r.units * (int)r.unitprice).Sum(), + // orderItems = items.Select(r => new + // { + // productname = r.productname, + // units = r.units, + // unitprice = r.unitprice, + // pictureurl = r.pictureurl + // }) + // }; + + // return order; + //} } } diff --git a/src/Web/WebMVC/Startup.cs b/src/Web/WebMVC/Startup.cs index 408cad542..49106f017 100644 --- a/src/Web/WebMVC/Startup.cs +++ b/src/Web/WebMVC/Startup.cs @@ -33,9 +33,6 @@ namespace Microsoft.eShopOnContainers.WebMVC // builder.AddUserSecrets(); //} - //builder.AddJsonFile("appsettings.override.json"); - //builder.AddEnvironmentVariables(); - Configuration = builder.Build(); } @@ -51,7 +48,7 @@ namespace Microsoft.eShopOnContainers.WebMVC services.AddSingleton(); services.AddTransient(); - services.AddSingleton(); //CCE: Once services are integrated, a singleton is not needed we can left transient. + services.AddTransient(); services.AddTransient(); services.AddTransient, IdentityParser>(); } @@ -86,9 +83,6 @@ namespace Microsoft.eShopOnContainers.WebMVC var callBackUrl = Configuration.GetValue("CallBackUrl"); var log = loggerFactory.CreateLogger("identity"); - log.LogDebug(identityUrl.ToString()); - log.LogDebug(callBackUrl.ToString()); - var oidcOptions = new OpenIdConnectOptions { AuthenticationScheme = "oidc", diff --git a/test/Services/UnitTest/Catalog/CatalogControllertest.cs b/test/Services/UnitTest/Catalog/CatalogControllertest.cs new file mode 100644 index 000000000..e3ca383e0 --- /dev/null +++ b/test/Services/UnitTest/Catalog/CatalogControllertest.cs @@ -0,0 +1,34 @@ +using Microsoft.AspNetCore.Mvc; +using Microsoft.EntityFrameworkCore; +using Microsoft.eShopOnContainers.Services.Catalog.API.Controllers; +using Microsoft.eShopOnContainers.Services.Catalog.API.Infrastructure; +using Microsoft.eShopOnContainers.Services.Catalog.API.Model; +using Moq; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Xunit; + +namespace UnitTest.Catalog +{ + public class CatalogControllerTest + { + private readonly Mock _mockContext; + private readonly Mock> _mockItems; + public CatalogControllerTest() + { + _mockContext = new Mock(); + _mockItems = new Mock>(); + } + + [Fact] + public async Task Items_ReturnsOKObject_WhenItemsFound() + { + //CCE: TODO + Assert.True(true); + } + + } +} diff --git a/test/Services/UnitTest/Ordering/Application/NewOrderCommandHandlerTest.cs b/test/Services/UnitTest/Ordering/Application/NewOrderCommandHandlerTest.cs new file mode 100644 index 000000000..c728ed70f --- /dev/null +++ b/test/Services/UnitTest/Ordering/Application/NewOrderCommandHandlerTest.cs @@ -0,0 +1,92 @@ +using MediatR; +using Microsoft.eShopOnContainers.Services.Ordering.Api.Application.Commands; +using Microsoft.eShopOnContainers.Services.Ordering.Domain; +using Microsoft.eShopOnContainers.Services.Ordering.Domain.Repositories; +using Microsoft.eShopOnContainers.Services.Ordering.Domain.SeedWork; +using Moq; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Xunit; + +namespace UnitTest.Ordering.Application +{ + public class NewOrderRequestHandlerTest + { + private readonly Mock _buyerRepositoryMock; + private readonly Mock _orderRepositoryMock; + + public NewOrderRequestHandlerTest() + { + //Mocks; + _buyerRepositoryMock = new Mock(); + _orderRepositoryMock = new Mock(); + } + + [Fact] + public async Task Handle_ReturnsTrue_WhenOrderIsPersistedSuccesfully() + { + // Arrange + _buyerRepositoryMock.Setup(buyerRepo => buyerRepo.FindAsync(FakeOrderRequestWithBuyer().Buyer)) + .Returns(Task.FromResult(FakeBuyer())); + _buyerRepositoryMock.Setup(buyerRepo => buyerRepo.UnitOfWork.SaveChangesAsync(default(CancellationToken))) + .Returns(Task.FromResult(1)); + + _orderRepositoryMock.Setup(or => or.Add(FakeOrder())).Returns(FakeOrder()); + _orderRepositoryMock.Setup(or => or.UnitOfWork.SaveChangesAsync(default(CancellationToken))).Returns(Task.FromResult(1)); + + //Act + var handler = new NewOrderRequestHandler(_buyerRepositoryMock.Object, _orderRepositoryMock.Object); + var result = await handler.Handle(FakeOrderRequestWithBuyer()); + + //Assert + Assert.True(result); + } + + [Fact] + public async Task Handle_ReturnsFalse_WhenOrderIsNotPersisted() + { + _buyerRepositoryMock.Setup(buyerRepo => buyerRepo.FindAsync(FakeOrderRequestWithBuyer().Buyer)) + .Returns(Task.FromResult(FakeBuyer())); + _buyerRepositoryMock.Setup(buyerRepo => buyerRepo.UnitOfWork.SaveChangesAsync(default(CancellationToken))) + .Returns(Task.FromResult(1)); + + _orderRepositoryMock.Setup(or => or.Add(FakeOrder())).Returns(FakeOrder()); + _orderRepositoryMock.Setup(or => or.UnitOfWork.SaveChangesAsync(default(CancellationToken))).Returns(Task.FromResult(0)); + + //Act + var handler = new NewOrderRequestHandler(_buyerRepositoryMock.Object, _orderRepositoryMock.Object); + var result = await handler.Handle(FakeOrderRequestWithBuyer()); + + //Assert + Assert.False(result); + } + + private Buyer FakeBuyer() + { + return new Buyer(Guid.NewGuid().ToString()); + } + + private Order FakeOrder() + { + return new Order(1, 1) + { + + }; + } + + private NewOrderRequest FakeOrderRequestWithBuyer() + { + return new NewOrderRequest + { + Buyer = "1234", + CardNumber = "1234", + CardExpiration = DateTime.Now.AddYears(1), + CardSecurityNumber = "123", + CardHolderName = "XXX" + }; + } + } +} diff --git a/test/Services/UnitTest/Ordering/Controllers/OrderControllerTest.cs b/test/Services/UnitTest/Ordering/Controllers/OrderControllerTest.cs new file mode 100644 index 000000000..055bd0730 --- /dev/null +++ b/test/Services/UnitTest/Ordering/Controllers/OrderControllerTest.cs @@ -0,0 +1,152 @@ +using System; +using Xunit; +using System.Threading.Tasks; +using Moq; +using MediatR; +using Microsoft.eShopOnContainers.Services.Ordering.API.Controllers; +using Microsoft.eShopOnContainers.Services.Ordering.Api.Application.Commands; +using Microsoft.AspNetCore.Mvc; +using Microsoft.eShopOnContainers.Services.Ordering.API.Infrastructure.Services; +using Microsoft.eShopOnContainers.Services.Ordering.Api.Application.Queries; +using System.Collections.Generic; + +namespace UnitTest.Ordering.Controllers +{ + public class OrderControllerTest + { + private readonly Mock _mediatorMock; + private readonly Mock _identityMock; + private readonly Mock _queriesMock; + + public OrderControllerTest() + { + //Mocks; + _mediatorMock = new Mock(); + _identityMock = new Mock(); + _queriesMock = new Mock(); + } + + [Fact] + public async Task AddOrder_ReturnsBadRequestResult_WhenPersitenceOperationFails() + { + // Arrange + var orderRequest = new object() as IAsyncRequest; + + _mediatorMock.Setup(mediator => mediator.SendAsync(OrderFakeNotExpired())) + .Returns(Task.FromResult(false)); + + _identityMock.Setup(identity => identity.GetUserIdentity()) + .Returns(Guid.NewGuid().ToString()); + + var controller = new OrdersController(_mediatorMock.Object, _queriesMock.Object, _identityMock.Object); + + // Act + var badRequestResult = await controller.AddOrder(OrderFakeNotExpired()); + + // Assert + Assert.IsType(badRequestResult); + } + + [Fact] + public async Task AddOrder_ReturnsOK_WhenPersistenceOperationSucceed() + { + // Arrange + _mediatorMock.Setup(mediator => mediator.SendAsync(OrderFakeNotExpired())) + .Returns(Task.FromResult(true)); + + _identityMock.Setup(identity => identity.GetUserIdentity()) + .Returns(Guid.NewGuid().ToString()); + + var controller = new OrdersController(_mediatorMock.Object, _queriesMock.Object, _identityMock.Object); + + // Act + var badRequestResult = await controller.AddOrder(OrderFakeNotExpired()); + + // Assert + Assert.IsType(badRequestResult); + } + + [Fact] + public async Task GetOrder_ReturnsNotFound_WhenItemNotFound() + { + // Arrange + _queriesMock.Setup(queries => queries.GetOrder(1)) + .Throws(new KeyNotFoundException()); + + var controller = new OrdersController(_mediatorMock.Object, _queriesMock.Object, _identityMock.Object); + + // Act + var notFoundResult = await controller.GetOrder(1); + + // Assert + Assert.IsType(notFoundResult); + } + + [Fact] + public async Task GetOrder_ReturnsOkObjecResult_WheItemFound() + { + // Arrange + _queriesMock.Setup(queries => queries.GetOrder(1)) + .Returns(Task.FromResult(new object())); + + var controller = new OrdersController(_mediatorMock.Object, _queriesMock.Object, _identityMock.Object); + + // Act + var OkObjectResult = await controller.GetOrder(1); + + // Assert + Assert.IsType(OkObjectResult); + } + + [Fact] + public async Task GetOrders_ReturnsOkObjectResult() + { + // Arrange + _queriesMock.Setup(queries => queries.GetOrders()) + .Returns(Task.FromResult(new object())); + + var controller = new OrdersController(_mediatorMock.Object, _queriesMock.Object, _identityMock.Object); + + // Act + var OkObjectResult = await controller.GetOrders(); + + // Assert + Assert.IsType(OkObjectResult); + } + + [Fact] + public async Task GetCardTypes() + { + // Arrange + _queriesMock.Setup(queries => queries.GetCardTypes()) + .Returns(Task.FromResult(new object())); + + var controller = new OrdersController(_mediatorMock.Object, _queriesMock.Object, _identityMock.Object); + + // Act + var OkObjectResult = await controller.GetCardTypes(); + + // Assert + Assert.IsType(OkObjectResult); + } + + //Fakes + private NewOrderRequest OrderFakeNotExpired() + { + return new NewOrderRequest() + { + CardTypeId = 1, + CardExpiration = DateTime.Now.AddYears(1) + }; + } + + private NewOrderRequest OrderFakeExpired() + { + return new NewOrderRequest() + { + CardTypeId = 1, + CardExpiration = DateTime.Now.AddYears(-1) + }; + } + } +} diff --git a/test/Services/UnitTest/Properties/AssemblyInfo.cs b/test/Services/UnitTest/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..0d5dcb370 --- /dev/null +++ b/test/Services/UnitTest/Properties/AssemblyInfo.cs @@ -0,0 +1,19 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("UnitTest")] +[assembly: AssemblyTrademark("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("7796f5d8-31fc-45a4-b673-19de5ba194cf")] diff --git a/test/Services/UnitTest/UnitTest.xproj b/test/Services/UnitTest/UnitTest.xproj new file mode 100644 index 000000000..1d3c09c84 --- /dev/null +++ b/test/Services/UnitTest/UnitTest.xproj @@ -0,0 +1,22 @@ + + + + 14.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + 7796f5d8-31fc-45a4-b673-19de5ba194cf + UnitTest + .\obj + .\bin\ + v4.5.2 + + + 2.0 + + + + + + \ No newline at end of file diff --git a/test/Services/UnitTest/project.json b/test/Services/UnitTest/project.json new file mode 100644 index 000000000..0e54e4c4f --- /dev/null +++ b/test/Services/UnitTest/project.json @@ -0,0 +1,24 @@ +{ + "version": "1.0.0-*", + + "dependencies": { + "MediatR": "2.1.0", + "Moq": "4.6.38-alpha", + "Microsoft.NETCore.App": "1.1.0", + "xunit": "2.2.0-beta4-build3444", + "Ordering.API": "1.0.0-*", + "Catalog.API": "1.0.0-*", + "Microsoft.AspNetCore.TestHost": "1.1.0", + "dotnet-test-xunit": "2.2.0-preview2-build1029" + }, + "testRunner": "xunit", + "runtimes": { + "win10-x64": {} + }, + "frameworks": { + "netcoreapp1.0": { + "dependencies": { + } + } + } +} diff --git a/test/Services/UnitTests__/UnitTests/Ordering/OrderControllerTest.cs b/test/Services/UnitTests__/UnitTests/Ordering/OrderControllerTest.cs new file mode 100644 index 000000000..17dcbdc55 --- /dev/null +++ b/test/Services/UnitTests__/UnitTests/Ordering/OrderControllerTest.cs @@ -0,0 +1,50 @@ +using System; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Xunit; +using System.Threading.Tasks; +using Moq; +using MediatR; + +namespace UnitTests +{ + public class OrderControllerTest + { + private readonly Mock _mock; + + public OrderControllerTest() + { + //config mock; + _mock = new Mock(); + + + } + + [Fact] + public async Task AddOrder_ReturnsBadRequestResult_WhenPersitenceOperationFails() + { + //Add order: + var orderRequest = new object() as IAsyncRequest; + _mock.Setup(mediator => mediator.SendAsync(orderRequest)) + .Returns(Task.FromResult(false)); + + // Arrange + var controller = new OrdersController(mockRepo.Object); + controller.ModelState.AddModelError("SessionName", "Required"); + var newSession = new HomeController.NewSessionModel(); + + // Act + var result = await controller.Index(newSession); + + // Assert + var badRequestResult = Assert.IsType(result); + Assert.IsType(badRequestResult.Value); + } + + + // Implement Fake method for mock. + private MediatorMockForAddOrder() + { + + } + } +} diff --git a/test/Services/UnitTests__/UnitTests/Properties/AssemblyInfo.cs b/test/Services/UnitTests__/UnitTests/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..78acac4b0 --- /dev/null +++ b/test/Services/UnitTests__/UnitTests/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("UnitTests")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("UnitTests")] +[assembly: AssemblyCopyright("Copyright © 2016")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("ecbb8dc1-22ea-42d2-a45a-4ae800c73356")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/test/Services/UnitTests__/UnitTests/UnitTests.csproj b/test/Services/UnitTests__/UnitTests/UnitTests.csproj new file mode 100644 index 000000000..b7b2e5e47 --- /dev/null +++ b/test/Services/UnitTests__/UnitTests/UnitTests.csproj @@ -0,0 +1,117 @@ + + + + Debug + AnyCPU + {ECBB8DC1-22EA-42D2-A45A-4AE800C73356} + Library + Properties + UnitTests + UnitTests + v4.5.2 + 512 + {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + 10.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + $(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages + False + UnitTest + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\..\..\..\packages\Castle.Core.3.3.3\lib\net45\Castle.Core.dll + True + + + ..\..\..\..\packages\MediatR.2.1.0\lib\net45\MediatR.dll + True + + + ..\..\..\..\packages\Moq.4.6.38-alpha\lib\net45\Moq.dll + True + + + + ..\..\..\..\packages\xunit.abstractions.2.0.1\lib\net35\xunit.abstractions.dll + True + + + ..\..\..\..\packages\xunit.assert.2.2.0-beta4-build3444\lib\netstandard1.0\xunit.assert.dll + True + + + ..\..\..\..\packages\xunit.extensibility.core.2.2.0-beta4-build3444\lib\net45\xunit.core.dll + True + + + ..\..\..\..\packages\xunit.extensibility.execution.2.2.0-beta4-build3444\lib\net45\xunit.execution.desktop.dll + True + + + + + + + + + + + + + + + + + + + + + + + + + + + + + False + + + False + + + False + + + False + + + + + + + + \ No newline at end of file diff --git a/test/Services/UnitTests__/UnitTests/packages.config b/test/Services/UnitTests__/UnitTests/packages.config new file mode 100644 index 000000000..ee7e708c6 --- /dev/null +++ b/test/Services/UnitTests__/UnitTests/packages.config @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file