com.liferay.blogs.web.internal.portlet.action.TrackbackMVCActionCommandTest.java Source code

Java tutorial

Introduction

Here is the source code for com.liferay.blogs.web.internal.portlet.action.TrackbackMVCActionCommandTest.java

Source

/**
 * Copyright (c) 2000-present Liferay, Inc. All rights reserved.
 *
 * 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.
 */

package com.liferay.blogs.web.internal.portlet.action;

import com.liferay.blogs.kernel.exception.NoSuchEntryException;
import com.liferay.blogs.kernel.model.BlogsEntry;
import com.liferay.portal.kernel.portlet.PortletPreferencesFactory;
import com.liferay.portal.kernel.portlet.PortletPreferencesFactoryUtil;
import com.liferay.portal.kernel.security.auth.PrincipalException;
import com.liferay.portal.kernel.service.ServiceContext;
import com.liferay.portal.kernel.theme.ThemeDisplay;
import com.liferay.portal.kernel.util.Function;
import com.liferay.portal.kernel.util.Http;
import com.liferay.portal.kernel.util.HttpUtil;
import com.liferay.portal.kernel.util.Portal;
import com.liferay.portal.kernel.util.PortalUtil;
import com.liferay.portal.kernel.util.Props;
import com.liferay.portal.kernel.util.PropsUtil;
import com.liferay.portal.kernel.util.WebKeys;
import com.liferay.portlet.blogs.trackback.Trackback;

import javax.portlet.ActionRequest;
import javax.portlet.ActionResponse;
import javax.portlet.PortletPreferences;
import javax.portlet.PortletRequest;
import javax.portlet.PortletResponse;

import javax.servlet.http.HttpServletRequest;

import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;

import org.mockito.Matchers;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.mockito.internal.stubbing.answers.CallsRealMethods;

import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.mock.web.MockHttpServletResponse;

/**
 * @author Andr de Oliveira
 */
@PrepareForTest(ActionUtil.class)
@RunWith(PowerMockRunner.class)
public class TrackbackMVCActionCommandTest extends PowerMockito {

    @Before
    public void setUp() throws Exception {
        MockitoAnnotations.initMocks(this);

        setUpActionRequest();
        setUpActionUtil();
        setUpBlogsEntry();
        setUpHttpUtil();
        setUpPortalUtil();
        setUpPortletPreferencesFactoryUtil();
        setUpPropsUtil();
    }

    @Test
    public void testDisabledComments() throws Exception {
        when(_portletPreferences.getValue("enableComments", null)).thenReturn("false");

        addTrackback();

        assertError("Comments are disabled");
    }

    @Test
    public void testMismatchedIPAddress() throws Exception {
        initURL("123");

        addTrackback();

        assertError("Remote IP does not match the trackback URL's IP");
    }

    @Test
    public void testMissingURL() throws Exception {
        addTrackback();

        assertError("Trackback requires a valid permanent URL");
    }

    @Test(expected = NoSuchEntryException.class)
    public void testNoSuchEntryException() throws Exception {
        whenGetEntryThenThrow(new NoSuchEntryException());

        initValidURL();

        addTrackback();
    }

    @Test
    public void testPrincipalException() throws Exception {
        whenGetEntryThenThrow(new PrincipalException());

        initValidURL();

        addTrackback();

        assertError("Blog entry must have guest view permissions to enable trackbacks");
    }

    @Test
    public void testSuccess() throws Exception {
        _mockOriginalServletRequest.setParameter("blog_name", "__blogName__");
        _mockOriginalServletRequest.setParameter("excerpt", "__excerpt__");
        _mockOriginalServletRequest.setParameter("title", "__title__");

        initValidURL();

        addTrackback();

        assertSuccess();

        Mockito.verify(_trackback).addTrackback(Matchers.same(_blogsEntry), Matchers.same(_themeDisplay),
                Matchers.eq("__excerpt__"), Matchers.eq("__url__"), Matchers.eq("__blogName__"),
                Matchers.eq("__title__"), (Function<String, ServiceContext>) Matchers.any());
    }

    @Test
    public void testTrackbacksNotEnabled() throws Exception {
        when(_blogsEntry.isAllowTrackbacks()).thenReturn(false);

        initValidURL();

        addTrackback();

        assertError("Trackbacks are not enabled");
    }

    protected void addTrackback() throws Exception {
        TrackbackMVCActionCommand trackbackMVCActionCommand = new TrackbackMVCActionCommand(_trackback);

        trackbackMVCActionCommand.addTrackback(_actionRequest, _actionResponse);
    }

    protected void assertError(String msg) throws Exception {
        assertResponseContent("<?xml version=\"1.0\" encoding=\"utf-8\"?><response><error>1" + "</error><message>"
                + msg + "</message></response>");
    }

    protected void assertResponseContent(String expected) throws Exception {
        Assert.assertEquals(expected, _mockHttpServletResponse.getContentAsString());
    }

    protected void assertSuccess() throws Exception {
        assertResponseContent(
                "<?xml version=\"1.0\" encoding=\"utf-8\"?><response><error>0" + "</error></response>");
    }

    protected void initURL(String remoteIP) {
        String url = "__url__";

        when(_http.getIpAddress(url)).thenReturn(remoteIP);

        _mockOriginalServletRequest.addParameter("url", url);
    }

    protected void initValidURL() {
        initURL(_mockHttpServletRequest.getRemoteAddr());
    }

    protected void setUpActionRequest() {
        when(_actionRequest.getAttribute(WebKeys.THEME_DISPLAY)).thenReturn(_themeDisplay);

        when(_actionRequest.getPreferences()).thenReturn(_portletPreferences);

        when(_actionRequest.getAttribute(WebKeys.BLOGS_ENTRY)).thenReturn(_blogsEntry);
    }

    protected void setUpActionUtil() {
        mockStatic(ActionUtil.class, new CallsRealMethods());
    }

    protected void setUpBlogsEntry() {
        when(_blogsEntry.isAllowTrackbacks()).thenReturn(true);
    }

    protected void setUpHttpUtil() throws Exception {
        HttpUtil httpUtil = new HttpUtil();

        httpUtil.setHttp(_http);
    }

    protected void setUpPortalUtil() throws Exception {
        PortalUtil portalUtil = new PortalUtil();

        Portal portal = mock(Portal.class);

        when(portal.getOriginalServletRequest((HttpServletRequest) Matchers.any()))
                .thenReturn(_mockOriginalServletRequest);

        when(portal.getHttpServletRequest((PortletRequest) Matchers.any())).thenReturn(_mockHttpServletRequest);

        when(portal.getHttpServletResponse((PortletResponse) Matchers.any())).thenReturn(_mockHttpServletResponse);

        portalUtil.setPortal(portal);
    }

    protected void setUpPortletPreferencesFactoryUtil() throws Exception {
        PortletPreferencesFactoryUtil portletPreferencesFactoryUtil = new PortletPreferencesFactoryUtil();

        PortletPreferencesFactory portletPreferencesFactory = mock(PortletPreferencesFactory.class);

        when(portletPreferencesFactory.getExistingPortletSetup(Mockito.any(PortletRequest.class)))
                .thenReturn(_portletPreferences);

        portletPreferencesFactoryUtil.setPortletPreferencesFactory(portletPreferencesFactory);
    }

    protected void setUpPropsUtil() throws Exception {
        PropsUtil.setProps(mock(Props.class));
    }

    protected void whenGetEntryThenThrow(Throwable toBeThrown) throws Exception {

        stub(method(ActionUtil.class, "getEntry", PortletRequest.class)).toThrow(toBeThrown);
    }

    @Mock
    private ActionRequest _actionRequest;

    @Mock
    private ActionResponse _actionResponse;

    @Mock
    private BlogsEntry _blogsEntry;

    @Mock
    private Http _http;

    private final MockHttpServletRequest _mockHttpServletRequest = new MockHttpServletRequest();
    private final MockHttpServletResponse _mockHttpServletResponse = new MockHttpServletResponse();
    private final MockHttpServletRequest _mockOriginalServletRequest = new MockHttpServletRequest();

    @Mock
    private PortletPreferences _portletPreferences;

    private final ThemeDisplay _themeDisplay = new ThemeDisplay();

    @Mock
    private Trackback _trackback;

}