/* * 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.materials; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; 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.getUniqueName; import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; import javax.annotation.Resource; import org.hibernate.SessionFactory; import org.junit.Test; import org.junit.runner.RunWith; import org.libreplan.business.IDataBootstrap; import org.libreplan.business.common.IAdHocTransactionService; import org.libreplan.business.common.IOnTransaction; import org.libreplan.business.common.exceptions.InstanceNotFoundException; import org.libreplan.business.materials.bootstrap.UnitTypeBootstrap; import org.libreplan.business.materials.daos.IMaterialCategoryDAO; import org.libreplan.business.materials.daos.IUnitTypeDAO; import org.libreplan.business.materials.entities.MaterialCategory; import org.libreplan.business.materials.entities.UnitType; import org.libreplan.ws.common.api.InstanceConstraintViolationsDTO; import org.libreplan.ws.materials.api.IMaterialService; import org.libreplan.ws.materials.api.MaterialCategoryDTO; import org.libreplan.ws.materials.api.MaterialCategoryListDTO; import org.libreplan.ws.materials.api.MaterialDTO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.transaction.BeforeTransaction; import org.springframework.transaction.annotation.Transactional; /** * Tests for <code>IMaterialService</code>. * * @author Susana Montes Pedreira <smontes@wirelessgalicia.com> */ @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 MaterialServiceTest { @Autowired private SessionFactory sessionFactory; @Autowired private IAdHocTransactionService transactionService; @Autowired private IMaterialService materialService; @Autowired private IMaterialCategoryDAO materialCategoryDAO; @Autowired private IUnitTypeDAO unitTypeDAO; @Resource private IDataBootstrap configurationBootstrap; @Resource private IDataBootstrap materialCategoryBootstrap; @Resource private IDataBootstrap unitTypeBootstrap; @BeforeTransaction public void loadRequiredData() { IOnTransaction<Void> load = new IOnTransaction<Void>() { @Override public Void execute() { configurationBootstrap.loadRequiredData(); materialCategoryBootstrap.loadRequiredData(); unitTypeBootstrap.loadRequiredData(); createUnitTypes(); return null; } }; transactionService.runOnAnotherTransaction(load); } private UnitType entityA; private String getUnitTypeCodeA() { return entityA.getCode(); } private void createUnitTypes() { entityA = UnitType.create(getUniqueName(), getUniqueName()); UnitType entityB = UnitType.create(getUniqueName(), getUniqueName()); unitTypeDAO.save(entityA); unitTypeDAO.save(entityB); unitTypeDAO.flush(); sessionFactory.getCurrentSession().evict(entityA); sessionFactory.getCurrentSession().evict(entityB); } @Test @Transactional public void testAddAndGetMaterialCategories() { /* Build materialCategory (0 constraint violations) */ // Missing material name and the unit type MaterialDTO m1 = new MaterialDTO(null, new BigDecimal(13), getUnitTypeCodeA(), true); // Missing default unit price MaterialDTO m2 = new MaterialDTO("material 2", null, getUnitTypeCodeA(), true); // Missing unit type MaterialDTO m3 = new MaterialDTO("material 3", new BigDecimal(13), null, true); // Missing unit type, same name MaterialDTO m4 = new MaterialDTO("material 3", new BigDecimal(13), getUnitTypeCodeA(), null); List<MaterialDTO> materialDTOs = new ArrayList<>(); materialDTOs.add(m1); materialDTOs.add(m2); materialDTOs.add(m3); materialDTOs.add(m4); MaterialCategoryDTO materialCategoryDTO = new MaterialCategoryDTO("categoryA", null, null, materialDTOs); MaterialCategoryListDTO materialCategoryListDTO = createMaterialCategoryListDTO(materialCategoryDTO); List<InstanceConstraintViolationsDTO> instanceConstraintViolationsList = materialService.addMaterials(materialCategoryListDTO).instanceConstraintViolationsList; assertTrue(instanceConstraintViolationsList.toString(), instanceConstraintViolationsList.size() == 1); } @Test @Transactional public void testAddMaterialRepeatedCodes() { /* Build material with same code (1 constraint violations) */ MaterialDTO m1 = new MaterialDTO("CodeA", "material1", new BigDecimal( 13), getUnitTypeCodeA(), true); MaterialDTO m2 = new MaterialDTO("CodeA", "material2", new BigDecimal( 13), getUnitTypeCodeA(), true); List<MaterialDTO> materialDTOs = new ArrayList<MaterialDTO>(); materialDTOs.add(m1); materialDTOs.add(m2); MaterialCategoryDTO materialCategoryDTO = new MaterialCategoryDTO( "category1", null, null, materialDTOs); MaterialCategoryListDTO materialCategoryListDTO = createMaterialCategoryListDTO(materialCategoryDTO); List<InstanceConstraintViolationsDTO> instanceConstraintViolationsList = materialService .addMaterials(materialCategoryListDTO).instanceConstraintViolationsList; assertTrue(instanceConstraintViolationsList.toString(), instanceConstraintViolationsList.size() == 1); } @Test @Transactional public void testAddValidMaterialCategory() { /* Build material (0 constraint violations) */ MaterialDTO m1 = new MaterialDTO("CodeM1", "material1", new BigDecimal(13), getUnitTypeCodeA(), true); MaterialDTO m2 = new MaterialDTO("CodeM2", "material2", new BigDecimal(13), getUnitTypeCodeA(), true); List<MaterialDTO> materialDTOs1 = new ArrayList<>(); List<MaterialDTO> materialDTOs2 = new ArrayList<>(); materialDTOs1.add(m1); materialDTOs2.add(m2); /* Build material (0 constraint violations). */ MaterialCategoryDTO mc1 = new MaterialCategoryDTO("CodeMC1", "subCategory1", "mainMaterialCode", null, materialDTOs1); MaterialCategoryDTO mc2 = new MaterialCategoryDTO("CodeMC2", "subCategory2", null, null, materialDTOs2); MaterialCategoryListDTO subCategoryListDTO = createMaterialCategoryListDTO(mc1, mc2); /* Build main material category */ MaterialCategoryDTO materialCategoryDTO = new MaterialCategoryDTO("mainMaterialCode", "mainCategory1", null, subCategoryListDTO, null); MaterialCategoryListDTO materialCategoryListDTO = createMaterialCategoryListDTO(materialCategoryDTO); List<InstanceConstraintViolationsDTO> instanceConstraintViolationsList = materialService.addMaterials(materialCategoryListDTO).instanceConstraintViolationsList; assertTrue(instanceConstraintViolationsList.toString(), instanceConstraintViolationsList.size() == 0); } @Test @Transactional public void testAddMaterialCategoryWithSameName() { /* Build material (0 constraint violations) */ MaterialCategoryDTO mc1 = new MaterialCategoryDTO("subMC1", "subCategory", "subMC2", null, null); MaterialCategoryListDTO subCategoryListDTOC = createMaterialCategoryListDTO(mc1); MaterialCategoryDTO mc2 = new MaterialCategoryDTO("subMC2", "subCategory", null, subCategoryListDTOC, null); MaterialCategoryListDTO subCategoryListDTOB = createMaterialCategoryListDTO(mc2); /* Build main material category */ MaterialCategoryDTO materialCategoryDTO = new MaterialCategoryDTO("mainMaterialCode", "mainCategory1", null, subCategoryListDTOB, null); MaterialCategoryListDTO materialCategoryListDTOA = createMaterialCategoryListDTO(materialCategoryDTO); List<InstanceConstraintViolationsDTO> instanceConstraintViolationsList = materialService .addMaterials(materialCategoryListDTOA).instanceConstraintViolationsList; assertTrue(instanceConstraintViolationsList.toString(), instanceConstraintViolationsList.size() == 1); } @Test @Transactional public void testAddMaterialCategoryWithInconsistentParent() { /* Build material (0 constraint violations) */ MaterialCategoryDTO mc1 = new MaterialCategoryDTO("subMCX1", "subCategoryC", "mainMaterialCode", null, null); MaterialCategoryListDTO subCategoryListDTOC = createMaterialCategoryListDTO(mc1); MaterialCategoryDTO mc2 = new MaterialCategoryDTO("subMCX2", "subCategoryB", null, subCategoryListDTOC, null); MaterialCategoryListDTO subCategoryListDTOB = createMaterialCategoryListDTO(mc2); /* Build main material category */ MaterialCategoryDTO materialCategoryDTO = new MaterialCategoryDTO("mainMaterialCodeX", "mainCategory1", null, subCategoryListDTOB, null); MaterialCategoryListDTO materialCategoryListDTOA = createMaterialCategoryListDTO(materialCategoryDTO); List<InstanceConstraintViolationsDTO> instanceConstraintViolationsList = materialService .addMaterials(materialCategoryListDTOA).instanceConstraintViolationsList; assertTrue(instanceConstraintViolationsList.toString(), instanceConstraintViolationsList.size() == 1); } @Test @Transactional public void testAddAndUpdateMaterialCategory() { /* Build material (0 constraint violations) */ MaterialDTO m1 = new MaterialDTO( "M-1", "tornillos", new BigDecimal(13), UnitTypeBootstrap.getDefaultUnitType().getCode(), true); List<MaterialDTO> materialDTOs1 = new ArrayList<>(); materialDTOs1.add(m1); MaterialCategoryDTO mc1 = new MaterialCategoryDTO("MC-C", "MC-C", "MC-B", null, null); MaterialCategoryListDTO subCategoryListDTOC = createMaterialCategoryListDTO(mc1); MaterialCategoryDTO mc2 = new MaterialCategoryDTO("MC-B", "MC-B", "C-A", subCategoryListDTOC, materialDTOs1); MaterialCategoryListDTO subCategoryListDTOB = createMaterialCategoryListDTO(mc2); /* Build main material category */ MaterialCategoryDTO materialCategoryDTO = new MaterialCategoryDTO("C-A", "C-A", null, subCategoryListDTOB, null); MaterialCategoryListDTO materialCategoryListDTOA = createMaterialCategoryListDTO(materialCategoryDTO); List<InstanceConstraintViolationsDTO> instanceConstraintViolationsList = materialService .addMaterials(materialCategoryListDTOA).instanceConstraintViolationsList; assertTrue(instanceConstraintViolationsList.toString(), instanceConstraintViolationsList.size() == 0); try { MaterialCategory mc = materialCategoryDAO.findByCode("MC-B"); assertTrue(mc.getMaterials().size() == 1); assertTrue(mc.getSubcategories().size() == 1); assertTrue(mc.getName().equalsIgnoreCase("MC-B")); materialCategoryDAO.flush(); sessionFactory.getCurrentSession().evict(mc); } catch (InstanceNotFoundException e) { fail(); } } private MaterialCategoryListDTO createMaterialCategoryListDTO(MaterialCategoryDTO... materialCategoryDTOs) { List<MaterialCategoryDTO> materialCategoryList = new ArrayList<>(); for (MaterialCategoryDTO c : materialCategoryDTOs) { materialCategoryList.add(c); } return new MaterialCategoryListDTO(materialCategoryList); } }