package com.ruoyi.system.service.impl; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import java.util.List; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.system.domain.TTestDataRevisionAction; import com.ruoyi.system.domain.TTestDataOverride; import com.ruoyi.system.mapper.TTestMapper; /** Ticket26:修订行为按一次提交查询,且三类数据与三类操作均受服务端约束。 */ @ExtendWith(MockitoExtension.class) class TestConsoleDataRevisionQueryServiceTest { @Mock private TTestMapper mapper; @InjectMocks private TestConsoleDataServiceImpl service; private TTestDataRevisionAction query; @BeforeEach void setUp() { query = new TTestDataRevisionAction(); query.setTestId(26L); query.setDataType("STEP"); query.setOperationType("EDIT"); } @Test void delegatesOneActionQueryWithFilters() { TTestDataRevisionAction action = new TTestDataRevisionAction(); action.setActionId(101L); when(mapper.selectDataRevisionActions(query)).thenReturn(List.of(action)); assertEquals(101L, service.selectActions(query).get(0).getActionId()); verify(mapper).selectDataRevisionActions(query); } @Test void rejectsUnknownDataTypeAndOperation() { query.setDataType("CELL"); assertThrows(ServiceException.class, () -> service.selectActions(query)); query.setDataType("CYCLE"); query.setOperationType("RESTORE"); assertThrows(ServiceException.class, () -> service.selectActions(query)); } @Test void returnsReadOnlyActionDetail() { TTestDataRevisionAction action = new TTestDataRevisionAction(); action.setActionId(99L); action.setOperationType("DELETE"); when(mapper.selectDataRevisionActionById(99L)).thenReturn(action); assertEquals("DELETE", service.selectActionById(99L).getOperationType()); assertThrows(ServiceException.class, () -> service.selectActionById(0L)); } @Test void rejectsIdentitySummaryThatDoesNotMatchOverrides() { TTestDataRevisionAction action = new TTestDataRevisionAction(); action.setTestId(26L); action.setDataType("REALTIME"); action.setOperationType("DELETE"); action.setScopeSummary("删除一条实时数据"); action.setIdentitySummary("[\"record-1\"]"); action.setReason("异常点"); action.setOperatorName("tester"); TTestDataOverride override = new TTestDataOverride(); override.setStableIdentity("record-2"); override.setDeleted(true); assertThrows(ServiceException.class, () -> service.submitAction(action, List.of(override), List.of(), List.of())); } @Test void rejectsIdentitySummaryWithExtraIdentity() { TTestDataRevisionAction action = new TTestDataRevisionAction(); action.setTestId(26L); action.setDataType("STEP"); action.setOperationType("DELETE"); action.setScopeSummary("删除一条工步数据"); action.setIdentitySummary("[\"step:1:2:3:4\",\"step:1:2:3:5\"]"); action.setReason("异常工步"); action.setOperatorName("tester"); TTestDataOverride override = new TTestDataOverride(); override.setStableIdentity("step:1:2:3:4"); override.setDeleted(true); assertThrows(ServiceException.class, () -> service.submitAction(action, List.of(override), List.of(), List.of())); } @Test void keepsOriginalSamplesWhenDeletingStepAggregate() { TTestDataRevisionAction action = new TTestDataRevisionAction(); action.setTestId(26L); action.setDataType("STEP"); action.setOperationType("DELETE"); action.setScopeSummary("删除一条工步数据"); action.setIdentitySummary("[\"step:1:2:3:4\"]"); action.setReason("异常工步"); action.setOperatorName("tester"); TTestDataOverride override = new TTestDataOverride(); override.setStableIdentity("step:1:2:3:4"); override.setDeleted(true); service.submitAction(action, List.of(override), List.of(), List.of()); verify(mapper).insertDataRevisionAction(action); verify(mapper).upsertDataOverride(override); org.mockito.Mockito.verifyNoMoreInteractions(mapper); } }