feat(export): nametag slide builder

This commit is contained in:
Thorsten Bus 2026-05-31 00:48:46 +02:00
parent a19c967594
commit bb877d16c6
4 changed files with 108 additions and 0 deletions

View file

@ -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`

View file

@ -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).

View file

@ -0,0 +1,37 @@
<?php
namespace App\Services;
use App\Models\Setting;
class NameTagSlideBuilder
{
public function buildModeratorSlide(string $name): ?array
{
return $this->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'),
],
];
}
}

View file

@ -0,0 +1,39 @@
<?php
use App\Models\Setting;
use App\Services\NameTagSlideBuilder;
test('build returns null when namenseinblender macro is not configured', function () {
expect(app(NameTagSlideBuilder::class)->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");
});