Anschrift für Veranstaltungsort

This commit is contained in:
2026-09-10 11:45:52 +02:00
parent 70a57d10f5
commit ddfaab1501
19 changed files with 306 additions and 10 deletions
+177
View File
@@ -0,0 +1,177 @@
<?php
namespace Tests\Feature;
use App\Domains\Event\Actions\CreateEvent\CreateEventCommand;
use App\Domains\Event\Actions\CreateEvent\CreateEventRequest;
use App\Domains\Event\Actions\UpdateEvent\UpdateEventCommand;
use App\Domains\Event\Actions\UpdateEvent\UpdateEventRequest;
use App\Enumerations\CostUnitType;
use App\Enumerations\EatingHabit;
use App\Enumerations\ParticipationFeeType;
use App\Models\CostUnit;
use App\Models\Event;
use App\Models\Tenant;
use App\Resources\EventResource;
use App\ValueObjects\Amount;
use DateTime;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Tests\TestCase;
class EventAddressTest extends TestCase
{
use RefreshDatabase;
private Tenant $tenant;
protected function setUp(): void
{
parent::setUp();
$this->tenant = Tenant::create([
'slug' => 'tv',
'name' => 'Test',
'email' => 't@example.com',
'email_finance' => 'finance@example.com',
'url' => 'test.local',
'account_name' => 'Test e.V.',
'account_iban' => 'DE00',
'account_bic' => 'XY',
'city' => 'Stadt',
'postcode' => '00000',
'is_active_local_group' => true,
'has_active_instance' => true,
'tax_liable' => false,
'vat_rate' => 0,
'vat_pricing_mode' => 'inclusive',
]);
app()->instance('tenant', $this->tenant);
DB::table('cost_unit_types')->insert(['slug' => CostUnitType::COST_UNIT_TYPE_EVENT, 'name' => 'Veranstaltung']);
DB::table('participation_types')->insert(['slug' => 'participant', 'name' => 'Teilnehmer']);
DB::table('participation_fee_types')->insert(['slug' => 'fixed', 'name' => 'Fix']);
EatingHabit::create(['slug' => EatingHabit::EATING_HABIT_VEGAN, 'name' => 'Vegan']);
EatingHabit::create(['slug' => EatingHabit::EATING_HABIT_VEGETARIAN, 'name' => 'Vegetarisch']);
}
private function createEvent(?string $street = null, ?string $houseNumber = null): Event
{
$response = new CreateEventCommand(new CreateEventRequest(
name: 'Sommerlager',
location: 'Leipzig',
postalCode: '04103',
email: 'e@example.com',
begin: new DateTime('2026-09-01'),
end: new DateTime('2026-09-05'),
earlyBirdEnd: new DateTime('2026-08-20'),
registrationFinalEnd: new DateTime('2026-08-25'),
earlyBirdEndAmountIncrease: 0,
participationFeeType: ParticipationFeeType::where('slug', 'fixed')->first(),
accountOwner: 'Owner',
accountIban: 'DE00',
payPerDay: false,
street: $street,
houseNumber: $houseNumber,
))->execute();
$this->assertTrue($response->success);
return $response->event->fresh();
}
private function updateEvent(Event $event, ?string $street, ?string $houseNumber): Event
{
$response = new UpdateEventCommand(new UpdateEventRequest(
event: $event,
eventName: $event->name,
eventLocation: $event->location,
postalCode: $event->postal_code,
email: $event->email,
earlyBirdEnd: new DateTime('2026-08-20'),
registrationFinalEnd: new DateTime('2026-08-25'),
alcoholicsAge: 16,
sendWeeklyReports: true,
registrationAllowed: true,
flatSupport: Amount::fromString('0,00'),
supportPerPerson: Amount::fromString('0,00'),
contributingLocalGroups: [],
eatingHabits: [],
street: $street,
houseNumber: $houseNumber,
))->execute();
$this->assertTrue($response->success);
return $event->fresh();
}
public function test_anlage_speichert_strasse_und_hausnummer(): void
{
$event = $this->createEvent('Musterweg', '12');
$this->assertSame('Musterweg', $event->street);
$this->assertSame('12', $event->house_number);
}
public function test_anlage_ohne_angabe_laesst_beide_felder_leer(): void
{
$event = $this->createEvent();
$this->assertNull($event->street);
$this->assertNull($event->house_number);
}
public function test_leere_eingaben_werden_bei_der_anlage_zu_null(): void
{
$event = $this->createEvent('', ' ');
$this->assertNull($event->street);
$this->assertNull($event->house_number);
}
public function test_einstellungen_ergaenzen_und_leeren_die_anschrift(): void
{
$event = $this->updateEvent($this->createEvent(), 'Musterweg', '12');
$this->assertSame('Musterweg', $event->street);
$this->assertSame('12', $event->house_number);
$event = $this->updateEvent($event, '', '');
$this->assertNull($event->street);
$this->assertNull($event->house_number);
}
public function test_anschrift_enthaelt_strasse_nur_wenn_sie_gefuellt_ist(): void
{
$this->assertSame('Musterweg 12, 04103 Leipzig', $this->createEvent('Musterweg', '12')->getFullAddress());
$this->assertSame('04103 Leipzig', $this->createEvent()->getFullAddress());
}
public function test_resource_liefert_einzelfelder_und_fertige_anschrift(): void
{
$event = $this->createEvent('Musterweg', '12');
// Die Resource gibt auch die Kostenstelle aus; im Betrieb legt der Controller sie direkt nach
// der Veranstaltung an.
$event->cost_unit_id = CostUnit::create([
'tenant' => $this->tenant->slug,
'name' => 'Sommerlager',
'type' => CostUnitType::COST_UNIT_TYPE_EVENT,
'distance_allowance' => 0.25,
'mail_on_new' => false,
'allow_new' => true,
'archived' => false,
])->id;
$event->save();
$resource = new EventResource($event)->toArray(new Request());
$this->assertSame('Musterweg', $resource['street']);
$this->assertSame('12', $resource['houseNumber']);
$this->assertSame('Musterweg 12, 04103 Leipzig', $resource['fullAddress']);
}
}