CI / build-and-test (push) Canceled after 0s
Manuelle Einzelerfassung je Kompetenz war im Alltag zu aufwendig (Nutzer-Feedback). Neue ParticipationCompetencyEstimate mittelt die bereits erfassten Aspekt-Bewertungen der Sitzung (normiert auf dieselbe -2..+2-Achse) und rundet auf den nächsten Schritt; die Tagesflagge wirkt symmetrisch (Spitzentag hebt, Schlaftag/Schlechter Tag senken gleichermaßen). Die Schätzung wird nie automatisch gespeichert - sie erscheint nur als abgeschwächt dargestellter Zellenwert (RatingCell.IsEstimated), solange keine explizite Bewertung existiert. Ein Klick setzt den Wert bewusst und persistiert ihn wie bisher. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
151 lines
6.4 KiB
C#
151 lines
6.4 KiB
C#
using LehrerApp.Core.Models;
|
|
using LehrerApp.Desktop.ViewModels.Groups;
|
|
using Xunit;
|
|
|
|
namespace LehrerApp.Desktop.Tests;
|
|
|
|
public sealed class ParticipationSessionEditingTests
|
|
{
|
|
[Fact]
|
|
public void Bearbeitungsdialog_AendertBestehendeSessionOhneVerknuepfungenZuErsetzen()
|
|
{
|
|
var session = new ParticipationSession
|
|
{
|
|
GroupId = Guid.NewGuid(),
|
|
Date = new DateOnly(2026, 8, 19),
|
|
Comment = "Sitzplan",
|
|
LessonId = Guid.NewGuid(),
|
|
Competencies = [new CompetencyReference { ItemId = Guid.NewGuid(), Code = "K1", Description = "Kompetenz" }],
|
|
};
|
|
var vm = new AddSessionDialogViewModel(session)
|
|
{
|
|
DateText = "20.08.2026",
|
|
Comment = "Elektrische Stromkreise",
|
|
};
|
|
|
|
vm.SaveCommand.Execute(null);
|
|
|
|
Assert.Same(session, vm.Result);
|
|
Assert.Equal(new DateOnly(2026, 8, 20), session.Date);
|
|
Assert.Equal("Elektrische Stromkreise", session.Comment);
|
|
Assert.NotNull(session.LessonId);
|
|
Assert.Equal(["K1"], session.Competencies.Select(c => c.Code));
|
|
}
|
|
|
|
[Fact]
|
|
public async Task BearbeitenBefehl_SpeichertSessionUndAktualisiertAnzeige()
|
|
{
|
|
var group = new LearningGroup { Name = "8a", SchoolYear = "2026/27" };
|
|
var session = new ParticipationSession
|
|
{
|
|
GroupId = group.Id,
|
|
Date = new DateOnly(2026, 8, 19),
|
|
Comment = "Sitzplan",
|
|
};
|
|
var sessions = new FakeSessions([session]);
|
|
var vm = new ParticipationTabViewModel(
|
|
sessions, new FakeEntries(), new FakeAspects(), new FakeStudents([]),
|
|
new FakeMemberships([]), new FakeGroups([group]), new FakeCompetencyDomains(), new FakeCompetencyCatalogVersions());
|
|
vm.OnEditSession = existing =>
|
|
{
|
|
existing.Comment = "Nachbesprechung Elektrizität";
|
|
return Task.FromResult<ParticipationSession?>(existing);
|
|
};
|
|
vm.Initialize(group.Id, group.SchoolYear);
|
|
|
|
await vm.EditSessionCommand.ExecuteAsync(null);
|
|
|
|
Assert.Equal(session.Id, vm.SelectedSession?.Id);
|
|
Assert.Equal("Nachbesprechung Elektrizität", sessions.GetById(session.Id)?.Comment);
|
|
Assert.Contains("Nachbesprechung Elektrizität", vm.SelectedSessionDisplay);
|
|
}
|
|
|
|
[Fact]
|
|
public async Task LoeschenBefehl_FragtBestaetigungAbUndEntferntSessionMitsamtBewertungen()
|
|
{
|
|
var group = new LearningGroup { Name = "8a", SchoolYear = "2026/27" };
|
|
var session = new ParticipationSession { GroupId = group.Id, Date = new DateOnly(2026, 8, 19) };
|
|
var sessions = new FakeSessions([session]);
|
|
var entries = new FakeEntries();
|
|
entries.Add(new ParticipationEntry { SessionId = session.Id, StudentId = Guid.NewGuid() });
|
|
var vm = new ParticipationTabViewModel(
|
|
sessions, entries, new FakeAspects(), new FakeStudents([]),
|
|
new FakeMemberships([]), new FakeGroups([group]), new FakeCompetencyDomains(), new FakeCompetencyCatalogVersions());
|
|
vm.Initialize(group.Id, group.SchoolYear);
|
|
vm.SelectedSession = vm.Sessions.Single(s => s.Id == session.Id);
|
|
|
|
int? passedEntryCount = null;
|
|
vm.OnConfirmDeleteSession = (_, count) =>
|
|
{
|
|
passedEntryCount = count;
|
|
return Task.FromResult(true);
|
|
};
|
|
|
|
await vm.DeleteSessionCommand.ExecuteAsync(null);
|
|
|
|
Assert.Equal(1, passedEntryCount);
|
|
Assert.Null(sessions.GetById(session.Id));
|
|
}
|
|
|
|
[Fact]
|
|
public void Sitzung_MitBewertetenAspektenAberOhneKompetenzbewertung_ZeigtGeschaetztenWert()
|
|
{
|
|
var subjectId = Guid.NewGuid();
|
|
var group = new LearningGroup { Name = "8a", SchoolYear = "2026/27", SubjectId = subjectId, GradeLevel = 8 };
|
|
var student = new Student { FirstName = "Ada", LastName = "Lovelace" };
|
|
var item = new CompetencyItem { Code = "K1", Description = "Kompetenz" };
|
|
var session = new ParticipationSession
|
|
{
|
|
GroupId = group.Id, Date = new DateOnly(2026, 8, 19),
|
|
Competencies = [new CompetencyReference { ItemId = item.Id, Code = item.Code, Description = item.Description }],
|
|
};
|
|
var sessions = new FakeSessions([session]);
|
|
var entries = new FakeEntries();
|
|
entries.Add(new ParticipationEntry
|
|
{
|
|
SessionId = session.Id, StudentId = student.Id,
|
|
Ratings = [new AspectRating { Key = "quality", Value = 2 }],
|
|
});
|
|
var aspects = new FakeAspects();
|
|
aspects.Save(new ParticipationAspect
|
|
{
|
|
Key = "quality", Label = "Qualität", ValueType = AspectValueType.Scale5, IsActive = true,
|
|
});
|
|
var versions = new FakeCompetencyCatalogVersions();
|
|
var version = versions.GetOrCreateDefault(subjectId);
|
|
var domains = new FakeCompetencyDomains();
|
|
domains.Add(new CompetencyDomain
|
|
{
|
|
SubjectId = subjectId, GradeLevel = 8, VersionId = version.Id, Name = "Bereich", Items = [item],
|
|
});
|
|
var vm = new ParticipationTabViewModel(sessions, entries, aspects, new FakeStudents([student]),
|
|
new FakeMemberships([]), new FakeGroups([group]), domains, versions);
|
|
vm.Initialize(group.Id, group.SchoolYear);
|
|
|
|
vm.SelectedSession = vm.Sessions.Single(s => s.Id == session.Id);
|
|
|
|
var row = Assert.Single(vm.StudentRows);
|
|
var cell = Assert.Single(row.CompetencyCells);
|
|
Assert.True(cell.IsEstimated);
|
|
Assert.Equal(2, cell.Value); // einziger bewerteter Aspekt "quality" = 2, kein Tageshighlight
|
|
}
|
|
|
|
[Fact]
|
|
public async Task LoeschenBefehl_BrichtBeiAbgelehnterBestaetigungAb()
|
|
{
|
|
var group = new LearningGroup { Name = "8a", SchoolYear = "2026/27" };
|
|
var session = new ParticipationSession { GroupId = group.Id, Date = new DateOnly(2026, 8, 19) };
|
|
var sessions = new FakeSessions([session]);
|
|
var vm = new ParticipationTabViewModel(
|
|
sessions, new FakeEntries(), new FakeAspects(), new FakeStudents([]),
|
|
new FakeMemberships([]), new FakeGroups([group]), new FakeCompetencyDomains(), new FakeCompetencyCatalogVersions());
|
|
vm.Initialize(group.Id, group.SchoolYear);
|
|
vm.SelectedSession = vm.Sessions.Single(s => s.Id == session.Id);
|
|
vm.OnConfirmDeleteSession = (_, _) => Task.FromResult(false);
|
|
|
|
await vm.DeleteSessionCommand.ExecuteAsync(null);
|
|
|
|
Assert.NotNull(sessions.GetById(session.Id));
|
|
}
|
|
}
|