Skip to content

Commit 28f43e4

Browse files
committed
feat: '최신 응원 조회 API'의 검색 조건 추가 컨트롤러 로직 구현
1 parent 13d5e47 commit 28f43e4

File tree

3 files changed

+61
-11
lines changed

3 files changed

+61
-11
lines changed

src/test/java/eatda/controller/BaseControllerTest.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import eatda.domain.ImageKey;
1515
import eatda.domain.member.Member;
1616
import eatda.fixture.CheerGenerator;
17+
import eatda.fixture.CheerTagGenerator;
1718
import eatda.fixture.MemberGenerator;
1819
import eatda.fixture.StoreGenerator;
1920
import eatda.fixture.StoryGenerator;
@@ -60,6 +61,9 @@ public class BaseControllerTest {
6061
@Autowired
6162
protected CheerGenerator cheerGenerator;
6263

64+
@Autowired
65+
protected CheerTagGenerator cheerTagGenerator;
66+
6367
@Autowired
6468
protected StoryGenerator storyGenerator;
6569

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

Lines changed: 39 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,13 @@
44
import static org.junit.jupiter.api.Assertions.assertAll;
55

66
import eatda.controller.BaseControllerTest;
7+
import eatda.controller.store.SearchDistrict;
78
import eatda.domain.cheer.Cheer;
89
import eatda.domain.cheer.CheerTagName;
910
import eatda.domain.member.Member;
1011
import eatda.domain.store.District;
1112
import eatda.domain.store.Store;
13+
import eatda.domain.store.StoreCategory;
1214
import eatda.util.ImageUtils;
1315
import eatda.util.MappingUtils;
1416
import java.time.LocalDateTime;
@@ -82,13 +84,11 @@ class GetCheers {
8284
Cheer cheer1 = cheerGenerator.generateAdmin(member, store1, startAt);
8385
Cheer cheer2 = cheerGenerator.generateAdmin(member, store1, startAt.plusHours(1));
8486
Cheer cheer3 = cheerGenerator.generateAdmin(member, store2, startAt.plusHours(2));
85-
int page = 0;
86-
int size = 2;
8787

8888
CheersResponse response = given()
8989
.when()
90-
.queryParam("page", page)
91-
.queryParam("size", size)
90+
.queryParam("page", 0)
91+
.queryParam("size", 2)
9292
.get("/api/cheer")
9393
.then()
9494
.statusCode(200)
@@ -105,6 +105,41 @@ class GetCheers {
105105
);
106106
}
107107

108+
@Test
109+
void 필터링을_통해_응원을_조회한다() {
110+
Member member = memberGenerator.generateRegisteredMember("nickname", "[email protected]", "123", "01011111111");
111+
Store store1 = storeGenerator.generate("111", "서울시 노원구 월계3동 123-45", District.NOWON,
112+
StoreCategory.KOREAN);
113+
Store store2 = storeGenerator.generate("222", "서울시 노원구 월계3동 123-46", District.NOWON,
114+
StoreCategory.KOREAN);
115+
LocalDateTime startAt = LocalDateTime.of(2025, 7, 26, 1, 0, 0);
116+
Cheer cheer1 = cheerGenerator.generateAdmin(member, store1, startAt);
117+
Cheer cheer2 = cheerGenerator.generateAdmin(member, store1, startAt.plusHours(1));
118+
Cheer cheer3 = cheerGenerator.generateAdmin(member, store2, startAt.plusHours(2));
119+
cheerTagGenerator.generate(cheer1, List.of(CheerTagName.INSTAGRAMMABLE, CheerTagName.CLEAN_RESTROOM));
120+
cheerTagGenerator.generate(cheer2, List.of(CheerTagName.INSTAGRAMMABLE));
121+
cheerTagGenerator.generate(cheer3, List.of(CheerTagName.CLEAN_RESTROOM));
122+
123+
CheersResponse response = given()
124+
.when()
125+
.queryParam("page", 0)
126+
.queryParam("size", 2)
127+
.queryParam("category", StoreCategory.KOREAN)
128+
.queryParam("tag", CheerTagName.INSTAGRAMMABLE)
129+
.queryParam("location", SearchDistrict.GEUMCHEON, SearchDistrict.MYEONGDONG)
130+
.get("/api/cheer")
131+
.then()
132+
.statusCode(200)
133+
.extract().as(CheersResponse.class);
134+
135+
CheerPreviewResponse firstResponse = response.cheers().get(0);
136+
assertAll(
137+
() -> assertThat(response.cheers()).hasSize(2),
138+
() -> assertThat(response.cheers().get(0).cheerId()).isEqualTo(cheer2.getId()),
139+
() -> assertThat(response.cheers().get(1).cheerId()).isEqualTo(cheer1.getId())
140+
);
141+
}
142+
108143
@Nested
109144
class GetCheersByStoreId {
110145

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

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,13 @@
1919
import eatda.controller.cheer.CheerResponse;
2020
import eatda.controller.cheer.CheersInStoreResponse;
2121
import eatda.controller.cheer.CheersResponse;
22+
import eatda.controller.store.SearchDistrict;
2223
import eatda.document.BaseDocumentTest;
2324
import eatda.document.RestDocsRequest;
2425
import eatda.document.RestDocsResponse;
2526
import eatda.document.Tag;
2627
import eatda.domain.cheer.CheerTagName;
28+
import eatda.domain.store.StoreCategory;
2729
import eatda.exception.BusinessErrorCode;
2830
import eatda.exception.BusinessException;
2931
import eatda.util.ImageUtils;
@@ -143,7 +145,12 @@ class GetCheers {
143145
.summary("최신 응원 검색")
144146
.queryParameter(
145147
parameterWithName("page").description("조회 페이지 (기본값 0, 최소 0)").optional(),
146-
parameterWithName("size").description("조회 개수 (기본값 5, 최소 1, 최대 50)").optional()
148+
parameterWithName("size").description("조회 개수 (기본값 5, 최소 1, 최대 50)").optional(),
149+
parameterWithName("category").description("음식점 카테고리 0~1개(기본값: 전체) (ex. KOREAN)").optional(),
150+
parameterWithName("tag")
151+
.description("응원 태그 이름 0~N개(기본값: 전체) (ex. INSTAGRAMMABLE,ENERGETIC)").optional(),
152+
parameterWithName("location")
153+
.description("음식점 지역 0~N개(기본값: 전체) (ex. GANGNAM,KONDAE)").optional()
147154
);
148155

149156
RestDocsResponse responseDocument = response()
@@ -164,8 +171,6 @@ class GetCheers {
164171

165172
@Test
166173
void 음식점_검색_성공() {
167-
int page = 0;
168-
int size = 2;
169174
CheersResponse responses = new CheersResponse(List.of(
170175
new CheerPreviewResponse(2L, "https://example.image", "농민백암순대 본점", "강남구", "선릉구", "한식", 2L,
171176
"너무 맛있어요!", List.of(CheerTagName.INSTAGRAMMABLE, CheerTagName.CLEAN_RESTROOM), 5L, "커찬"),
@@ -181,16 +186,18 @@ class GetCheers {
181186

182187
given(document)
183188
.contentType(ContentType.JSON)
184-
.queryParam("size", size)
189+
.queryParam("page", 0)
190+
.queryParam("size", 2)
191+
.queryParam("category", StoreCategory.KOREAN)
192+
.queryParam("tag", CheerTagName.INSTAGRAMMABLE, CheerTagName.CLEAN_RESTROOM)
193+
.queryParam("location", SearchDistrict.GANGNAM, SearchDistrict.DAECHI)
185194
.when().get("/api/cheer")
186195
.then().statusCode(200);
187196
}
188197

189198
@EnumSource(value = BusinessErrorCode.class, names = {"PRESIGNED_URL_GENERATION_FAILED"})
190199
@ParameterizedTest
191200
void 음식점_검색_실패(BusinessErrorCode errorCode) {
192-
int page = 0;
193-
int size = 2;
194201
doThrow(new BusinessException(errorCode)).when(cheerService).getCheers(any());
195202

196203
var document = document("cheer/get-many", errorCode)
@@ -200,7 +207,11 @@ class GetCheers {
200207

201208
given(document)
202209
.contentType(ContentType.JSON)
203-
.queryParam("size", size)
210+
.queryParam("page", 0)
211+
.queryParam("size", 2)
212+
.queryParam("category", StoreCategory.KOREAN)
213+
.queryParam("tag", CheerTagName.INSTAGRAMMABLE, CheerTagName.CLEAN_RESTROOM)
214+
.queryParam("location", SearchDistrict.GANGNAM, SearchDistrict.DAECHI)
204215
.when().get("/api/cheer")
205216
.then().statusCode(errorCode.getStatus().value());
206217
}

0 commit comments

Comments
 (0)