create(); $image = $pressRelease->images()->create([ 'disk' => 'public', 'path' => "press-releases/{$pressRelease->id}/images/cover.jpg", 'variants' => [ 'thumb' => "press-releases/{$pressRelease->id}/images/thumb.jpg", ], ]); $attachment = $pressRelease->attachments()->create([ 'disk' => 'public', 'path' => "press-releases/{$pressRelease->id}/attachments/factsheet.pdf", 'original_name' => 'factsheet.pdf', 'mime' => 'application/pdf', 'size' => 10, ]); foreach ([$image->path, $image->variants['thumb'], $attachment->path] as $path) { Storage::disk('public')->put($path, 'content'); } $this->artisan('press-releases:privatize-media') ->expectsOutput('1 Bilder und 1 Anhänge wurden auf den privaten Datenträger migriert.') ->assertSuccessful(); foreach ([$image->path, $image->variants['thumb'], $attachment->path] as $path) { Storage::disk('public')->assertMissing($path); Storage::disk('local')->assertExists($path); } expect($image->fresh()->disk)->toBe('local') ->and($attachment->fresh()->disk)->toBe('local'); }); test('a missing source file never flips its database record to the private disk', function () { Storage::fake('public'); Storage::fake('local'); $pressRelease = PressRelease::factory()->create(); $attachment = $pressRelease->attachments()->create([ 'disk' => 'public', 'path' => "press-releases/{$pressRelease->id}/attachments/missing.pdf", 'original_name' => 'missing.pdf', 'mime' => 'application/pdf', 'size' => 10, ]); expect(fn () => app(PressReleaseMediaPrivatizer::class)->privatizeAll()) ->toThrow(RuntimeException::class, 'missing on both disks'); expect($attachment->fresh()->disk)->toBe('public'); });