Files
Gnuboard7/tests/Unit/Seo/ExpressionEvaluatorRawPrefixTest.php
HeuJung 1eedbbdda1 fix(core,engine): OFFSET 순회 중 필터 컬럼 변경으로 인한 처리 누락 수정
Laravel chunk/each 는 OFFSET 기반이라, 콜백이 행의 필터 소속을 바꾸면
(필터 컬럼을 채우거나 매칭 행을 삭제하면) 다음 조회가 그만큼 앞으로 밀려
미처리 행을 조용히 건너뛴다. 250건/청크 100 이면 정확히 100건이 남는다.
코어·번들 확장 전수 조사로 확정한 6곳을 chunkById(키셋 순회)로 통일했다.

브라우저 검수(28축)에서 계획에 없던 결함 12건이 드러나 같은 사슬에서
수정했다. 이 중 layout_strategy=keep 무효화와 수정 감지 실패 시 "수정 없음"
오보는 사용자 작업 소실에 직결된다.

재발 방지로 audit 룰을 추가했고, 수정 6곳을 원복해 red 6건 / 복원 후 green
0건으로 판별력을 검증했다.
2026-07-31 21:50:45 +09:00

70 lines
2.3 KiB
PHP

<?php
namespace Tests\Unit\Seo;
use App\Seo\ExpressionEvaluator;
use Tests\TestCase;
/**
* SEO(봇) 렌더러의 `{{raw:...}}` 번역 면제 바인딩 패리티 회귀 테스트.
*
* 배경: React 쪽 노드 `text` 처리에서 `raw:` 접두사를 벗기지 않아 표현식 평가가
* 예외로 끊기던 결함(engine-v1.54.4)을 고치면서, 봇 렌더러에는 접두사 처리 자체가
* 아예 없다는 사실이 드러났다. 같은 표현식이 화면에서는 값이 나오고 봇 화면에서만
* 사라지는 패리티 붕괴가 잠재해 있었다.
*/
class ExpressionEvaluatorRawPrefixTest extends TestCase
{
private function evaluator(): ExpressionEvaluator
{
$e = new ExpressionEvaluator;
$e->setTranslations(['common' => ['save' => '저장']]);
return $e;
}
public function test_raw_prefix_is_stripped_before_evaluation(): void
{
$context = ['file' => ['description' => '', 'name' => 'admin_module_list.json']];
$this->assertSame(
'admin_module_list.json',
$this->evaluator()->evaluate('{{raw:file.description || file.name}}', $context),
'raw: 접두사를 벗기지 않으면 콜론이 식으로 파싱돼 평가가 실패한다'
);
}
public function test_raw_prefix_result_is_translation_exempt(): void
{
$context = ['post' => ['title' => '$t:common.save']];
$this->assertSame(
'$t:common.save',
$this->evaluator()->evaluate('{{raw:post.title}}', $context),
'raw: 결과의 $t: 토큰은 번역하지 않아야 한다 (React rawMarkers 와 동일)'
);
}
public function test_non_raw_binding_still_resolves_translation_tokens(): void
{
$context = ['post' => ['title' => '$t:common.save']];
$this->assertSame(
'저장',
$this->evaluator()->evaluate('{{post.title}}', $context),
'raw: 가 없으면 종전대로 번역되어야 한다 (비회귀)'
);
}
public function test_evaluate_raw_strips_prefix(): void
{
$context = ['items' => [1, 2, 3]];
$this->assertSame(
[1, 2, 3],
$this->evaluator()->evaluateRaw('{{raw:items}}', $context),
'evaluateRaw 도 접두사를 벗기고 원본 타입을 유지해야 한다'
);
}
}