d2d.emegrendeles.hu/tests/Feature/FeatureFlagOverrideUiTest.php

104 lines
3.5 KiB
PHP

<?php
use App\Filament\Resources\FeatureFlagOverrides\FeatureFlagOverrideResource;
use App\Filament\Resources\FeatureFlagOverrides\Pages\ListFeatureFlagOverrides;
use App\Filament\Resources\FeatureFlags\Pages\EditFeatureFlag;
use App\Models\FeatureFlag;
use App\Models\FeatureFlagOverride;
use App\Models\Role;
use App\Models\User;
use App\Services\FeatureFlagRegistrar;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Support\Facades\Gate;
use Laravel\Pennant\Feature;
use Livewire\Livewire;
use Tests\TestCase;
uses(TestCase::class, RefreshDatabase::class);
function actAsDeveloper(): User
{
$devRole = Role::firstOrCreate(['name' => 'developer'], ['display_name' => 'Developer']);
$developer = User::factory()->create();
$developer->addRole($devRole);
FeatureFlag::firstOrCreate(
['name' => 'FeatureFlagAdmin'],
['label' => 'Feature flag admin felület', 'enabled' => true, 'stages' => null, 'roles' => ['developer']],
);
app(FeatureFlagRegistrar::class)->registerAll();
return $developer;
}
test('a flag szerkesztő oldalán megjelenik az egyéni felülbírálások relation manager', function () {
$developer = actAsDeveloper();
$flag = FeatureFlag::create([
'name' => 'rm-test-flag',
'label' => 'RM teszt flag',
'enabled' => true,
]);
app(FeatureFlagRegistrar::class)->registerAll();
$targetUser = User::factory()->create();
FeatureFlagOverride::create([
'feature_flag_id' => $flag->id,
'user_id' => $targetUser->id,
'active' => true,
]);
$this->actingAs($developer);
Livewire::test(EditFeatureFlag::class, ['record' => $flag->getRouteKey()])
->assertSuccessful();
});
test('a globális felülbírálás lista renderel, és csak fejlesztők érik el', function () {
$developer = actAsDeveloper();
$adminRole = Role::firstOrCreate(['name' => 'admin'], ['display_name' => 'Admin']);
$admin = User::factory()->create();
$admin->addRole($adminRole);
expect(Gate::forUser($admin)->allows('viewAny', FeatureFlagOverride::class))->toBeFalse();
expect(Gate::forUser($developer)->allows('viewAny', FeatureFlagOverride::class))->toBeTrue();
$this->actingAs($admin);
$this->get(FeatureFlagOverrideResource::getUrl())->assertForbidden();
$this->actingAs($developer);
Livewire::test(ListFeatureFlagOverrides::class)->assertSuccessful();
});
test('az "örökölt"-re állítás (mass delete) is érvényteleníti a gyorsítótárazott Pennant-feloldást', function () {
actAsDeveloper();
$flag = FeatureFlag::create([
'name' => 'purge-test-flag',
'label' => 'Purge teszt flag',
'enabled' => false,
]);
app(FeatureFlagRegistrar::class)->registerAll();
$user = User::factory()->create();
FeatureFlagOverride::create([
'feature_flag_id' => $flag->id,
'user_id' => $user->id,
'active' => true,
]);
Feature::for($user)->forget('purge-test-flag');
expect(Feature::for($user)->active('purge-test-flag'))->toBeTrue();
// ugyanaz a mintázat, mint amit a FeatureFlagsTable "Egyéni felülbírálás"
// akciója az "örökölt" választásnál használ - model-instance delete()-en
// keresztül, hogy a FeatureFlagOverrideObserver kiváltódjon
FeatureFlagOverride::where('feature_flag_id', $flag->id)
->where('user_id', $user->id)
->first()
?->delete();
expect(Feature::for($user)->active('purge-test-flag'))->toBeFalse();
});