Fix deleting a backup that is locked and failed; closes #3404
This commit is contained in:
parent
725fc82657
commit
d049839ffc
4 changed files with 141 additions and 11 deletions
123
tests/Integration/Services/Backups/DeleteBackupServiceTest.php
Normal file
123
tests/Integration/Services/Backups/DeleteBackupServiceTest.php
Normal file
|
@ -0,0 +1,123 @@
|
|||
<?php
|
||||
|
||||
namespace Pterodactyl\Tests\Integration\Services\Backups;
|
||||
|
||||
use Mockery;
|
||||
use GuzzleHttp\Psr7\Request;
|
||||
use GuzzleHttp\Psr7\Response;
|
||||
use Pterodactyl\Models\Backup;
|
||||
use GuzzleHttp\Exception\ClientException;
|
||||
use Pterodactyl\Extensions\Backups\BackupManager;
|
||||
use Pterodactyl\Services\Backups\DeleteBackupService;
|
||||
use Pterodactyl\Tests\Integration\IntegrationTestCase;
|
||||
use Pterodactyl\Repositories\Wings\DaemonBackupRepository;
|
||||
use Pterodactyl\Exceptions\Service\Backup\BackupLockedException;
|
||||
use Pterodactyl\Exceptions\Http\Connection\DaemonConnectionException;
|
||||
|
||||
class DeleteBackupServiceTest extends IntegrationTestCase
|
||||
{
|
||||
private $repository;
|
||||
|
||||
public function setUp(): void
|
||||
{
|
||||
parent::setUp();
|
||||
|
||||
$this->repository = Mockery::mock(DaemonBackupRepository::class);
|
||||
|
||||
$this->app->instance(DaemonBackupRepository::class, $this->repository);
|
||||
}
|
||||
|
||||
public function testLockedBackupCannotBeDeleted()
|
||||
{
|
||||
$server = $this->createServerModel();
|
||||
$backup = Backup::factory()->create([
|
||||
'server_id' => $server->id,
|
||||
'is_locked' => true,
|
||||
]);
|
||||
|
||||
$this->expectException(BackupLockedException::class);
|
||||
|
||||
$this->app->make(DeleteBackupService::class)->handle($backup);
|
||||
}
|
||||
|
||||
public function testFailedBackupThatIsLockedCanBeDeleted()
|
||||
{
|
||||
$server = $this->createServerModel();
|
||||
$backup = Backup::factory()->create([
|
||||
'server_id' => $server->id,
|
||||
'is_locked' => true,
|
||||
'is_successful' => false,
|
||||
]);
|
||||
|
||||
$this->repository->expects('setServer->delete')->with($backup)->andReturn(
|
||||
new Response()
|
||||
);
|
||||
|
||||
$this->app->make(DeleteBackupService::class)->handle($backup);
|
||||
|
||||
$backup->refresh();
|
||||
|
||||
$this->assertNotNull($backup->deleted_at);
|
||||
}
|
||||
|
||||
public function testExceptionThrownDueToMissingBackupIsIgnored()
|
||||
{
|
||||
$server = $this->createServerModel();
|
||||
$backup = Backup::factory()->create(['server_id' => $server->id]);
|
||||
|
||||
$this->repository->expects('setServer->delete')->with($backup)->andThrow(
|
||||
new DaemonConnectionException(
|
||||
new ClientException('', new Request('DELETE', '/'), new Response(404))
|
||||
)
|
||||
);
|
||||
|
||||
$this->app->make(DeleteBackupService::class)->handle($backup);
|
||||
|
||||
$backup->refresh();
|
||||
|
||||
$this->assertNotNull($backup->deleted_at);
|
||||
}
|
||||
|
||||
public function testExceptionIsThrownIfNot404()
|
||||
{
|
||||
$server = $this->createServerModel();
|
||||
$backup = Backup::factory()->create(['server_id' => $server->id]);
|
||||
|
||||
$this->repository->expects('setServer->delete')->with($backup)->andThrow(
|
||||
new DaemonConnectionException(
|
||||
new ClientException('', new Request('DELETE', '/'), new Response(500))
|
||||
)
|
||||
);
|
||||
|
||||
$this->expectException(DaemonConnectionException::class);
|
||||
|
||||
$this->app->make(DeleteBackupService::class)->handle($backup);
|
||||
|
||||
$backup->refresh();
|
||||
|
||||
$this->assertNull($backup->deleted_at);
|
||||
}
|
||||
|
||||
public function testS3ObjectCanBeDeleted()
|
||||
{
|
||||
$server = $this->createServerModel();
|
||||
$backup = Backup::factory()->create([
|
||||
'disk' => Backup::ADAPTER_AWS_S3,
|
||||
'server_id' => $server->id,
|
||||
]);
|
||||
|
||||
$manager = $this->mock(BackupManager::class);
|
||||
$manager->expects('getBucket')->andReturns('foobar');
|
||||
$manager->expects('adapter')->with(Backup::ADAPTER_AWS_S3)->andReturnSelf();
|
||||
$manager->expects('getClient->deleteObject')->with([
|
||||
'Bucket' => 'foobar',
|
||||
'Key' => sprintf('%s/%s.tar.gz', $server->uuid, $backup->uuid),
|
||||
]);
|
||||
|
||||
$this->app->make(DeleteBackupService::class)->handle($backup);
|
||||
|
||||
$backup->refresh();
|
||||
|
||||
$this->assertNotNull($backup->deleted_at);
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue