/*
* 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.core.SessionManager;
import net.jforum.entities.Category;
import net.jforum.entities.Forum;
import net.jforum.entities.MostUsersEverOnline;
import net.jforum.entities.Topic;
import net.jforum.entities.User;
import net.jforum.entities.UserSession;
import net.jforum.repository.CategoryRepository;
import net.jforum.repository.ForumRepository;
import net.jforum.repository.UserRepository;
import net.jforum.security.AccessForumRule;
import net.jforum.security.RoleManager;
import net.jforum.services.MostUsersEverOnlineService;
import net.jforum.util.ConfigKeys;
import net.jforum.util.GroupInteractionFilter;
import net.jforum.util.JForumConfig;
import net.jforum.util.SecurityConstants;
import org.junit.Assert;
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 ForumControllerTestCase {
@Mock private CategoryRepository categoryRepository;
@Mock private ForumRepository forumRepository;
@Mock private UserSession userSession;
@Mock private UserRepository userRepository;
@Mock private MostUsersEverOnlineService mostUsersEverOnlineService;
@Mock private JForumConfig config;
@Mock private GroupInteractionFilter groupInteractionFilter;
@Spy private MockResult mockResult;
@Mock private SessionManager sessionManager;
@InjectMocks private ForumController controller;
@Mock RoleManager roleManager;
@Test
public void showShouldHaveAccessForumConstraint() throws Exception {
Method method = controller.getClass().getMethod("show", int.class, int.class);
Assert.assertNotNull(method);
Assert.assertTrue(method.isAnnotationPresent(SecurityConstraint.class));
Assert.assertEquals(AccessForumRule.class, method.getAnnotation(SecurityConstraint.class).value());
Assert.assertTrue(method.getAnnotation(SecurityConstraint.class).displayLogin());
}
@Test
public void show() {
Forum forum = new Forum(forumRepository);
ArrayList<Category> categories = new ArrayList<Category>();
when(forumRepository.getTotalTopics(forum)).thenReturn(1);
when(forumRepository.get(1)).thenReturn(forum);
when(config.getInt(ConfigKeys.TOPICS_PER_PAGE)).thenReturn(10);
when(categoryRepository.getAllCategories()).thenReturn(categories);
when(sessionManager.isModeratorOnline()).thenReturn(true);
controller.show(1, 0);
verify(forumRepository).getTopics(forum, 0, 10);
assertEquals(new ArrayList<Topic>(), mockResult.included("topics"));
assertEquals(forum, mockResult.included("forum"));
assertEquals(categories, mockResult.included("categories"));
assertNotNull(mockResult.included("pagination"));
assertEquals(true, mockResult.included("isModeratorOnline"));
}
@Test
public void listCannotInteractWitOtherGroups() {
when(userSession.getRoleManager()).thenReturn(roleManager);
when(userSession.isLogged()).thenReturn(true);
when(roleManager.roleExists(SecurityConstants.INTERACT_OTHER_GROUPS)).thenReturn(false);
controller.list();
verify(groupInteractionFilter).filterForumListing(mockResult, userSession);
}
@Test
public void list() {
MostUsersEverOnline most = new MostUsersEverOnline();
ArrayList<Category> categories = new ArrayList<Category>();
ArrayList<UserSession> userSessions = new ArrayList<UserSession>();
when(categoryRepository.getAllCategories()).thenReturn(categories);
when(sessionManager.getLoggedSessions()).thenReturn(userSessions);
when(userRepository.getTotalUsers()).thenReturn(1);
when(forumRepository.getTotalMessages()).thenReturn(2);
when(sessionManager.getTotalLoggedUsers()).thenReturn(3);
when(sessionManager.getTotalAnonymousUsers()).thenReturn(4);
when(userRepository.getLastRegisteredUser()).thenReturn(new User());
when(mostUsersEverOnlineService.getMostRecentData(anyInt())).thenReturn(most);
when(sessionManager.getTotalUsers()).thenReturn(3);
when(config.getInt(ConfigKeys.POSTS_PER_PAGE)).thenReturn(7);
when(userSession.isLogged()).thenReturn(false);
controller.list();
assertEquals(categories,mockResult.included("categories"));
assertEquals(userSessions,mockResult.included("onlineUsers"));
assertEquals(1,mockResult.included("totalRegisteredUsers"));
assertEquals(2,mockResult.included("totalMessages"));
assertEquals(3,mockResult.included("totalLoggedUsers"));
assertEquals(4,mockResult.included("totalAnonymousUsers"));
assertEquals(new User(),mockResult.included("lastRegisteredUser"));
assertEquals(most,mockResult.included("mostUsersEverOnline"));
assertEquals(7,mockResult.included("postsPerPage"));
}
}