레스토랑 예약 사이트 만들기 5 - 메뉴 관리

메뉴를 추가하는 요청을 처리하기 위한 control

@RestController
@RequiredArgsConstructor
public class MenuItemController {
private final MenuItemService menuItemService;

@PatchMapping("/restaurants/{restaurantId}/menuitems")
public String buikUpdate(){
List<MenuItem> menuItems = new ArrayList<>();
menuItemService.bulkUpdate(menuItems);
return "";
}
}
@WebMvcTest(MenuItemController.class)
class MenuItemControllerTest {

@Autowired
private MockMvc mockMvc;

@MockBean
private MenuItemService menuItemService;

@Test
public void bulkUpdate() throws Exception {
ResultActions resultActions = mockMvc.perform(patch("/restaurants/1/menuitems")
.contentType(MediaType.APPLICATION_JSON)
.content("[]"));

resultActions
.andExpect(status().isOk());

verify(menuItemService).bulkUpdate(any());
}
}
@Service
@RequiredArgsConstructor
public class MenuItemService {
private final MenuItemRepository menuItemRepository;

public void bulkUpdate(Long restaurantId, List<MenuItem> menuItems) {
for(MenuItem menuItem : menuItems){
menuItem.setRestaurantId(restaurantId);
menuItemRepository.save(menuItem);
}
}
}
class MenuItemServiceTest {

private MenuItemService menuItemService;

@Mock
private MenuItemRepository menuItemRepository;

@BeforeEach
public void setUp(){
MockitoAnnotations.initMocks(this);

menuItemService = new MenuItemService(menuItemRepository);
}

@Test
public void bulkUpdate() {
List<MenuItem> menuItems = new ArrayList<>();
menuItems.add(MenuItem.builder()
.name("Kimchi")
.build());
menuItems.add(MenuItem.builder()
.name("Gukbob")
.build());

menuItemService.bulkUpdate(1L, menuItems);

verify(menuItemRepository, times(2)).save(any());;
}
}

메뉴 삭제 요청

@Builder
@Entity
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class MenuItem {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private Long restaurantId;
private String name;

@Transient
private boolean destroy;

public MenuItem(String name){
this.name = name;
}

}
@Service
@RequiredArgsConstructor
public class MenuItemService {
private final MenuItemRepository menuItemRepository;

public void bulkUpdate(Long restaurantId, List<MenuItem> menuItems) {
for(MenuItem menuItem : menuItems){
updateOrDeleteMenuItems(restaurantId, menuItem);
}
}

private void updateOrDeleteMenuItems(Long restaurantId, MenuItem menuItem) {
if(menuItem.isDestroy()){
menuItemRepository.deleteById(menuItem.getId());
}else {
menuItem.setRestaurantId(restaurantId);
menuItemRepository.save(menuItem);
}
}
}
@Test
public void 메뉴를_삭제한다() {
List<MenuItem> menuItems = new ArrayList<>();
menuItems.add(MenuItem.builder()
.name("Kimchi")
.build());
menuItems.add(MenuItem.builder()
.name("Gukbob")
.build());
menuItems.add(MenuItem.builder()
.id(1004L)
.destroy(true)
.build());

menuItemService.bulkUpdate(1L, menuItems);

verify(menuItemRepository, times(2)).save(any());
verify(menuItemRepository, times(1)).deleteById(eq(1004L));
}
@Builder
@Entity
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class MenuItem {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private Long restaurantId;
private String name;

@Transient
@JsonInclude(JsonInclude.Include.NON_DEFAULT)
private boolean destroy;

public MenuItem(String name){
this.name = name;
}

}
Share