using Microsoft.AspNetCore.Mvc.Testing; using Microsoft.eShopWeb.Web; using System; 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.Web.Controllers { public class AccountControllerSignIn : IClassFixture> { public AccountControllerSignIn(CustomWebApplicationFactory factory) { Client = factory.CreateClient(new WebApplicationFactoryClientOptions { AllowAutoRedirect = false }); } public HttpClient Client { get; } [Fact] public async Task ReturnsSignInScreenOnGet() { var response = await Client.GetAsync("/account/sign-in"); response.EnsureSuccessStatusCode(); var stringResponse = await response.Content.ReadAsStringAsync(); Assert.Contains("demouser@microsoft.com", stringResponse); } [Fact] public async Task RegexMatchesValidRequestVerificationToken() { // TODO: Move to a unit test // TODO: Move regex to a constant in test project var input = @""; string regexpression = @"name=""__RequestVerificationToken"" type=""hidden"" value=""([-A-Za-z0-9+=/\\_]+?)"""; var regex = new Regex(regexpression); var match = regex.Match(input); var group = match.Groups.LastOrDefault(); Assert.NotNull(group); Assert.True(group.Value.Length > 50); } [Fact] public async Task ReturnsFormWithRequestVerificationToken() { var response = await Client.GetAsync("/account/sign-in"); response.EnsureSuccessStatusCode(); var stringResponse = await response.Content.ReadAsStringAsync(); string token = GetRequestVerificationToken(stringResponse); Assert.True(token.Length > 50); } 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 ReturnsSuccessfulSignInOnPostWithValidCredentials() { var getResponse = await Client.GetAsync("/account/sign-in"); getResponse.EnsureSuccessStatusCode(); var stringResponse1 = await getResponse.Content.ReadAsStringAsync(); string token = GetRequestVerificationToken(stringResponse1); var keyValues = new List>(); keyValues.Add(new KeyValuePair("Email", "demouser@microsoft.com")); keyValues.Add(new KeyValuePair("Password", "Pass@word1")); keyValues.Add(new KeyValuePair("__RequestVerificationToken", token)); var formContent = new FormUrlEncodedContent(keyValues); var postResponse = await Client.PostAsync("/account/sign-in", formContent); Assert.Equal(HttpStatusCode.Redirect, postResponse.StatusCode); Assert.Equal(new System.Uri("/", UriKind.Relative), postResponse.Headers.Location); } } }