Files
Academic-Affairs-System/tests/Jiaowu.Api.Tests/DataScopeTests.cs
T
biss 5a7a8d530b 培养方案下放学院维护,学院账号被后端限制在本学院范围;新增按年级、学院、专业联动筛选及维护范围提示。
课程库实行分级维护:学院只能维护本学院的专业必修、专业选修和实践课程;通识课程可查看、引用但不可修改。校级账号保留全校统筹权限。
“排课与课表”已从“教学建设”迁移到“教学运行”,原路由保持不变。
权限规则同时落实在前端和 API,并新增专项测试。
2026-07-24 18:31:33 +08:00

103 lines
3.3 KiB
C#

using System.Security.Claims;
using Jiaowu.Api.Domain.Academic;
using Jiaowu.Api.Domain.Identity;
using Jiaowu.Api.Infrastructure.Auth;
using Microsoft.AspNetCore.Http;
namespace Jiaowu.Api.Tests;
public sealed class DataScopeTests
{
[Theory]
[InlineData(SystemRoles.Student, null, DataScope.Self)]
[InlineData(SystemRoles.Counselor, SystemRoles.Teacher, DataScope.Class)]
[InlineData(SystemRoles.CollegeAdmin, SystemRoles.Counselor, DataScope.College)]
[InlineData(SystemRoles.SuperAdmin, SystemRoles.CollegeAdmin, DataScope.All)]
[InlineData(SystemRoles.AcademicAdmin, SystemRoles.Student, DataScope.All)]
public void Resolver_UsesHighestScope(
string firstRole,
string? secondRole,
DataScope expected)
{
var roles = secondRole is null
? [firstRole]
: new[] { firstRole, secondRole };
Assert.Equal(expected, EffectiveDataScopeResolver.Resolve(roles));
}
[Fact]
public void CurrentScope_ReadsIdentityAndCollegeClaims()
{
var userId = Guid.NewGuid();
var collegeId = Guid.NewGuid();
var claims = new[]
{
new Claim(ClaimTypes.NameIdentifier, userId.ToString()),
new Claim(ClaimTypes.Name, "院系管理员"),
new Claim(ClaimTypes.Role, SystemRoles.CollegeAdmin),
new Claim("college_id", collegeId.ToString())
};
var accessor = new HttpContextAccessor
{
HttpContext = new DefaultHttpContext
{
User = new ClaimsPrincipal(new ClaimsIdentity(claims, "test"))
}
};
var current = new CurrentUserDataScope(accessor).Current;
Assert.Equal(userId, current.UserId);
Assert.Equal(collegeId, current.CollegeId);
Assert.Equal(DataScope.College, current.Scope);
Assert.True(current.CanAccessCollege(collegeId));
Assert.False(current.CanAccessCollege(Guid.NewGuid()));
}
[Theory]
[InlineData(CourseNature.MajorRequired, true)]
[InlineData(CourseNature.MajorElective, true)]
[InlineData(CourseNature.Practice, true)]
[InlineData(CourseNature.GeneralRequired, false)]
[InlineData(CourseNature.GeneralElective, false)]
public void CollegeAdmin_OnlyMaintainsDelegatedCourseNatures(
CourseNature nature,
bool expected)
{
var collegeId = Guid.NewGuid();
var scope = new CurrentUserScope(
Guid.NewGuid(),
"学院教务",
collegeId,
DataScope.College,
new HashSet<string>([SystemRoles.CollegeAdmin]));
Assert.Equal(
expected,
CourseMaintenancePolicy.CanManage(scope, collegeId, nature));
Assert.False(CourseMaintenancePolicy.CanManage(
scope,
Guid.NewGuid(),
nature));
}
[Theory]
[InlineData(SystemRoles.SuperAdmin)]
[InlineData(SystemRoles.AcademicAdmin)]
public void SchoolAdministrators_RetainWholeCourseCatalogueManagement(string role)
{
var scope = new CurrentUserScope(
Guid.NewGuid(),
"校级教务",
null,
DataScope.All,
new HashSet<string>([role]));
Assert.True(CourseMaintenancePolicy.CanManage(
scope,
Guid.NewGuid(),
CourseNature.GeneralRequired));
}
}