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(['3', 'Firmen'], false) ->assertSeeInOrder(['2', 'aktiv'], false) ->assertSeeInOrder(['3', 'Pressemitteilungen gesamt'], false) ->assertSeeInOrder(['3', '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'); });