1
2
3
4
5
6
7
8
9
10
11
12
13
14
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
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
64 int orderId = 1;
65 Order order = new Order();
66 List<LineItem> lineItems = new ArrayList<>();
67
68
69 when(orderMapper.getOrder(orderId)).thenReturn(order);
70 when(lineItemMapper.getLineItemsByOrderId(orderId)).thenReturn(lineItems);
71
72
73 assertThat(orderService.getOrder(orderId)).isEqualTo(order);
74 assertThat(orderService.getOrder(orderId).getLineItems()).isEmpty();
75 }
76
77 @Test
78 void shouldReturnOrderWhenGivenOrderIdExistedLineItems() {
79
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
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
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
105 String username = "foo";
106 List<Order> expectedOrders = new ArrayList<>();
107
108
109 when(orderMapper.getOrdersByUsername(username)).thenReturn(expectedOrders);
110 List<Order> orders = orderService.getOrdersByUsername(username);
111
112
113 assertThat(orders).isSameAs(expectedOrders);
114
115 }
116
117 @Test
118 void shouldReturnNextId() {
119
120
121 Sequence expectedSequence = new Sequence("order", 100);
122
123
124 when(sequenceMapper.getSequence(any())).thenReturn(expectedSequence);
125 int nextId = orderService.getNextId("order");
126
127
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
138
139
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
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
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
171 when(sequenceMapper.getSequence(any())).thenReturn(orderNumSequence);
172 orderService.insertOrder(order);
173
174
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 }