앞선 커밋이 CHANGELOG 에 주장한 "로딩 표시가 나오지 않던 문제 수정" 이 실제로 화면에 나타나는지 브라우저로 확정했다. 전달 경로부터 DOM 마운트·해제까지 측정했고, 지연·에러 응답에서도 영구 로딩이 남지 않음을 확인했다. 측정 과정에서 앞선 세션의 판단 하나가 틀렸음을 확인했다 — "오버레이 DOM 이 어느 화면에서도 관측되지 않는다" 는 관측 대상 노드를 잘못 잡은 것이었다. 스피너 방식 레이아웃은 다른 노드를 쓰며, 대조군에서도 안 보였던 이유가 이것이다. 미뤄 두었던 과제 4건을 함께 구현했다. - 인증창을 그냥 닫고 이탈하면 그 인증 요청을 서버에도 종료로 표시한다. 이전에는 브라우저만 알고 있어 인증 이력에 "보낸 뒤 소식 없는" 항목이 남았다 - 플러그인 설정 화면이 저장된 비밀값을 다시 내려받던 것을 가려서 표시한다. 그 항목을 건드리지 않고 저장하면 저장된 값이 그대로 유지된다 - 언어팩 반영 누락 검사가 버전만 비교해 "버전 같고 내용 다름" 을 놓치던 사각을 콘텐츠 비교로 닫았다 - 확장이 검증 규칙을 추가할 때 쓰는 필터 이름 6개를 표준 형태로 통일했다. 예전 이름도 함께 발행하므로 기존 확장은 수정 없이 동작한다 정적 검사 룰 2종의 오탐·사각을 함께 고쳤고, 개명으로 검사 대상에 편입된 파일의 사전 결함 8건을 해소했다. 검수용 데이터는 전량 정리했다.
89 lines
3.0 KiB
PHP
89 lines
3.0 KiB
PHP
<?php
|
|
|
|
namespace Tests\Unit\Extension;
|
|
|
|
use App\Extension\HookManager;
|
|
use Tests\TestCase;
|
|
|
|
/**
|
|
* 표준 이름으로 옮긴 훅의 하위호환 발행 검증.
|
|
*
|
|
* 이름이 표준(`core.{대상}.{동작}_validation_rules`)과 어긋난 채 공개된 훅을 표준 이름으로 옮길 때,
|
|
* 구 이름을 구독 중인 제3자 확장이 조용히 멈추면 안 된다. 두 이름이 함께 발행되고 값이 순서대로
|
|
* 이어지는지, 구독이 없는 이름은 무해하게 지나가는지 고정한다.
|
|
*
|
|
* @since 7.0.6
|
|
*/
|
|
class HookManagerLegacyNameTest extends TestCase
|
|
{
|
|
private const STANDARD = 'core.probe.action_validation_rules';
|
|
|
|
private const LEGACY = 'core.probe.action_rules';
|
|
|
|
protected function tearDown(): void
|
|
{
|
|
HookManager::clearFilter(self::STANDARD);
|
|
HookManager::clearFilter(self::LEGACY);
|
|
|
|
parent::tearDown();
|
|
}
|
|
|
|
public function test_standard_name_subscriber_receives_value(): void
|
|
{
|
|
HookManager::addFilter(self::STANDARD, fn (array $rules) => $rules + ['standard' => true]);
|
|
|
|
$result = HookManager::applyFiltersWithLegacyName(self::STANDARD, self::LEGACY, ['base' => true]);
|
|
|
|
$this->assertSame(['base' => true, 'standard' => true], $result);
|
|
}
|
|
|
|
public function test_legacy_name_subscriber_still_receives_value(): void
|
|
{
|
|
HookManager::addFilter(self::LEGACY, fn (array $rules) => $rules + ['legacy' => true]);
|
|
|
|
$result = HookManager::applyFiltersWithLegacyName(self::STANDARD, self::LEGACY, ['base' => true]);
|
|
|
|
$this->assertSame(
|
|
['base' => true, 'legacy' => true],
|
|
$result,
|
|
'구 이름을 구독 중인 확장이 개명으로 조용히 멈춰서는 안 된다',
|
|
);
|
|
}
|
|
|
|
public function test_both_names_apply_in_order(): void
|
|
{
|
|
HookManager::addFilter(self::STANDARD, fn (array $r) => [...$r, 'standard']);
|
|
HookManager::addFilter(self::LEGACY, fn (array $r) => [...$r, 'legacy']);
|
|
|
|
$result = HookManager::applyFiltersWithLegacyName(self::STANDARD, self::LEGACY, ['base']);
|
|
|
|
$this->assertSame(['base', 'standard', 'legacy'], $result, '표준 이름 결과에 구 이름이 이어 적용된다');
|
|
}
|
|
|
|
public function test_no_subscriber_returns_value_unchanged(): void
|
|
{
|
|
$result = HookManager::applyFiltersWithLegacyName(self::STANDARD, self::LEGACY, ['base' => true]);
|
|
|
|
$this->assertSame(['base' => true], $result);
|
|
}
|
|
|
|
public function test_extra_arguments_reach_both_names(): void
|
|
{
|
|
$seen = [];
|
|
HookManager::addFilter(self::STANDARD, function (array $r, string $id) use (&$seen) {
|
|
$seen['standard'] = $id;
|
|
|
|
return $r;
|
|
});
|
|
HookManager::addFilter(self::LEGACY, function (array $r, string $id) use (&$seen) {
|
|
$seen['legacy'] = $id;
|
|
|
|
return $r;
|
|
});
|
|
|
|
HookManager::applyFiltersWithLegacyName(self::STANDARD, self::LEGACY, [], 'probe-plugin');
|
|
|
|
$this->assertSame(['standard' => 'probe-plugin', 'legacy' => 'probe-plugin'], $seen);
|
|
}
|
|
}
|