实验视图

This commit is contained in:
2026-08-10 19:04:29 +08:00 Unverified
parent a942fe34ca
commit 04c693a981
3 changed files with 120 additions and 2 deletions
@@ -215,6 +215,89 @@ public sealed class ExperimentGradesControllerTests
Assert.Equal(1, Property<int>(filtered.Value, "Total"));
}
[Fact]
public async Task ManagementList_OrdersProjectsByScheduledWeekAndPeriod()
{
await using var fixture = await ExperimentGradeFixture.CreateAsync();
var plan = new SchedulePlan
{
AcademicTermId = fixture.Term.Id,
Name = "实验课表",
Version = "v1",
Status = SchedulePlanStatus.Published
};
var laterEntry = new ScheduleEntry
{
SchedulePlanId = plan.Id,
TeachingTaskId = fixture.Task.Id,
ClassroomId = fixture.Classroom.Id,
Kind = ScheduleEntryKind.Experiment,
DayOfWeek = 4,
StartPeriod = 5,
PeriodCount = 2,
StartWeek = 5,
EndWeek = 5,
WeekPattern = WeekPattern.All
};
var earlierEntry = new ScheduleEntry
{
SchedulePlanId = plan.Id,
TeachingTaskId = fixture.Task.Id,
ClassroomId = fixture.Classroom.Id,
Kind = ScheduleEntryKind.Experiment,
DayOfWeek = 2,
StartPeriod = 3,
PeriodCount = 2,
StartWeek = 2,
EndWeek = 2,
WeekPattern = WeekPattern.All
};
fixture.Db.AddRange(plan, laterEntry, earlierEntry);
fixture.Db.AddRange(
new ExperimentProject
{
TeachingTaskId = fixture.Task.Id,
ScheduleEntryId = laterEntry.Id,
ScheduleWeek = 5,
Code = "LAB-A",
Name = "后面的实验",
ArrangementMode = ExperimentArrangementMode.Centralized,
StartDate = fixture.Term.StartDate,
EndDate = fixture.Term.EndDate,
Status = ExperimentProjectStatus.Published
},
new ExperimentProject
{
TeachingTaskId = fixture.Task.Id,
ScheduleEntryId = earlierEntry.Id,
ScheduleWeek = 2,
Code = "LAB-Z",
Name = "前面的实验",
ArrangementMode = ExperimentArrangementMode.Centralized,
StartDate = fixture.Term.StartDate,
EndDate = fixture.Term.EndDate,
Status = ExperimentProjectStatus.Published
});
await fixture.Db.SaveChangesAsync();
fixture.Db.ChangeTracker.Clear();
var result = Assert.IsType<OkObjectResult>(await fixture.ExperimentGrades(
fixture.AdminScope).GetManagement(
fixture.Term.Id, null, null, null, 1, 10, CancellationToken.None));
var course = Assert.Single(Property<System.Collections.IEnumerable>(
result.Value, "Items").Cast<object>());
var projects = Property<System.Collections.IEnumerable>(course, "Projects")
.Cast<object>()
.ToList();
Assert.Equal(["前面的实验", "后面的实验"],
projects.Select(project => Property<string>(project, "Name")));
var schedule = Property<object>(projects[0], "ScheduleEntry");
Assert.Equal(2, Property<int>(projects[0], "ScheduleWeek"));
Assert.Equal(2, Property<int>(schedule, "DayOfWeek"));
Assert.Equal(3, Property<int>(schedule, "StartPeriod"));
}
private static T Property<T>(object? value, string name) =>
Assert.IsAssignableFrom<T>(
value!.GetType().GetProperty(name)!.GetValue(value));