diff --git a/navalplanner-webapp/src/test/java/org/navalplanner/web/test/ws/common/Util.java b/navalplanner-webapp/src/test/java/org/navalplanner/web/test/ws/common/Util.java
new file mode 100644
index 000000000..dbd57390b
--- /dev/null
+++ b/navalplanner-webapp/src/test/java/org/navalplanner/web/test/ws/common/Util.java
@@ -0,0 +1,53 @@
+/*
+ * 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.common;
+
+import org.hamcrest.BaseMatcher;
+import org.hamcrest.Description;
+import org.hamcrest.Matcher;
+
+/**
+ * Utilities class related with web service tests.
+ *
+ * @author Manuel Rego Casasnovas
+ */
+public class Util {
+
+ public static Matcher mustEnd(final String property) {
+ return new BaseMatcher() {
+
+ @Override
+ public boolean matches(Object object) {
+ if (object instanceof String) {
+ String s = (String) object;
+ return s.endsWith(property);
+ }
+ return false;
+ }
+
+ @Override
+ public void describeTo(Description description) {
+ description.appendText("must end with " + property);
+ }
+ };
+ }
+
+}
diff --git a/navalplanner-webapp/src/test/java/org/navalplanner/web/test/ws/labels/api/LabelServiceTest.java b/navalplanner-webapp/src/test/java/org/navalplanner/web/test/ws/labels/api/LabelServiceTest.java
new file mode 100644
index 000000000..b93bffb28
--- /dev/null
+++ b/navalplanner-webapp/src/test/java/org/navalplanner/web/test/ws/labels/api/LabelServiceTest.java
@@ -0,0 +1,266 @@
+/*
+ * 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.labels.api;
+
+import static org.hamcrest.CoreMatchers.anyOf;
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
+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.test.WebappGlobalNames.WEBAPP_SPRING_CONFIG_TEST_FILE;
+import static org.navalplanner.web.test.ws.common.Util.mustEnd;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.hibernate.SessionFactory;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.navalplanner.business.common.IAdHocTransactionService;
+import org.navalplanner.business.common.IOnTransaction;
+import org.navalplanner.business.labels.daos.ILabelTypeDAO;
+import org.navalplanner.business.labels.entities.Label;
+import org.navalplanner.business.labels.entities.LabelType;
+import org.navalplanner.ws.common.api.ConstraintViolationDTO;
+import org.navalplanner.ws.common.api.InstanceConstraintViolationsDTO;
+import org.navalplanner.ws.labels.api.ILabelService;
+import org.navalplanner.ws.labels.api.LabelDTO;
+import org.navalplanner.ws.labels.api.LabelTypeDTO;
+import org.navalplanner.ws.labels.api.LabelTypeListDTO;
+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 {@link ILabelService}.
+ *
+ * @author Manuel Rego Casasnovas
+ */
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(locations = { BUSINESS_SPRING_CONFIG_FILE,
+ WEBAPP_SPRING_CONFIG_FILE, WEBAPP_SPRING_CONFIG_TEST_FILE })
+@Transactional
+public class LabelServiceTest {
+
+ @Autowired
+ private ILabelService labelService;
+
+ @Autowired
+ private ILabelTypeDAO labelTypeDAO;
+
+ @Autowired
+ private SessionFactory sessionFactory;
+
+ @Autowired
+ private IAdHocTransactionService transactionService;
+
+ private LabelType givenLabelTypeStored() {
+ Label label1 = Label.create("label-name-1");
+ Label label2 = Label.create("label-name-2");
+ final LabelType labelType = LabelType.create("label-type-name");
+
+ labelType.addLabel(label1);
+ labelType.addLabel(label2);
+
+ labelTypeDAO.save(labelType);
+ labelTypeDAO.flush();
+ sessionFactory.getCurrentSession().evict(labelType);
+ labelType.dontPoseAsTransientObjectAnymore();
+
+ return labelType;
+ }
+
+ @Test
+ public void exportLabelTypes() {
+ LabelTypeListDTO labelTypes = labelService.getLabelTypes();
+ assertTrue(labelTypes.labelTypes.isEmpty());
+ }
+
+ @Test
+ public void exportLabelTypes2() {
+ LabelType labelType = givenLabelTypeStored();
+
+ LabelTypeListDTO labelTypes = labelService.getLabelTypes();
+ assertThat(labelTypes.labelTypes.size(), equalTo(1));
+
+ LabelTypeDTO labelTypeDTO = labelTypes.labelTypes.get(0);
+ assertThat(labelTypeDTO.code, equalTo(labelType.getCode()));
+ assertThat(labelTypeDTO.labels.size(), equalTo(2));
+ }
+
+ @Test
+ public void importInvalidLabelWithoutAttributes() {
+ int previous = labelTypeDAO.getAll().size();
+
+ LabelTypeDTO labelTypeDTO = new LabelTypeDTO();
+
+ List instanceConstraintViolationsList = labelService
+ .addLabelTypes(new LabelTypeListDTO(Arrays.asList(labelTypeDTO))).instanceConstraintViolationsList;
+ assertThat(instanceConstraintViolationsList.size(), equalTo(1));
+
+ List constraintViolations = instanceConstraintViolationsList
+ .get(0).constraintViolations;
+ // Mandatory fields: code, name
+ assertThat(constraintViolations.size(), equalTo(2));
+ for (ConstraintViolationDTO constraintViolationDTO : constraintViolations) {
+ assertThat(constraintViolationDTO.fieldName, anyOf(mustEnd("code"),
+ mustEnd("name")));
+ }
+
+ assertThat(labelTypeDAO.getAll().size(), equalTo(previous));
+ }
+
+ @Test
+ public void importValidLabelType() {
+ int previous = labelTypeDAO.getAll().size();
+
+ LabelTypeDTO labelTypeDTO = new LabelTypeDTO("label-type-name",
+ new ArrayList());
+
+ List instanceConstraintViolationsList = labelService
+ .addLabelTypes(new LabelTypeListDTO(Arrays.asList(labelTypeDTO))).instanceConstraintViolationsList;
+ assertThat(instanceConstraintViolationsList.size(), equalTo(0));
+
+ assertThat(labelTypeDAO.getAll().size(), equalTo(previous + 1));
+
+ LabelType labelType = labelTypeDAO.getAll().get(0);
+ assertThat(labelType.getName(), equalTo(labelTypeDTO.name));
+ assertThat(labelType.getLabels().size(), equalTo(0));
+ }
+
+ @Test
+ public void importTwoValidLabelType() {
+ int previous = labelTypeDAO.getAll().size();
+
+ LabelTypeDTO labelTypeDTO1 = new LabelTypeDTO("label-type-name1",
+ new ArrayList());
+ LabelTypeDTO labelTypeDTO2 = new LabelTypeDTO("label-type-name2",
+ new ArrayList());
+
+ List instanceConstraintViolationsList = labelService
+ .addLabelTypes(new LabelTypeListDTO(Arrays.asList(
+ labelTypeDTO1, labelTypeDTO2))).instanceConstraintViolationsList;
+ assertThat(instanceConstraintViolationsList.size(), equalTo(0));
+
+ List labelTypes = labelTypeDAO.getAll();
+ assertThat(labelTypes.size(), equalTo(previous + 2));
+ for (LabelType labelType : labelTypes) {
+ assertThat(labelType.getName(), anyOf(equalTo(labelTypeDTO1.name),
+ equalTo(labelTypeDTO2.name)));
+ assertThat(labelType.getLabels().size(), equalTo(0));
+ }
+ }
+
+ @Test
+ public void importTwoLabelTypeWithRepeatedName() {
+ int previous = labelTypeDAO.getAll().size();
+
+ String labelTypeName = "label-type-name";
+ LabelTypeDTO labelTypeDTO1 = new LabelTypeDTO(labelTypeName,
+ new ArrayList());
+ LabelTypeDTO labelTypeDTO2 = new LabelTypeDTO(labelTypeName,
+ new ArrayList());
+
+ List instanceConstraintViolationsList = labelService
+ .addLabelTypes(new LabelTypeListDTO(Arrays.asList(
+ labelTypeDTO1, labelTypeDTO2))).instanceConstraintViolationsList;
+ assertThat(instanceConstraintViolationsList.size(), equalTo(1));
+ assertThat(instanceConstraintViolationsList.get(0).numItem,
+ equalTo(new Long(2)));
+
+ // Just the first label type was stored
+ assertThat(labelTypeDAO.getAll().size(), equalTo(previous + 1));
+ }
+
+ @Test
+ public void importValidLabelTypeWithTwoValidLabels() {
+ int previous = labelTypeDAO.getAll().size();
+
+ LabelDTO labelDTO1 = new LabelDTO("label-name-1");
+ LabelDTO labelDTO2 = new LabelDTO("label-name-2");
+ List labelDTOs = Arrays.asList(labelDTO1, labelDTO2);
+
+ LabelTypeDTO labelTypeDTO = new LabelTypeDTO("label-type-name",
+ labelDTOs);
+
+ List instanceConstraintViolationsList = labelService
+ .addLabelTypes(new LabelTypeListDTO(Arrays.asList(labelTypeDTO))).instanceConstraintViolationsList;
+ assertThat(instanceConstraintViolationsList.size(), equalTo(0));
+
+ assertThat(labelTypeDAO.getAll().size(), equalTo(previous + 1));
+
+ LabelType labelType = labelTypeDAO.getAll().get(0);
+ assertThat(labelType.getName(), equalTo(labelTypeDTO.name));
+ assertThat(labelType.getLabels().size(), equalTo(2));
+ for (Label label : labelType.getLabels()) {
+ assertThat(label.getName(), anyOf(equalTo(labelDTO1.name),
+ equalTo(labelDTO2.name)));
+ }
+ }
+
+ @Test
+ public void importLabelTypeWithNameAlreadyOnDatabase() {
+ int previous = labelTypeDAO.getAll().size();
+
+ String name = transactionService
+ .runOnAnotherTransaction(new IOnTransaction() {
+
+ @Override
+ public String execute() {
+ return givenLabelTypeStored().getName();
+ }
+
+ });
+ assertThat(labelTypeDAO.getAll().size(), equalTo(previous + 1));
+
+ LabelTypeDTO labelTypeDTO = new LabelTypeDTO(name,
+ new ArrayList());
+
+ List instanceConstraintViolationsList = labelService
+ .addLabelTypes(new LabelTypeListDTO(Arrays.asList(labelTypeDTO))).instanceConstraintViolationsList;
+ assertThat(instanceConstraintViolationsList.size(), equalTo(1));
+
+ assertThat(labelTypeDAO.getAll().size(), equalTo(previous + 1));
+ }
+
+ @Test
+ public void importValidLabelTypeWithTwoLabelsWithTheSameName() {
+ int previous = labelTypeDAO.getAll().size();
+
+ String name = "label-name";
+ LabelDTO labelDTO1 = new LabelDTO(name);
+ LabelDTO labelDTO2 = new LabelDTO(name);
+ List labelDTOs = Arrays.asList(labelDTO1, labelDTO2);
+
+ LabelTypeDTO labelTypeDTO = new LabelTypeDTO("label-type-name",
+ labelDTOs);
+
+ List instanceConstraintViolationsList = labelService
+ .addLabelTypes(new LabelTypeListDTO(Arrays.asList(labelTypeDTO))).instanceConstraintViolationsList;
+ assertThat(instanceConstraintViolationsList.size(), equalTo(1));
+
+ assertThat(labelTypeDAO.getAll().size(), equalTo(previous));
+ }
+
+}
diff --git a/navalplanner-webapp/src/test/java/org/navalplanner/web/test/ws/orders/OrderElementServiceTest.java b/navalplanner-webapp/src/test/java/org/navalplanner/web/test/ws/orders/OrderElementServiceTest.java
index b296cbfce..d38cc1375 100644
--- a/navalplanner-webapp/src/test/java/org/navalplanner/web/test/ws/orders/OrderElementServiceTest.java
+++ b/navalplanner-webapp/src/test/java/org/navalplanner/web/test/ws/orders/OrderElementServiceTest.java
@@ -32,6 +32,7 @@ import static org.navalplanner.business.BusinessGlobalNames.BUSINESS_SPRING_CONF
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 static org.navalplanner.web.test.ws.common.Util.mustEnd;
import java.math.BigDecimal;
import java.util.Date;
@@ -43,9 +44,6 @@ import java.util.UUID;
import javax.annotation.Resource;
-import org.hamcrest.BaseMatcher;
-import org.hamcrest.Description;
-import org.hamcrest.Matcher;
import org.hibernate.SessionFactory;
import org.joda.time.LocalDate;
import org.junit.Before;
@@ -1109,25 +1107,6 @@ public class OrderElementServiceTest {
.getCriterionRequirements().iterator().next()).isIsValid());
}
- public static Matcher mustEnd(final String property) {
- return new BaseMatcher() {
-
- @Override
- public boolean matches(Object object) {
- if (object instanceof String) {
- String s = (String) object;
- return s.endsWith(property);
- }
- return false;
- }
-
- @Override
- public void describeTo(Description description) {
- description.appendText("must end with " + property);
- }
- };
- }
-
@Test
public void importDirectCriterionRequirementsAndIndirectCriterionRequirements()
throws InstanceNotFoundException, IncompatibleTypeException {