4fe0b5a963
本次提交完成了项目核心基础架构升级: 1. 新增动态API中间件与权限控制系统,支持匿名/鉴权接口分离 2. 搭建云同步服务体系,包含认证、任务同步、安全策略等核心模块 3. 实现语音控制全链路,从STT/意图解析到命令执行 4. 新增任务类型、附件实体与相关仓储接口 5. 重构前端配置与代理规则,统一后端端口为5057 6. 新增多平台测试项目与CI脚本优化 7. 完善项目文档与代码注释规范 移除了旧版迁移文件与冗余代理配置,调整项目结构适配跨平台部署需求。
138 lines
4.2 KiB
C#
138 lines
4.2 KiB
C#
using System.Text.Json;
|
|
using Hua.Todo.Application.Services.CloudSync.Models;
|
|
using Hua.Todo.Core.Entities;
|
|
using Xunit;
|
|
|
|
namespace Hua.Todo.Host.Tests;
|
|
|
|
/// <summary>
|
|
/// CloudSync DTO 单元测试。
|
|
/// </summary>
|
|
public class CloudSyncDtoTests
|
|
{
|
|
/// <summary>
|
|
/// 测试 CloudTaskItem JSON 序列化使用 camelCase。
|
|
/// </summary>
|
|
[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<Dictionary<string, object>>(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"));
|
|
}
|
|
|
|
/// <summary>
|
|
/// 测试 CloudTaskUpsert JSON 反序列化。
|
|
/// </summary>
|
|
[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<CloudTaskUpsert>(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);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 测试 SyncRequest JSON 反序列化。
|
|
/// </summary>
|
|
[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<SyncRequest>(json);
|
|
|
|
// Assert
|
|
Assert.NotNull(request);
|
|
Assert.Equal(2, request.Upserts.Count);
|
|
Assert.Single(request.Deletes);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 测试 SyncResponse JSON 序列化。
|
|
/// </summary>
|
|
[Fact]
|
|
public void SyncResponse_Serialization()
|
|
{
|
|
// Arrange
|
|
var response = new SyncResponse
|
|
{
|
|
ServerTimeUtc = new DateTime(2024, 1, 1, 12, 0, 0, DateTimeKind.Utc),
|
|
Tasks = new List<CloudTaskItem>
|
|
{
|
|
new CloudTaskItem
|
|
{
|
|
Id = Guid.NewGuid(),
|
|
Title = "Task 1",
|
|
Priority = TaskPriority.Medium
|
|
}
|
|
}
|
|
};
|
|
|
|
// Act
|
|
var json = JsonSerializer.Serialize(response);
|
|
var deserialized = JsonSerializer.Deserialize<Dictionary<string, object>>(json);
|
|
|
|
// Assert
|
|
Assert.NotNull(deserialized);
|
|
Assert.True(deserialized.ContainsKey("serverTimeUtc"));
|
|
Assert.True(deserialized.ContainsKey("tasks"));
|
|
}
|
|
|
|
/// <summary>
|
|
/// 测试 Guid 类型的 JSON 序列化。
|
|
/// </summary>
|
|
[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);
|
|
}
|
|
}
|