/*
* 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.business.test.planner.daos;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertEquals;
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.business.test.BusinessGlobalNames.BUSINESS_SPRING_CONFIG_TEST_FILE;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.UUID;
import org.joda.time.LocalDate;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.libreplan.business.common.exceptions.InstanceNotFoundException;
import org.libreplan.business.orders.daos.IHoursGroupDAO;
import org.libreplan.business.orders.daos.IOrderElementDAO;
import org.libreplan.business.orders.entities.HoursGroup;
import org.libreplan.business.orders.entities.Order;
import org.libreplan.business.orders.entities.OrderLine;
import org.libreplan.business.orders.entities.TaskSource;
import org.libreplan.business.orders.entities.TaskSource.TaskSourceSynchronization;
import org.libreplan.business.planner.daos.IResourceAllocationDAO;
import org.libreplan.business.planner.daos.ITaskElementDAO;
import org.libreplan.business.planner.daos.ITaskSourceDAO;
import org.libreplan.business.planner.entities.GenericResourceAllocation;
import org.libreplan.business.planner.entities.ResourceAllocation;
import org.libreplan.business.planner.entities.SpecificResourceAllocation;
import org.libreplan.business.planner.entities.Task;
import org.libreplan.business.resources.daos.IResourceDAO;
import org.libreplan.business.resources.daos.IWorkerDAO;
import org.libreplan.business.resources.entities.Resource;
import org.libreplan.business.resources.entities.Worker;
import org.libreplan.business.scenarios.IScenarioManager;
import org.libreplan.business.scenarios.bootstrap.IScenariosBootstrap;
import org.libreplan.business.scenarios.entities.OrderVersion;
import org.libreplan.business.scenarios.entities.Scenario;
import org.libreplan.business.workingday.ResourcesPerDay;
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;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { BUSINESS_SPRING_CONFIG_FILE,
BUSINESS_SPRING_CONFIG_TEST_FILE })
/*
* @author Diego Pino García <dpino@igalia.com>
*/
public class ResourceAllocationDAOTest {
public static OrderVersion setupVersionUsing(
IScenarioManager scenarioManager, Order order) {
Scenario current = scenarioManager.getCurrent();
OrderVersion result = OrderVersion.createInitialVersion(current);
order.setVersionForScenario(current, result);
return result;
}
@Autowired
private IResourceAllocationDAO resourceAllocationDAO;
@Autowired
private IOrderElementDAO orderElementDAO;
@Autowired
private ITaskElementDAO taskElementDAO;
@Autowired
private IHoursGroupDAO hoursGroupDAO;
@Autowired
private IWorkerDAO workerDAO;
@Autowired
private ITaskSourceDAO taskSourceDAO;
@Autowired
IResourceDAO resourceDAO;
@Autowired
private IScenariosBootstrap scenariosBootstrap;
@Autowired
private IScenarioManager scenarioManager;
enum ResourceAllocationType {
SPECIFIC_RESOURCE_ALLOCATION, GENERIC_RESOURCE_ALLOCATION
}
@Before
public void loadRequiredData() {
scenariosBootstrap.loadRequiredData();
}
private OrderLine createValidOrderLine() {
Order order = new Order();
order.setInitDate(new Date());
OrderVersion orderVersion = setupVersionUsing(scenarioManager, order);
order.useSchedulingDataFor(orderVersion);
OrderLine orderLine = OrderLine.create();
order.add(orderLine);
orderLine.setName(UUID.randomUUID().toString());
orderLine.setCode(UUID.randomUUID().toString());
orderElementDAO.save(orderLine);
return orderLine;
}
private Resource createValidWorker() {
Worker worker = Worker.create();
worker.setFirstName(UUID.randomUUID().toString());
worker.setSurname(UUID.randomUUID().toString());
worker.setNif(UUID.randomUUID().toString());
resourceDAO.save(worker);
return worker;
}
private ResourceAllocation<?> createValidResourceAllocation(
ResourceAllocationType type) {
OrderLine orderLine = createValidOrderLine();
Order order = orderLine.getOrder();
OrderVersion orderVersion = setupVersionUsing(scenarioManager,
order);
orderLine.useSchedulingDataFor(orderVersion);
assert orderLine.getSchedulingStateType().isSomewhatScheduled();
orderElementDAO.save(orderLine);
HoursGroup hoursGroup = HoursGroup.create(orderLine);
hoursGroup.setCode(UUID.randomUUID().toString());
hoursGroupDAO.save(hoursGroup);
List<HoursGroup> hoursGroups = Arrays.asList(hoursGroup);
TaskSource taskSource = TaskSource.create(orderLine
.getCurrentSchedulingDataForVersion(),
hoursGroups);
TaskSourceSynchronization synchronization = TaskSource
.mustAdd(taskSource);
synchronization.apply(TaskSource.persistTaskSources(taskSourceDAO));
Task task = (Task) taskSource.getTask();
if (ResourceAllocationType.SPECIFIC_RESOURCE_ALLOCATION.equals(type)) {
SpecificResourceAllocation specificResourceAllocation = SpecificResourceAllocation
.createForTesting(ResourcesPerDay.amount(1),
task);
Worker worker = (Worker) createValidWorker();
resourceDAO.save(worker);
specificResourceAllocation.setResource(worker);
return specificResourceAllocation;
}
if (ResourceAllocationType.GENERIC_RESOURCE_ALLOCATION.equals(type)) {
GenericResourceAllocation specificResourceAllocation = GenericResourceAllocation
.createForTesting(ResourcesPerDay.amount(1), task);
return specificResourceAllocation;
}
return null;
}
private SpecificResourceAllocation createValidSpecificResourceAllocation() {
return (SpecificResourceAllocation) createValidResourceAllocation(ResourceAllocationType.SPECIFIC_RESOURCE_ALLOCATION);
}
private GenericResourceAllocation createValidGenericResourceAllocation() {
return (GenericResourceAllocation) createValidResourceAllocation(ResourceAllocationType.GENERIC_RESOURCE_ALLOCATION);
}
@Test
@Transactional
public void testInSpringContainer() {
assertNotNull(resourceAllocationDAO);
assertNotNull(orderElementDAO);
assertNotNull(taskElementDAO);
assertNotNull(hoursGroupDAO);
assertNotNull(workerDAO);
assertNotNull(resourceDAO);
}
@Test
@Transactional
public void testSaveSpecificResourceAllocation() {
SpecificResourceAllocation resourceAllocation = createValidSpecificResourceAllocation();
resourceAllocationDAO.save(resourceAllocation);
assertTrue(resourceAllocationDAO.exists(resourceAllocation.getId()));
}
@Test
@Transactional
public void testSaveGenericResourceAllocation() {
GenericResourceAllocation resourceAllocation = createValidGenericResourceAllocation();
resourceAllocationDAO.save(resourceAllocation);
assertTrue(resourceAllocationDAO.exists(resourceAllocation.getId()));
}
@Test
@Transactional
public void testRemoveSpecificResourceAllocation()
throws InstanceNotFoundException {
SpecificResourceAllocation resourceAllocation = createValidSpecificResourceAllocation();
resourceAllocationDAO.save(resourceAllocation);
resourceAllocationDAO.remove(resourceAllocation.getId());
assertFalse(resourceAllocationDAO.exists(resourceAllocation.getId()));
}
@Test
@Transactional
public void testRemoveGenericResourceAllocation()
throws InstanceNotFoundException {
GenericResourceAllocation resourceAllocation = createValidGenericResourceAllocation();
resourceAllocationDAO.save(resourceAllocation);
resourceAllocationDAO.remove(resourceAllocation.getId());
assertFalse(resourceAllocationDAO.exists(resourceAllocation.getId()));
}
@Test
@Transactional
public void testListSpecificResourceAllocation() {
int previous = resourceAllocationDAO.list(ResourceAllocation.class).size();
SpecificResourceAllocation resourceAllocation1 = createValidSpecificResourceAllocation();
resourceAllocationDAO.save(resourceAllocation1);
ResourceAllocation<?> resourceAllocation2 = createValidSpecificResourceAllocation();
resourceAllocationDAO.save(resourceAllocation1);
resourceAllocationDAO.save(resourceAllocation2);
List<SpecificResourceAllocation> list = resourceAllocationDAO
.list(SpecificResourceAllocation.class);
assertEquals(previous + 2, list.size());
}
@Test
@Transactional
public void testListGenericResourceAllocation() {
int previous = resourceAllocationDAO.list(ResourceAllocation.class)
.size();
GenericResourceAllocation resourceAllocation1 = createValidGenericResourceAllocation();
resourceAllocationDAO.save(resourceAllocation1);
ResourceAllocation<?> resourceAllocation2 = createValidGenericResourceAllocation();
resourceAllocationDAO.save(resourceAllocation1);
resourceAllocationDAO.save(resourceAllocation2);
List<GenericResourceAllocation> list = resourceAllocationDAO
.list(GenericResourceAllocation.class);
assertEquals(previous + 2, list.size());
}
@Test
@Transactional
public void testFindAllocationsRelatedToResourcesWithDateFilter() {
Scenario current = scenarioManager.getCurrent();
ResourceAllocation<?> resourceAllocation1 = createValidSpecificResourceAllocation();
resourceAllocationDAO.save(resourceAllocation1);
LocalDate intervalInitDate = resourceAllocation1.getTask()
.getStartAsLocalDate();
LocalDate intervalEndDate = resourceAllocation1.getTask()
.getEndAsLocalDate();
List<Resource> resources = resourceAllocation1.getAssociatedResources();
assertTrue(resourceAllocationDAO.findAllocationsRelatedToAnyOf(
current, resources,
intervalInitDate, intervalEndDate).contains(resourceAllocation1));
intervalEndDate = intervalInitDate;
intervalInitDate = intervalInitDate.minusMonths(1);
assertTrue(resourceAllocationDAO.findAllocationsRelatedToAnyOf(current,
resources,
intervalInitDate, intervalEndDate).contains(resourceAllocation1));
intervalEndDate = intervalEndDate.minusMonths(1);
assertFalse(resourceAllocationDAO.findAllocationsRelatedToAnyOf(
current, resources,
intervalInitDate, intervalEndDate).contains(resourceAllocation1));
assertTrue(resourceAllocationDAO.findAllocationsRelatedToAnyOf(current,
resources,
intervalInitDate, null).contains(resourceAllocation1));
}
}