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