/* * 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.controllers; import static org.junit.Assert.*; import static org.mockito.Mockito.*; import java.util.ArrayList; import javax.servlet.http.HttpServletRequest; import net.jforum.actions.helpers.Actions; import net.jforum.actions.helpers.AttachedFile; import net.jforum.actions.helpers.Domain; import net.jforum.actions.helpers.PostFormOptions; import net.jforum.entities.Forum; import net.jforum.entities.ModerationLog; import net.jforum.entities.PollOption; import net.jforum.entities.Post; import net.jforum.entities.Smilie; import net.jforum.entities.Topic; import net.jforum.entities.UserSession; import net.jforum.repository.PostRepository; import net.jforum.repository.SmilieRepository; import net.jforum.repository.TopicRepository; import net.jforum.security.RoleManager; import net.jforum.services.AttachmentService; import net.jforum.services.PostService; import net.jforum.util.ConfigKeys; import net.jforum.util.JForumConfig; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Spy; import org.mockito.runners.MockitoJUnitRunner; import br.com.caelum.vraptor.util.test.MockResult; /** * @author Rafael Steil, Jonatan Cloutier */ @RunWith(MockitoJUnitRunner.class) public class PostControllerTestCase { @Mock private PostRepository postRepository; @Mock private SmilieRepository smilieRepository; @Mock private TopicRepository topicRepository; @Mock private PostService postService; @Mock private JForumConfig config; @Mock private UserSession userSession; @Mock private AttachmentService attachmentService; @Mock private HttpServletRequest mockResquest; @Spy private MockResult mockResult; @Mock private RoleManager roleManager; @Mock private TopicController mockTopicControllerRedirect; @Mock private TopicController mockTopicControllerForward; @Mock private ForumController mockForumControllerRedirect; @Mock private ForumController mockForumControllerForward; @InjectMocks private PostController controller; private ModerationLog moderationLog = new ModerationLog(); private Post post; private Forum forum; @Spy private Topic topic; @Before public void setup() { forum = new Forum(); forum.setId(3); topic = spy(new Topic(topicRepository)); topic.setForum(forum); post = new Post(); post.setId(2); post.setTopic(topic); post.setForum(forum); when(userSession.getRoleManager()).thenReturn(roleManager); when(mockResult.redirectTo(ForumController.class)).thenReturn(mockForumControllerRedirect); when(mockResult.forwardTo(ForumController.class)).thenReturn(mockForumControllerForward); when(mockResult.redirectTo(TopicController.class)).thenReturn(mockTopicControllerRedirect); when(mockResult.forwardTo(TopicController.class)).thenReturn(mockTopicControllerForward); } @Test public void deleteHasMorePostsShouldRedirectToTopicListing() { this.deleteRedirect(1, 0); } @Test public void deleteHasMorePostsShouldRedirectToPage3() { this.deleteRedirect(14, 3); } @Test public void deleteLastMessageShouldRedirectToForum() { when(postRepository.get(2)).thenReturn(post); topic.decrementTotalReplies(); // we simulate the event dispatch controller.delete(2); verify(postService).delete(post); verify(mockForumControllerRedirect).show(topic.getForum().getId(), 0); } @Test public void editSave() { PostFormOptions options = new PostFormOptions(); when(postRepository.get(2)).thenReturn(post); controller.editSave(post, options, null, moderationLog); verify(postService).update(post, false, new ArrayList<PollOption>(), new ArrayList<AttachedFile>(), moderationLog); verify(mockTopicControllerRedirect).list(topic.getId(), 0, true); } @Test public void edit() { ArrayList<Smilie> smilies = new ArrayList<Smilie>(); when(postRepository.get(1)).thenReturn(post); when(smilieRepository.getAllSmilies()).thenReturn(smilies); controller.edit(1); assertEquals(post, mockResult.included("post")); assertEquals(true, mockResult.included("isEdit")); assertEquals(new Topic(), mockResult.included("topic")); assertEquals(forum, mockResult.included("forum")); assertEquals(smilies, mockResult.included("smilies")); verify(mockTopicControllerForward).add(0); } private void deleteRedirect(final int totalPosts, final int expectedPage) { when(topic.getTotalPosts()).thenReturn(totalPosts); topic.setId(7); when(postRepository.get(2)).thenReturn(post); when(config.getInt(ConfigKeys.POSTS_PER_PAGE)).thenReturn(5); controller.delete(2); this.redirectToPage(topic, expectedPage); verify(postService).delete(post); } private void redirectToPage(final Topic topic, final int expectedPage) { String url; if (expectedPage > 0) { url = String.format("/%s/%s/%s/%s", Domain.TOPICS, Actions.LIST, expectedPage, topic.getId()); } else { url = String.format("/%s/%s/%s", Domain.TOPICS, Actions.LIST, topic.getId()); } verify(mockResult).redirectTo(url); } }