/*
* This file is part of LibrePlan
*
* Copyright (C) 2009-2010 Fundación para o Fomento da Calidade Industrial e
* Desenvolvemento Tecnolóxico de Galicia
* Copyright (C) 2010-2011 Igalia, S.L.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.libreplan.web.test.ws.typeofworkhours;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.libreplan.business.BusinessGlobalNames.BUSINESS_SPRING_CONFIG_FILE;
import static org.libreplan.web.WebappGlobalNames.WEBAPP_SPRING_CONFIG_FILE;
import static org.libreplan.web.WebappGlobalNames.WEBAPP_SPRING_SECURITY_CONFIG_FILE;
import static org.libreplan.web.test.WebappGlobalNames.WEBAPP_SPRING_CONFIG_TEST_FILE;
import static org.libreplan.web.test.WebappGlobalNames.WEBAPP_SPRING_SECURITY_CONFIG_TEST_FILE;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import org.hibernate.SessionFactory;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.libreplan.business.common.IAdHocTransactionService;
import org.libreplan.business.common.IOnTransaction;
import org.libreplan.business.common.entities.IConfigurationBootstrap;
import org.libreplan.business.common.entities.IConfigurationTypeOfWorkHoursBootstrap;
import org.libreplan.business.common.exceptions.InstanceNotFoundException;
import org.libreplan.business.costcategories.daos.ITypeOfWorkHoursDAO;
import org.libreplan.business.costcategories.entities.ITypeOfWorkHoursBootstrap;
import org.libreplan.business.costcategories.entities.TypeOfWorkHours;
import org.libreplan.ws.common.api.InstanceConstraintViolationsDTO;
import org.libreplan.ws.typeofworkhours.api.ITypeOfWorkHoursService;
import org.libreplan.ws.typeofworkhours.api.TypeOfWorkHoursDTO;
import org.libreplan.ws.typeofworkhours.api.TypeOfWorkHoursListDTO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.Transactional;
/**
* Tests for <code>ITypeOfWorkHoursService</code>.
* @author Susana Montes Pedreira <smontes@wirelessgalicia.com>
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { BUSINESS_SPRING_CONFIG_FILE,
WEBAPP_SPRING_CONFIG_FILE, WEBAPP_SPRING_CONFIG_TEST_FILE,
WEBAPP_SPRING_SECURITY_CONFIG_FILE,
WEBAPP_SPRING_SECURITY_CONFIG_TEST_FILE })
public class TypeOfWorkHoursServiceTest {
@Autowired
private ITypeOfWorkHoursService typeOfWorkHoursService;
@Autowired
private ITypeOfWorkHoursDAO typeOfWorkHoursDAO;
@Autowired
private SessionFactory sessionFactory;
@Autowired
private IAdHocTransactionService transactionService;
@Autowired
private IConfigurationBootstrap configurationBootstrap;
@Autowired
private ITypeOfWorkHoursBootstrap typeOfWorkHoursBootstrap;
@Autowired
private IConfigurationTypeOfWorkHoursBootstrap configurationTypeOfWorkHoursBootstrap;
@Before
public void loadRequiredData() {
transactionService.runOnAnotherTransaction(new IOnTransaction<Void>() {
@Override
public Void execute() {
configurationBootstrap.loadRequiredData();
typeOfWorkHoursBootstrap.loadRequiredData();
configurationTypeOfWorkHoursBootstrap.loadRequiredData();
return null;
}
});
}
@Test
@Transactional
public void testAddAndGetTypeOfWorkHours() {
// Missing TypeOfWorkHours name.
TypeOfWorkHoursDTO cc1 = new TypeOfWorkHoursDTO(null, true,
new BigDecimal(5));
// Valid TypeOfWorkHours DTO without hour cost
TypeOfWorkHoursDTO cc2 = new TypeOfWorkHoursDTO("codeB", "cc2", true,
new BigDecimal(5));
/* TypeOfWorkHours list. */
TypeOfWorkHoursListDTO typeOfWorkHoursListDTO = createTypeOfWorkHoursListDTO(
cc1, cc2);
List<InstanceConstraintViolationsDTO> instanceConstraintViolationsList = typeOfWorkHoursService
.addTypeOfWorkHours(typeOfWorkHoursListDTO).instanceConstraintViolationsList;
assertTrue(instanceConstraintViolationsList.toString(),
instanceConstraintViolationsList.size() == 1);
assertTrue(instanceConstraintViolationsList.get(0).constraintViolations
.toString(),
instanceConstraintViolationsList.get(0).constraintViolations
.size() == 1); // cc1 constraint violations.
/* Test. */
assertFalse(typeOfWorkHoursDAO.existsByCode(cc1.code));
assertTrue(typeOfWorkHoursDAO.existsByCode(cc2.code));
}
@Test
public void testUpdateTypeOfWorkHours() throws InstanceNotFoundException {
// First one it creates valid type of work hours
final TypeOfWorkHoursDTO cc1 = new TypeOfWorkHoursDTO(
"newTypeOfWorkHours", true, new BigDecimal(5));
TypeOfWorkHoursListDTO typeOfWorkHoursListDTO = createTypeOfWorkHoursListDTO(cc1);
List<InstanceConstraintViolationsDTO> instanceConstraintViolationsList = typeOfWorkHoursService
.addTypeOfWorkHours(typeOfWorkHoursListDTO).instanceConstraintViolationsList;
transactionService.runOnTransaction(new IOnTransaction<Void>() {
@Override
public Void execute() {
typeOfWorkHoursDAO.flush();
return null;
}
});
/* Test. */
assertTrue(instanceConstraintViolationsList.toString(),
instanceConstraintViolationsList.size() == 0);
transactionService.runOnTransaction(new IOnTransaction<Void>() {
@Override
public Void execute() {
assertTrue(typeOfWorkHoursDAO.existsByCode(cc1.code));
return null;
}
});
final TypeOfWorkHours typeOfWorkHours = transactionService
.runOnTransaction(new IOnTransaction<TypeOfWorkHours>() {
@Override
public TypeOfWorkHours execute() {
try {
return typeOfWorkHoursDAO.findByCode(cc1.code);
} catch (InstanceNotFoundException e) {
throw new RuntimeException(e);
}
}
});
assertTrue(typeOfWorkHours.getName().equalsIgnoreCase(
"newTypeOfWorkHours"));
assertTrue(typeOfWorkHours.getEnabled());
assertTrue(typeOfWorkHours.getDefaultPrice().compareTo(
new BigDecimal(5)) == 0);
transactionService.runOnTransaction(new IOnTransaction<Void>() {
@Override
public Void execute() {
typeOfWorkHoursDAO.flush();
sessionFactory.getCurrentSession().evict(typeOfWorkHours);
return null;
}
});
typeOfWorkHours.dontPoseAsTransientObjectAnymore();
// Update the previous type of work hours
TypeOfWorkHoursDTO cc2 = new TypeOfWorkHoursDTO(cc1.code, "updateCC1",
false, new BigDecimal(100));
typeOfWorkHoursListDTO = createTypeOfWorkHoursListDTO(cc2);
instanceConstraintViolationsList = typeOfWorkHoursService
.addTypeOfWorkHours(typeOfWorkHoursListDTO).instanceConstraintViolationsList;
/* Test. */
assertTrue(instanceConstraintViolationsList.toString(),
instanceConstraintViolationsList.size() == 0);
transactionService.runOnTransaction(new IOnTransaction<Void>() {
@Override
public Void execute() {
assertTrue(typeOfWorkHoursDAO.existsByCode(cc1.code));
return null;
}
});
// Check if the changes was updated
TypeOfWorkHours typeOfWorkHours2 = transactionService
.runOnTransaction(new IOnTransaction<TypeOfWorkHours>() {
@Override
public TypeOfWorkHours execute() {
try {
return typeOfWorkHoursDAO.findByCode(cc1.code);
} catch (InstanceNotFoundException e) {
throw new RuntimeException(e);
}
}
});
assertTrue(typeOfWorkHours2.getName().equalsIgnoreCase("updateCC1"));
assertFalse(typeOfWorkHours2.getEnabled());
assertTrue(typeOfWorkHours2.getDefaultPrice().compareTo(
new BigDecimal(100)) == 0);
}
private TypeOfWorkHoursListDTO createTypeOfWorkHoursListDTO(
TypeOfWorkHoursDTO... typeOfWorkHours) {
List<TypeOfWorkHoursDTO> typeOfWorkHoursList = new ArrayList<TypeOfWorkHoursDTO>();
for (TypeOfWorkHoursDTO c : typeOfWorkHours) {
typeOfWorkHoursList.add(c);
}
return new TypeOfWorkHoursListDTO(typeOfWorkHoursList);
}
}