package com.ruoyi.app.pay; import com.ruoyi.app.pay.dto.RiderIncomePage; import com.ruoyi.common.annotation.Anonymous; import com.ruoyi.common.utils.MessageUtils; import com.ruoyi.system.domain.vo.RiderIncomeItem; import com.ruoyi.system.domain.vo.RiderIncomeSummary; import com.ruoyi.system.utils.Auth; import com.ruoyi.system.utils.AuthContext; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.MockedStatic; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import java.math.BigDecimal; import java.util.List; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; class RiderIncomeControllerTest { private final RiderIncomeService service = mock(RiderIncomeService.class); private MockMvc mvc; private MockedStatic messages; @BeforeEach void setUp() { messages = mockStatic(MessageUtils.class); messages.when(() -> MessageUtils.message(anyString())).thenReturn("ok"); mvc = MockMvcBuilders.standaloneSetup(new RiderIncomeController(service)).build(); } @AfterEach void tearDown() { messages.close(); } @Test void listDefaultsAndAuthenticatedIdentityAreExplicit() throws Exception { var summary = new RiderIncomeSummary(); summary.setTotalIncome(BigDecimal.ZERO); when(service.list(7L, null, null, "ALL", 1, 20)).thenReturn( new RiderIncomePage(null, null, summary, 0, 1, 20, List.of())); mvc.perform(get("/Billing/billing/riderIncome").header("token", "valid") .requestAttr(AuthContext.USER_ID_ATTRIBUTE, 7L).param("riderId", "999")) .andExpect(status().isOk()).andExpect(jsonPath("$.code").value(200)) .andExpect(jsonPath("$.data.summary.totalIncome").value(0)) .andExpect(jsonPath("$.data.periodOptions").doesNotExist()) .andExpect(jsonPath("$.data.list").isEmpty()); verify(service).list(7L, null, null, "ALL", 1, 20); } @Test void listBindsExplicitFiltersAndDetailUsesBillId() throws Exception { mvc.perform(get("/Billing/billing/riderIncome").header("token", "valid") .requestAttr(AuthContext.USER_ID_ATTRIBUTE, 7L) .param("startTime", "2026-11-01 00:00:00").param("endTime", "2026-11-30 23:59:59") .param("orderSource", "FLASH").param("pageNum", "2").param("pageSize", "10")) .andExpect(status().isOk()); verify(service).list(7L, "2026-11-01 00:00:00", "2026-11-30 23:59:59", "FLASH", 2, 10); var item = new RiderIncomeItem(); item.setBillId(90L); item.setIncomeAmount(new BigDecimal("120.00")); item.setOrderNo("FD202611050001"); item.setOrderSource("FLASH"); when(service.detail(7L, 90L)).thenReturn(item); mvc.perform(get("/Billing/billing/riderIncome/90").header("token", "valid") .requestAttr(AuthContext.USER_ID_ATTRIBUTE, 7L)) .andExpect(status().isOk()).andExpect(jsonPath("$.data.billId").value(90)) .andExpect(jsonPath("$.data.incomeAmount").value(120)) .andExpect(jsonPath("$.data.orderNo").value("FD202611050001")) .andExpect(jsonPath("$.data.orderSource").value("FLASH")) .andExpect(jsonPath("$.data.orderId").doesNotExist()) .andExpect(jsonPath("$.data.tipAmount").doesNotExist()) .andExpect(jsonPath("$.data.walletBalance").doesNotExist()); } @Test void tokenIsRequiredAndBothEndpointsUseAuthAspect() throws Exception { mvc.perform(get("/Billing/billing/riderIncome")).andExpect(status().isBadRequest()); mvc.perform(get("/Billing/billing/riderIncome/1")).andExpect(status().isBadRequest()); verifyNoInteractions(service); assertTrue(RiderIncomeController.class.isAnnotationPresent(Anonymous.class)); assertTrue(RiderIncomeController.class.getMethod("list", String.class, String.class, String.class, String.class, Integer.class, Integer.class).isAnnotationPresent(Auth.class)); assertTrue(RiderIncomeController.class.getMethod("detail", String.class, Long.class).isAnnotationPresent(Auth.class)); } }