Skip to content

Commit 81c353a

Browse files
committed
Test: 테스트 코드 작성
1 parent fa54b45 commit 81c353a

File tree

13 files changed

+1034
-18
lines changed

13 files changed

+1034
-18
lines changed

src/main/java/com/back/domain/chat/controller/ChatApiController.java

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
import org.springframework.web.bind.annotation.*;
1313

1414
import java.time.LocalDateTime;
15-
import java.util.Map;
1615

1716
@RestController
1817
@RequiredArgsConstructor
@@ -26,15 +25,10 @@ public class ChatApiController {
2625
public ResponseEntity<RsData<ChatPageResponse>> getRoomChatMessages(
2726
@PathVariable Long roomId,
2827
@RequestParam(defaultValue = "0") int page,
29-
@RequestParam(defaultValue = "50") int size,
28+
@RequestParam(defaultValue = "20") int size,
3029
@RequestParam(required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime before,
3130
@AuthenticationPrincipal CustomUserDetails userDetails) {
3231

33-
// size 최대값 제한 (임시: max 100)
34-
if (size > 100) {
35-
size = 100;
36-
}
37-
3832
ChatPageResponse chatHistory = chatService.getRoomChatHistory(roomId, page, size, before);
3933

4034
return ResponseEntity

src/main/java/com/back/domain/chat/dto/ChatPageResponse.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ public class ChatPageResponse {
1515

1616
private List<ChatMessageDto> content;
1717
private PageableDto pageable;
18+
private long totalElements;
1819

1920
// 페이징 정보 DTO
2021
@Data
@@ -36,6 +37,7 @@ public static ChatPageResponse from(org.springframework.data.domain.Page<ChatMes
3637
.size(page.getSize())
3738
.hasNext(page.hasNext())
3839
.build())
40+
.totalElements(page.getTotalElements())
3941
.build();
4042
}
4143
}

src/main/java/com/back/domain/chat/service/ChatService.java

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import com.back.domain.chat.dto.ChatPageResponse;
1111
import com.back.global.exception.CustomException;
1212
import com.back.global.exception.ErrorCode;
13+
import com.back.global.security.CurrentUser;
1314
import lombok.RequiredArgsConstructor;
1415
import org.springframework.data.domain.Page;
1516
import org.springframework.data.domain.PageRequest;
@@ -27,6 +28,11 @@ public class ChatService {
2728
private final RoomChatMessageRepository roomChatMessageRepository;
2829
private final RoomRepository roomRepository;
2930
private final UserRepository userRepository;
31+
private final CurrentUser currentUser;
32+
33+
// 페이징 설정 상수
34+
private static final int DEFAULT_PAGE_SIZE = 20;
35+
private static final int MAX_PAGE_SIZE = 100;
3036

3137
// 방 채팅 메시지 저장
3238
@Transactional
@@ -54,7 +60,10 @@ public ChatPageResponse getRoomChatHistory(Long roomId, int page, int size, Loca
5460
roomRepository.findById(roomId)
5561
.orElseThrow(() -> new CustomException(ErrorCode.ROOM_NOT_FOUND));
5662

57-
Pageable pageable = PageRequest.of(page, size);
63+
// size 값 검증 및 제한
64+
int validatedSize = validateAndLimitPageSize(size);
65+
66+
Pageable pageable = PageRequest.of(page, validatedSize);
5867

5968
// before 파라미터가 있으면 해당 시점 이전 메시지만 조회
6069
Page<RoomChatMessage> messagesPage;
@@ -69,6 +78,14 @@ public ChatPageResponse getRoomChatHistory(Long roomId, int page, int size, Loca
6978
return ChatPageResponse.from(dtoPage);
7079
}
7180

81+
// size 값 검증 및 최대값 제한
82+
private int validateAndLimitPageSize(int size) {
83+
if (size <= 0) {
84+
return DEFAULT_PAGE_SIZE; // 0 이하면 기본값 사용
85+
}
86+
return Math.min(size, MAX_PAGE_SIZE); // 최대값 제한
87+
}
88+
7289
// 메시지 엔티티를 DTO로 변환
7390
private ChatMessageDto convertToDto(RoomChatMessage message) {
7491
return ChatMessageDto.builder()
@@ -84,4 +101,4 @@ private ChatMessageDto convertToDto(RoomChatMessage message) {
84101
.build();
85102
}
86103

87-
}
104+
}

src/main/java/com/back/domain/studyroom/entity/Room.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,19 @@
44
import com.back.domain.user.entity.User;
55
import com.back.global.entity.BaseEntity;
66
import jakarta.persistence.*;
7+
import lombok.AllArgsConstructor;
78
import lombok.Getter;
89
import lombok.NoArgsConstructor;
10+
import lombok.experimental.SuperBuilder;
911

1012
import java.util.ArrayList;
1113
import java.util.List;
1214

1315
@Entity
14-
@NoArgsConstructor
1516
@Getter
17+
@SuperBuilder
18+
@NoArgsConstructor
19+
@AllArgsConstructor
1620
public class Room extends BaseEntity {
1721
private String title;
1822

src/main/java/com/back/domain/studyroom/entity/RoomChatMessage.java

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,17 @@
66
import jakarta.persistence.FetchType;
77
import jakarta.persistence.JoinColumn;
88
import jakarta.persistence.ManyToOne;
9+
import lombok.AllArgsConstructor;
10+
import lombok.Builder;
911
import lombok.Getter;
1012
import lombok.NoArgsConstructor;
13+
import lombok.experimental.SuperBuilder;
1114

1215
@Entity
1316
@Getter
17+
@SuperBuilder
1418
@NoArgsConstructor
19+
@AllArgsConstructor
1520
public class RoomChatMessage extends BaseEntity {
1621
@ManyToOne(fetch = FetchType.LAZY)
1722
@JoinColumn(name = "room_id")
@@ -23,10 +28,4 @@ public class RoomChatMessage extends BaseEntity {
2328

2429
private String content;
2530

26-
// 채팅 메세지 생성자
27-
public RoomChatMessage(Room room, User user, String content) {
28-
this.room = room;
29-
this.user = user;
30-
this.content = content;
31-
}
3231
}

src/main/java/com/back/domain/user/entity/User.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,20 @@
99
import com.back.domain.studyroom.entity.RoomParticipantHistory;
1010
import com.back.global.entity.BaseEntity;
1111
import jakarta.persistence.*;
12+
import lombok.AllArgsConstructor;
1213
import lombok.Getter;
1314
import lombok.NoArgsConstructor;
15+
import lombok.experimental.SuperBuilder;
1416

1517
import java.util.ArrayList;
1618
import java.util.List;
1719

1820
@Entity
1921
@Getter
20-
@Table(name = "USERS")
22+
@SuperBuilder
2123
@NoArgsConstructor
24+
@AllArgsConstructor
25+
@Table(name = "USERS")
2226
public class User extends BaseEntity {
2327
private String username;
2428

src/main/java/com/back/global/entity/BaseEntity.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,19 @@
22

33
import jakarta.persistence.*;
44
import lombok.Getter;
5+
import lombok.NoArgsConstructor;
6+
import lombok.experimental.SuperBuilder;
57
import org.springframework.data.annotation.CreatedDate;
68
import org.springframework.data.annotation.LastModifiedDate;
79
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
810

911
import java.time.LocalDateTime;
1012

13+
@Getter
14+
@SuperBuilder
1115
@MappedSuperclass
16+
@NoArgsConstructor
1217
@EntityListeners(AuditingEntityListener.class)
13-
@Getter
1418
public abstract class BaseEntity {
1519
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
1620
private Long id;

src/main/java/com/back/global/security/CustomUserDetails.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.back.global.security;
22

33
import lombok.AllArgsConstructor;
4+
import lombok.Builder;
45
import lombok.Getter;
56
import org.springframework.security.core.authority.SimpleGrantedAuthority;
67
import org.springframework.security.core.userdetails.UserDetails;
@@ -13,6 +14,7 @@
1314
* - JWT에서 파싱한 사용자 정보를 담고 있음
1415
*/
1516
@Getter
17+
@Builder
1618
@AllArgsConstructor
1719
public class CustomUserDetails implements UserDetails {
1820
private Long userId;
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
package com.back.domain.chat.controller;
2+
3+
import com.back.domain.chat.dto.ChatPageResponse;
4+
import com.back.domain.chat.service.ChatService;
5+
import com.back.global.security.JwtTokenProvider;
6+
import org.junit.jupiter.api.DisplayName;
7+
import org.junit.jupiter.api.Test;
8+
9+
import org.springframework.beans.factory.annotation.Autowired;
10+
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
11+
import org.springframework.boot.test.context.SpringBootTest;
12+
13+
import org.springframework.http.MediaType;
14+
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
15+
import org.springframework.test.context.bean.override.mockito.MockitoBean;
16+
import org.springframework.test.web.servlet.MockMvc;
17+
18+
import static org.mockito.ArgumentMatchers.*;
19+
import static org.mockito.BDDMockito.given;
20+
21+
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
22+
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
23+
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
24+
25+
import java.util.List;
26+
27+
@SpringBootTest
28+
@AutoConfigureMockMvc
29+
class ChatApiControllerTest {
30+
31+
@Autowired
32+
private MockMvc mockMvc;
33+
34+
@MockitoBean
35+
private JwtTokenProvider jwtTokenProvider;
36+
37+
@MockitoBean
38+
private ChatService chatService;
39+
40+
@Test
41+
@DisplayName("채팅 기록 조회 성공")
42+
void t1() throws Exception {
43+
ChatPageResponse mockResponse = ChatPageResponse.builder()
44+
.content(List.of())
45+
.pageable(ChatPageResponse.PageableDto.builder()
46+
.page(0)
47+
.size(20)
48+
.hasNext(false)
49+
.build())
50+
.totalElements(0)
51+
.build();
52+
53+
given(chatService.getRoomChatHistory(anyLong(), anyInt(), anyInt(), any()))
54+
.willReturn(mockResponse);
55+
56+
// JWT 관련 스텁
57+
given(jwtTokenProvider.validateToken(anyString())).willReturn(true);
58+
given(jwtTokenProvider.getAuthentication(anyString()))
59+
.willReturn(new UsernamePasswordAuthenticationToken(
60+
"mockUser", null, List.of())
61+
);
62+
63+
mockMvc.perform(get("/api/rooms/1/messages")
64+
.param("page", "0")
65+
.param("size", "20")
66+
.header("Authorization", "Bearer faketoken") // 가짜 토큰 넣기
67+
.accept(MediaType.APPLICATION_JSON))
68+
.andExpect(status().isOk())
69+
.andExpect(jsonPath("$.data.content").isArray())
70+
.andExpect(jsonPath("$.data.totalElements").value(0));
71+
}
72+
}
73+

0 commit comments

Comments
 (0)