using WxAgent.Core; using Xunit; namespace WxAgent.Core.Tests; public sealed class WechatManagementTests { [Fact] public void RequireConfirmation_RejectsMissingOrWrongToken() { var missing = Assert.Throws(() => WechatOperationPolicy.RequireConfirmation(null, "delete session")); var wrong = Assert.Throws(() => WechatOperationPolicy.RequireConfirmation("confirm", "delete session")); Assert.Equal(WxAgentErrorCode.InvalidArgument, missing.Code); Assert.Equal(WxAgentErrorCode.InvalidArgument, wrong.Code); } [Fact] public void RequireConfirmation_AcceptsExactToken() { WechatOperationPolicy.RequireConfirmation(WechatOperationPolicy.Confirmation, "delete session"); } [Fact] public void ValidateNames_RequiresAtLeastOneUsableName() { Assert.Throws(() => WechatOperationPolicy.ValidateNames([], "members")); Assert.Throws(() => WechatOperationPolicy.ValidateNames(["ok", ""], "members")); Assert.Throws(() => WechatOperationPolicy.ValidateNames(["same", "same"], "members")); WechatOperationPolicy.ValidateNames(["one", "two"], "members"); } [Fact] public void RequireUnique_RejectsMissingAndAmbiguousTargets() { Assert.Equal("one", WechatOperationPolicy.RequireUnique(new[] { "one" }, "target")); Assert.Equal(WxAgentErrorCode.ControlNotFound, Assert.Throws(() => WechatOperationPolicy.RequireUnique(Array.Empty(), "target")).Code); Assert.Equal(WxAgentErrorCode.ControlNotFound, Assert.Throws(() => WechatOperationPolicy.RequireUnique(new[] { "one", "two" }, "target")).Code); } [Fact] public void OperationResult_UnconfirmedIsNotSuccessAndWarnsAgainstRetry() { var result = WechatOperationResult.Unconfirmed("Submission"); Assert.False(result.Success); Assert.Equal(WxAgentErrorCode.ResultUnconfirmed, result.Code); Assert.Contains("Do not retry", result.Message); } [Fact] public void OperationResult_OkHasNoErrorCode() { var result = WechatOperationResult.Ok("done"); Assert.True(result.Success); Assert.Null(result.Code); Assert.Equal("done", result.Message); } }