using System.ComponentModel.DataAnnotations; using MAX.Framework.Commons; using Store.Users.Entities; namespace Store.Users.Tests; public sealed class UserTopUpTests { [Fact] public async Task Message_UsesCurrentIdentity_AndIsVisibleOnlyToOwnerOrAdmin() { using var context = new UserTestContext(); context.CurrentUser.UserName = "main"; var id = await context.Users.AddTopUpMessage(new() { Message = " 充值待核实 " }, default); var message = Assert.Single((await context.Users.TopUpMessages(new(), default)).Items); Assert.Equal(id, message.Id); Assert.Equal("main", message.UserName); Assert.Equal("main", message.NickName); Assert.Equal("充值待核实", message.Message); context.CurrentUser.UserName = "other"; Assert.Empty((await context.Users.TopUpMessages(new(), default)).Items); context.CurrentUser.UserName = "admin"; Assert.Single((await context.Users.TopUpMessages(new(), default)).Items); } [Fact] public async Task ProcessingMessage_UsesAccountScope_AndDoesNotRechargeFunds() { using var context = new UserTestContext(); context.CurrentUser.UserName = "main"; var id = await context.Users.AddTopUpMessage(new() { Message = "充值待核实" }, default); context.CurrentUser.UserName = "other"; var error = await Assert.ThrowsAsync(() => context.Users.UpdateTopUpMessage(new() { Id = id, Result = "已核实" }, default)); Assert.Equal(403, error.Code); context.CurrentUser.UserName = "main"; await context.Users.UpdateTopUpMessage(new() { Id = id, Result = "已核实" }, default); Assert.Equal("已核实", (await context.Users.TopUpMessages(new(), default)).Items.Single().Result); Assert.Equal(0m, (await context.Read("main")).Points); Assert.Equal(0, await context.Db.Select().CountAsync()); } [Fact] public async Task MissingMessage_CannotBeProcessed() { using var context = new UserTestContext(); var error = await Assert.ThrowsAsync(() => context.Users.UpdateTopUpMessage(new() { Id = 9999, Result = "已核实" }, default)); Assert.Equal("充值备注不存在", error.Message); } [Fact] public async Task Qrcode_UpsertsByAgentCode_AndSupportsDataUri() { using var context = new UserTestContext(); await context.Users.UpdateTopUpQrcode(new() { AgentCode = "agent", QrcodeBase64 = "aGVsbG8=" }, default); const string data = "data:image/png;base64,d29ybGQ="; await context.Users.UpdateTopUpQrcode(new() { AgentCode = " agent ", QrcodeBase64 = data }, default); Assert.Equal(data, await context.Users.GetTopUpQrcode("agent", default)); Assert.Equal(1, await context.Db.Select().CountAsync()); Assert.Null(await context.Users.GetTopUpQrcode("missing", default)); } [Theory] [InlineData("invalid!")] [InlineData("data:image/png,abc")] [InlineData("data:image/png;base64,")] public async Task InvalidQrcode_DoesNotOverwriteStoredValue(string invalid) { using var context = new UserTestContext(); await context.Users.UpdateTopUpQrcode(new() { AgentCode = "agent", QrcodeBase64 = "aGVsbG8=" }, default); await Assert.ThrowsAsync(() => context.Users.UpdateTopUpQrcode(new() { AgentCode = "agent", QrcodeBase64 = invalid }, default)); Assert.Equal("aGVsbG8=", await context.Users.GetTopUpQrcode("agent", default)); } [Fact] public async Task NonAdmin_CannotModifyQrcode() { using var context = new UserTestContext(); context.CurrentUser.UserName = "main"; var error = await Assert.ThrowsAsync(() => context.Users.UpdateTopUpQrcode(new() { AgentCode = "agent", QrcodeBase64 = "aGVsbG8=" }, default)); Assert.Equal(403, error.Code); Assert.Equal(0, await context.Db.Select().CountAsync()); } }