본문 바로가기

Dot Programming/Spring Clone

[스프링 웹앱 프로젝트 #10]회원 가입 인증 메일 확인 테스트 및 리팩토링

회원 가입 : 인증 메일 확인 테스트 및 리팩토링

테스트
 > 입력값이 잘못 된 경우
   >> error 프로퍼티가 model에 들어있는지 확인
   >> 뷰 이름이 account/checked-email인지 확인

 > 입력값이 올바른 경우
   >> 모델에 error가 없는지 확인
   >> 모델에 numberOfUser가 있는지 확인
   >> 모델에 nickname이 있는지 확인
   >> 뷰 이름 확인

리팩토링
 > 코드의 위치가 적절한가?

 

 

test코드 작성

@Transactional
@SpringBootTest
@AutoConfigureMockMvc
class AccountControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @Autowired
    private AccountRepository accountRepository;

    @MockBean
    JavaMailSender javaMailSender;

    @DisplayName("인증 메일 확인 - 입력값 오류")
    @Test
    public void checkedEmailToken_with_wrong_input() throws Exception{
        mockMvc.perform(get("/check-email-token")
                .param("token" , "asdafasd")
                .param("email", "email@email.com"))
                .andExpect(status().isOk())
                .andExpect(model().attributeExists("error"))
                .andExpect(view().name("account/checked-email"));

     }


    @DisplayName("인증 메일 확인 - 입력값 정상")
    @Test
    public void checkedEmailToken() throws Exception{
        //given
        Account account = Account.builder()
                        .email("test@email.com")
                        .password("12345678")
                        .nickname("loosie")
                        .build();
        Account newAccount = accountRepository.save(account);
        newAccount.generateEmailCheckToken();


	    //여기도 @Transactional없으면 token null값 발생
        //then
        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.class

@Slf4j
@Controller
@RequiredArgsConstructor
public class AccountController {

	...

    @GetMapping("/check-email-token")
    public String checkEmailToken(String token, String email, Model model){
      	
        ...
        
        //리팩토링
        account.completeSignUp();
  //    account.setEmailVerified(true);
  //    account.setJoinedAt(LocalDateTime.now());
        model.addAttribute("numberOfUser", accountRepository.count());
        model.addAttribute("nickname", account.getNickname());
        return view;

    }


}

 

 

Account.class

@Entity
@Getter @Setter
@EqualsAndHashCode(of ="id")
@Builder @AllArgsConstructor @NoArgsConstructor
public class Account {

	...

    public void completeSignUp() {
        this.emailVerified = true;
        this.joinedAt = LocalDateTime.now();

    }
}

 


참고

인프런 강의 - 스프링과 JPA 기반 웹 애플리케이션 개발