using LehrerApp.Core.Models; using LehrerApp.Desktop.ViewModels.Groups; using Xunit; namespace LehrerApp.Desktop.Tests; /// Tests für die Aspekt-Verwaltung (3.1.1/3.1.2/3.1.4): Anlegen, Umsortieren, Deaktivieren, /// Löschen. FakeAspects verhält sich hier wie der echte Repository (Validierung, Duplikatprüfung), /// damit auch Fehlerfälle über die ViewModel-Schicht hinweg realistisch getestet werden. public sealed class ParticipationAspectsDialogViewModelTests { [Fact] public void AddAspect_LegtNeuenAspektMitFortlaufenderSortOrderAn() { var groupId = Guid.NewGuid(); var vm = new ParticipationAspectsDialogViewModel(new FakeAspects(), groupId) { NewKey = "experiment", NewLabel = "Experiment", }; vm.AddAspectCommand.Execute(null); var item = Assert.Single(vm.Aspects); Assert.Equal("experiment", item.Key); Assert.Equal("Experiment", item.Label); Assert.Equal("", vm.NewKey); // Formular wird nach Erfolg geleert } [Fact] public void AddAspect_OhneSchluessel_ZeigtFehlerUndLegtNichtsAn() { var vm = new ParticipationAspectsDialogViewModel(new FakeAspects(), Guid.NewGuid()) { NewKey = "", NewLabel = "Experiment", }; vm.AddAspectCommand.Execute(null); Assert.Empty(vm.Aspects); Assert.NotEqual("", vm.NewAspectError); } [Fact] public void AddAspect_DuplikatSchluessel_ZeigtRepositoryFehlerAnUndLegtNichtsAnderesAn() { var groupId = Guid.NewGuid(); var repo = new FakeAspects(); var vm = new ParticipationAspectsDialogViewModel(repo, groupId) { NewKey = "a", NewLabel = "Erste" }; vm.AddAspectCommand.Execute(null); vm.NewKey = "a"; vm.NewLabel = "Zweite"; vm.AddAspectCommand.Execute(null); Assert.Single(vm.Aspects); Assert.NotEqual("", vm.NewAspectError); } [Fact] public void MoveAspect_VertauschtReihenfolgeUndPersistiertSortOrder() { var groupId = Guid.NewGuid(); var repo = new FakeAspects(); var vm = new ParticipationAspectsDialogViewModel(repo, groupId) { NewKey = "a", NewLabel = "Erste" }; vm.AddAspectCommand.Execute(null); vm.NewKey = "b"; vm.NewLabel = "Zweite"; vm.AddAspectCommand.Execute(null); vm.Aspects[1].MoveUpCommand.Execute(null); Assert.Equal("b", vm.Aspects[0].Key); Assert.Equal("a", vm.Aspects[1].Key); var stored = repo.GetAllByGroup(groupId).OrderBy(a => a.SortOrder).ToList(); Assert.Equal(["b", "a"], stored.Select(a => a.Key)); } [Fact] public void IsActive_AendernSpeichertSofortUndBleibtInGetAllByGroupSichtbar() { var groupId = Guid.NewGuid(); var repo = new FakeAspects(); var vm = new ParticipationAspectsDialogViewModel(repo, groupId) { NewKey = "a", NewLabel = "Erste" }; vm.AddAspectCommand.Execute(null); vm.Aspects[0].IsActive = false; Assert.Empty(repo.GetByGroup(groupId)); Assert.Single(repo.GetAllByGroup(groupId)); } [Fact] public void Label_UngueltigeAenderung_RolltZurueckUndZeigtFehler() { var groupId = Guid.NewGuid(); var repo = new FakeAspects(); var vm = new ParticipationAspectsDialogViewModel(repo, groupId) { NewKey = "a", NewLabel = "Erste" }; vm.AddAspectCommand.Execute(null); vm.Aspects[0].Label = " "; // leer nach Trim -> Repository lehnt ab Assert.Equal("Erste", vm.Aspects[0].Label); Assert.NotEqual("", vm.Aspects[0].ErrorMessage); Assert.Equal("Erste", repo.GetAllByGroup(groupId).Single().Label); } }