using System.Text.Json;
using Hua.Todo.Application.Services.CloudSync.Models;
using Hua.Todo.Core.Entities;
using Xunit;
namespace Hua.Todo.Host.Tests;
///
/// CloudSync DTO 单元测试。
///
public class CloudSyncDtoTests
{
///
/// 测试 CloudTaskItem JSON 序列化使用 camelCase。
///
[Fact]
public void CloudTaskItem_Serialization_UsesCamelCase()
{
// Arrange
var item = new CloudTaskItem
{
Id = Guid.Parse("12345678-1234-1234-1234-123456789012"),
Title = "Test",
Priority = TaskPriority.High,
IsCompleted = true,
CreationTime = new DateTime(2024, 1, 1, 0, 0, 0, DateTimeKind.Utc),
LastModificationTime = new DateTime(2024, 1, 2, 0, 0, 0, DateTimeKind.Utc),
IsDeleted = false
};
// Act
var json = JsonSerializer.Serialize(item);
var deserialized = JsonSerializer.Deserialize>(json);
// Assert
Assert.NotNull(deserialized);
Assert.True(deserialized.ContainsKey("id"));
Assert.True(deserialized.ContainsKey("title"));
Assert.True(deserialized.ContainsKey("priority"));
Assert.True(deserialized.ContainsKey("isCompleted"));
Assert.True(deserialized.ContainsKey("creationTime"));
Assert.True(deserialized.ContainsKey("lastModificationTime"));
Assert.True(deserialized.ContainsKey("isDeleted"));
}
///
/// 测试 CloudTaskUpsert JSON 反序列化。
///
[Fact]
public void CloudTaskUpsert_Deserialization_FromCamelCase()
{
// Arrange
var json = @"{""id"":""12345678-1234-1234-1234-123456789012"",""title"":""Test Task"",""priority"":2,""isCompleted"":true,""lastModificationTime"":""2024-01-02T00:00:00Z""}";
// Act
var upsert = JsonSerializer.Deserialize(json);
// Assert
Assert.NotNull(upsert);
Assert.Equal(Guid.Parse("12345678-1234-1234-1234-123456789012"), upsert.Id);
Assert.Equal("Test Task", upsert.Title);
Assert.Equal(TaskPriority.High, upsert.Priority);
Assert.True(upsert.IsCompleted);
}
///
/// 测试 SyncRequest JSON 反序列化。
///
[Fact]
public void SyncRequest_Deserialization()
{
// Arrange
var json = @"{
""upserts"": [
{""id"":""12345678-1234-1234-1234-123456789012"",""title"":""Task 1""},
{""title"":""Task 2""}
],
""deletes"": [""87654321-4321-4321-4321-210987654321""]
}";
// Act
var request = JsonSerializer.Deserialize(json);
// Assert
Assert.NotNull(request);
Assert.Equal(2, request.Upserts.Count);
Assert.Single(request.Deletes);
}
///
/// 测试 SyncResponse JSON 序列化。
///
[Fact]
public void SyncResponse_Serialization()
{
// Arrange
var response = new SyncResponse
{
ServerTimeUtc = new DateTime(2024, 1, 1, 12, 0, 0, DateTimeKind.Utc),
Tasks = new List
{
new CloudTaskItem
{
Id = Guid.NewGuid(),
Title = "Task 1",
Priority = TaskPriority.Medium
}
}
};
// Act
var json = JsonSerializer.Serialize(response);
var deserialized = JsonSerializer.Deserialize>(json);
// Assert
Assert.NotNull(deserialized);
Assert.True(deserialized.ContainsKey("serverTimeUtc"));
Assert.True(deserialized.ContainsKey("tasks"));
}
///
/// 测试 Guid 类型的 JSON 序列化。
///
[Fact]
public void Guid_Serialization_IsString()
{
// Arrange
var guid = Guid.NewGuid();
var item = new CloudTaskItem { Id = guid };
// Act
var json = JsonSerializer.Serialize(item);
// Assert
Assert.Contains(guid.ToString(), json);
}
}