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'); });