|
|
@@ -0,0 +1,158 @@
|
|
|
+package com.ruoyi.app.order;
|
|
|
+
|
|
|
+import com.alibaba.fastjson.JSONObject;
|
|
|
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
+import com.baomidou.mybatisplus.core.MybatisConfiguration;
|
|
|
+import com.baomidou.mybatisplus.core.metadata.TableInfoHelper;
|
|
|
+import com.ruoyi.app.order.invoice.OrderInvoicePrintAvailabilityService;
|
|
|
+import com.ruoyi.common.exception.ServiceException;
|
|
|
+import com.ruoyi.common.utils.MessageUtils;
|
|
|
+import com.ruoyi.system.domain.InfoUser;
|
|
|
+import com.ruoyi.system.domain.PosOrder;
|
|
|
+import com.ruoyi.system.domain.PosOrderInvoice;
|
|
|
+import com.ruoyi.system.mapper.PosOrderInvoiceMapper;
|
|
|
+import com.ruoyi.system.mapper.PosOrderPromotionMapper;
|
|
|
+import com.ruoyi.system.service.IInfoUserService;
|
|
|
+import com.ruoyi.system.service.IPosOrderRatingService;
|
|
|
+import com.ruoyi.system.service.IPosOrderService;
|
|
|
+import com.ruoyi.system.service.IPosStoreService;
|
|
|
+import com.ruoyi.system.service.MerchantStoreAccessService;
|
|
|
+import com.ruoyi.system.utils.AuthContext;
|
|
|
+import com.ruoyi.system.utils.JwtUtil;
|
|
|
+import org.apache.ibatis.builder.MapperBuilderAssistant;
|
|
|
+import org.junit.jupiter.api.Test;
|
|
|
+import org.mockito.ArgumentCaptor;
|
|
|
+import org.springframework.test.util.ReflectionTestUtils;
|
|
|
+
|
|
|
+import java.util.List;
|
|
|
+
|
|
|
+import static org.junit.jupiter.api.Assertions.*;
|
|
|
+import static org.mockito.ArgumentMatchers.*;
|
|
|
+import static org.mockito.Mockito.*;
|
|
|
+
|
|
|
+class OrderDetailInvoiceChoiceTest {
|
|
|
+ private final PosOrderController controller = new PosOrderController();
|
|
|
+ private final IPosOrderService orders = mock(IPosOrderService.class);
|
|
|
+ private final IInfoUserService users = mock(IInfoUserService.class);
|
|
|
+ private final PosOrderInvoiceMapper invoices = mock(PosOrderInvoiceMapper.class);
|
|
|
+ private final MerchantStoreAccessService merchants = mock(MerchantStoreAccessService.class);
|
|
|
+ private final OrderInvoiceService invoiceService = new OrderInvoiceService();
|
|
|
+
|
|
|
+ OrderDetailInvoiceChoiceTest() {
|
|
|
+ TableInfoHelper.initTableInfo(new MapperBuilderAssistant(new MybatisConfiguration(), ""), PosOrderInvoice.class);
|
|
|
+ ReflectionTestUtils.setField(invoiceService, "posOrderInvoiceMapper", invoices);
|
|
|
+ ReflectionTestUtils.setField(controller, "orderInvoiceService", invoiceService);
|
|
|
+ ReflectionTestUtils.setField(controller, "posOrderService", orders);
|
|
|
+ ReflectionTestUtils.setField(controller, "infoUserService", users);
|
|
|
+ ReflectionTestUtils.setField(controller, "merchantStoreAccessService", merchants);
|
|
|
+ ReflectionTestUtils.setField(controller, "invoicePrintAvailability", mock(OrderInvoicePrintAvailabilityService.class));
|
|
|
+ ReflectionTestUtils.setField(controller, "posStoreService", mock(IPosStoreService.class));
|
|
|
+ ReflectionTestUtils.setField(controller, "posOrderRatingService", mock(IPosOrderRatingService.class, RETURNS_DEEP_STUBS));
|
|
|
+ ReflectionTestUtils.setField(controller, "posOrderPromotionMapper", mock(PosOrderPromotionMapper.class));
|
|
|
+ PosOrder order = new PosOrder();
|
|
|
+ order.setId(7L); order.setDdId("ORDER-1"); order.setUserId(21L);
|
|
|
+ order.setShId(11L); order.setMdId(5L); order.setFood("[]"); order.setShAddress("{}");
|
|
|
+ when(orders.getOne(any(Wrapper.class))).thenReturn(order);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ void customerAndMerchantDetailsReturnEveryStoredChoiceEvenBeforeIssuing() {
|
|
|
+ try (var auth = mockStatic(AuthContext.class); var messages = mockStatic(MessageUtils.class)) {
|
|
|
+ for (String role : List.of("0", "1", "5")) {
|
|
|
+ long actorId = "0".equals(role) ? 21L : 11L;
|
|
|
+ auth.when(AuthContext::requireUserId).thenReturn(actorId);
|
|
|
+ InfoUser actor = new InfoUser(); actor.setUserId(actorId); actor.setUserType(role);
|
|
|
+ when(users.getById(actorId)).thenReturn(actor);
|
|
|
+ for (String choice : List.of("PAPER", "PHONE_BARCODE", "CITIZEN", "MEMBER", "LOVE_CODE", "COMPANY")) {
|
|
|
+ PosOrderInvoice invoice = new PosOrderInvoice();
|
|
|
+ invoice.setInvoiceChoice(choice); invoice.setInvoiceStatus(0);
|
|
|
+ when(invoices.selectOne(any(Wrapper.class))).thenReturn(invoice);
|
|
|
+ JSONObject data = (JSONObject) controller.getorderxq("token", "ORDER-1").get("data");
|
|
|
+ assertEquals(choice, data.getString("invoiceChoice"));
|
|
|
+ assertFalse(data.containsKey("carrierNum"));
|
|
|
+ assertFalse(data.containsKey("buyerUbn"));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ verify(merchants, times(12)).requireOrderAccess(11L, 7L);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ void missingInvoiceDoesNotInventPaperChoice() {
|
|
|
+ try (var auth = mockStatic(AuthContext.class); var messages = mockStatic(MessageUtils.class)) {
|
|
|
+ auth.when(AuthContext::requireUserId).thenReturn(21L);
|
|
|
+ InfoUser actor = new InfoUser(); actor.setUserId(21L); actor.setUserType("0");
|
|
|
+ when(users.getById(21L)).thenReturn(actor);
|
|
|
+ JSONObject data = (JSONObject) controller.getorderxq("token", "ORDER-1").get("data");
|
|
|
+ assertTrue(data.containsKey("invoiceChoice"));
|
|
|
+ assertNull(data.get("invoiceChoice"));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ void unauthorizedCustomerDoesNotReadInvoice() {
|
|
|
+ try (var auth = mockStatic(AuthContext.class); var messages = mockStatic(MessageUtils.class)) {
|
|
|
+ auth.when(AuthContext::requireUserId).thenReturn(99L);
|
|
|
+ InfoUser actor = new InfoUser(); actor.setUserId(99L); actor.setUserType("0");
|
|
|
+ when(users.getById(99L)).thenReturn(actor);
|
|
|
+ assertThrows(ServiceException.class, () -> controller.getorderxq("token", "ORDER-1"));
|
|
|
+ verifyNoInteractions(invoices);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ void unauthorizedMerchantDoesNotReadInvoice() {
|
|
|
+ try (var auth = mockStatic(AuthContext.class)) {
|
|
|
+ auth.when(AuthContext::requireUserId).thenReturn(11L);
|
|
|
+ InfoUser actor = new InfoUser(); actor.setUserId(11L); actor.setUserType("5");
|
|
|
+ when(users.getById(11L)).thenReturn(actor);
|
|
|
+ doThrow(new ServiceException("denied")).when(merchants).requireOrderAccess(11L, 7L);
|
|
|
+ assertThrows(ServiceException.class, () -> controller.getorderxq("token", "ORDER-1"));
|
|
|
+ verifyNoInteractions(invoices);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ void riderReadsChoiceOnlyAfterScopedOrderLookup() {
|
|
|
+ PosOrderQsOprateController rider = new PosOrderQsOprateController();
|
|
|
+ ReflectionTestUtils.setField(rider, "orderInvoiceService", invoiceService);
|
|
|
+ ReflectionTestUtils.setField(rider, "posOrderService", orders);
|
|
|
+ ReflectionTestUtils.setField(rider, "posStoreService", mock(IPosStoreService.class));
|
|
|
+ ReflectionTestUtils.setField(rider, "infoUserService", users);
|
|
|
+ TableInfoHelper.initTableInfo(new MapperBuilderAssistant(new MybatisConfiguration(), ""), PosOrder.class);
|
|
|
+ try (var messages = mockStatic(MessageUtils.class)) {
|
|
|
+ String token = JwtUtil.token("88", "rider");
|
|
|
+ for (String choice : List.of("PAPER", "PHONE_BARCODE", "CITIZEN", "MEMBER", "LOVE_CODE", "COMPANY")) {
|
|
|
+ PosOrderInvoice invoice = new PosOrderInvoice(); invoice.setInvoiceChoice(choice);
|
|
|
+ when(invoices.selectOne(any(Wrapper.class))).thenReturn(invoice);
|
|
|
+ JSONObject data = (JSONObject) rider.getOrderDetial(token, "ORDER-1").get("data");
|
|
|
+ assertEquals(choice, data.getString("invoiceChoice"));
|
|
|
+ }
|
|
|
+ ArgumentCaptor<LambdaQueryWrapper<PosOrder>> query = ArgumentCaptor.forClass(LambdaQueryWrapper.class);
|
|
|
+ verify(orders, times(6)).getOne(query.capture());
|
|
|
+ query.getValue().getSqlSegment();
|
|
|
+ assertTrue(query.getValue().getParamNameValuePairs().containsValue(88L));
|
|
|
+ assertTrue(query.getValue().getParamNameValuePairs().containsValue("ORDER-1"));
|
|
|
+ clearInvocations(invoices);
|
|
|
+ when(orders.getOne(any(Wrapper.class))).thenReturn(null);
|
|
|
+ assertThrows(ServiceException.class, () -> rider.getOrderDetial(token, "ORDER-1"));
|
|
|
+ verifyNoInteractions(invoices);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ void queryReadsOnlyChoiceForTheAuthorizedOrderAndKeepsBlankUnknown() {
|
|
|
+ PosOrderInvoice invoice = new PosOrderInvoice(); invoice.setInvoiceChoice(" ");
|
|
|
+ when(invoices.selectOne(any(Wrapper.class))).thenReturn(invoice);
|
|
|
+ assertNull(invoiceService.getInvoiceChoice(7L));
|
|
|
+ ArgumentCaptor<LambdaQueryWrapper<PosOrderInvoice>> query = ArgumentCaptor.forClass(LambdaQueryWrapper.class);
|
|
|
+ verify(invoices).selectOne(query.capture());
|
|
|
+ assertEquals("invoice_choice", query.getValue().getSqlSelect());
|
|
|
+ assertTrue(query.getValue().getSqlSegment().contains("order_id"));
|
|
|
+ assertEquals(List.of(7L), List.copyOf(query.getValue().getParamNameValuePairs().values()));
|
|
|
+ clearInvocations(invoices);
|
|
|
+ assertNull(invoiceService.getInvoiceChoice(null));
|
|
|
+ verifyNoInteractions(invoices);
|
|
|
+ }
|
|
|
+}
|