CI / build-and-test (push) Canceled after 0s
Neue Menü-Kategorie "Formulare" in der Menüleiste: "Elternbrief erzeugen..." öffnet jetzt einen Schüler-Picker statt nur aus der Schülerdetailansicht erreichbar zu sein, "Arbeitsblatt personalisieren..." ist aktiv, sobald eine einzelne Lerngruppe geöffnet ist, und erzeugt aus einer in TemplateDesigner gebauten .lavorlage-Vorlage ein PDF je aktivem Gruppenmitglied - über eine von den Elternbrief-Vorlagen getrennte WorksheetTemplateStore-Bibliothek. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
77 lines
3.2 KiB
C#
77 lines
3.2 KiB
C#
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<Student> 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<string, byte[]>());
|
|
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); }
|
|
}
|