66 lines
2.4 KiB
C#
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();
|
|
}
|
|
} |