diff --git a/libreplan-webapp/src/test/java/importers/ImportRosterFromTimTest.java b/libreplan-webapp/src/test/java/importers/ImportRosterFromTimTest.java
new file mode 100644
index 000000000..cea41415c
--- /dev/null
+++ b/libreplan-webapp/src/test/java/importers/ImportRosterFromTimTest.java
@@ -0,0 +1,291 @@
+/*
+ * This file is part of LibrePlan
+ *
+ * Copyright (C) 2013 St. Antoniusziekenhuis
+ *
+ * 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 .
+ */
+
+package importers;
+
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertThat;
+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.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Properties;
+import java.util.TreeMap;
+
+import org.joda.time.LocalDate;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.libreplan.business.calendars.entities.CalendarException;
+import org.libreplan.business.calendars.entities.CalendarExceptionType;
+import org.libreplan.business.calendars.entities.CalendarExceptionTypeColor;
+import org.libreplan.business.calendars.entities.Capacity;
+import org.libreplan.business.calendars.entities.ResourceCalendar;
+import org.libreplan.business.common.IAdHocTransactionService;
+import org.libreplan.business.common.IOnTransaction;
+import org.libreplan.business.resources.daos.IWorkerDAO;
+import org.libreplan.business.resources.entities.Worker;
+import org.libreplan.business.workingday.EffortDuration;
+import org.libreplan.importers.ImportRosterFromTim;
+import org.libreplan.importers.TimSoapClient;
+import org.libreplan.importers.tim.Data;
+import org.libreplan.importers.tim.Department;
+import org.libreplan.importers.tim.Filter;
+import org.libreplan.importers.tim.Period;
+import org.libreplan.importers.tim.Person;
+import org.libreplan.importers.tim.Roster;
+import org.libreplan.importers.tim.RosterCategory;
+import org.libreplan.importers.tim.RosterRequest;
+import org.libreplan.importers.tim.RosterResponse;
+import org.libreplan.web.resources.worker.IWorkerModel;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+/**
+ * Test for {@link ImportRosterFromTim}
+ *
+ * @author Miciele Ghiorghis
+ */
+@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 ImportRosterFromTimTest {
+ private Properties properties = null;
+ private RosterResponse rosterResponse = null;
+
+ @Autowired
+ IWorkerDAO workerDAO;
+
+ @Autowired
+ IWorkerModel workerModel;
+
+ @Autowired
+ private IAdHocTransactionService transactionService;
+
+ @Before
+ public void loadProperties() throws FileNotFoundException, IOException {
+ String filename = System.getProperty("user.dir")
+ + "/../scripts/tim-connector/tim-conn.properties";
+ properties = new Properties();
+ properties.load(new FileInputStream(filename));
+ }
+
+ @Before
+ public void createRosterResponseFromFile() {
+ String filename = System.getProperty("user.dir")
+ + "/../scripts/tim_test/rosterResponse.xml";
+ File file = new File(filename);
+ rosterResponse = TimSoapClient.unmarshalRosterFromFile(file);
+
+ }
+
+ private List getAllWorkers() {
+ return transactionService
+ .runOnAnotherTransaction(new IOnTransaction>() {
+ @Override
+ public List execute() {
+ return workerDAO.findAll();
+ }
+ });
+ }
+
+ private RosterRequest createtRosterRequest() {
+ Roster roster = new Roster();
+ roster.setStartDate(new LocalDate());
+ roster.setEndDate(new LocalDate().plusDays(7));
+ roster.setResourcePlanning(false);
+ roster.setDayPlanning(false);
+ roster.setCalendar(false);
+ roster.setNonPlaned(true);
+ roster.setFullDay(false);
+ roster.setConcept(false);
+
+ Period periode = new Period();
+ periode.setStart(new org.joda.time.DateTime());
+ periode.setEnd(new org.joda.time.DateTime().plusDays(7));
+ List periods = new ArrayList();
+ periods.add(periode);
+
+ Department department = new Department();
+ department.setRef("4");
+
+ RosterCategory rosterCategory = new RosterCategory();
+ rosterCategory.setName(new String());
+ List rosterCategories = new ArrayList();
+ rosterCategories.add(rosterCategory);
+
+ Filter filter = new Filter();
+ filter.setPeriods(periods);
+ filter.setDepartment(department);
+
+ roster.setFilter(filter);
+
+ List persons = new ArrayList();
+ persons.add(new Person());
+ roster.setPersons(persons);
+
+ roster.setRosterCategories(rosterCategories);
+
+ roster.setDepartment(department);
+
+ roster.setPrecence(new String());
+
+ roster.setPeriods(periods);
+
+ RosterRequest exportRosterRequest = new RosterRequest();
+ Data data = new Data();
+ data.setData(roster);
+
+ exportRosterRequest.setData(data);
+ return exportRosterRequest;
+
+ }
+
+ private Map> getRosterExceptionPerWorker() {
+ Map> rosterExceptionMap = new HashMap>();
+ List rosters = rosterResponse.getRosters();
+ for (Roster roster : rosters) {
+ if (roster.getPrecence().equals("Afwezig")) {
+ String personsNetWorkName = roster.getPersons().get(0)
+ .getNetworkName();
+ if (!rosterExceptionMap.containsKey(personsNetWorkName)) {
+ rosterExceptionMap.put(personsNetWorkName,
+ new ArrayList());
+ }
+ rosterExceptionMap.get(personsNetWorkName).add(roster);
+ }
+ }
+ return rosterExceptionMap;
+ }
+
+ private List getTheFirstRosterException() {
+ Map> rosterExceptionMap = getRosterExceptionPerWorker();
+ return (List) rosterExceptionMap.entrySet().iterator().next()
+ .getValue();
+ }
+
+ private String getExceptionType(List rosters) {
+ for (Roster roster : rosters) {
+ return roster.getRosterCategories().get(0).getName();
+ }
+ return null;
+ }
+
+ private Entry getTheFirstEffortDuration(
+ List rosters) {
+ EffortDuration sum = EffortDuration.zero();
+ Map map = new TreeMap();
+ for (Roster roster : rosters) {
+ EffortDuration duration = EffortDuration
+ .parseFromFormattedString(roster.getDuration());
+ sum = EffortDuration.sum(sum, duration);
+ map.put(roster.getDate(), sum);
+ }
+ return map.entrySet().iterator().next();
+ }
+
+ private Worker getWorker(final String nif) {
+ for (Worker worker : getAllWorkers()) {
+ if (worker.getNif().equals(nif)) {
+ return worker;
+ }
+ }
+
+ Worker worker = Worker.create();
+ worker.setFirstName("First name");
+ worker.setSurname("Surname");
+ worker.setNif(nif);
+ return worker;
+ }
+
+ // @Test
+ public void testImportRostersFromServer() {
+ RosterResponse rosterResponse = TimSoapClient
+ .sendRequestReceiveResponse(properties.getProperty("url"),
+ properties.getProperty("username"),
+ properties.getProperty("password"),
+ createtRosterRequest(), RosterResponse.class);
+ assertTrue(rosterResponse != null);
+ }
+
+ @Test
+ public void testImportRosterAndCheckRosterExceptionsPerWorker() {
+ Map> result = getRosterExceptionPerWorker();
+ assertTrue(!result.isEmpty());
+ }
+
+ @Test
+ public void testRosterExceptionType() {
+ List rosters = getTheFirstRosterException();
+ String exceptionType = getExceptionType(rosters);
+ assertEquals(exceptionType, "3 Vakantie");
+ }
+
+ @Test
+ public void testRosterExceptionsTotalEffortDuration() {
+ List rosters = getTheFirstRosterException();
+ Entry effortDurationMap = getTheFirstEffortDuration(rosters);
+ EffortDuration duration = effortDurationMap.getValue();
+ assertThat(duration.getHours(), equalTo(9));
+ }
+
+ @Test
+ public void testCreateCalendarException() {
+ List rosters = getTheFirstRosterException();
+ String nif = rosters.get(0).getPersons().get(0).getNetworkName();
+
+ Entry dateDurationEntry = getTheFirstEffortDuration(rosters);
+ LocalDate date = dateDurationEntry.getKey();
+ EffortDuration duration = dateDurationEntry.getValue();
+
+ Capacity capacity = Capacity.create(duration);
+ Worker worker = getWorker(nif);
+
+ ResourceCalendar resourceCalendar = ResourceCalendar.create();
+ resourceCalendar.setName("test");
+ resourceCalendar.setCodeAutogenerated();
+ resourceCalendar.setCapacity(capacity.getStandardEffort().getHours());
+ worker.setCalendar(resourceCalendar);
+
+ CalendarExceptionType type = CalendarExceptionType.create("TEST",
+ CalendarExceptionTypeColor.DEFAULT, true);
+ CalendarException calendarException = CalendarException.create(date,
+ capacity, type);
+ resourceCalendar.addExceptionDay(calendarException);
+ assertEquals(capacity.getStandardEffort().getHours(), resourceCalendar
+ .getCapacity().intValue());
+ }
+
+}