테스트
- 입력값이 잘못 된 경우
- error 프로퍼티가 model에 들어가 있는지 확인
- 뷰 이름이 account/checked-email 인지 확인
- 입력값이 올바른 경우
- 모델에 error가 없는지 확인
- 모델에 numberOfUser가 있는지 확인
- 모델에 nickname이 있는지 확인
- 뷰 이름 확인
리팩토링
- 코드의 위치가 적절한가?
테스트 코드 추가
package me.weekbelt.studyolle.account;
@Transactional // 추가
@AutoConfigureMockMvc
@SpringBootTest
class AccountControllerTest {
// 기존 코드 ...........
@DisplayName("인증 메일 확인 - 입력값 오류")
@Test
public void checkEmailToken_with_wrong_input() throws Exception {
mockMvc.perform(get("/check-email-token")
.param("token", "sdfasdfasdfa")
.param("email", "email@email.com"))
.andExpect(status().isOk())
.andExpect(model().attributeExists("error"))
.andExpect(view().name("account/checked-email"))
;
}
@DisplayName("인증 메일 확인 - 입력값 정상")
@Test
public void checkEmailToken_with_correct_input() throws Exception {
Account account = Account.builder()
.email("test@email.com")
.password("12345678")
.nickname("joohyuk")
.build();
Account newAccount = accountRepository.save(account);
newAccount.generateEmailCheckToken();
mockMvc.perform(get("/check-email-token")
.param("token", newAccount.getEmailCheckToken())
.param("email", newAccount.getEmail()))
.andExpect(status().isOk())
.andExpect(model().attributeDoesNotExist("error"))
.andExpect(model().attributeExists("nickname"))
.andExpect(model().attributeExists("numberOfUser"))
.andExpect(view().name("account/checked-email"))
;
}
}
AccountController의 checkEmailToken메소드 리팩토링
package me.weekbelt.studyolle.account;
@RequiredArgsConstructor
@Controller
public class AccountController {
@GetMapping("/check-email-token")
public String checkEmailToken(String token, String email, Model model) {
// 기존코드 .......
// 이메일은 있지만 토큰 값이 다른지 확인
if(!account.isValidToken(token)){ <= 조건을 가독성을 높이기 위해 수정
model.addAttribute("error", "worng.token");
return view;
}
account.setEmailVerified(true); // 제거
account.setJoinedAt(LocalDateTime.now()); // 제거
account.completeSignUp(); // 추가
model.addAttribute("numberOfUser", accountRepository.count());
model.addAttribute("nickname", account.getNickname());
return view;
}
}
package me.weekbelt.studyolle.domain;
import lombok.*;
import javax.persistence.*;
import java.time.LocalDateTime;
import java.util.UUID;
@Builder @AllArgsConstructor @NoArgsConstructor
@Getter @Setter @EqualsAndHashCode(of = "id")
@Entity
public class Account {
// 기존 코드 ........
// 추가
public void completeSignUp() {
this.emailVerified = true;
this.joinedAt = LocalDateTime.now();
}
// 추가
public boolean isValidToken(String token) {
return this.emailCheckToken.equals(token);
}
}
참고: https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-JPA-%EC%9B%B9%EC%95%B1#
'스프링과 JPA 기반 웹 어플리케이션 개발 > 1부 (개발환경, 회원가입, 로그인, 계정설정)' 카테고리의 다른 글
11. 회원 가입: 메인 네비게이션 메뉴 변경 (0) | 2020.04.19 |
---|---|
10. 회원 가입: 가입 완료 후 자동 로그인 (0) | 2020.04.18 |
08. 회원 가입: 인증 메일 확인 (0) | 2020.04.18 |
07. 회원 가입: 패스워드 인코더 (0) | 2020.04.18 |
06. 회원 가입: 리팩토링 및 테스트 (0) | 2020.04.17 |