using LehrerApp.Core.Models; using LehrerApp.Desktop.ViewModels.Groups; using LehrerApp.Templating; using Xunit; namespace LehrerApp.Desktop.Tests; public sealed class PersonalizeWorksheetDialogViewModelTests : IDisposable { private readonly string _directory = Path.Combine(Path.GetTempPath(), $"lehrerapp-worksheet-vm-tests-{Guid.NewGuid():N}"); public PersonalizeWorksheetDialogViewModelTests() => Directory.CreateDirectory(_directory); [Fact] public void Generate_ErzeugtEinePdfJeAusgewaehltemSchueler() { var group = new LearningGroup { Name = "8a", SchoolYear = "2025/26" }; var anna = new Student { FirstName = "Anna", LastName = "Adler" }; var ben = new Student { FirstName = "Ben", LastName = "Bauer" }; var vm = Build(group, [anna, ben], StoreWithTemplate()); var output = Path.Combine(_directory, "output"); vm.Generate(output); Assert.Equal(2, vm.Results.Count); Assert.All(vm.Results, r => Assert.True(r.Success)); Assert.Equal(2, Directory.GetFiles(output, "*.pdf").Length); } [Fact] public void Generate_AbgewaehlterSchueler_WirdUebersprungen() { var group = new LearningGroup { Name = "8a", SchoolYear = "2025/26" }; var anna = new Student { FirstName = "Anna", LastName = "Adler" }; var ben = new Student { FirstName = "Ben", LastName = "Bauer" }; var vm = Build(group, [anna, ben], StoreWithTemplate()); vm.Students.Single(s => s.Model.Id == ben.Id).IsIncluded = false; var output = Path.Combine(_directory, "output"); vm.Generate(output); Assert.Single(vm.Results); Assert.Equal(anna.FullName, vm.Results[0].StudentName); } [Fact] public void OhneVorlage_GenerateTutNichts() { var group = new LearningGroup { Name = "8a", SchoolYear = "2025/26" }; var anna = new Student { FirstName = "Anna", LastName = "Adler" }; var vm = Build(group, [anna], new WorksheetTemplateStore(new TemplateStore(Path.Combine(_directory, "empty-store")))); var output = Path.Combine(_directory, "output"); vm.Generate(output); Assert.Empty(vm.Results); } private static PersonalizeWorksheetDialogViewModel Build(LearningGroup group, List students, WorksheetTemplateStore store) => new(group, [.. students.Select(s => s.Id)], new FakeStudents(students), store, new QuestTemplateRenderer()); private WorksheetTemplateStore StoreWithTemplate() { var source = Path.Combine(_directory, $"{Guid.NewGuid():N}.lavorlage"); var manifest = new TemplateManifest { Id = $"arbeitsblatt-{Guid.NewGuid():N}", Name = "Arbeitsblatt", Placeholders = [new PlaceholderDefinition("Student.FirstName", PlaceholderType.Text)], }; TemplatePackage.Create(source, manifest, "PAGE 210 297 mm\nTEXT 20 20 $Student.FirstName", new Dictionary()); var store = new WorksheetTemplateStore(new TemplateStore(Path.Combine(_directory, $"store-{Guid.NewGuid():N}"))); store.Store.Import(source); return store; } public void Dispose() { if (Directory.Exists(_directory)) Directory.Delete(_directory, true); } }