1+ package com .back .domain .user .service ;
2+
3+ import com .back .domain .user .dto .UserRegisterRequest ;
4+ import com .back .domain .user .dto .UserResponse ;
5+ import com .back .domain .user .entity .UserStatus ;
6+ import com .back .domain .user .repository .UserProfileRepository ;
7+ import com .back .domain .user .repository .UserRepository ;
8+ import com .back .global .exception .CustomException ;
9+ import com .back .global .exception .ErrorCode ;
10+ import org .junit .jupiter .api .DisplayName ;
11+ import org .junit .jupiter .api .Test ;
12+ import org .springframework .beans .factory .annotation .Autowired ;
13+ import org .springframework .boot .test .context .SpringBootTest ;
14+ import org .springframework .security .crypto .password .PasswordEncoder ;
15+ import org .springframework .test .context .ActiveProfiles ;
16+ import org .springframework .transaction .annotation .Transactional ;
17+
18+ import static org .assertj .core .api .Assertions .assertThat ;
19+ import static org .assertj .core .api .Assertions .assertThatThrownBy ;
20+
21+ @ SpringBootTest
22+ @ Transactional
23+ @ ActiveProfiles ("test" )
24+ class UserServiceTest {
25+
26+ @ Autowired
27+ private UserService userService ;
28+
29+ @ Autowired
30+ private UserRepository userRepository ;
31+
32+ @ Autowired
33+ private UserProfileRepository userProfileRepository ;
34+
35+ @ Autowired
36+ private PasswordEncoder passwordEncoder ;
37+
38+ @ Test
39+ @ DisplayName ("정상 회원가입 성공" )
40+ void register_success () {
41+ // given
42+ UserRegisterRequest request = new UserRegisterRequest (
43+ "testuser" ,
"[email protected] " ,
"P@ssw0rd!" ,
"홍길동" 44+ );
45+
46+ // when
47+ UserResponse response = userService .register (request );
48+
49+ // then
50+ assertThat (response .username ()).isEqualTo ("testuser" );
51+ assertThat (
response .
email ()).
isEqualTo (
"[email protected] " );
52+ assertThat (response .nickname ()).isEqualTo ("홍길동" );
53+ assertThat (response .status ()).isEqualTo (UserStatus .PENDING );
54+
55+ // 비밀번호 인코딩 검증
56+ String encoded = userRepository .findById (response .userId ()).get ().getPassword ();
57+ assertThat (passwordEncoder .matches ("P@ssw0rd!" , encoded )).isTrue ();
58+
59+ // UserProfile도 함께 저장됐는지 검증
60+ assertThat (userProfileRepository .existsByNickname ("홍길동" )).isTrue ();
61+ }
62+
63+ @ Test
64+ @ DisplayName ("중복된 username이면 예외 발생" )
65+ void register_duplicateUsername () {
66+ userService .register (new UserRegisterRequest (
67+ "dupuser" ,
"[email protected] " ,
"P@ssw0rd!" ,
"닉네임" 68+ ));
69+
70+ assertThatThrownBy (() ->
71+ userService .register (new UserRegisterRequest (
72+ "dupuser" ,
"[email protected] " ,
"P@ssw0rd!" ,
"다른닉네임" 73+ ))
74+ ).isInstanceOf (CustomException .class )
75+ .hasMessage (ErrorCode .USERNAME_DUPLICATED .getMessage ());
76+ }
77+
78+ @ Test
79+ @ DisplayName ("중복된 email이면 예외 발생" )
80+ void register_duplicateEmail () {
81+ userService .register (new UserRegisterRequest (
82+ "user1" ,
"[email protected] " ,
"P@ssw0rd!" ,
"닉네임" 83+ ));
84+
85+ assertThatThrownBy (() ->
86+ userService .register (new UserRegisterRequest (
87+ "user2" ,
"[email protected] " ,
"P@ssw0rd!" ,
"다른닉네임" 88+ ))
89+ ).isInstanceOf (CustomException .class )
90+ .hasMessage (ErrorCode .EMAIL_DUPLICATED .getMessage ());
91+ }
92+
93+ @ Test
94+ @ DisplayName ("중복된 nickname이면 예외 발생" )
95+ void register_duplicateNickname () {
96+ userService .register (new UserRegisterRequest (
97+ "user1" ,
"[email protected] " ,
"P@ssw0rd!" ,
"dupnick" 98+ ));
99+
100+ assertThatThrownBy (() ->
101+ userService .register (new UserRegisterRequest (
102+ "user2" ,
"[email protected] " ,
"P@ssw0rd!" ,
"dupnick" 103+ ))
104+ ).isInstanceOf (CustomException .class )
105+ .hasMessage (ErrorCode .NICKNAME_DUPLICATED .getMessage ());
106+ }
107+
108+ @ Test
109+ @ DisplayName ("비밀번호 정책 위반(숫자/특수문자 없음) → 예외 발생" )
110+ void register_invalidPassword_noNumberOrSpecial () {
111+ UserRegisterRequest request = new UserRegisterRequest (
112+ "user1" ,
"[email protected] " ,
"abcdefgh" ,
"닉네임" 113+ );
114+
115+ assertThatThrownBy (() -> userService .register (request ))
116+ .isInstanceOf (CustomException .class )
117+ .hasMessage (ErrorCode .INVALID_PASSWORD .getMessage ());
118+ }
119+
120+ @ Test
121+ @ DisplayName ("비밀번호 정책 위반(길이 7자) → 예외 발생" )
122+ void register_invalidPassword_tooShort () {
123+ UserRegisterRequest request = new UserRegisterRequest (
124+ "user2" ,
"[email protected] " ,
"Abc12!" ,
"닉네임" 125+ );
126+
127+ assertThatThrownBy (() -> userService .register (request ))
128+ .isInstanceOf (CustomException .class )
129+ .hasMessage (ErrorCode .INVALID_PASSWORD .getMessage ());
130+ }
131+
132+ @ Test
133+ @ DisplayName ("비밀번호 정책 통과(정상 8자 이상, 숫자/특수문자 포함) → 성공" )
134+ void register_validPassword () {
135+ UserRegisterRequest request = new UserRegisterRequest (
136+ "user3" ,
"[email protected] " ,
"Abcd123!" ,
"닉네임" 137+ );
138+
139+ UserResponse response = userService .register (request );
140+
141+ assertThat (response .username ()).isEqualTo ("user3" );
142+ assertThat (passwordEncoder .matches ("Abcd123!" ,
143+ userRepository .findById (response .userId ()).get ().getPassword ())).isTrue ();
144+ }
145+ }
0 commit comments