feat: 完成云同步、语音控制与多平台扩展基础架构搭建
本次提交完成了项目核心基础架构升级: 1. 新增动态API中间件与权限控制系统,支持匿名/鉴权接口分离 2. 搭建云同步服务体系,包含认证、任务同步、安全策略等核心模块 3. 实现语音控制全链路,从STT/意图解析到命令执行 4. 新增任务类型、附件实体与相关仓储接口 5. 重构前端配置与代理规则,统一后端端口为5057 6. 新增多平台测试项目与CI脚本优化 7. 完善项目文档与代码注释规范 移除了旧版迁移文件与冗余代理配置,调整项目结构适配跨平台部署需求。
This commit is contained in:
@@ -0,0 +1,158 @@
|
||||
using Hua.Todo.Application.Services.Meeting.Models;
|
||||
using Hua.Todo.Core.Entities;
|
||||
using Xunit;
|
||||
|
||||
namespace Hua.Todo.Host.Tests.Meeting;
|
||||
|
||||
/// <summary>
|
||||
/// 工单 03-01 会议数据模型与 API 测试。
|
||||
/// </summary>
|
||||
public class MeetingModelTests
|
||||
{
|
||||
[Fact]
|
||||
public void TaskType_Normal_IsZero()
|
||||
{
|
||||
Assert.Equal(0, (int)TaskType.Normal);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void TaskType_Meeting_IsOne()
|
||||
{
|
||||
Assert.Equal(1, (int)TaskType.Meeting);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void TaskEntity_DefaultTaskType_IsNormal()
|
||||
{
|
||||
var entity = new TaskEntity();
|
||||
Assert.Equal(TaskType.Normal, entity.TaskType);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void TaskEntity_DefaultMeetingNotes_IsNull()
|
||||
{
|
||||
var entity = new TaskEntity();
|
||||
Assert.Null(entity.MeetingNotes);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void TaskEntity_DefaultAudioDuration_IsNull()
|
||||
{
|
||||
var entity = new TaskEntity();
|
||||
Assert.Null(entity.AudioDuration);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void TaskEntity_MeetingFields_CanBeSet()
|
||||
{
|
||||
var entity = new TaskEntity
|
||||
{
|
||||
TaskType = TaskType.Meeting,
|
||||
MeetingNotes = "会议讨论了三个议题",
|
||||
AudioDuration = 1830.5
|
||||
};
|
||||
|
||||
Assert.Equal(TaskType.Meeting, entity.TaskType);
|
||||
Assert.Equal("会议讨论了三个议题", entity.MeetingNotes);
|
||||
Assert.Equal(1830.5, entity.AudioDuration);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void SaveNotesRequest_CanBeCreated()
|
||||
{
|
||||
var taskId = Guid.NewGuid();
|
||||
var request = new SaveNotesRequest
|
||||
{
|
||||
TaskId = taskId,
|
||||
Notes = "会议纪要内容"
|
||||
};
|
||||
|
||||
Assert.Equal(taskId, request.TaskId);
|
||||
Assert.Equal("会议纪要内容", request.Notes);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void SaveNotesResponse_ContainsCorrectData()
|
||||
{
|
||||
var taskId = Guid.NewGuid();
|
||||
var response = new SaveNotesResponse
|
||||
{
|
||||
TaskId = taskId,
|
||||
MeetingNotes = "已保存的纪要"
|
||||
};
|
||||
|
||||
Assert.Equal(taskId, response.TaskId);
|
||||
Assert.Equal("已保存的纪要", response.MeetingNotes);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void MeetingDetailResponse_ContainsCorrectData()
|
||||
{
|
||||
var taskId = Guid.NewGuid();
|
||||
var response = new MeetingDetailResponse
|
||||
{
|
||||
TaskId = taskId,
|
||||
Title = "周一产品评审会",
|
||||
MeetingNotes = "纪要内容",
|
||||
AudioDuration = 900.0,
|
||||
IsCompleted = false
|
||||
};
|
||||
|
||||
Assert.Equal(taskId, response.TaskId);
|
||||
Assert.Equal("周一产品评审会", response.Title);
|
||||
Assert.Equal("纪要内容", response.MeetingNotes);
|
||||
Assert.Equal(900.0, response.AudioDuration);
|
||||
Assert.False(response.IsCompleted);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void TaskEntity_MeetingType_CanBeChildTask()
|
||||
{
|
||||
var parentId = Guid.NewGuid();
|
||||
var parent = new TaskEntity
|
||||
{
|
||||
Id = parentId,
|
||||
Title = "周一例会",
|
||||
TaskType = TaskType.Meeting
|
||||
};
|
||||
|
||||
var child = new TaskEntity
|
||||
{
|
||||
Id = Guid.NewGuid(),
|
||||
Title = "准备PPT",
|
||||
ParentTaskId = parentId,
|
||||
ParentTask = parent
|
||||
};
|
||||
|
||||
parent.SubTasks.Add(child);
|
||||
|
||||
Assert.Single(parent.SubTasks);
|
||||
Assert.Equal(TaskType.Meeting, parent.TaskType);
|
||||
Assert.Equal(parentId, child.ParentTaskId);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void TaskType_IsDefinedOnEntity()
|
||||
{
|
||||
// 验证 TaskType 是 TaskEntity 的有效属性
|
||||
var property = typeof(TaskEntity).GetProperty("TaskType");
|
||||
Assert.NotNull(property);
|
||||
Assert.Equal(typeof(TaskType), property.PropertyType);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void MeetingNotes_IsDefinedOnEntity()
|
||||
{
|
||||
var property = typeof(TaskEntity).GetProperty("MeetingNotes");
|
||||
Assert.NotNull(property);
|
||||
Assert.Equal(typeof(string), property.PropertyType);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void AudioDuration_IsDefinedOnEntity()
|
||||
{
|
||||
var property = typeof(TaskEntity).GetProperty("AudioDuration");
|
||||
Assert.NotNull(property);
|
||||
Assert.Equal(typeof(double?), property.PropertyType);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user