修复实验排课

This commit is contained in:
2026-07-29 09:40:11 +08:00 Unverified
parent 8f56548b54
commit 356c410788
4 changed files with 187 additions and 27 deletions
@@ -138,6 +138,47 @@ public sealed class ExperimentsControllerTests
Assert.Empty(fixture.Db.ExperimentBookings);
}
[Fact]
public async Task CentralizedSession_RejectsRelatedPublishedTimetableConflict()
{
await using var fixture = await ExperimentFixture.CreateAsync();
var manager = fixture.Controller(fixture.ManagerScope);
await manager.CreateProject(
fixture.ProjectRequest(ExperimentArrangementMode.Centralized),
CancellationToken.None);
var project = await fixture.Db.ExperimentProjects.SingleAsync();
fixture.Db.SchedulePlans.Add(new SchedulePlan
{
AcademicTermId = fixture.Term.Id,
Name = "正式课表",
Version = "V1",
Status = SchedulePlanStatus.Published,
Entries =
[
new ScheduleEntry
{
TeachingTaskId = fixture.Task.Id,
ClassroomId = fixture.SecondClassroom.Id,
DayOfWeek = 1,
StartPeriod = 1,
PeriodCount = 2,
StartWeek = 1,
EndWeek = 18,
WeekPattern = WeekPattern.All
}
]
});
await fixture.Db.SaveChangesAsync();
var result = await manager.CreateSession(
project.Id,
fixture.SessionRequest(1, 2),
CancellationToken.None);
Assert.IsType<ConflictObjectResult>(result);
Assert.Empty(fixture.Db.ExperimentSessions);
}
[Fact]
public async Task StudentTimetable_IncludesCentralizedAndBookedSelfScheduledSessions()
{
+60 -1
View File
@@ -1,5 +1,6 @@
using Jiaowu.Api.Infrastructure.Persistence;
using Jiaowu.Api.Infrastructure.Experiments;
using Jiaowu.Api.Infrastructure.Exams;
using Jiaowu.Api.Infrastructure.Persistence;
using Jiaowu.Api.Infrastructure.Teaching;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
@@ -176,6 +177,64 @@ public sealed class MySqlMigrationTests
StringComparison.OrdinalIgnoreCase);
}
[Fact]
public void MySql_centralized_experiment_conflict_queries_are_translatable()
{
using var db = new AppDbContext(CreateMySqlOptions());
var firstId =
Guid.Parse("11111111-1111-1111-1111-111111111111");
var secondId =
Guid.Parse("22222222-2222-2222-2222-222222222222");
Guid[] relatedIds = [firstId, secondId];
var teacherTaskSql = CentralizedExperimentConflictQuery
.TaskIdsForTeachers(db, relatedIds)
.ToQueryString();
var classTaskSql = CentralizedExperimentConflictQuery
.TaskIdsForClasses(db, relatedIds)
.ToQueryString();
var scheduleSql = CentralizedExperimentConflictQuery
.ScheduleEntries(
db,
relatedIds,
firstId,
1,
2,
1,
2)
.ToQueryString();
var experimentSql = CentralizedExperimentConflictQuery
.ExperimentSessions(
db,
relatedIds,
new DateOnly(2026, 8, 1),
1,
2)
.ToQueryString();
Assert.Contains(
"TeachingTaskTeachers",
teacherTaskSql,
StringComparison.OrdinalIgnoreCase);
Assert.Contains(
"TeachingTaskClasses",
classTaskSql,
StringComparison.OrdinalIgnoreCase);
Assert.Contains(
"ScheduleEntries",
scheduleSql,
StringComparison.OrdinalIgnoreCase);
Assert.Contains(
"ExperimentSessions",
experimentSql,
StringComparison.OrdinalIgnoreCase);
Assert.Contains(" IN (", scheduleSql, StringComparison.OrdinalIgnoreCase);
Assert.Contains(
" IN (",
experimentSql,
StringComparison.OrdinalIgnoreCase);
}
[Fact]
public void MySql_index_names_fit_the_server_identifier_limit()
{