Files
jabali-panel/tests/Feature/Migration/MigrationDnsSyncServiceTest.php
2026-01-24 19:36:46 +02:00

138 lines
4.0 KiB
PHP

<?php
declare(strict_types=1);
namespace Tests\Feature\Migration;
use App\Models\DnsRecord;
use App\Models\DnsSetting;
use App\Models\Domain;
use App\Models\User;
use App\Services\Agent\AgentClient;
use App\Services\Migration\MigrationDnsSyncService;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Mockery\Adapter\Phpunit\MockeryPHPUnitIntegration;
use Tests\TestCase;
class MigrationDnsSyncServiceTest extends TestCase
{
use MockeryPHPUnitIntegration;
use RefreshDatabase;
protected function setUp(): void
{
parent::setUp();
Domain::unsetEventDispatcher();
}
protected function tearDown(): void
{
Domain::setEventDispatcher(app('events'));
parent::tearDown();
}
public function test_sync_domains_creates_default_dns_records_and_syncs_zone(): void
{
DnsSetting::set('default_ipv6', '2001:db8::1');
DnsSetting::clearCache();
$user = User::factory()->create([
'username' => 'migrateduser',
]);
$domain = Domain::factory()->for($user)->create([
'domain' => 'example.com',
]);
$this->assertSame(0, DnsRecord::where('domain_id', $domain->id)->count());
$agent = $this->mock(AgentClient::class);
$agent->shouldReceive('send')
->once()
->withArgs(function (string $action, array $payload) use ($domain): bool {
$this->assertSame('dns.sync_zone', $action);
$this->assertSame($domain->domain, $payload['domain'] ?? null);
$this->assertNotEmpty($payload['records'] ?? []);
return true;
})
->andReturn(['success' => true]);
$service = new MigrationDnsSyncService($agent);
$service->syncDomainsForUser($user);
$this->assertDatabaseHas('dns_records', [
'domain_id' => $domain->id,
'name' => '@',
'type' => 'A',
]);
$this->assertDatabaseHas('dns_records', [
'domain_id' => $domain->id,
'name' => '@',
'type' => 'AAAA',
]);
$this->assertDatabaseHas('dns_records', [
'domain_id' => $domain->id,
'name' => '@',
'type' => 'MX',
]);
$this->assertDatabaseHas('dns_records', [
'domain_id' => $domain->id,
'name' => '_dmarc',
'type' => 'TXT',
]);
}
public function test_sync_domains_uses_existing_dns_records(): void
{
$user = User::factory()->create([
'username' => 'customdns',
]);
$domain = Domain::factory()->for($user)->create([
'domain' => 'custom.test',
]);
DnsRecord::create([
'domain_id' => $domain->id,
'name' => 'app',
'type' => 'A',
'content' => '203.0.113.10',
'ttl' => 3600,
'priority' => null,
]);
$agent = $this->mock(AgentClient::class);
$agent->shouldReceive('send')
->once()
->withArgs(function (string $action, array $payload): bool {
$this->assertSame('dns.sync_zone', $action);
$records = collect($payload['records'] ?? []);
$this->assertTrue($records->contains(fn (array $record): bool => $record['name'] === 'app'));
$this->assertTrue($records->contains(fn (array $record): bool => $record['name'] === '@' && $record['type'] === 'A'));
return true;
})
->andReturn(['success' => true]);
$service = new MigrationDnsSyncService($agent);
$service->syncDomainsForUser($user);
$this->assertDatabaseHas('dns_records', [
'domain_id' => $domain->id,
'name' => 'app',
'type' => 'A',
]);
$this->assertDatabaseHas('dns_records', [
'domain_id' => $domain->id,
'name' => '@',
'type' => 'A',
]);
}
}