/*
* 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 java.util.Arrays;
import net.jforum.actions.helpers.Actions;
import net.jforum.entities.Category;
import net.jforum.entities.Forum;
import net.jforum.entities.Post;
import net.jforum.entities.UserSession;
import net.jforum.entities.util.Pagination;
import net.jforum.entities.util.SearchParams;
import net.jforum.entities.util.SearchResult;
import net.jforum.repository.CategoryRepository;
import net.jforum.repository.SearchRepository;
import net.jforum.security.RoleManager;
import net.jforum.util.ConfigKeys;
import net.jforum.util.JForumConfig;
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 SearchControllerTestCase {
@Mock private CategoryRepository categoryRepository;
@Mock private JForumConfig config;
@Mock private SearchRepository searchRepository;
@Mock private UserSession userSession;
@Mock private RoleManager roleManager;
@Spy private MockResult mockResult;
@InjectMocks private SearchController controller;
@Test
public void executeWithEmptyQueryShouldRedirectToFilters() {
SearchParams params = new SearchParams();
params.setQuery("");
controller.execute(params);
verify(mockResult).redirectTo(Actions.FILTERS);
}
@Test
public void executeFindThreeRecordsOneIsNotAllowedShouldRemoveExpectTwoRecords() throws Exception {
final SearchResult result = new SearchResult(new ArrayList<Post>(Arrays.asList(this.newPost(1, 1), this.newPost(2, 1), this.newPost(3, 2))), 3);
final SearchParams params = new SearchParams();
params.setQuery("abc");
when(config.getInt(ConfigKeys.TOPICS_PER_PAGE)).thenReturn(30);
when(userSession.getRoleManager()).thenReturn(roleManager);
when(searchRepository.search(params)).thenReturn(result);
when(roleManager.isForumAllowed(1)).thenReturn(true);
when(roleManager.isForumAllowed(2)).thenReturn(false);
when(categoryRepository.getAllCategories()).thenReturn(new ArrayList<Category>());
controller.execute(params);
assertEquals(result.getResults(), mockResult.included("results"));
assertEquals(params, mockResult.included("searchParams"));
assertEquals(new Pagination(config, 0), mockResult.included("pagination"));
assertEquals(new ArrayList<Category>(), mockResult.included("categories"));
assertEquals(2, result.getTotalRecords());
assertEquals(2, result.getResults().size());
Post post = new Post();
post.setId(3);
assertFalse(result.getResults().contains(post));
}
@Test
public void filter() {
when(categoryRepository.getAllCategories()).thenReturn(new ArrayList<Category>());
controller.filters();
assertEquals(new ArrayList<Category>(), mockResult.included("categories"));
}
private Post newPost(int postId, int forumId) {
Post post = new Post();
post.setId(postId);
post.setForum(new Forum());
post.getForum().setId(forumId);
return post;
}
}