|
@@ -0,0 +1,142 @@
|
|
|
|
|
+package com.zksy.web.controller.mobile;
|
|
|
|
|
+
|
|
|
|
|
+import com.zksy.base.alarm.service.*;
|
|
|
|
|
+import com.zksy.base.service.EquipmentBaseService;
|
|
|
|
|
+import com.zksy.ops.dto.InspectTaskCompleteDTO;
|
|
|
|
|
+import com.zksy.ops.dto.InspectTaskPageDTO;
|
|
|
|
|
+import com.zksy.ops.dto.WorkOrderPageDTO;
|
|
|
|
|
+import com.zksy.ops.service.InspectTaskService;
|
|
|
|
|
+import com.zksy.ops.service.WorkOrderService;
|
|
|
|
|
+import com.zksy.system.domain.SysNotice;
|
|
|
|
|
+import com.zksy.system.service.*;
|
|
|
|
|
+import com.zksy.web.controller.alarm.AlarmController;
|
|
|
|
|
+import com.zksy.web.controller.base.EquipmentBaseController;
|
|
|
|
|
+import com.zksy.web.controller.monitor.SysLogininforController;
|
|
|
|
|
+import com.zksy.web.controller.ops.InspectTaskController;
|
|
|
|
|
+import com.zksy.web.controller.ops.WorkOrderController;
|
|
|
|
|
+import com.zksy.web.controller.system.SysNoticeController;
|
|
|
|
|
+import com.zksy.web.controller.system.SysUserController;
|
|
|
|
|
+import org.junit.jupiter.api.*;
|
|
|
|
|
+import org.springframework.mock.web.MockHttpServletRequest;
|
|
|
|
|
+import org.springframework.security.access.prepost.PreAuthorize;
|
|
|
|
|
+import org.springframework.test.web.servlet.MockMvc;
|
|
|
|
|
+import org.springframework.test.web.servlet.setup.MockMvcBuilders;
|
|
|
|
|
+import org.springframework.web.method.HandlerMethod;
|
|
|
|
|
+import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
|
|
|
|
|
+import java.util.*;
|
|
|
|
|
+import static org.junit.jupiter.api.Assertions.*;
|
|
|
|
|
+import static org.mockito.Mockito.*;
|
|
|
|
|
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
|
|
|
|
|
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
|
|
|
|
|
+
|
|
|
|
|
+class MobileControllerMappingTest {
|
|
|
|
|
+ private final WorkOrderService orders = mock(WorkOrderService.class);
|
|
|
|
|
+ private final InspectTaskService inspections = mock(InspectTaskService.class);
|
|
|
|
|
+ private final EquipmentBaseService equipment = mock(EquipmentBaseService.class);
|
|
|
|
|
+ private final ISysNoticeService notices = mock(ISysNoticeService.class);
|
|
|
|
|
+ private final ISysLogininforService loginLogs = mock(ISysLogininforService.class);
|
|
|
|
|
+ private final Object[] mobile = {
|
|
|
|
|
+ new MobileAlarmController(mock(AlarmOperationsService.class), mock(AlarmReviewService.class), mock(AlarmReviewAttachmentService.class)),
|
|
|
|
|
+ new MobileWorkOrderController(orders), new MobileInspectTaskController(inspections),
|
|
|
|
|
+ new MobileEquipmentController(equipment), new MobileNoticeController(notices),
|
|
|
|
|
+ new MobileLogininforController(loginLogs), new MobileContactsController(mock(ISysUserService.class)),
|
|
|
|
|
+ new MobileOfficeController(equipment, mock(AlarmOperationsService.class), inspections)
|
|
|
|
|
+ };
|
|
|
|
|
+ private MockMvc mvc;
|
|
|
|
|
+ private RequestMappingHandlerMapping mapping;
|
|
|
|
|
+
|
|
|
|
|
+ @BeforeEach void setup() {
|
|
|
|
|
+ List<Object> controllers = new ArrayList<>(Arrays.asList(mobile));
|
|
|
|
|
+ controllers.addAll(Arrays.asList(new AlarmController(), new WorkOrderController(), new InspectTaskController(),
|
|
|
|
|
+ new EquipmentBaseController(), new SysNoticeController(), new SysLogininforController(), new SysUserController()));
|
|
|
|
|
+ // Register PC and mobile together: duplicate mappings must fail at startup.
|
|
|
|
|
+ mvc = MockMvcBuilders.standaloneSetup(controllers.toArray()).build();
|
|
|
|
|
+ mapping = mvc.getDispatcherServlet().getWebApplicationContext().getBean(RequestMappingHandlerMapping.class);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private void route(String method, String url, Class<?> owner) throws Exception {
|
|
|
|
|
+ var chain = mapping.getHandler(new MockHttpServletRequest(method, url));
|
|
|
|
|
+ assertNotNull(chain, method + " " + url);
|
|
|
|
|
+ assertEquals(owner, ((HandlerMethod) chain.getHandler()).getBeanType(), method + " " + url);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Test void mobileUrlsUseUnifiedPrefixAndResolveToDedicatedControllers() throws Exception {
|
|
|
|
|
+ for (String path : new String[] {"", "/pending", "/42", "/assignable/users"})
|
|
|
|
|
+ route("GET", "/api/mobile/ops/workOrder" + path, MobileWorkOrderController.class);
|
|
|
|
|
+ for (String path : new String[] {"/findByPage", "/42"})
|
|
|
|
|
+ route("GET", "/api/mobile/ops/inspectTask" + path, MobileInspectTaskController.class);
|
|
|
|
|
+ route("PUT", "/api/mobile/ops/inspectTask/complete", MobileInspectTaskController.class);
|
|
|
|
|
+ for (String path : new String[] {"", "/device-1"})
|
|
|
|
|
+ route("GET", "/api/mobile/equipment-base" + path, MobileEquipmentController.class);
|
|
|
|
|
+ for (String path : new String[] {"/list", "/42"})
|
|
|
|
|
+ route("GET", "/api/mobile/notice" + path, MobileNoticeController.class);
|
|
|
|
|
+ route("GET", "/api/mobile/monitor/logininfor/list", MobileLogininforController.class);
|
|
|
|
|
+ route("GET", "/api/mobile/contacts", MobileContactsController.class);
|
|
|
|
|
+ route("GET", "/api/mobile/office/summary", MobileOfficeController.class);
|
|
|
|
|
+ for (String path : new String[] {"", "/a1", "/a1/logs"})
|
|
|
|
|
+ route("GET", "/api/mobile/alarm" + path, MobileAlarmController.class);
|
|
|
|
|
+ for (String path : new String[] {"/a1/reviews", "/a1/attachments"})
|
|
|
|
|
+ route("POST", "/api/mobile/alarm" + path, MobileAlarmController.class);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Test void pcAndSharedOperationUrlsKeepTheirOwners() throws Exception {
|
|
|
|
|
+ route("GET", "/api/ops/workOrder", WorkOrderController.class);
|
|
|
|
|
+ route("GET", "/api/ops/workOrder/42", WorkOrderController.class);
|
|
|
|
|
+ for (String action : new String[] {"dispatch", "accept", "process", "submitVerify", "verify", "cancel", "delay/apply", "delay/audit"})
|
|
|
|
|
+ route("PUT", "/api/ops/workOrder/42/" + action, WorkOrderController.class);
|
|
|
|
|
+ route("GET", "/api/ops/inspectTask/findByPage", InspectTaskController.class);
|
|
|
|
|
+ route("PUT", "/api/ops/inspectTask/complete", InspectTaskController.class);
|
|
|
|
|
+ route("GET", "/equipment-base", EquipmentBaseController.class);
|
|
|
|
|
+ route("GET", "/system/notice/list", SysNoticeController.class);
|
|
|
|
|
+ route("GET", "/monitor/logininfor/list", SysLogininforController.class);
|
|
|
|
|
+ route("GET", "/system/user/list", SysUserController.class);
|
|
|
|
|
+ route("POST", "/api/alarm/a1/reviews", AlarmController.class);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Test void allDedicatedControllersRequireLoginAndDispatchKeepsItsPermission() throws Exception {
|
|
|
|
|
+ for (Object controller : mobile)
|
|
|
|
|
+ assertEquals("isAuthenticated()", controller.getClass().getAnnotation(PreAuthorize.class).value());
|
|
|
|
|
+ assertEquals("@ss.hasPermi('ops:workOrder:dispatch')", MobileWorkOrderController.class
|
|
|
|
|
+ .getMethod("mobileAssignableUsers", String.class).getAnnotation(PreAuthorize.class).value());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Test void equipmentParametersAndPathBindingRemainCompatible() throws Exception {
|
|
|
|
|
+ mvc.perform(get("/api/mobile/equipment-base").param("pageNum", "2").param("pageSize", "20")
|
|
|
|
|
+ .param("keyword", "设备").param("rootTypeId", "2").param("onlineStatus", "1").param("alarmStatus", "1"))
|
|
|
|
|
+ .andExpect(status().isOk());
|
|
|
|
|
+ verify(equipment).findMobileByPage(2, 20, "设备", 2, 1, 1);
|
|
|
|
|
+ mvc.perform(get("/api/mobile/equipment-base/device-1")).andExpect(status().isOk());
|
|
|
|
|
+ verify(equipment).getMobileEquipmentDetail("device-1");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Test void workOrderAndInspectionQueriesReachTheSharedServices() throws Exception {
|
|
|
|
|
+ mvc.perform(get("/api/mobile/ops/workOrder").param("pageNum", "3").param("keyword", "工单"))
|
|
|
|
|
+ .andExpect(status().isOk());
|
|
|
|
|
+ verify(orders).findMobilePage(argThat(query -> query.getPageNum() == 3 && "工单".equals(query.getKeyword())));
|
|
|
|
|
+ mvc.perform(get("/api/mobile/ops/workOrder/pending")).andExpect(status().isOk());
|
|
|
|
|
+ verify(orders).findMobilePendingPage(any(WorkOrderPageDTO.class));
|
|
|
|
|
+ mvc.perform(get("/api/mobile/ops/workOrder/42")).andExpect(status().isOk());
|
|
|
|
|
+ verify(orders).getMobileDetail(42L);
|
|
|
|
|
+ mvc.perform(get("/api/mobile/ops/inspectTask/findByPage")).andExpect(status().isOk());
|
|
|
|
|
+ verify(inspections).findMobileByPage(any(InspectTaskPageDTO.class));
|
|
|
|
|
+ mvc.perform(get("/api/mobile/ops/inspectTask/42")).andExpect(status().isOk());
|
|
|
|
|
+ verify(inspections).getMobileDetailById(42L);
|
|
|
|
|
+ mvc.perform(put("/api/mobile/ops/inspectTask/complete").contentType("application/json")
|
|
|
|
|
+ .content("{\"inspectTaskId\":42,\"realTime\":\"2026-10-14 10:00:00\"}"))
|
|
|
|
|
+ .andExpect(status().isOk());
|
|
|
|
|
+ verify(inspections).completeMobileTask(any(InspectTaskCompleteDTO.class));
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Test void closedNoticeIsStillHiddenAndLoginLogUsesCurrentUserService() throws Exception {
|
|
|
|
|
+ SysNotice notice = new SysNotice(); notice.setNoticeId(42L); notice.setStatus("1");
|
|
|
|
|
+ when(notices.selectNoticeById(42L)).thenReturn(notice);
|
|
|
|
|
+ mvc.perform(get("/api/mobile/notice/42")).andExpect(status().isOk()).andExpect(jsonPath("$.code").value(500));
|
|
|
|
|
+ notice.setStatus("0");
|
|
|
|
|
+ mvc.perform(get("/api/mobile/notice/42")).andExpect(status().isOk()).andExpect(jsonPath("$.data.noticeId").value(42));
|
|
|
|
|
+ when(loginLogs.selectCurrentUserLogininforList()).thenReturn(Collections.emptyList());
|
|
|
|
|
+ mvc.perform(get("/api/mobile/monitor/logininfor/list").param("userName", "ignored"))
|
|
|
|
|
+ .andExpect(status().isOk()).andExpect(jsonPath("$.rows").isArray());
|
|
|
|
|
+ verify(loginLogs).selectCurrentUserLogininforList();
|
|
|
|
|
+ verify(loginLogs, never()).selectLogininforList(any());
|
|
|
|
|
+ }
|
|
|
|
|
+}
|