org.jtalks.jcommune.service.transactional.TransactionalTopicFetchServiceTest.java Source code

Java tutorial

Introduction

Here is the source code for org.jtalks.jcommune.service.transactional.TransactionalTopicFetchServiceTest.java

Source

/**
 * Copyright (C) 2011  JTalks.org Team
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 */
package org.jtalks.jcommune.service.transactional;

import org.apache.commons.lang.StringUtils;
import org.joda.time.DateTime;
import org.jtalks.jcommune.model.dao.TopicDao;
import org.jtalks.jcommune.model.dao.search.TopicSearchDao;
import org.jtalks.jcommune.model.dto.PageRequest;
import org.jtalks.jcommune.model.entity.Branch;
import org.jtalks.jcommune.model.entity.JCUser;
import org.jtalks.jcommune.model.entity.Topic;
import org.jtalks.jcommune.service.TopicFetchService;
import org.jtalks.jcommune.service.UserService;
import org.jtalks.jcommune.plugin.api.exceptions.NotFoundException;
import org.mockito.Matchers;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.testng.Assert;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

import java.util.Collections;
import java.util.List;

import static org.mockito.Matchers.any;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.mockito.MockitoAnnotations.initMocks;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertNotNull;

public class TransactionalTopicFetchServiceTest {

    @Mock
    private TopicDao topicDao;
    @Mock
    private UserService userService;
    @Mock
    private TopicSearchDao searchDao;

    private TopicFetchService topicFetchService;

    private JCUser user;

    @BeforeMethod
    public void init() {
        initMocks(this);
        topicFetchService = new TransactionalTopicFetchService(topicDao, userService, searchDao);
        user = new JCUser("username", "email@mail.com", "password");
        when(userService.getCurrentUser()).thenReturn(user);
    }

    @Test
    public void testGetTopic() throws NotFoundException {
        Topic expectedTopic = new Topic(user, "title");
        when(topicDao.isExist(999L)).thenReturn(true);
        when(topicDao.get(999L)).thenReturn(expectedTopic);

        int viewsCount = expectedTopic.getViews();

        Topic actualTopic = topicFetchService.get(999L);

        assertEquals(actualTopic.getViews(), viewsCount + 1);
        assertEquals(actualTopic, expectedTopic, "Topics aren't equal");
        verify(topicDao).isExist(999L);
        verify(topicDao).get(999L);
    }

    @Test(expectedExceptions = { NotFoundException.class })
    public void testGetTopicWithIncorrectId() throws NotFoundException {
        when(topicDao.isExist(333L)).thenReturn(false);

        topicFetchService.get(333L);
    }

    @Test
    public void testGetAllTopicsPastLastDay() throws NotFoundException {
        String pageNumber = "1";
        int pageSize = 20;
        List<Topic> expectedList = Collections.nCopies(2, new Topic(user, "title"));
        Page<Topic> expectedPage = new PageImpl<>(expectedList);
        when(topicDao.getTopicsUpdatedSince(Matchers.<DateTime>any(), Matchers.<PageRequest>any(), eq(user)))
                .thenReturn(expectedPage);
        user.setPageSize(pageSize);
        when(userService.getCurrentUser()).thenReturn(user);

        Page<Topic> actualPage = topicFetchService.getRecentTopics(pageNumber);

        assertNotNull(actualPage);
        assertEquals(expectedPage, actualPage);
        verify(topicDao).getTopicsUpdatedSince(Matchers.<DateTime>any(), Matchers.<PageRequest>any(), eq(user));
    }

    @Test
    public void testGetUnansweredTopics() {
        String pageNumber = "1";
        int pageSize = 20;
        List<Topic> expectedList = Collections.nCopies(2, new Topic(user, "title"));
        Page<Topic> expectedPage = new PageImpl<>(expectedList);
        when(topicDao.getUnansweredTopics(Matchers.<PageRequest>any(), eq(user))).thenReturn(expectedPage);
        user.setPageSize(pageSize);
        when(userService.getCurrentUser()).thenReturn(user);

        Page<Topic> actualPage = topicFetchService.getUnansweredTopics(pageNumber);
        assertNotNull(actualPage);
        assertEquals(actualPage, expectedPage);
    }

    @Test
    public void testGetTopics() {
        String pageNumber = "50";
        Branch branch = createBranch();
        Page<Topic> expectedPage = new PageImpl<>(Collections.<Topic>emptyList());

        JCUser currentUser = new JCUser("current", null, null);
        currentUser.setPageSize(50);
        when(userService.getCurrentUser()).thenReturn(currentUser);
        when(topicDao.getTopics(Matchers.any(Branch.class), Matchers.any(PageRequest.class)))
                .thenReturn(expectedPage);

        Page<Topic> actualPage = topicFetchService.getTopics(branch, pageNumber);

        assertEquals(actualPage, expectedPage, "Service returned incorrect data for one page of topics");
        verify(topicDao).getTopics(Matchers.any(Branch.class), Matchers.any(PageRequest.class));
    }

    private Branch createBranch() {
        Branch branch = new Branch("branch name", "branch description");
        branch.setId(1L);
        branch.setUuid("uuid");
        return branch;
    }

    @Test(dataProvider = "parameterSearchPostsWithEmptySearchPhrase")
    public void testSearchPostsWithEmptySearchPhrase(String phrase) {
        Page<Topic> searchResultPage = topicFetchService.searchByTitleAndContent(phrase, "50");

        Assert.assertTrue(!searchResultPage.hasContent(), "The search result must be empty.");
    }

    @DataProvider(name = "parameterSearchPostsWithEmptySearchPhrase")
    public Object[][] parameterSearchPostsWithEmptySearchPhrase() {
        return new Object[][] { { StringUtils.EMPTY }, { null } };
    }

    @Test
    public void testRebuildIndex() {
        topicFetchService.rebuildSearchIndex();

        Mockito.verify(searchDao).rebuildIndex();
    }

    @Test
    public void getTopicSilentlyShouldNotCallSaveOrUpdate() throws Exception {
        Topic expectedTopic = new Topic(user, "title");
        when(topicDao.isExist(999L)).thenReturn(true);
        when(topicDao.get(999L)).thenReturn(expectedTopic);

        Topic result = topicFetchService.getTopicSilently(999L);

        assertEquals(result, expectedTopic);
        verify(topicDao, never()).saveOrUpdate(any(Topic.class));
    }

    @Test(expectedExceptions = NotFoundException.class)
    public void getTopicSilentlyShouldThrowExceptionIfTopicNotFound() throws Exception {
        when(topicDao.isExist(333L)).thenReturn(false);

        topicFetchService.getTopicSilently(333L);
    }
}