File: Lifetime\ComponentApplicationStateTest.cs
Web Access
Project: src\src\Components\Components\test\Microsoft.AspNetCore.Components.Tests.csproj (Microsoft.AspNetCore.Components.Tests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.Text.Json;
 
namespace Microsoft.AspNetCore.Components;
 
public class ComponentApplicationStateTest
{
    [Fact]
    public void InitializeExistingState_SetupsState()
    {
        // Arrange
        var applicationState = new PersistentComponentState(new Dictionary<string, byte[]>(), new List<PersistComponentStateRegistration>());
        var existingState = new Dictionary<string, byte[]>
        {
            ["MyState"] = JsonSerializer.SerializeToUtf8Bytes(new byte[] { 1, 2, 3, 4 })
        };
 
        // Act
        applicationState.InitializeExistingState(existingState);
 
        // Assert
        Assert.True(applicationState.TryTakeFromJson<byte[]>("MyState", out var existing));
        Assert.Equal(new byte[] { 1, 2, 3, 4 }, existing);
    }
 
    [Fact]
    public void InitializeExistingState_ThrowsIfAlreadyInitialized()
    {
        // Arrange
        var applicationState = new PersistentComponentState(new Dictionary<string, byte[]>(), new List<PersistComponentStateRegistration>());
        var existingState = new Dictionary<string, byte[]>
        {
            ["MyState"] = new byte[] { 1, 2, 3, 4 }
        };
 
        applicationState.InitializeExistingState(existingState);
 
        // Act & Assert
        Assert.Throws<InvalidOperationException>(() => applicationState.InitializeExistingState(existingState));
    }
 
    [Fact]
    public void TryRetrieveState_ReturnsStateWhenItExists()
    {
        // Arrange
        var applicationState = new PersistentComponentState(new Dictionary<string, byte[]>(), new List<PersistComponentStateRegistration>());
        var existingState = new Dictionary<string, byte[]>
        {
            ["MyState"] = JsonSerializer.SerializeToUtf8Bytes(new byte[] { 1, 2, 3, 4 })
        };
 
        // Act
        applicationState.InitializeExistingState(existingState);
 
        // Assert
        Assert.True(applicationState.TryTakeFromJson<byte[]>("MyState", out var existing));
        Assert.Equal(new byte[] { 1, 2, 3, 4 }, existing);
        Assert.False(applicationState.TryTakeFromJson<byte[]>("MyState", out var gone));
    }
 
    [Fact]
    public void PersistState_SavesDataToTheStoreAsync()
    {
        // Arrange
        var currentState = new Dictionary<string, byte[]>();
        var applicationState = new PersistentComponentState(currentState, new List<PersistComponentStateRegistration>())
        {
            PersistingState = true
        };
        var myState = new byte[] { 1, 2, 3, 4 };
 
        // Act
        applicationState.PersistAsJson("MyState", myState);
 
        // Assert
        Assert.True(currentState.TryGetValue("MyState", out var stored));
        Assert.Equal(myState, JsonSerializer.Deserialize<byte[]>(stored));
    }
 
    [Fact]
    public void PersistState_ThrowsForDuplicateKeys()
    {
        // Arrange
        var currentState = new Dictionary<string, byte[]>();
        var applicationState = new PersistentComponentState(currentState, new List<PersistComponentStateRegistration>())
        {
            PersistingState = true
        };
        var myState = new byte[] { 1, 2, 3, 4 };
 
        applicationState.PersistAsJson("MyState", myState);
 
        // Act & Assert
        Assert.Throws<ArgumentException>(() => applicationState.PersistAsJson("MyState", myState));
    }
 
    [Fact]
    public void PersistAsJson_SerializesTheDataToJsonAsync()
    {
        // Arrange
        var currentState = new Dictionary<string, byte[]>();
        var applicationState = new PersistentComponentState(currentState, new List<PersistComponentStateRegistration>())
        {
            PersistingState = true
        };
        var myState = new byte[] { 1, 2, 3, 4 };
 
        // Act
        applicationState.PersistAsJson("MyState", myState);
 
        // Assert
        Assert.True(currentState.TryGetValue("MyState", out var stored));
        Assert.Equal(myState, JsonSerializer.Deserialize<byte[]>(stored));
    }
 
    [Fact]
    public void PersistAsJson_NullValueAsync()
    {
        // Arrange
        var currentState = new Dictionary<string, byte[]>();
        var applicationState = new PersistentComponentState(currentState, new List<PersistComponentStateRegistration>())
        {
            PersistingState = true
        };
 
        // Act
        applicationState.PersistAsJson<byte[]>("MyState", null);
 
        // Assert
        Assert.True(currentState.TryGetValue("MyState", out var stored));
        Assert.Null(JsonSerializer.Deserialize<byte[]>(stored));
    }
 
    [Fact]
    public void TryRetrieveFromJson_DeserializesTheDataFromJson()
    {
        // Arrange
        var myState = new byte[] { 1, 2, 3, 4 };
        var serialized = JsonSerializer.SerializeToUtf8Bytes(myState);
        var existingState = new Dictionary<string, byte[]>() { ["MyState"] = serialized };
        var applicationState = new PersistentComponentState(new Dictionary<string, byte[]>(), new List<PersistComponentStateRegistration>());
 
        applicationState.InitializeExistingState(existingState);
 
        // Act
        Assert.True(applicationState.TryTakeFromJson<byte[]>("MyState", out var stored));
 
        // Assert
        Assert.Equal(myState, stored);
        Assert.False(applicationState.TryTakeFromJson<byte[]>("MyState", out _));
    }
 
    [Fact]
    public void TryRetrieveFromJson_NullValue()
    {
        // Arrange
        var serialized = JsonSerializer.SerializeToUtf8Bytes<byte[]>(null);
        var existingState = new Dictionary<string, byte[]>() { ["MyState"] = serialized };
        var applicationState = new PersistentComponentState(new Dictionary<string, byte[]>(), new List<PersistComponentStateRegistration>());
 
        applicationState.InitializeExistingState(existingState);
 
        // Act
        Assert.True(applicationState.TryTakeFromJson<byte[]>("MyState", out var stored));
 
        // Assert
        Assert.Null(stored);
        Assert.False(applicationState.TryTakeFromJson<byte[]>("MyState", out _));
    }
}