diff --git a/.sisyphus/evidence/task-10-nametag-macro.txt b/.sisyphus/evidence/task-10-nametag-macro.txt new file mode 100644 index 0000000..da6c9d1 --- /dev/null +++ b/.sisyphus/evidence/task-10-nametag-macro.txt @@ -0,0 +1,19 @@ +Task T10 evidence: configured Namenseinblender macro + +RED: +- `ddev exec php artisan test tests/Feature/NameTagSlideBuilderTest.php` +- Failed with `Target class [App\Services\NameTagSlideBuilder] does not exist.` before implementation. + +GREEN: +- `ddev exec php artisan test tests/Feature/NameTagSlideBuilderTest.php` +- Result: 3 passed (4 assertions). + +Full verification: +- `ddev exec php artisan test` +- Result: 544 passed (2703 assertions). +- `ddev exec ./vendor/bin/pint` +- Result: PASS, 213 files. + +Configured macro contract verified by test: +- text: `Anna Müller\nModeration` +- macro keys: `name`, `uuid`, `collectionName`, `collectionUuid` diff --git a/.sisyphus/evidence/task-10-no-macro.txt b/.sisyphus/evidence/task-10-no-macro.txt new file mode 100644 index 0000000..e9cee57 --- /dev/null +++ b/.sisyphus/evidence/task-10-no-macro.txt @@ -0,0 +1,13 @@ +Task T10 evidence: no Namenseinblender macro configured + +Test coverage: +- `build returns null when namenseinblender macro is not configured` +- Verifies `NameTagSlideBuilder::build('Max Mustermann', 'Moderation')` returns `null` when `namenseinblender_macro_name` is missing. + +Targeted verification: +- `ddev exec php artisan test tests/Feature/NameTagSlideBuilderTest.php` +- Result: 3 passed (4 assertions). + +Full verification: +- `ddev exec php artisan test` +- Result: 544 passed (2703 assertions). diff --git a/app/Services/NameTagSlideBuilder.php b/app/Services/NameTagSlideBuilder.php new file mode 100644 index 0000000..658ac96 --- /dev/null +++ b/app/Services/NameTagSlideBuilder.php @@ -0,0 +1,37 @@ +build($name, 'Moderation'); + } + + public function buildPreacherSlide(string $name): ?array + { + return $this->build($name, 'Predigt'); + } + + public function build(string $name, string $title): ?array + { + $macroName = Setting::get('namenseinblender_macro_name'); + + if ($macroName === null || trim($macroName) === '') { + return null; + } + + return [ + 'text' => $name."\n".$title, + 'macro' => [ + 'name' => $macroName, + 'uuid' => Setting::get('namenseinblender_macro_uuid'), + 'collectionName' => Setting::get('namenseinblender_macro_collection_name', '--MAIN--'), + 'collectionUuid' => Setting::get('namenseinblender_macro_collection_uuid'), + ], + ]; + } +} diff --git a/tests/Feature/NameTagSlideBuilderTest.php b/tests/Feature/NameTagSlideBuilderTest.php new file mode 100644 index 0000000..5a17504 --- /dev/null +++ b/tests/Feature/NameTagSlideBuilderTest.php @@ -0,0 +1,39 @@ +build('Max Mustermann', 'Moderation'))->toBeNull(); +}); + +test('build returns text lines and macro when configured', function () { + Setting::set('namenseinblender_macro_name', 'Namenseinblender'); + Setting::set('namenseinblender_macro_uuid', '11111111-1111-1111-1111-111111111111'); + Setting::set('namenseinblender_macro_collection_name', 'Service Macros'); + Setting::set('namenseinblender_macro_collection_uuid', '22222222-2222-2222-2222-222222222222'); + + $slide = app(NameTagSlideBuilder::class)->build('Anna Müller', 'Moderation'); + + expect($slide)->toBe([ + 'text' => "Anna Müller\nModeration", + 'macro' => [ + 'name' => 'Namenseinblender', + 'uuid' => '11111111-1111-1111-1111-111111111111', + 'collectionName' => 'Service Macros', + 'collectionUuid' => '22222222-2222-2222-2222-222222222222', + ], + ]); +}); + +test('convenience methods use moderator and preacher titles', function () { + Setting::set('namenseinblender_macro_name', 'Namenseinblender'); + Setting::set('namenseinblender_macro_uuid', '11111111-1111-1111-1111-111111111111'); + Setting::set('namenseinblender_macro_collection_name', 'Service Macros'); + Setting::set('namenseinblender_macro_collection_uuid', '22222222-2222-2222-2222-222222222222'); + + $builder = app(NameTagSlideBuilder::class); + + expect($builder->buildModeratorSlide('Max Mustermann')['text'])->toBe("Max Mustermann\nModeration") + ->and($builder->buildPreacherSlide('Erika Beispiel')['text'])->toBe("Erika Beispiel\nPredigt"); +});