/** * 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.model.dao.hibernate; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.jtalks.common.service.exceptions.NotFoundException; import org.jtalks.jcommune.model.entity.PersistedObjectsFactory; import org.jtalks.jcommune.model.dao.PluginConfigurationDao; import org.jtalks.jcommune.model.entity.PluginConfiguration; import org.jtalks.jcommune.model.entity.PluginProperty; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.testng.AbstractTransactionalTestNGSpringContextTests; import org.springframework.test.context.transaction.TransactionConfiguration; import org.springframework.transaction.annotation.Transactional; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import java.util.Arrays; import java.util.Collections; import java.util.List; import static org.testng.Assert.*; import static org.unitils.reflectionassert.ReflectionAssert.assertReflectionEquals; /** * @author Anuar Nurmakanov */ @ContextConfiguration(locations = {"classpath:/org/jtalks/jcommune/model/entity/applicationContext-dao.xml"}) @TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true) @Transactional public class PluginConfigurationHibernateDaoTest extends AbstractTransactionalTestNGSpringContextTests { @Autowired private SessionFactory sessionFactory; @Autowired private PluginConfigurationDao pluginConfigurationDao; private Session session; @BeforeMethod public void init() { this.session = sessionFactory.getCurrentSession(); PersistedObjectsFactory.setSession(session); } /*===== Common methods =====*/ @Test public void getShouldReturnPluginById() { session.clear(); PluginConfiguration pluginConfiguration = PersistedObjectsFactory.getDefaultPluginConfiguration(); PluginConfiguration foundPluginConfiguration = pluginConfigurationDao.get(pluginConfiguration.getId()); assertNotNull(foundPluginConfiguration); assertReflectionEquals(foundPluginConfiguration, pluginConfiguration); } @Test public void getWithPassedIdOfNonExistingPluginShouldReturnNull() { PluginConfiguration nonExistPluginConfiguration = pluginConfigurationDao.get(-788888L); assertNull(nonExistPluginConfiguration, "PluginConfiguration doesn't exist, so get must return null"); } @Test public void saveOrUpdateShouldUpdatePluginConfiguration() { String newPluginName = "Poulpe pluginConfiguration"; PluginConfiguration pluginConfiguration = PersistedObjectsFactory.getDefaultPluginConfiguration(); pluginConfiguration.setName(newPluginName); pluginConfigurationDao.saveOrUpdate(pluginConfiguration); session.flush(); session.clear(); PluginConfiguration updatedPluginConfiguration = (PluginConfiguration) session.get(PluginConfiguration.class, pluginConfiguration.getId()); assertEquals(updatedPluginConfiguration.getName(), newPluginName, "After update pluginConfiguration properties must be updated."); } @Test public void saveOrUpdateShouldSaveNewPluginConfiguration() { PluginConfiguration newPluginConfiguration = new PluginConfiguration("New PluginConfiguration", true, Collections.<PluginProperty>emptyList()); pluginConfigurationDao.saveOrUpdate(newPluginConfiguration); session.evict(newPluginConfiguration); PluginConfiguration savedPluginConfiguration = (PluginConfiguration) session.get(PluginConfiguration.class, newPluginConfiguration.getId()); assertReflectionEquals(newPluginConfiguration, savedPluginConfiguration); } @Test public void saveOrUpdateShouldSavePluginConfigurationProperties() { PluginConfiguration pluginConfiguration = PersistedObjectsFactory.getDefaultPluginConfiguration(); PluginProperty property = new PluginProperty("Property", PluginProperty.Type.BOOLEAN, "true"); List<PluginProperty> properties = Arrays.asList(property); pluginConfiguration.setProperties(properties); pluginConfigurationDao.saveOrUpdate(pluginConfiguration); session.flush(); session.evict(pluginConfiguration); PluginConfiguration updatedPluginConfiguration = (PluginConfiguration) session.get(PluginConfiguration.class, pluginConfiguration.getId()); assertEquals(updatedPluginConfiguration.getProperties(), properties, "Plugin configuration properties should be saved."); } @Test(expectedExceptions = org.hibernate.exception.ConstraintViolationException.class) public void saveOrUpdateWithNullValuesShouldNotSavePlugin() { PluginConfiguration pluginConfiguration = PersistedObjectsFactory.getDefaultPluginConfiguration(); pluginConfiguration.setName(null); pluginConfigurationDao.saveOrUpdate(pluginConfiguration); session.flush(); } @Test public void getByNameShouldReturnOnePluginConfiguration() throws NotFoundException { PluginConfiguration pluginConfiguration = PersistedObjectsFactory.getDefaultPluginConfiguration(); PluginConfiguration actual = pluginConfigurationDao.get(pluginConfiguration.getName()); assertEquals(actual, pluginConfiguration); } @Test(expectedExceptions = NotFoundException.class) public void getShouldThrowIfDidNotFindPlugin() throws NotFoundException { pluginConfigurationDao.get("Some fake name"); } @Test public void updatePropertiesShouldUpdatePassedProperties() { //GIVEN PluginProperty property = PersistedObjectsFactory.getDefaultPluginConfigurationProperty(); String newPropertyName = "New property name"; property.setName(newPropertyName); //WHEN pluginConfigurationDao.updateProperties(Arrays.asList(property)); //THEN session.evict(property); PluginProperty updatedProperty = (PluginProperty) session.get(PluginProperty.class, property.getId()); assertEquals(updatedProperty.getName(), newPropertyName, "Property should be updated"); } }