Uses correct preview cookie same site and secure settings to allow preview mode to flow between links in the preview frame (#18640)

* Uses correct preview cookie same site and secure settings to allow preview mode to flow between links in the preview frame.

* Fixed comment.
This commit is contained in:
Andy Butland
2025-03-21 15:20:08 +01:00
committed by GitHub
parent 45b0e43b89
commit 394210a8f7
7 changed files with 235 additions and 8 deletions

View File

@@ -0,0 +1,91 @@
// Copyright (c) Umbraco.
// See LICENSE for more details.
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Primitives;
using Microsoft.Net.Http.Headers;
using Moq;
using NUnit.Framework;
using Umbraco.Cms.Web.Common.AspNetCore;
namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Web.Common.Extensions;
[TestFixture]
public class AspNetCoreCookieManagerTests
{
private const string CookieName = "testCookie";
private const string CookieValue = "testValue";
[Test]
public void Can_Set_Cookie()
{
var httpContext = new DefaultHttpContext();
var cookieManager = CreateCookieManager(httpContext);
cookieManager.SetCookieValue(CookieName, CookieValue, true, true, "Strict");
Assert.AreEqual(GetExpectedCookie(), httpContext.Response.Headers.SetCookie);
}
[Test]
public void Set_Cookie_With_Invalid_Same_Site_Value_Throws_Expected_Exception()
{
var httpContext = new DefaultHttpContext();
var cookieManager = CreateCookieManager(httpContext);
Assert.Throws<ArgumentException>(() => cookieManager.SetCookieValue(CookieName, CookieValue, true, true, "invalid"));
}
[Test]
public void Can_Get_Cookie()
{
var httpContext = new DefaultHttpContext();
AddCookieToRequest(httpContext);
var cookieManager = CreateCookieManager(httpContext);
var result = cookieManager.GetCookieValue(CookieName);
Assert.AreEqual(CookieValue, result);
}
[Test]
public void Can_Verify_Cookie_Exists()
{
var httpContext = new DefaultHttpContext();
AddCookieToRequest(httpContext);
var cookieManager = CreateCookieManager(httpContext);
var result = cookieManager.HasCookie(CookieName);
Assert.IsTrue(result);
}
[Test]
public void Can_Expire_Cookie()
{
var httpContext = new DefaultHttpContext();
AddCookieToRequest(httpContext);
var cookieManager = CreateCookieManager(httpContext);
cookieManager.SetCookieValue(CookieName, CookieValue, true, true, "Strict");
cookieManager.ExpireCookie(CookieName);
var setCookieHeader = httpContext.Response.Headers.SetCookie.ToString();
Assert.IsTrue(setCookieHeader.StartsWith(GetExpectedCookie()));
Assert.IsTrue(setCookieHeader.Contains($"expires="));
}
private static AspNetCoreCookieManager CreateCookieManager(DefaultHttpContext httpContext)
{
var httpContextAccessor = Mock.Of<IHttpContextAccessor>(x => x.HttpContext == httpContext);
return new AspNetCoreCookieManager(httpContextAccessor);
}
private static void AddCookieToRequest(DefaultHttpContext httpContext)
{
var cookie = new StringValues(CookieName + "=" + CookieValue);
httpContext.Request.Headers.Append(HeaderNames.Cookie, cookie);
}
private static string GetExpectedCookie() => $"testCookie={CookieValue}; path=/; secure; samesite=strict; httponly";
}