package com.sshmanager.service; import com.fasterxml.jackson.databind.ObjectMapper; import com.sshmanager.dto.SessionTreeLayoutDto; import com.sshmanager.dto.SessionTreeNodeDto; import com.sshmanager.entity.SessionTreeLayout; import com.sshmanager.repository.SessionTreeLayoutRepository; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.ArgumentCaptor; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import java.util.Arrays; import java.util.Collections; import java.util.Optional; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @ExtendWith(MockitoExtension.class) @SuppressWarnings("null") class SessionTreeLayoutServiceTest { @Mock private SessionTreeLayoutRepository sessionTreeLayoutRepository; @Mock private ObjectMapper objectMapper; @InjectMocks private SessionTreeLayoutService sessionTreeLayoutService; @Test void getLayoutReturnsEmptyWhenNoSavedData() { when(sessionTreeLayoutRepository.findByUserId(1L)).thenReturn(Optional.empty()); SessionTreeLayoutDto result = sessionTreeLayoutService.getLayout(1L); assertTrue(result.getNodes().isEmpty()); assertEquals("manual", result.getSortMode()); } @Test void getLayoutParsesSavedJson() throws Exception { SessionTreeLayout saved = new SessionTreeLayout(); saved.setUserId(1L); saved.setLayoutJson("{\"nodes\":[{\"id\":\"n1\"}]}"); SessionTreeLayoutDto parsed = new SessionTreeLayoutDto(Arrays.asList( new SessionTreeNodeDto("n1", "folder", "ζˆ‘ηš„θΏžζŽ₯", null, 0, null, true, 1L, 1L) )); parsed.setSortMode(null); when(sessionTreeLayoutRepository.findByUserId(1L)).thenReturn(Optional.of(saved)); when(objectMapper.readValue(saved.getLayoutJson(), SessionTreeLayoutDto.class)).thenReturn(parsed); SessionTreeLayoutDto result = sessionTreeLayoutService.getLayout(1L); assertEquals(1, result.getNodes().size()); assertEquals("n1", result.getNodes().get(0).getId()); assertEquals("manual", result.getSortMode()); } @Test void saveLayoutNormalizesNullNodes() throws Exception { SessionTreeLayoutDto request = new SessionTreeLayoutDto(); request.setNodes(null); request.setSortMode("unknown"); when(sessionTreeLayoutRepository.findByUserId(1L)).thenReturn(Optional.empty()); when(objectMapper.writeValueAsString(any(SessionTreeLayoutDto.class))).thenReturn("{\"nodes\":[]}"); SessionTreeLayoutDto result = sessionTreeLayoutService.saveLayout(1L, request); assertTrue(result.getNodes().isEmpty()); assertEquals("manual", result.getSortMode()); ArgumentCaptor captor = ArgumentCaptor.forClass(SessionTreeLayout.class); verify(sessionTreeLayoutRepository).save(captor.capture()); assertEquals(1L, captor.getValue().getUserId().longValue()); assertEquals("{\"nodes\":[]}", captor.getValue().getLayoutJson()); } @Test void saveLayoutCreatesEmptyPayloadWhenRequestIsNull() throws Exception { when(sessionTreeLayoutRepository.findByUserId(1L)).thenReturn(Optional.empty()); when(objectMapper.writeValueAsString(any(SessionTreeLayoutDto.class))).thenReturn("{\"nodes\":[]}"); SessionTreeLayoutDto result = sessionTreeLayoutService.saveLayout(1L, null); assertEquals(Collections.emptyList(), result.getNodes()); assertEquals("manual", result.getSortMode()); } }