/**
* 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.jtalks.common.model.entity.Component;
import org.jtalks.jcommune.model.dao.ComponentDao;
import org.jtalks.jcommune.model.entity.ComponentInformation;
import org.jtalks.jcommune.service.exceptions.ImageProcessException;
import org.jtalks.jcommune.service.nontransactional.Base64Wrapper;
import org.jtalks.jcommune.service.nontransactional.ImageService;
import org.mockito.Mock;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import java.util.Date;
import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.*;
import static org.mockito.MockitoAnnotations.initMocks;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertNull;
/**
* @author Anuar_Nurmakanov
* @author Andrei Alikov
*/
public class TransactionalComponentServiceTest {
private static final String FORUM_NAME = "my forum";
private static final String FORUM_DESCRIPTION = "my forum";
private static final String FORUM_LOGO_TOOLTIP = "my forum";
private static final long COMPONENT_ID = 42;
private static final String LOGO = "logo image";
private static final String ICON = "icon image";
private static final String ICON_IN_ICO_FORMAT = "icon ico image";
@Mock
private ComponentDao componentDao;
@Mock
private ImageService imageService;
@Mock
private Component component;
private TransactionalComponentService componentService;
@BeforeMethod
public void init() {
initMocks(this);
when(component.getId()).thenReturn(COMPONENT_ID);
componentService = new TransactionalComponentService(imageService, componentDao);
}
@Test
public void getComponentShouldBeDelegatedToDao() {
componentService.getComponentOfForum();
verify(componentDao).getComponent();
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void setComponentInformationShouldThrowExceptionWhenComponentIdIsNotSame() throws ImageProcessException {
when(componentDao.getComponent()).thenReturn(component);
ComponentInformation information = new ComponentInformation();
information.setId(COMPONENT_ID + 1);
componentService.setComponentInformation(information);
}
@Test
public void setComponentInformationShouldSetAllProperties() throws ImageProcessException {
when(componentDao.getComponent()).thenReturn(component);
Base64Wrapper wrapper = new Base64Wrapper();
byte[] iconBytes = wrapper.decodeB64Bytes(ICON);
when(imageService.preProcessAndEncodeInString64(iconBytes)).thenReturn(ICON_IN_ICO_FORMAT);
ComponentInformation information = new ComponentInformation();
information.setId(COMPONENT_ID);
information.setName(FORUM_NAME);
information.setDescription(FORUM_DESCRIPTION);
information.setLogoTooltip(FORUM_LOGO_TOOLTIP);
information.setLogo(LOGO);
information.setIcon(ICON);
componentService.setComponentInformation(information);
verify(component).setName(FORUM_NAME);
verify(component).setDescription(FORUM_DESCRIPTION);
verify(component).setProperty(TransactionalComponentService.LOGO_TOOLTIP_PROPERTY, FORUM_LOGO_TOOLTIP);
verify(component).setProperty(TransactionalComponentService.COMPONENT_FAVICON_ICO_PARAM, ICON_IN_ICO_FORMAT);
verify(component).setProperty(TransactionalComponentService.COMPONENT_FAVICON_PNG_PARAM, ICON);
verify(component).setProperty(TransactionalComponentService.LOGO_PROPERTY, LOGO);
verify(component).setProperty(eq(TransactionalComponentService.COMPONENT_INFO_CHANGE_DATE_PROPERTY), anyString());
}
@Test(dataProvider = "emptyValues")
public void setComponentInformationShouldShouldNotSetLogoIfItIsEmpty(String logo) throws ImageProcessException {
when(componentDao.getComponent()).thenReturn(component);
Base64Wrapper wrapper = new Base64Wrapper();
byte[] iconBytes = wrapper.decodeB64Bytes(ICON);
when(imageService.preProcessAndEncodeInString64(iconBytes)).thenReturn(ICON_IN_ICO_FORMAT);
ComponentInformation information = new ComponentInformation();
information.setId(COMPONENT_ID);
information.setName(FORUM_NAME);
information.setDescription(FORUM_DESCRIPTION);
information.setLogoTooltip(FORUM_LOGO_TOOLTIP);
information.setLogo(logo);
information.setIcon(ICON);
componentService.setComponentInformation(information);
verify(component).setName(FORUM_NAME);
verify(component).setDescription(FORUM_DESCRIPTION);
verify(component).setProperty(TransactionalComponentService.LOGO_TOOLTIP_PROPERTY, FORUM_LOGO_TOOLTIP);
verify(component).setProperty(TransactionalComponentService.COMPONENT_FAVICON_ICO_PARAM, ICON_IN_ICO_FORMAT);
verify(component).setProperty(TransactionalComponentService.COMPONENT_FAVICON_PNG_PARAM, ICON);
verify(component, never()).setProperty(eq(TransactionalComponentService.LOGO_PROPERTY), anyString());
verify(component).setProperty(eq(TransactionalComponentService.COMPONENT_INFO_CHANGE_DATE_PROPERTY),
anyString());
}
@Test(dataProvider = "emptyValues")
public void setComponentInformationShouldNotSetIconIfItIsEmpty(String icon) throws ImageProcessException {
when(componentDao.getComponent()).thenReturn(component);
ComponentInformation information = new ComponentInformation();
information.setId(COMPONENT_ID);
information.setName(FORUM_NAME);
information.setDescription(FORUM_DESCRIPTION);
information.setLogoTooltip(FORUM_LOGO_TOOLTIP);
information.setLogo(LOGO);
information.setIcon(icon);
componentService.setComponentInformation(information);
verify(component).setName(FORUM_NAME);
verify(component).setDescription(FORUM_DESCRIPTION);
verify(component).setProperty(TransactionalComponentService.LOGO_TOOLTIP_PROPERTY, FORUM_LOGO_TOOLTIP);
verify(component, never()).setProperty(TransactionalComponentService.COMPONENT_FAVICON_ICO_PARAM,
ICON_IN_ICO_FORMAT);
verify(component, never()).setProperty(TransactionalComponentService.COMPONENT_FAVICON_PNG_PARAM, ICON);
verify(component).setProperty(TransactionalComponentService.LOGO_PROPERTY, LOGO);
verify(component).setProperty(eq(TransactionalComponentService.COMPONENT_INFO_CHANGE_DATE_PROPERTY),
anyString());
}
@DataProvider(name = "emptyValues")
public Object[][] parameterResizeImage() {
return new Object[][]{{""}, {null}};
}
@Test
public void getComponentModificationTimeShouldReturnPropertyIfItExists() {
long lastModificationTime = 42;
when(componentDao.getComponent()).thenReturn(component);
when(component.getProperty(TransactionalComponentService.COMPONENT_INFO_CHANGE_DATE_PROPERTY))
.thenReturn(String.valueOf(lastModificationTime));
Date modificationTime = componentService.getComponentModificationTime();
assertEquals(modificationTime.getTime(), lastModificationTime);
}
@Test
public void getComponentModificationTimeShouldReturnNullIfNotExists() {
when(componentDao.getComponent()).thenReturn(component);
when(component.getProperty(TransactionalComponentService.COMPONENT_INFO_CHANGE_DATE_PROPERTY))
.thenReturn(null);
Date modificationTime = componentService.getComponentModificationTime();
assertNull(modificationTime);
}
}