Unit/Lesson/ExamTask/ParticipationSession referenzierten Kompetenzen bisher per Freitext-Code, case-insensitiv gegen den Katalog gematcht - fragil bei Umbenennungen und seit der Bildungsplan-Versionierung nicht mehr eindeutig (zwei Versionen können denselben Code vergeben). Neuer Werttyp CompetencyReference (ItemId + Code/Description-Momentaufnahme) löst das: solange die Id noch im Katalog auflösbar ist, zählt die live Fassung (Rename wirkt sofort), sonst bleibt die gespeicherte historische Fassung sichtbar statt spurlos zu verschwinden. Migration (Schema-Version 6) löst bestehende Codes gegen den Katalog auf; die zuvor dreifach duplizierte Kompetenz-Tag-UI ist jetzt in CompetencyTagGroupBuilder konsolidiert. add_lesson_competency/remove_lesson_competency nehmen jetzt itemId statt code und validieren gegen den Katalog (vorher ungeprüft). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
74 lines
2.7 KiB
C#
74 lines
2.7 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 k1 = new CompetencyItem { Code = "K1", Description = "Kompetenz" };
|
||
var units = new FakeUnits();
|
||
units.Add(new Unit
|
||
{
|
||
GroupId = group.Id, Status = UnitStatus.Completed,
|
||
Competencies = [new CompetencyReference { ItemId = k1.Id, Code = k1.Code, Description = k1.Description }],
|
||
});
|
||
var exam = new Exam
|
||
{
|
||
GroupId = group.Id,
|
||
Status = ExamStatus.Graded,
|
||
Tasks = [new ExamTask { MaxPoints = 10, Competencies = [new CompetencyReference { ItemId = k1.Id, Code = k1.Code, Description = k1.Description }] }],
|
||
};
|
||
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 = [k1],
|
||
});
|
||
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);
|
||
}
|
||
}
|