HaniBlindBox/server/HoneyBox/tests/HoneyBox.Tests/Integration/TaskServiceIntegrationTests.cs
2026-01-04 01:47:02 +08:00

291 lines
13 KiB
C#

using HoneyBox.Core.Services;
using HoneyBox.Model.Data;
using HoneyBox.Model.Entities;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Diagnostics;
using Microsoft.Extensions.Logging;
using Moq;
using Xunit;
namespace HoneyBox.Tests.Integration;
/// <summary>
/// 任务服务集成测试
/// Requirements: 8.1-8.7
/// </summary>
public class TaskServiceIntegrationTests
{
private HoneyBoxDbContext CreateInMemoryDbContext()
{
var options = new DbContextOptionsBuilder<HoneyBoxDbContext>()
.UseInMemoryDatabase(databaseName: Guid.NewGuid().ToString())
.ConfigureWarnings(w => w.Ignore(InMemoryEventId.TransactionIgnoredWarning))
.Options;
return new HoneyBoxDbContext(options);
}
private TaskService CreateTaskService(HoneyBoxDbContext dbContext)
{
var mockLogger = new Mock<ILogger<TaskService>>();
return new TaskService(dbContext, mockLogger.Object);
}
private User CreateTestUser(int id, int? ouQi = 100)
{
return new User
{
Id = id,
OpenId = $"openid_{Guid.NewGuid():N}",
Uid = $"uid_{Guid.NewGuid():N}",
Nickname = "测试用户",
HeadImg = "",
OuQi = ouQi,
CreatedAt = DateTime.Now,
UpdatedAt = DateTime.Now
};
}
[Fact]
public async Task GetTaskList_DailyTasks_ReturnsCorrectTasks()
{
var dbContext = CreateInMemoryDbContext();
var service = CreateTaskService(dbContext);
var userId = 1;
await dbContext.Tasks.AddRangeAsync(new List<T_Task>
{
new() { Title = "每日签到", Type = 1, Cate = 1, Number = 1, ZNumber = 10, Sort = 1, CreatedAt = DateTime.Now, UpdatedAt = DateTime.Now },
new() { Title = "每日抽赏", Type = 1, Cate = 2, Number = 3, ZNumber = 20, Sort = 2, CreatedAt = DateTime.Now, UpdatedAt = DateTime.Now },
new() { Title = "每周任务", Type = 2, Cate = 1, Number = 5, ZNumber = 50, Sort = 1, CreatedAt = DateTime.Now, UpdatedAt = DateTime.Now }
});
await dbContext.SaveChangesAsync();
var result = await service.GetTaskListAsync(userId, 1);
Assert.Equal(2, result.TaskList.Count);
Assert.All(result.TaskList, t => Assert.Equal(1, t.Type));
}
[Fact]
public async Task GetTaskList_WeeklyTasks_ReturnsCorrectTasks()
{
var dbContext = CreateInMemoryDbContext();
var service = CreateTaskService(dbContext);
var userId = 1;
await dbContext.Tasks.AddRangeAsync(new List<T_Task>
{
new() { Title = "每日签到", Type = 1, Cate = 1, Number = 1, ZNumber = 10, Sort = 1, CreatedAt = DateTime.Now, UpdatedAt = DateTime.Now },
new() { Title = "每周邀请", Type = 2, Cate = 1, Number = 5, ZNumber = 50, Sort = 1, CreatedAt = DateTime.Now, UpdatedAt = DateTime.Now },
new() { Title = "每周抽赏", Type = 2, Cate = 2, Number = 10, ZNumber = 100, Sort = 2, CreatedAt = DateTime.Now, UpdatedAt = DateTime.Now }
});
await dbContext.SaveChangesAsync();
var result = await service.GetTaskListAsync(userId, 2);
Assert.Equal(2, result.TaskList.Count);
Assert.All(result.TaskList, t => Assert.Equal(2, t.Type));
}
[Fact]
public async Task GetTaskList_InvitationTask_CalculatesProgressCorrectly()
{
var dbContext = CreateInMemoryDbContext();
var service = CreateTaskService(dbContext);
var userId = 1;
var task = new T_Task { Title = "邀请好友", Type = 1, Cate = 1, Number = 3, ZNumber = 30, Sort = 1, CreatedAt = DateTime.Now, UpdatedAt = DateTime.Now };
await dbContext.Tasks.AddAsync(task);
// 创建被邀请用户 (今天注册)
await dbContext.Users.AddRangeAsync(new List<User>
{
new() { Pid = userId, OpenId = $"openid_{Guid.NewGuid():N}", Uid = $"uid_{Guid.NewGuid():N}", Nickname = "用户1", HeadImg = "", CreatedAt = DateTime.Now, UpdatedAt = DateTime.Now },
new() { Pid = userId, OpenId = $"openid_{Guid.NewGuid():N}", Uid = $"uid_{Guid.NewGuid():N}", Nickname = "用户2", HeadImg = "", CreatedAt = DateTime.Now, UpdatedAt = DateTime.Now }
});
await dbContext.SaveChangesAsync();
var result = await service.GetTaskListAsync(userId, 1);
var inviteTask = result.TaskList.First(t => t.Cate == 1);
Assert.Equal(2, inviteTask.YwcCount);
Assert.Equal(0, inviteTask.IsComplete);
Assert.Equal(67, inviteTask.Percentage);
}
[Fact]
public async Task GetTaskList_LotteryTask_CalculatesProgressCorrectly()
{
var dbContext = CreateInMemoryDbContext();
var service = CreateTaskService(dbContext);
var userId = 1;
var task = new T_Task { Title = "每日抽赏", Type = 1, Cate = 2, Number = 3, ZNumber = 20, Sort = 1, CreatedAt = DateTime.Now, UpdatedAt = DateTime.Now };
await dbContext.Tasks.AddAsync(task);
var todayTimestamp = (int)((DateTimeOffset)DateTime.Today).ToUnixTimeSeconds();
await dbContext.Orders.AddRangeAsync(new List<Order>
{
new() { UserId = userId, PayType = 1, Status = 1, Addtime = todayTimestamp, OrderNum = "ORD001", GoodsId = 1, GoodsTitle = "商品1", Price = 10, Num = 1, CreatedAt = DateTime.Now, UpdatedAt = DateTime.Now },
new() { UserId = userId, PayType = 2, Status = 1, Addtime = todayTimestamp, OrderNum = "ORD002", GoodsId = 1, GoodsTitle = "商品2", Price = 20, Num = 1, CreatedAt = DateTime.Now, UpdatedAt = DateTime.Now },
new() { UserId = userId, PayType = 1, Status = 1, Addtime = todayTimestamp, OrderNum = "ORD003", GoodsId = 1, GoodsTitle = "商品3", Price = 30, Num = 1, CreatedAt = DateTime.Now, UpdatedAt = DateTime.Now }
});
await dbContext.SaveChangesAsync();
var result = await service.GetTaskListAsync(userId, 1);
var lotteryTask = result.TaskList.First(t => t.Cate == 2);
Assert.Equal(3, lotteryTask.YwcCount);
Assert.Equal(1, lotteryTask.IsComplete);
Assert.Equal(100, lotteryTask.Percentage);
}
[Fact]
public async Task GetTaskList_AlreadyClaimed_ShowsClaimedStatus()
{
var dbContext = CreateInMemoryDbContext();
var service = CreateTaskService(dbContext);
var userId = 1;
var task = new T_Task { Title = "每日签到", Type = 1, Cate = 1, Number = 1, ZNumber = 10, Sort = 1, CreatedAt = DateTime.Now, UpdatedAt = DateTime.Now };
await dbContext.Tasks.AddAsync(task);
await dbContext.SaveChangesAsync();
var userTask = new UserTask { UserId = userId, TaskId = task.Id, Type = 1, Cate = 1, Number = 1, ZNumber = 10, CreatedAt = DateTime.Now, UpdatedAt = DateTime.Now };
await dbContext.UserTasks.AddAsync(userTask);
await dbContext.SaveChangesAsync();
var result = await service.GetTaskListAsync(userId, 1);
var claimedTask = result.TaskList.First();
Assert.Equal(2, claimedTask.IsComplete);
}
[Fact]
public async Task ClaimTaskReward_Success_AddsOuQiReward()
{
var dbContext = CreateInMemoryDbContext();
var service = CreateTaskService(dbContext);
var userId = 1;
var user = CreateTestUser(userId, 100);
await dbContext.Users.AddAsync(user);
var task = new T_Task { Title = "邀请好友", Type = 1, Cate = 1, Number = 1, ZNumber = 50, Sort = 1, CreatedAt = DateTime.Now, UpdatedAt = DateTime.Now };
await dbContext.Tasks.AddAsync(task);
// 创建被邀请用户 - 使用不同的Id避免冲突
var invitedUser = CreateTestUser(100, 0);
invitedUser.Pid = userId;
invitedUser.Nickname = "被邀请用户";
await dbContext.Users.AddAsync(invitedUser);
await dbContext.SaveChangesAsync();
var result = await service.ClaimTaskRewardAsync(userId, task.Id);
Assert.Equal(50, result.Reward);
Assert.Equal(150, result.CurrentOuQi);
var updatedUser = await dbContext.Users.FindAsync(userId);
Assert.Equal(150, updatedUser!.OuQi);
var profitOuQi = await dbContext.ProfitOuQis.FirstOrDefaultAsync(p => p.UserId == userId);
Assert.NotNull(profitOuQi);
Assert.Equal(50, profitOuQi.ChangeMoney);
}
[Fact]
public async Task ClaimTaskReward_TaskNotComplete_ThrowsException()
{
var dbContext = CreateInMemoryDbContext();
var service = CreateTaskService(dbContext);
var userId = 1;
var task = new T_Task { Title = "邀请好友", Type = 1, Cate = 1, Number = 3, ZNumber = 50, Sort = 1, CreatedAt = DateTime.Now, UpdatedAt = DateTime.Now };
await dbContext.Tasks.AddAsync(task);
// 只邀请了1人
var invitedUser = new User { Pid = userId, OpenId = $"openid_{Guid.NewGuid():N}", Uid = $"uid_{Guid.NewGuid():N}", Nickname = "被邀请用户", HeadImg = "", CreatedAt = DateTime.Now, UpdatedAt = DateTime.Now };
await dbContext.Users.AddAsync(invitedUser);
await dbContext.SaveChangesAsync();
var ex = await Assert.ThrowsAsync<InvalidOperationException>(() => service.ClaimTaskRewardAsync(userId, task.Id));
Assert.Equal("任务未完成", ex.Message);
}
[Fact]
public async Task ClaimTaskReward_AlreadyClaimed_ThrowsException()
{
var dbContext = CreateInMemoryDbContext();
var service = CreateTaskService(dbContext);
var userId = 1;
var user = CreateTestUser(userId, 100);
await dbContext.Users.AddAsync(user);
var task = new T_Task { Title = "邀请好友", Type = 1, Cate = 1, Number = 1, ZNumber = 50, Sort = 1, CreatedAt = DateTime.Now, UpdatedAt = DateTime.Now };
await dbContext.Tasks.AddAsync(task);
// 创建被邀请用户 - 使用不同的Id避免冲突
var invitedUser = CreateTestUser(100, 0);
invitedUser.Pid = userId;
invitedUser.Nickname = "被邀请用户";
await dbContext.Users.AddAsync(invitedUser);
var userTask = new UserTask { UserId = userId, TaskId = task.Id, Type = 1, Cate = 1, Number = 1, ZNumber = 50, CreatedAt = DateTime.Now, UpdatedAt = DateTime.Now };
await dbContext.UserTasks.AddAsync(userTask);
await dbContext.SaveChangesAsync();
var ex = await Assert.ThrowsAsync<InvalidOperationException>(() => service.ClaimTaskRewardAsync(userId, task.Id));
Assert.Equal("你已经领取过了", ex.Message);
}
[Fact]
public async Task ClaimTaskReward_TaskNotFound_ThrowsException()
{
var dbContext = CreateInMemoryDbContext();
var service = CreateTaskService(dbContext);
var userId = 1;
var ex = await Assert.ThrowsAsync<InvalidOperationException>(() => service.ClaimTaskRewardAsync(userId, 999));
Assert.Equal("任务不存在", ex.Message);
}
[Fact]
public async Task GetTaskList_WeeklyTask_OnlyCountsCurrentWeek()
{
var dbContext = CreateInMemoryDbContext();
var service = CreateTaskService(dbContext);
var userId = 1;
var task = new T_Task { Title = "每周邀请", Type = 2, Cate = 1, Number = 3, ZNumber = 100, Sort = 1, CreatedAt = DateTime.Now, UpdatedAt = DateTime.Now };
await dbContext.Tasks.AddAsync(task);
// 本周邀请的用户
var thisWeekUser = new User { Pid = userId, OpenId = $"openid_{Guid.NewGuid():N}", Uid = $"uid_{Guid.NewGuid():N}", Nickname = "本周用户", HeadImg = "", CreatedAt = DateTime.Now, UpdatedAt = DateTime.Now };
await dbContext.Users.AddAsync(thisWeekUser);
// 上周邀请的用户 (不应计入)
var lastWeekUser = new User { Pid = userId, OpenId = $"openid_{Guid.NewGuid():N}", Uid = $"uid_{Guid.NewGuid():N}", Nickname = "上周用户", HeadImg = "", CreatedAt = DateTime.Now.AddDays(-10), UpdatedAt = DateTime.Now.AddDays(-10) };
await dbContext.Users.AddAsync(lastWeekUser);
await dbContext.SaveChangesAsync();
var result = await service.GetTaskListAsync(userId, 2);
var weeklyTask = result.TaskList.First();
Assert.Equal(1, weeklyTask.YwcCount);
}
[Fact]
public async Task GetTaskList_DeletedTasks_NotReturned()
{
var dbContext = CreateInMemoryDbContext();
var service = CreateTaskService(dbContext);
var userId = 1;
await dbContext.Tasks.AddRangeAsync(new List<T_Task>
{
new() { Title = "正常任务", Type = 1, Cate = 1, Number = 1, ZNumber = 10, Sort = 1, CreatedAt = DateTime.Now, UpdatedAt = DateTime.Now },
new() { Title = "已删除任务", Type = 1, Cate = 2, Number = 3, ZNumber = 20, Sort = 2, DeletedAt = DateTime.Now, CreatedAt = DateTime.Now, UpdatedAt = DateTime.Now }
});
await dbContext.SaveChangesAsync();
var result = await service.GetTaskListAsync(userId, 1);
Assert.Single(result.TaskList);
Assert.Equal("正常任务", result.TaskList[0].Title);
}
}