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