-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathGracePeriodConsumerTest.java
More file actions
87 lines (66 loc) · 3.63 KB
/
Copy pathGracePeriodConsumerTest.java
File metadata and controls
87 lines (66 loc) · 3.63 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
package com.back.global.websocket;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.util.Optional;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import com.back.domain.battle.battleparticipant.entity.BattleParticipant;
import com.back.domain.battle.battleparticipant.entity.BattleParticipantStatus;
import com.back.domain.battle.battleparticipant.repository.BattleParticipantRepository;
import com.back.domain.battle.battleroom.entity.BattleRoom;
import com.back.domain.battle.battleroom.entity.BattleRoomStatus;
import com.back.global.websocket.pubsub.WebSocketMessagePublisher;
class GracePeriodConsumerTest {
private final BattleReconnectStore reconnectStore = mock(BattleReconnectStore.class);
private final BattleParticipantRepository battleParticipantRepository = mock(BattleParticipantRepository.class);
private final WebSocketMessagePublisher publisher = mock(WebSocketMessagePublisher.class);
private final GracePeriodConsumer sut =
new GracePeriodConsumer(reconnectStore, battleParticipantRepository, publisher);
private static final Long MEMBER_ID = 10L;
private static final Long ROOM_ID = 1L;
@Test
@DisplayName("grace period 만료 시 참여자가 ABANDONED이면 PARTICIPANT_STATUS_CHANGED(ABANDONED)를 브로드캐스트한다")
void handle_ABANDONED참여자_PARTICIPANT_STATUS_CHANGED발행() {
BattleRoom room = mock(BattleRoom.class);
when(room.getId()).thenReturn(ROOM_ID);
BattleParticipant participant = mock(BattleParticipant.class);
when(participant.getBattleRoom()).thenReturn(room);
when(battleParticipantRepository.findAbandonedParticipantByMemberId(
MEMBER_ID, BattleParticipantStatus.ABANDONED, BattleRoomStatus.PLAYING))
.thenReturn(Optional.of(participant));
sut.handle(MEMBER_ID);
verify(publisher).publish(eq("/topic/room/" + ROOM_ID), any());
}
@Test
@DisplayName("grace period 만료 시 참여자가 이미 재접속했으면 publish하지 않는다")
void handle_이미재접속한참여자_발행안함() {
when(battleParticipantRepository.findAbandonedParticipantByMemberId(
MEMBER_ID, BattleParticipantStatus.ABANDONED, BattleRoomStatus.PLAYING))
.thenReturn(Optional.empty());
sut.handle(MEMBER_ID);
verify(publisher, never()).publish(any(), any());
}
@Test
@DisplayName("PARTICIPANT_STATUS_CHANGED(ABANDONED) 발행 시 올바른 roomId, 타입, 상태가 포함된다")
void handle_발행메시지에_올바른roomId포함() {
BattleRoom room = mock(BattleRoom.class);
when(room.getId()).thenReturn(ROOM_ID);
BattleParticipant participant = mock(BattleParticipant.class);
when(participant.getBattleRoom()).thenReturn(room);
when(battleParticipantRepository.findAbandonedParticipantByMemberId(
MEMBER_ID, BattleParticipantStatus.ABANDONED, BattleRoomStatus.PLAYING))
.thenReturn(Optional.of(participant));
sut.handle(MEMBER_ID);
verify(publisher)
.publish(
eq("/topic/room/" + ROOM_ID),
eq(java.util.Map.of(
"type", "PARTICIPANT_STATUS_CHANGED",
"userId", MEMBER_ID,
"status", "ABANDONED")));
}
}