10-04-2026

This commit is contained in:
Kevin Adametz 2026-04-10 17:18:17 +02:00
parent 4d6b4930b2
commit 4bb89aad8c
836 changed files with 52961 additions and 5950 deletions

View file

@ -0,0 +1,316 @@
<?php
declare(strict_types=1);
use App\Models\Media;
use App\Models\Partner;
use App\Models\User;
use Illuminate\Http\UploadedFile;
use Illuminate\Support\Facades\Storage;
use Livewire\Volt\Volt;
use Spatie\Permission\Models\Role;
beforeEach(function () {
app()[\Spatie\Permission\PermissionRegistrar::class]->forgetCachedPermissions();
Role::firstOrCreate(['name' => 'Retailer']);
Role::firstOrCreate(['name' => 'Manufacturer']);
Storage::fake('public');
});
// ── Zugriff ──────────────────────────────────────────────────────────────────
test('retailer can access my-data page', function () {
$partner = Partner::factory()->setupCompleted()->create();
$user = User::factory()->create(['partner_id' => $partner->id]);
$user->assignRole('Retailer');
$this->actingAs($user)
->get(route('partner.my-data'))
->assertSuccessful();
});
test('manufacturer can access my-data page', function () {
$partner = Partner::factory()->setupCompleted()->create(['type' => 'manufacturer']);
$user = User::factory()->create(['partner_id' => $partner->id]);
$user->assignRole('Manufacturer');
$this->actingAs($user)
->get(route('partner.my-data'))
->assertSuccessful();
});
test('user without partner is redirected from my-data', function () {
Role::firstOrCreate(['name' => 'Admin']);
$user = User::factory()->create(['partner_id' => null]);
$user->assignRole('Admin');
$this->actingAs($user)
->get(route('partner.my-data'))
->assertRedirect(route('dashboard'));
});
// ── Händler: Story + Profil-Felder ───────────────────────────────────────────
test('retailer can save story text and founded year', function () {
$partner = Partner::factory()->setupCompleted()->create(['type' => 'retailer']);
$user = User::factory()->create(['partner_id' => $partner->id]);
$user->assignRole('Retailer');
Volt::actingAs($user)->test('partner.my-data')
->set('companyName', 'Möbelhaus Mustermann')
->set('salutation', 'Herr')
->set('firstName', 'Max')
->set('lastName', 'Mustermann')
->set('street', 'Musterstraße')
->set('houseNumber', '1')
->set('zip', '12345')
->set('city', 'Musterstadt')
->set('country', 'Deutschland')
->set('deliveryRadius', 50)
->set('assemblyRadius', 30)
->set('storyText', 'Seit 1992 sind wir Ihr Einrichtungshaus im Herzen der Stadt.')
->set('foundedYear', 1992)
->set('specialtiesInput', 'Polstermöbel, Outdoor, Küchen')
->call('saveData')
->assertHasNoErrors();
$partner->refresh();
expect($partner->story_text)->toBe('Seit 1992 sind wir Ihr Einrichtungshaus im Herzen der Stadt.');
expect($partner->founded_year)->toBe(1992);
expect($partner->specialties)->toContain('Polstermöbel');
expect($partner->specialties)->toContain('Outdoor');
expect($partner->specialties)->toContain('Küchen');
});
test('retailer can save opening hours', function () {
$partner = Partner::factory()->setupCompleted()->create(['type' => 'retailer']);
$user = User::factory()->create(['partner_id' => $partner->id]);
$user->assignRole('Retailer');
Volt::actingAs($user)->test('partner.my-data')
->set('companyName', $partner->company_name)
->set('salutation', 'Herr')
->set('firstName', 'Max')
->set('lastName', 'Mustermann')
->set('street', 'Str.')
->set('houseNumber', '1')
->set('zip', '12345')
->set('city', 'Stadt')
->set('country', 'Deutschland')
->set('deliveryRadius', 50)
->set('assemblyRadius', 30)
->set('openingHours.monday.open', '08:00')
->set('openingHours.monday.close', '20:00')
->set('openingHours.sunday.closed', true)
->call('saveData')
->assertHasNoErrors();
$partner->refresh();
expect($partner->opening_hours['monday']['open'])->toBe('08:00');
expect($partner->opening_hours['monday']['close'])->toBe('20:00');
expect($partner->opening_hours['sunday']['closed'])->toBeTrue();
});
// ── Händler: Validierung ──────────────────────────────────────────────────────
test('retailer story text cannot exceed 2000 characters', function () {
$partner = Partner::factory()->setupCompleted()->create(['type' => 'retailer']);
$user = User::factory()->create(['partner_id' => $partner->id]);
$user->assignRole('Retailer');
Volt::actingAs($user)->test('partner.my-data')
->set('storyText', str_repeat('a', 2001))
->call('saveData')
->assertHasErrors(['storyText' => 'max']);
});
test('retailer founded year must be a valid year', function () {
$partner = Partner::factory()->setupCompleted()->create(['type' => 'retailer']);
$user = User::factory()->create(['partner_id' => $partner->id]);
$user->assignRole('Retailer');
Volt::actingAs($user)->test('partner.my-data')
->set('foundedYear', 1700)
->call('saveData')
->assertHasErrors(['foundedYear']);
});
test('retailer founded year cannot be in the future', function () {
$partner = Partner::factory()->setupCompleted()->create(['type' => 'retailer']);
$user = User::factory()->create(['partner_id' => $partner->id]);
$user->assignRole('Retailer');
Volt::actingAs($user)->test('partner.my-data')
->set('foundedYear', now()->year + 1)
->call('saveData')
->assertHasErrors(['foundedYear']);
});
// ── Händler: Foto-Upload ─────────────────────────────────────────────────────
test('retailer can upload team photos', function () {
$partner = Partner::factory()->setupCompleted()->create(['type' => 'retailer']);
$user = User::factory()->create(['partner_id' => $partner->id]);
$user->assignRole('Retailer');
$photo = UploadedFile::fake()->image('team.jpg', 400, 400);
Volt::actingAs($user)->test('partner.my-data')
->set('companyName', $partner->company_name)
->set('salutation', 'Herr')
->set('firstName', 'Max')
->set('lastName', 'Muster')
->set('street', 'Str.')
->set('houseNumber', '1')
->set('zip', '12345')
->set('city', 'Stadt')
->set('country', 'Deutschland')
->set('deliveryRadius', 50)
->set('assemblyRadius', 30)
->set('newTeamPhotos', [$photo])
->call('saveData')
->assertHasNoErrors();
expect(
Media::where('model_type', Partner::class)
->where('model_id', $partner->id)
->where('type', 'team_photo')
->exists()
)->toBeTrue();
});
test('retailer can upload showroom photos', function () {
$partner = Partner::factory()->setupCompleted()->create(['type' => 'retailer']);
$user = User::factory()->create(['partner_id' => $partner->id]);
$user->assignRole('Retailer');
$photo = UploadedFile::fake()->image('showroom.jpg', 800, 600);
Volt::actingAs($user)->test('partner.my-data')
->set('companyName', $partner->company_name)
->set('salutation', 'Herr')
->set('firstName', 'Max')
->set('lastName', 'Muster')
->set('street', 'Str.')
->set('houseNumber', '1')
->set('zip', '12345')
->set('city', 'Stadt')
->set('country', 'Deutschland')
->set('deliveryRadius', 50)
->set('assemblyRadius', 30)
->set('newShowroomPhotos', [$photo])
->call('saveData')
->assertHasNoErrors();
expect(
Media::where('model_type', Partner::class)
->where('model_id', $partner->id)
->where('type', 'showroom')
->exists()
)->toBeTrue();
});
test('retailer can delete a team photo', function () {
$partner = Partner::factory()->setupCompleted()->create(['type' => 'retailer']);
$user = User::factory()->create(['partner_id' => $partner->id]);
$user->assignRole('Retailer');
Storage::disk('public')->put('partners/'.$partner->id.'/team_photo/test.jpg', 'fake');
$media = $partner->media()->create([
'file_path' => 'partners/'.$partner->id.'/team_photo/test.jpg',
'type' => 'team_photo',
'alt_text' => 'Team',
'order_column' => 1,
]);
Volt::actingAs($user)->test('partner.my-data')
->call('removeExistingPhoto', $media->id, 'team_photo')
->assertHasNoErrors();
expect(Media::find($media->id))->toBeNull();
});
// ── Hersteller: Story + Marke ─────────────────────────────────────────────────
test('manufacturer can save story text and specialties', function () {
$partner = Partner::factory()->setupCompleted()->create(['type' => 'manufacturer']);
$user = User::factory()->create(['partner_id' => $partner->id]);
$user->assignRole('Manufacturer');
Volt::actingAs($user)->test('partner.my-data')
->set('companyName', 'Muster Möbelwerke GmbH')
->set('salutation', 'Herr')
->set('firstName', 'Hans')
->set('lastName', 'Muster')
->set('street', 'Industriestr.')
->set('houseNumber', '5')
->set('zip', '33602')
->set('city', 'Bielefeld')
->set('country', 'Deutschland')
->set('brandName', 'Muster Collection')
->set('storyText', 'Seit 1975 produzieren wir hochwertige Möbel.')
->set('foundedYear', 1975)
->set('specialtiesInput', 'Polstermöbel, Massivholz')
->call('saveData')
->assertHasNoErrors();
$partner->refresh();
expect($partner->story_text)->toBe('Seit 1975 produzieren wir hochwertige Möbel.');
expect($partner->founded_year)->toBe(1975);
expect($partner->specialties)->toContain('Polstermöbel');
});
test('manufacturer can upload brand images', function () {
$partner = Partner::factory()->setupCompleted()->create(['type' => 'manufacturer']);
$user = User::factory()->create(['partner_id' => $partner->id]);
$user->assignRole('Manufacturer');
$image = UploadedFile::fake()->image('brand.jpg', 800, 600);
Volt::actingAs($user)->test('partner.my-data')
->set('companyName', $partner->company_name)
->set('salutation', 'Herr')
->set('firstName', 'Hans')
->set('lastName', 'Muster')
->set('street', 'Str.')
->set('houseNumber', '1')
->set('zip', '12345')
->set('city', 'Stadt')
->set('country', 'Deutschland')
->set('brandName', 'Muster Marke')
->set('newBrandImages', [$image])
->call('saveData')
->assertHasNoErrors();
expect(
Media::where('model_type', Partner::class)
->where('model_id', $partner->id)
->where('type', 'brand_image')
->exists()
)->toBeTrue();
});
// ── Öffentliches Profil ───────────────────────────────────────────────────────
test('public profile shows story text when set', function () {
$partner = Partner::factory()->setupCompleted()->create([
'story_text' => 'Unsere Geschichte seit 1985.',
]);
$user = User::factory()->create(['partner_id' => $partner->id]);
$user->assignRole('Retailer');
Volt::actingAs($user)->test('partner.profile', ['partnerId' => $partner->id])
->assertSee('Unsere Geschichte seit 1985.');
});
test('public profile shows specialties when set', function () {
$partner = Partner::factory()->setupCompleted()->create([
'specialties' => ['Sofas', 'Esstische'],
]);
$user = User::factory()->create(['partner_id' => $partner->id]);
$user->assignRole('Retailer');
Volt::actingAs($user)->test('partner.profile', ['partnerId' => $partner->id])
->assertSee('Sofas')
->assertSee('Esstische');
});