22-05-2026 Optimierung der User und Admin Panels
This commit is contained in:
parent
d2ba22c0cf
commit
e8c47b7553
73 changed files with 10282 additions and 1546 deletions
309
tests/Feature/CustomerPressKitIndexPhase8eTest.php
Normal file
309
tests/Feature/CustomerPressKitIndexPhase8eTest.php
Normal file
|
|
@ -0,0 +1,309 @@
|
|||
<?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');
|
||||
});
|
||||
Loading…
Add table
Add a link
Reference in a new issue