using WxAgent.Core; using Xunit; namespace WxAgent.Core.Tests; public sealed class WechatGroupMemberQueryTests { [Fact] public void QueryUsesStableIdsAndBoundParameters() { var parameters = WechatGroupMemberQuery.Parameters("123@chatroom", 2, 4).ToDictionary(pair => pair.Key, pair => pair.Value); Assert.Equal("123@chatroom", parameters["$group"]); Assert.Equal(3, parameters["$limit"]); Assert.Equal(4, parameters["$offset"]); Assert.Contains("c.id = m.member_id", WechatGroupMemberQuery.Sql); Assert.Contains("ORDER BY m.member_id", WechatGroupMemberQuery.Sql); Assert.DoesNotContain("123@chatroom", WechatGroupMemberQuery.Sql); } [Theory] [InlineData("group")] [InlineData("")] [InlineData(" ")] public void StableGroupUsernameIsRequired(string group) => Assert.Equal(WxAgentErrorCode.InvalidArgument, Assert.Throws(() => WechatGroupMemberQuery.Parameters(group, 1, 0)).Code); [Fact] public void PagePreservesDuplicateDisplayNamesAndSignalsNextOffset() { WechatDatabaseGroupMember[] rows = [ new(1, "one", "same", true), new(2, "two", "same", false), new(3, "three", "three", false) ]; var page = WechatGroupMemberQuery.Page("123@chatroom", rows, 2, 4); Assert.True(page.HasMore); Assert.Equal(6, page.NextOffset); Assert.Equal(new[] { "one", "two" }, page.Members.Select(member => member.Username)); Assert.True(page.Members[0].IsOwner); } }