124 lines
3.8 KiB
C#
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) { }
|
|
} |