File: TempData\TempDataCascadingValueSupplierTest.cs
Web Access
Project: src\src\Components\Endpoints\test\Microsoft.AspNetCore.Components.Endpoints.Tests.csproj (Microsoft.AspNetCore.Components.Endpoints.Tests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging.Abstractions;
 
namespace Microsoft.AspNetCore.Components.Endpoints;
 
public class TempDataCascadingValueSupplierTest
{
    private readonly TempDataCascadingValueSupplier _supplier;
 
    public TempDataCascadingValueSupplierTest()
    {
        _supplier = new TempDataCascadingValueSupplier(NullLogger<TempDataCascadingValueSupplier>.Instance);
    }
 
    [Fact]
    public void RegisterValueCallback_AddsCallback()
    {
        var callbackInvoked = false;
        _supplier.RegisterValueCallback("key", () =>
        {
            callbackInvoked = true;
            return "value";
        });
 
        var tempData = new TempData(() => new Dictionary<string, object>());
        _supplier.PersistValues(tempData);
 
        Assert.True(callbackInvoked);
    }
 
    [Fact]
    public void RegisterValueCallback_ThrowsForDuplicateKey()
    {
        _supplier.RegisterValueCallback("key", () => "value1");
 
        var ex = Assert.Throws<InvalidOperationException>(() =>
            _supplier.RegisterValueCallback("key", () => "value2"));
 
        Assert.Contains("key", ex.Message);
    }
 
    [Fact]
    public void PersistValues_SetsValueInTempData()
    {
        _supplier.RegisterValueCallback("key", () => "persisted value");
 
        var tempData = new TempData(() => new Dictionary<string, object>());
        _supplier.PersistValues(tempData);
 
        Assert.Equal("persisted value", tempData.Peek("key"));
    }
 
    [Fact]
    public void PersistValues_RemovesKey_WhenCallbackReturnsNull()
    {
        var tempData = new TempData(() => new Dictionary<string, object>());
        tempData["key"] = "existing";
 
        _supplier.RegisterValueCallback("key", () => null);
        _supplier.PersistValues(tempData);
 
        Assert.Null(tempData.Peek("key"));
    }
 
    [Fact]
    public void PersistValues_HandlesMultipleKeys()
    {
        _supplier.RegisterValueCallback("key1", () => "value1");
        _supplier.RegisterValueCallback("key2", () => "value2");
        _supplier.RegisterValueCallback("key3", () => "value3");
 
        var tempData = new TempData(() => new Dictionary<string, object>());
        _supplier.PersistValues(tempData);
 
        Assert.Equal("value1", tempData.Peek("key1"));
        Assert.Equal("value2", tempData.Peek("key2"));
        Assert.Equal("value3", tempData.Peek("key3"));
    }
 
    [Fact]
    public void PersistValues_ContinuesOnCallbackException()
    {
        _supplier.RegisterValueCallback("key1", () => throw new InvalidOperationException("Test exception"));
        _supplier.RegisterValueCallback("key2", () => "value2");
 
        var tempData = new TempData(() => new Dictionary<string, object>());
        _supplier.PersistValues(tempData);
 
        Assert.Null(tempData.Peek("key1"));
        Assert.Equal("value2", tempData.Peek("key2"));
    }
 
    [Fact]
    public void PersistValues_IsCaseInsensitiveForKeys()
    {
        _supplier.RegisterValueCallback("MyKey", () => "value");
 
        var tempData = new TempData(() => new Dictionary<string, object>());
        _supplier.PersistValues(tempData);
 
        Assert.True(tempData.ContainsKey("mykey"));
    }
 
    [Fact]
    public void DeleteCallbacks_RemovesCallbacksForKey()
    {
        var callbackInvoked = false;
        _supplier.RegisterValueCallback("key", () =>
        {
            callbackInvoked = true;
            return "value";
        });
 
        _supplier.DeleteValueCallback("key");
 
        var tempData = new TempData(() => new Dictionary<string, object>());
        _supplier.PersistValues(tempData);
 
        Assert.False(callbackInvoked);
        Assert.Null(tempData.Peek("key"));
    }
}