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); } }