dramaling-vocab-learning/backend/DramaLing.Api/DramaLing.Api.Tests/Unit/Services/JsonCacheSerializerTests.cs

124 lines
3.8 KiB
C#

using DramaLing.Api.Services.Infrastructure.Caching;
using Microsoft.Extensions.Logging;
namespace DramaLing.Api.Tests.Unit.Services;
/// <summary>
/// JsonCacheSerializer 單元測試
/// </summary>
public class JsonCacheSerializerTests
{
private readonly JsonCacheSerializer _serializer;
private readonly ILogger<JsonCacheSerializer> _logger;
public JsonCacheSerializerTests()
{
_logger = new TestLogger<JsonCacheSerializer>();
_serializer = new JsonCacheSerializer(_logger);
}
[Fact]
public void Serialize_ValidObject_ShouldReturnByteArray()
{
// Arrange
var testObject = new TestData { Name = "Test", Value = 123 };
// Act
var result = _serializer.Serialize(testObject);
// Assert
Assert.NotNull(result);
Assert.True(result.Length > 0);
}
[Fact]
public void Deserialize_ValidByteArray_ShouldReturnObject()
{
// Arrange
var testObject = new TestData { Name = "Test", Value = 123 };
var serialized = _serializer.Serialize(testObject);
// Act
var result = _serializer.Deserialize<TestData>(serialized);
// Assert
Assert.NotNull(result);
Assert.Equal("Test", result.Name);
Assert.Equal(123, result.Value);
}
[Fact]
public void Serialize_NullObject_ShouldThrowException()
{
// Arrange
TestData nullObject = null!;
// Act & Assert
Assert.Throws<ArgumentNullException>(() => _serializer.Serialize(nullObject));
}
[Fact]
public void Deserialize_InvalidByteArray_ShouldReturnNull()
{
// Arrange
var invalidData = new byte[] { 1, 2, 3, 4 };
// Act
var result = _serializer.Deserialize<TestData>(invalidData);
// Assert
Assert.Null(result);
}
[Fact]
public void RoundTrip_ComplexObject_ShouldMaintainDataIntegrity()
{
// Arrange
var complexObject = new ComplexTestData
{
Id = Guid.NewGuid(),
Name = "Complex Test",
Values = new List<int> { 1, 2, 3, 4, 5 },
NestedData = new TestData { Name = "Nested", Value = 999 },
CreatedAt = DateTime.UtcNow
};
// Act
var serialized = _serializer.Serialize(complexObject);
var deserialized = _serializer.Deserialize<ComplexTestData>(serialized);
// Assert
Assert.NotNull(deserialized);
Assert.Equal(complexObject.Id, deserialized.Id);
Assert.Equal(complexObject.Name, deserialized.Name);
Assert.Equal(complexObject.Values.Count, deserialized.Values.Count);
Assert.Equal(complexObject.NestedData.Name, deserialized.NestedData.Name);
Assert.Equal(complexObject.NestedData.Value, deserialized.NestedData.Value);
}
// Test data classes
public class TestData
{
public string Name { get; set; } = string.Empty;
public int Value { get; set; }
}
public class ComplexTestData
{
public Guid Id { get; set; }
public string Name { get; set; } = string.Empty;
public List<int> Values { get; set; } = new();
public TestData NestedData { get; set; } = new();
public DateTime CreatedAt { get; set; }
}
}
/// <summary>
/// 簡單的測試用 Logger 實作
/// </summary>
public class TestLogger<T> : ILogger<T>
{
public IDisposable? BeginScope<TState>(TState state) where TState : notnull => null;
public bool IsEnabled(LogLevel logLevel) => false;
public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception? exception, Func<TState, Exception?, string> formatter) { }
}