Files
Academic-Affairs-System/tests/Jiaowu.Api.Tests/PersonnelControllerTests.cs
T
biss 77dfa8145c 主要变更:
新增统一缓存封装:[AppCache.cs (line 12)](/E:/jiaowu/src/Jiaowu.Api/Infrastructure/Caching/AppCache.cs:12)
接入 HybridCache 和可选 Redis:[Program.cs (line 153)](/E:/jiaowu/src/Jiaowu.Api/Program.cs:153)
缓存学生激活选项、基础数据、公开课表和课表选项。
个人课表、选课容量、成绩、权限、通知和任务状态保持实时查询。
基础数据、课程、教师、教学任务、作息、考试和课表发布后自动失效相关缓存。
新增 /health/cache,Redis 故障不影响 /health/ready。
Compose 增加 256MB、allkeys-lfu、无持久化的 redis:8.8-alpine 服务;该镜像标签已由 Docker 官方镜像仓库核对。
更新 [.env.example (line 1)](/E:/jiaowu/.env.example:1) 和 [README.md (line 190)](/E:/jiaowu/README.md:190) 部署说明。
2026-07-26 14:42:27 +08:00

94 lines
3.5 KiB
C#

using Jiaowu.Api.Controllers;
using Jiaowu.Api.Domain.Academic;
using Jiaowu.Api.Domain.Identity;
using Jiaowu.Api.Infrastructure.Auth;
using Jiaowu.Api.Infrastructure.Caching;
using Jiaowu.Api.Infrastructure.Persistence;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Data.Sqlite;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
namespace Jiaowu.Api.Tests;
public sealed class PersonnelControllerTests
{
[Fact]
public async Task ActivateTeacherAccount_CreatesAndLinksTeacherLogin()
{
await using var connection = new SqliteConnection("Data Source=:memory:");
await connection.OpenAsync();
var services = new ServiceCollection();
services.AddLogging();
services.AddDbContext<AppDbContext>(options => options.UseSqlite(connection));
services
.AddIdentityCore<ApplicationUser>(options =>
{
options.Password.RequiredLength = 8;
options.Password.RequireDigit = true;
options.Password.RequireLowercase = true;
options.Password.RequireUppercase = true;
options.Password.RequireNonAlphanumeric = true;
})
.AddRoles<ApplicationRole>()
.AddEntityFrameworkStores<AppDbContext>();
await using var provider = services.BuildServiceProvider();
await using var scope = provider.CreateAsyncScope();
var db = scope.ServiceProvider.GetRequiredService<AppDbContext>();
await db.Database.EnsureCreatedAsync();
var roleManager = scope.ServiceProvider
.GetRequiredService<RoleManager<ApplicationRole>>();
Assert.True((await roleManager.CreateAsync(new ApplicationRole
{
Name = SystemRoles.Teacher,
Description = "教师"
})).Succeeded);
var college = new College { Code = "CS", Name = "计算机学院" };
var teacher = new Teacher
{
TeacherNumber = "T2026999",
Name = "测试教师",
CollegeId = college.Id,
Status = TeacherStatus.Active
};
db.AddRange(college, teacher);
await db.SaveChangesAsync();
var userManager = scope.ServiceProvider
.GetRequiredService<UserManager<ApplicationUser>>();
var controller = new PersonnelController(
db,
new TestDataScope(college.Id),
userManager,
NoOpAppCache.Instance);
var result = await controller.ActivateTeacherAccount(
teacher.Id,
new TeacherAccountActivationRequest("Teacher@123"),
CancellationToken.None);
Assert.IsType<OkObjectResult>(result);
var user = await userManager.FindByNameAsync(teacher.TeacherNumber);
Assert.NotNull(user);
Assert.Equal(teacher.Name, user.DisplayName);
Assert.Equal(teacher.CollegeId, user.CollegeId);
Assert.True(await userManager.IsInRoleAsync(user, SystemRoles.Teacher));
db.ChangeTracker.Clear();
var linkedTeacher = await db.Teachers.SingleAsync(x => x.Id == teacher.Id);
Assert.Equal(user.Id, linkedTeacher.UserId);
}
private sealed class TestDataScope(Guid collegeId) : ICurrentUserDataScope
{
public CurrentUserScope Current { get; } = new(
Guid.NewGuid(),
"测试管理员",
collegeId,
DataScope.College,
new HashSet<string>([SystemRoles.CollegeAdmin]));
}
}