From 181428f55d3255f16858d867fd85b9bfb1166689 Mon Sep 17 00:00:00 2001 From: Ssamssamukja <109636635+Ssamssamukja@users.noreply.github.com> Date: Wed, 11 Feb 2026 02:17:12 +0900 Subject: [PATCH 1/3] =?UTF-8?q?fix:=20feed=20=EC=A1=B0=ED=9A=8C=20-=20?= =?UTF-8?q?=EC=9E=90=EC=8B=A0=20=ED=94=BC=EB=93=9C=20=EC=A0=9C=EC=99=B8,?= =?UTF-8?q?=20=EA=B3=B5=EA=B0=9C=20=EA=B3=84=EC=A0=95=EC=9D=98=20=ED=94=BC?= =?UTF-8?q?=EB=93=9C=EB=A7=8C=20=EC=A1=B0=ED=9A=8C,=20isMine=20=ED=95=84?= =?UTF-8?q?=EB=93=9C=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../feed/dto/response/FeedListResponse.java | 1 - .../feed/repository/FeedQueryRepository.java | 21 +++ .../domain/feed/service/FeedServiceImpl.java | 3 - .../feed/controller/FeedControllerTest.java | 2 - .../domain/feed/service/FeedServiceTest.java | 121 +++++++++++++++--- 5 files changed, 121 insertions(+), 27 deletions(-) diff --git a/clokey-api/src/main/java/org/clokey/domain/feed/dto/response/FeedListResponse.java b/clokey-api/src/main/java/org/clokey/domain/feed/dto/response/FeedListResponse.java index fd61dddd..143b5f9d 100644 --- a/clokey-api/src/main/java/org/clokey/domain/feed/dto/response/FeedListResponse.java +++ b/clokey-api/src/main/java/org/clokey/domain/feed/dto/response/FeedListResponse.java @@ -21,7 +21,6 @@ public record FeedItemResponse( @Schema(description = "대표 이미지 URL", example = "https://example.com/image.jpg") String imageUrl, @Schema(description = "좋아요 여부", example = "true") boolean isLiked, - @Schema(description = "작성자 본인 여부", example = "false") boolean isMine, @Schema(description = "작성자 정보") FeedAuthorResponse author) {} @Schema(name = "FeedAuthorResponse", description = "피드 작성자 정보") diff --git a/clokey-api/src/main/java/org/clokey/domain/feed/repository/FeedQueryRepository.java b/clokey-api/src/main/java/org/clokey/domain/feed/repository/FeedQueryRepository.java index 1020536b..1bea9d7e 100644 --- a/clokey-api/src/main/java/org/clokey/domain/feed/repository/FeedQueryRepository.java +++ b/clokey-api/src/main/java/org/clokey/domain/feed/repository/FeedQueryRepository.java @@ -16,6 +16,7 @@ import org.clokey.domain.feed.query.FollowScope; import org.clokey.history.entity.History; import org.clokey.member.entity.QBlock; +import org.clokey.member.enums.Visibility; import org.springframework.stereotype.Repository; @Repository @@ -42,6 +43,8 @@ public List findFeeds( .fetchJoin() .where( history.banned.isFalse(), + notSelfCondition(currentMemberId), + visibilityCondition(currentMemberId), followScopeCondition(currentMemberId, followScope), notBlockedCondition(currentMemberId), styleFilterCondition(styleIds), @@ -62,6 +65,8 @@ public List findFeedsByIds(Long currentMemberId, List historyIds) .fetchJoin() .where( history.banned.isFalse(), + notSelfCondition(currentMemberId), + visibilityCondition(currentMemberId), history.id.in(historyIds), notBlockedCondition(currentMemberId)) .fetch(); @@ -135,4 +140,20 @@ private BooleanExpression notBlockedCondition(Long currentMemberId) { JPAExpressions.selectOne().from(blockCheck).where(blockCondition).exists()) .not(); } + + private BooleanExpression visibilityCondition(Long currentMemberId) { + if (currentMemberId == null) { + return member.visibility.eq(Visibility.PUBLIC); + } + + return member.visibility.eq(Visibility.PUBLIC).or(member.id.eq(currentMemberId)); + } + + private BooleanExpression notSelfCondition(Long currentMemberId) { + if (currentMemberId == null) { + return null; + } + + return member.id.ne(currentMemberId); + } } diff --git a/clokey-api/src/main/java/org/clokey/domain/feed/service/FeedServiceImpl.java b/clokey-api/src/main/java/org/clokey/domain/feed/service/FeedServiceImpl.java index 80b3d8b0..8c01194e 100644 --- a/clokey-api/src/main/java/org/clokey/domain/feed/service/FeedServiceImpl.java +++ b/clokey-api/src/main/java/org/clokey/domain/feed/service/FeedServiceImpl.java @@ -143,9 +143,6 @@ public FeedListResponse getFeeds( history.getCreatedAt(), imageUrlMap.get(history.getId()), likedHistoryIds.contains(history.getId()), - history.getMember() - .getId() - .equals(currentMember.getId()), toAuthorResponse( history.getMember(), followedMemberIds.contains( diff --git a/clokey-api/src/test/java/org/clokey/domain/feed/controller/FeedControllerTest.java b/clokey-api/src/test/java/org/clokey/domain/feed/controller/FeedControllerTest.java index c2f6f714..b4c727bc 100644 --- a/clokey-api/src/test/java/org/clokey/domain/feed/controller/FeedControllerTest.java +++ b/clokey-api/src/test/java/org/clokey/domain/feed/controller/FeedControllerTest.java @@ -42,7 +42,6 @@ class 피드_조회_요청_시 { LocalDateTime.parse("2025-01-01T12:00:00"), "https://image.test/10.png", true, - false, new FeedListResponse.FeedAuthorResponse( 2L, "clokey2", @@ -77,7 +76,6 @@ class 피드_조회_요청_시 { jsonPath("$.result.items[0].imageUrl") .value("https://image.test/10.png")) .andExpect(jsonPath("$.result.items[0].isLiked").value(true)) - .andExpect(jsonPath("$.result.items[0].isMine").value(false)) .andExpect(jsonPath("$.result.items[0].author.memberId").value(2L)) .andExpect(jsonPath("$.result.items[0].author.nickname").value("clokey2")) .andExpect( diff --git a/clokey-api/src/test/java/org/clokey/domain/feed/service/FeedServiceTest.java b/clokey-api/src/test/java/org/clokey/domain/feed/service/FeedServiceTest.java index 147b7ca5..b227086b 100644 --- a/clokey-api/src/test/java/org/clokey/domain/feed/service/FeedServiceTest.java +++ b/clokey-api/src/test/java/org/clokey/domain/feed/service/FeedServiceTest.java @@ -28,7 +28,6 @@ import org.clokey.history.entity.HistoryImage; import org.clokey.history.entity.Situation; import org.clokey.like.entity.MemberLike; -import org.clokey.member.entity.Block; import org.clokey.member.entity.Follow; import org.clokey.member.entity.Member; import org.clokey.member.entity.OauthInfo; @@ -59,20 +58,26 @@ class 전체_피드_조회할_때 { void setUp() { Member member1 = Member.createMember( - "testEmail10", - "testNickName10", - OauthInfo.createOauthInfo("oauth-current-10", OauthProvider.KAKAO)); + "testEmail1", + "testNickName1", + OauthInfo.createOauthInfo("testOauthId1", OauthProvider.KAKAO)); Member member2 = Member.createMember( - "testEmail20", - "testNickName20", - OauthInfo.createOauthInfo("oauth-a-20", OauthProvider.KAKAO)); + "testEmail2", + "testNickName2", + OauthInfo.createOauthInfo("testOauthId2", OauthProvider.KAKAO)); Member member3 = Member.createMember( - "testEmail30", - "testNickName30", - OauthInfo.createOauthInfo("oauth-b-30", OauthProvider.KAKAO)); - memberRepository.saveAll(List.of(member1, member2, member3)); + "testEmail3", + "testNickName3", + OauthInfo.createOauthInfo("testOauthId3", OauthProvider.KAKAO)); + Member member4 = + Member.createMember( + "testEmail4", + "testNickName4", + OauthInfo.createOauthInfo("testOauthId4", OauthProvider.KAKAO)); + member4.changeVisibility(); + memberRepository.saveAll(List.of(member1, member2, member3, member4)); given(memberUtil.getCurrentMember()).willReturn(member1); Situation situation = Situation.createSituation("daily"); @@ -90,7 +95,12 @@ void setUp() { History.createHistory(LocalDate.of(2025, 1, 4), "B1", member3, situation); History history3_2 = History.createHistory(LocalDate.of(2025, 1, 5), "B2", member3, situation); - historyRepository.saveAll(List.of(history3_1, history3_2)); + + History history4_1 = + History.createHistory(LocalDate.of(2025, 1, 4), "C1", member4, situation); + History history4_2 = + History.createHistory(LocalDate.of(2025, 1, 5), "C2", member4, situation); + historyRepository.saveAll(List.of(history3_1, history3_2, history4_1, history4_2)); historyImageRepository.saveAll( List.of( @@ -98,7 +108,9 @@ void setUp() { HistoryImage.createHistoryImage("img-a2", history2_2), HistoryImage.createHistoryImage("img-a3", history2_3), HistoryImage.createHistoryImage("img-b1", history3_1), - HistoryImage.createHistoryImage("img-b2", history3_2))); + HistoryImage.createHistoryImage("img-b2", history3_2), + HistoryImage.createHistoryImage("img-c1", history4_1), + HistoryImage.createHistoryImage("img-c2", history4_2))); } @Test @@ -186,10 +198,6 @@ void setUp() { @Test void 차단한_사용자의_피드는_노출되지_않는다() { - // given - Member member1 = memberRepository.findByNickname("testNickName10").orElseThrow(); - Member member2 = memberRepository.findByNickname("testNickName20").orElseThrow(); - blockRepository.save(Block.createBlock(member1, member2)); // when FeedListResponse response = feedService.getFeeds(FollowScope.ALL, List.of(), List.of(), 3, null); @@ -215,6 +223,35 @@ void setUp() { assertThat(response.items()).hasSize(2); assertThat(response.hasNext()).isFalse(); } + + @Test + void 비공개_계정의_피드는_전체_피드에서_노출되지_않는다() { + // when + FeedListResponse response = + feedService.getFeeds(FollowScope.ALL, List.of(), List.of(), 3, null); + + // then + Map historyIds = + historyRepository.findAll().stream() + .collect( + Collectors.toMap( + History::getContent, + History::getId, + (left, right) -> left)); + Long history3_1 = historyIds.get("B1"); + Long history3_2 = historyIds.get("B2"); + Long history4_1 = historyIds.get("C1"); + Long history4_2 = historyIds.get("C2"); + + assertThat(response.items()).hasSize(2); + List feedIds = + response.items().stream() + .map(FeedListResponse.FeedItemResponse::feedId) + .toList(); + assertThat(feedIds).containsExactly(history3_2, history3_1); + assertThat(feedIds).doesNotContain(history4_1, history4_2); + assertThat(response.hasNext()).isFalse(); + } } @Nested @@ -237,7 +274,13 @@ void setUp() { "testEmail3", "testNickName3", OauthInfo.createOauthInfo("oauth-b", OauthProvider.KAKAO)); - memberRepository.saveAll(List.of(member1, member2, member3)); + Member member4 = + Member.createMember( + "testEmail4", + "testNickName4", + OauthInfo.createOauthInfo("testOauthId4", OauthProvider.KAKAO)); + member4.changeVisibility(); + memberRepository.saveAll(List.of(member1, member2, member3, member4)); given(memberUtil.getCurrentMember()).willReturn(member1); Situation situation = Situation.createSituation("daily"); @@ -255,7 +298,11 @@ void setUp() { History.createHistory(LocalDate.of(2025, 1, 4), "B1", member3, situation); History history3_2 = History.createHistory(LocalDate.of(2025, 1, 5), "B2", member3, situation); - historyRepository.saveAll(List.of(history3_1, history3_2)); + History history4_1 = + History.createHistory(LocalDate.of(2025, 1, 4), "C1", member4, situation); + History history4_2 = + History.createHistory(LocalDate.of(2025, 1, 5), "C2", member4, situation); + historyRepository.saveAll(List.of(history3_1, history3_2, history4_1, history4_2)); historyImageRepository.saveAll( List.of( @@ -263,12 +310,15 @@ void setUp() { HistoryImage.createHistoryImage("img-a2", history2_2), HistoryImage.createHistoryImage("img-a3", history2_3), HistoryImage.createHistoryImage("img-b1", history3_1), - HistoryImage.createHistoryImage("img-b2", history3_2))); + HistoryImage.createHistoryImage("img-b2", history3_2), + HistoryImage.createHistoryImage("img-c1", history4_1), + HistoryImage.createHistoryImage("img-c2", history4_2))); followRepository.saveAll( List.of( Follow.createFollow(member1, member2), - Follow.createFollow(member1, member3))); + Follow.createFollow(member1, member3), + Follow.createFollow(member1, member4))); memberLikeRepository.save(MemberLike.createMemberLike(member1, history3_2)); } @@ -331,5 +381,34 @@ void setUp() { assertThat(second.hasNext()).isFalse(); assertThat(second.nextCursor()).isNull(); } + + @Test + void 비공개_계정의_피드는_팔로우하더라도_노출되지_않는다() { + // when + FeedListResponse response = + feedService.getFeeds(FollowScope.FOLLOWING, List.of(), List.of(), 3, null); + + // then + Map historyIds = + historyRepository.findAll().stream() + .collect( + Collectors.toMap( + History::getContent, + History::getId, + (left, right) -> left)); + Long history3_1 = historyIds.get("B1"); + Long history3_2 = historyIds.get("B2"); + Long history4_1 = historyIds.get("C1"); + Long history4_2 = historyIds.get("C2"); + + assertThat(response.items()).hasSize(2); + List feedIds = + response.items().stream() + .map(FeedListResponse.FeedItemResponse::feedId) + .toList(); + assertThat(feedIds).containsExactly(history3_2, history3_1); + assertThat(feedIds).doesNotContain(history4_1, history4_2); + assertThat(response.hasNext()).isFalse(); + } } } From 3d43395f96e7201811bcccc4a5a3347088a399c8 Mon Sep 17 00:00:00 2001 From: Ssamssamukja <109636635+Ssamssamukja@users.noreply.github.com> Date: Wed, 11 Feb 2026 02:19:51 +0900 Subject: [PATCH 2/3] =?UTF-8?q?fix:=20=EA=B8=B0=EB=A1=9D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95/=EC=82=AD=EC=A0=9C=20api=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - put 수정 - deleteHistory 댓글 FK cascade / 삭제 순서 수정 - clearStylesAndHashtags() → 쿼리 delete + flush - historyHashtagRepository.bulkInsertHistoryHashtags() 중복 방어 --- .../history/controller/HistoryController.java | 2 +- .../repository/HistoryHashtagRepository.java | 7 ++++- .../repository/HistoryStyleRepository.java | 6 +++++ .../history/service/HistoryServiceImpl.java | 19 +++++++------- .../controller/HistoryControllerTest.java | 8 +++--- .../service/HistoryServiceImplTest.java | 26 +++++++++++++++++++ 6 files changed, 53 insertions(+), 15 deletions(-) diff --git a/clokey-api/src/main/java/org/clokey/domain/history/controller/HistoryController.java b/clokey-api/src/main/java/org/clokey/domain/history/controller/HistoryController.java index 8af848b4..9e0b3bab 100644 --- a/clokey-api/src/main/java/org/clokey/domain/history/controller/HistoryController.java +++ b/clokey-api/src/main/java/org/clokey/domain/history/controller/HistoryController.java @@ -53,7 +53,7 @@ public BaseResponse createHistory( return BaseResponse.onSuccess(GlobalBaseSuccessCode.CREATED, response); } - @PatchMapping("/{historyId}") + @PutMapping("/{historyId}") @Operation( operationId = "History_updateHistory", summary = "기록 수정", diff --git a/clokey-api/src/main/java/org/clokey/domain/history/repository/HistoryHashtagRepository.java b/clokey-api/src/main/java/org/clokey/domain/history/repository/HistoryHashtagRepository.java index 412f2071..3300b719 100644 --- a/clokey-api/src/main/java/org/clokey/domain/history/repository/HistoryHashtagRepository.java +++ b/clokey-api/src/main/java/org/clokey/domain/history/repository/HistoryHashtagRepository.java @@ -1,11 +1,12 @@ package org.clokey.domain.history.repository; -import io.lettuce.core.dynamic.annotation.Param; import java.util.List; import org.clokey.history.entity.HistoryHashtag; import org.springframework.data.jpa.repository.EntityGraph; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; public interface HistoryHashtagRepository extends JpaRepository, HistoryHashtagRepositoryCustom { @@ -13,6 +14,10 @@ public interface HistoryHashtagRepository @EntityGraph(attributePaths = "hashtag") List findByHistoryId(Long historyId); + @Modifying + @Query("delete from HistoryHashtag hh where hh.history.id = :historyId") + void deleteAllByHistoryId(@Param("historyId") Long historyId); + @Query( """ select hh from HistoryHashtag hh diff --git a/clokey-api/src/main/java/org/clokey/domain/history/repository/HistoryStyleRepository.java b/clokey-api/src/main/java/org/clokey/domain/history/repository/HistoryStyleRepository.java index 0f2a3d4e..72a8caed 100644 --- a/clokey-api/src/main/java/org/clokey/domain/history/repository/HistoryStyleRepository.java +++ b/clokey-api/src/main/java/org/clokey/domain/history/repository/HistoryStyleRepository.java @@ -3,12 +3,18 @@ import java.util.List; import org.clokey.history.entity.HistoryStyle; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; public interface HistoryStyleRepository extends JpaRepository, HistoryStyleRepositoryCustom { List findByHistoryId(Long historyId); + @Modifying + @Query("delete from HistoryStyle hs where hs.history.id = :historyId") + void deleteAllByHistoryId(@Param("historyId") Long historyId); + @Query( """ select new org.clokey.domain.history.repository.HistoryStyleRepository$HistoryStyleInfo( diff --git a/clokey-api/src/main/java/org/clokey/domain/history/service/HistoryServiceImpl.java b/clokey-api/src/main/java/org/clokey/domain/history/service/HistoryServiceImpl.java index e1816919..36229e63 100644 --- a/clokey-api/src/main/java/org/clokey/domain/history/service/HistoryServiceImpl.java +++ b/clokey-api/src/main/java/org/clokey/domain/history/service/HistoryServiceImpl.java @@ -155,7 +155,11 @@ public void updateHistory(Long historyId, HistoryUpdateRequest request) { List existingImages = historyImageRepository.findByHistoryId(historyId); Map existingImageMap = existingImages.stream() - .collect(Collectors.toMap(HistoryImage::getImageUrl, Function.identity())); + .collect( + Collectors.toMap( + HistoryImage::getImageUrl, + Function.identity(), + (left, right) -> left)); Set requestedImageUrls = request.payloads().stream() @@ -362,6 +366,7 @@ public void deleteHistory(Long historyId) { clearStylesAndHashtags(historyId); memberLikeRepository.deleteAllByHistoryId(historyId); commentRepository.deleteAllByHistoryId(historyId); + commentRepository.flush(); reportRepository.deleteAllByTargetTypeAndTargetId(TargetType.HISTORY, historyId); historyRepository.delete(history); @@ -565,15 +570,11 @@ private void validateHistoryOwner(History history, Long memberId) { } private void clearStylesAndHashtags(Long historyId) { - List styles = historyStyleRepository.findByHistoryId(historyId); - if (!styles.isEmpty()) { - historyStyleRepository.deleteAll(styles); - } + historyStyleRepository.deleteAllByHistoryId(historyId); + historyStyleRepository.flush(); - List hashtags = historyHashtagRepository.findByHistoryId(historyId); - if (!hashtags.isEmpty()) { - historyHashtagRepository.deleteAll(hashtags); - } + historyHashtagRepository.deleteAllByHistoryId(historyId); + historyHashtagRepository.flush(); } private void deleteClothTagsByHistoryImageIds(List historyImageIds) { diff --git a/clokey-api/src/test/java/org/clokey/domain/history/controller/HistoryControllerTest.java b/clokey-api/src/test/java/org/clokey/domain/history/controller/HistoryControllerTest.java index 1846fe1b..d623429c 100644 --- a/clokey-api/src/test/java/org/clokey/domain/history/controller/HistoryControllerTest.java +++ b/clokey-api/src/test/java/org/clokey/domain/history/controller/HistoryControllerTest.java @@ -556,7 +556,7 @@ class 기록_수정_요청_시 { // when & then ResultActions perform = mockMvc.perform( - patch("/histories/1") + put("/histories/1") .contentType(MediaType.APPLICATION_JSON) .content(objectMapper.writeValueAsString(request))); @@ -586,7 +586,7 @@ class 기록_수정_요청_시 { ResultActions perform = mockMvc.perform( - patch("/histories/1") + put("/histories/1") .contentType(MediaType.APPLICATION_JSON) .content(objectMapper.writeValueAsString(request))); @@ -605,7 +605,7 @@ class 기록_수정_요청_시 { ResultActions perform = mockMvc.perform( - patch("/histories/1") + put("/histories/1") .contentType(MediaType.APPLICATION_JSON) .content(objectMapper.writeValueAsString(request))); @@ -628,7 +628,7 @@ class 기록_수정_요청_시 { ResultActions perform = mockMvc.perform( - patch("/histories/1") + put("/histories/1") .contentType(MediaType.APPLICATION_JSON) .content(objectMapper.writeValueAsString(request))); diff --git a/clokey-api/src/test/java/org/clokey/domain/history/service/HistoryServiceImplTest.java b/clokey-api/src/test/java/org/clokey/domain/history/service/HistoryServiceImplTest.java index d77f89c6..0d286e98 100644 --- a/clokey-api/src/test/java/org/clokey/domain/history/service/HistoryServiceImplTest.java +++ b/clokey-api/src/test/java/org/clokey/domain/history/service/HistoryServiceImplTest.java @@ -646,6 +646,32 @@ void setUp() { .isInstanceOf(BaseCustomException.class) .hasMessage(ClothErrorCode.NOT_CLOTH_OWNER.getMessage()); } + + @Test + void 기록에_중복된_이미지_URL이_존재할_때_수정_요청하면_성공해야_한다() { + // given + // 강제로 중복 이미지 생성 + History history = + transactionUtil.getResult(() -> historyRepository.findById(1L).orElseThrow()); + HistoryImage duplicateImage = HistoryImage.createHistoryImage("image1", history); + historyImageRepository.save(duplicateImage); + + HistoryUpdateRequest request = + new HistoryUpdateRequest( + "new content ", + 2L, + List.of(2L, 3L), + List.of("testHashtag2", "newHash"), + List.of( + new HistoryUpdateRequest.Payload( + "image1", + List.of( + new HistoryUpdateRequest.ClothTag( + 2L, 0.5, 0.6))))); + + // when & then + historyService.updateHistory(1L, request); + } } @Nested From b613fd82f2486241fb362268bc083c85de9473ac Mon Sep 17 00:00:00 2001 From: Ssamssamukja <109636635+Ssamssamukja@users.noreply.github.com> Date: Wed, 11 Feb 2026 02:30:05 +0900 Subject: [PATCH 3/3] =?UTF-8?q?fix:=20=ED=94=BC=EB=93=9C=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/feed/service/FeedServiceTest.java | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/clokey-api/src/test/java/org/clokey/domain/feed/service/FeedServiceTest.java b/clokey-api/src/test/java/org/clokey/domain/feed/service/FeedServiceTest.java index b227086b..347da3e9 100644 --- a/clokey-api/src/test/java/org/clokey/domain/feed/service/FeedServiceTest.java +++ b/clokey-api/src/test/java/org/clokey/domain/feed/service/FeedServiceTest.java @@ -28,6 +28,7 @@ import org.clokey.history.entity.HistoryImage; import org.clokey.history.entity.Situation; import org.clokey.like.entity.MemberLike; +import org.clokey.member.entity.Block; import org.clokey.member.entity.Follow; import org.clokey.member.entity.Member; import org.clokey.member.entity.OauthInfo; @@ -198,6 +199,11 @@ void setUp() { @Test void 차단한_사용자의_피드는_노출되지_않는다() { + // given + Member member1 = memberRepository.findByNickname("testNickName1").orElseThrow(); + Member member2 = memberRepository.findByNickname("testNickName2").orElseThrow(); + blockRepository.save(Block.createBlock(member1, member2)); + // when FeedListResponse response = feedService.getFeeds(FollowScope.ALL, List.of(), List.of(), 3, null); @@ -240,17 +246,18 @@ void setUp() { (left, right) -> left)); Long history3_1 = historyIds.get("B1"); Long history3_2 = historyIds.get("B2"); + Long history2_3 = historyIds.get("A3"); Long history4_1 = historyIds.get("C1"); Long history4_2 = historyIds.get("C2"); - assertThat(response.items()).hasSize(2); + assertThat(response.items()).hasSize(3); List feedIds = response.items().stream() .map(FeedListResponse.FeedItemResponse::feedId) .toList(); - assertThat(feedIds).containsExactly(history3_2, history3_1); + assertThat(feedIds).containsExactly(history3_2, history2_3, history3_1); assertThat(feedIds).doesNotContain(history4_1, history4_2); - assertThat(response.hasNext()).isFalse(); + assertThat(response.hasNext()).isTrue(); } } @@ -398,17 +405,18 @@ void setUp() { (left, right) -> left)); Long history3_1 = historyIds.get("B1"); Long history3_2 = historyIds.get("B2"); + Long history2_3 = historyIds.get("A3"); Long history4_1 = historyIds.get("C1"); Long history4_2 = historyIds.get("C2"); - assertThat(response.items()).hasSize(2); + assertThat(response.items()).hasSize(3); List feedIds = response.items().stream() .map(FeedListResponse.FeedItemResponse::feedId) .toList(); - assertThat(feedIds).containsExactly(history3_2, history3_1); + assertThat(feedIds).containsExactly(history3_2, history3_1, history2_3); assertThat(feedIds).doesNotContain(history4_1, history4_2); - assertThat(response.hasNext()).isFalse(); + assertThat(response.hasNext()).isTrue(); } } }