package com.ruoyi.account.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.account.api.dto.VinAppletBindDTO; import com.ruoyi.account.api.dto.VinManagementExcelDTO; import com.ruoyi.account.api.dto.VinManagementQueryDTO; import com.ruoyi.account.api.dto.VinManagementSaveDTO; import com.ruoyi.account.api.model.TVinManagement; import com.ruoyi.account.service.TVinManagementService; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.security.service.TokenService; import com.ruoyi.system.api.model.LoginUserApplet; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.junit.jupiter.api.Test; import org.mockito.ArgumentCaptor; import org.springframework.mock.web.MockHttpServletResponse; import org.springframework.mock.web.MockMultipartFile; import org.springframework.test.util.ReflectionTestUtils; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.math.BigDecimal; import java.util.Arrays; import java.util.Collections; import java.util.List; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertSame; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyList; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoInteractions; import static org.mockito.Mockito.when; class TVinManagementControllerTest { private TVinManagementController buildController(TVinManagementService service) { TVinManagementController controller = new TVinManagementController(); ReflectionTestUtils.setField(controller, "service", service); return controller; } @Test void pageReturnsOkWithPageData() { TVinManagementService service = mock(TVinManagementService.class); Page page = new Page<>(1, 10); page.setRecords(Collections.singletonList(new TVinManagement())); when(service.selectPageList(any())).thenReturn(page); TVinManagementController controller = buildController(service); VinManagementQueryDTO query = new VinManagementQueryDTO(); query.setVin("LSV"); R result = controller.page(query); assertEquals(200, result.getCode()); assertSame(page, result.getData()); verify(service).selectPageList(query); } @Test void addReturnsOkWhenSaved() { TVinManagementService service = mock(TVinManagementService.class); when(service.saveVin(any())).thenReturn(true); TVinManagementController controller = buildController(service); VinManagementSaveDTO dto = new VinManagementSaveDTO(); dto.setVin("LSVAM4187C2184842"); R result = controller.add(dto); assertEquals(200, result.getCode()); assertEquals(Boolean.TRUE, result.getData()); verify(service).saveVin(dto); } @Test void editReturnsOkWhenUpdated() { TVinManagementService service = mock(TVinManagementService.class); when(service.updateVin(any())).thenReturn(true); TVinManagementController controller = buildController(service); VinManagementSaveDTO dto = new VinManagementSaveDTO(); dto.setId(9L); dto.setVin("LSVAM4187C2184842"); R result = controller.edit(dto); assertEquals(200, result.getCode()); assertEquals(Boolean.TRUE, result.getData()); verify(service).updateVin(dto); } @Test void deleteReturnsOkWhenRemoved() { TVinManagementService service = mock(TVinManagementService.class); when(service.deleteVins(anyList())).thenReturn(true); TVinManagementController controller = buildController(service); List ids = Arrays.asList(1L, 2L); R result = controller.delete(ids); assertEquals(200, result.getCode()); assertEquals(Boolean.TRUE, result.getData()); verify(service).deleteVins(ids); } @Test void unbindFleetReturnsAffectedCount() { TVinManagementService service = mock(TVinManagementService.class); when(service.unbindFleet(anyList())).thenReturn(2); TVinManagementController controller = buildController(service); List ids = Arrays.asList(1L, 2L); R result = controller.unbindFleet(ids); assertEquals(200, result.getCode()); assertEquals(Integer.valueOf(2), result.getData()); verify(service).unbindFleet(ids); } @Test void statusDelegatesIdAndStatusFromDto() { TVinManagementService service = mock(TVinManagementService.class); when(service.updateStatus(9L, 2)).thenReturn(true); TVinManagementController controller = buildController(service); VinManagementSaveDTO dto = new VinManagementSaveDTO(); dto.setId(9L); dto.setStatus(2); R result = controller.status(dto); assertEquals(200, result.getCode()); assertEquals(Boolean.TRUE, result.getData()); verify(service).updateStatus(9L, 2); } @Test void exportWritesExcelAndDelegatesQuery() throws Exception { TVinManagementService service = mock(TVinManagementService.class); VinManagementExcelDTO item = new VinManagementExcelDTO(); item.setVin("LSVAM4187C2184842"); item.setStatus("1"); when(service.selectExportList(any())).thenReturn(Collections.singletonList(item)); TVinManagementController controller = buildController(service); MockHttpServletResponse response = new MockHttpServletResponse(); VinManagementQueryDTO query = new VinManagementQueryDTO(); query.setStatus(1); controller.export(response, query); assertTrue(response.getContentType().contains("spreadsheetml")); assertTrue(response.getContentAsByteArray().length > 0); verify(service).selectExportList(query); } @Test void templateDownloadsImportTemplateExcel() { TVinManagementService service = mock(TVinManagementService.class); TVinManagementController controller = buildController(service); MockHttpServletResponse response = new MockHttpServletResponse(); controller.template(response); assertTrue(response.getContentType().contains("spreadsheetml")); assertTrue(response.getContentAsByteArray().length > 0); verifyNoInteractions(service); } @Test void importDataParsesExcelAndReturnsResult() throws Exception { TVinManagementService service = mock(TVinManagementService.class); when(service.importVins(anyList())).thenReturn("成功导入1条VIN码数据"); TVinManagementController controller = buildController(service); MockMultipartFile file = vinExcelFile(); R result = controller.importData(file); assertEquals(200, result.getCode()); assertEquals("成功导入1条VIN码数据", result.getData()); @SuppressWarnings("unchecked") ArgumentCaptor> captor = ArgumentCaptor.forClass(List.class); verify(service).importVins(captor.capture()); assertEquals(1, captor.getValue().size()); VinManagementExcelDTO parsed = captor.getValue().get(0); assertEquals("LSVAM4187C2184842", parsed.getVin()); assertEquals("川A12345", parsed.getPlateNumber()); assertEquals("13800138000", parsed.getPhone()); assertEquals("测试公司", parsed.getCompanyName()); assertEquals("1", parsed.getStatus()); } @Test void templateHeaderUsesRenamedColumnsWithoutRemark() throws Exception { TVinManagementService service = mock(TVinManagementService.class); TVinManagementController controller = buildController(service); MockHttpServletResponse response = new MockHttpServletResponse(); controller.template(response); Row header = workbookHeader(response); assertEquals(5, header.getLastCellNum()); assertEquals("VIN码", header.getCell(0).getStringCellValue()); assertEquals("车牌号", header.getCell(1).getStringCellValue()); assertEquals("联系人手机号", header.getCell(2).getStringCellValue()); assertEquals("所属公司", header.getCell(3).getStringCellValue()); assertEquals("启停状态", header.getCell(4).getStringCellValue()); } @Test void exportHeaderAndAccountColumnsFollowListCaliber() throws Exception { TVinManagementService service = mock(TVinManagementService.class); VinManagementExcelDTO item = new VinManagementExcelDTO(); item.setVin("LSVAM4187C2184842"); item.setPlateNumber("川A12345"); item.setPhone("13800138000"); item.setCompanyName("测试公司"); item.setFleetName("测试车队"); item.setAccountMode(1); item.setAvailableBalance(new BigDecimal("10.50")); item.setOverrun(new BigDecimal("2.00")); item.setAccountStatus(2); item.setStatus("1"); when(service.selectExportList(any())).thenReturn(Collections.singletonList(item)); TVinManagementController controller = buildController(service); MockHttpServletResponse response = new MockHttpServletResponse(); controller.export(response, new VinManagementQueryDTO()); Workbook workbook = new XSSFWorkbook(new ByteArrayInputStream(response.getContentAsByteArray())); Row header = workbook.getSheetAt(0).getRow(0); assertEquals(10, header.getLastCellNum()); assertEquals("VIN码", header.getCell(0).getStringCellValue()); assertEquals("车牌号", header.getCell(1).getStringCellValue()); assertEquals("联系人手机号", header.getCell(2).getStringCellValue()); assertEquals("所属公司", header.getCell(3).getStringCellValue()); assertEquals("所属车队", header.getCell(4).getStringCellValue()); assertEquals("账户模式", header.getCell(5).getStringCellValue()); assertEquals("可用余额", header.getCell(6).getStringCellValue()); assertEquals("超额", header.getCell(7).getStringCellValue()); assertEquals("账户状态", header.getCell(8).getStringCellValue()); assertEquals("启停状态", header.getCell(9).getStringCellValue()); Row data = workbook.getSheetAt(0).getRow(1); assertEquals("共享模式", data.getCell(5).getStringCellValue()); assertEquals(10.5D, data.getCell(6).getNumericCellValue()); assertEquals(2.0D, data.getCell(7).getNumericCellValue()); assertEquals("欠款", data.getCell(8).getStringCellValue()); assertEquals("启用", data.getCell(9).getStringCellValue()); } private Row workbookHeader(MockHttpServletResponse response) throws Exception { Workbook workbook = new XSSFWorkbook(new ByteArrayInputStream(response.getContentAsByteArray())); return workbook.getSheetAt(0).getRow(0); } @Test void appletEndpointsUseTokenUserId() { TVinManagementService service = mock(TVinManagementService.class); TokenService tokenService = mock(TokenService.class); LoginUserApplet loginUser = new LoginUserApplet(); loginUser.setUserId(88L); when(tokenService.getLoginUserApplet()).thenReturn(loginUser); when(service.selectAppletVehicleList(88L)).thenReturn(Collections.singletonList(new TVinManagement())); when(service.bindAppletVehicle(88L, "VIN001")).thenReturn(true); when(service.unbindAppletVehicle(9L, 88L)).thenReturn(true); TVinManagementController controller = buildController(service); ReflectionTestUtils.setField(controller, "tokenService", tokenService); VinAppletBindDTO bindDTO = new VinAppletBindDTO(); bindDTO.setKeyword("VIN001"); assertEquals(1, controller.appletVehicles().getData().size()); assertEquals(Boolean.TRUE, controller.bindAppletVehicle(bindDTO).getData()); assertEquals(Boolean.TRUE, controller.unbindAppletVehicle(9L).getData()); verify(service).selectAppletVehicleList(88L); verify(service).bindAppletVehicle(88L, "VIN001"); verify(service).unbindAppletVehicle(9L, 88L); } @Test void innerIdsEndpointDelegatesAppUserId() { TVinManagementService service = mock(TVinManagementService.class); when(service.getVinIdsByAppUserId(88L)).thenReturn(Arrays.asList(1L, 2L)); TVinManagementController controller = buildController(service); assertEquals(Arrays.asList(1L, 2L), controller.getVinIdsByAppUserId(88L).getData()); } @Test void innerListByIdsDelegatesDistinctIds() { TVinManagementService service = mock(TVinManagementService.class); TVinManagement record = new TVinManagement(); record.setId(1L); when(service.listByIds(Arrays.asList(1L, 2L))).thenReturn(Collections.singletonList(record)); TVinManagementController controller = buildController(service); R> result = controller.listByIds(Arrays.asList(1L, 1L, null, 2L)); assertEquals(200, result.getCode()); assertEquals(1, result.getData().size()); assertEquals(Long.valueOf(1L), result.getData().get(0).getId()); verify(service).listByIds(Arrays.asList(1L, 2L)); } @Test void innerListByIdsReturnsEmptyWhenIdsBlank() { TVinManagementService service = mock(TVinManagementService.class); TVinManagementController controller = buildController(service); R> emptyResult = controller.listByIds(Collections.emptyList()); R> nullResult = controller.listByIds(null); assertEquals(200, emptyResult.getCode()); assertTrue(emptyResult.getData().isEmpty()); assertEquals(200, nullResult.getCode()); assertTrue(nullResult.getData().isEmpty()); verifyNoInteractions(service); } private MockMultipartFile vinExcelFile() throws Exception { try (XSSFWorkbook workbook = new XSSFWorkbook(); ByteArrayOutputStream output = new ByteArrayOutputStream()) { Sheet sheet = workbook.createSheet("VIN码数据"); Row header = sheet.createRow(0); header.createCell(0).setCellValue("VIN码"); header.createCell(1).setCellValue("车牌号"); header.createCell(2).setCellValue("联系人手机号"); header.createCell(3).setCellValue("所属公司"); header.createCell(4).setCellValue("启停状态"); Row row = sheet.createRow(1); row.createCell(0).setCellValue("LSVAM4187C2184842"); row.createCell(1).setCellValue("川A12345"); row.createCell(2).setCellValue("13800138000"); row.createCell(3).setCellValue("测试公司"); row.createCell(4).setCellValue("启用"); workbook.write(output); return new MockMultipartFile("file", "vin.xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", output.toByteArray()); } } }