mirror of
https://github.com/coollabsio/coolify.git
synced 2026-10-29 10:04:36 +08:00
- Runtime logs: add a compact text view, move display options and log level filters into a View menu, move copy and download into an Export menu, and remove the extra top margin. - Replace spinner loading cards with skeletons on the logs, dynamic configurations, proxy, TLS certificates, Docker images, environment variables, preview deployments, rollback, subscription, cloud provider, and new resource pages.
190 lines
5.9 KiB
PHP
190 lines
5.9 KiB
PHP
<?php
|
|
|
|
use App\Livewire\Project\Shared\EnvironmentVariable\All;
|
|
use App\Models\Application;
|
|
use App\Models\Environment;
|
|
use App\Models\EnvironmentVariable;
|
|
use App\Models\InstanceSettings;
|
|
use App\Models\Project;
|
|
use App\Models\Team;
|
|
use App\Models\User;
|
|
use Illuminate\Foundation\Testing\RefreshDatabase;
|
|
use Livewire\Livewire;
|
|
|
|
uses(RefreshDatabase::class);
|
|
|
|
beforeEach(function () {
|
|
InstanceSettings::forceCreate(['id' => 0]);
|
|
|
|
$this->user = User::factory()->create();
|
|
$this->team = Team::factory()->create();
|
|
$this->team->members()->attach($this->user, ['role' => 'owner']);
|
|
$this->project = Project::factory()->create([
|
|
'team_id' => $this->team->id,
|
|
]);
|
|
$this->environment = Environment::factory()->create([
|
|
'project_id' => $this->project->id,
|
|
]);
|
|
|
|
$this->actingAs($this->user);
|
|
});
|
|
|
|
it('does not load environment variables during mount', function () {
|
|
$application = Application::factory()->create([
|
|
'environment_id' => $this->environment->id,
|
|
]);
|
|
|
|
EnvironmentVariable::create([
|
|
'key' => 'API_KEY',
|
|
'value' => 'secret',
|
|
'resourceable_type' => Application::class,
|
|
'resourceable_id' => $application->id,
|
|
]);
|
|
|
|
$component = Livewire::test(All::class, ['resource' => $application]);
|
|
|
|
expect($component->get('readyToLoad'))->toBeFalse()
|
|
->and($component->instance()->environmentVariables)->toHaveCount(0)
|
|
->and($component->get('variables'))->toBeNull();
|
|
});
|
|
|
|
it('loads environment variables when loadEnvironmentVariables is called', function () {
|
|
$application = Application::factory()->create([
|
|
'environment_id' => $this->environment->id,
|
|
]);
|
|
|
|
EnvironmentVariable::create([
|
|
'key' => 'API_KEY',
|
|
'value' => 'secret',
|
|
'resourceable_type' => Application::class,
|
|
'resourceable_id' => $application->id,
|
|
]);
|
|
|
|
EnvironmentVariable::create([
|
|
'key' => 'DATABASE_URL',
|
|
'value' => 'postgres://example',
|
|
'resourceable_type' => Application::class,
|
|
'resourceable_id' => $application->id,
|
|
]);
|
|
|
|
$component = Livewire::test(All::class, ['resource' => $application])
|
|
->assertSee('Loading environment variables')
|
|
->call('loadEnvironmentVariables')
|
|
->assertSet('readyToLoad', true)
|
|
->assertDontSeeText('Loading environment variables')
|
|
->assertSee('API_KEY');
|
|
|
|
expect($component->instance()->environmentVariables->pluck('key')->all())
|
|
->toContain('API_KEY')
|
|
->toContain('DATABASE_URL');
|
|
});
|
|
|
|
it('builds developer view text only after switching to developer view', function () {
|
|
$application = Application::factory()->create([
|
|
'environment_id' => $this->environment->id,
|
|
]);
|
|
|
|
EnvironmentVariable::create([
|
|
'key' => 'API_KEY',
|
|
'value' => 'secret',
|
|
'resourceable_type' => Application::class,
|
|
'resourceable_id' => $application->id,
|
|
]);
|
|
|
|
$component = Livewire::test(All::class, ['resource' => $application])
|
|
->call('loadEnvironmentVariables');
|
|
|
|
expect($component->get('variables'))->toBeNull();
|
|
|
|
$component->call('switch')->assertSet('view', 'dev');
|
|
|
|
expect($component->get('variables'))->toContain('API_KEY=secret');
|
|
});
|
|
|
|
it('is idempotent when loadEnvironmentVariables is called twice', function () {
|
|
$application = Application::factory()->create([
|
|
'environment_id' => $this->environment->id,
|
|
]);
|
|
|
|
EnvironmentVariable::create([
|
|
'key' => 'API_KEY',
|
|
'value' => 'secret',
|
|
'resourceable_type' => Application::class,
|
|
'resourceable_id' => $application->id,
|
|
]);
|
|
|
|
$component = Livewire::test(All::class, ['resource' => $application])
|
|
->call('loadEnvironmentVariables')
|
|
->call('loadEnvironmentVariables')
|
|
->assertSet('readyToLoad', true);
|
|
|
|
expect($component->instance()->environmentVariables->pluck('key')->all())
|
|
->toContain('API_KEY');
|
|
});
|
|
|
|
it('preserves generated compose variables during bulk replacement', function () {
|
|
$application = Application::factory()->create([
|
|
'environment_id' => $this->environment->id,
|
|
'build_pack' => 'dockercompose',
|
|
'docker_compose' => <<<'YAML'
|
|
services:
|
|
api:
|
|
image: nginx:alpine
|
|
environment:
|
|
SERVICE_URL_API: /api
|
|
YAML,
|
|
]);
|
|
|
|
foreach ([
|
|
'SERVICE_URL_API' => 'https://api.example.com/api',
|
|
'SERVICE_FQDN_API' => 'api.example.com/api',
|
|
'OLD_VARIABLE' => 'remove-me',
|
|
] as $key => $value) {
|
|
EnvironmentVariable::create([
|
|
'key' => $key,
|
|
'value' => $value,
|
|
'resourceable_type' => Application::class,
|
|
'resourceable_id' => $application->id,
|
|
]);
|
|
}
|
|
|
|
Livewire::test(All::class, ['resource' => $application])
|
|
->set('variables', 'NEW_VARIABLE=keep-me')
|
|
->call('submit')
|
|
->assertDispatched('success')
|
|
->assertNotDispatched('error');
|
|
|
|
expect($application->environment_variables()->pluck('value', 'key')->all())
|
|
->toBe([
|
|
'SERVICE_URL_API' => 'https://api.example.com/api',
|
|
'SERVICE_FQDN_API' => 'api.example.com/api',
|
|
'NEW_VARIABLE' => 'keep-me',
|
|
]);
|
|
});
|
|
|
|
it('hides generated compose variables from developer view', function () {
|
|
$application = Application::factory()->create([
|
|
'environment_id' => $this->environment->id,
|
|
'build_pack' => 'dockercompose',
|
|
]);
|
|
|
|
foreach ([
|
|
'SERVICE_URL_API' => 'https://api.example.com',
|
|
'SERVICE_FQDN_API' => 'api.example.com',
|
|
'API_URL' => '$SERVICE_URL_API',
|
|
] as $key => $value) {
|
|
EnvironmentVariable::create([
|
|
'key' => $key,
|
|
'value' => $value,
|
|
'resourceable_type' => Application::class,
|
|
'resourceable_id' => $application->id,
|
|
]);
|
|
}
|
|
|
|
$component = Livewire::test(All::class, ['resource' => $application])
|
|
->call('switch');
|
|
|
|
expect($component->get('variables'))
|
|
->toBe('API_URL=$SERVICE_URL_API');
|
|
});
|