true]); define('SUPPORTED_LANGUAGES', ['ko' => '한국어', 'en' => 'English']); define('INSTALLER_BASE_URL', '/install'); require_once BASE_PATH . '/public/install/includes/functions.php'; require_once BASE_PATH . '/public/install/api/rollback-functions.php'; $passed = 0; $failed = 0; $errors = []; function assert_true($condition, $message) { global $passed, $failed, $errors; if ($condition) { $passed++; echo " ✓ {$message}\n"; } else { $failed++; $errors[] = $message; echo " ✗ {$message}\n"; } } /** * 임시 디렉토리를 완전히 정리합니다 (테스트용). */ function cleanupTempDir(string $dir): void { if (!is_dir($dir)) { return; } $items = array_diff(scandir($dir), ['.', '..']); foreach ($items as $item) { $path = $dir . DIRECTORY_SEPARATOR . $item; if (is_dir($path)) { cleanupTempDir($path); } else { @unlink($path); } } @rmdir($dir); } echo "=== deleteDirectory() 보호 파일 보존 테스트 ===\n\n"; // 1. .gitkeep 파일 보존 테스트 echo "[1] .gitkeep 파일 보존 테스트\n"; $tempDir = sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'g7_test_' . uniqid(); mkdir($tempDir, 0755, true); file_put_contents($tempDir . '/.gitkeep', ''); file_put_contents($tempDir . '/some_file.txt', 'test'); mkdir($tempDir . '/subdir', 0755); file_put_contents($tempDir . '/subdir/nested.txt', 'test'); $result = deleteDirectory($tempDir); assert_true($result === true, 'deleteDirectory()가 true를 반환해야 합니다'); assert_true(is_dir($tempDir), '디렉토리 자체는 유지되어야 합니다'); assert_true(file_exists($tempDir . '/.gitkeep'), '.gitkeep 파일이 보존되어야 합니다'); assert_true(!file_exists($tempDir . '/some_file.txt'), '일반 파일은 삭제되어야 합니다'); assert_true(!is_dir($tempDir . '/subdir'), '하위 디렉토리는 삭제되어야 합니다'); cleanupTempDir($tempDir); // 2. .gitignore 파일 보존 테스트 echo "\n[2] .gitignore 파일 보존 테스트\n"; $tempDir = sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'g7_test_' . uniqid(); mkdir($tempDir, 0755, true); file_put_contents($tempDir . '/.gitignore', '*'); file_put_contents($tempDir . '/data.log', 'log'); $result = deleteDirectory($tempDir); assert_true($result === true, 'deleteDirectory()가 true를 반환해야 합니다'); assert_true(is_dir($tempDir), '디렉토리 자체는 유지되어야 합니다'); assert_true(file_exists($tempDir . '/.gitignore'), '.gitignore 파일이 보존되어야 합니다'); assert_true(!file_exists($tempDir . '/data.log'), '일반 파일은 삭제되어야 합니다'); cleanupTempDir($tempDir); // 3. removeDir=false (기본값) 시 디렉토리 유지 테스트 echo "\n[3] removeDir=false (기본값) 시 디렉토리 유지 테스트\n"; $tempDir = sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'g7_test_' . uniqid(); mkdir($tempDir, 0755, true); file_put_contents($tempDir . '/file1.txt', 'test'); file_put_contents($tempDir . '/file2.txt', 'test'); $result = deleteDirectory($tempDir); assert_true($result === true, 'deleteDirectory()가 true를 반환해야 합니다'); assert_true(is_dir($tempDir), '보호 파일 없어도 디렉토리 자체는 유지되어야 합니다 (removeDir=false)'); assert_true(!file_exists($tempDir . '/file1.txt'), 'file1.txt는 삭제되어야 합니다'); assert_true(!file_exists($tempDir . '/file2.txt'), 'file2.txt는 삭제되어야 합니다'); cleanupTempDir($tempDir); // 4. removeDir=true + 보호 파일 있음 → 디렉토리 유지 echo "\n[4] removeDir=true + 보호 파일 있음 → 디렉토리 유지 테스트\n"; $tempDir = sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'g7_test_' . uniqid(); mkdir($tempDir, 0755, true); file_put_contents($tempDir . '/.gitkeep', ''); file_put_contents($tempDir . '/other.txt', 'test'); $result = deleteDirectory($tempDir, true); assert_true($result === true, 'deleteDirectory()가 true를 반환해야 합니다'); assert_true(is_dir($tempDir), '보호 파일이 있으면 removeDir=true여도 디렉토리 유지'); assert_true(file_exists($tempDir . '/.gitkeep'), '.gitkeep 파일이 보존되어야 합니다'); assert_true(!file_exists($tempDir . '/other.txt'), '일반 파일은 삭제되어야 합니다'); cleanupTempDir($tempDir); // 5. removeDir=true + 보호 파일 없음 → 디렉토리 삭제 echo "\n[5] removeDir=true + 보호 파일 없음 → 디렉토리 삭제 테스트\n"; $tempDir = sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'g7_test_' . uniqid(); mkdir($tempDir, 0755, true); file_put_contents($tempDir . '/file.txt', 'test'); $result = deleteDirectory($tempDir, true); assert_true(!is_dir($tempDir), '보호 파일 없고 removeDir=true면 디렉토리도 삭제'); // 이미 삭제됐으므로 정리 불필요 // 6. 중첩 디렉토리 (vendor 구조 시뮬레이션) echo "\n[6] vendor 디렉토리 구조 시뮬레이션 테스트\n"; $tempDir = sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'g7_test_' . uniqid(); mkdir($tempDir, 0755, true); file_put_contents($tempDir . '/.gitkeep', ''); mkdir($tempDir . '/laravel/framework/src', 0755, true); file_put_contents($tempDir . '/laravel/framework/src/Application.php', ' 0) { echo "\n실패한 테스트:\n"; foreach ($errors as $error) { echo " - {$error}\n"; } exit(1); } echo "\n모든 테스트 통과!\n"; exit(0);