application"/');
$portsExposesControls = str($generalView)
->after("@if (\$isStatic || \$buildPack === 'static')")
->before('toBe(3)
->and($portsExposesControls->substrCount('canGate="update" :canResource="$application"'))->toBe(3);
});
it('keeps mutable Livewire components behind authorization checks', function (string $path, array $requiredNeedles) {
$source = file_get_contents(base_path($path));
foreach ($requiredNeedles as $needle) {
expect($source)->toContain($needle);
}
})->with([
'storage resources' => [
'app/Livewire/Storage/Resources.php',
['AuthorizesRequests', "authorize('update'", "authorize('view'"],
],
'postgres init script editor' => [
'app/Livewire/Project/Database/InitScript.php',
['AuthorizesRequests', "authorize('update'"],
],
'execute container command' => [
'app/Livewire/Project/Shared/ExecuteContainerCommand.php',
['AuthorizesRequests', "authorize('view'", "authorize('canAccessTerminal'"],
],
'terminal' => [
'app/Livewire/Project/Shared/Terminal.php',
['AuthorizesRequests', "authorize('view'", "authorize('canAccessTerminal'"],
],
]);
it('authorizes every volume backup form control', function (string $path, array $controlPatterns) {
$source = file_get_contents(base_path($path));
foreach ($controlPatterns as $controlPattern) {
expect($source)->toMatch($controlPattern);
}
})->with([
'retention controls' => [
'resources/views/livewire/project/shared/storages/volume-backups/retention.blade.php',
[
'/]*type="submit")(?=[^>]*canGate="update")(?=[^>]*:canResource="\$backup")[^>]*>Save<\/x-forms\.button>/s',
'/]*id="retentionAmountLocally")(?=[^>]*canGate="update")(?=[^>]*:canResource="\$backup")[^>]*\/\>/s',
'/]*id="retentionDaysLocally")(?=[^>]*canGate="update")(?=[^>]*:canResource="\$backup")[^>]*\/\>/s',
'/]*id="retentionMaxStorageLocally")(?=[^>]*canGate="update")(?=[^>]*:canResource="\$backup")[^>]*\/\>/s',
'/]*id="retentionAmountS3")(?=[^>]*canGate="update")(?=[^>]*:canResource="\$backup")[^>]*\/\>/s',
'/]*id="retentionDaysS3")(?=[^>]*canGate="update")(?=[^>]*:canResource="\$backup")[^>]*\/\>/s',
'/]*id="retentionMaxStorageS3")(?=[^>]*canGate="update")(?=[^>]*:canResource="\$backup")[^>]*\/\>/s',
],
],
'S3 controls' => [
'resources/views/livewire/project/shared/storages/volume-backups/s3.blade.php',
[
'/]*type="submit")(?=[^>]*canGate="update")(?=[^>]*:canResource="\$backup")[^>]*>Save<\/x-forms\.button>/s',
'/]*wire:click="toggleS3")(?=[^>]*canGate="update")(?=[^>]*:canResource="\$backup")[^>]*>Enable S3<\/x-forms\.button>/s',
'/]*wire:click="toggleS3")(?=[^>]*canGate="update")(?=[^>]*:canResource="\$backup")[^>]*>Disable S3<\/x-forms\.button>/s',
'/]*id="s3StorageId")(?=[^>]*canGate="update")(?=[^>]*:canResource="\$backup")[^>]*>/s',
'/]*id="disableLocalBackup")(?=[^>]*instantSave)(?=[^>]*canGate="update")(?=[^>]*:canResource="\$backup")[^>]*\/\>/s',
'/]*id="disableLocalBackup")(?=[^>]*disabled)(?=[^>]*canGate="update")(?=[^>]*:canResource="\$backup")[^>]*\/\>/s',
],
],
'service domains controls' => [
'resources/views/livewire/project/service/domains.blade.php',
[
'/]*canGate="update")(?=[^>]*:canResource="\$service")(?=[^>]*id="newServiceApplicationId")[^>]*>/s',
'/]*canGate="update")(?=[^>]*:canResource="\$service")(?=[^>]*id="newDomain")[^>]*>/s',
'/]*canGate="update")(?=[^>]*:canResource="\$service")(?=[^>]*wire:click="generateDomain")[^>]*>/s',
'/]*canGate="update")(?=[^>]*:canResource="\$service")(?=[^>]*type="submit")[^>]*>/s',
'/wire:click="checkAllDns"/s',
],
],
'postgres public access control' => [
'resources/views/livewire/project/database/postgresql/general.blade.php',
[
'/user\(\)->can\(\'update\', \$database\)" canGate="update" :canResource="\$database" :options=/',
],
],
'redis public access control' => [
'resources/views/livewire/project/database/redis/general.blade.php',
['/ [
'resources/views/livewire/project/database/mongodb/general.blade.php',
['/ [
'resources/views/livewire/project/database/clickhouse/general.blade.php',
['/ [
'resources/views/livewire/project/database/mariadb/general.blade.php',
['/ [
'resources/views/livewire/project/database/dragonfly/general.blade.php',
['/ [
'resources/views/livewire/project/database/mysql/general.blade.php',
['/ [
'resources/views/livewire/project/database/keydb/general.blade.php',
['/