Skip to content

Commit 806d9c2

Browse files
authored
Test/매니저 단위 테스트 (#232)
* test: event register service test * test: 이벤트 티켓 구매 기록 조회 서비스 테스트
1 parent e76dfec commit 806d9c2

File tree

2 files changed

+327
-0
lines changed

2 files changed

+327
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,164 @@
1+
package org.codeNbug.mainserver.domain.manager.service;
2+
3+
import static org.junit.jupiter.api.Assertions.*;
4+
import static org.mockito.ArgumentMatchers.any;
5+
import static org.mockito.Mockito.when;
6+
7+
import java.time.LocalDateTime;
8+
import java.util.Collections;
9+
import java.util.HashMap;
10+
import java.util.Optional;
11+
12+
import org.codeNbug.mainserver.domain.event.dto.EventRegisterResponse;
13+
import org.codeNbug.mainserver.domain.event.entity.Event;
14+
import org.codeNbug.mainserver.domain.event.entity.EventCategoryEnum;
15+
import org.codeNbug.mainserver.domain.event.entity.EventInformation;
16+
import org.codeNbug.mainserver.domain.event.entity.EventStatusEnum;
17+
import org.codeNbug.mainserver.domain.manager.dto.EventRegisterRequest;
18+
import org.codeNbug.mainserver.domain.manager.dto.layout.LayoutDto;
19+
import org.codeNbug.mainserver.domain.manager.repository.EventRepository;
20+
import org.codeNbug.mainserver.domain.manager.repository.ManagerEventRepository;
21+
import org.codeNbug.mainserver.domain.seat.entity.SeatLayout;
22+
import org.codeNbug.mainserver.domain.seat.repository.SeatGradeRepository;
23+
import org.codeNbug.mainserver.domain.seat.repository.SeatLayoutRepository;
24+
import org.codenbug.user.domain.user.entity.User;
25+
import org.codenbug.user.domain.user.repository.UserRepository;
26+
import org.junit.jupiter.api.DisplayName;
27+
import org.junit.jupiter.api.Test;
28+
import org.junit.jupiter.api.extension.ExtendWith;
29+
import org.mockito.InjectMocks;
30+
import org.mockito.Mock;
31+
import org.mockito.junit.jupiter.MockitoExtension;
32+
33+
@ExtendWith(MockitoExtension.class)
34+
class EventRegisterServiceTest {
35+
36+
@Mock
37+
private EventDomainService eventDomainService;
38+
@Mock
39+
private EventRepository eventRepository;
40+
@Mock
41+
private SeatLayoutRepository seatLayoutRepository;
42+
@Mock
43+
private ManagerEventRepository managerEventRepository;
44+
@Mock
45+
private UserRepository userRepository;
46+
@Mock
47+
private SeatGradeRepository seatGradeRepository;
48+
49+
@InjectMocks
50+
private EventRegisterService eventRegisterService;
51+
52+
@DisplayName("이벤트 등록 성공 테스트")
53+
@Test
54+
void registerEvent_success() {
55+
// given
56+
Long managerId = 1L;
57+
User manager = User.builder()
58+
.userId(managerId)
59+
60+
.build();
61+
EventRegisterRequest request = createDummyRequest();
62+
63+
Event event = new Event(
64+
EventCategoryEnum.CONCERT,
65+
EventInformation.builder()
66+
.title("Test Event")
67+
.description("Description")
68+
.ageLimit(0)
69+
.restrictions("")
70+
.location("Seoul")
71+
.hallName("Olympic Hall")
72+
.eventStart(LocalDateTime.now())
73+
.eventEnd(LocalDateTime.now().plusHours(2))
74+
.seatCount(100)
75+
.thumbnailUrl("https://image.com/test.jpg")
76+
.build(),
77+
LocalDateTime.now(),
78+
LocalDateTime.now().plusDays(1),
79+
0,
80+
null,
81+
null,
82+
EventStatusEnum.OPEN,
83+
true,
84+
false,
85+
null
86+
);
87+
88+
SeatLayout seatLayout = new SeatLayout(1L, "{}", event);
89+
90+
// when mocking
91+
when(userRepository.findById(managerId)).thenReturn(Optional.of(manager));
92+
when(eventRepository.save(any(Event.class))).thenReturn(event);
93+
when(eventDomainService.serializeLayoutToJson(any())).thenReturn("{}");
94+
when(seatLayoutRepository.save(any(SeatLayout.class))).thenReturn(seatLayout);
95+
when(eventDomainService.createAndSaveSeatGrades(any(), any())).thenReturn(new HashMap<>());
96+
when(eventDomainService.buildEventRegisterResponse(any(), any()))
97+
.thenReturn(createDummyResponse());
98+
99+
// when
100+
EventRegisterResponse response = eventRegisterService.registerEvent(request, managerId);
101+
102+
// then
103+
assertNotNull(response);
104+
assertEquals("Test Event", response.getTitle());
105+
assertEquals("Seoul", response.getLocation());
106+
}
107+
108+
// ================================
109+
// ✅ 더미 요청 생성 메서드
110+
// ================================
111+
private EventRegisterRequest createDummyRequest() {
112+
return EventRegisterRequest.builder()
113+
.title("Test Event")
114+
.category(EventCategoryEnum.CONCERT)
115+
.thumbnailUrl("https://image.com/test.jpg")
116+
.description("Description")
117+
.agelimit(0)
118+
.restriction("")
119+
.location("Seoul")
120+
.hallName("Olympic Hall")
121+
.startDate(LocalDateTime.now())
122+
.endDate(LocalDateTime.now().plusHours(2))
123+
.seatCount(100)
124+
.bookingStart(LocalDateTime.now())
125+
.bookingEnd(LocalDateTime.now().plusDays(1))
126+
.layout(LayoutDto.builder()
127+
.layout(Collections.emptyList())
128+
.seat(Collections.emptyMap())
129+
.build())
130+
.price(Collections.emptyList())
131+
.build();
132+
}
133+
134+
// ================================
135+
// ✅ 더미 응답 생성 메서드
136+
// ================================
137+
private EventRegisterResponse createDummyResponse() {
138+
return EventRegisterResponse.builder()
139+
.eventId(1L)
140+
.title("Test Event")
141+
.category(EventCategoryEnum.CONCERT)
142+
.description("Description")
143+
.restriction("")
144+
.thumbnailUrl("https://image.com/test.jpg")
145+
.startDate(LocalDateTime.now())
146+
.endDate(LocalDateTime.now().plusHours(2))
147+
.location("Seoul")
148+
.hallName("Olympic Hall")
149+
.seatCount(100)
150+
.layout(LayoutDto.builder()
151+
.layout(Collections.emptyList())
152+
.seat(Collections.emptyMap())
153+
.build())
154+
.price(Collections.emptyList())
155+
.bookingStart(LocalDateTime.now())
156+
.bookingEnd(LocalDateTime.now().plusDays(1))
157+
.agelimit(0)
158+
.createdAt(LocalDateTime.now())
159+
.modifiedAt(LocalDateTime.now())
160+
.status(EventStatusEnum.OPEN)
161+
.build();
162+
}
163+
}
164+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,163 @@
1+
package org.codeNbug.mainserver.domain.manager.service;
2+
3+
import org.codeNbug.mainserver.domain.event.entity.Event;
4+
import org.codeNbug.mainserver.domain.manager.dto.EventPurchaseResponse;
5+
import org.codeNbug.mainserver.domain.manager.dto.TicketDto;
6+
import org.codeNbug.mainserver.domain.manager.repository.EventRepository;
7+
import org.codeNbug.mainserver.domain.manager.repository.ManagerEventRepository;
8+
import org.codeNbug.mainserver.domain.purchase.entity.PaymentStatusEnum;
9+
import org.codeNbug.mainserver.domain.ticket.repository.TicketRepository;
10+
import org.codeNbug.mainserver.global.exception.globalException.BadRequestException;
11+
import org.codenbug.user.domain.user.entity.User;
12+
import org.junit.jupiter.api.DisplayName;
13+
import org.junit.jupiter.api.Test;
14+
import org.junit.jupiter.api.extension.ExtendWith;
15+
import org.mockito.InjectMocks;
16+
import org.mockito.Mock;
17+
import org.mockito.junit.jupiter.MockitoExtension;
18+
import org.springframework.security.access.AccessDeniedException;
19+
import org.springframework.test.util.ReflectionTestUtils;
20+
21+
import java.time.LocalDateTime;
22+
import java.util.List;
23+
import java.util.Optional;
24+
25+
import static org.junit.jupiter.api.Assertions.*;
26+
import static org.mockito.Mockito.when;
27+
28+
@ExtendWith(MockitoExtension.class)
29+
class ManagerPurchasesServiceTest {
30+
@Mock
31+
private TicketRepository ticketRepository;
32+
@Mock
33+
private EventRepository eventRepository;
34+
@Mock
35+
private ManagerEventRepository managerEventRepository;
36+
37+
@InjectMocks
38+
private ManagerPurchasesService managerPurchasesService;
39+
40+
// 정상 조회 테스트
41+
@DisplayName("이벤트 구매 내역 조회에 성공")
42+
@Test
43+
void 이벤트_구매_내역_조회_성공() {
44+
// given
45+
Long eventId = 1L;
46+
Long managerId = 10L;
47+
48+
User manager = User.builder()
49+
.userId(managerId)
50+
51+
.build();
52+
53+
Event event = new Event();
54+
ReflectionTestUtils.setField(event, "eventId", eventId);
55+
56+
List<TicketDto> dummyTickets = List.of(
57+
new TicketDto(
58+
100L, // purchaseId
59+
200L, // userId
60+
"user1", // userName
61+
"[email protected]", // userEmail
62+
"010-1234-5678", // phoneNum
63+
PaymentStatusEnum.DONE,
64+
LocalDateTime.now(), // purchaseAt
65+
5000, // amount
66+
300L // ticket_id
67+
),
68+
new TicketDto(
69+
101L, // purchaseId
70+
201L, // userId
71+
"user2", // userName
72+
"[email protected]", // userEmail
73+
"010-2234-5678", // phoneNum
74+
PaymentStatusEnum.DONE,
75+
LocalDateTime.now(), // purchaseAt
76+
15000, // amount
77+
301L // ticket_id
78+
)
79+
);
80+
81+
// when - mock 설정
82+
when(eventRepository.findById(eventId)).thenReturn(Optional.of(event));
83+
when(managerEventRepository.existsByManagerAndEvent(manager, event)).thenReturn(true);
84+
when(ticketRepository.findTicketPurchasesByEventId(eventId)).thenReturn(dummyTickets);
85+
86+
// then
87+
List<EventPurchaseResponse> result = managerPurchasesService.getEventPurchaseList(eventId, manager);
88+
89+
assertNotNull(result);
90+
assertEquals(2, result.size());
91+
92+
EventPurchaseResponse response = result.get(0);
93+
assertEquals(100L, response.getPurchaseId());
94+
assertEquals(200L, response.getUserId());
95+
assertEquals("user1", response.getUserName());
96+
assertEquals("[email protected]", response.getUserEmail());
97+
assertEquals("010-1234-5678", response.getPhoneNum());
98+
assertEquals(PaymentStatusEnum.DONE, response.getPayment_status());
99+
assertEquals(List.of(300L), response.getTicket_id()); // 구매 티켓 1개
100+
assertEquals(5000, response.getAmount());
101+
102+
response = result.get(1);
103+
assertEquals(101L, response.getPurchaseId());
104+
assertEquals(201L, response.getUserId());
105+
assertEquals("user2", response.getUserName());
106+
assertEquals("[email protected]", response.getUserEmail());
107+
assertEquals("010-2234-5678", response.getPhoneNum());
108+
assertEquals(PaymentStatusEnum.DONE, response.getPayment_status());
109+
assertEquals(List.of(301L), response.getTicket_id()); // 구매 티켓 1개
110+
assertEquals(15000, response.getAmount());
111+
}
112+
113+
// event 존재 하지 않음 테스트
114+
// 정상 조회 테스트
115+
@DisplayName("이벤트가 존재하지 않을 때 조회 오류 테스트")
116+
@Test
117+
void 이벤트가_존재하지_않을_때_예외_발생() {
118+
// given
119+
Long eventId = 1L;
120+
Long managerId = 10L;
121+
122+
User manager = User.builder()
123+
.userId(managerId)
124+
125+
.build();
126+
127+
// when - mock 설정
128+
when(eventRepository.findById(eventId)).thenReturn(Optional.empty());
129+
130+
// then
131+
assertThrows(BadRequestException.class, () ->
132+
managerPurchasesService.getEventPurchaseList(eventId, manager)
133+
);
134+
}
135+
136+
137+
// manager 권한 없음 테스트
138+
@DisplayName("매니저 권한이 없을 때 조회 오류 테스트")
139+
@Test
140+
void 매니저_권한이_없을_때_예외_발생() {
141+
// given
142+
Long eventId = 1L;
143+
Long managerId = 10L;
144+
145+
User manager = User.builder()
146+
.userId(managerId)
147+
148+
.build();
149+
150+
Event event = new Event();
151+
ReflectionTestUtils.setField(event, "eventId", eventId);
152+
153+
// when - mock 설정
154+
when(eventRepository.findById(eventId)).thenReturn(Optional.of(event));
155+
when(managerEventRepository.existsByManagerAndEvent(manager, event)).thenReturn(false); //권한 없음
156+
157+
// then
158+
assertThrows(AccessDeniedException.class, () ->
159+
managerPurchasesService.getEventPurchaseList(eventId, manager)
160+
);
161+
}
162+
163+
}

0 commit comments

Comments
 (0)