assertTrue(Schema::hasTable($table), "{$table} 테이블이 존재하지 않습니다."); $names = collect(Schema::getIndexes($table)) ->pluck('name') ->reject(fn ($name) => strtoupper((string) $name) === 'PRIMARY') ->all(); $this->assertNotEmpty($names, "{$table} 인덱스가 introspection 되지 않았습니다."); foreach ($names as $name) { // Schema::getIndexes() 는 prefix 포함 실제 식별자를 반환하므로 base 만 추출. $base = $prefix !== '' && str_starts_with((string) $name, $prefix) ? substr((string) $name, strlen($prefix)) : (string) $name; $this->assertLessThanOrEqual( $maxBaseLength, strlen($base), sprintf( '인덱스 base "%s" (%d자) 가 한도 %d자를 초과 — prefix %d자 환경에서 64자 초과로 설치 실패함.', $base, strlen($base), $maxBaseLength, self::MAX_DB_PREFIX_LENGTH ) ); } } } /** * 명시화한 짧은 인덱스 이름이 실제로 적용되었는지 확인 (명시화 회귀 가드). */ public function test_explicit_short_index_names_are_applied(): void { $prefix = DB::getTablePrefix(); $expected = [ 'ecommerce_shipping_policy_extra_fee_templates' => [ 'idx_extra_fee_tpl_is_active', 'uniq_extra_fee_tpl_zipcode', ], 'ecommerce_shipping_policy_country_settings' => [ 'idx_cs_country_code', ], ]; foreach ($expected as $table => $expectedBases) { $names = collect(Schema::getIndexes($table))->pluck('name')->all(); $bases = array_map( fn ($name) => $prefix !== '' && str_starts_with((string) $name, $prefix) ? substr((string) $name, strlen($prefix)) : (string) $name, $names ); foreach ($expectedBases as $expectedBase) { $this->assertContains( $expectedBase, $bases, "{$table} 에 명시 인덱스명 '{$expectedBase}' 가 적용되지 않았습니다." ); } } } }