mirror of
https://github.com/coollabsio/coolify.git
synced 2026-11-04 10:42:23 +00:00
Remove tests that copy app logic into the test, grep PHP source as text, only check literals, constants, class_exists or PHP built-ins, duplicate other tests, or are always skipped. Keep source checks that guard security and authorization rules. Rename a duplicate Pest helper so the full suite loads, drop the missing v5/Browser path, and remove the CLAUDE.md symlink in favor of AGENTS.md. Correct AGENTS.md: Dusk is not installed and the upgrade script is scripts/upgrade.sh.
135 lines
4.6 KiB
PHP
135 lines
4.6 KiB
PHP
<?php
|
|
|
|
use App\Models\Application;
|
|
use App\Models\ApplicationPreview;
|
|
use App\Models\ServiceApplication;
|
|
use App\Models\ServiceDatabase;
|
|
use App\Models\StandaloneClickhouse;
|
|
use App\Models\StandaloneDragonfly;
|
|
use App\Models\StandaloneKeydb;
|
|
use App\Models\StandaloneMariadb;
|
|
use App\Models\StandaloneMongodb;
|
|
use App\Models\StandaloneMysql;
|
|
use App\Models\StandalonePostgresql;
|
|
use App\Models\StandaloneRedis;
|
|
use App\Models\StandaloneSqlite;
|
|
use App\Traits\HasRestartLimit;
|
|
use Illuminate\Database\Eloquent\Model;
|
|
use Illuminate\Database\Schema\Blueprint;
|
|
use Illuminate\Support\Facades\Blade;
|
|
use Illuminate\Support\Facades\Schema;
|
|
|
|
it('gives independently runnable application resources restart limit state', function (string $modelClass) {
|
|
expect(class_uses_recursive($modelClass))->toContain(HasRestartLimit::class);
|
|
|
|
$resource = new $modelClass;
|
|
|
|
expect($resource->getFillable())->toContain(
|
|
'restart_count',
|
|
'max_restart_count',
|
|
'restart_limit_reached',
|
|
'last_restart_at',
|
|
'last_restart_type',
|
|
)->and($resource->getCasts())->toMatchArray([
|
|
'restart_count' => 'integer',
|
|
'max_restart_count' => 'integer',
|
|
'restart_limit_reached' => 'boolean',
|
|
'last_restart_at' => 'datetime',
|
|
]);
|
|
})->with([
|
|
[ApplicationPreview::class],
|
|
[ServiceApplication::class],
|
|
]);
|
|
|
|
it('limits restarts only for applications', function () {
|
|
$databaseModels = [
|
|
ServiceDatabase::class,
|
|
StandalonePostgresql::class,
|
|
StandaloneRedis::class,
|
|
StandaloneMongodb::class,
|
|
StandaloneMysql::class,
|
|
StandaloneMariadb::class,
|
|
StandaloneKeydb::class,
|
|
StandaloneDragonfly::class,
|
|
StandaloneClickhouse::class,
|
|
StandaloneSqlite::class,
|
|
];
|
|
|
|
foreach ($databaseModels as $databaseModel) {
|
|
expect(class_uses_recursive($databaseModel))->not->toContain(HasRestartLimit::class);
|
|
}
|
|
|
|
foreach ([
|
|
'service_databases',
|
|
'standalone_postgresqls',
|
|
'standalone_redis',
|
|
'standalone_mongodbs',
|
|
'standalone_mysqls',
|
|
'standalone_mariadbs',
|
|
'standalone_keydbs',
|
|
'standalone_dragonflies',
|
|
'standalone_clickhouses',
|
|
'standalone_sqlites',
|
|
] as $databaseTable) {
|
|
expect(Schema::hasColumn($databaseTable, 'max_restart_count'))->toBeFalse()
|
|
->and(Schema::hasColumn($databaseTable, 'restart_limit_reached'))->toBeFalse();
|
|
}
|
|
});
|
|
|
|
it('makes restart limits opt in for new application resources', function () {
|
|
foreach ([Application::class, ApplicationPreview::class, ServiceApplication::class] as $modelClass) {
|
|
expect((new $modelClass)->max_restart_count)->toBe(0);
|
|
}
|
|
});
|
|
|
|
it('does not render restart limit warnings for service databases', function () {
|
|
$html = Blade::render(
|
|
'<x-application.restart-limit-warning :application="$database" />',
|
|
['database' => new ServiceDatabase],
|
|
);
|
|
|
|
expect(trim($html))->toBeEmpty();
|
|
});
|
|
|
|
it('atomically claims a resource restart limit once and can reset it', function () {
|
|
Schema::create('restart_limit_test_resources', function (Blueprint $table): void {
|
|
$table->id();
|
|
$table->string('status')->default('running');
|
|
$table->integer('restart_count')->default(0);
|
|
$table->integer('max_restart_count')->default(2);
|
|
$table->boolean('restart_limit_reached')->default(false);
|
|
$table->timestamp('last_restart_at')->nullable();
|
|
$table->string('last_restart_type')->nullable();
|
|
$table->timestamps();
|
|
});
|
|
|
|
$resource = new class extends Model
|
|
{
|
|
use HasRestartLimit;
|
|
|
|
protected $table = 'restart_limit_test_resources';
|
|
};
|
|
$resource->save();
|
|
$resource->refresh();
|
|
|
|
expect($resource->trackRestartCount(2))->toBeTrue()
|
|
->and($resource->fresh()->restart_limit_reached)->toBeTrue()
|
|
->and($resource->trackRestartCount(2))->toBeFalse();
|
|
|
|
$resource->resetRestartLimit();
|
|
|
|
expect($resource->fresh()->restart_count)->toBe(0)
|
|
->and($resource->restart_limit_reached)->toBeFalse();
|
|
|
|
$resourceWithExistingRestarts = $resource->newInstance();
|
|
$resourceWithExistingRestarts->max_restart_count = 0;
|
|
$resourceWithExistingRestarts->save();
|
|
expect($resourceWithExistingRestarts->trackRestartCount(17))->toBeFalse();
|
|
|
|
$resourceWithExistingRestarts->update(['max_restart_count' => 10]);
|
|
expect($resourceWithExistingRestarts->trackRestartCount(17))->toBeTrue()
|
|
->and($resourceWithExistingRestarts->fresh()->restart_limit_reached)->toBeTrue();
|
|
|
|
Schema::drop('restart_limit_test_resources');
|
|
});
|