Skip to content

Commit 486d6eb

Browse files
Sihun23Sihun23
authored andcommitted
CLAP-253 test:Usecase 단위 테스트로 변경
1 parent 2b54a64 commit 486d6eb

File tree

2 files changed

+125
-109
lines changed

2 files changed

+125
-109
lines changed

src/test/java/clap/server/application/service/admin/CsvParseServiceTest.java

Lines changed: 0 additions & 109 deletions
This file was deleted.
Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
package clap.server.application.service.admin;
2+
3+
import clap.server.application.port.inbound.domain.MemberService;
4+
import clap.server.application.port.outbound.member.CommandMemberPort;
5+
import clap.server.domain.model.member.Member;
6+
import clap.server.exception.ApplicationException;
7+
import clap.server.exception.code.MemberErrorCode;
8+
import org.junit.jupiter.api.BeforeEach;
9+
import org.junit.jupiter.api.Test;
10+
import org.mockito.Mockito;
11+
import org.springframework.mock.web.MockMultipartFile;
12+
import org.springframework.web.multipart.MultipartFile;
13+
14+
import java.util.List;
15+
16+
import static org.junit.jupiter.api.Assertions.*;
17+
import static org.mockito.Mockito.*;
18+
19+
class RegisterMemberCSVServiceTest {
20+
21+
private RegisterMemberCSVService registerMemberCSVService;
22+
private MemberService memberService;
23+
private CommandMemberPort commandMemberPort;
24+
private CsvParseService csvParseService;
25+
26+
27+
@BeforeEach
28+
void setup() {
29+
memberService = Mockito.mock(MemberService.class);
30+
commandMemberPort = Mockito.mock(CommandMemberPort.class);
31+
csvParseService = Mockito.mock(CsvParseService.class);
32+
registerMemberCSVService = new RegisterMemberCSVService(memberService, commandMemberPort, csvParseService);
33+
}
34+
35+
/**
36+
* 정상적인 회원 등록 테스트
37+
* - 주어진 CSV 파일을 정상적으로 파싱하여 회원이 등록되는지 검증
38+
*/
39+
@Test
40+
void testRegisterMembersFromCsvSuccess() {
41+
Long adminId = 1L;
42+
MultipartFile file = new MockMultipartFile("file", "members.csv", "text/csv", "dummy-content".getBytes());
43+
44+
Member admin = Mockito.mock(Member.class);
45+
List<Member> parsedMembers = List.of(Mockito.mock(Member.class), Mockito.mock(Member.class));
46+
47+
when(memberService.findActiveMember(adminId)).thenReturn(admin);
48+
when(csvParseService.parse(file)).thenReturn(parsedMembers);
49+
50+
int addedCount = registerMemberCSVService.registerMembersFromCsv(adminId, file);
51+
52+
assertEquals(2, addedCount);
53+
verify(commandMemberPort, times(2)).save(any(Member.class));
54+
verify(parsedMembers.get(0), times(1)).register(admin);
55+
verify(parsedMembers.get(1), times(1)).register(admin);
56+
}
57+
58+
/**
59+
* ❌ 관리자 찾기 실패 (MEMBER_NOT_FOUND)
60+
*/
61+
@Test
62+
void testRegisterMembersFromCsvThrowsWhenAdminNotFound() {
63+
Long adminId = 99L;
64+
MultipartFile file = new MockMultipartFile("file", "members.csv", "text/csv", "dummy-content".getBytes());
65+
66+
when(memberService.findActiveMember(adminId)).thenThrow(new ApplicationException(MemberErrorCode.MEMBER_NOT_FOUND));
67+
68+
ApplicationException exception = assertThrows(ApplicationException.class, () -> {
69+
registerMemberCSVService.registerMembersFromCsv(adminId, file);
70+
});
71+
72+
// 검증: 발생한 예외가 `MEMBER_NOT_FOUND`인지 확인
73+
assertEquals(MemberErrorCode.MEMBER_NOT_FOUND.getCustomCode(), exception.getCode().getCustomCode());
74+
verifyNoInteractions(commandMemberPort); // 회원 저장 로직이 실행안됨
75+
}
76+
77+
/**
78+
* ❌ CSV 파싱 실패 (CSV_PARSING_ERROR)
79+
*/
80+
@Test
81+
void testRegisterMembersFromCsvThrowsWhenCsvParsingFails() {
82+
Long adminId = 1L;
83+
MultipartFile file = new MockMultipartFile("file", "members.csv", "text/csv", "dummy-content".getBytes());
84+
85+
// ✅ Mock 객체 설정: CSV 파싱 과정에서 예외 발생하도록 설정
86+
when(csvParseService.parse(file)).thenThrow(new ApplicationException(MemberErrorCode.CSV_PARSING_ERROR));
87+
88+
// 🔹 유스케이스 실행 및 예외 검증
89+
ApplicationException exception = assertThrows(ApplicationException.class, () -> {
90+
registerMemberCSVService.registerMembersFromCsv(adminId, file);
91+
});
92+
93+
// ✅ 검증: 발생한 예외가 `CSV_PARSING_ERROR`인지 확인
94+
assertEquals(MemberErrorCode.CSV_PARSING_ERROR.getCustomCode(), exception.getCode().getCustomCode());
95+
verifyNoInteractions(commandMemberPort); // ❗ 회원 저장 로직이 실행되지 않아야 함
96+
}
97+
98+
/**
99+
* ❌ 회원 등록 실패 (MEMBER_REGISTRATION_FAILED)
100+
*
101+
*/
102+
@Test
103+
void testRegisterMembersFromCsvThrowsWhenSavingMemberFails() {
104+
Long adminId = 1L;
105+
MultipartFile file = new MockMultipartFile("file", "members.csv", "text/csv", "dummy-content".getBytes());
106+
107+
Member admin = Mockito.mock(Member.class);
108+
Member failingMember = Mockito.mock(Member.class);
109+
List<Member> parsedMembers = List.of(failingMember, Mockito.mock(Member.class));
110+
111+
// 특정 회원 등록 중 예외 발생
112+
when(memberService.findActiveMember(adminId)).thenReturn(admin);
113+
when(csvParseService.parse(file)).thenReturn(parsedMembers);
114+
doThrow(new ApplicationException(MemberErrorCode.MEMBER_REGISTRATION_FAILED))
115+
.when(commandMemberPort).save(failingMember);
116+
117+
// Usecase 실행
118+
ApplicationException exception = assertThrows(ApplicationException.class, () -> {
119+
registerMemberCSVService.registerMembersFromCsv(adminId, file);
120+
});
121+
122+
assertEquals(MemberErrorCode.MEMBER_REGISTRATION_FAILED.getCustomCode(), exception.getCode().getCustomCode());
123+
verify(commandMemberPort, times(1)).save(failingMember); // ❗ 실패한 회원만 저장 시도해야 함
124+
}
125+
}

0 commit comments

Comments
 (0)