Files

66 lines
2.4 KiB
C#

using System.Text;
using WxAgent.Core;
using Xunit;
using ZstdSharp;
namespace WxAgent.Core.Tests;
public sealed class WechatDbMessageTests
{
[Fact]
public void TableNameForMatchesMd5HexOfChatId()
{
Assert.Equal("Msg_" + Md5Hex("wxid_test"), WechatDbMessage.TableNameFor("wxid_test"));
Assert.Equal("Msg_" + Md5Hex("测试群组"), WechatDbMessage.TableNameFor("测试群组"));
}
[Fact]
public void DecodeContentHandlesPlainHexUtf8()
{
Assert.Equal("hello", WechatDbMessage.DecodeContent(Convert.ToHexString(Encoding.UTF8.GetBytes("hello")), compressed: false));
Assert.Empty(WechatDbMessage.DecodeContent("", compressed: false));
Assert.Empty(WechatDbMessage.DecodeContent("not-hex!", compressed: false));
}
[Fact]
public void DecodeContentDecompressesZstdPayloads()
{
var payload = Encoding.UTF8.GetBytes("wx-agent-zstd-roundtrip-消息测试");
using var compressor = new CompressionStream(new MemoryStream());
// ZstdSharp.CompressionStream writes on dispose; wrap in a memory stream instead.
var compressed = Compress(payload);
var hex = Convert.ToHexString(compressed);
var decoded = WechatDbMessage.DecodeContent(hex, compressed: true);
Assert.Equal("wx-agent-zstd-roundtrip-消息测试", decoded);
}
[Fact]
public void DecodeContentTreatsCompressedFlagWithoutMagicAsUndecodable()
{
var hex = Convert.ToHexString(Encoding.UTF8.GetBytes("plain"));
Assert.Empty(WechatDbMessage.DecodeContent(hex, compressed: true));
}
[Fact]
public void IsSelfUsesWxIdPrefixOfAccountDirectory()
{
Assert.True(WechatDbMessage.IsSelf("wxid_abc123", "wxid_abc123_def456"));
Assert.False(WechatDbMessage.IsSelf("wxid_other", "wxid_abc123_def456"));
Assert.Null(WechatDbMessage.IsSelf(null, "wxid_abc123_def456"));
Assert.Null(WechatDbMessage.IsSelf("wxid_abc123", null));
}
private static string Md5Hex(string value) =>
Convert.ToHexString(System.Security.Cryptography.MD5.HashData(Encoding.UTF8.GetBytes(value))).ToLowerInvariant();
private static byte[] Compress(byte[] payload)
{
using var output = new MemoryStream();
using (var compressor = new CompressionStream(output))
{
compressor.Write(payload);
}
return output.ToArray();
}
}