diff --git a/src/main/java/at/ac/uibk/gitsearch/service/ReviewService.java b/src/main/java/at/ac/uibk/gitsearch/service/ReviewService.java index 37e7c713754532bf178d9f30316e8412a59f1427..b4907c5c41d2f1417b673edf6651fc306e3eeab4 100644 --- a/src/main/java/at/ac/uibk/gitsearch/service/ReviewService.java +++ b/src/main/java/at/ac/uibk/gitsearch/service/ReviewService.java @@ -16,6 +16,7 @@ import java.util.List; import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; +import javax.transaction.Transactional; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -23,6 +24,7 @@ import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.stereotype.Service; @Service +@Transactional public class ReviewService { private static final String REVIEW_UPDATED = "Review Updated"; @@ -110,6 +112,8 @@ public class ReviewService { .filter(reviewRating -> !review.getUsers().contains(reviewRating.getUser().getEmail())) .forEach(reviewRating -> reviewRatingRepository.delete(reviewRating)); reviewEntity.setResource(review.getResource()); + reviewEntity.setLink(review.getLink()); + Set<ReviewRating> reviewRatings = new HashSet<>(); review .getUsers() @@ -265,6 +269,8 @@ public class ReviewService { reviewDTO.setUsers( review.getComments().stream().map(reviewRating -> reviewRating.getUser().getEmail()).collect(Collectors.toList()) ); + reviewDTO.setLink(review.getLink()); + reviewDTO.setRequestedBy(userService.getUserById(review.getRequestedBy()).get().getEmail()); reviewDTO.setId(review.getId()); reviewDTO.setStatus(review.getComments().stream().map(reviewRating -> reviewRating.getStatus()).collect(Collectors.toList())); reviewDTO.setComments(review.getComments().stream().map(reviewRating -> reviewRating.getComment()).collect(Collectors.toList())); diff --git a/src/test/java/at/ac/uibk/gitsearch/service/ReviewServiceTest.java b/src/test/java/at/ac/uibk/gitsearch/service/ReviewServiceTest.java new file mode 100644 index 0000000000000000000000000000000000000000..8bd38873c35886f4089faa241a6dd9a781b8ba94 --- /dev/null +++ b/src/test/java/at/ac/uibk/gitsearch/service/ReviewServiceTest.java @@ -0,0 +1,212 @@ +package at.ac.uibk.gitsearch.service; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; + +import at.ac.uibk.gitsearch.GitsearchApp; +import at.ac.uibk.gitsearch.domain.Review; +import at.ac.uibk.gitsearch.domain.ReviewRating; +import at.ac.uibk.gitsearch.domain.Statistics; +import at.ac.uibk.gitsearch.repository.jpa.ReviewRatingRepository; +import at.ac.uibk.gitsearch.repository.jpa.ReviewRepository; +import at.ac.uibk.gitsearch.repository.jpa.StatisticsRepository; +import at.ac.uibk.gitsearch.security.AuthoritiesConstants; +import at.ac.uibk.gitsearch.service.dto.ReviewDTO; +import at.ac.uibk.gitsearch.service.dto.ReviewRequest; +import java.util.ArrayList; +import java.util.List; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.test.web.servlet.MockMvc; + +@SpringBootTest(classes = GitsearchApp.class) +@ExtendWith(MockitoExtension.class) +@AutoConfigureMockMvc +public class ReviewServiceTest { + + @Autowired + private MockMvc mockMvc; + + @Autowired + private ReviewRepository reviewRepository; + + @Autowired + private ReviewRatingRepository reviewRatingRepository; + + @Autowired + private ReviewService reviewService; + + @Autowired + private StatisticsRepository statisticsRepository; + + @BeforeEach + @WithMockUser(authorities = AuthoritiesConstants.ADMIN, username = "admin") + public void tearDown() { + reviewRatingRepository.deleteAll(); + reviewRepository.deleteAll(); + List<String> reviewers = new ArrayList<>(); + reviewers.add("user@localhost"); + + reviewService.createReview(new ReviewRequest("resource", "codeability.at", "1", reviewers)); + } + + @Test + @WithMockUser(authorities = AuthoritiesConstants.ADMIN, username = "admin") + public void createReviewTest() { + List<String> reviewers = new ArrayList<>(); + reviewers.add("user@localhost"); + + int size = reviewRepository.findAll().size(); + + reviewService.createReview(new ReviewRequest("resource1", "codeability1.at", "2", reviewers)); + + List<Review> reviewList = reviewRepository.findAll(); + assertThat(reviewList).hasSize(size + 1); + + Review testReview = reviewList.stream().filter(r -> r.getResource().equals("resource1")).findFirst().get(); + assertThat(testReview.getResource()).isEqualTo("resource1"); + } + + @Test + @WithMockUser(authorities = AuthoritiesConstants.USER, username = "user") + public void updateReviewTest() { + List<Review> reviewList = reviewRepository.findAll(); + Review testReview = reviewList.get(0); + testReview.setLink("newLink"); + reviewService.updateReview(reviewService.reviewToDTO(testReview)); + + reviewList = reviewRepository.findAll(); + assertThat(reviewList).hasSize(1); + + testReview = reviewList.get(0); + assertThat(testReview.getLink()).isEqualTo("newLink"); + } + + @Test + @WithMockUser(authorities = AuthoritiesConstants.USER, username = "user") + public void updateStatusTest() { + List<Review> reviewList = reviewRepository.findAll(); + Review testReview = reviewList.get(0); + + reviewService.updateStatus(testReview.getId(), "TEST"); + + reviewList = reviewRepository.findAll(); + testReview = reviewList.get(0); + testReview.getComments().forEach(c -> assertThat(c.getStatus()).isEqualTo("TEST")); + } + + @Test + @WithMockUser(authorities = AuthoritiesConstants.ADMIN, username = "admin") + public void getAllReviewsTest() { + List<String> reviewers = new ArrayList<>(); + reviewers.add("user@localhost"); + reviewService.createReview(new ReviewRequest("resource1", "codeability1.at", "2", reviewers)); + + List<ReviewDTO> reviewList = reviewService.getAllReviews(); + assertThat(reviewList).hasSize(2); + + reviewList.forEach(r -> assertThat(r.getResource()).isIn("resource", "resource1")); + } + + @Test + @WithMockUser(authorities = AuthoritiesConstants.ADMIN, username = "admin") + public void getAllReviewsWithStatisticsTest() { + List<ReviewDTO> reviewList = reviewService.getAllReviewsWithStatistics(); + assertThat(reviewList).hasSize(1); + reviewList.forEach(r -> assertThat(r.getBadgeRewarded()).isFalse()); + } + + @Test + @WithMockUser(authorities = AuthoritiesConstants.USER, username = "admin") + public void getReviewsByUserTest() { + List<ReviewDTO> reviewList = reviewService.getReviewsByUser(); + reviewList.forEach(r -> assertThat(r.getResource()).isEqualTo("resource")); + reviewList.forEach(r -> r.getUsers().stream().forEach(u -> assertEquals("ANNONYMIZED", u))); + } + + @Test + @WithMockUser(authorities = AuthoritiesConstants.USER, username = "user") + public void updateReviewDeletionByUserTest() throws IllegalAccessException { + List<ReviewDTO> reviewList = reviewService.getReviewsByUser(); + ReviewDTO reviewDTO = reviewList.get(0); + + reviewDTO.getStatus().set(0, "DELETION REQUESTED"); + reviewService.updateReviewRatingByUser(reviewDTO); + reviewList = reviewService.getReviewsByUser(); + assertEquals(reviewList.size(), 0); + } + + @Test + @WithMockUser(authorities = AuthoritiesConstants.ADMIN, username = "admin") + public void deleteReviewTest() { + List<Review> reviewList = reviewRepository.findAll(); + Review testReview = reviewList.get(0); + reviewService.deleteReview(testReview.getId()); + + reviewList = reviewRepository.findAll(); + assertThat(reviewList).hasSize(0); + } + + @Test + @WithMockUser(authorities = AuthoritiesConstants.USER, username = "user") + public void reviewToDTOTest() { + List<String> reviewers = new ArrayList<>(); + reviewers.add("user@localhost"); + + Review testReview = reviewService.createReview(new ReviewRequest("resource2", "codeability2.at", "2", reviewers)); + + ReviewDTO reviewDTO = reviewService.reviewToDTO(testReview); + + assertEquals(reviewDTO.getResource(), testReview.getResource()); + assertEquals(reviewDTO.getUsers(), testReview.getComments().stream().map(c -> c.getUser().getEmail()).toList()); + assertEquals(reviewDTO.getComments(), testReview.getComments().stream().map(c -> c.getComment()).toList()); + assertEquals(reviewDTO.getId(), testReview.getId()); + assertEquals(reviewDTO.getStatus(), testReview.getComments().stream().map(reviewRating -> reviewRating.getStatus()).toList()); + assertEquals(reviewDTO.getLink(), testReview.getLink()); + } + + @Test + @WithMockUser(authorities = AuthoritiesConstants.ADMIN, username = "admin") + public void getReviewTest() { + Review reviewTest = reviewRepository.findAll().get(0); + + ReviewDTO review = reviewService.getReview(reviewTest.getId()); + + assertEquals(review.getId(), reviewTest.getId()); + assertEquals(review.getResource(), reviewTest.getResource()); + assertEquals(review.getLink(), reviewTest.getLink()); + } + + @Test + @WithMockUser(authorities = AuthoritiesConstants.ADMIN, username = "admin") + public void rewardBadgeTest() { + Review reviewTest = reviewRepository.findAll().get(0); + reviewService.rewardBadge(reviewTest.getId()); + + Statistics statistics = statisticsRepository.findByExerciseID(reviewTest.getResourceID()).get(); + + assertEquals(statistics.getBadgeRewarded(), true); + } + + @Test + @WithMockUser(authorities = AuthoritiesConstants.ADMIN, username = "admin") + public void requestReviewForExerciseTest() { + List<String> reviewers = new ArrayList<>(); + reviewers.add("user@localhost"); + + reviewService.requestReviewForExercise(new ReviewRequest("resource3", "codeability3.at", "2", reviewers)); + + List<Review> reviewList = reviewRepository.findAll(); + assertThat(reviewList).hasSize(2); + + Review testReview = reviewList.stream().filter(r -> r.getResource().equals("resource3")).findFirst().get(); + assertThat(testReview.getResource()).isEqualTo("resource3"); + testReview.getComments().forEach(c -> assertThat(c.getStatus()).isEqualTo("REQUESTED")); + } +}