/*
* 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.Matchers.*;
import static org.mockito.Mockito.*;
import java.lang.reflect.Method;
import java.util.ArrayList;
import net.jforum.core.SecurityConstraint;
import net.jforum.entities.Forum;
import net.jforum.entities.Post;
import net.jforum.entities.PostReport;
import net.jforum.entities.PostReportStatus;
import net.jforum.entities.User;
import net.jforum.entities.UserSession;
import net.jforum.entities.util.PaginatedResult;
import net.jforum.entities.util.Pagination;
import net.jforum.repository.PostReportRepository;
import net.jforum.security.ModerationRule;
import net.jforum.security.RoleManager;
import net.jforum.util.ConfigKeys;
import net.jforum.util.JForumConfig;
import net.jforum.util.SecurityConstants;
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 PostReportControllerTestCase {
@Mock private UserSession userSession;
@Mock private RoleManager roleManager;
@Mock private PostReportRepository repository;
@Mock private JForumConfig config;
@Spy private MockResult mockResult;
@Mock private PostReportController mockPostReportController;
@InjectMocks private PostReportController controller;
@Test
public void listResolved() {
when(config.getInt(ConfigKeys.TOPICS_PER_PAGE)).thenReturn(10);
when(repository.getPaginated(0, 10, PostReportStatus.RESOLVED, new int[] {})).thenReturn(new PaginatedResult<PostReport>(new ArrayList<PostReport>(), 10));
controller.listResolved(0);
assertEquals(new Pagination(0, 0, 0, "", 0), mockResult.included("pagination"));
assertEquals(new ArrayList<PostReport>(), mockResult.included("reports"));
}
@Test
public void shouldHaveModerationRule() throws Exception {
this.assertMethodModerationRule("list");
this.assertMethodModerationRule("resolve", int.class);
this.assertMethodModerationRule("delete", int.class);
this.assertMethodModerationRule("listResolved", int.class);
}
private void assertMethodModerationRule(String methodName, Class<?>... argumentTypes) throws Exception {
Method method = controller.getClass().getMethod(methodName, argumentTypes);
assertNotNull(methodName, method);
assertTrue(methodName, method.isAnnotationPresent(SecurityConstraint.class));
assertEquals(methodName, ModerationRule.class, method.getAnnotation(SecurityConstraint.class).value());
}
@Test
public void reportNotLoggedShouldIgnore() {
when(userSession.isLogged()).thenReturn(false);
controller.report(1, "x");
verifyZeroInteractions(repository);
}
@Test
public void reportLoggedShouldSucceed() {
when(userSession.isLogged()).thenReturn(true);
when(userSession.getUser()).thenReturn(new User());
controller.report(1, "x");
verify(repository).add(any(PostReport.class));
}
@Test
public void deleteNotForumModeratorShouldIgnore() {
int[] forumIds = new int[] {1};
when(roleManager.getRoleValues(SecurityConstants.FORUM)).thenReturn(forumIds);
PostReport report = new PostReport();
report.setPost(new Post());
report.getPost().setForum(new Forum());
report.getPost().getForum().setId(2);
when(repository.get(1)).thenReturn(report);
when(mockResult.redirectTo(controller)).thenReturn(mockPostReportController);
controller.delete(1);
verify(mockPostReportController).list();
}
@Test
public void deleteShouldSucceed() {
int[] forumIds = new int[] {1};
when(roleManager.getRoleValues(SecurityConstants.FORUM)).thenReturn(forumIds);
PostReport report = new PostReport();
report.setPost(new Post());
report.getPost().setForum(new Forum());
report.getPost().getForum().setId(1);
when(repository.get(1)).thenReturn(report);
when(mockResult.redirectTo(controller)).thenReturn(mockPostReportController);
controller.delete(1);
verify(repository).remove(report);
verify(mockPostReportController).list();
}
@Test
public void listNotAdministratorShouldFilterByForum() {
int[] forumIds = new int[] {1, 2};
when(roleManager.isAdministrator()).thenReturn(false);
when(roleManager.isCoAdministrator()).thenReturn(false);
when(roleManager.getRoleValues(SecurityConstants.FORUM)).thenReturn(forumIds);
when(repository.getAll(PostReportStatus.UNRESOLVED, forumIds)).thenReturn(new ArrayList<PostReport>());
controller.list();
assertEquals(new ArrayList<PostReport>(), mockResult.included("reports"));
}
@Test
public void listNullStatusDefaultShouldBeUnresolved() {
controller.list();
verify(repository).getAll(PostReportStatus.UNRESOLVED, new int[] {});
}
@Test
public void listIsAdministratorShouldNotFilterByForum() {
when(roleManager.isAdministrator()).thenReturn(true);
when(repository.getAll(PostReportStatus.UNRESOLVED, null)).thenReturn(new ArrayList<PostReport>());
controller.list();
assertEquals(new ArrayList<PostReport>(), mockResult.included("reports"));
}
@Test
public void listIsCoAdministratorShouldNotFilterByForum() {
when(roleManager.isAdministrator()).thenReturn(false);
when(roleManager.isCoAdministrator()).thenReturn(true);
when(repository.getAll(PostReportStatus.UNRESOLVED, null)).thenReturn(new ArrayList<PostReport>());
controller.list();
assertEquals(new ArrayList<PostReport>(), mockResult.included("reports"));
}
@Before
public void setup() {
when(roleManager.getRoleValues(SecurityConstants.FORUM)).thenReturn(new int[] {});
when(userSession.getRoleManager()).thenReturn(roleManager);
}
}