Skip to content

Commit

Permalink
fix : update review image And add testcode (#126)
Browse files Browse the repository at this point in the history
  • Loading branch information
hanni66 authored Sep 19, 2024
1 parent d4c13c0 commit 994d276
Show file tree
Hide file tree
Showing 3 changed files with 120 additions and 503 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,15 @@

import jjhhyb.deepvalley.community.repository.ImageRepository;
import jjhhyb.deepvalley.community.repository.ReviewImageRepository;
import jjhhyb.deepvalley.image.Image;
import jjhhyb.deepvalley.community.entity.Image;
import jjhhyb.deepvalley.community.entity.Review;
import jjhhyb.deepvalley.community.entity.ReviewImage;
import jjhhyb.deepvalley.entityId.ReviewImageId;
import jjhhyb.deepvalley.image.ImageService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
Expand All @@ -20,62 +20,62 @@
public class ReviewImageService {
private final ImageRepository imageRepository;
private final ReviewImageRepository reviewImageRepository;
private final ImageService imageService;

// 이미지 URL 리스트로 ReviewImage 객체 리스트 생성
// 이미지 처리 (ReviewImage 객체 리스트 생성)
public List<ReviewImage> processImages(List<String> imageUrls, Review review) {
return imageUrls.stream()
// 각 이미지 URL에 대해 이미지가 데이터베이스에 존재하는지 확인하고, 없으면 새로 저장
List<String> urls = imageUrls != null ? imageUrls : Collections.emptyList();
return urls.stream()
.map(imageUrl -> createOrUpdateImage(imageUrl, review))
.collect(Collectors.toList());
}

// 이미지 URL로 Image 객체 생성 or 업데이트
private ReviewImage createOrUpdateImage(String imageUrl, Review review) {
// 데이터베이스에서 이미지 조회, 없으면 새로 생성
// 주어진 이미지 URL에 대한 Image 객체를 조회하거나 새로 생성
Image image = imageRepository.findByImageUrl(imageUrl);
if (image == null) {
image = imageRepository.save(new Image(imageUrl));
}
// ReviewImage 객체 생성
return ReviewImage.builder()
.id(new ReviewImageId(review.getReviewId(), image.getImageId()))
.review(review)
.image(image)
.build();
}

// 리뷰와 연결된 이미지 업데이트
public void updateReviewImages(Review review, List<ReviewImage> updatedImages) {
Set<Long> updatedImageIds = updatedImages.stream()
.map(reviewImage -> reviewImage.getId().getImageId())
.collect(Collectors.toSet());

// 기존 이미지 리스트와 업데이트된 이미지 IDs를 비교하여 삭제할 이미지들을 결정
List<ReviewImage> existingImages = new ArrayList<>(review.getReviewImages()); // 모든 기존 이미지
List<ReviewImage> imagesToDelete = existingImages.stream() // 더 이상 사용되지 않는 이미지를 필터링해 포함
// 기존 이미지 리스트와 업데이트된 이미지 IDs를 비교하여 삭제할 이미지 결정
List<ReviewImage> existingImages = new ArrayList<>(review.getReviewImages());
List<ReviewImage> imagesToRemove = existingImages.stream()
.filter(existingImage -> !updatedImageIds.contains(existingImage.getId().getImageId()))
.toList();
.collect(Collectors.toList());

// 기존 이미지를 리뷰와의 연관관계에서 제거
review.getReviewImages().removeAll(existingImages);
reviewImageRepository.flush();
// 삭제할 이미지만 연관 관계에서 제거하고, 나머지는 유지
review.getReviewImages().removeAll(imagesToRemove);

// 새로운 이미지를 추가
updatedImages.forEach(newImage -> {
if (!review.getReviewImages().contains(newImage)) {
review.getReviewImages().add(newImage);
}
});

review.getReviewImages().clear();
review.getReviewImages().addAll(updatedImages);
reviewImageRepository.flush();
reviewImageRepository.deleteAll(imagesToRemove);
}

// S3에서 이미지 삭제
imageService.deleteImages(imagesToDelete.stream()
.map(image -> image.getImage().getImageUrl())
.collect(Collectors.toList()));
// 데이터 베이스에서 삭제
reviewImageRepository.deleteAll(existingImages);
// 주어진 리뷰 ID에 연결된 모든 ReviewImage 객체를 조회
public List<ReviewImage> findByReviewId(Long reviewId) {
return reviewImageRepository.findByReview_ReviewId(reviewId);
}

// 주어진 ReviewImage 리스트의 모든 이미지 삭제
// 주어진 ReviewImage 리스트의 모든 이미지를 삭제
public void deleteAll(List<ReviewImage> reviewImages) {
imageService.deleteImages(reviewImages.stream()
.map(image -> image.getImage().getImageUrl())
.collect(Collectors.toList()));
reviewImageRepository.deleteAll(reviewImages);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
package jjhhyb.deepvalley.community;

import jjhhyb.deepvalley.community.entity.Image;
import jjhhyb.deepvalley.community.entity.Review;
import jjhhyb.deepvalley.community.entity.ReviewImage;
import jjhhyb.deepvalley.community.repository.ImageRepository;
import jjhhyb.deepvalley.community.repository.ReviewImageRepository;
import jjhhyb.deepvalley.community.service.ReviewImageService;
import jjhhyb.deepvalley.entityId.ReviewImageId;

import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.verify;
import static org.mockito.ArgumentMatchers.anyList;
import static org.mockito.Mockito.times;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.MockBean;

import java.util.Arrays;
import java.util.List;

import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.Mockito.when;

@SpringBootTest
public class ReviewImageServiceTest {

@MockBean
private ImageRepository imageRepository;

@MockBean
private ReviewImageRepository reviewImageRepository;

@Autowired
private ReviewImageService reviewImageService;

@Test
public void testProcessImages() {
// 테스트 데이터 설정
Review review = new Review();
review.setReviewId(1L);
List<String> imageUrls = Arrays.asList("image1.jpg", "image2.jpg");

// ImageRepository mock 동작 설정 (이미지 URL에 대한 Image 엔티티 반환)
when(imageRepository.findByImageUrl("image1.jpg"))
.thenReturn(null); // 없을 경우 새로 생성
when(imageRepository.findByImageUrl("image2.jpg"))
.thenReturn(new Image(2L, "image2.jpg"));

when(imageRepository.save(any(Image.class)))
.thenAnswer(invocation -> {
Image image = invocation.getArgument(0); // 전달된 Image 객체
image.setImageId(1L); // imageId 설정
return image;
});

// processImages 호출
List<ReviewImage> reviewImages = reviewImageService.processImages(imageUrls, review);

// 결과 검증
assertEquals(2, reviewImages.size());
verify(imageRepository, times(1)).save(any(Image.class)); // 새 이미지가 저장되었는지 확인
}

@Test
public void testUpdateReviewImages() {
// 기존 리뷰 설정
Review review = new Review();
review.setReviewId(1L);

// 기존 이미지
ReviewImage oldImage = new ReviewImage();
oldImage.setId(new ReviewImageId(1L, 1L)); // ReviewId, ImageId
review.getReviewImages().add(oldImage);

// 새로운 이미지
ReviewImage newImage = new ReviewImage();
newImage.setId(new ReviewImageId(1L, 2L));

List<ReviewImage> updatedImages = Arrays.asList(newImage);

// updateReviewImages 호출
reviewImageService.updateReviewImages(review, updatedImages);

// 검증
assertTrue(review.getReviewImages().contains(newImage)); // 새로운 이미지가 추가되었는지 확인
assertFalse(review.getReviewImages().contains(oldImage)); // 기존 이미지가 제거되었는지 확인

verify(reviewImageRepository, times(1)).deleteAll(anyList()); // 기존 이미지 삭제 확인
}
}
Loading

0 comments on commit 994d276

Please sign in to comment.