Neue Bildungspläne wachsen je Fach klassenstufenweise hoch, sodass Kurse abhängig vom Einschulungsjahr entweder dem alten oder dem neuen Bildungsplan folgen. CompetencyCatalogVersion (Fach + Name + IsDefault) macht das abbildbar: CompetencyDomain bekommt eine VersionId, Kurse wählen über LearningGroup.CompetencyCatalogVersionId (null = Standardversion des Fachs) welche Version gilt. Migration legt für bestehende Kataloge automatisch eine Standardversion an, damit alte Datenbanken unverändert weiterlaufen. MCP: neue Tools für Versions-CRUD (get/create/update/delete_competency_plan_version, update_group_competency_version), get_competency_catalog/create_competency_domain um optionalen versionId-Parameter erweitert. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
72 lines
2.5 KiB
C#
72 lines
2.5 KiB
C#
using LehrerApp.Core.Models;
|
||
using LehrerApp.Core.Services;
|
||
using LehrerApp.Desktop.ViewModels.Groups;
|
||
using Xunit;
|
||
|
||
namespace LehrerApp.Desktop.Tests;
|
||
|
||
public sealed class CompetencyOverviewViewModelTests
|
||
{
|
||
[Fact]
|
||
public void Initialize_ZeigtAbdeckungGruppenmittelUndVorausgewaehltesSchuelerprofil()
|
||
{
|
||
var subjectId = Guid.NewGuid();
|
||
var group = new LearningGroup { SubjectId = subjectId, GradeLevel = 8 };
|
||
var student = new Student { FirstName = "Ada", LastName = "Lovelace" };
|
||
var units = new FakeUnits();
|
||
units.Add(new Unit
|
||
{
|
||
GroupId = group.Id, Status = UnitStatus.Completed, Competencies = ["K1"],
|
||
});
|
||
var exam = new Exam
|
||
{
|
||
GroupId = group.Id,
|
||
Status = ExamStatus.Graded,
|
||
Tasks = [new ExamTask { MaxPoints = 10, CompetencyCodes = ["K1"] }],
|
||
};
|
||
var results = new FakeResults();
|
||
results.Add(new ExamResult { ExamId = exam.Id, StudentId = student.Id, Points = [5] });
|
||
var versions = new FakeCompetencyCatalogVersions();
|
||
var version = versions.GetOrCreateDefault(subjectId);
|
||
var catalog = new FakeCompetencyDomains();
|
||
catalog.Add(new CompetencyDomain
|
||
{
|
||
SubjectId = subjectId,
|
||
GradeLevel = 8,
|
||
VersionId = version.Id,
|
||
Name = "Bereich",
|
||
Items = [new CompetencyItem { Code = "K1", Description = "Kompetenz" }],
|
||
});
|
||
var vm = new CompetencyOverviewTabViewModel(units, new FakeExams([exam]), results,
|
||
catalog, versions, new FakeStudents([student]), new CompetencyAnalysisService());
|
||
|
||
vm.Initialize(group);
|
||
|
||
var row = Assert.Single(vm.Rows);
|
||
Assert.Equal("1× behandelt", row.InstructionCoverage);
|
||
Assert.Equal("1× geprüft", row.ExamCoverage);
|
||
Assert.Contains("50 %", row.GroupResult);
|
||
Assert.Contains("50 %", row.StudentResult);
|
||
Assert.Equal("Wiederholungsbedarf", row.Recommendation);
|
||
Assert.Equal(student.Id, vm.SelectedStudent?.Id);
|
||
}
|
||
|
||
[Fact]
|
||
public void ReviewThreshold_Aendern_AktualisiertHinweis()
|
||
{
|
||
var item = new CompetencyAnalysisItem
|
||
{
|
||
DomainName = "Bereich",
|
||
DomainCode = "B",
|
||
Code = "K1",
|
||
Description = "Kompetenz",
|
||
GroupScore = new CompetencyScore(5, 10, 1, 1),
|
||
};
|
||
var row = new CompetencyOverviewRow(item, null, 60);
|
||
|
||
row.SetThreshold(40);
|
||
|
||
Assert.Equal("Stand solide", row.Recommendation);
|
||
}
|
||
}
|