/* * 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.resources.criterion.api; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; 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 static org.libreplan.web.test.ws.common.Util.assertNoConstraintViolations; import static org.libreplan.web.test.ws.common.Util.getUniqueName; import java.util.ArrayList; import java.util.List; import org.junit.Test; import org.junit.runner.RunWith; import org.libreplan.business.common.exceptions.InstanceNotFoundException; import org.libreplan.business.resources.daos.ICriterionTypeDAO; import org.libreplan.business.resources.entities.Criterion; import org.libreplan.business.resources.entities.CriterionType; import org.libreplan.ws.common.api.InstanceConstraintViolationsDTO; import org.libreplan.ws.common.api.ResourceEnumDTO; import org.libreplan.ws.common.impl.ResourceEnumConverter; import org.libreplan.ws.resources.criterion.api.CriterionDTO; import org.libreplan.ws.resources.criterion.api.CriterionTypeDTO; import org.libreplan.ws.resources.criterion.api.CriterionTypeListDTO; import org.libreplan.ws.resources.criterion.api.ICriterionService; 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>ICriterionService</code>. * * @author Fernando Bellas Permuy <fbellas@udc.es> */ @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 CriterionServiceTest { @Autowired private ICriterionService criterionService; @Autowired private ICriterionTypeDAO criterionTypeDAO; @Test @Transactional public void testAddCriterionWithSameCodeDistinctTypes() { /* Build criterion type "ct1" (5 constraint violations). */ CriterionDTO c1 = new CriterionDTO("new_c1_code", "new_c1", true, new ArrayList<CriterionDTO>()); List<CriterionDTO> ct1Criterions = new ArrayList<CriterionDTO>(); ct1Criterions.add(c1); CriterionTypeDTO ct1 = new CriterionTypeDTO("new_type_A", "desc", false, true, true, ResourceEnumDTO.RESOURCE, ct1Criterions); CriterionTypeDTO ct2 = new CriterionTypeDTO("new_type_B", "desc", true, true, false, ResourceEnumDTO.RESOURCE, null); /* Criterion type list. */ CriterionTypeListDTO criterionTypes = createCriterionTypeListDTO(ct1, ct2); List<InstanceConstraintViolationsDTO> instanceConstraintViolationsList = criterionService .addCriterionTypes(criterionTypes).instanceConstraintViolationsList; assertTrue(instanceConstraintViolationsList.toString(), instanceConstraintViolationsList.size() == 1); } @Test @Transactional public void testAddAndGetCriterionTypes() { /* Build criterion type "ct1" (5 constraint violations). */ CriterionDTO ct1c1 = new CriterionDTO(null, true, // Missing criterion // name. new ArrayList<CriterionDTO>()); CriterionDTO ct1c2c1 = new CriterionDTO("c2-1", true, new ArrayList<CriterionDTO>()); List<CriterionDTO> ct1c2Criterions = new ArrayList<CriterionDTO>(); ct1c2Criterions.add(ct1c2c1); CriterionDTO ct1c2 = new CriterionDTO("c2", true, // Criterion // hierarchy is not // allowed in the // criterion type // (see above). ct1c2Criterions); CriterionDTO ct1c3 = new CriterionDTO("c3", true, new ArrayList<CriterionDTO>()); CriterionDTO ct1c4 = new CriterionDTO(" C3 ", true, new ArrayList<CriterionDTO>()); // Repeated criterion name. CriterionDTO ct1c5 = new CriterionDTO(ct1c3.code, // Repeated criterion "c4", true, // code inside this criterion type. new ArrayList<CriterionDTO>()); List<CriterionDTO> ct1Criterions = new ArrayList<CriterionDTO>(); ct1Criterions.add(ct1c1); ct1Criterions.add(ct1c2); ct1Criterions.add(ct1c3); ct1Criterions.add(ct1c4); ct1Criterions.add(ct1c5); CriterionTypeDTO ct1 = new CriterionTypeDTO(null, "desc", false, true, true, ResourceEnumDTO.RESOURCE, // Missing criterion ct1Criterions); // type name. /* Build criterion type "ct2" (2 constraint violations). */ CriterionDTO ct2c1 = new CriterionDTO("c1", true, // Its criterion type new ArrayList<CriterionDTO>()); // is not enabled. CriterionDTO ct2c2c1 = new CriterionDTO("c2-1", true, new ArrayList<CriterionDTO>()); // Its criterion father is // not active. List<CriterionDTO> ct2c2Criterions = new ArrayList<CriterionDTO>(); ct2c2Criterions.add(ct2c2c1); CriterionDTO ct2c2 = new CriterionDTO("c2", false, ct2c2Criterions); List<CriterionDTO> ct2Criterions = new ArrayList<CriterionDTO>(); ct2Criterions.add(ct2c1); ct2Criterions.add(ct2c2); CriterionTypeDTO ct2 = new CriterionTypeDTO(getUniqueName(), "desc", true, true, false, ResourceEnumDTO.RESOURCE, ct2Criterions); /* Build criterion type "ct3" (OK). */ CriterionDTO ct3c1 = new CriterionDTO("c1", true, new ArrayList<CriterionDTO>()); CriterionDTO ct3c2c1 = new CriterionDTO("c2-1", true, new ArrayList<CriterionDTO>()); List<CriterionDTO> ct3c2Criterions = new ArrayList<CriterionDTO>(); ct3c2Criterions.add(ct3c2c1); CriterionDTO ct3c2 = new CriterionDTO("c2", true, ct3c2Criterions); List<CriterionDTO> ct3Criterions = new ArrayList<CriterionDTO>(); ct3Criterions.add(ct3c1); ct3Criterions.add(ct3c2); CriterionTypeDTO ct3 = new CriterionTypeDTO(getUniqueName(), "desc", true, true, true, ResourceEnumDTO.RESOURCE, ct3Criterions); /* Build criterion type "ct4" (1 constraint violation). */ CriterionTypeDTO ct4 = new CriterionTypeDTO( // Repeated criterion ' ' + ct3.name.toUpperCase() + ' ', // type name. "desc", true, true, true, ResourceEnumDTO.RESOURCE, new ArrayList<CriterionDTO>()); /* Build criterion type "ct5" (1 constraint violation). */ CriterionDTO ct5c1 = new CriterionDTO(ct3c1.code, // Criterion code "c1", true, // used by another criterion type. new ArrayList<CriterionDTO>()); List<CriterionDTO> ct5Criterions = new ArrayList<CriterionDTO>(); ct5Criterions.add(ct5c1); CriterionTypeDTO ct5 = new CriterionTypeDTO(getUniqueName(), "desc", true, true, true, ResourceEnumDTO.RESOURCE, ct5Criterions); /* Build criterion type "ct6" (2 constraint violations). */ CriterionDTO ct6c1 = new CriterionDTO(null, // Missing criterion code. "c1", true, new ArrayList<CriterionDTO>()); List<CriterionDTO> ct6Criterions = new ArrayList<CriterionDTO>(); ct6Criterions.add(ct6c1); CriterionTypeDTO ct6 = new CriterionTypeDTO(null, getUniqueName(), // Missing criterion // type code. "desc", true, true, true, ResourceEnumDTO.RESOURCE, ct6Criterions); /* Criterion type list. */ CriterionTypeListDTO criterionTypes = createCriterionTypeListDTO(ct1, ct2, ct3, ct4, ct5, ct6); List<InstanceConstraintViolationsDTO> instanceConstraintViolationsList = criterionService.addCriterionTypes(criterionTypes). instanceConstraintViolationsList; assertTrue( instanceConstraintViolationsList.toString(), instanceConstraintViolationsList.size() == 5); assertTrue( instanceConstraintViolationsList.get(0). constraintViolations.toString(), instanceConstraintViolationsList.get(0). constraintViolations.size() == 5); // ct1 constraint violations. assertTrue( instanceConstraintViolationsList.get(1). constraintViolations.toString(), instanceConstraintViolationsList.get(1). constraintViolations.size() == 2); // ct2 constraint violations. assertTrue( instanceConstraintViolationsList.get(2). constraintViolations.toString(), instanceConstraintViolationsList.get(2). constraintViolations.size() == 1); // ct4 constraint violations. assertTrue( instanceConstraintViolationsList.get(3). constraintViolations.toString(), instanceConstraintViolationsList.get(3). constraintViolations.size() == 1); // ct5 constraint violations. assertTrue( instanceConstraintViolationsList.get(4). constraintViolations.toString(), instanceConstraintViolationsList.get(4). constraintViolations.size() == 2); // ct6 constraint violations. /* Find criterion types. */ List<CriterionTypeDTO> returnedCriterionTypes = criterionService.getCriterionTypes().criterionTypes; /* Test. */ assertFalse(criterionTypeDAO.existsByCode(ct2.code)); assertTrue(criterionTypeDAO.existsByCode(ct3.code)); assertFalse(criterionTypeDAO.existsByCode(ct4.code)); assertTrue(containsCriterionType(returnedCriterionTypes, ct3.code)); } @Test @Transactional public void testUpdateCriterionType() throws InstanceNotFoundException { /* Build criterion type with criteria: c1, c2->c2-1. */ CriterionDTO c1 = new CriterionDTO("c1", true, new ArrayList<CriterionDTO>()); CriterionDTO c2c1 = new CriterionDTO("c2-1", true, new ArrayList<CriterionDTO>()); List<CriterionDTO> c2Criterions = new ArrayList<CriterionDTO>(); c2Criterions.add(c2c1); CriterionDTO c2 = new CriterionDTO("c2", true, c2Criterions); List<CriterionDTO> rootCriterions = new ArrayList<CriterionDTO>(); rootCriterions.add(c1); rootCriterions.add(c2); CriterionTypeDTO ct = new CriterionTypeDTO(getUniqueName(), "desc", true, true, true, ResourceEnumDTO.WORKER, rootCriterions); /* Add criterion type. */ assertNoConstraintViolations(criterionService.addCriterionTypes( createCriterionTypeListDTO(ct))); /* * Build a DTO for making the following update: add new root criterion * ("c3"), move "c2" to "c1" and modify c2's name, and update * criterion type description. */ CriterionDTO c3 = new CriterionDTO("c3", true, new ArrayList<CriterionDTO>()); CriterionDTO c2Updated = new CriterionDTO(c2.code, c2.name + "UPDATED", null, new ArrayList<CriterionDTO>()); List<CriterionDTO> c1CriterionsUpdated = new ArrayList<CriterionDTO>(); c1CriterionsUpdated.add(c2Updated); CriterionDTO c1Updated = new CriterionDTO(c1.code, null, null, c1CriterionsUpdated); List<CriterionDTO> rootCriterionsUpdated = new ArrayList<CriterionDTO>(); rootCriterionsUpdated.add(c3); rootCriterionsUpdated.add(c1Updated); CriterionTypeDTO ctUpdated = new CriterionTypeDTO(ct.code, null, "desc" + "UPDATED", null, null, null, null, rootCriterionsUpdated); /* Update criterion type and test. */ assertNoConstraintViolations(criterionService.addCriterionTypes( createCriterionTypeListDTO(ctUpdated))); CriterionType ctEntity = criterionTypeDAO.findByCode(ct.code); assertTrue(ctEntity.getCriterions().size() == 4); /* Test criterion hierarchy. */ Criterion c1Entity = ctEntity.getCriterion(c1.name); Criterion c2Entity = ctEntity.getCriterion(c2Updated.name); Criterion c2c1Entity = ctEntity.getCriterion(c2c1.name); Criterion c3Entity = ctEntity.getCriterion(c3.name); assertNull(c1Entity.getParent()); assertTrue(c1Entity.getChildren().size() == 1); assertTrue(c1Entity.getChildren().contains(c2Entity)); assertTrue(c2Entity.getChildren().size() == 1); assertTrue(c2Entity.getChildren().contains(c2c1Entity)); assertTrue(c2c1Entity.getChildren().size() == 0); assertNull(c3Entity.getParent()); assertTrue(c3Entity.getChildren().size() == 0); /* * Basic properties in criteria "c1" and "c2", which are contained in * "ctUpdated", must not be modified, except c2's name property. */ assertEquals(c1.name, c1Entity.getName()); assertEquals(c1.active, c1Entity.isActive()); assertEquals(c2Updated.name, c2Entity.getName()); assertEquals(c2.active, c2Entity.isActive()); /* * Basic properties values, except description, must be not be * modified. */ assertEquals(ct.name, ctEntity.getName()); assertEquals(ctUpdated.description, ctEntity.getDescription()); assertEquals(ct.allowHierarchy, ctEntity.allowHierarchy()); assertEquals(ct.allowSimultaneousCriterionsPerResource, ctEntity.isAllowSimultaneousCriterionsPerResource()); assertEquals(ct.enabled, ctEntity.isEnabled()); assertEquals(ResourceEnumConverter.fromDTO(ct.resource), ctEntity.getResource()); } private boolean containsCriterionType( List<CriterionTypeDTO> criterionTypes, String code) { for (CriterionTypeDTO c : criterionTypes) { if (c.code.equals(code)) { return true; } } return false; } private CriterionTypeListDTO createCriterionTypeListDTO( CriterionTypeDTO... criterionTypes) { List<CriterionTypeDTO> criterionTypeList = new ArrayList<CriterionTypeDTO>(); for (CriterionTypeDTO c : criterionTypes) { criterionTypeList.add(c); } return new CriterionTypeListDTO(criterionTypeList); } }