109 lines
3.9 KiB
PHP
109 lines
3.9 KiB
PHP
<?php
|
|
|
|
use App\Livewire\Admin\ConfirmDeleteDatacenter;
|
|
use App\Livewire\Admin\Datacenters;
|
|
use App\Livewire\Admin\HostCreate;
|
|
use App\Models\Datacenter;
|
|
use App\Models\Host;
|
|
use App\Models\User;
|
|
use Livewire\Livewire;
|
|
|
|
// admin() helper is defined in HostManagementTest (global Pest function).
|
|
|
|
it('gates the datacenters page', function () {
|
|
$this->get(route('admin.datacenters'))->assertRedirect('/login');
|
|
$this->actingAs(User::factory()->create(['is_admin' => false]))->get(route('admin.datacenters'))->assertForbidden();
|
|
$this->actingAs(admin())->get(route('admin.datacenters'))->assertOk()->assertSee(__('datacenters.title'));
|
|
});
|
|
|
|
it('creates a datacenter', function () {
|
|
Livewire::actingAs(admin())
|
|
->test(Datacenters::class)
|
|
->set('code', 'NBG')
|
|
->set('name', 'Nürnberg')
|
|
->set('location', 'DE')
|
|
->call('save')
|
|
->assertHasNoErrors();
|
|
|
|
expect(Datacenter::query()->where('code', 'nbg')->where('name', 'Nürnberg')->exists())->toBeTrue();
|
|
});
|
|
|
|
it('rejects a duplicate datacenter code', function () {
|
|
Datacenter::query()->firstOrCreate(['code' => 'fsn'], ['name' => 'Falkenstein']);
|
|
|
|
Livewire::actingAs(admin())
|
|
->test(Datacenters::class)
|
|
->set('code', 'fsn')->set('name', 'Falkenstein')
|
|
->call('save')
|
|
->assertHasErrors(['code']);
|
|
});
|
|
|
|
it('edits a datacenter name and location', function () {
|
|
$dc = Datacenter::factory()->create(['code' => 'nbg', 'name' => 'Old', 'location' => 'XX']);
|
|
|
|
Livewire::actingAs(admin())
|
|
->test(Datacenters::class)
|
|
->call('edit', $dc->uuid)
|
|
->set('editName', 'Nürnberg')
|
|
->set('editLocation', 'DE')
|
|
->call('update')
|
|
->assertHasNoErrors();
|
|
|
|
$dc->refresh();
|
|
expect($dc->name)->toBe('Nürnberg')->and($dc->location)->toBe('DE')->and($dc->code)->toBe('nbg');
|
|
});
|
|
|
|
it('deletes an unused datacenter', function () {
|
|
$dc = Datacenter::factory()->create(['code' => 'nbg']);
|
|
|
|
Livewire::actingAs(admin())->test(ConfirmDeleteDatacenter::class, ['uuid' => $dc->uuid])->call('delete');
|
|
|
|
expect(Datacenter::query()->where('uuid', $dc->uuid)->exists())->toBeFalse();
|
|
});
|
|
|
|
it('refuses to delete a datacenter that still has hosts', function () {
|
|
$dc = Datacenter::factory()->create(['code' => 'nbg']);
|
|
Host::factory()->create(['datacenter' => 'nbg']);
|
|
|
|
Livewire::actingAs(admin())->test(ConfirmDeleteDatacenter::class, ['uuid' => $dc->uuid])
|
|
->assertSet('hostCount', 1)
|
|
->call('delete');
|
|
|
|
expect(Datacenter::query()->where('uuid', $dc->uuid)->exists())->toBeTrue();
|
|
});
|
|
|
|
it('toggles a datacenter active flag', function () {
|
|
$dc = Datacenter::factory()->create(['active' => true]);
|
|
|
|
Livewire::actingAs(admin())->test(Datacenters::class)->call('toggle', $dc->uuid);
|
|
|
|
expect($dc->fresh()->active)->toBeFalse();
|
|
});
|
|
|
|
it('offers only known datacenter codes when adding a host', function () {
|
|
Datacenter::query()->firstOrCreate(['code' => 'fsn'], ['name' => 'Falkenstein']);
|
|
|
|
// unknown code rejected
|
|
Livewire::actingAs(admin())
|
|
->test(HostCreate::class)
|
|
->set('name', 'pve-x')->set('datacenter', 'ghost')->set('public_ip', '203.0.113.5')->set('root_password', 'supersecret')
|
|
->call('save')
|
|
->assertHasErrors(['datacenter']);
|
|
|
|
// known code accepted (defaults to the first active datacenter on mount)
|
|
Livewire::actingAs(admin())
|
|
->test(HostCreate::class)
|
|
->assertSet('datacenter', 'fsn');
|
|
});
|
|
|
|
it('rejects creating a host in an inactive datacenter', function () {
|
|
Datacenter::query()->firstOrCreate(['code' => 'fsn'], ['name' => 'Falkenstein']);
|
|
Datacenter::factory()->create(['code' => 'old', 'active' => false]);
|
|
|
|
Livewire::actingAs(admin())
|
|
->test(HostCreate::class)
|
|
->set('name', 'pve-old')->set('datacenter', 'old')->set('public_ip', '203.0.113.6')->set('root_password', 'supersecret')
|
|
->call('save')
|
|
->assertHasErrors(['datacenter']);
|
|
});
|