TIL

24_02_08 TIL

nakgopsae 2024. 2. 8. 21:27

오늘 한 것 

test코드 작성 해보기 

@SpringBootTest
@AutoConfigureMockMvc
@ExtendWith(MockKExtension::class)
class TodoControllerTest @Autowired constructor(
    private val mockMvc: MockMvc,
    private val jwtPlugin: JwtPlugin
): DescribeSpec({
    extension(SpringExtension)

    afterContainer {
        clearAllMocks()
    }

    val todoService = mockk<TodoService>()

    describe("GET /todos/{todoId}"){
        context("todo를 조회할때"){
            it("200 status를 응답한다") {
                val todoId = 10L
                //val localTime = LocalDateTime.of(2024, 2, 8, 12, 0)
                every { todoService.getTodo(any(), any())} returns  RetrieveTodoDto(
                    todoId = todoId,
                    title = "test_title",
                    content = "test_content",
                    //createAt = localTime,
                    nickName = "test_name",
                    completed = false,
                    commentList = listOf()
                )
                val jwtToken = jwtPlugin.generateAccessToken(
                    subject = "1",
                    email = "qwe123@nate.com",
                    role = "USER"
                )
                val result = mockMvc.perform(
                    get("/todos/$todoId")
                        .header("Authorization","Bearer $jwtToken")
                        .contentType(MediaType.APPLICATION_JSON)
                        .accept(MediaType.APPLICATION_JSON)
                ).andReturn()

                result.response.status shouldBe 200

                val responseDto = jacksonObjectMapper().readValue(
                    result.response.contentAsString,
                    RetrieveTodoDto::class.java
                )

                responseDto.todoId shouldBe todoId

            }

        }

    }
})
//일단 따라 해보기

 

따라만 쳐보았다 grdle에 추가 해줘야 하는거도 있고 오늘 중괄호 잘못쳐서 scope이상하다는 오류를 팀원분들이 도와주셔서 정상작동까지 완료했다

 

@AuthenticationPrincipal 어노테이션으로 로그인한 유저정보 객체를 이용하기 

@Transactional
    override fun updateTodo(todoId: Long,updateTodoDto: UpdateTodoDto,userId: Long):TodoResponseDto {
        val updateTodo = todoRepository.findByIdOrNull(todoId)?: throw ModelNotFoundException("todo",todoId)
        val users = userRepository.findByIdOrNull(userId)?: throw  ModelNotFoundException("user",userId)
        if (updateTodo.user !=users){
            throw CustomException("게시물의 업데이트 권한이 없습니다")
            //에러 순서 커스텀 -> 필터 -> 사용자 Exception
        }else{
            updateTodo.title = updateTodoDto.title
            updateTodo.content = updateTodoDto.content
            updateTodo.nickName =  updateTodoDto.nickName
            return todoRepository.save(updateTodo).toResponse()
        }

 

userPrincipal에 있는 id를 받아와서 레포지토리를 접근해서 entity가져오기 / 입력받은 todoId로 레포지토리에 접근해서 todo도 가져오기 

 

근데 문제가 생겼다 

 

if문으로 todo테이블에 있는 fk키로 걸어놓은 user_id와 principal로 가져온 entity를 비교했을때 

맞다면 정상 작동되는데 틀렸을때 필터체인에 걸어놓은 엔트리포인트에러? JWT401에러가 발생한다 

내가 임시로 걸어놓은 exception은 발생하지 않음 !! 그래서 팀원들한테 물어보니 GlobalExceptionhandler로 설정 해놓은 에러 -> 필터체인에 걸어놓은 AuthenticationEntryPoint 에러 -> 일반 Exception 에러순으로 적용 되는거 같다고 했다

그래서 위 코드처럼 customException을 걸어놓으니 정상 작동했다 

 

401에러가 알아서 뜨면 굳이 userPrincipal의 id값을 가져와서 대조해봐야하나? 싶었는데 대조를 해야 맞는지 아닌지 아는거고 안쓰면 권한이 전부 다한테 부여되는건데 뭐지? 싶었다 해결했으면 OK 

 

기본이 많이 부족하고 배울때 스킵을 많이해서 자꾸 돌아가서 하나씩 다시보는게 좀 단점이 되는거 같다 한번 할 때 빡시게 하자 

 

 

'TIL' 카테고리의 다른 글

24_02_15 TIL queryDSL활용 / 검색 /정렬 /페이징  (0) 2024.02.15
24_02_13 TIL  (0) 2024.02.13
24_02_06 TIL  (1) 2024.02.06
24_01_29 TIL  (1) 2024.01.29
24_01_26 TIL  (1) 2024.01.26