// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Linq; using System.Net; using System.Net.Http; using System.Threading.Tasks; using Xunit; namespace Microsoft.AspNetCore.Mvc.FunctionalTests { public class RazorPagesTest : IClassFixture> { public RazorPagesTest(MvcTestFixture fixture) { Client = fixture.Client; } public HttpClient Client { get; } [Fact] public async Task NoPage_NotFound() { // Arrange var request = new HttpRequestMessage(HttpMethod.Get, "http://localhost/NoPage"); // Act var response = await Client.SendAsync(request); // Assert Assert.Equal(HttpStatusCode.NotFound, response.StatusCode); } [Fact] public async Task HelloWorld_CanGetContent() { // Arrange // Note: If the route in this test case ever changes, the negative test case // RazorPagesWithBasePathTest.PageOutsideBasePath_IsNotRouteable needs to be updated too. var request = new HttpRequestMessage(HttpMethod.Get, "http://localhost/HelloWorld"); // Act var response = await Client.SendAsync(request); // Assert Assert.Equal(HttpStatusCode.OK, response.StatusCode); var content = await response.Content.ReadAsStringAsync(); Assert.Equal("Hello, World!", content.Trim()); } [Fact] public async Task HelloWorldWithRoute_CanGetContent() { // Arrange var request = new HttpRequestMessage(HttpMethod.Get, "http://localhost/HelloWorldWithRoute/Some/Path/route"); // Act var response = await Client.SendAsync(request); // Assert Assert.Equal(HttpStatusCode.OK, response.StatusCode); var content = await response.Content.ReadAsStringAsync(); Assert.Equal("Hello, route!", content.Trim()); } [Fact] public async Task HelloWorldWithHandler_CanGetContent() { // Arrange var request = new HttpRequestMessage(HttpMethod.Get, "http://localhost/HelloWorldWithHandler?message=handler"); // Act var response = await Client.SendAsync(request); // Assert Assert.Equal(HttpStatusCode.OK, response.StatusCode); var content = await response.Content.ReadAsStringAsync(); Assert.Equal("Hello, handler!", content.Trim()); } [Fact] public async Task HelloWorldWithPageModelHandler_CanGetContent() { // Arrange var request = new HttpRequestMessage(HttpMethod.Get, "http://localhost/HelloWorldWithPageModelHandler?message=pagemodel"); // Act var response = await Client.SendAsync(request); // Assert Assert.Equal(HttpStatusCode.OK, response.StatusCode); var content = await response.Content.ReadAsStringAsync(); Assert.Equal("Hello, pagemodel!", content.Trim()); } [Fact] public async Task PageWithoutContent() { // Arrange var request = new HttpRequestMessage(HttpMethod.Get, "http://localhost/PageWithoutContent/No/Content/Path"); // Act var response = await Client.SendAsync(request); // Assert Assert.Equal(HttpStatusCode.OK, response.StatusCode); var content = await response.Content.ReadAsStringAsync(); Assert.Equal("", content); } [Fact] public async Task ViewReturnsPage() { // Arrange var request = new HttpRequestMessage(HttpMethod.Get, "http://localhost/OnGetView"); // Act var response = await Client.SendAsync(request); // Assert Assert.Equal(HttpStatusCode.OK, response.StatusCode); var content = await response.Content.ReadAsStringAsync(); Assert.Equal("The message: From OnGet", content.Trim()); } [Fact] public async Task TempData_SetTempDataInPage_CanReadValue() { // Arrange 1 var url = "http://localhost/TempData/SetTempDataOnPageAndRedirect?message=Hi1"; var request = new HttpRequestMessage(HttpMethod.Get, url); // Act 1 var response = await Client.SendAsync(request); // Assert 1 Assert.Equal(HttpStatusCode.Redirect, response.StatusCode); // Arrange 2 request = new HttpRequestMessage(HttpMethod.Get, response.Headers.Location); request.Headers.Add("Cookie", GetCookie(response)); // Act2 response = await Client.SendAsync(request); var content = await response.Content.ReadAsStringAsync(); Assert.Equal("Hi1", content.Trim()); } [Fact] public async Task TempData_SetTempDataInPageModel_CanReadValue() { // Arrange 1 var url = "http://localhost/TempData/SetTempDataOnPageModelAndRedirect?message=Hi2"; var request = new HttpRequestMessage(HttpMethod.Get, url); // Act 1 var response = await Client.SendAsync(request); // Assert 1 Assert.Equal(HttpStatusCode.Redirect, response.StatusCode); // Arrange 2 request = new HttpRequestMessage(HttpMethod.Get, response.Headers.Location); request.Headers.Add("Cookie", GetCookie(response)); // Act2 response = await Client.SendAsync(request); var content = await response.Content.ReadAsStringAsync(); Assert.Equal("Hi2", content.Trim()); } [Fact] public async Task AuthorizePage_AddsAuthorizationForSpecificPages() { // Arrange var url = "/HelloWorldWithAuth"; // Act var response = await Client.GetAsync(url); // Assert Assert.Equal(HttpStatusCode.Redirect, response.StatusCode); Assert.Equal("/Login?ReturnUrl=%2FHelloWorldWithAuth", response.Headers.Location.PathAndQuery); } private static string GetCookie(HttpResponseMessage response) { var setCookie = response.Headers.GetValues("Set-Cookie").ToArray(); return setCookie[0].Split(';').First(); } public class CookieMetadata { public string Key { get; set; } public string Value { get; set; } } } }