2026-04-14 08:20:55 +00:00
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
namespace Blax\Files\Tests\Unit;
|
|
|
|
|
|
|
|
|
|
use Blax\Files\Models\File;
|
|
|
|
|
use Blax\Files\Services\WarehouseService;
|
2026-06-07 09:37:48 +00:00
|
|
|
use Blax\Files\Tests\TestCase;
|
2026-04-14 08:20:55 +00:00
|
|
|
use Illuminate\Support\Facades\Storage;
|
|
|
|
|
|
|
|
|
|
class WarehouseServiceTest extends TestCase
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
// ─── searchFile — UUID lookup ──────────────────────────────────
|
|
|
|
|
|
|
|
|
|
public function test_search_finds_file_by_uuid()
|
|
|
|
|
{
|
|
|
|
|
$file = File::create(['name' => 'found']);
|
|
|
|
|
$file->putContents('content');
|
|
|
|
|
|
|
|
|
|
$request = new \Illuminate\Http\Request;
|
|
|
|
|
$result = WarehouseService::searchFile($request, $file->id);
|
|
|
|
|
|
|
|
|
|
$this->assertNotNull($result);
|
|
|
|
|
$this->assertEquals($file->id, $result->id);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ─── searchFile — encrypted ID ─────────────────────────────────
|
|
|
|
|
|
|
|
|
|
public function test_search_finds_file_by_encrypted_id()
|
|
|
|
|
{
|
|
|
|
|
$file = File::create(['name' => 'encrypted']);
|
|
|
|
|
$file->putContents('content');
|
|
|
|
|
|
|
|
|
|
$encrypted = encrypt($file->id);
|
|
|
|
|
|
|
|
|
|
$request = new \Illuminate\Http\Request;
|
|
|
|
|
$result = WarehouseService::searchFile($request, $encrypted);
|
|
|
|
|
|
|
|
|
|
$this->assertNotNull($result);
|
|
|
|
|
$this->assertEquals($file->id, $result->id);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ─── searchFile — null / empty ─────────────────────────────────
|
|
|
|
|
|
|
|
|
|
public function test_search_returns_null_for_null_identifier()
|
|
|
|
|
{
|
|
|
|
|
$request = new \Illuminate\Http\Request;
|
|
|
|
|
$result = WarehouseService::searchFile($request, null);
|
|
|
|
|
|
|
|
|
|
$this->assertNull($result);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function test_search_returns_null_for_nonexistent_id()
|
|
|
|
|
{
|
|
|
|
|
$request = new \Illuminate\Http\Request;
|
|
|
|
|
$result = WarehouseService::searchFile($request, 'nonexistent-uuid-here');
|
|
|
|
|
|
|
|
|
|
$this->assertNull($result);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ─── searchFile — query string stripping ──────────────────────
|
|
|
|
|
|
|
|
|
|
public function test_search_strips_query_string_from_identifier()
|
|
|
|
|
{
|
|
|
|
|
$file = File::create(['name' => 'qs']);
|
|
|
|
|
$file->putContents('content');
|
|
|
|
|
|
|
|
|
|
$request = new \Illuminate\Http\Request;
|
|
|
|
|
$result = WarehouseService::searchFile($request, $file->id . '?size=100x100');
|
|
|
|
|
|
|
|
|
|
$this->assertNotNull($result);
|
|
|
|
|
$this->assertEquals($file->id, $result->id);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ─── searchFile — asset path ──────────────────────────────────
|
|
|
|
|
|
|
|
|
|
public function test_search_finds_asset_by_exact_path()
|
|
|
|
|
{
|
|
|
|
|
Storage::disk('local')->put('images/logo.png', 'png-data');
|
|
|
|
|
|
|
|
|
|
$request = new \Illuminate\Http\Request;
|
|
|
|
|
$result = WarehouseService::searchFile($request, 'images/logo.png');
|
|
|
|
|
|
|
|
|
|
$this->assertNotNull($result);
|
|
|
|
|
$this->assertEquals('logo.png', $result->name);
|
|
|
|
|
$this->assertEquals('png', $result->extension);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function test_search_finds_asset_with_auto_extension()
|
|
|
|
|
{
|
|
|
|
|
Storage::disk('local')->put('icons/arrow.svg', '<svg/>');
|
|
|
|
|
|
|
|
|
|
$request = new \Illuminate\Http\Request;
|
|
|
|
|
$result = WarehouseService::searchFile($request, 'icons/arrow');
|
|
|
|
|
|
|
|
|
|
$this->assertNotNull($result);
|
|
|
|
|
$this->assertEquals('svg', $result->extension);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function test_search_prefers_svg_over_png_when_both_exist()
|
|
|
|
|
{
|
|
|
|
|
Storage::disk('local')->put('icons/logo.svg', '<svg/>');
|
|
|
|
|
Storage::disk('local')->put('icons/logo.png', 'png-data');
|
|
|
|
|
|
|
|
|
|
$request = new \Illuminate\Http\Request;
|
|
|
|
|
$result = WarehouseService::searchFile($request, 'icons/logo');
|
|
|
|
|
|
|
|
|
|
$this->assertNotNull($result);
|
|
|
|
|
// svg comes first in preferred_extensions
|
|
|
|
|
$this->assertEquals('svg', $result->extension);
|
|
|
|
|
}
|
|
|
|
|
|
2026-06-07 09:37:48 +00:00
|
|
|
public function test_search_returns_null_when_asset_genuinely_missing()
|
|
|
|
|
{
|
|
|
|
|
// Exercises the clearstatcache-and-retry branch in searchAssetPath:
|
|
|
|
|
// both resolution attempts miss, so the method must cleanly return null
|
|
|
|
|
// (no loop, no error) and let searchFile fall through to storage lookup.
|
|
|
|
|
$request = new \Illuminate\Http\Request;
|
|
|
|
|
$result = WarehouseService::searchFile($request, 'images/does-not-exist');
|
|
|
|
|
|
|
|
|
|
$this->assertNull($result);
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-14 08:20:55 +00:00
|
|
|
// ─── searchFile — storage path ─────────────────────────────────
|
|
|
|
|
|
|
|
|
|
public function test_search_finds_by_storage_path()
|
|
|
|
|
{
|
|
|
|
|
Storage::disk('local')->put('audio/clip.mp3', 'audio-data');
|
|
|
|
|
|
|
|
|
|
$request = new \Illuminate\Http\Request;
|
|
|
|
|
$result = WarehouseService::searchFile($request, 'storage/audio/clip.mp3');
|
|
|
|
|
|
|
|
|
|
$this->assertNotNull($result);
|
|
|
|
|
$this->assertEquals('clip.mp3', $result->name);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ─── url() ─────────────────────────────────────────────────────
|
|
|
|
|
|
|
|
|
|
public function test_url_generates_warehouse_path()
|
|
|
|
|
{
|
|
|
|
|
$file = File::create(['name' => 'test']);
|
|
|
|
|
|
|
|
|
|
$url = WarehouseService::url($file);
|
|
|
|
|
|
|
|
|
|
$this->assertStringContainsString('warehouse/' . $file->id, $url);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function test_url_accepts_string_id()
|
|
|
|
|
{
|
|
|
|
|
$url = WarehouseService::url('some-uuid');
|
|
|
|
|
|
|
|
|
|
$this->assertStringContainsString('warehouse/some-uuid', $url);
|
|
|
|
|
}
|
|
|
|
|
}
|