99 lines
3.7 KiB
Java
99 lines
3.7 KiB
Java
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<SessionTreeLayout> 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());
|
|
}
|
|
}
|