- 将通用 Entities 命名空间拆分为具体业务实体子目录 - 更新所有实体类型引用为具体的 Entity 后缀类型 - 将 ModelType、ModelProvider、GroupMemberRole 等枚举重命名为 Enum 后缀 - 重构 AiModel 相关配置和映射逻辑适配新的实体结构 - 更新测试代码中的实体类型引用和枚举使用 - 调整应用层处理器中的实体创建和查询逻辑 - 修改 appsettings.json 中的基础设施主机配置为动态占位符模式
95 lines
3.0 KiB
C#
95 lines
3.0 KiB
C#
using IM.Application.Chat.Commands;
|
|
using IM.Application.Chat.DTOs;
|
|
using IM.Application.Chat.Validators;
|
|
using IM.Domain.Enums;
|
|
using Xunit;
|
|
|
|
namespace BuildFlow.IM.Tests.Chat;
|
|
|
|
public class SendMessageCommandValidatorTests
|
|
{
|
|
private readonly SendMessageCommandValidator _validator = new();
|
|
|
|
[Fact]
|
|
public void Rejects_file_message_without_file_metadata()
|
|
{
|
|
var command = CreateCommand(MessageContentTypeEnum.File, "report.md", null);
|
|
|
|
var result = _validator.Validate(command);
|
|
|
|
Assert.False(result.IsValid);
|
|
Assert.Contains(result.Errors, e => e.ErrorMessage == "文件消息必须包含文件元数据");
|
|
}
|
|
|
|
[Fact]
|
|
public void Accepts_file_message_with_storage_reference_metadata()
|
|
{
|
|
var metadata = new MessageMetadataDto("report.md", 1024, null, null, null, null, null)
|
|
{
|
|
BucketName = "im-files",
|
|
ObjectKey = "im/20260609/report.md",
|
|
ContentType = "text/markdown"
|
|
};
|
|
var command = CreateCommand(MessageContentTypeEnum.File, "report.md", metadata);
|
|
|
|
var result = _validator.Validate(command);
|
|
|
|
Assert.True(result.IsValid);
|
|
}
|
|
|
|
[Fact]
|
|
public void Rejects_file_message_larger_than_200mb()
|
|
{
|
|
var metadata = new MessageMetadataDto("report.zip", 200L * 1024 * 1024 + 1, null, null, null, null, null)
|
|
{
|
|
BucketName = "im-files",
|
|
ObjectKey = "im/20260705/report.zip",
|
|
ContentType = "application/zip"
|
|
};
|
|
var command = CreateCommand(MessageContentTypeEnum.File, "report.zip", metadata);
|
|
|
|
var result = _validator.Validate(command);
|
|
|
|
Assert.False(result.IsValid);
|
|
Assert.Contains(result.Errors, e => e.ErrorMessage == "文件不能超过 200MB");
|
|
}
|
|
|
|
[Fact]
|
|
public void Rejects_image_message_without_preview_or_storage_reference()
|
|
{
|
|
var metadata = new MessageMetadataDto("photo.png", 2048, null, null, null, null, null);
|
|
var command = CreateCommand(MessageContentTypeEnum.Image, "[图片]", metadata);
|
|
|
|
var result = _validator.Validate(command);
|
|
|
|
Assert.False(result.IsValid);
|
|
Assert.Contains(result.Errors, e => e.ErrorMessage == "图片消息必须包含图片预览地址或存储引用");
|
|
}
|
|
|
|
[Fact]
|
|
public void Rejects_unknown_message_content_type()
|
|
{
|
|
var command = CreateCommand((MessageContentTypeEnum)999, "hello", null);
|
|
|
|
var result = _validator.Validate(command);
|
|
|
|
Assert.False(result.IsValid);
|
|
Assert.Contains(result.Errors, e => e.ErrorMessage == "不支持的消息类型");
|
|
}
|
|
|
|
private static SendMessageCommand CreateCommand(
|
|
MessageContentTypeEnum contentType,
|
|
string content,
|
|
MessageMetadataDto? metadata)
|
|
{
|
|
return new SendMessageCommand(
|
|
Guid.Parse("11111111-1111-1111-1111-111111111111"),
|
|
Guid.Parse("22222222-2222-2222-2222-222222222222"),
|
|
"alice",
|
|
contentType,
|
|
content,
|
|
metadata,
|
|
null);
|
|
}
|
|
}
|