// 인증 시스템 테스트 파일 // Phase 2-1A 구현 내용 테스트 import { PasswordUtils } from "../utils/passwordUtils"; import { JwtUtils } from "../utils/jwtUtils"; import { PersonBean } from "../types/auth"; // 테스트용 사용자 정보 const testUserInfo: PersonBean = { userId: "test_user", userName: "테스트 사용자", deptName: "개발팀", companyCode: "ILSHIN", email: "test@ilshin.com", tel: "02-1234-5678", cellPhone: "010-1234-5678", }; /** * 비밀번호 암호화 테스트 */ function testPasswordUtils(): void { console.log("\n=== 비밀번호 암호화 테스트 ==="); const testPassword = "test1234"; try { // 암호화 테스트 const encrypted = PasswordUtils.encrypt(testPassword); console.log("원본 비밀번호:", testPassword); console.log("암호화 결과:", encrypted); // 복호화 테스트 const decrypted = PasswordUtils.decrypt(encrypted); console.log("복호화 결과:", decrypted); console.log("복호화 성공:", testPassword === decrypted); // 비밀번호 검증 테스트 const isMatch = PasswordUtils.matches(testPassword, encrypted); console.log("비밀번호 검증:", isMatch); // SHA256 해시 테스트 const sha256Hash = PasswordUtils.encryptSha256(testPassword); console.log("SHA256 해시:", sha256Hash); // 마스터 패스워드 테스트 const masterPasswordMatch = PasswordUtils.matches( "qlalfqjsgh11", "any_encrypted_password" ); console.log("마스터 패스워드 검증:", masterPasswordMatch); } catch (error) { console.error("비밀번호 암호화 테스트 실패:", error); } } /** * JWT 토큰 테스트 */ function testJwtUtils(): void { console.log("\n=== JWT 토큰 테스트 ==="); try { // 토큰 생성 테스트 const token = JwtUtils.generateToken(testUserInfo); console.log("생성된 토큰:", token); // 토큰 디코드 테스트 const decoded = JwtUtils.decodeToken(token); console.log("디코드된 페이로드:", decoded); // 토큰 검증 테스트 const verified = JwtUtils.verifyToken(token); console.log("검증된 사용자 정보:", verified); console.log("검증 성공:", testUserInfo.userId === verified.userId); // 토큰 만료 확인 테스트 const isExpired = JwtUtils.isTokenExpired(token); console.log("토큰 만료 여부:", isExpired); // 사용자 ID 추출 테스트 const userId = JwtUtils.getUserIdFromToken(token); console.log("토큰에서 추출한 사용자 ID:", userId); // 토큰 유효성 검사 테스트 const validation = JwtUtils.validateToken(token); console.log("토큰 유효성 검사:", validation); // 토큰 갱신 테스트 const refreshedToken = JwtUtils.refreshToken(token); console.log("갱신된 토큰:", refreshedToken); console.log("토큰 갱신 성공:", token !== refreshedToken); } catch (error) { console.error("JWT 토큰 테스트 실패:", error); } } /** * 잘못된 토큰 테스트 */ function testInvalidToken(): void { console.log("\n=== 잘못된 토큰 테스트 ==="); try { // 잘못된 토큰으로 검증 시도 const invalidToken = "invalid.token.here"; JwtUtils.verifyToken(invalidToken); } catch (error) { console.log( "예상된 오류 (잘못된 토큰):", error instanceof Error ? error.message : error ); } try { // 만료된 토큰 테스트 (1초 후 만료되는 토큰 생성) const shortLivedToken = JwtUtils.generateToken(testUserInfo); // 실제로는 시간을 기다려야 하지만, 여기서는 검증 로직만 테스트 console.log("단기 토큰 생성 성공"); } catch (error) { console.error("단기 토큰 생성 실패:", error); } } /** * 통합 테스트 */ function integrationTest(): void { console.log("\n=== 통합 테스트 ==="); try { // 1. 비밀번호 암호화 const password = "user1234"; const encryptedPassword = PasswordUtils.encrypt(password); console.log("1. 비밀번호 암호화 완료"); // 2. 사용자 정보로 JWT 토큰 생성 const userInfo: PersonBean = { ...testUserInfo, userId: "integration_test_user", }; const token = JwtUtils.generateToken(userInfo); console.log("2. JWT 토큰 생성 완료"); // 3. 토큰에서 사용자 정보 추출 const extractedUserInfo = JwtUtils.verifyToken(token); console.log("3. 토큰 검증 완료"); // 4. 비밀번호 검증 const passwordMatch = PasswordUtils.matches(password, encryptedPassword); console.log("4. 비밀번호 검증 완료"); // 5. 결과 확인 const allTestsPassed = passwordMatch && extractedUserInfo.userId === userInfo.userId && extractedUserInfo.userName === userInfo.userName; console.log("통합 테스트 결과:", allTestsPassed ? "성공" : "실패"); } catch (error) { console.error("통합 테스트 실패:", error); } } /** * 메인 테스트 실행 */ function runAllTests(): void { console.log("🚀 인증 시스템 테스트 시작"); console.log("=".repeat(50)); testPasswordUtils(); testJwtUtils(); testInvalidToken(); integrationTest(); console.log("\n" + "=".repeat(50)); console.log("✅ 인증 시스템 테스트 완료"); } // 테스트 실행 if (require.main === module) { runAllTests(); } export { testPasswordUtils, testJwtUtils, testInvalidToken, integrationTest, runAllTests, };