Files
Gnuboard7/tests/Unit/Support/PublicAssetDiskTest.php
T
HeuJung 5c2e42c133 fix(core): 레이아웃 첨부 URL 이 항상 프록시로 발급되던 결함 수정
공개 자산 스토리지를 설정해도 레이아웃 배경 이미지가 매번 오리진 PHP 를
거쳐 서빙되던 결함을 고친다 (https://github.com/gnuboard/g7/issues/134).
판정 기준은 운영자가 명시 선언한 core.storage.public_asset_disk 와 행 disk
의 일치다 — 디스크의 url 설정 유무로 판정하면 비공개 버킷에 공개 URL 이
설정된 구성에서 발급된 주소가 403 이 되어 그 이미지가 전부 깨진다.

전수조사에서 함께 처리한 것: 게시판 첨부 응답 url 칸(항상 null → 게이트가
살아 있는 서빙 URL), 페이지의 미배선 메서드 삭제, 확장 카테고리별 저장소
URL·경로 조회 교정, 그리고 이번 변경이 새로 만드는 고아 disk 위험 방어
(무인증 공개 서빙 라우트가 500 이 되는 것을 404 로 degrade).

문서화 하네스도 함께 보강한다. 실측을 수행하고도 이력 문서에는 판정만 남기면
대화 로그가 사라진 뒤 아무에게도 도달하지 않는데, 그 강제가 보고 형식에만
있었다.
2026-09-08 12:54:29 +09:00

130 lines
4.2 KiB
PHP

<?php
namespace Tests\Unit\Support;
use App\Support\PublicAssetDisk;
use Illuminate\Support\Facades\Config;
use Tests\TestCase;
/**
* 공개 자산 디스크 해석기 단위 테스트 (공개 #134)
*
* `AbstractModule`/`AbstractPlugin` 에 사본으로 있던 판정식을 코어 공통 장소로
* 추출한 것이므로, 판정 규칙(미설정/'none'/고아 디스크/override 우선순위)이
* 한 글자도 바뀌지 않았음을 고정한다.
*/
class PublicAssetDiskTest extends TestCase
{
/**
* 미설정('')이면 null 이어야 합니다 (호출측이 기존 디스크로 폴백).
*
* @scenario public_asset_disk=unset
*
* @effects proxy_url_otherwise
*/
public function test_unset_resolves_to_null(): void
{
Config::set('core.storage.public_asset_disk', '');
$this->assertNull(PublicAssetDisk::resolve());
}
/**
* 'none' 은 명시적 스트리밍 유지 선언이므로 null 이어야 합니다.
*/
public function test_none_resolves_to_null(): void
{
Config::set('core.storage.public_asset_disk', 'none');
$this->assertNull(PublicAssetDisk::resolve());
}
/**
* config 에 존재하지 않는 디스크(고아 플러그인 디스크)는 null 이어야 합니다.
*
* @scenario public_asset_disk=ghost_disk
*
* @effects proxy_url_otherwise
*/
public function test_orphan_disk_resolves_to_null(): void
{
Config::set('core.storage.public_asset_disk', 'vanished_plugin_disk');
$this->assertNull(PublicAssetDisk::resolve());
}
/**
* config 에 존재하는 디스크는 그대로 돌려주어야 합니다.
*/
public function test_existing_disk_resolves_to_itself(): void
{
Config::set('core.storage.public_asset_disk', 'public');
$this->assertSame('public', PublicAssetDisk::resolve());
}
/**
* override 가 비어 있지 않으면 코어 전역 설정보다 우선해야 합니다.
*/
public function test_override_takes_precedence_over_global(): void
{
Config::set('core.storage.public_asset_disk', 'public');
$this->assertSame('local', PublicAssetDisk::resolve('local'));
}
/**
* override 가 ''/null 이면 코어 전역 설정을 사용해야 합니다.
*/
public function test_blank_override_falls_back_to_global(): void
{
Config::set('core.storage.public_asset_disk', 'public');
$this->assertSame('public', PublicAssetDisk::resolve(''));
$this->assertSame('public', PublicAssetDisk::resolve(null));
}
/**
* override 로 'none' 을 주면 전역 설정이 있어도 스트리밍을 강제해야 합니다.
*/
public function test_none_override_forces_streaming_over_global(): void
{
Config::set('core.storage.public_asset_disk', 'public');
$this->assertNull(PublicAssetDisk::resolve('none'));
}
/**
* isCurrent() 는 resolve() 를 경유하므로 ''/'none'/고아 디스크가
* 등가 비교로 통과하지 않아야 합니다.
*/
public function test_is_current_never_matches_blank_none_or_orphan(): void
{
Config::set('core.storage.public_asset_disk', '');
$this->assertFalse(PublicAssetDisk::isCurrent(''));
Config::set('core.storage.public_asset_disk', 'none');
$this->assertFalse(PublicAssetDisk::isCurrent('none'));
Config::set('core.storage.public_asset_disk', 'vanished_plugin_disk');
$this->assertFalse(PublicAssetDisk::isCurrent('vanished_plugin_disk'));
Config::set('core.storage.public_asset_disk', 'public');
$this->assertTrue(PublicAssetDisk::isCurrent('public'));
$this->assertFalse(PublicAssetDisk::isCurrent('attachments'));
$this->assertFalse(PublicAssetDisk::isCurrent(null));
}
/**
* memoize 금지 — 런타임 Config::set 변경이 즉시 반영되어야 합니다.
*/
public function test_resolution_is_not_memoized(): void
{
Config::set('core.storage.public_asset_disk', 'public');
$this->assertSame('public', PublicAssetDisk::resolve());
Config::set('core.storage.public_asset_disk', '');
$this->assertNull(PublicAssetDisk::resolve());
}
}