316 lines
12 KiB
PHP
316 lines
12 KiB
PHP
<?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');
|
|
});
|