12-05-2026 Frontend dev
This commit is contained in:
parent
405df0a122
commit
5b8bdf4182
779 changed files with 480564 additions and 6241 deletions
354
tests/Feature/CustomerCompanyContextTest.php
Normal file
354
tests/Feature/CustomerCompanyContextTest.php
Normal file
|
|
@ -0,0 +1,354 @@
|
|||
<?php
|
||||
|
||||
use App\Models\Company;
|
||||
use App\Models\Contact;
|
||||
use App\Models\PressRelease;
|
||||
use App\Models\User;
|
||||
use App\Services\Customer\CustomerCompanyContext;
|
||||
use Illuminate\Http\UploadedFile;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
use Livewire\Volt\Volt as LivewireVolt;
|
||||
use Tests\TestCase;
|
||||
|
||||
test('customer company switcher stores only accessible company context', function () {
|
||||
/** @var TestCase $this */
|
||||
$customer = User::factory()->create(['is_active' => true]);
|
||||
$company = Company::factory()->presseecho()->create([
|
||||
'name' => 'Alpha GmbH',
|
||||
]);
|
||||
$inaccessibleCompany = Company::factory()->businessportal24()->create([
|
||||
'name' => 'Fremde GmbH',
|
||||
]);
|
||||
$customer->companies()->attach($company->id, ['role' => 'responsible']);
|
||||
|
||||
$this->actingAs($customer);
|
||||
|
||||
LivewireVolt::test('customer.company-switcher')
|
||||
->assertSee('Alpha GmbH')
|
||||
->assertDontSee('Fremde GmbH')
|
||||
->set('activeCompany', (string) $company->id);
|
||||
|
||||
expect(session(CustomerCompanyContext::SessionKey))->toBe($company->id);
|
||||
|
||||
LivewireVolt::test('customer.company-switcher')
|
||||
->set('activeCompany', (string) $inaccessibleCompany->id);
|
||||
|
||||
expect(session(CustomerCompanyContext::SessionKey))->toBe($company->id);
|
||||
});
|
||||
|
||||
test('customer company switcher links to selected company detail', function () {
|
||||
/** @var TestCase $this */
|
||||
$customer = User::factory()->create(['is_active' => true]);
|
||||
$company = Company::factory()->presseecho()->create([
|
||||
'name' => 'Alpha GmbH',
|
||||
]);
|
||||
$customer->companies()->attach($company->id, ['role' => 'responsible']);
|
||||
|
||||
$this->actingAs($customer)
|
||||
->withSession([CustomerCompanyContext::SessionKey => $company->id]);
|
||||
|
||||
LivewireVolt::test('customer.company-switcher')
|
||||
->assertSee('Alpha GmbH')
|
||||
->assertSee('Firma öffnen')
|
||||
->assertSee(route('me.press-kits.show', $company->id, absolute: false));
|
||||
});
|
||||
|
||||
test('customer press release list is filtered by selected company context', function () {
|
||||
/** @var TestCase $this */
|
||||
$customer = User::factory()->create(['is_active' => true]);
|
||||
$company = Company::factory()->presseecho()->create(['name' => 'Alpha GmbH']);
|
||||
$otherCompany = Company::factory()->businessportal24()->create(['name' => 'Beta GmbH']);
|
||||
$customer->companies()->attach($company->id, ['role' => 'owner']);
|
||||
$customer->companies()->attach($otherCompany->id, ['role' => 'owner']);
|
||||
|
||||
PressRelease::factory()->create([
|
||||
'user_id' => $customer->id,
|
||||
'company_id' => $company->id,
|
||||
'title' => 'Alpha Produktmeldung',
|
||||
]);
|
||||
PressRelease::factory()->create([
|
||||
'user_id' => $customer->id,
|
||||
'company_id' => $otherCompany->id,
|
||||
'title' => 'Beta Produktmeldung',
|
||||
]);
|
||||
|
||||
$this->actingAs($customer)
|
||||
->withSession([CustomerCompanyContext::SessionKey => $company->id]);
|
||||
|
||||
LivewireVolt::test('customer.press-releases.index')
|
||||
->assertSee('Gefiltert auf Alpha GmbH')
|
||||
->assertSee('Alpha Produktmeldung')
|
||||
->assertDontSee('Beta Produktmeldung');
|
||||
});
|
||||
|
||||
test('customer press release list can filter unassigned legacy press releases', function () {
|
||||
/** @var TestCase $this */
|
||||
$customer = User::factory()->create(['is_active' => true]);
|
||||
$company = Company::factory()->presseecho()->create(['name' => 'Alpha GmbH']);
|
||||
$customer->companies()->attach($company->id, ['role' => 'owner']);
|
||||
|
||||
PressRelease::factory()->create([
|
||||
'user_id' => $customer->id,
|
||||
'company_id' => $company->id,
|
||||
'title' => 'Alpha Firmenmeldung',
|
||||
]);
|
||||
PressRelease::factory()->create([
|
||||
'user_id' => $customer->id,
|
||||
'company_id' => null,
|
||||
'title' => 'Legacy ohne Firma',
|
||||
]);
|
||||
|
||||
$this->actingAs($customer);
|
||||
|
||||
LivewireVolt::test('customer.press-releases.index')
|
||||
->set('companyFilter', 'unassigned')
|
||||
->assertSee('Legacy ohne Firma')
|
||||
->assertDontSee('Alpha Firmenmeldung');
|
||||
});
|
||||
|
||||
test('customer dashboard is filtered by selected company context', function () {
|
||||
/** @var TestCase $this */
|
||||
$customer = User::factory()->create(['is_active' => true]);
|
||||
$company = Company::factory()->presseecho()->create(['name' => 'Alpha GmbH']);
|
||||
$otherCompany = Company::factory()->businessportal24()->create(['name' => 'Beta GmbH']);
|
||||
$customer->companies()->attach($company->id, ['role' => 'owner']);
|
||||
$customer->companies()->attach($otherCompany->id, ['role' => 'owner']);
|
||||
|
||||
PressRelease::factory()->create([
|
||||
'user_id' => $customer->id,
|
||||
'company_id' => $company->id,
|
||||
'title' => 'Alpha Dashboardmeldung',
|
||||
]);
|
||||
PressRelease::factory()->create([
|
||||
'user_id' => $customer->id,
|
||||
'company_id' => $otherCompany->id,
|
||||
'title' => 'Beta Dashboardmeldung',
|
||||
]);
|
||||
|
||||
$this->actingAs($customer)
|
||||
->withSession([CustomerCompanyContext::SessionKey => $company->id]);
|
||||
|
||||
LivewireVolt::test('customer.dashboard')
|
||||
->assertSee('Übersicht für Alpha GmbH')
|
||||
->assertSee('Alpha Dashboardmeldung')
|
||||
->assertDontSee('Beta Dashboardmeldung');
|
||||
});
|
||||
|
||||
test('customer dashboard shows data quality hints', function () {
|
||||
/** @var TestCase $this */
|
||||
$customer = User::factory()->create(['is_active' => true]);
|
||||
$company = Company::factory()->presseecho()->create(['name' => 'Alpha GmbH']);
|
||||
$customer->companies()->attach($company->id, ['role' => 'owner']);
|
||||
|
||||
$this->actingAs($customer)
|
||||
->withSession([CustomerCompanyContext::SessionKey => $company->id]);
|
||||
|
||||
LivewireVolt::test('customer.dashboard')
|
||||
->assertSee('Datenqualität')
|
||||
->assertSee('Profil unvollständig')
|
||||
->assertSee('Rechnungsadresse fehlt')
|
||||
->assertSee('Keine Pressekontakte hinterlegt');
|
||||
});
|
||||
|
||||
test('customer dashboard links unassigned press release hint to filtered list', function () {
|
||||
/** @var TestCase $this */
|
||||
$customer = User::factory()->create(['is_active' => true]);
|
||||
$company = Company::factory()->presseecho()->create(['name' => 'Alpha GmbH']);
|
||||
$customer->companies()->attach($company->id, ['role' => 'owner']);
|
||||
|
||||
PressRelease::factory()->create([
|
||||
'user_id' => $customer->id,
|
||||
'company_id' => null,
|
||||
'title' => 'Legacy ohne Firma',
|
||||
]);
|
||||
|
||||
$this->actingAs($customer);
|
||||
|
||||
LivewireVolt::test('customer.dashboard')
|
||||
->assertSee('Pressemitteilung ohne Firma')
|
||||
->assertSee('company=unassigned');
|
||||
});
|
||||
|
||||
test('create press release uses selected company context as default', function () {
|
||||
/** @var TestCase $this */
|
||||
$customer = User::factory()->create(['is_active' => true]);
|
||||
$company = Company::factory()->presseecho()->create(['name' => 'Alpha GmbH']);
|
||||
$otherCompany = Company::factory()->businessportal24()->create(['name' => 'Beta GmbH']);
|
||||
$customer->companies()->attach($company->id, ['role' => 'owner']);
|
||||
$customer->companies()->attach($otherCompany->id, ['role' => 'owner']);
|
||||
|
||||
$this->actingAs($customer)
|
||||
->withSession([CustomerCompanyContext::SessionKey => $otherCompany->id]);
|
||||
|
||||
LivewireVolt::test('customer.press-releases.create')
|
||||
->assertSet('companyId', $otherCompany->id)
|
||||
->assertSee('Beta GmbH');
|
||||
});
|
||||
|
||||
test('customer can browse own press kits and open a press kit detail', function () {
|
||||
/** @var TestCase $this */
|
||||
$customer = User::factory()->create(['is_active' => true]);
|
||||
$company = Company::factory()->presseecho()->create([
|
||||
'name' => 'Alpha Pressemappe',
|
||||
'email' => 'presse@alpha.test',
|
||||
]);
|
||||
$otherCompany = Company::factory()->businessportal24()->create([
|
||||
'name' => 'Fremde Pressemappe',
|
||||
]);
|
||||
$customer->companies()->attach($company->id, ['role' => 'responsible']);
|
||||
|
||||
Contact::factory()->create([
|
||||
'company_id' => $company->id,
|
||||
'first_name' => 'Paula',
|
||||
'last_name' => 'Presse',
|
||||
'email' => 'paula@example.test',
|
||||
]);
|
||||
PressRelease::factory()->create([
|
||||
'user_id' => $customer->id,
|
||||
'company_id' => $company->id,
|
||||
'title' => 'Alpha Pressemeldung',
|
||||
]);
|
||||
|
||||
$this->actingAs($customer);
|
||||
|
||||
LivewireVolt::test('customer.press-kits.index')
|
||||
->assertSee('Alpha Pressemappe')
|
||||
->assertDontSee('Fremde Pressemappe');
|
||||
|
||||
LivewireVolt::test('customer.press-kits.show', ['id' => $company->id])
|
||||
->assertSee('Alpha Pressemappe')
|
||||
->assertSee('presse@alpha.test')
|
||||
->assertSee('Paula Presse')
|
||||
->assertSee('Alpha Pressemeldung')
|
||||
->assertSee('Abrechnung')
|
||||
->assertSee('Statistik');
|
||||
|
||||
expect(session(CustomerCompanyContext::SessionKey))->toBe($company->id);
|
||||
});
|
||||
|
||||
test('customer cannot open inaccessible press kit detail', function () {
|
||||
/** @var TestCase $this */
|
||||
$customer = User::factory()->create(['is_active' => true]);
|
||||
$otherCompany = Company::factory()->businessportal24()->create([
|
||||
'name' => 'Fremde Pressemappe',
|
||||
]);
|
||||
|
||||
$this->actingAs($customer);
|
||||
|
||||
LivewireVolt::test('customer.press-kits.show', ['id' => $otherCompany->id])
|
||||
->assertNotFound();
|
||||
});
|
||||
|
||||
test('responsible customer can manage press kit contacts', function () {
|
||||
/** @var TestCase $this */
|
||||
$customer = User::factory()->create(['is_active' => true]);
|
||||
$company = Company::factory()->presseecho()->create([
|
||||
'name' => 'Alpha Pressemappe',
|
||||
]);
|
||||
$customer->companies()->attach($company->id, ['role' => 'responsible']);
|
||||
|
||||
$this->actingAs($customer);
|
||||
|
||||
LivewireVolt::test('customer.press-kits.show', ['id' => $company->id])
|
||||
->call('startCreateContact')
|
||||
->set('contactFirstName', 'Mara')
|
||||
->set('contactLastName', 'Muster')
|
||||
->set('contactResponsibility', 'Presse')
|
||||
->set('contactEmail', 'mara@example.test')
|
||||
->set('contactPhone', '+49 30 123')
|
||||
->call('saveContact')
|
||||
->assertHasNoErrors()
|
||||
->assertSee('Pressekontakt wurde angelegt.');
|
||||
|
||||
$contact = Contact::query()->where('company_id', $company->id)->firstOrFail();
|
||||
|
||||
expect($contact->email)->toBe('mara@example.test');
|
||||
|
||||
LivewireVolt::test('customer.press-kits.show', ['id' => $company->id])
|
||||
->call('editContact', $contact->id)
|
||||
->set('contactEmail', 'presse@example.test')
|
||||
->call('saveContact')
|
||||
->assertHasNoErrors()
|
||||
->assertSee('Pressekontakt wurde aktualisiert.');
|
||||
|
||||
expect($contact->refresh()->email)->toBe('presse@example.test');
|
||||
|
||||
LivewireVolt::test('customer.press-kits.show', ['id' => $company->id])
|
||||
->call('deleteContact', $contact->id)
|
||||
->assertSee('Pressekontakt wurde gelöscht.');
|
||||
|
||||
expect(Contact::query()->whereKey($contact->id)->exists())->toBeFalse();
|
||||
});
|
||||
|
||||
test('member customer cannot manage press kit contacts', function () {
|
||||
/** @var TestCase $this */
|
||||
$customer = User::factory()->create(['is_active' => true]);
|
||||
$company = Company::factory()->presseecho()->create([
|
||||
'name' => 'Alpha Pressemappe',
|
||||
]);
|
||||
$customer->companies()->attach($company->id, ['role' => 'member']);
|
||||
|
||||
$this->actingAs($customer);
|
||||
|
||||
LivewireVolt::test('customer.press-kits.show', ['id' => $company->id])
|
||||
->assertDontSee('Kontakt hinzufügen')
|
||||
->call('startCreateContact')
|
||||
->assertForbidden();
|
||||
});
|
||||
|
||||
test('responsible customer can manage press kit company master data', function () {
|
||||
/** @var TestCase $this */
|
||||
Storage::fake('public');
|
||||
|
||||
$customer = User::factory()->create(['is_active' => true]);
|
||||
$company = Company::factory()->presseecho()->create([
|
||||
'name' => 'Alte Pressemappe',
|
||||
'email' => 'alt@example.test',
|
||||
]);
|
||||
$customer->companies()->attach($company->id, ['role' => 'responsible']);
|
||||
|
||||
$this->actingAs($customer);
|
||||
|
||||
$logo = UploadedFile::fake()->image('logo.png', 800, 400);
|
||||
|
||||
LivewireVolt::test('customer.press-kits.show', ['id' => $company->id])
|
||||
->call('startEditCompany')
|
||||
->set('companyName', 'Neue Pressemappe GmbH')
|
||||
->set('companyEmail', 'neu@example.test')
|
||||
->set('companyPhone', '+49 30 456')
|
||||
->set('companyWebsite', 'https://example.test')
|
||||
->set('companyAddress', 'Neue Strasse 1')
|
||||
->set('companyCountryCode', 'AT')
|
||||
->set('companyDisableFooterCode', true)
|
||||
->set('companyLogo', $logo)
|
||||
->call('saveCompany')
|
||||
->assertHasNoErrors()
|
||||
->assertSee('Stammdaten wurden gespeichert.');
|
||||
|
||||
$company->refresh();
|
||||
|
||||
expect($company->name)->toBe('Neue Pressemappe GmbH');
|
||||
expect($company->email)->toBe('neu@example.test');
|
||||
expect($company->country_code)->toBe('AT');
|
||||
expect($company->disable_footer_code)->toBeTrue();
|
||||
expect($company->logo_path)->not->toBeNull();
|
||||
expect($company->logo_variants)->toHaveKey('sq');
|
||||
expect($company->logo_variants)->toHaveKey('wide');
|
||||
expect(Storage::disk('public')->exists($company->logo_path))->toBeTrue();
|
||||
});
|
||||
|
||||
test('member customer cannot manage press kit company master data', function () {
|
||||
/** @var TestCase $this */
|
||||
$customer = User::factory()->create(['is_active' => true]);
|
||||
$company = Company::factory()->presseecho()->create([
|
||||
'name' => 'Alpha Pressemappe',
|
||||
]);
|
||||
$customer->companies()->attach($company->id, ['role' => 'member']);
|
||||
|
||||
$this->actingAs($customer);
|
||||
|
||||
LivewireVolt::test('customer.press-kits.show', ['id' => $company->id])
|
||||
->assertDontSee('Stammdaten bearbeiten')
|
||||
->call('startEditCompany')
|
||||
->assertForbidden();
|
||||
});
|
||||
Loading…
Add table
Add a link
Reference in a new issue