using DramaLing.Api.Services.Infrastructure.Caching; using Microsoft.Extensions.Logging; namespace DramaLing.Api.Tests.Unit.Services; /// /// JsonCacheSerializer 單元測試 /// public class JsonCacheSerializerTests { private readonly JsonCacheSerializer _serializer; private readonly ILogger _logger; public JsonCacheSerializerTests() { _logger = new TestLogger(); _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(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(() => _serializer.Serialize(nullObject)); } [Fact] public void Deserialize_InvalidByteArray_ShouldReturnNull() { // Arrange var invalidData = new byte[] { 1, 2, 3, 4 }; // Act var result = _serializer.Deserialize(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 { 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(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 Values { get; set; } = new(); public TestData NestedData { get; set; } = new(); public DateTime CreatedAt { get; set; } } } /// /// 簡單的測試用 Logger 實作 /// public class TestLogger : ILogger { public IDisposable? BeginScope(TState state) where TState : notnull => null; public bool IsEnabled(LogLevel logLevel) => false; public void Log(LogLevel logLevel, EventId eventId, TState state, Exception? exception, Func formatter) { } }