Skip to content

Commit cfb8a5b

Browse files
committed
feat: '상점에 달린 태그 조회 API' 컨트롤러 로직 구현
1 parent 4c29abd commit cfb8a5b

File tree

4 files changed

+97
-6
lines changed

4 files changed

+97
-6
lines changed

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

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,10 @@ public class StoreController {
2323
private final StoreService storeService;
2424
private final StoreSearchService storeSearchService;
2525

26-
@GetMapping("/api/shops/{storeId}/images")
27-
public ResponseEntity<ImagesResponse> getStoreImages(@PathVariable long storeId) {
28-
return ResponseEntity.ok(storeService.getStoreImages(storeId));
26+
@GetMapping("/api/shops/{storeId}")
27+
public ResponseEntity<StoreResponse> getStore(@PathVariable long storeId) {
28+
StoreResponse response = storeService.getStore(storeId);
29+
return ResponseEntity.ok(response);
2930
}
3031

3132
@GetMapping("/api/shops")
@@ -36,9 +37,14 @@ public ResponseEntity<StoresResponse> getStores(@RequestParam(defaultValue = "0"
3637
return ResponseEntity.ok(response);
3738
}
3839

39-
@GetMapping("/api/shops/{storeId}")
40-
public ResponseEntity<StoreResponse> getStore(@PathVariable long storeId) {
41-
StoreResponse response = storeService.getStore(storeId);
40+
@GetMapping("/api/shops/{storeId}/images")
41+
public ResponseEntity<ImagesResponse> getStoreImages(@PathVariable long storeId) {
42+
return ResponseEntity.ok(storeService.getStoreImages(storeId));
43+
}
44+
45+
@GetMapping("/api/shops/{storeId}/tags")
46+
public ResponseEntity<TagsResponse> getStoreTags(@PathVariable long storeId) {
47+
TagsResponse response = storeService.getStoreTags(storeId);
4248
return ResponseEntity.ok(response);
4349
}
4450

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/store/StoreControllerTest.java

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

66
import eatda.controller.BaseControllerTest;
7+
import eatda.domain.cheer.Cheer;
8+
import eatda.domain.cheer.CheerTagName;
79
import eatda.domain.member.Member;
810
import eatda.domain.store.Store;
911
import eatda.domain.store.StoreCategory;
12+
import io.restassured.http.ContentType;
1013
import java.time.LocalDateTime;
14+
import java.util.List;
1115
import org.junit.jupiter.api.Nested;
1216
import org.junit.jupiter.api.Test;
1317
import org.springframework.http.HttpHeaders;
@@ -146,6 +150,30 @@ class GetStoreImages {
146150
}
147151
}
148152

153+
154+
@Nested
155+
class GetStoreTags {
156+
157+
@Test
158+
void 음식점_태그들을_조회한다() {
159+
Member member = memberGenerator.generate("111");
160+
Store store = storeGenerator.generate("농민백암순대", "서울 강남구 대치동 896-33");
161+
Cheer cheer = cheerGenerator.generateCommon(member, store, "image-key");
162+
cheerTagGenerator.generate(cheer, List.of(CheerTagName.INSTAGRAMMABLE, CheerTagName.CLEAN_RESTROOM));
163+
164+
TagsResponse response = given()
165+
.when()
166+
.contentType(ContentType.JSON)
167+
.get("/api/shops/{storeId}/tags", store.getId())
168+
.then()
169+
.statusCode(200)
170+
.extract().as(TagsResponse.class);
171+
172+
assertThat(response.tags())
173+
.containsExactlyInAnyOrder(CheerTagName.INSTAGRAMMABLE, CheerTagName.CLEAN_RESTROOM);
174+
}
175+
}
176+
149177
@Nested
150178
class GetStoresByCheeredMember {
151179

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

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,12 @@
1717
import eatda.controller.store.StoreResponse;
1818
import eatda.controller.store.StoresInMemberResponse;
1919
import eatda.controller.store.StoresResponse;
20+
import eatda.controller.store.TagsResponse;
2021
import eatda.document.BaseDocumentTest;
2122
import eatda.document.RestDocsRequest;
2223
import eatda.document.RestDocsResponse;
2324
import eatda.document.Tag;
25+
import eatda.domain.cheer.CheerTagName;
2426
import eatda.domain.store.District;
2527
import eatda.domain.store.StoreCategory;
2628
import eatda.domain.store.StoreSearchResult;
@@ -225,6 +227,57 @@ class GetStoreImages {
225227

226228
}
227229

230+
@Nested
231+
class GetStoreTags {
232+
233+
RestDocsRequest requestDocument = request()
234+
.tag(Tag.STORE_API)
235+
.summary("음식점 태그 조회")
236+
.pathParameter(
237+
parameterWithName("storeId").description("음식점 ID")
238+
);
239+
240+
RestDocsResponse responseDocument = response()
241+
.responseBodyField(
242+
fieldWithPath("tags").type(ARRAY).description("음식점 태그 목록")
243+
);
244+
245+
@Test
246+
void 음식점_태그_조회_성공() {
247+
long storeId = 7L;
248+
TagsResponse response = new TagsResponse(List.of(CheerTagName.INSTAGRAMMABLE, CheerTagName.CLEAN_RESTROOM));
249+
doReturn(response).when(storeService).getStoreTags(storeId);
250+
251+
var document = document("store/get-tags", 200)
252+
.request(requestDocument)
253+
.response(responseDocument)
254+
.build();
255+
256+
given(document)
257+
.contentType(ContentType.JSON)
258+
.when().get("/api/shops/{storeId}/tags", storeId)
259+
.then().statusCode(200);
260+
}
261+
262+
@EnumSource(value = BusinessErrorCode.class, names = {"STORE_NOT_FOUND"})
263+
@ParameterizedTest
264+
void 음식점_태그_조회_실패(BusinessErrorCode errorCode) {
265+
long storeId = 1L;
266+
doThrow(new BusinessException(errorCode)).when(storeService).getStoreTags(storeId);
267+
268+
var document = document("store/get-tags", errorCode)
269+
.request(requestDocument)
270+
.response(ERROR_RESPONSE)
271+
.build();
272+
273+
given(document)
274+
.contentType(ContentType.JSON)
275+
.pathParam("storeId", storeId)
276+
.when().get("/api/shops/{storeId}/tags")
277+
.then().statusCode(errorCode.getStatus().value());
278+
}
279+
}
280+
228281
@Nested
229282
class GetStoresByCheeredMember {
230283

0 commit comments

Comments
 (0)