build-flow.api/tests/BuildFlow.IM.Tests/Chat/SendMessageCommandValidatorTests.cs
xiangning 3b13099378 refactor(domain): 重构领域实体结构并更新枚举命名
- 将通用 Entities 命名空间拆分为具体业务实体子目录
- 更新所有实体类型引用为具体的 Entity 后缀类型
- 将 ModelType、ModelProvider、GroupMemberRole 等枚举重命名为 Enum 后缀
- 重构 AiModel 相关配置和映射逻辑适配新的实体结构
- 更新测试代码中的实体类型引用和枚举使用
- 调整应用层处理器中的实体创建和查询逻辑
- 修改 appsettings.json 中的基础设施主机配置为动态占位符模式
2026-07-19 14:02:32 +08:00

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