From 462080ab923d26c88f1123d79d8a454cdb866350 Mon Sep 17 00:00:00 2001 From: Sebastian Hedtrich Date: Tue, 18 Aug 2026 20:31:12 +0200 Subject: [PATCH] Fix null phase data in timetable overview --- .../TimetableViewModelTests.cs | 21 +++++++++++++++++++ .../ViewModels/Planning/TimetableViewModel.cs | 8 +++---- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/LehrerApp.Desktop.Tests/TimetableViewModelTests.cs b/LehrerApp.Desktop.Tests/TimetableViewModelTests.cs index edc4498..db7130f 100644 --- a/LehrerApp.Desktop.Tests/TimetableViewModelTests.cs +++ b/LehrerApp.Desktop.Tests/TimetableViewModelTests.cs @@ -262,6 +262,27 @@ public sealed class TimetableViewModelTests Assert.False(cell.HasExperiment); } + [Fact] + public void Load_Wochenkachel_UnvollstaendigePhasendaten_VerursachenKeinenFehler() + { + var group = new LearningGroup { Name = "Q1 Chemie" }; + var date = DateInCurrentWeek(DayOfWeek.Monday); + var slots = new FakeTimetableSlots(); + slots.Add(new TimetableSlot { GroupId = group.Id, Weekday = DayOfWeek.Monday, PeriodNumber = 1 }); + var lessons = new FakeLessons(); + lessons.Add(new Lesson + { + GroupId = group.Id, + Date = date, + Phases = [new LessonPhaseStep { Name = null!, Activity = null!, Material = "Experimentiermaterial" }], + }); + + var vm = BuildViewModel(slots, new FakeGroups([group]), lessons: lessons); + + var cell = vm.WeekItems.Single(c => c.IsSlotCell && c.Weekday == DayOfWeek.Monday && c.PeriodNumber == 1); + Assert.True(cell.HasExperiment); + } + [Fact] public void Load_Wochenkachel_LetzteStundeVorKlausur_ZeigtIcon() { diff --git a/LehrerApp.Desktop/ViewModels/Planning/TimetableViewModel.cs b/LehrerApp.Desktop/ViewModels/Planning/TimetableViewModel.cs index d4452a9..a93da1f 100644 --- a/LehrerApp.Desktop/ViewModels/Planning/TimetableViewModel.cs +++ b/LehrerApp.Desktop/ViewModels/Planning/TimetableViewModel.cs @@ -387,10 +387,10 @@ public partial class TimetableViewModel : ObservableObject } private static bool MentionsExperiment(Lesson? lesson) => - lesson is not null && lesson.Phases.Any(p => - p.Name.Contains("Experiment", StringComparison.OrdinalIgnoreCase) || - p.Activity.Contains("Experiment", StringComparison.OrdinalIgnoreCase) || - p.Material.Contains("Experiment", StringComparison.OrdinalIgnoreCase)); + lesson?.Phases?.Any(p => p is not null && + (p.Name?.Contains("Experiment", StringComparison.OrdinalIgnoreCase) == true || + p.Activity?.Contains("Experiment", StringComparison.OrdinalIgnoreCase) == true || + p.Material?.Contains("Experiment", StringComparison.OrdinalIgnoreCase) == true)) == true; /// Fällt auf einen gesetzlichen Feiertag oder in Schulferien? private static bool IsFreeDay(DateOnly date, List schoolHolidays, HashSet publicHolidayDates) =>