package org.kalipo.service; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import org.junit.runner.RunWith; import org.kalipo.Application; import org.kalipo.config.MongoConfiguration; import org.kalipo.domain.*; import org.kalipo.domain.Thread; import org.kalipo.repository.ReportRepository; import org.kalipo.repository.ReputationModifierRepository; import org.kalipo.repository.UserRepository; import org.kalipo.security.Privileges; import org.kalipo.security.SecurityUtils; import org.kalipo.web.rest.CommentResourceTest; import org.kalipo.web.rest.KalipoException; import org.kalipo.web.rest.TestUtil; import org.kalipo.web.rest.ThreadResourceTest; import org.springframework.boot.test.SpringApplicationConfiguration; import org.springframework.context.annotation.Import; import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.web.WebAppConfiguration; import javax.inject.Inject; import java.util.Arrays; import static org.assertj.core.api.Assertions.assertThat; /** * Test class for the ReputationService. * * @see org.kalipo.service.UserService */ @RunWith(SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration(classes = Application.class) @WebAppConfiguration @ActiveProfiles("dev") @Import(MongoConfiguration.class) public class ReputationModifierServiceTest { @Rule public ExpectedException exception = ExpectedException.none(); @Inject private CommentService commentService; @Inject private ThreadService threadService; @Inject private UserRepository userRepository; @Inject private ReputationModifierRepository reputationModifierRepository; @Inject private ReputationModifierService reputationModifierService; @Inject private ReportRepository reportRepository; private Comment comment; @Before public void test_before() throws KalipoException { TestUtil.mockSecurityContext("admin", Arrays.asList(Privileges.CREATE_COMMENT_SOLO, Privileges.REVIEW_COMMENT, Privileges.CREATE_THREAD)); Thread thread = ThreadResourceTest.newThread(); threadService.create(thread); comment = CommentResourceTest.newComment(); comment.setThreadId(thread.getId()); commentService.create(comment); } @Test public void test_initUser() { User userBefore = userRepository.findOne(SecurityUtils.getCurrentLogin()); // exception.expect(KalipoException.class); reputationModifierService.onUserCreation(userBefore); // get user reputation User userAfter = userRepository.findOne(SecurityUtils.getCurrentLogin()); assertThat(userBefore.getReputation()).isEqualTo(userAfter.getReputation() - reputationModifierRepository.findByType(ReputationModifier.Type.WELCOME).getReputation()); // delete revision // check reputation again } @Test public void test_likeComment() throws KalipoException { String currentLogin = SecurityUtils.getCurrentLogin(); User userBefore = userRepository.findOne(currentLogin); Vote newVote = new Vote(); newVote.setLike(true); newVote.setCommentId(comment.getId()); reputationModifierService.onCommentVoting(newVote, currentLogin); User userAfter = userRepository.findOne(currentLogin); int repLiked = reputationModifierRepository.findByType(ReputationModifier.Type.LIKED).getReputation(); int repLike = reputationModifierRepository.findByType(ReputationModifier.Type.LIKE).getReputation(); assertThat(userBefore.getReputation()).isEqualTo(userAfter.getReputation() - repLiked - repLike); } @Test public void test_dislikeComment() throws KalipoException { String currentLogin = SecurityUtils.getCurrentLogin(); User userBefore = userRepository.findOne(currentLogin); Vote newVote = new Vote(); newVote.setLike(false); newVote.setCommentId(comment.getId()); reputationModifierService.onCommentVoting(newVote, currentLogin); User userAfter = userRepository.findOne(currentLogin); int repDisliked = reputationModifierRepository.findByType(ReputationModifier.Type.DISLIKED).getReputation(); int repDislike = reputationModifierRepository.findByType(ReputationModifier.Type.DISLIKE).getReputation(); assertThat(userBefore.getReputation()).isEqualTo(userAfter.getReputation() - repDisliked - repDislike); } @Test public void test_approveReport() throws KalipoException { User userBefore = userRepository.findOne(SecurityUtils.getCurrentLogin()); Report newReport = new Report(); newReport.setCommentId(comment.getId()); newReport.setThreadId(comment.getThreadId()); newReport.setStatus(Report.Status.APPROVED); newReport.setAuthorId(SecurityUtils.getCurrentLogin()); newReport.setReason(Report.Reason.Copyright); newReport = reportRepository.save(newReport); reputationModifierService.onReportApprovalOrRejection(newReport); User userAfter = userRepository.findOne(SecurityUtils.getCurrentLogin()); int repReport = reputationModifierRepository.findByType(ReputationModifier.Type.REPORT).getReputation(); int repReported = reputationModifierRepository.findByType(ReputationModifier.Type.REPORTED).getReputation(); assertThat(userBefore.getReputation()).isEqualTo(userAfter.getReputation() - repReport - repReported); } @Test public void test_rejectReport() throws KalipoException { User userBefore = userRepository.findOne(SecurityUtils.getCurrentLogin()); Report newReport = new Report(); newReport.setAbused(true); newReport.setCommentId(comment.getId()); newReport.setThreadId(comment.getThreadId()); newReport.setStatus(Report.Status.REJECTED); newReport.setAuthorId(SecurityUtils.getCurrentLogin()); newReport.setReason(Report.Reason.Copyright); newReport = reportRepository.save(newReport); reputationModifierService.onReportApprovalOrRejection(newReport); User userAfter = userRepository.findOne(SecurityUtils.getCurrentLogin()); int repAbusedReport = reputationModifierRepository.findByType(ReputationModifier.Type.ABUSED_REPORT).getReputation(); assertThat(userBefore.getReputation()).isEqualTo(userAfter.getReputation() - repAbusedReport); } @Test public void test_punishDeletingComment() throws KalipoException { User userBefore = userRepository.findOne(SecurityUtils.getCurrentLogin()); reputationModifierService.onCommentDeletion(comment); User userAfter = userRepository.findOne(SecurityUtils.getCurrentLogin()); int repRmComment = reputationModifierRepository.findByType(ReputationModifier.Type.RM_COMMENT).getReputation(); assertThat(userBefore.getReputation()).isEqualTo(userAfter.getReputation() - repRmComment); } }