presseportale/tests/Feature/CustomerPressKitIndexPhase8eTest.php
Kevin Adametz e8c47b7553
Some checks failed
linter / quality (push) Has been cancelled
tests / ci (push) Has been cancelled
22-05-2026 Optimierung der User und Admin Panels
2026-05-22 11:18:59 +02:00

309 lines
12 KiB
PHP

<?php
use App\Models\Company;
use App\Models\Contact;
use App\Models\PressRelease;
use App\Models\User;
use Database\Seeders\RolesAndPermissionsSeeder;
use Illuminate\Support\Facades\Schema;
use Livewire\Volt\Volt as LivewireVolt;
use Tests\TestCase;
beforeEach(function (): void {
/** @var TestCase $this */
$this->seed(RolesAndPermissionsSeeder::class);
});
/**
* @return array{customer: User}
*/
function makeCustomerForPressKitsIndex(): array
{
$customer = User::factory()->create(['is_active' => true]);
$customer->assignRole('customer');
return ['customer' => $customer];
}
test('Index zeigt Counter-Strip mit Firmen, aktiven, PMs und Kontakten', function () {
/** @var TestCase $this */
['customer' => $customer] = makeCustomerForPressKitsIndex();
$activeOne = Company::factory()->presseecho()->create();
$customer->companies()->attach($activeOne->id, ['role' => 'owner']);
Contact::factory()->count(2)->for($activeOne)->create(['portal' => $activeOne->portal->value]);
PressRelease::factory()->count(3)->for($activeOne)->create([
'user_id' => $customer->id,
'portal' => $activeOne->portal->value,
'status' => 'draft',
]);
$activeTwo = Company::factory()->businessportal24()->create();
$customer->companies()->attach($activeTwo->id, ['role' => 'responsible']);
Contact::factory()->for($activeTwo)->create(['portal' => $activeTwo->portal->value]);
$inactive = Company::factory()->presseecho()->inactive()->create();
$customer->companies()->attach($inactive->id, ['role' => 'member']);
$this->actingAs($customer)
->get('/admin/me/firmen')
->assertOk()
->assertSeeInOrder(['<b>3</b>', 'Firmen'], false)
->assertSeeInOrder(['<b>2</b>', 'aktiv'], false)
->assertSeeInOrder(['<b>3</b>', 'Pressemitteilungen gesamt'], false)
->assertSeeInOrder(['<b>3</b>', 'Pressekontakte hinterlegt'], false);
});
test('Saved-View Aktiv filtert nur is_active = true Firmen', function () {
/** @var TestCase $this */
['customer' => $customer] = makeCustomerForPressKitsIndex();
$active = Company::factory()->presseecho()->create(['name' => 'AlphaAktiv GmbH']);
$customer->companies()->attach($active->id, ['role' => 'owner']);
$inactive = Company::factory()->presseecho()->inactive()->create(['name' => 'ZetaInaktiv GmbH']);
$customer->companies()->attach($inactive->id, ['role' => 'owner']);
LivewireVolt::actingAs($customer)
->test('customer.press-kits.index')
->call('setSavedView', 'active')
->assertSet('savedView', 'active')
->assertSee('AlphaAktiv GmbH')
->assertDontSee('ZetaInaktiv GmbH');
});
test('Saved-View Inaktiv filtert nur is_active = false Firmen', function () {
/** @var TestCase $this */
['customer' => $customer] = makeCustomerForPressKitsIndex();
$active = Company::factory()->presseecho()->create(['name' => 'AlphaAktiv GmbH']);
$customer->companies()->attach($active->id, ['role' => 'owner']);
$inactive = Company::factory()->presseecho()->inactive()->create(['name' => 'ZetaInaktiv GmbH']);
$customer->companies()->attach($inactive->id, ['role' => 'owner']);
LivewireVolt::actingAs($customer)
->test('customer.press-kits.index')
->call('setSavedView', 'inactive')
->assertSee('ZetaInaktiv GmbH')
->assertDontSee('AlphaAktiv GmbH');
});
test('Saved-View Geteilt zeigt nur Firmen, bei denen User nicht Owner ist', function () {
/** @var TestCase $this */
['customer' => $customer] = makeCustomerForPressKitsIndex();
$owner = User::factory()->create();
$ownCompany = Company::factory()->presseecho()->create([
'name' => 'EigeneFirma GmbH',
'owner_user_id' => $customer->id,
]);
$sharedCompany = Company::factory()->presseecho()->create([
'name' => 'GeteilteFirma GmbH',
'owner_user_id' => $owner->id,
]);
$customer->companies()->attach($sharedCompany->id, ['role' => 'responsible']);
LivewireVolt::actingAs($customer)
->test('customer.press-kits.index')
->call('setSavedView', 'shared')
->assertSee('GeteilteFirma GmbH')
->assertDontSee('EigeneFirma GmbH');
});
test('Portal-Filter zeigt nur Firmen des gewählten Portals (oder both)', function () {
/** @var TestCase $this */
['customer' => $customer] = makeCustomerForPressKitsIndex();
$pe = Company::factory()->presseecho()->create(['name' => 'PresseechoCo GmbH']);
$bp = Company::factory()->businessportal24()->create(['name' => 'BusinessportalCo GmbH']);
$customer->companies()->attach([
$pe->id => ['role' => 'owner'],
$bp->id => ['role' => 'owner'],
]);
LivewireVolt::actingAs($customer)
->test('customer.press-kits.index')
->call('setPortalFilter', 'presseecho')
->assertSee('PresseechoCo GmbH')
->assertDontSee('BusinessportalCo GmbH');
});
test('Rollen-Filter Owner zeigt nur Firmen, in denen User Owner ist', function () {
/** @var TestCase $this */
['customer' => $customer] = makeCustomerForPressKitsIndex();
$otherOwner = User::factory()->create();
$owned = Company::factory()->presseecho()->create([
'name' => 'EigeneFirma GmbH',
'owner_user_id' => $customer->id,
]);
$memberCompany = Company::factory()->presseecho()->create([
'name' => 'MitgliedFirma GmbH',
'owner_user_id' => $otherOwner->id,
]);
$customer->companies()->attach($memberCompany->id, ['role' => 'member']);
LivewireVolt::actingAs($customer)
->test('customer.press-kits.index')
->call('setRoleFilter', 'owner')
->assertSee('EigeneFirma GmbH')
->assertDontSee('MitgliedFirma GmbH');
});
test('Suche filtert auf Firmennamen', function () {
/** @var TestCase $this */
['customer' => $customer] = makeCustomerForPressKitsIndex();
$alpha = Company::factory()->presseecho()->create(['name' => 'Alpha Brauerei AG']);
$beta = Company::factory()->presseecho()->create(['name' => 'Beta Verlag GmbH']);
$customer->companies()->attach([
$alpha->id => ['role' => 'owner'],
$beta->id => ['role' => 'owner'],
]);
LivewireVolt::actingAs($customer)
->test('customer.press-kits.index')
->set('search', 'Brauerei')
->assertSee('Alpha Brauerei AG')
->assertDontSee('Beta Verlag GmbH');
});
test('View-Mode kann auf list umgeschaltet werden', function () {
/** @var TestCase $this */
['customer' => $customer] = makeCustomerForPressKitsIndex();
$company = Company::factory()->presseecho()->create(['name' => 'FirmaA GmbH']);
$customer->companies()->attach($company->id, ['role' => 'owner']);
LivewireVolt::actingAs($customer)
->test('customer.press-kits.index')
->call('setViewMode', 'list')
->assertSet('viewMode', 'list')
->assertSee('FirmaA GmbH')
->assertSee('cursor-pointer', false)
->assertSee('firm-list-actions', false);
});
test('Empty-State noch-keine-Firma wird ohne Filter und ohne Firmen gezeigt', function () {
/** @var TestCase $this */
['customer' => $customer] = makeCustomerForPressKitsIndex();
$this->actingAs($customer)
->get('/admin/me/firmen')
->assertOk()
->assertSeeText('Noch keine Firma angelegt');
});
test('Empty-State Filter-ohne-Treffer wird bei aktiven Filtern ohne Match gezeigt', function () {
/** @var TestCase $this */
['customer' => $customer] = makeCustomerForPressKitsIndex();
$company = Company::factory()->presseecho()->create(['name' => 'Alpha GmbH']);
$customer->companies()->attach($company->id, ['role' => 'owner']);
LivewireVolt::actingAs($customer)
->test('customer.press-kits.index')
->set('search', 'Zeta')
->assertSee('Keine Firmen mit diesen Filtern');
});
test('Filter zurücksetzen leert alle Filter und Suche', function () {
/** @var TestCase $this */
['customer' => $customer] = makeCustomerForPressKitsIndex();
$company = Company::factory()->presseecho()->create(['name' => 'Alpha GmbH']);
$customer->companies()->attach($company->id, ['role' => 'owner']);
LivewireVolt::actingAs($customer)
->test('customer.press-kits.index')
->set('search', 'Zeta')
->call('setSavedView', 'inactive')
->call('setPortalFilter', 'presseecho')
->call('setRoleFilter', 'member')
->call('resetFilters')
->assertSet('search', '')
->assertSet('savedView', 'all')
->assertSet('portalFilter', '')
->assertSet('roleFilter', 'all')
->assertSee('Alpha GmbH');
});
test('Add-Tile wird nur auf der letzten Seite des Card-Grids gerendert', function () {
/** @var TestCase $this */
['customer' => $customer] = makeCustomerForPressKitsIndex();
$company = Company::factory()->presseecho()->create(['name' => 'Alpha GmbH']);
$customer->companies()->attach($company->id, ['role' => 'owner']);
LivewireVolt::actingAs($customer)
->test('customer.press-kits.index')
->assertSee('Neue Firma anlegen');
});
test('Firmenübersicht paginiert mit 50 Firmen pro Seite', function () {
/** @var TestCase $this */
['customer' => $customer] = makeCustomerForPressKitsIndex();
for ($i = 1; $i <= 51; $i++) {
Company::factory()->presseecho()->create([
'name' => sprintf('Paginiert Firma %02d', $i),
'owner_user_id' => $customer->id,
]);
}
LivewireVolt::actingAs($customer)
->test('customer.press-kits.index')
->assertViewHas('pressKits', fn ($pressKits) => $pressKits->perPage() === 50 && $pressKits->count() === 50)
->assertSee('portal-pagination', false)
->assertSee('aria-current="page"', false)
->assertSee('cursor-pointer', false)
->assertSee('Paginiert Firma 01')
->assertSee('Paginiert Firma 50')
->assertDontSee('Paginiert Firma 51');
});
test('Karte zeigt Status Aktiv, Portal-Pills und KPIs', function () {
/** @var TestCase $this */
['customer' => $customer] = makeCustomerForPressKitsIndex();
$company = Company::factory()->presseecho()->create([
'name' => 'Brauerei AG',
'is_active' => true,
]);
$customer->companies()->attach($company->id, ['role' => 'owner']);
Contact::factory()->count(2)->for($company)->create(['portal' => $company->portal->value]);
PressRelease::factory()->count(4)->for($company)->create([
'user_id' => $customer->id,
'portal' => $company->portal->value,
'status' => 'draft',
]);
$this->actingAs($customer)
->get('/admin/me/firmen')
->assertOk()
->assertSeeText('Aktiv')
->assertSeeText('Brauerei AG')
->assertSee('presseecho')
->assertSeeText('PMs');
});
test('Rollen-Legende wird unterhalb der Liste angezeigt', function () {
/** @var TestCase $this */
['customer' => $customer] = makeCustomerForPressKitsIndex();
$this->actingAs($customer)
->get('/admin/me/firmen')
->assertOk()
->assertSeeText('Rollen pro Firma');
});
test('Performance-Indexe für die Firmenübersicht sind vorhanden', function () {
$companyIndexes = collect(Schema::getIndexes('companies'))->pluck('name');
$pressReleaseIndexes = collect(Schema::getIndexes('press_releases'))->pluck('name');
expect($companyIndexes)
->toContain('companies_owner_name_id_idx')
->toContain('companies_owner_active_name_id_idx')
->and($pressReleaseIndexes)
->toContain('press_releases_company_published_idx')
->toContain('press_releases_user_created_id_idx')
->toContain('press_releases_user_status_created_idx');
});