Files

77 lines
2.9 KiB
C#

using WxAgent.Core;
using Xunit;
namespace WxAgent.Core.Tests;
public sealed class WechatM5Tests
{
[Fact]
public void GetUrl_ExtractsFirstHttpUrlAndTrailingPunctuation()
{
var message = Message("文档:https://example.com/a?q=1。", ChatMessageType.Link);
Assert.Equal("https://example.com/a?q=1", WechatMessageContentParser.GetUrl(message)?.AbsoluteUri);
}
[Fact]
public void ToMarkdown_FormatsLinkAndQuote()
{
var message = Message(
"项目主页 https://example.com",
ChatMessageType.Link,
new QuotedMessageSnapshot("甲", "原消息"));
Assert.Equal("> 原消息\n\n[项目主页](https://example.com/)", WechatMessageContentParser.ToMarkdown(message).Replace("\r\n", "\n"));
}
[Fact]
public void GetContent_PreservesTypedMessageData()
{
var message = Message("[图片]", ChatMessageType.Image);
var content = WechatMessageContentParser.GetContent(message);
Assert.Equal(ChatMessageType.Image, content.Type);
Assert.Equal("[图片]", content.Text);
Assert.Null(content.Url);
}
[Fact]
public void MomentFingerprint_IsStableAndSensitiveToContent()
{
var first = WechatMessageContentParser.MomentFingerprint("甲", "内容", "昨天");
Assert.Equal(first, WechatMessageContentParser.MomentFingerprint("甲", "内容", "昨天"));
Assert.NotEqual(first, WechatMessageContentParser.MomentFingerprint("甲", "其他", "昨天"));
}
[Theory]
[InlineData("[位置]", ChatMessageType.Location)]
[InlineData("[动画表情]", ChatMessageType.Emotion)]
[InlineData("三条聊天记录", ChatMessageType.Merge)]
[InlineData("[名片]", ChatMessageType.PersonalCard)]
[InlineData("[笔记]", ChatMessageType.Note)]
public void Parser_ClassifiesM5SpecialMessages(string text, ChatMessageType expected)
{
var parsed = VisibleMessageParser.Parse([new ChatMessageSource(text, "id")]);
Assert.Equal(expected, Assert.Single(parsed).Type);
}
[Fact]
public void NoteContent_ToMarkdown_PreservesOrderAndFiles()
{
var content = new WechatNoteContent([
new WechatNoteContentPart("text", "标题"),
new WechatNoteContentPart("file", "/tmp/a.png")
]);
Assert.Equal("标题\n\n[a.png](/tmp/a.png)", content.ToMarkdown().Replace("\r\n", "\n"));
}
[Fact]
public void MomentPrivacy_RequiresTagsForRestrictedVisibility()
{
new WechatMomentPublishOptions().Validate();
Assert.Throws<WxAgentException>(() => new WechatMomentPublishOptions(WechatMomentPrivacy.TagWhitelist).Validate());
new WechatMomentPublishOptions(WechatMomentPrivacy.TagBlacklist, ["测试标签"]).Validate();
}
private static ChatMessageSnapshot Message(string text, ChatMessageType type, QuotedMessageSnapshot? quote = null) =>
new(text, "fingerprint", 0, type, quote);
}