From 765e1508bfa8d24993c1c6fa092bbfd5f33aaede Mon Sep 17 00:00:00 2001 From: Steve Smith Date: Fri, 22 Feb 2019 14:21:14 -0500 Subject: [PATCH] Got RedirectToLoginIfNotAuth test working --- src/Web/Startup.cs | 5 ++ .../Web/CustomWebApplicationFactory.cs | 6 +- .../Web/Pages/BasketPageCheckout.cs | 71 +++++++++++++++++++ 3 files changed, 80 insertions(+), 2 deletions(-) create mode 100644 tests/FunctionalTests/Web/Pages/BasketPageCheckout.cs diff --git a/src/Web/Startup.cs b/src/Web/Startup.cs index 93d399a..2bf29e3 100644 --- a/src/Web/Startup.cs +++ b/src/Web/Startup.cs @@ -166,6 +166,7 @@ namespace Microsoft.eShopWeb.Web { options.Cookie.HttpOnly = true; options.ExpireTimeSpan = TimeSpan.FromHours(1); + options.LoginPath = "/Account/Login"; options.LogoutPath = "/Account/Signout"; options.Cookie = new CookieBuilder { @@ -228,6 +229,10 @@ namespace Microsoft.eShopWeb.Web app.UseMvc(routes => { + routes.MapRoute( + name: "identity", + template: "Identity/{controller=Account}/{action=Register}/{id?}"); + routes.MapRoute( name: "default", template: "{controller:slugify=Home}/{action:slugify=Index}/{id?}"); diff --git a/tests/FunctionalTests/Web/CustomWebApplicationFactory.cs b/tests/FunctionalTests/Web/CustomWebApplicationFactory.cs index 115cc47..14bf8eb 100644 --- a/tests/FunctionalTests/Web/CustomWebApplicationFactory.cs +++ b/tests/FunctionalTests/Web/CustomWebApplicationFactory.cs @@ -1,5 +1,6 @@ using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Identity; +using Microsoft.AspNetCore.Identity.UI; using Microsoft.AspNetCore.Mvc.Testing; using Microsoft.EntityFrameworkCore; using Microsoft.eShopWeb.Infrastructure.Data; @@ -40,8 +41,9 @@ namespace Microsoft.eShopWeb.FunctionalTests.Web.Controllers }); services.AddIdentity() - .AddEntityFrameworkStores() - .AddDefaultTokenProviders(); + .AddDefaultUI(UIFramework.Bootstrap4) + .AddEntityFrameworkStores() + .AddDefaultTokenProviders(); // Build the service provider. var sp = services.BuildServiceProvider(); diff --git a/tests/FunctionalTests/Web/Pages/BasketPageCheckout.cs b/tests/FunctionalTests/Web/Pages/BasketPageCheckout.cs new file mode 100644 index 0000000..128e13c --- /dev/null +++ b/tests/FunctionalTests/Web/Pages/BasketPageCheckout.cs @@ -0,0 +1,71 @@ +using Microsoft.AspNetCore.Mvc.Testing; +using Microsoft.eShopWeb.FunctionalTests.Web.Controllers; +using Microsoft.eShopWeb.Web; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Net.Http; +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using Xunit; + +namespace Microsoft.eShopWeb.FunctionalTests.WebRazorPages +{ + public class BasketPageCheckout : IClassFixture> + { + public BasketPageCheckout(CustomWebApplicationFactory factory) + { + Client = factory.CreateClient(new WebApplicationFactoryClientOptions + { + AllowAutoRedirect = true + }); + } + + public HttpClient Client { get; } + + private string GetRequestVerificationToken(string input) + { + string regexpression = @"name=""__RequestVerificationToken"" type=""hidden"" value=""([-A-Za-z0-9+=/\\_]+?)"""; + var regex = new Regex(regexpression); + var match = regex.Match(input); + return match.Groups.LastOrDefault().Value; + } + + [Fact] + public async Task RedirectsToLoginIfNotAuthenticated() + { + // Arrange & Act + + // Load Home Page + var response = await Client.GetAsync("/"); + response.EnsureSuccessStatusCode(); + var stringResponse1 = await response.Content.ReadAsStringAsync(); + + string token = GetRequestVerificationToken(stringResponse1); + + // Add Item to Cart + var keyValues = new List>(); + keyValues.Add(new KeyValuePair("id", "2")); + keyValues.Add(new KeyValuePair("name", "shirt")); + + keyValues.Add(new KeyValuePair("price", "19.49")); + keyValues.Add(new KeyValuePair("__RequestVerificationToken", token)); + + var formContent = new FormUrlEncodedContent(keyValues); + + var postResponse = await Client.PostAsync("/basket/index", formContent); + postResponse.EnsureSuccessStatusCode(); + var stringResponse = await postResponse.Content.ReadAsStringAsync(); + + // Assert + Assert.Contains(".NET Black & White Mug", stringResponse); + + keyValues.Clear(); + keyValues.Add(new KeyValuePair("__RequestVerificationToken", token)); + + formContent = new FormUrlEncodedContent(keyValues); + var postResponse2 = await Client.PostAsync("/Basket/Checkout", formContent); + Assert.Contains("/Identity/Account/Login", postResponse2.RequestMessage.RequestUri.ToString()); + } + } +}