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>
65 lines
2.5 KiB
C#
65 lines
2.5 KiB
C#
using LehrerApp.Core.Models;
|
|
using LehrerApp.Desktop.ViewModels.Groups;
|
|
using Xunit;
|
|
|
|
namespace LehrerApp.Desktop.Tests;
|
|
|
|
public sealed class CompetencyTagGroupBuilderTests
|
|
{
|
|
[Fact]
|
|
public void Build_MarkiertAusgewaehlteItemsAlsSelected()
|
|
{
|
|
var item = new CompetencyItem { Code = "K1", Description = "Erste Kompetenz" };
|
|
var catalog = new List<CompetencyDomain> { new() { Name = "Bereich", Items = [item] } };
|
|
var selected = new List<CompetencyReference> { new() { ItemId = item.Id, Code = item.Code, Description = item.Description } };
|
|
|
|
var groups = CompetencyTagGroupBuilder.Build(catalog, selected, _ => { });
|
|
|
|
var group = Assert.Single(groups);
|
|
var tag = Assert.Single(group.Items);
|
|
Assert.True(tag.IsSelected);
|
|
Assert.Equal(item.Id, tag.ItemId);
|
|
}
|
|
|
|
[Fact]
|
|
public void Build_ReferenzOhneKatalogTreffer_LandetInEigenerGruppeMitMomentaufnahme()
|
|
{
|
|
var catalog = new List<CompetencyDomain>
|
|
{
|
|
new() { Name = "Bereich", Items = [new CompetencyItem { Code = "K1", Description = "Erste Kompetenz" }] },
|
|
};
|
|
var orphaned = new CompetencyReference
|
|
{
|
|
ItemId = Guid.NewGuid(), Code = "ALT1", Description = "Alte, gelöschte Kompetenz",
|
|
};
|
|
var selected = new List<CompetencyReference> { orphaned };
|
|
|
|
var groups = CompetencyTagGroupBuilder.Build(catalog, selected, _ => { });
|
|
|
|
Assert.Equal(2, groups.Count);
|
|
var fallbackGroup = groups.Single(g => g.Name == "Nicht mehr im Katalog");
|
|
var tag = Assert.Single(fallbackGroup.Items);
|
|
Assert.True(tag.IsSelected);
|
|
Assert.Equal("ALT1", tag.Code);
|
|
Assert.Equal("Alte, gelöschte Kompetenz", tag.Description);
|
|
// Der reguläre Katalog-Bereich bleibt unberührt und zeigt sein einziges Item als abwählbar.
|
|
var catalogGroup = groups.Single(g => g.Name == "Bereich");
|
|
Assert.False(Assert.Single(catalogGroup.Items).IsSelected);
|
|
}
|
|
|
|
[Fact]
|
|
public void Build_ToggleAufTag_RuftOnChangedMitDerTagInstanzAuf()
|
|
{
|
|
var item = new CompetencyItem { Code = "K1", Description = "Erste Kompetenz" };
|
|
var catalog = new List<CompetencyDomain> { new() { Name = "Bereich", Items = [item] } };
|
|
CompetencyTag? changed = null;
|
|
|
|
var groups = CompetencyTagGroupBuilder.Build(catalog, [], tag => changed = tag);
|
|
var tag = Assert.Single(Assert.Single(groups).Items);
|
|
tag.IsSelected = true;
|
|
|
|
Assert.Same(tag, changed);
|
|
Assert.Equal(item.Id, changed!.ItemId);
|
|
}
|
|
}
|