[横書きアイテム]そんなREST APIで大丈夫ですか?本格的なREST API実装イベント修正ロジック

21435 ワード

Event更新テストの実施


今回はEvent APIの最後の機能であるイベント修正機能を実現します.
考慮すべき事項は以下の通りです.
  • が変更された場合、変更されたイベント値がHATEOASを満たすように渡される必要があります.
  • 入力されたid値が
  • でない場合、Notfoundエラーメッセージが返されます.
  • bodyの値が無効な場合(exEmpty)、BadRequestメッセージが返されます.
  •     @Test
        public void update_event_success() throws Exception {
            //Given
            Event event = createEvent(11123);
            this.eventRepository.save(event);
            String newDescription = "new description";
    
            EventDto eventDto = EventDto.builder()
                    .name(event.getName())
                    .description(newDescription)
                    .build();
    
            //When
            //Then
            mockMvc.perform(put("/api/events/{id}", event.getId())
                            .contentType(MediaType.APPLICATION_JSON)
                            .content(objectMapper.writeValueAsString(eventDto)))
                    .andDo(print())
                    .andExpect(jsonPath("event.name").value(event.getName()))
                    .andExpect(jsonPath("event.description").value(newDescription))
                    .andExpect(jsonPath("_links").exists());
        }
    
        @Test
        public void update_event_bad_requset_empty_input() throws Exception {
            //Given
            Event event = createEvent(11223);
            this.eventRepository.save(event);
    
            EventDto eventDto = EventDto.builder()
                    .build();
    
            //When
            //Then
            mockMvc.perform(put("/api/events/{id}", event.getId())
                            .contentType(MediaType.APPLICATION_JSON)
                            .content(objectMapper.writeValueAsString(eventDto)))
                    .andDo(print())
                    .andExpect(status().isBadRequest())
                    .andExpect(jsonPath("timestamp").exists())
                    .andExpect(jsonPath("status").exists())
                    .andExpect(jsonPath("error").exists())
                    .andExpect(jsonPath("message").exists());
        }
    
        @Test
        public void update_event_not_found_wrong_id() throws Exception {
            //Given
            Integer wrongId = 10010;
            EventDto eventDto = createEventDto();
    
            //When
            //Then
            mockMvc.perform(put("/api/events/{id}", wrongId)
                            .contentType(MediaType.APPLICATION_JSON)
                            .content(objectMapper.writeValueAsString(eventDto)))
                    .andDo(print())
                    .andExpect(status().isNotFound())
                    .andExpect(jsonPath("timestamp").exists())
                    .andExpect(jsonPath("status").exists())
                    .andExpect(jsonPath("error").exists())
                    .andExpect(jsonPath("message").exists());
        }
    

    サービスの実装


    重要な点は、存在しないIDが入力された場合、NotFoundを返す論理がread()メソッドで実装されていることである.これを再利用すると、コードがより簡潔になります.
        public Event update(Integer id, EventDto eventDto){
            Event event = this.read(id);
            event.setName(eventDto.getName());
            event.setDescription(eventDto.getDescription());
            return this.eventRepository.save(event);
        }

    コントローラ実装


    ここでは同様に@Valid宣言により無効なEventDtoに対して例外処理を行う.
        @PutMapping("/{id}")
        public ResponseEntity update(@RequestBody @Valid EventDto eventDto, @PathVariable Integer id){
            Event event = this.eventService.update(id, eventDto);
            EventResource eventResource = new EventResource(event);
            addLinks(eventResource);
            return ResponseEntity.ok(eventResource);
        }

    テスト結果