Skip to content

Commit 5e820ca

Browse files
committed
feat : 가게에 달린 응원들 조회 API 구현
1 parent 376e12a commit 5e820ca

File tree

5 files changed

+103
-2
lines changed

5 files changed

+103
-2
lines changed

src/main/java/eatda/controller/store/CheerController.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import org.springframework.http.HttpStatus;
99
import org.springframework.http.ResponseEntity;
1010
import org.springframework.web.bind.annotation.GetMapping;
11+
import org.springframework.web.bind.annotation.PathVariable;
1112
import org.springframework.web.bind.annotation.PostMapping;
1213
import org.springframework.web.bind.annotation.RequestParam;
1314
import org.springframework.web.bind.annotation.RequestPart;
@@ -34,4 +35,11 @@ public ResponseEntity<CheersResponse> getCheers(@RequestParam @Min(1) @Max(50) i
3435
CheersResponse response = cheerService.getCheers(size);
3536
return ResponseEntity.ok(response);
3637
}
38+
39+
@GetMapping("/api/shops/{storeId}/cheers")
40+
public ResponseEntity<CheersInStoreResponse> getCheersByStoreId(@PathVariable Long storeId,
41+
@RequestParam @Min(1) @Max(50) int size) {
42+
CheersInStoreResponse response = cheerService.getCheersByStoreId(storeId, size);
43+
return ResponseEntity.ok(response);
44+
}
3745
}

src/main/java/eatda/controller/store/CheerInStoreResponse.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
public record CheerInStoreResponse(
66
long id,
77
long memberId,
8-
String memberName,
8+
String memberNickname,
99
String description
1010
) {
1111

src/test/java/eatda/controller/store/CheerControllerTest.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,5 +85,33 @@ class GetCheers {
8585
() -> assertThat(firstResponse.cheerId()).isEqualTo(cheer3.getId())
8686
);
8787
}
88+
89+
@Nested
90+
class GetCheersByStoreId {
91+
92+
@Test
93+
void 가게_아이디로_응원을_조회한다() throws InterruptedException {
94+
Member member1 = memberGenerator.generateRegisteredMember("123", "[email protected]", "1234", "01012341234");
95+
Member member2 = memberGenerator.generateRegisteredMember("124", "[email protected]", "1235", "01012341235");
96+
Store store = storeGenerator.generate("123", "서울시 강남구 역삼동 123-45");
97+
Cheer cheer1 = cheerGenerator.generateCommon(member1, store);
98+
Thread.sleep(5);
99+
Cheer cheer2 = cheerGenerator.generateCommon(member2, store);
100+
101+
CheersInStoreResponse response = given()
102+
.when()
103+
.queryParam("size", 2)
104+
.get("/api/shops/{storeId}/cheers", store.getId())
105+
.then()
106+
.statusCode(200)
107+
.extract().as(CheersInStoreResponse.class);
108+
109+
assertAll(
110+
() -> assertThat(response.cheers()).hasSize(2),
111+
() -> assertThat(response.cheers().get(0).id()).isEqualTo(cheer2.getId()),
112+
() -> assertThat(response.cheers().get(1).id()).isEqualTo(cheer1.getId())
113+
);
114+
}
115+
}
88116
}
89117
}

src/test/java/eatda/document/store/CheerDocumentTest.java

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,11 @@
1414
import static org.springframework.restdocs.request.RequestDocumentation.parameterWithName;
1515
import static org.springframework.restdocs.request.RequestDocumentation.partWithName;
1616

17+
import eatda.controller.store.CheerInStoreResponse;
1718
import eatda.controller.store.CheerPreviewResponse;
1819
import eatda.controller.store.CheerRegisterRequest;
1920
import eatda.controller.store.CheerResponse;
21+
import eatda.controller.store.CheersInStoreResponse;
2022
import eatda.controller.store.CheersResponse;
2123
import eatda.document.BaseDocumentTest;
2224
import eatda.document.RestDocsRequest;
@@ -175,4 +177,68 @@ class GetCheers {
175177
.then().statusCode(errorCode.getStatus().value());
176178
}
177179
}
180+
181+
@Nested
182+
class GetCheersByStoreId {
183+
184+
RestDocsRequest requestDocument = request()
185+
.tag(Tag.STORE_API)
186+
.summary("가게별 응원 검색")
187+
.pathParameter(
188+
parameterWithName("storeId").description("가게 ID")
189+
)
190+
.queryParameter(
191+
parameterWithName("size").description("조회 개수 (최소 1, 최대 50)")
192+
);
193+
194+
RestDocsResponse responseDocument = response()
195+
.responseBodyField(
196+
fieldWithPath("cheers").type(ARRAY).description("응원 검색 결과"),
197+
fieldWithPath("cheers[].id").type(NUMBER).description("응원 ID"),
198+
fieldWithPath("cheers[].memberId").type(NUMBER).description("응원 작성자 회원 ID"),
199+
fieldWithPath("cheers[].memberNickname").type(STRING).description("응원 작성자 닉네임"),
200+
fieldWithPath("cheers[].description").type(STRING).description("응원 내용")
201+
);
202+
203+
@Test
204+
void 가게별_응원_검색_성공() {
205+
Long storeId = 1L;
206+
int size = 2;
207+
CheersInStoreResponse responses = new CheersInStoreResponse(List.of(
208+
new CheerInStoreResponse(20L, 5L, "커찬", "너무 맛있어요!"),
209+
new CheerInStoreResponse(10L, 3L, "찬커", "너무 매워요! 하지만 맛있어요!")
210+
));
211+
doReturn(responses).when(cheerService).getCheersByStoreId(storeId, size);
212+
213+
var document = document("cheer/get-store-id", 200)
214+
.request(requestDocument)
215+
.response(responseDocument)
216+
.build();
217+
218+
given(document)
219+
.contentType(ContentType.JSON)
220+
.queryParam("size", size)
221+
.when().get("/api/shops/{storeId}/cheers", storeId)
222+
.then().statusCode(200);
223+
}
224+
225+
@EnumSource(value = BusinessErrorCode.class, names = {"STORE_NOT_FOUND"})
226+
@ParameterizedTest
227+
void 가게별_응원_검색_실패(BusinessErrorCode errorCode) {
228+
Long storeId = 1L;
229+
int size = 2;
230+
doThrow(new BusinessException(errorCode)).when(cheerService).getCheersByStoreId(eq(storeId), anyInt());
231+
232+
var document = document("cheer/get-store-id", errorCode)
233+
.request(requestDocument)
234+
.response(ERROR_RESPONSE)
235+
.build();
236+
237+
given(document)
238+
.contentType(ContentType.JSON)
239+
.queryParam("size", size)
240+
.when().get("/api/shops/{storeId}/cheers", storeId)
241+
.then().statusCode(errorCode.getStatus().value());
242+
}
243+
}
178244
}

src/test/java/eatda/service/store/CheerServiceTest.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,6 @@ class GetCheersByStoreId {
156156
Member member1 = memberGenerator.generateRegisteredMember("123", "[email protected]", "1234", "01012341234");
157157
Member member2 = memberGenerator.generateRegisteredMember("124", "[email protected]", "1235", "01012341235");
158158
Member member3 = memberGenerator.generateRegisteredMember("125", "[email protected]", "1236", "01012341236");
159-
160159
Store store = storeGenerator.generate("123", "서울시 강남구 역삼동 123-45");
161160
Cheer cheer1 = cheerGenerator.generateCommon(member1, store);
162161
Thread.sleep(5);

0 commit comments

Comments
 (0)