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