diff --git a/navalplanner-webapp/src/test/java/org/navalplanner/web/test/ws/subcontract/SubcontractServiceTest.java b/navalplanner-webapp/src/test/java/org/navalplanner/web/test/ws/subcontract/SubcontractServiceTest.java
new file mode 100644
index 000000000..17867faa4
--- /dev/null
+++ b/navalplanner-webapp/src/test/java/org/navalplanner/web/test/ws/subcontract/SubcontractServiceTest.java
@@ -0,0 +1,190 @@
+/*
+ * This file is part of ###PROJECT_NAME###
+ *
+ * Copyright (C) 2009 Fundación para o Fomento da Calidade Industrial e
+ * Desenvolvemento Tecnolóxico de Galicia
+ *
+ * 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 org.navalplanner.web.test.ws.subcontract;
+
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertThat;
+import static org.navalplanner.business.BusinessGlobalNames.BUSINESS_SPRING_CONFIG_FILE;
+import static org.navalplanner.web.WebappGlobalNames.WEBAPP_SPRING_CONFIG_FILE;
+import static org.navalplanner.web.WebappGlobalNames.WEBAPP_SPRING_SECURITY_CONFIG_FILE;
+import static org.navalplanner.web.test.WebappGlobalNames.WEBAPP_SPRING_CONFIG_TEST_FILE;
+
+import java.util.Date;
+import java.util.List;
+
+import javax.annotation.Resource;
+
+import org.hibernate.SessionFactory;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.navalplanner.business.IDataBootstrap;
+import org.navalplanner.business.externalcompanies.daos.IExternalCompanyDAO;
+import org.navalplanner.business.externalcompanies.entities.ExternalCompany;
+import org.navalplanner.business.orders.daos.IOrderDAO;
+import org.navalplanner.business.orders.entities.Order;
+import org.navalplanner.business.orders.entities.OrderElement;
+import org.navalplanner.ws.common.api.InstanceConstraintViolationsDTO;
+import org.navalplanner.ws.common.api.OrderElementDTO;
+import org.navalplanner.ws.common.api.OrderLineDTO;
+import org.navalplanner.ws.subcontract.api.ISubcontractService;
+import org.navalplanner.ws.subcontract.api.SubcontractedTaskDataDTO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.annotation.Rollback;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * Tests for {@link ISubcontractService}.
+ *
+ * @author Manuel Rego Casasnovas
+ */
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(locations = { BUSINESS_SPRING_CONFIG_FILE,
+ WEBAPP_SPRING_CONFIG_FILE, WEBAPP_SPRING_CONFIG_TEST_FILE,
+ WEBAPP_SPRING_SECURITY_CONFIG_FILE })
+@Transactional
+public class SubcontractServiceTest {
+
+ @Resource
+ private IDataBootstrap defaultAdvanceTypesBootstrapListener;
+
+ @Resource
+ private IDataBootstrap configurationBootstrap;
+
+ @Before
+ public void loadRequiredaData() {
+ defaultAdvanceTypesBootstrapListener.loadRequiredData();
+ configurationBootstrap.loadRequiredData();
+ }
+
+ @Autowired
+ private ISubcontractService subcontractService;
+
+ @Autowired
+ private IOrderDAO orderDAO;
+
+ @Autowired
+ private IExternalCompanyDAO externalCompanyDAO;
+
+ @Autowired
+ private SessionFactory sessionFactory;
+
+ private OrderLineDTO givenBasicOrderLineDTO(String orderLineCode) {
+ OrderLineDTO orderLineDTO = new OrderLineDTO();
+ orderLineDTO.name = "Test";
+ orderLineDTO.code = orderLineCode;
+ orderLineDTO.initDate = new Date();
+
+ return orderLineDTO;
+ }
+
+ private ExternalCompany getClientExternalCompanySaved(String name,
+ String nif) {
+ ExternalCompany externalCompany = ExternalCompany.create(name, nif);
+ externalCompany.setClient(true);
+
+ externalCompanyDAO.save(externalCompany);
+ externalCompanyDAO.flush();
+ sessionFactory.getCurrentSession().evict(externalCompany);
+
+ externalCompany.dontPoseAsTransientObjectAnymore();
+
+ return externalCompany;
+ }
+
+ @Test
+ @Rollback(false)
+ public void testNotRollback() {
+ // Just to do not make rollback in order to have the default
+ // configuration, needed for prepareForCreate in order to autogenerate
+ // the order code
+ }
+
+ @Test
+ public void invalidSubcontractedTaskDataWithoutExternalCompanyNif() {
+ int previous = orderDAO.getOrders().size();
+
+ String orderLineCode = "order-line-code";
+
+ OrderElementDTO orderElementDTO = givenBasicOrderLineDTO(orderLineCode);
+
+ SubcontractedTaskDataDTO subcontractedTaskDataDTO = new SubcontractedTaskDataDTO();
+ subcontractedTaskDataDTO.orderElementDTO = orderElementDTO;
+
+ List instanceConstraintViolationsList = subcontractService
+ .subcontract(subcontractedTaskDataDTO).instanceConstraintViolationsList;
+ assertThat(instanceConstraintViolationsList.size(), equalTo(1));
+
+ assertThat(orderDAO.getOrders().size(), equalTo(previous));
+ }
+
+ @Test
+ public void invalidSubcontractedTaskDataWithoutOrderElement() {
+ int previous = orderDAO.getOrders().size();
+
+ ExternalCompany externalCompany = getClientExternalCompanySaved(
+ "Company", "company-nif");
+
+ SubcontractedTaskDataDTO subcontractedTaskDataDTO = new SubcontractedTaskDataDTO();
+ subcontractedTaskDataDTO.externalCompanyNif = externalCompany.getNif();
+
+ List instanceConstraintViolationsList = subcontractService
+ .subcontract(subcontractedTaskDataDTO).instanceConstraintViolationsList;
+ assertThat(instanceConstraintViolationsList.size(), equalTo(1));
+
+ assertThat(orderDAO.getOrders().size(), equalTo(previous));
+ }
+
+ @Test
+ public void validSubcontractedTaskData() {
+ int previous = orderDAO.getOrders().size();
+
+ String orderLineCode = "order-line-code";
+
+ OrderElementDTO orderElementDTO = givenBasicOrderLineDTO(orderLineCode);
+ ExternalCompany externalCompany = getClientExternalCompanySaved(
+ "Company", "company-nif");
+
+ SubcontractedTaskDataDTO subcontractedTaskDataDTO = new SubcontractedTaskDataDTO();
+ subcontractedTaskDataDTO.orderElementDTO = orderElementDTO;
+ subcontractedTaskDataDTO.externalCompanyNif = externalCompany.getNif();
+
+ List instanceConstraintViolationsList = subcontractService
+ .subcontract(subcontractedTaskDataDTO).instanceConstraintViolationsList;
+ assertThat(instanceConstraintViolationsList.size(), equalTo(0));
+
+ assertThat(orderDAO.getOrders().size(), equalTo(previous + 1));
+
+ Order order = orderDAO.getOrders().get(previous);
+ assertNotNull(order.getCode());
+ assertNull(order.getExternalCode());
+ assertThat(order.getWorkHours(), equalTo(0));
+
+ List children = order.getChildren();
+ assertThat(children.size(), equalTo(1));
+ assertThat(children.get(0).getExternalCode(), equalTo(orderLineCode));
+ }
+
+}
\ No newline at end of file