File: IPersistentComponentStateSerializerTests.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.Buffers;
using System.Text;
using System.Text.Json;
using Microsoft.AspNetCore.Components.Infrastructure;
using Microsoft.Extensions.DependencyInjection;
 
namespace Microsoft.AspNetCore.Components;
 
public class IPersistentComponentStateSerializerTests
{
    [Fact]
    public void PersistAsync_CanUseCustomSerializer()
    {
        // Arrange
        var currentState = new Dictionary<string, byte[]>();
        var state = new PersistentComponentState(currentState, []);
        var serviceProvider = new ServiceCollection().BuildServiceProvider();
        var stateValueProvider = new PersistentStateValueProvider(state, serviceProvider);
        var customSerializer = new TestStringSerializer();
        var testValue = "Hello, World!";
 
        state.PersistingState = true;
 
        // Act
        stateValueProvider.PersistAsync("test-key", testValue, customSerializer);
 
        // Assert
        state.PersistingState = false;
        
        // Simulate the state transfer that happens between persist and restore phases
        var newState = new PersistentComponentState(new Dictionary<string, byte[]>(), []);
        newState.InitializeExistingState(currentState);
        var newStateValueProvider = new PersistentStateValueProvider(newState, serviceProvider);
        
        Assert.True(newStateValueProvider.TryTake("test-key", customSerializer, out var retrievedValue));
        Assert.Equal(testValue, retrievedValue);
    }
 
    [Fact]
    public void TryTake_CanUseCustomSerializer()
    {
        // Arrange
        var customData = "Custom Data";
        var customBytes = Encoding.UTF8.GetBytes(customData);
        var existingState = new Dictionary<string, byte[]> { { "test-key", customBytes } };
        
        var state = new PersistentComponentState(new Dictionary<string, byte[]>(), []);
        state.InitializeExistingState(existingState);
        
        var serviceProvider = new ServiceCollection().BuildServiceProvider();
        var stateValueProvider = new PersistentStateValueProvider(state, serviceProvider);
        var customSerializer = new TestStringSerializer();
 
        // Act
        var success = stateValueProvider.TryTake("test-key", customSerializer, out var retrievedValue);
 
        // Assert
        Assert.True(success);
        Assert.Equal(customData, retrievedValue);
    }
 
    private class TestStringSerializer : PersistentComponentStateSerializer<string>
    {
        public override void Persist(string value, IBufferWriter<byte> writer)
        {
            var bytes = Encoding.UTF8.GetBytes(value);
            writer.Write(bytes);
        }
 
        public override string Restore(ReadOnlySequence<byte> data)
        {
            var bytes = data.ToArray();
            return Encoding.UTF8.GetString(bytes);
        }
    }
}