Skip to content

Commit 2b54a64

Browse files
Sihun23Sihun23
authored andcommitted
CLAP-253 test:단위테스트 코드 작성
1 parent 7030671 commit 2b54a64

File tree

1 file changed

+109
-0
lines changed

1 file changed

+109
-0
lines changed
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
package clap.server.application.service.admin;
2+
3+
import clap.server.application.service.admin.CsvParseService;
4+
import clap.server.application.port.outbound.member.LoadDepartmentPort;
5+
import clap.server.domain.model.member.Department;
6+
import clap.server.domain.model.member.Member;
7+
import clap.server.exception.ApplicationException;
8+
import clap.server.exception.code.MemberErrorCode;
9+
import org.junit.jupiter.api.BeforeEach;
10+
import org.junit.jupiter.api.Test;
11+
import org.mockito.Mockito;
12+
import org.springframework.mock.web.MockMultipartFile;
13+
import org.springframework.web.multipart.MultipartFile;
14+
15+
import java.io.IOException;
16+
import java.util.Optional;
17+
18+
import static org.junit.jupiter.api.Assertions.*;
19+
import static org.mockito.Mockito.when;
20+
21+
public class CsvParseServiceTest {
22+
23+
private LoadDepartmentPort loadDepartmentPort;
24+
private CsvParseService csvParseService;
25+
26+
@BeforeEach
27+
public void setup() {
28+
loadDepartmentPort = Mockito.mock(LoadDepartmentPort.class);
29+
csvParseService = new CsvParseService(loadDepartmentPort);
30+
}
31+
32+
/**
33+
* 정상 케이스:
34+
* CSV 파일에 헤더와 하나의 데이터 행이 있는 경우 올바르게 파싱되는지 검증.
35+
* name, nickname, departmentId, departmentRole, email, role, isReviewer -> 실제 CSV 파일의 columm 순서
36+
*/
37+
@Test
38+
public void testParseValidCsv() {
39+
// CSV 파일 (첫 번째 줄은 헤더)
40+
String csvContent = "name,nickname,departmentId,departmentRole,email,role,isReviewer\n" +
41+
"양시훈,leo,1,dev,sihun123@gmail.com,ROLE_USER,false\n";
42+
MultipartFile file = new MockMultipartFile("file", "members.csv", "text/csv", csvContent.getBytes());
43+
44+
Department dummyDepartment = Department.builder().departmentId(1L).name("dev").build();
45+
when(loadDepartmentPort.findById(1L)).thenReturn(Optional.of(dummyDepartment));
46+
47+
// CSV 파싱
48+
java.util.List<Member> members = csvParseService.parse(file);
49+
50+
// 검증
51+
assertNotNull(members);
52+
assertEquals(1, members.size());
53+
Member member = members.get(0);
54+
assertEquals("양시훈", member.getMemberInfo().getName());
55+
assertEquals("leo", member.getMemberInfo().getNickname());
56+
assertEquals("sihun123@gmail.com", member.getMemberInfo().getEmail());
57+
assertEquals("dev", member.getMemberInfo().getDepartment().getName());
58+
assertEquals("ROLE_USER", member.getMemberInfo().getRole().name());
59+
assertFalse(member.getMemberInfo().isReviewer());
60+
}
61+
62+
/**
63+
* 잘못된 컬럼 개수 케이스:
64+
* CSV 파일에 데이터 행의 컬럼 수가 7개가 아니면 예외가 발생하는지 검증
65+
*/
66+
@Test
67+
public void testParseCsvWithInvalidColumnCount() {
68+
// 6개 컬럼만 있는 데이터
69+
String csvContent = "name,nickname,departmentId,departmentRole,email,role,isReviewer\n" +
70+
"김민수,minsoo,2,Infra,minsoo@naver.com,ROLE_ADMIN\n";
71+
MultipartFile file = new MockMultipartFile("file", "members.csv", "text/csv", csvContent.getBytes());
72+
73+
ApplicationException exception = assertThrows(ApplicationException.class, () -> {
74+
csvParseService.parse(file);
75+
});
76+
assertEquals(MemberErrorCode.INVALID_CSV_FORMAT.getCustomCode(), exception.getCode().getCustomCode());
77+
}
78+
79+
/**
80+
* 빈 파일 케이스:
81+
* CSV 파일이 완전히 비어 있으면 헤더를 읽지 못해 예외가 발생하는지 검증
82+
*/
83+
@Test
84+
public void testParseEmptyFileThrowsException() {
85+
String csvContent = "";
86+
MultipartFile file = new MockMultipartFile("file", "empty.csv", "text/csv", csvContent.getBytes());
87+
88+
ApplicationException exception = assertThrows(ApplicationException.class, () -> {
89+
csvParseService.parse(file);
90+
});
91+
assertEquals(MemberErrorCode.INVALID_CSV_FORMAT.getCustomCode(), exception.getCode().getCustomCode());
92+
}
93+
94+
/**
95+
* IOException 발생 케이스:
96+
* MultipartFile의 getInputStream() 호출 시 IOException이 발생하면 예외가 발생하는지 검증
97+
*/
98+
@Test
99+
public void testParseIOExceptionThrowsException() throws IOException {
100+
// getInputStream() 호출 시 IOException을 던지는 mock MultipartFile 생성
101+
MultipartFile file = Mockito.mock(MultipartFile.class);
102+
when(file.getInputStream()).thenThrow(new IOException("IO error"));
103+
104+
ApplicationException exception = assertThrows(ApplicationException.class, () -> {
105+
csvParseService.parse(file);
106+
});
107+
assertEquals(MemberErrorCode.CSV_PARSING_ERROR.getCustomCode(), exception.getCode().getCustomCode());
108+
}
109+
}

0 commit comments

Comments
 (0)