Files
StoreWeb/Tests/Store.Users.Tests/UserTopUpTests.cs
T

83 lines
4.0 KiB
C#

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_RequiresAdmin_AndDoesNotRechargeFunds()
{
using var context = new UserTestContext();
context.CurrentUser.UserName = "main";
var id = await context.Users.AddTopUpMessage(new() { Message = "充值待核实" }, default);
var error = await Assert.ThrowsAsync<AppException>(() => context.Users.UpdateTopUpMessage(new() { Id = id, Result = "已核实" }, default));
Assert.Equal(403, error.Code);
context.CurrentUser.UserName = "admin";
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<UserPointsRecordEntity>().CountAsync());
}
[Fact]
public async Task MissingMessage_CannotBeProcessed()
{
using var context = new UserTestContext();
var error = await Assert.ThrowsAsync<AppException>(() => 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<UserTopUpQrcodeEntity>().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<ValidationException>(() => 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<AppException>(() => context.Users.UpdateTopUpQrcode(new() { AgentCode = "agent", QrcodeBase64 = "aGVsbG8=" }, default));
Assert.Equal(403, error.Code);
Assert.Equal(0, await context.Db.Select<UserTopUpQrcodeEntity>().CountAsync());
}
}