diff --git a/src/main/java/org/openepics/names/rest/api/v1/IStructures.java b/src/main/java/org/openepics/names/rest/api/v1/IStructures.java index 45d962ad63206959d7a94d7e82cf3ccae9f521d3..ff7ee6a0ff73ebe17119c5a87fe740ca84d299db 100644 --- a/src/main/java/org/openepics/names/rest/api/v1/IStructures.java +++ b/src/main/java/org/openepics/names/rest/api/v1/IStructures.java @@ -1572,6 +1572,10 @@ public interface IStructures { * Approve structures (proposals) by list of structure elements. * Return list of structure elements for approved structures. * + * <p> + * Name is automatically created name when creation of system structure is approved. + * </p> + * * @param structureElements list of structure elements * @return list of structure elements for approved structures */ @@ -1581,6 +1585,8 @@ public interface IStructures { Approve structures (proposals) by array of structure elements. Return array of structure elements for approved structures. + Name is automatically created name when creation of system structure is approved. + Required attributes: - uuid - type @@ -1644,6 +1650,10 @@ public interface IStructures { * Approve structures (proposals) by upload Excel file. * Return Excel file with structure elements for approved structures. * + * <p> + * Name is automatically created name when creation of system structure is approved. + * </p> + * * @param structureElements list of structure elements * @return Excel file */ @@ -1653,6 +1663,8 @@ public interface IStructures { Approve structures (proposals) by upload Excel file. Return Excel file with structure elements for for approved structures. + Name is automatically created name when creation of system structure is approved. + Expected columns as in Excel template for structures. Required attributes: diff --git a/src/main/java/org/openepics/names/service/NamesService.java b/src/main/java/org/openepics/names/service/NamesService.java index fbb09ba661d10b06f203ca1dd818f1f62d795ccb..a7dff5e0ff1cac26af3c3b77017ab96518c4e0da 100644 --- a/src/main/java/org/openepics/names/service/NamesService.java +++ b/src/main/java/org/openepics/names/service/NamesService.java @@ -62,6 +62,7 @@ import org.openepics.names.util.NameUtil; import org.openepics.names.util.ValidateUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import com.google.common.collect.Lists; @@ -152,46 +153,54 @@ public class NamesService { String requestedBy = "test who"; final List<NameElement> createdNameElements = Lists.newArrayList(); for (NameElementCommand nameElement : nameElements) { - // find out - // system structure - system group, system, subsystem - one of the three expected to be non-null, other two expected to be null - // device structure - device type - may be null - SystemGroup systemGroup = holderIRepositories.getSystemGroupRepository().findLatestByUuid(nameElement.getParentsystemstructure().toString()); - System system = holderIRepositories.getSystemRepository().findLatestByUuid(nameElement.getParentsystemstructure().toString()); - Subsystem subsystem = holderIRepositories.getSubsystemRepository().findLatestByUuid(nameElement.getParentsystemstructure().toString()); - DeviceType deviceType = null; - if (nameElement.getParentdevicestructure() != null) { - deviceType = holderIRepositories.getDeviceTypeRepository().findLatestByUuid(nameElement.getParentdevicestructure().toString()); - } + // create name within current transaction + createdNameElements.add(createName(nameElement, holder, requestedBy)); + } - String derivedName = null; - if (systemGroup != null) { - derivedName = NameUtil.getName(systemGroup, deviceType, nameElement.getIndex(), holder); - } else if (system != null) { - derivedName = NameUtil.getName(system, deviceType, nameElement.getIndex(), holder); - } else if (subsystem != null) { - derivedName = NameUtil.getName(subsystem, deviceType, nameElement.getIndex(), holder); - } + LOGGER.log(Level.INFO, "createNames, createdNameElements.size: " + createdNameElements.size()); + return createdNameElements; + } + @Transactional(propagation = Propagation.MANDATORY) + NameElement createName(NameElementCommand nameElement, HolderSystemDeviceStructure holder, String requestedBy) { + // transaction + // support a current transaction, throw an exception if none exists + + // find out + // system structure - system group, system, subsystem - one of the three expected to be non-null, other two expected to be null + // device structure - device type - may be null + SystemGroup systemGroup = holderIRepositories.getSystemGroupRepository().findLatestByUuid(nameElement.getParentsystemstructure().toString()); + System system = holderIRepositories.getSystemRepository().findLatestByUuid(nameElement.getParentsystemstructure().toString()); + Subsystem subsystem = holderIRepositories.getSubsystemRepository().findLatestByUuid(nameElement.getParentsystemstructure().toString()); + DeviceType deviceType = null; + if (nameElement.getParentdevicestructure() != null) { + deviceType = holderIRepositories.getDeviceTypeRepository().findLatestByUuid(nameElement.getParentdevicestructure().toString()); + } - // create - Name name = new Name(); - setAttributes(name, - UUID.randomUUID(), - systemGroup != null ? systemGroup.getUuid() : null, system != null ? system.getUuid() : null, subsystem != null ? subsystem.getUuid() : null, nameElement.getParentdevicestructure(), - nameElement.getIndex(), derivedName, namingConvention.equivalenceClassRepresentative(derivedName), - nameElement.getDescription(), Status.APPROVED, Boolean.TRUE, Boolean.FALSE, - new Date(), requestedBy, nameElement.getComment()); + String derivedName = null; + if (systemGroup != null) { + derivedName = NameUtil.getName(systemGroup, deviceType, nameElement.getIndex(), holder); + } else if (system != null) { + derivedName = NameUtil.getName(system, deviceType, nameElement.getIndex(), holder); + } else if (subsystem != null) { + derivedName = NameUtil.getName(subsystem, deviceType, nameElement.getIndex(), holder); + } - nameRepository.createName(name); + // create + Name name = new Name(); + setAttributes(name, + UUID.randomUUID(), + systemGroup != null ? systemGroup.getUuid() : null, system != null ? system.getUuid() : null, subsystem != null ? subsystem.getUuid() : null, nameElement.getParentdevicestructure(), + nameElement.getIndex(), derivedName, namingConvention.equivalenceClassRepresentative(derivedName), + nameElement.getDescription(), Status.APPROVED, Boolean.TRUE, Boolean.FALSE, + new Date(), requestedBy, nameElement.getComment()); - // possibly validate that created - // approved, latest, not deleted, uuid + nameRepository.createName(name); - // add - createdNameElements.add(NameElementUtil.getNameElement(name)); - } + // possibly validate that created + // approved, latest, not deleted, uuid - LOGGER.log(Level.INFO, "createNames, createdNameElements.size: " + createdNameElements.size()); - return createdNameElements; + // add + return NameElementUtil.getNameElement(name); } // ---------------------------------------------------------------------------------------------------- diff --git a/src/main/java/org/openepics/names/service/StructuresService.java b/src/main/java/org/openepics/names/service/StructuresService.java index 7d3425da1869a3f5f9034d34eb201227edc33800..648b86072fdbf4a4a5991f95012e4777fdea371d 100644 --- a/src/main/java/org/openepics/names/service/StructuresService.java +++ b/src/main/java/org/openepics/names/service/StructuresService.java @@ -51,6 +51,8 @@ import org.openepics.names.repository.model.SystemGroup; import org.openepics.names.rest.beans.FieldStructure; import org.openepics.names.rest.beans.Status; import org.openepics.names.rest.beans.Type; +import org.openepics.names.rest.beans.element.NameElement; +import org.openepics.names.rest.beans.element.NameElementCommand; import org.openepics.names.rest.beans.element.StructureElement; import org.openepics.names.rest.beans.element.StructureElementCommand; import org.openepics.names.rest.beans.response.ResponsePageStructureElements; @@ -92,6 +94,7 @@ public class StructuresService { private HolderIRepositories holderIRepositories; private HolderRepositories holderRepositories; + private NamesService namesService; @Autowired public StructuresService( @@ -108,7 +111,8 @@ public class StructuresService { SubsystemRepository subsystemRepository, DisciplineRepository disciplineRepository, DeviceGroupRepository deviceGroupRepository, - DeviceTypeRepository deviceTypeRepository) { + DeviceTypeRepository deviceTypeRepository, + NamesService namesService) { this.namingConvention = new EssNamingConvention(); this.holderIRepositories = new HolderIRepositories( @@ -127,6 +131,7 @@ public class StructuresService { disciplineRepository, deviceGroupRepository, deviceTypeRepository); + this.namesService = namesService; } @Transactional @@ -1170,6 +1175,14 @@ public class StructuresService { // possibly validate that approved + // automatically create name when system structure is approved (after create) + // create name within current transaction + if (!StringUtils.isEmpty(systemGroup.getMnemonic())) { + NameElementCommand nameElement = new NameElementCommand(null, systemGroup.getUuid(), null, null, "System structure only", null); + NameElement createdNameElement = namesService.createName(nameElement, holder, processedBy); + LOGGER.log(Level.INFO, "approveStructures, nameElement created, name: " + createdNameElement.getName()); + } + // add approvedStructureElements.add(StructureElementUtil.getStructureElementProcessed(systemGroup, holder)); } else if (Type.SYSTEM.equals(structureElement.getType())) { @@ -1198,6 +1211,14 @@ public class StructuresService { // possibly validate that approved + // automatically create name when system structure is approved (after create) + // create name within current transaction + if (!StringUtils.isEmpty(system.getMnemonic())) { + NameElementCommand nameElement = new NameElementCommand(null, system.getUuid(), null, null, "System structure only", null); + NameElement createdNameElement = namesService.createName(nameElement, holder, processedBy); + LOGGER.log(Level.INFO, "approveStructures, nameElement created, name: " + createdNameElement.getName()); + } + // add approvedStructureElements.add(StructureElementUtil.getStructureElementProcessed(system, holder)); } else if (Type.SUBSYSTEM.equals(structureElement.getType())) { @@ -1226,6 +1247,14 @@ public class StructuresService { // possibly validate that approved + // automatically create name when system structure is approved (after create) + // create name within current transaction + if (!StringUtils.isEmpty(subsystem.getMnemonic())) { + NameElementCommand nameElement = new NameElementCommand(null, subsystem.getUuid(), null, null, "System structure only", null); + NameElement createdNameElement = namesService.createName(nameElement, holder, processedBy); + LOGGER.log(Level.INFO, "approveStructures, nameElement created, name: " + createdNameElement.getName()); + } + // add approvedStructureElements.add(StructureElementUtil.getStructureElementProcessed(subsystem, holder)); } else if (Type.DISCIPLINE.equals(structureElement.getType())) { diff --git a/src/test/java/org/openepics/names/docker/NamesIT.java b/src/test/java/org/openepics/names/docker/NamesIT.java index c6be3e09157f793c537b907aa5d919cb5dcd773e..648d9526f4a0e28eeebacca1220c730635c8ea24 100644 --- a/src/test/java/org/openepics/names/docker/NamesIT.java +++ b/src/test/java/org/openepics/names/docker/NamesIT.java @@ -246,8 +246,10 @@ class NamesIT { ITUtilNameElement.assertValidate(nameElement, NameChoice.CREATE, Boolean.FALSE); ITUtilNameElement.assertCreate(nameElement, ITUtil.HTTP_UNPROCESSABLE_ENTITY); + // convention name exists + // already exists since create subsystem was approved nameElement.setParentsystemstructure(subsystem010PRL); - ITUtilNameElement.assertValidate(nameElement, NameChoice.CREATE, Boolean.TRUE); + ITUtilNameElement.assertValidate(nameElement, NameChoice.CREATE, Boolean.FALSE); // ---------- // system structure + device structure + index @@ -277,8 +279,10 @@ class NamesIT { // description // comment + // convention name exists + // already exists since create system was approved nameElement.setParentsystemstructure(systemRFQ); - ITUtilNameElement.assertValidate(nameElement, NameChoice.CREATE, Boolean.TRUE); + ITUtilNameElement.assertValidate(nameElement, NameChoice.CREATE, Boolean.FALSE); // ---------- // system structure + device structure + index @@ -308,8 +312,10 @@ class NamesIT { // description // comment + // convention name exists + // already exists since create system group was approved nameElement.setParentsystemstructure(systemGroupAcc); - ITUtilNameElement.assertValidate(nameElement, NameChoice.CREATE, Boolean.TRUE); + ITUtilNameElement.assertValidate(nameElement, NameChoice.CREATE, Boolean.FALSE); // ---------- // system structure + device structure + index @@ -342,8 +348,10 @@ class NamesIT { // description // comment + // convention name exists + // already exists since create system was approved nameElement.setParentsystemstructure(systemRFQ); - ITUtilNameElement.assertValidate(nameElement, NameChoice.CREATE, Boolean.TRUE); + ITUtilNameElement.assertValidate(nameElement, NameChoice.CREATE, Boolean.FALSE); nameElement.setParentdevicestructure(deviceTypeRFA); ITUtilNameElement.assertValidate(nameElement, NameChoice.CREATE, Boolean.FALSE); @@ -494,8 +502,10 @@ class NamesIT { nameElement.setParentdevicestructure(null); ITUtilNameElement.assertValidate(nameElement, NameChoice.UPDATE, Boolean.FALSE); + // convention name exists + // already exists since create subsystem was approved nameElement.setIndex(null); - ITUtilNameElement.assertValidate(nameElement, NameChoice.UPDATE, Boolean.TRUE); + ITUtilNameElement.assertValidate(nameElement, NameChoice.UPDATE, Boolean.FALSE); nameElement.setIndex("053"); ITUtilNameElement.assertValidate(nameElement, NameChoice.UPDATE, Boolean.FALSE); @@ -798,7 +808,7 @@ class NamesIT { ITUtilNameElement.assertRead("/systemstructure/RFQ-010", -1, 6); ITUtilNameElement.assertRead("/systemstructure/RFQ-0", 0, 0); ITUtilNameElement.assertRead("/systemstructure/RFQ-0__", -1, 6); - ITUtilNameElement.assertRead("/systemstructure/RFQ-N1U1", 0, 0); + ITUtilNameElement.assertRead("/systemstructure/RFQ-N1U1", 1, 1); ITUtilNameElement.assertRead("/devicestructure/EMR-FS", -1, 6); ITUtilNameElement.assertRead("/devicestructure/EMR-F", 0, 0); diff --git a/src/test/java/org/openepics/names/docker/complex/NamesMultipleIT.java b/src/test/java/org/openepics/names/docker/complex/NamesMultipleIT.java index c2c9c875e9c6491c1c6f61ea9743653dac97c157..d1376ec5910b85cf96efbb0ba28c17484cf92740 100644 --- a/src/test/java/org/openepics/names/docker/complex/NamesMultipleIT.java +++ b/src/test/java/org/openepics/names/docker/complex/NamesMultipleIT.java @@ -223,6 +223,7 @@ class NamesMultipleIT { try { NameElementCommand[] nameElements = null; NameElement[] createdNameElements = null; + int nbrNames = -1; nameElements = new NameElementCommand[] { new NameElementCommand(null, systemGroupAcc, null, null, "create 1.0.0", "create 1.0.0"), @@ -237,6 +238,22 @@ class NamesMultipleIT { new NameElementCommand(null, subsystem010PRL, deviceType_Cryo_FS, "023", "create 3.3.023", "create 3.3.023") }; + ITUtilNameElement.assertValidate(nameElements, NameChoice.CREATE, Boolean.FALSE); + ITUtilNameElement.assertValidate(nameElements, NameChoice.UPDATE, Boolean.FALSE); + ITUtilNameElement.assertValidate(nameElements, NameChoice.DELETE, Boolean.FALSE); + + nameElements = new NameElementCommand[] { + nameElements[1], + nameElements[2], + nameElements[3], + nameElements[4], + nameElements[5], + nameElements[6], + nameElements[7], + nameElements[8], + nameElements[9] + }; + ITUtilNameElement.assertExists("Acc:Cryo-FS-023", Boolean.FALSE); ITUtilNameElement.assertIsLegacy("Acc:Cryo-FS-023", Boolean.FALSE); ITUtilNameElement.assertIsValidToCreate("Acc:Cryo-FS-023", Boolean.TRUE); @@ -244,9 +261,13 @@ class NamesMultipleIT { ITUtilNameElement.assertValidate(nameElements, NameChoice.UPDATE, Boolean.FALSE); ITUtilNameElement.assertValidate(nameElements, NameChoice.DELETE, Boolean.FALSE); + nbrNames = ITUtilNameElement.assertRead("?deleted=false", -1, -1).getListSize(); + createdNameElements = ITUtilNameElement.assertCreate(nameElements); assertNotNull(createdNameElements); - assertEquals(10, createdNameElements.length); + assertEquals(9, createdNameElements.length); + + assertEquals(nbrNames + 9, ITUtilNameElement.assertRead("?deleted=false", -1, -1).getListSize()); ITUtilNameElement.assertExists("Acc:Cryo-FS-023", Boolean.TRUE); ITUtilNameElement.assertIsLegacy("Acc:Cryo-FS-023", Boolean.FALSE); @@ -279,6 +300,7 @@ class NamesMultipleIT { NameElementCommand[] nameElements = null; NameElement[] createdNameElements = null; + int nbrNames = -1; UUID uuid = null; String value = null; @@ -301,10 +323,14 @@ class NamesMultipleIT { ITUtilNameElement.assertValidate(nameElements, NameChoice.UPDATE, Boolean.FALSE); ITUtilNameElement.assertValidate(nameElements, NameChoice.DELETE, Boolean.FALSE); + nbrNames = ITUtilNameElement.assertRead("?deleted=false", -1, -1).getListSize(); + createdNameElements = ITUtilNameElement.assertCreate(nameElements); assertNotNull(createdNameElements); assertEquals(9, createdNameElements.length); + assertEquals(nbrNames + 9, ITUtilNameElement.assertRead("?deleted=false", -1, -1).getListSize()); + ITUtilNameElement.assertExists("RFQ:Cryo-FS-031", Boolean.TRUE); ITUtilNameElement.assertIsLegacy("RFQ:Cryo-FS-031", Boolean.FALSE); ITUtilNameElement.assertIsValidToCreate("RFQ:Cryo-FS-031", Boolean.FALSE); @@ -369,6 +395,7 @@ class NamesMultipleIT { NameElementCommand[] nameElements = null; NameElement[] createdNameElements = null; NameElement[] updatedNameElements = null; + int nbrNames = -1; nameElements = new NameElementCommand[] { new NameElementCommand(null, systemGroupAcc, deviceType_Cryo_FS, "041", "update 1.3.041", "update 1.3.041"), @@ -383,16 +410,36 @@ class NamesMultipleIT { new NameElementCommand(null, subsystem010PRL, deviceType_Cryo_FS, "043", "update 3.3.043", "update 3.3.043") }; - ITUtilNameElement.assertExists("RFQ", Boolean.FALSE); + ITUtilNameElement.assertValidate(nameElements, NameChoice.CREATE, Boolean.FALSE); + ITUtilNameElement.assertValidate(nameElements, NameChoice.UPDATE, Boolean.FALSE); + ITUtilNameElement.assertValidate(nameElements, NameChoice.DELETE, Boolean.FALSE); + + nameElements = new NameElementCommand[] { + nameElements[0], + nameElements[1], + nameElements[2], + nameElements[4], + nameElements[5], + nameElements[6], + nameElements[7], + nameElements[8], + nameElements[9] + }; + + ITUtilNameElement.assertExists("RFQ", Boolean.TRUE); ITUtilNameElement.assertIsLegacy("RFQ", Boolean.FALSE); - ITUtilNameElement.assertIsValidToCreate("RFQ", Boolean.TRUE); + ITUtilNameElement.assertIsValidToCreate("RFQ", Boolean.FALSE); ITUtilNameElement.assertValidate(nameElements, NameChoice.CREATE, Boolean.TRUE); ITUtilNameElement.assertValidate(nameElements, NameChoice.UPDATE, Boolean.FALSE); ITUtilNameElement.assertValidate(nameElements, NameChoice.DELETE, Boolean.FALSE); + nbrNames = ITUtilNameElement.assertRead("?deleted=false", -1, -1).getListSize(); + createdNameElements = ITUtilNameElement.assertCreate(nameElements); assertNotNull(createdNameElements); - assertEquals(10, createdNameElements.length); + assertEquals(9, createdNameElements.length); + + assertEquals(nbrNames + 9, ITUtilNameElement.assertRead("?deleted=false", -1, -1).getListSize()); ITUtilNameElement.assertExists("RFQ", Boolean.TRUE); ITUtilNameElement.assertIsLegacy("RFQ", Boolean.FALSE); @@ -410,7 +457,6 @@ class NamesMultipleIT { createdNameElements[6].setDescription("6"); createdNameElements[7].setDescription("7"); createdNameElements[8].setDescription("8"); - createdNameElements[9].setDescription("9"); ITUtilNameElement.assertExists("RFQ", Boolean.TRUE); ITUtilNameElement.assertIsLegacy("RFQ", Boolean.FALSE); @@ -421,7 +467,9 @@ class NamesMultipleIT { updatedNameElements = ITUtilNameElement.assertUpdate(createdNameElements); assertNotNull(updatedNameElements); - assertEquals(10, updatedNameElements.length); + assertEquals(9, updatedNameElements.length); + + assertEquals(nbrNames + 9, ITUtilNameElement.assertRead("?deleted=false", -1, -1).getListSize()); ITUtilNameElement.assertExists("RFQ", Boolean.TRUE); ITUtilNameElement.assertIsLegacy("RFQ", Boolean.FALSE); @@ -453,6 +501,7 @@ class NamesMultipleIT { NameElementCommand[] nameElements = null; NameElement[] createdNameElements = null; + int nbrNames = -1; UUID uuid = null; String value = null; @@ -475,10 +524,14 @@ class NamesMultipleIT { ITUtilNameElement.assertValidate(nameElements, NameChoice.UPDATE, Boolean.FALSE); ITUtilNameElement.assertValidate(nameElements, NameChoice.DELETE, Boolean.FALSE); + nbrNames = ITUtilNameElement.assertRead("?deleted=false", -1, -1).getListSize(); + createdNameElements = ITUtilNameElement.assertCreate(nameElements); assertNotNull(createdNameElements); assertEquals(9, createdNameElements.length); + assertEquals(nbrNames + 9, ITUtilNameElement.assertRead("?deleted=false", -1, -1).getListSize()); + ITUtilNameElement.assertExists("RFQ:Cryo-FS-051", Boolean.TRUE); ITUtilNameElement.assertIsLegacy("RFQ:Cryo-FS-051", Boolean.FALSE); ITUtilNameElement.assertIsValidToCreate("RFQ:Cryo-FS-051", Boolean.FALSE); @@ -551,6 +604,7 @@ class NamesMultipleIT { NameElementCommand[] nameElements = null; NameElement[] createdNameElements = null; NameElement[] deletedNameElements = null; + int nbrNames = -1; nameElements = new NameElementCommand[] { new NameElementCommand(null, systemGroupAcc, deviceType_Cryo_FS, "061", "delete 1.3.061", "delete 1.3.061"), @@ -565,6 +619,22 @@ class NamesMultipleIT { new NameElementCommand(null, subsystem010PRL, deviceType_Cryo_FS, "063", "delete 3.3.063", "delete 3.3.063") }; + ITUtilNameElement.assertValidate(nameElements, NameChoice.CREATE, Boolean.FALSE); + ITUtilNameElement.assertValidate(nameElements, NameChoice.UPDATE, Boolean.FALSE); + ITUtilNameElement.assertValidate(nameElements, NameChoice.DELETE, Boolean.FALSE); + + nameElements = new NameElementCommand[] { + nameElements[0], + nameElements[1], + nameElements[2], + nameElements[3], + nameElements[4], + nameElements[5], + nameElements[7], + nameElements[8], + nameElements[9] + }; + ITUtilNameElement.assertExists("RFQ:Cryo-FS-061", Boolean.FALSE); ITUtilNameElement.assertIsLegacy("RFQ:Cryo-FS-061", Boolean.FALSE); ITUtilNameElement.assertIsValidToCreate("RFQ:Cryo-FS-061", Boolean.TRUE); @@ -572,9 +642,13 @@ class NamesMultipleIT { ITUtilNameElement.assertValidate(nameElements, NameChoice.UPDATE, Boolean.FALSE); ITUtilNameElement.assertValidate(nameElements, NameChoice.DELETE, Boolean.FALSE); + nbrNames = ITUtilNameElement.assertRead("?deleted=false", -1, -1).getListSize(); + createdNameElements = ITUtilNameElement.assertCreate(nameElements); assertNotNull(createdNameElements); - assertEquals(10, createdNameElements.length); + assertEquals(9, createdNameElements.length); + + assertEquals(nbrNames + 9, ITUtilNameElement.assertRead("?deleted=false", -1, -1).getListSize()); ITUtilNameElement.assertExists("RFQ:Cryo-FS-061", Boolean.TRUE); ITUtilNameElement.assertIsLegacy("RFQ:Cryo-FS-061", Boolean.FALSE); @@ -585,7 +659,9 @@ class NamesMultipleIT { deletedNameElements = ITUtilNameElement.assertDelete(createdNameElements); assertNotNull(deletedNameElements); - assertEquals(10, deletedNameElements.length); + assertEquals(9, deletedNameElements.length); + + assertEquals(nbrNames, ITUtilNameElement.assertRead("?deleted=false", -1, -1).getListSize()); ITUtilNameElement.assertExists("RFQ:Cryo-FS-061", Boolean.FALSE); ITUtilNameElement.assertIsLegacy("RFQ:Cryo-FS-061", Boolean.FALSE); diff --git a/src/test/java/org/openepics/names/docker/complex/StructuresNamesIT.java b/src/test/java/org/openepics/names/docker/complex/StructuresNamesIT.java new file mode 100644 index 0000000000000000000000000000000000000000..cc2b23b1956467656b1f9083037e67ee71441d11 --- /dev/null +++ b/src/test/java/org/openepics/names/docker/complex/StructuresNamesIT.java @@ -0,0 +1,213 @@ +/* + * Copyright (C) 2022 European Spallation Source ERIC. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +package org.openepics.names.docker.complex; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.io.File; +import java.util.UUID; + +import org.junit.jupiter.api.Test; +import org.openepics.names.docker.ITUtil; +import org.openepics.names.docker.ITUtilNameElement; +import org.openepics.names.docker.ITUtilStructureElement; +import org.openepics.names.rest.beans.Type; +import org.openepics.names.rest.beans.element.StructureElement; +import org.openepics.names.rest.beans.element.StructureElementCommand; +import org.testcontainers.containers.DockerComposeContainer; +import org.testcontainers.containers.wait.strategy.Wait; +import org.testcontainers.junit.jupiter.Container; +import org.testcontainers.junit.jupiter.Testcontainers; + +/** + * Integration tests for Naming and PostgreSQL that make use of existing dockerization + * with docker-compose.yml / Dockerfile. + * + * <p> + * Focus of this class are names and structures endpoints. + * In particular, purpose is to test automatic add of names when system structure only + * structures are approved (after being added). + * </p> + * + * @author Lars Johansson + */ +@Testcontainers +class StructuresNamesIT { + + // names are to be automatically created after system structure only structures are approved (after being added) + // + // test combinations + // structure - system, device + // number of entries - one, multiple + // operations - add, approve + + @Container + public static final DockerComposeContainer<?> ENVIRONMENT = + new DockerComposeContainer<>(new File("docker-compose-it-db-schema-migration.yml")) + .waitingFor(ITUtil.NAMING, Wait.forLogMessage(".*Started NamingApplication.*", 1)); + + private static UUID systemGroupUuid = null; + private static UUID systemUuid = null; + + private static UUID systemGroupAcc = null; + private static UUID systemRFQ = null; + + private static UUID disciplineUuid = null; + private static UUID deviceGroupUuid = null; + + // no @BeforeAll + + @Test + void checkSystemStructure1() { + // systemGroupUuid + // systemUuid + // subsystemUuid + + StructureElementCommand structureElement = null; + StructureElement createdStructureElement = null; + int nbrNames = -1; + + nbrNames = ITUtilNameElement.assertRead("?deleted=false", -1, -1).getListSize(); + + structureElement = new StructureElementCommand( + null, Type.SYSTEMGROUP, null, + "name", "Sg", + "description", "comment"); + createdStructureElement = ITUtilStructureElement.assertCreate(structureElement); + systemGroupUuid = createdStructureElement.getUuid(); + + assertEquals(nbrNames, ITUtilNameElement.assertRead("?deleted=false", -1, -1).getListSize()); + ITUtilStructureElement.assertApprove(createdStructureElement); + assertEquals(nbrNames + 1, ITUtilNameElement.assertRead("?deleted=false", -1, -1).getListSize()); + + structureElement = new StructureElementCommand( + null, Type.SYSTEM, systemGroupUuid, + "name", "Sys", + "description", "comment"); + createdStructureElement = ITUtilStructureElement.assertCreate(structureElement); + systemUuid = createdStructureElement.getUuid(); + + assertEquals(nbrNames + 1, ITUtilNameElement.assertRead("?deleted=false", -1, -1).getListSize()); + ITUtilStructureElement.assertApprove(createdStructureElement); + assertEquals(nbrNames + 2, ITUtilNameElement.assertRead("?deleted=false", -1, -1).getListSize()); + + structureElement = new StructureElementCommand( + null, Type.SUBSYSTEM, systemUuid, + "name", "Sub", + "description", "comment"); + createdStructureElement = ITUtilStructureElement.assertCreate(structureElement); + + assertEquals(nbrNames + 2, ITUtilNameElement.assertRead("?deleted=false", -1, -1).getListSize()); + ITUtilStructureElement.assertApprove(createdStructureElement); + assertEquals(nbrNames + 3, ITUtilNameElement.assertRead("?deleted=false", -1, -1).getListSize()); + } + + @Test + void checkSystemStructure2() { + // systemGroupAcc + // systemRFQ + // subsystem010PRL + // subsystem010 + // subsystemN1U1 + + StructureElementCommand[] structureElements = null; + StructureElementCommand structureElement = null; + StructureElement approvedStructureElement = null; + int nbrNames = -1; + + nbrNames = ITUtilNameElement.assertRead("?deleted=false", -1, -1).getListSize(); + + structureElement = new StructureElementCommand( + null, Type.SYSTEMGROUP, null, + "Accelerator", "Acc", + "The ESS Linear Accelerator", "approved by alfio"); + approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement); + systemGroupAcc = approvedStructureElement.getUuid(); + + assertEquals(nbrNames + 1, ITUtilNameElement.assertRead("?deleted=false", -1, -1).getListSize()); + + structureElement = new StructureElementCommand( + null, Type.SYSTEM, systemGroupAcc, + "Radio Frequency Quadrupole", "RFQ", + "empty", "empty"); + approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement); + systemRFQ = approvedStructureElement.getUuid(); + + assertEquals(nbrNames + 2, ITUtilNameElement.assertRead("?deleted=false", -1, -1).getListSize()); + + structureElements = new StructureElementCommand[] { + structureElement = new StructureElementCommand( + null, Type.SUBSYSTEM, systemRFQ, + "01 Phase Reference Line", "010PRL", + "empty", "Approved by Daniel Piso"), + structureElement = new StructureElementCommand( + null, Type.SUBSYSTEM, systemRFQ, + "RFQ-010", "010", + "empty", "Approved by Daniel Piso"), + structureElement = new StructureElementCommand( + null, Type.SUBSYSTEM, systemRFQ, + "Power switch board 01", "N1U1", + "Electrical power cabinets", "Approved by Daniel Piso") + }; + + ITUtilStructureElement.assertCreateApprove(structureElements); + + assertEquals(nbrNames + 5, ITUtilNameElement.assertRead("?deleted=false", -1, -1).getListSize()); + } + + @Test + void checkDeviceStructure() { + // disciplineUuid + // deviceGroupUuid + // deviceTypeUuid + + StructureElementCommand structureElement = null; + StructureElement approvedStructureElement = null; + int nbrNames = -1; + + nbrNames = ITUtilNameElement.assertRead("?deleted=false", -1, -1).getListSize(); + + structureElement = new StructureElementCommand( + null, Type.DISCIPLINE, null, + "name", "Di", + "description", "comment"); + approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement); + disciplineUuid = approvedStructureElement.getUuid(); + + assertEquals(nbrNames, ITUtilNameElement.assertRead("?deleted=false", -1, -1).getListSize()); + + structureElement = new StructureElementCommand( + null, Type.DEVICEGROUP, disciplineUuid, + "name", null, + "description", "comment"); + approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement); + deviceGroupUuid = approvedStructureElement.getUuid(); + + assertEquals(nbrNames, ITUtilNameElement.assertRead("?deleted=false", -1, -1).getListSize()); + + structureElement = new StructureElementCommand( + null, Type.DEVICETYPE, deviceGroupUuid, + "name", "Dt", + "empty", "empty"); + approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement); + + assertEquals(nbrNames, ITUtilNameElement.assertRead("?deleted=false", -1, -1).getListSize()); + } + +}