/*
* Copyright (c) JForum Team. All rights reserved.
*
* The software in this package is published under the terms of the LGPL
* license a copy of which has been included with this distribution in the
* license.txt file.
*
* The JForum Project
* http://www.jforum.net
*/
package net.jforum.services;
import static org.mockito.Matchers.*;
import static org.mockito.Mockito.*;
import java.util.Arrays;
import java.util.List;
import net.jforum.actions.helpers.ApproveInfo;
import net.jforum.entities.Forum;
import net.jforum.entities.ModerationLog;
import net.jforum.entities.Post;
import net.jforum.entities.Topic;
import net.jforum.entities.User;
import net.jforum.repository.ForumRepository;
import net.jforum.repository.ModerationLogRepository;
import net.jforum.repository.PostRepository;
import net.jforum.repository.TopicRepository;
import net.jforum.util.ConfigKeys;
import net.jforum.util.JForumConfig;
import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
/**
* @author Rafael Steil, Jonatan Cloutier
*/
@RunWith(MockitoJUnitRunner.class)
public class ModerationServiceTestCase {
@Mock private ForumRepository forumRepository;
@Mock private PostRepository postRepository;
@Mock private TopicRepository topicRepository;
@Mock private JForumConfig config;
private ModerationLog moderationLog = new ModerationLog();
@Mock private ModerationLogRepository moderationLogRepository;
private ModerationLogService moderationLogService;
private ModerationService service;
//private States state = context.states("state");
private Post post1 = new Post();
private Post post2 = new Post();
private Post post5 = new Post();
private Post post6 = new Post();
@Before
public void setup() {
moderationLogService = new ModerationLogService(config, moderationLogRepository, topicRepository);
service = new ModerationService(postRepository, forumRepository, topicRepository, moderationLogService);
post1.setId(1);
post2.setId(2);
post5.setId(5);
post6.setId(6);
when(forumRepository.get(1)).thenReturn(new Forum()); //when(state.isNot("move");
// allowing(forumRepository); when(state.isNot("move"));
}
@Test
public void moveTopics() {
// state.become("move");
final Forum oldForum = new Forum(); oldForum.setId(1); oldForum.setLastPost(null);
final Forum targetForum = new Forum(); targetForum.setId(2); targetForum.setLastPost(null);
final Topic topic = new Topic(); topic.setId(3); topic.setMovedId(0); topic.setForum(oldForum);
when(config.getBoolean(ConfigKeys.MODERATION_LOGGING_ENABLED)).thenReturn(true);
when(forumRepository.get(2)).thenReturn(targetForum);
when(topicRepository.get(3)).thenReturn(topic);
when(forumRepository.getLastPost(oldForum)).thenReturn(post5);
when(forumRepository.getLastPost(targetForum)).thenReturn(post6);
service.moveTopics(2, moderationLog, 3);
verify(moderationLogRepository).add(any(ModerationLog.class));
verify(forumRepository).moveTopics(targetForum, topic.getId());
assertEquals(targetForum.getLastPost(), post6);
assertEquals(oldForum.getLastPost(), post5);
}
@Test
public void moveTopicsEmptyListShouldIgnore() {
service.moveTopics(1, null);
verifyZeroInteractions(forumRepository);
}
@Test
public void lockUnlock() {
final Topic lockedTopic = new Topic(); lockedTopic.lock();
final Topic unlockedTopic = new Topic(); unlockedTopic.unlock();
when(config.getBoolean(ConfigKeys.MODERATION_LOGGING_ENABLED)).thenReturn(false);
when(topicRepository.get(1)).thenReturn(lockedTopic);
when(topicRepository.get(2)).thenReturn(unlockedTopic);
int[] ids = {1, 2};
service.lockUnlock(ids, moderationLog);
assertFalse(lockedTopic.isLocked());
assertTrue(unlockedTopic.isLocked());
}
@Test
public void lockUnlockNullIdsShouldIgnore() {
service.lockUnlock(null, moderationLog);
}
@Test
public void deleteTopics() {
final Topic topic = new Topic(); topic.setId(1);
when(config.getBoolean(ConfigKeys.MODERATION_LOGGING_ENABLED)).thenReturn(false);
when(topicRepository.get(1)).thenReturn(topic);
service.deleteTopics(Arrays.asList(topic), moderationLog);
verify(topicRepository).remove(topic);
}
@Test
public void reject() {
when(postRepository.get(1)).thenReturn(post1);
ApproveInfo info = new ApproveInfo();
info.setPostId(1); info.setStatus(ApproveInfo.REJECT);
service.doApproval(1, this.asList(info));
verify(postRepository).remove(post1);
}
@Test
public void approveEntireTopicIsWaitingModerationShouldChangeTopicStatusAndNotIncrementTotalRepliesAndTotalUserPosts() {
final Post post = new Post(); post.setId(1); post.setModerate(true); post.setUser(new User());
Topic topic = new Topic(); topic.setPendingModeration(true); topic.setLastPost(null);
post.setTopic(topic);
when(postRepository.get(1)).thenReturn(post);
when(topicRepository.getLastPost(post.getTopic())).thenReturn(post);
ApproveInfo info = new ApproveInfo();
info.setPostId(1); info.setStatus(ApproveInfo.APPROVE);
service.doApproval(1, this.asList(info));
assertEquals(1, post.getUser().getTotalPosts());
assertFalse(topic.isWaitingModeration());
assertFalse(post.isWaitingModeration());
assertEquals(0, topic.getTotalReplies());
assertEquals(post, topic.getLastPost());
}
@Test
public void approvePostInExistingTopicShouldIncrementTotalRepliesAndTotalUserPosts() {
Topic topic = new Topic(); topic.setPendingModeration(false); topic.setLastPost(post2);
final Post post = new Post(); post.setId(1); post.setModerate(true);
post.setTopic(topic); post.setUser(new User());
when(postRepository.get(1)).thenReturn(post);
when(topicRepository.getLastPost(post.getTopic())).thenReturn(post);
ApproveInfo info = new ApproveInfo();
info.setPostId(1); info.setStatus(ApproveInfo.APPROVE);
service.doApproval(1, this.asList(info));
assertEquals(1, post.getUser().getTotalPosts());
assertFalse(post.isWaitingModeration());
assertEquals(1, topic.getTotalReplies());
assertEquals(post, topic.getLastPost());
}
@Test
public void deferShouldDoNothing() {
ApproveInfo info = new ApproveInfo();
info.setPostId(1); info.setStatus(ApproveInfo.DEFER);
service.doApproval(1, this.asList(info));
}
@Test
public void approveNullInfoShouldIgnore() {
service.doApproval(1, null);
}
private List<ApproveInfo> asList(ApproveInfo info) {
return Arrays.asList(info);
}
}