View Javadoc
1   /*
2    *    Copyright 2010-2023 the original author or authors.
3    *
4    *    Licensed under the Apache License, Version 2.0 (the "License");
5    *    you may not use this file except in compliance with the License.
6    *    You may obtain a copy of the License at
7    *
8    *       https://www.apache.org/licenses/LICENSE-2.0
9    *
10   *    Unless required by applicable law or agreed to in writing, software
11   *    distributed under the License is distributed on an "AS IS" BASIS,
12   *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   *    See the License for the specific language governing permissions and
14   *    limitations under the License.
15   */
16  package org.mybatis.jpetstore.service;
17  
18  import static org.assertj.core.api.Assertions.assertThat;
19  import static org.assertj.core.api.Assertions.fail;
20  import static org.mockito.ArgumentMatchers.*;
21  import static org.mockito.Mockito.verify;
22  import static org.mockito.Mockito.when;
23  
24  import java.util.ArrayList;
25  import java.util.HashMap;
26  import java.util.List;
27  import java.util.Map;
28  
29  import org.junit.jupiter.api.Test;
30  import org.junit.jupiter.api.extension.ExtendWith;
31  import org.mockito.InjectMocks;
32  import org.mockito.Mock;
33  import org.mockito.junit.jupiter.MockitoExtension;
34  import org.mybatis.jpetstore.domain.Item;
35  import org.mybatis.jpetstore.domain.LineItem;
36  import org.mybatis.jpetstore.domain.Order;
37  import org.mybatis.jpetstore.domain.Sequence;
38  import org.mybatis.jpetstore.mapper.ItemMapper;
39  import org.mybatis.jpetstore.mapper.LineItemMapper;
40  import org.mybatis.jpetstore.mapper.OrderMapper;
41  import org.mybatis.jpetstore.mapper.SequenceMapper;
42  
43  /**
44   * @author coderliux
45   */
46  @ExtendWith(MockitoExtension.class)
47  class OrderServiceTest {
48  
49    @Mock
50    private ItemMapper itemMapper;
51    @Mock
52    private OrderMapper orderMapper;
53    @Mock
54    private LineItemMapper lineItemMapper;
55    @Mock
56    private SequenceMapper sequenceMapper;
57  
58    @InjectMocks
59    private OrderService orderService;
60  
61    @Test
62    void shouldReturnOrderWhenGivenOrderIdWithOutLineItems() {
63      // given
64      int orderId = 1;
65      Order order = new Order();
66      List<LineItem> lineItems = new ArrayList<>();
67  
68      // when
69      when(orderMapper.getOrder(orderId)).thenReturn(order);
70      when(lineItemMapper.getLineItemsByOrderId(orderId)).thenReturn(lineItems);
71  
72      // then
73      assertThat(orderService.getOrder(orderId)).isEqualTo(order);
74      assertThat(orderService.getOrder(orderId).getLineItems()).isEmpty();
75    }
76  
77    @Test
78    void shouldReturnOrderWhenGivenOrderIdExistedLineItems() {
79      // given
80      int orderId = 1;
81      Order order = new Order();
82      List<LineItem> lineItems = new ArrayList<>();
83      LineItem item = new LineItem();
84      String itemId = "abc";
85      item.setItemId(itemId);
86      lineItems.add(item);
87  
88      // when
89      when(orderMapper.getOrder(orderId)).thenReturn(order);
90      when(lineItemMapper.getLineItemsByOrderId(orderId)).thenReturn(lineItems);
91      when(itemMapper.getItem(itemId)).thenReturn(new Item());
92      when(itemMapper.getInventoryQuantity(itemId)).thenReturn(5);
93  
94      // then
95      Order expectedOrder = orderService.getOrder(orderId);
96      assertThat(expectedOrder).isEqualTo(order);
97      assertThat(expectedOrder.getLineItems()).hasSize(1);
98      assertThat(expectedOrder.getLineItems().get(0).getItem().getQuantity()).isEqualTo(5);
99    }
100 
101   @Test
102   void shouldReturnOrderList() {
103 
104     // given
105     String username = "foo";
106     List<Order> expectedOrders = new ArrayList<>();
107 
108     // when
109     when(orderMapper.getOrdersByUsername(username)).thenReturn(expectedOrders);
110     List<Order> orders = orderService.getOrdersByUsername(username);
111 
112     // then
113     assertThat(orders).isSameAs(expectedOrders);
114 
115   }
116 
117   @Test
118   void shouldReturnNextId() {
119 
120     // given
121     Sequence expectedSequence = new Sequence("order", 100);
122 
123     // when
124     when(sequenceMapper.getSequence(any())).thenReturn(expectedSequence);
125     int nextId = orderService.getNextId("order");
126 
127     // then
128     assertThat(nextId).isEqualTo(100);
129     verify(sequenceMapper).getSequence(argThat(v -> v.getName().equals("order") && v.getNextId() == -1));
130     verify(sequenceMapper).updateSequence(argThat(v -> v.getName().equals("order") && v.getNextId() == 101));
131 
132   }
133 
134   @Test
135   void shouldThrowExceptionWhenSequenceNotFound() {
136 
137     // given
138 
139     // when
140     when(sequenceMapper.getSequence(any())).thenReturn(null);
141     try {
142       orderService.getNextId("order");
143       fail("Should throw an exception when sequence not found.");
144     } catch (RuntimeException e) {
145       // then
146       assertThat(e.getMessage())
147           .isEqualTo("Error: A null sequence was returned from the database (could not get next order sequence).");
148       verify(sequenceMapper).getSequence(argThat(v -> v.getName().equals("order") && v.getNextId() == -1));
149     }
150 
151   }
152 
153   @Test
154   void shouldCallTheMapperToInsert() {
155     // given
156     Order order = new Order();
157     LineItem item = new LineItem();
158     String itemId = "I01";
159     int quantity = 4;
160     item.setItemId(itemId);
161     item.setQuantity(quantity);
162     order.addLineItem(item);
163 
164     Sequence orderNumSequence = new Sequence("ordernum", 100);
165 
166     Map<String, Object> expectedItemParam = new HashMap<>(2);
167     expectedItemParam.put("itemId", itemId);
168     expectedItemParam.put("increment", quantity);
169 
170     // when
171     when(sequenceMapper.getSequence(any())).thenReturn(orderNumSequence);
172     orderService.insertOrder(order);
173 
174     // then
175     verify(orderMapper).insertOrder(argThat(v -> v == order && v.getOrderId() == 100));
176     verify(orderMapper).insertOrderStatus(eq(order));
177     verify(lineItemMapper).insertLineItem(argThat(v -> v == item && v.getOrderId() == 100));
178     verify(itemMapper).updateInventoryQuantity(eq(expectedItemParam));
179   }
180 
181 }