Files
Gnuboard7/tests/Unit/Installer/DbPrefixLengthGuardTest.php
T
2026-07-01 10:30:32 +09:00

80 lines
2.9 KiB
PHP

<?php
namespace Tests\Unit\Installer;
use PHPUnit\Framework\Attributes\DataProvider;
use PHPUnit\Framework\TestCase;
/**
* 인스톨러 DB 접두사 길이 가드 회귀 테스트
*
* DB prefix 가 길면 자동 생성 인덱스명이 MySQL identifier 한도(64자)를 초과해
* 일부 확장(sirsoft-ecommerce 등) 설치 시 마이그레이션이 실패한다.
* 코어 인스톨러가 prefix 길이를 MAX_DB_PREFIX_LENGTH 로 제한하는지 보장한다.
*
* 검증 축:
* - 상수 MAX_DB_PREFIX_LENGTH 가 6 으로 정의됨 (자동명 최대 58자 + 6 = 64)
* - 경계: 6자 이하 통과 / 7자 이상 거부
* - 가장 긴 자동 생성 인덱스명(58자)이 허용 최대 prefix 와 합쳐 64자를 넘지 않음
*/
class DbPrefixLengthGuardTest extends TestCase
{
public static function setUpBeforeClass(): void
{
require_once dirname(__DIR__, 3) . '/public/install/includes/config.php';
}
public function test_max_db_prefix_length_constant_is_defined_as_six(): void
{
$this->assertTrue(defined('MAX_DB_PREFIX_LENGTH'), 'MAX_DB_PREFIX_LENGTH 상수가 정의되지 않았습니다.');
$this->assertSame(6, MAX_DB_PREFIX_LENGTH);
}
/**
* 인스톨러 서버 검증과 동일한 판정식: strlen($prefix) > MAX_DB_PREFIX_LENGTH 면 거부.
*/
#[DataProvider('prefixProvider')]
public function test_prefix_length_boundary(string $prefix, bool $shouldPass): void
{
$isRejected = strlen($prefix) > MAX_DB_PREFIX_LENGTH;
$this->assertSame(
$shouldPass,
! $isRejected,
sprintf('prefix "%s" (%d자) 판정이 기대와 다릅니다.', $prefix, strlen($prefix))
);
}
/**
* @return array<string, array{0: string, 1: bool}>
*/
public static function prefixProvider(): array
{
return [
'default g7_ (3자)' => ['g7_', true],
'g72_ (4자) — 이슈 재현 prefix' => ['g72_', true],
'5자' => ['shop_', true],
'경계 6자 통과' => ['mycomp', true],
'경계 7자 거부' => ['mycomp_', false],
'명백히 긴 10자 거부' => ['mycompany_', false],
'빈 문자열 통과' => ['', true],
];
}
/**
* 허용 최대 prefix(6자) 와 가장 긴 자동 생성 인덱스명(58자)의 합이
* MySQL identifier 한도(64자) 이내임을 보장한다.
*/
public function test_max_prefix_plus_longest_auto_index_name_fits_identifier_limit(): void
{
$longestAutoIndexBaseLength = 58; // 작업1 이후 전역 자동 생성 인덱스명 최대치
$mysqlIdentifierLimit = 64;
$this->assertLessThanOrEqual(
$mysqlIdentifierLimit,
MAX_DB_PREFIX_LENGTH + $longestAutoIndexBaseLength,
'허용 최대 prefix + 최장 자동 인덱스명이 MySQL 한도를 초과합니다.'
);
}
}