mirror of
https://github.com/coollabsio/coolify.git
synced 2026-08-24 10:05:47 -05:00
Add queued DNS checks with polling, status indicators, and notifications for application and service domains. Improve volume backup target labels and names.
120 lines
3.6 KiB
PHP
120 lines
3.6 KiB
PHP
<?php
|
|
|
|
use App\Actions\Shared\CheckDomainDns;
|
|
use App\Jobs\CheckDomainDnsJob;
|
|
use App\Models\Application;
|
|
use App\Models\Environment;
|
|
use App\Models\InstanceSettings;
|
|
use App\Models\Project;
|
|
use App\Models\Team;
|
|
use Illuminate\Foundation\Testing\RefreshDatabase;
|
|
|
|
uses(RefreshDatabase::class);
|
|
|
|
afterEach(fn () => CheckDomainDns::clearFake());
|
|
|
|
beforeEach(function () {
|
|
InstanceSettings::unguarded(fn () => InstanceSettings::create([
|
|
'id' => 0,
|
|
'is_dns_validation_enabled' => false,
|
|
]));
|
|
|
|
$team = Team::factory()->create();
|
|
$project = Project::factory()->create(['team_id' => $team->id]);
|
|
$environment = Environment::factory()->create(['project_id' => $project->id]);
|
|
|
|
$this->application = Application::factory()->create([
|
|
'environment_id' => $environment->id,
|
|
'destination_id' => 1,
|
|
'destination_type' => 'App\\Models\\StandaloneDocker',
|
|
'fqdn' => 'https://app.example.com',
|
|
'domain_dns_statuses' => [
|
|
'https://app.example.com' => [
|
|
'status' => 'checking',
|
|
'message' => 'Checking DNS...',
|
|
'expected_ip' => null,
|
|
'checked_at' => null,
|
|
'check_id' => 'test-check',
|
|
],
|
|
],
|
|
]);
|
|
});
|
|
|
|
it('persists a skipped result when dns validation is disabled', function () {
|
|
(new CheckDomainDnsJob(
|
|
$this->application,
|
|
'https://app.example.com',
|
|
'https://app.example.com',
|
|
null,
|
|
null,
|
|
'test-check',
|
|
))->handle();
|
|
|
|
$status = $this->application->fresh()->domain_dns_statuses['https://app.example.com'];
|
|
|
|
expect($status['status'])->toBe('skipped')
|
|
->and($status['message'])->toBe('DNS validation is disabled in instance settings.')
|
|
->and($status['checked_at'])->not->toBeNull();
|
|
});
|
|
|
|
it('does not restore a dns status removed before the job finishes', function () {
|
|
$this->application->update(['domain_dns_statuses' => null]);
|
|
|
|
(new CheckDomainDnsJob(
|
|
$this->application,
|
|
'https://app.example.com',
|
|
'https://app.example.com',
|
|
null,
|
|
null,
|
|
'test-check',
|
|
))->handle();
|
|
|
|
expect($this->application->fresh()->domain_dns_statuses)->toBeNull();
|
|
});
|
|
|
|
it('uses the shared dns action', function () {
|
|
CheckDomainDns::shouldRun()
|
|
->once()
|
|
->andReturn([
|
|
'https://app.example.com' => [
|
|
'status' => 'ok',
|
|
'message' => 'DNS looks correct.',
|
|
'expected_ip' => null,
|
|
'checked_at' => now()->toIso8601String(),
|
|
],
|
|
]);
|
|
|
|
(new CheckDomainDnsJob(
|
|
$this->application,
|
|
'https://app.example.com',
|
|
'https://app.example.com',
|
|
null,
|
|
null,
|
|
'test-check',
|
|
))->handle();
|
|
|
|
expect($this->application->fresh()->domain_dns_statuses['https://app.example.com']['status'])->toBe('ok');
|
|
});
|
|
|
|
it('does not let an older job overwrite a newer check for the same domain', function () {
|
|
$oldJob = new CheckDomainDnsJob(
|
|
$this->application,
|
|
'https://app.example.com',
|
|
'https://app.example.com',
|
|
null,
|
|
null,
|
|
'test-check',
|
|
);
|
|
|
|
$statuses = $this->application->domain_dns_statuses;
|
|
$statuses['https://app.example.com']['check_id'] = 'newer-check';
|
|
$this->application->update(['domain_dns_statuses' => $statuses]);
|
|
|
|
$oldJob->handle();
|
|
|
|
$status = $this->application->fresh()->domain_dns_statuses['https://app.example.com'];
|
|
|
|
expect($status['status'])->toBe('checking')
|
|
->and($status['check_id'])->toBe('newer-check');
|
|
});
|