Files
fotospiel-app/tests/Unit/DataExportLifecycleTest.php
Codex Agent 75d862748b
Some checks failed
linter / quality (push) Has been cancelled
tests / ci (push) Has been cancelled
tests / ui (push) Has been cancelled
Add data export retry and cancel controls
2026-01-02 22:50:07 +01:00

134 lines
4.1 KiB
PHP

<?php
namespace Tests\Unit;
use App\Enums\DataExportScope;
use App\Jobs\GenerateDataExport;
use App\Models\DataExport;
use App\Models\User;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;
class DataExportLifecycleTest extends TestCase
{
use RefreshDatabase;
public function test_can_retry_only_for_failed_or_canceled_exports(): void
{
$user = User::factory()->create();
$failed = DataExport::query()->create([
'user_id' => $user->id,
'status' => DataExport::STATUS_FAILED,
'scope' => DataExportScope::TENANT->value,
]);
$canceled = DataExport::query()->create([
'user_id' => $user->id,
'status' => DataExport::STATUS_CANCELED,
'scope' => DataExportScope::TENANT->value,
]);
$pending = DataExport::query()->create([
'user_id' => $user->id,
'status' => DataExport::STATUS_PENDING,
'scope' => DataExportScope::TENANT->value,
]);
$this->assertTrue($failed->canRetry());
$this->assertTrue($canceled->canRetry());
$this->assertFalse($pending->canRetry());
}
public function test_can_cancel_only_for_pending_or_processing_exports(): void
{
$user = User::factory()->create();
$pending = DataExport::query()->create([
'user_id' => $user->id,
'status' => DataExport::STATUS_PENDING,
'scope' => DataExportScope::TENANT->value,
]);
$processing = DataExport::query()->create([
'user_id' => $user->id,
'status' => DataExport::STATUS_PROCESSING,
'scope' => DataExportScope::TENANT->value,
]);
$ready = DataExport::query()->create([
'user_id' => $user->id,
'status' => DataExport::STATUS_READY,
'scope' => DataExportScope::TENANT->value,
]);
$this->assertTrue($pending->canCancel());
$this->assertTrue($processing->canCancel());
$this->assertFalse($ready->canCancel());
}
public function test_reset_for_retry_clears_export_fields(): void
{
$user = User::factory()->create();
$export = DataExport::query()->create([
'user_id' => $user->id,
'status' => DataExport::STATUS_FAILED,
'scope' => DataExportScope::TENANT->value,
'error_message' => 'Boom',
'path' => 'exports/test.zip',
'size_bytes' => 123,
'expires_at' => now()->addDay(),
]);
$export->resetForRetry();
$export->refresh();
$this->assertSame(DataExport::STATUS_PENDING, $export->status);
$this->assertNull($export->error_message);
$this->assertNull($export->path);
$this->assertNull($export->size_bytes);
$this->assertNull($export->expires_at);
}
public function test_mark_canceled_sets_status_and_clears_export_fields(): void
{
$user = User::factory()->create();
$export = DataExport::query()->create([
'user_id' => $user->id,
'status' => DataExport::STATUS_PENDING,
'scope' => DataExportScope::TENANT->value,
'path' => 'exports/test.zip',
'size_bytes' => 321,
'expires_at' => now()->addDay(),
]);
$export->markCanceled('Manual cancel.');
$export->refresh();
$this->assertSame(DataExport::STATUS_CANCELED, $export->status);
$this->assertSame('Manual cancel.', $export->error_message);
$this->assertNull($export->path);
$this->assertNull($export->size_bytes);
$this->assertNull($export->expires_at);
}
public function test_generate_data_export_ignores_non_pending_exports(): void
{
$user = User::factory()->create();
$export = DataExport::query()->create([
'user_id' => $user->id,
'status' => DataExport::STATUS_CANCELED,
'scope' => DataExportScope::TENANT->value,
]);
(new GenerateDataExport($export->id))->handle();
$export->refresh();
$this->assertSame(DataExport::STATUS_CANCELED, $export->status);
}
}