d2d.emegrendeles.hu/tests/Feature/Deployment/DeploymentPackageAccessTest.php
E98Developer 98cf955354 FIX DeploymentPackageTest felbontása hat fájlra a párhuzamos futtatáshoz
A paratest FÁJLONKÉNT osztja szét a munkát, ezért egyetlen 28 tesztes fájlból
nem tudott párhuzamosítani: egy processz vitte a teljes 137 mp-et, a másik öt
üresjáratban állt. A --parallel emiatt korábban egyenesen lassabb volt
(136 -> 143 mp), a teljes suite-on pedig csak 11%-ot hozott.

A felosztás témák szerint történt, de mért időkre kalibrálva, hogy egyik fájl
se domináljon (a leghosszabb a Builder, ~35 mp):

  AccessTest    6 teszt  ~7 mp   jogosultság, feature flag, 403
  GitTest       5 teszt ~18 mp   GitRepository, ChangeSetAnalyzer
  BuilderTest   9 teszt ~35 mp   csomagépítés, _TEENDOK, _torles.sh, verzió
  PageTest      4 teszt ~21 mp   commitlista, keresés, kiválasztás
  CreationTest  2 teszt ~32 mp   felületről indított csomagolás, kirakottnak jelölés
  DownloadTest  2 teszt ~25 mp   naplóbejegyzés, ZIP letöltés, útvonal-ellenőrzés

A két legdrágább teszt (21,7 és 20,4 mp) szándékosan külön fájlba került,
együtt hagyva ők adnák a padlót.

A közös segédfüggvények a DeploymentTestHelpers.php-ba kerültek. Ez nem
*Test.php, ezért a phpunit nem szedi fel teszt-fájlként. A minta-repót takarító
afterAll() helyére register_shutdown_function lépett: az afterAll fájlonként
futna le, és a következő fájl alól húzná ki a mintát.

Mért eredmény (6 mag): ezek a tesztek sorosan 137,00 mp, párhuzamosan
67,88 mp. Teljes suite párhuzamosan 149,78 -> 77,52 mp.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-17 10:48:31 +02:00

93 lines
3.1 KiB
PHP

<?php
use App\Filament\Pages\DeploymentPackage;
use App\Models\FeatureFlag;
use App\Models\Role;
use App\Models\User;
use App\Services\Deployment\DeploymentGuard;
use App\Services\FeatureFlagRegistrar;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Support\Facades\Config;
use Illuminate\Support\Facades\Http;
use Tests\TestCase;
require_once __DIR__.'/DeploymentTestHelpers.php';
uses(TestCase::class, RefreshDatabase::class);
// Az oldal betöltéskor lekérdezi a környezetek deploy-version.json-ját - a tesztek
// nem indíthatnak valódi kimenő kérést.
beforeEach(function () {
Http::fake();
});
test('a kikapcsolt env kapcsoló mindenkitől elveszi a hozzáférést', function () {
deploymentAllowEnvironment();
Config::set('deployment.enabled', false);
$developer = deploymentDeveloper();
expect(app(DeploymentGuard::class)->isAllowed($developer))->toBeFalse()
->and(app(DeploymentGuard::class)->denialReason($developer))->toContain('DEPLOYMENT_PACKAGE_ENABLED');
});
test('a nem fejlesztői stage-en akkor sem érhető el, ha a kapcsoló be van kapcsolva', function () {
deploymentAllowEnvironment();
Config::set('app.stage', 'PROD');
$developer = deploymentDeveloper();
expect(app(DeploymentGuard::class)->isAllowed($developer))->toBeFalse()
->and(app(DeploymentGuard::class)->denialReason($developer))->toContain('fejlesztői környezetben');
});
test('a developer szerep nélküli felhasználó nem éri el', function () {
deploymentAllowEnvironment();
Role::create(['name' => 'admin', 'display_name' => 'Admin']);
$admin = User::factory()->create();
$admin->addRole(Role::where('name', 'admin')->first());
FeatureFlag::create([
'name' => 'DeploymentPackage',
'label' => 'Deployment csomagoló',
'enabled' => true,
'stages' => null,
'roles' => null,
]);
app(FeatureFlagRegistrar::class)->registerAll();
expect(app(DeploymentGuard::class)->isAllowed($admin))->toBeFalse();
});
test('a kikapcsolt feature flag elrejti a felületet a fejlesztő elől is', function () {
deploymentAllowEnvironment();
$developer = deploymentDeveloper(flagEnabled: false);
expect(app(DeploymentGuard::class)->isAllowed($developer))->toBeFalse()
->and(DeploymentPackage::canAccess())->toBeFalse();
});
test('minden feltétel teljesülése esetén engedélyezett', function () {
deploymentAllowEnvironment();
$developer = deploymentDeveloper();
expect(app(DeploymentGuard::class)->isAllowed($developer))->toBeTrue()
->and(app(DeploymentGuard::class)->denialReason($developer))->toBeNull();
});
test('a jogosulatlan felhasználó 403-at kap az oldal betöltésekor', function () {
deploymentAllowEnvironment();
$developer = deploymentDeveloper(flagEnabled: false);
// Szándékosan valódi HTTP kérés: a Livewire::test() a HttpException-t válasszá
// alakítja (RequestBroker: withoutExceptionHandling([HttpException::class])), így
// ott nem a tényleges belépési pontot mérnénk.
$this->actingAs($developer)
->get(DeploymentPackage::getUrl())
->assertForbidden();
});