From 85f3371ad2adc182623c9297acf51df3452973ae Mon Sep 17 00:00:00 2001
From: Lars Johansson <lars.johansson@ess.eu>
Date: Thu, 16 Jun 2022 10:46:32 +0200
Subject: [PATCH] Update validation for create names and structures

Application will generate uuid.
Update validation to not allow value for uuid when create names and structures.
Update integration tests.
---
 .../GlobalControllerExceptionHandler.java     |  6 ++-
 .../exception/InputNotEmptyException.java     | 44 +++++++++++++++++++
 .../openepics/names/util/ExceptionUtil.java   | 38 ++++++++++++++++
 .../org/openepics/names/util/TextUtil.java    |  5 +++
 .../openepics/names/util/ValidateUtil.java    | 36 ++++++++++-----
 .../names/docker/ITUtilNameElement.java       |  2 +
 .../names/docker/StructuresDeviceGroupIT.java | 30 +++++++++++--
 .../names/docker/StructuresDeviceTypeIT.java  | 16 +++++++
 .../names/docker/StructuresDisciplineIT.java  | 16 +++++++
 .../names/docker/StructuresSubsystemIT.java   | 16 +++++++
 .../names/docker/StructuresSystemGroupIT.java | 16 +++++++
 .../names/docker/StructuresSystemIT.java      | 16 +++++++
 12 files changed, 225 insertions(+), 16 deletions(-)
 create mode 100644 src/main/java/org/openepics/names/service/exception/InputNotEmptyException.java

diff --git a/src/main/java/org/openepics/names/rest/controller/GlobalControllerExceptionHandler.java b/src/main/java/org/openepics/names/rest/controller/GlobalControllerExceptionHandler.java
index 2e36231f..33014208 100644
--- a/src/main/java/org/openepics/names/rest/controller/GlobalControllerExceptionHandler.java
+++ b/src/main/java/org/openepics/names/rest/controller/GlobalControllerExceptionHandler.java
@@ -29,6 +29,7 @@ import org.openepics.names.service.exception.DataNotFoundException;
 import org.openepics.names.service.exception.DataNotValidException;
 import org.openepics.names.service.exception.InputNotAvailableException;
 import org.openepics.names.service.exception.InputNotCorrectException;
+import org.openepics.names.service.exception.InputNotEmptyException;
 import org.openepics.names.service.exception.InputNotValidException;
 import org.openepics.names.service.exception.ServiceException;
 import org.openepics.names.util.TextUtil;
@@ -72,7 +73,10 @@ public class GlobalControllerExceptionHandler extends ResponseEntityExceptionHan
             response.setField(StringUtils.trimToEmpty(se.getField()));
             resultStatus = HttpStatus.BAD_REQUEST;
 
-            if (ex instanceof InputNotAvailableException || ex instanceof InputNotCorrectException || ex instanceof InputNotValidException) {
+            if (ex instanceof InputNotAvailableException
+                    || ex instanceof InputNotCorrectException
+                    || ex instanceof InputNotEmptyException
+                    || ex instanceof InputNotValidException) {
                 resultStatus = HttpStatus.UNPROCESSABLE_ENTITY;
             }
 
diff --git a/src/main/java/org/openepics/names/service/exception/InputNotEmptyException.java b/src/main/java/org/openepics/names/service/exception/InputNotEmptyException.java
new file mode 100644
index 00000000..f27e96a8
--- /dev/null
+++ b/src/main/java/org/openepics/names/service/exception/InputNotEmptyException.java
@@ -0,0 +1,44 @@
+/*
+ * 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.service.exception;
+
+/**
+ * Exception class to assist in handling of service layer exceptions.
+ *
+ * @author Lars Johansson
+ */
+public class InputNotEmptyException extends ServiceException {
+
+    /**
+     *
+     */
+    private static final long serialVersionUID = 8537254593583337762L;
+
+    /**
+     * Public constructor.
+     *
+     * @param message message
+     * @param details details
+     * @param field field
+     */
+    public InputNotEmptyException(String message, String details, String field) {
+        super(message, details, field, null);
+    }
+
+}
diff --git a/src/main/java/org/openepics/names/util/ExceptionUtil.java b/src/main/java/org/openepics/names/util/ExceptionUtil.java
index 050ecc00..4f4122e6 100644
--- a/src/main/java/org/openepics/names/util/ExceptionUtil.java
+++ b/src/main/java/org/openepics/names/util/ExceptionUtil.java
@@ -27,6 +27,7 @@ import org.openepics.names.service.exception.DataNotFoundException;
 import org.openepics.names.service.exception.DataNotValidException;
 import org.openepics.names.service.exception.InputNotAvailableException;
 import org.openepics.names.service.exception.InputNotCorrectException;
+import org.openepics.names.service.exception.InputNotEmptyException;
 import org.openepics.names.service.exception.InputNotValidException;
 
 /**
@@ -170,6 +171,24 @@ public class ExceptionUtil {
         }
     }
 
+    /**
+     * Create input not empty exception.
+     * Intended for communication inside server.
+     * Note that message is automatically generated if message is <tt>null</tt> and field <tt>not null</tt>.
+     *
+     * @param message message
+     * @param details details
+     * @param field field
+     * @return input not empty exception
+     */
+    public static InputNotEmptyException createInputNotEmptyException(String message, String details, String field) {
+        if (message == null && field != null) {
+            return new InputNotEmptyException(TextUtil.VALUE_IS_NOT_EMPTY, details, field);
+        } else {
+            return new InputNotEmptyException(message, details, field);
+        }
+    }
+
     /**
      * Create input not valid exception.
      * Intended for communication inside server.
@@ -326,6 +345,25 @@ public class ExceptionUtil {
         }
     }
 
+    /**
+     * Validate condition and throw input not empty exception if condition not <tt>true</tt>.
+     * Note that message is automatically generated if message is <tt>null</tt> and field <tt>not null</tt>.
+     *
+     * @param condition condition
+     * @param message message
+     * @param details details
+     * @param field field
+     */
+    public static void validateConditionInputNotEmptyException(boolean condition, String message, String details, String field) {
+        if (!condition) {
+            if (message == null && field != null) {
+                throw ExceptionUtil.createInputNotEmptyException(TextUtil.VALUE_IS_NOT_EMPTY, details, field);
+            } else {
+                throw ExceptionUtil.createInputNotEmptyException(message, details, field);
+            }
+        }
+    }
+
     /**
      * Validate condition and throw input not valid exception if condition not <tt>true</tt>.
      * Note that message is automatically generated if message is <tt>null</tt> and field <tt>not null</tt>.
diff --git a/src/main/java/org/openepics/names/util/TextUtil.java b/src/main/java/org/openepics/names/util/TextUtil.java
index a432e731..3701117c 100644
--- a/src/main/java/org/openepics/names/util/TextUtil.java
+++ b/src/main/java/org/openepics/names/util/TextUtil.java
@@ -25,6 +25,10 @@ package org.openepics.names.util;
  */
 public class TextUtil {
 
+    // application
+
+    public static final String NAMING                          = "Naming";
+
     // field
     //     name, structure
     //         name also field
@@ -75,6 +79,7 @@ public class TextUtil {
 
     public static final String VALUE_IS_NOT_AVAILABLE          = "value is not available";
     public static final String VALUE_IS_NOT_CORRECT            = "value is not correct";
+    public static final String VALUE_IS_NOT_EMPTY              = "value is not empty";
     public static final String VALUE_IS_NOT_VALID              = "value is not valid";
     public static final String VALUES_ARE_NOT_CORRECT          = "values are not correct";
 
diff --git a/src/main/java/org/openepics/names/util/ValidateUtil.java b/src/main/java/org/openepics/names/util/ValidateUtil.java
index 80f980d6..90303136 100644
--- a/src/main/java/org/openepics/names/util/ValidateUtil.java
+++ b/src/main/java/org/openepics/names/util/ValidateUtil.java
@@ -293,9 +293,9 @@ public class ValidateUtil {
      */
     private static void validateNameElementInput(NameElementCommand nameElement, NameChoice nameChoice) {
         // attributes
-        //     uuid
-        //     parentsystemstructure
-        //     parentdevicestructure
+        //     uuid                            - required if not create, required empty if create
+        //     parentsystemstructure (uuid)
+        //     parentdevicestructure (uuid)
         //     index
         //     description
         //     comment
@@ -304,8 +304,13 @@ public class ValidateUtil {
             return;
         }
 
-        if (!NameChoice.CREATE.equals(nameChoice)) {
-            validateInputUuid(nameElement.getUuid() !=  null ? nameElement.getUuid().toString() : null);
+        if (NameChoice.CREATE.equals(nameChoice)) {
+            ExceptionUtil.validateConditionInputNotEmptyException(nameElement.getUuid() == null,
+                    TextUtil.VALUE_IS_NOT_EMPTY,
+                    nameElement.getUuid() != null ? nameElement.getUuid().toString() : null,
+                    TextUtil.UUID);
+        } else {
+            validateInputUuid(nameElement.getUuid() != null ? nameElement.getUuid().toString() : null);
         }
 
         if (!NameChoice.DELETE.equals(nameChoice)) {
@@ -729,18 +734,25 @@ public class ValidateUtil {
      */
     private static void validateStructureElementInput(StructureElementCommand structureElement, EssNamingConvention namingConvention, StructureChoice structureChoice) {
         // check structure element input
-        //     parent uuid            - also validate data, parent uuid available if type is system, subsystem, device group, device type
-        //     name                   - required
-        //     mnemonic               - required except for device group
-        //     description            - required
-        //     comment                - required
+        //     uuid             - required if not create, required empty if create
+        //     type             - required
+        //     parent (uuid)    - also validate data, parent uuid available if type is system, subsystem, device group, device type
+        //     name             - required
+        //     mnemonic         - required except for device group
+        //     description      - required
+        //     comment          - required
 
         if (structureElement == null || structureChoice == null) {
             return;
         }
 
-        if (!StructureChoice.CREATE.equals(structureChoice)) {
-            validateInputUuid(structureElement.getUuid() !=  null ? structureElement.getUuid().toString() : null);
+        if (StructureChoice.CREATE.equals(structureChoice)) {
+            ExceptionUtil.validateConditionInputNotEmptyException(structureElement.getUuid() == null,
+                    TextUtil.VALUE_IS_NOT_EMPTY,
+                    structureElement.getUuid() != null ? structureElement.getUuid().toString() : null,
+                    TextUtil.UUID);
+        } else {
+            validateInputUuid(structureElement.getUuid() != null ? structureElement.getUuid().toString() : null);
         }
 
         validateInputType(structureElement.getType());
diff --git a/src/test/java/org/openepics/names/docker/ITUtilNameElement.java b/src/test/java/org/openepics/names/docker/ITUtilNameElement.java
index a00c0370..a22664a2 100644
--- a/src/test/java/org/openepics/names/docker/ITUtilNameElement.java
+++ b/src/test/java/org/openepics/names/docker/ITUtilNameElement.java
@@ -206,6 +206,8 @@ public class ITUtilNameElement {
             response = ITUtil.doGetJson(ITUtil.HTTP_IP_PORT_NAMING_API_V1_NAMES + queryString);
             ITUtil.assertResponseLength2Code(response, HttpURLConnection.HTTP_OK);
             responsePageNameElements = mapper.readValue(response[1], ResponsePageNameElements.class);
+
+            // expected number of items in list
             if (expectedLessThanOrEqual >= 0) {
                 assertTrue(responsePageNameElements.getListSize() <= expectedLessThanOrEqual);
             }
diff --git a/src/test/java/org/openepics/names/docker/StructuresDeviceGroupIT.java b/src/test/java/org/openepics/names/docker/StructuresDeviceGroupIT.java
index c3c204b2..35e3770b 100644
--- a/src/test/java/org/openepics/names/docker/StructuresDeviceGroupIT.java
+++ b/src/test/java/org/openepics/names/docker/StructuresDeviceGroupIT.java
@@ -321,12 +321,17 @@ class StructuresDeviceGroupIT {
 
             // create
             ITUtilStructureElement.assertCreate(structureElement);
+            UUID uuid = structureElement.getUuid();
 
             ITUtilStructureElement.assertExists         (Type.DEVICEGROUP, "Di", Boolean.TRUE);
             ITUtilStructureElement.assertIsValidToCreate(Type.DEVICEGROUP, "Di", Boolean.FALSE);
 
-            ITUtilStructureElement.assertValidate(structureElement, StructureChoice.CREATE,  Boolean.TRUE);
+            ITUtilStructureElement.assertValidate(structureElement, StructureChoice.CREATE,  Boolean.FALSE);
             ITUtilStructureElement.assertValidate(structureElement, StructureChoice.APPROVE, Boolean.TRUE);
+            structureElement.setUuid(null);
+            ITUtilStructureElement.assertValidate(structureElement, StructureChoice.CREATE,  Boolean.TRUE);
+            ITUtilStructureElement.assertValidate(structureElement, StructureChoice.APPROVE, Boolean.FALSE);
+            structureElement.setUuid(uuid);
 
             // approve
             ITUtilStructureElement.assertApprove(structureElement);
@@ -334,6 +339,9 @@ class StructuresDeviceGroupIT {
             ITUtilStructureElement.assertExists         (Type.DEVICEGROUP, "Di", Boolean.TRUE);
             ITUtilStructureElement.assertIsValidToCreate(Type.DEVICEGROUP, "Di", Boolean.FALSE);
 
+            ITUtilStructureElement.assertValidate(structureElement, StructureChoice.CREATE,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(structureElement, StructureChoice.APPROVE, Boolean.FALSE);
+            structureElement.setUuid(null);
             ITUtilStructureElement.assertValidate(structureElement, StructureChoice.CREATE,  Boolean.TRUE);
             ITUtilStructureElement.assertValidate(structureElement, StructureChoice.APPROVE, Boolean.FALSE);
         } catch (Exception e) {
@@ -371,12 +379,17 @@ class StructuresDeviceGroupIT {
 
             // create
             ITUtilStructureElement.assertCreate(structureElement);
+            UUID uuid = structureElement.getUuid();
 
             ITUtilStructureElement.assertExists         (Type.DEVICEGROUP, "Di", Boolean.TRUE);
             ITUtilStructureElement.assertIsValidToCreate(Type.DEVICEGROUP, "Di", Boolean.FALSE);
 
-            ITUtilStructureElement.assertValidate(structureElement, StructureChoice.CREATE, Boolean.TRUE);
+            ITUtilStructureElement.assertValidate(structureElement, StructureChoice.CREATE, Boolean.FALSE);
             ITUtilStructureElement.assertValidate(structureElement, StructureChoice.CANCEL, Boolean.TRUE);
+            structureElement.setUuid(null);
+            ITUtilStructureElement.assertValidate(structureElement, StructureChoice.CREATE, Boolean.TRUE);
+            ITUtilStructureElement.assertValidate(structureElement, StructureChoice.CANCEL, Boolean.FALSE);
+            structureElement.setUuid(uuid);
 
             // cancel
             ITUtilStructureElement.assertCancel(structureElement);
@@ -384,6 +397,9 @@ class StructuresDeviceGroupIT {
             ITUtilStructureElement.assertExists         (Type.DEVICEGROUP, "Di", Boolean.TRUE);
             ITUtilStructureElement.assertIsValidToCreate(Type.DEVICEGROUP, "Di", Boolean.FALSE);
 
+            ITUtilStructureElement.assertValidate(structureElement, StructureChoice.CREATE, Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(structureElement, StructureChoice.CANCEL, Boolean.FALSE);
+            structureElement.setUuid(null);
             ITUtilStructureElement.assertValidate(structureElement, StructureChoice.CREATE, Boolean.TRUE);
             ITUtilStructureElement.assertValidate(structureElement, StructureChoice.CANCEL, Boolean.FALSE);
         } catch (Exception e) {
@@ -421,12 +437,17 @@ class StructuresDeviceGroupIT {
 
             // create
             ITUtilStructureElement.assertCreate(structureElement);
+            UUID uuid = structureElement.getUuid();
 
             ITUtilStructureElement.assertExists         (Type.DEVICEGROUP, "Di", Boolean.TRUE);
             ITUtilStructureElement.assertIsValidToCreate(Type.DEVICEGROUP, "Di", Boolean.FALSE);
 
-            ITUtilStructureElement.assertValidate(structureElement, StructureChoice.CREATE, Boolean.TRUE);
+            ITUtilStructureElement.assertValidate(structureElement, StructureChoice.CREATE, Boolean.FALSE);
             ITUtilStructureElement.assertValidate(structureElement, StructureChoice.REJECT, Boolean.TRUE);
+            structureElement.setUuid(null);
+            ITUtilStructureElement.assertValidate(structureElement, StructureChoice.CREATE, Boolean.TRUE);
+            ITUtilStructureElement.assertValidate(structureElement, StructureChoice.REJECT, Boolean.FALSE);
+            structureElement.setUuid(uuid);
 
             // reject
             ITUtilStructureElement.assertReject(structureElement);
@@ -434,6 +455,9 @@ class StructuresDeviceGroupIT {
             ITUtilStructureElement.assertExists         (Type.DEVICEGROUP, "Di", Boolean.TRUE);
             ITUtilStructureElement.assertIsValidToCreate(Type.DEVICEGROUP, "Di", Boolean.FALSE);
 
+            ITUtilStructureElement.assertValidate(structureElement, StructureChoice.CREATE, Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(structureElement, StructureChoice.REJECT, Boolean.FALSE);
+            structureElement.setUuid(null);
             ITUtilStructureElement.assertValidate(structureElement, StructureChoice.CREATE, Boolean.TRUE);
             ITUtilStructureElement.assertValidate(structureElement, StructureChoice.REJECT, Boolean.FALSE);
         } catch (Exception e) {
diff --git a/src/test/java/org/openepics/names/docker/StructuresDeviceTypeIT.java b/src/test/java/org/openepics/names/docker/StructuresDeviceTypeIT.java
index e12710bd..91656fef 100644
--- a/src/test/java/org/openepics/names/docker/StructuresDeviceTypeIT.java
+++ b/src/test/java/org/openepics/names/docker/StructuresDeviceTypeIT.java
@@ -383,12 +383,17 @@ class StructuresDeviceTypeIT {
 
             // create
             ITUtilStructureElement.assertCreate(structureElement);
+            UUID uuid = structureElement.getUuid();
 
             ITUtilStructureElement.assertExists         (Type.DEVICETYPE, "Di-Cc", Boolean.FALSE);
             ITUtilStructureElement.assertIsValidToCreate(Type.DEVICETYPE, "Di-Cc", Boolean.TRUE);
 
             ITUtilStructureElement.assertValidate(structureElement, StructureChoice.CREATE, Boolean.FALSE);
             ITUtilStructureElement.assertValidate(structureElement, StructureChoice.CANCEL, Boolean.TRUE);
+            structureElement.setUuid(null);
+            ITUtilStructureElement.assertValidate(structureElement, StructureChoice.CREATE, Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(structureElement, StructureChoice.CANCEL, Boolean.FALSE);
+            structureElement.setUuid(uuid);
 
             // cancel
             ITUtilStructureElement.assertCancel(structureElement);
@@ -396,6 +401,9 @@ class StructuresDeviceTypeIT {
             ITUtilStructureElement.assertExists         (Type.DEVICETYPE, "Di-Cc", Boolean.FALSE);
             ITUtilStructureElement.assertIsValidToCreate(Type.DEVICETYPE, "Di-Cc", Boolean.TRUE);
 
+            ITUtilStructureElement.assertValidate(structureElement, StructureChoice.CREATE, Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(structureElement, StructureChoice.CANCEL, Boolean.FALSE);
+            structureElement.setUuid(null);
             ITUtilStructureElement.assertValidate(structureElement, StructureChoice.CREATE, Boolean.TRUE);
             ITUtilStructureElement.assertValidate(structureElement, StructureChoice.CANCEL, Boolean.FALSE);
         } catch (Exception e) {
@@ -433,12 +441,17 @@ class StructuresDeviceTypeIT {
 
             // create
             ITUtilStructureElement.assertCreate(structureElement);
+            UUID uuid = structureElement.getUuid();
 
             ITUtilStructureElement.assertExists         (Type.DEVICETYPE, "Di-Cr", Boolean.FALSE);
             ITUtilStructureElement.assertIsValidToCreate(Type.DEVICETYPE, "Di-Cr", Boolean.TRUE);
 
             ITUtilStructureElement.assertValidate(structureElement, StructureChoice.CREATE, Boolean.FALSE);
             ITUtilStructureElement.assertValidate(structureElement, StructureChoice.REJECT, Boolean.TRUE);
+            structureElement.setUuid(null);
+            ITUtilStructureElement.assertValidate(structureElement, StructureChoice.CREATE, Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(structureElement, StructureChoice.REJECT, Boolean.FALSE);
+            structureElement.setUuid(uuid);
 
             // reject
             ITUtilStructureElement.assertReject(structureElement);
@@ -446,6 +459,9 @@ class StructuresDeviceTypeIT {
             ITUtilStructureElement.assertExists         (Type.DEVICETYPE, "Di-Cr", Boolean.FALSE);
             ITUtilStructureElement.assertIsValidToCreate(Type.DEVICETYPE, "Di-Cr", Boolean.TRUE);
 
+            ITUtilStructureElement.assertValidate(structureElement, StructureChoice.CREATE, Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(structureElement, StructureChoice.REJECT, Boolean.FALSE);
+            structureElement.setUuid(null);
             ITUtilStructureElement.assertValidate(structureElement, StructureChoice.CREATE, Boolean.TRUE);
             ITUtilStructureElement.assertValidate(structureElement, StructureChoice.REJECT, Boolean.FALSE);
         } catch (Exception e) {
diff --git a/src/test/java/org/openepics/names/docker/StructuresDisciplineIT.java b/src/test/java/org/openepics/names/docker/StructuresDisciplineIT.java
index b92dac7e..06b7e1b9 100644
--- a/src/test/java/org/openepics/names/docker/StructuresDisciplineIT.java
+++ b/src/test/java/org/openepics/names/docker/StructuresDisciplineIT.java
@@ -339,12 +339,17 @@ class StructuresDisciplineIT {
 
             // create
             ITUtilStructureElement.assertCreate(structureElement);
+            UUID uuid = structureElement.getUuid();
 
             ITUtilStructureElement.assertExists         (Type.DISCIPLINE, "Cc", Boolean.FALSE);
             ITUtilStructureElement.assertIsValidToCreate(Type.DISCIPLINE, "Cc", Boolean.TRUE);
 
             ITUtilStructureElement.assertValidate(structureElement, StructureChoice.CREATE, Boolean.FALSE);
             ITUtilStructureElement.assertValidate(structureElement, StructureChoice.CANCEL, Boolean.TRUE);
+            structureElement.setUuid(null);
+            ITUtilStructureElement.assertValidate(structureElement, StructureChoice.CREATE, Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(structureElement, StructureChoice.CANCEL, Boolean.FALSE);
+            structureElement.setUuid(uuid);
 
             // cancel
             ITUtilStructureElement.assertCancel(structureElement);
@@ -352,6 +357,9 @@ class StructuresDisciplineIT {
             ITUtilStructureElement.assertExists         (Type.DISCIPLINE, "Cc", Boolean.FALSE);
             ITUtilStructureElement.assertIsValidToCreate(Type.DISCIPLINE, "Cc", Boolean.TRUE);
 
+            ITUtilStructureElement.assertValidate(structureElement, StructureChoice.CREATE, Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(structureElement, StructureChoice.CANCEL, Boolean.FALSE);
+            structureElement.setUuid(null);
             ITUtilStructureElement.assertValidate(structureElement, StructureChoice.CREATE, Boolean.TRUE);
             ITUtilStructureElement.assertValidate(structureElement, StructureChoice.CANCEL, Boolean.FALSE);
         } catch (Exception e) {
@@ -389,12 +397,17 @@ class StructuresDisciplineIT {
 
             // create
             ITUtilStructureElement.assertCreate(structureElement);
+            UUID uuid = structureElement.getUuid();
 
             ITUtilStructureElement.assertExists         (Type.DISCIPLINE, "Cr", Boolean.FALSE);
             ITUtilStructureElement.assertIsValidToCreate(Type.DISCIPLINE, "Cr", Boolean.TRUE);
 
             ITUtilStructureElement.assertValidate(structureElement, StructureChoice.CREATE, Boolean.FALSE);
             ITUtilStructureElement.assertValidate(structureElement, StructureChoice.REJECT, Boolean.TRUE);
+            structureElement.setUuid(null);
+            ITUtilStructureElement.assertValidate(structureElement, StructureChoice.CREATE, Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(structureElement, StructureChoice.REJECT, Boolean.FALSE);
+            structureElement.setUuid(uuid);
 
             // reject
             ITUtilStructureElement.assertReject(structureElement);
@@ -402,6 +415,9 @@ class StructuresDisciplineIT {
             ITUtilStructureElement.assertExists         (Type.DISCIPLINE, "Cr", Boolean.FALSE);
             ITUtilStructureElement.assertIsValidToCreate(Type.DISCIPLINE, "Cr", Boolean.TRUE);
 
+            ITUtilStructureElement.assertValidate(structureElement, StructureChoice.CREATE, Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(structureElement, StructureChoice.REJECT, Boolean.FALSE);
+            structureElement.setUuid(null);
             ITUtilStructureElement.assertValidate(structureElement, StructureChoice.CREATE, Boolean.TRUE);
             ITUtilStructureElement.assertValidate(structureElement, StructureChoice.REJECT, Boolean.FALSE);
         } catch (Exception e) {
diff --git a/src/test/java/org/openepics/names/docker/StructuresSubsystemIT.java b/src/test/java/org/openepics/names/docker/StructuresSubsystemIT.java
index 8a0aaab9..d64bdfbe 100644
--- a/src/test/java/org/openepics/names/docker/StructuresSubsystemIT.java
+++ b/src/test/java/org/openepics/names/docker/StructuresSubsystemIT.java
@@ -385,12 +385,17 @@ class StructuresSubsystemIT {
 
             // create
             ITUtilStructureElement.assertCreate(structureElement);
+            UUID uuid = structureElement.getUuid();
 
             ITUtilStructureElement.assertExists         (Type.SUBSYSTEM, "Sys-Cc", Boolean.FALSE);
             ITUtilStructureElement.assertIsValidToCreate(Type.SUBSYSTEM, "Sys-Cc", Boolean.TRUE);
 
             ITUtilStructureElement.assertValidate(structureElement, StructureChoice.CREATE, Boolean.FALSE);
             ITUtilStructureElement.assertValidate(structureElement, StructureChoice.CANCEL, Boolean.TRUE);
+            structureElement.setUuid(null);
+            ITUtilStructureElement.assertValidate(structureElement, StructureChoice.CREATE, Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(structureElement, StructureChoice.CANCEL, Boolean.FALSE);
+            structureElement.setUuid(uuid);
 
             // cancel
             ITUtilStructureElement.assertCancel(structureElement);
@@ -398,6 +403,9 @@ class StructuresSubsystemIT {
             ITUtilStructureElement.assertExists         (Type.SUBSYSTEM, "Sys-Cc", Boolean.FALSE);
             ITUtilStructureElement.assertIsValidToCreate(Type.SUBSYSTEM, "Sys-Cc", Boolean.TRUE);
 
+            ITUtilStructureElement.assertValidate(structureElement, StructureChoice.CREATE, Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(structureElement, StructureChoice.CANCEL, Boolean.FALSE);
+            structureElement.setUuid(null);
             ITUtilStructureElement.assertValidate(structureElement, StructureChoice.CREATE, Boolean.TRUE);
             ITUtilStructureElement.assertValidate(structureElement, StructureChoice.CANCEL, Boolean.FALSE);
         } catch (Exception e) {
@@ -435,12 +443,17 @@ class StructuresSubsystemIT {
 
             // create
             ITUtilStructureElement.assertCreate(structureElement);
+            UUID uuid = structureElement.getUuid();
 
             ITUtilStructureElement.assertExists         (Type.SUBSYSTEM, "Sys-Cr", Boolean.FALSE);
             ITUtilStructureElement.assertIsValidToCreate(Type.SUBSYSTEM, "Sys-Cr", Boolean.TRUE);
 
             ITUtilStructureElement.assertValidate(structureElement, StructureChoice.CREATE, Boolean.FALSE);
             ITUtilStructureElement.assertValidate(structureElement, StructureChoice.REJECT, Boolean.TRUE);
+            structureElement.setUuid(null);
+            ITUtilStructureElement.assertValidate(structureElement, StructureChoice.CREATE, Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(structureElement, StructureChoice.REJECT, Boolean.FALSE);
+            structureElement.setUuid(uuid);
 
             // reject
             ITUtilStructureElement.assertReject(structureElement);
@@ -448,6 +461,9 @@ class StructuresSubsystemIT {
             ITUtilStructureElement.assertExists         (Type.SUBSYSTEM, "Sys-Cr", Boolean.FALSE);
             ITUtilStructureElement.assertIsValidToCreate(Type.SUBSYSTEM, "Sys-Cr", Boolean.TRUE);
 
+            ITUtilStructureElement.assertValidate(structureElement, StructureChoice.CREATE, Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(structureElement, StructureChoice.REJECT, Boolean.FALSE);
+            structureElement.setUuid(null);
             ITUtilStructureElement.assertValidate(structureElement, StructureChoice.CREATE, Boolean.TRUE);
             ITUtilStructureElement.assertValidate(structureElement, StructureChoice.REJECT, Boolean.FALSE);
         } catch (Exception e) {
diff --git a/src/test/java/org/openepics/names/docker/StructuresSystemGroupIT.java b/src/test/java/org/openepics/names/docker/StructuresSystemGroupIT.java
index 04977955..303c9841 100644
--- a/src/test/java/org/openepics/names/docker/StructuresSystemGroupIT.java
+++ b/src/test/java/org/openepics/names/docker/StructuresSystemGroupIT.java
@@ -381,12 +381,17 @@ class StructuresSystemGroupIT {
 
             // create
             ITUtilStructureElement.assertCreate(structureElement);
+            UUID uuid = structureElement.getUuid();
 
             ITUtilStructureElement.assertExists         (Type.SYSTEMGROUP, "Cc", Boolean.FALSE);
             ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEMGROUP, "Cc", Boolean.TRUE);
 
             ITUtilStructureElement.assertValidate(structureElement, StructureChoice.CREATE, Boolean.FALSE);
             ITUtilStructureElement.assertValidate(structureElement, StructureChoice.CANCEL, Boolean.TRUE);
+            structureElement.setUuid(null);
+            ITUtilStructureElement.assertValidate(structureElement, StructureChoice.CREATE, Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(structureElement, StructureChoice.CANCEL, Boolean.FALSE);
+            structureElement.setUuid(uuid);
 
             // cancel
             ITUtilStructureElement.assertCancel(structureElement);
@@ -394,6 +399,9 @@ class StructuresSystemGroupIT {
             ITUtilStructureElement.assertExists         (Type.SYSTEMGROUP, "Cc", Boolean.FALSE);
             ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEMGROUP, "Cc", Boolean.TRUE);
 
+            ITUtilStructureElement.assertValidate(structureElement, StructureChoice.CREATE, Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(structureElement, StructureChoice.CANCEL, Boolean.FALSE);
+            structureElement.setUuid(null);
             ITUtilStructureElement.assertValidate(structureElement, StructureChoice.CREATE, Boolean.TRUE);
             ITUtilStructureElement.assertValidate(structureElement, StructureChoice.CANCEL, Boolean.FALSE);
         } catch (Exception e) {
@@ -431,12 +439,17 @@ class StructuresSystemGroupIT {
 
             // create
             ITUtilStructureElement.assertCreate(structureElement);
+            UUID uuid = structureElement.getUuid();
 
             ITUtilStructureElement.assertExists         (Type.SYSTEMGROUP, "Cr", Boolean.FALSE);
             ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEMGROUP, "Cr", Boolean.TRUE);
 
             ITUtilStructureElement.assertValidate(structureElement, StructureChoice.CREATE, Boolean.FALSE);
             ITUtilStructureElement.assertValidate(structureElement, StructureChoice.REJECT, Boolean.TRUE);
+            structureElement.setUuid(null);
+            ITUtilStructureElement.assertValidate(structureElement, StructureChoice.CREATE, Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(structureElement, StructureChoice.REJECT, Boolean.FALSE);
+            structureElement.setUuid(uuid);
 
             // reject
             ITUtilStructureElement.assertReject(structureElement);
@@ -444,6 +457,9 @@ class StructuresSystemGroupIT {
             ITUtilStructureElement.assertExists         (Type.SYSTEMGROUP, "Cr", Boolean.FALSE);
             ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEMGROUP, "Cr", Boolean.TRUE);
 
+            ITUtilStructureElement.assertValidate(structureElement, StructureChoice.CREATE, Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(structureElement, StructureChoice.REJECT, Boolean.FALSE);
+            structureElement.setUuid(null);
             ITUtilStructureElement.assertValidate(structureElement, StructureChoice.CREATE, Boolean.TRUE);
             ITUtilStructureElement.assertValidate(structureElement, StructureChoice.REJECT, Boolean.FALSE);
         } catch (Exception e) {
diff --git a/src/test/java/org/openepics/names/docker/StructuresSystemIT.java b/src/test/java/org/openepics/names/docker/StructuresSystemIT.java
index 3701d1c9..0d566b37 100644
--- a/src/test/java/org/openepics/names/docker/StructuresSystemIT.java
+++ b/src/test/java/org/openepics/names/docker/StructuresSystemIT.java
@@ -368,12 +368,17 @@ class StructuresSystemIT {
 
             // create
             ITUtilStructureElement.assertCreate(structureElement);
+            UUID uuid = structureElement.getUuid();
 
             ITUtilStructureElement.assertExists         (Type.SYSTEM, "Cc", Boolean.FALSE);
             ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEM, "Cc", Boolean.TRUE);
 
             ITUtilStructureElement.assertValidate(structureElement, StructureChoice.CREATE, Boolean.FALSE);
             ITUtilStructureElement.assertValidate(structureElement, StructureChoice.CANCEL, Boolean.TRUE);
+            structureElement.setUuid(null);
+            ITUtilStructureElement.assertValidate(structureElement, StructureChoice.CREATE, Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(structureElement, StructureChoice.CANCEL, Boolean.FALSE);
+            structureElement.setUuid(uuid);
 
             // cancel
             ITUtilStructureElement.assertCancel(structureElement);
@@ -381,6 +386,9 @@ class StructuresSystemIT {
             ITUtilStructureElement.assertExists         (Type.SYSTEM, "Cc", Boolean.FALSE);
             ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEM, "Cc", Boolean.TRUE);
 
+            ITUtilStructureElement.assertValidate(structureElement, StructureChoice.CREATE, Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(structureElement, StructureChoice.CANCEL, Boolean.FALSE);
+            structureElement.setUuid(null);
             ITUtilStructureElement.assertValidate(structureElement, StructureChoice.CREATE, Boolean.TRUE);
             ITUtilStructureElement.assertValidate(structureElement, StructureChoice.CANCEL, Boolean.FALSE);
         } catch (Exception e) {
@@ -418,12 +426,17 @@ class StructuresSystemIT {
 
             // create
             ITUtilStructureElement.assertCreate(structureElement);
+            UUID uuid = structureElement.getUuid();
 
             ITUtilStructureElement.assertExists         (Type.SYSTEM, "Cr", Boolean.FALSE);
             ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEM, "Cr", Boolean.TRUE);
 
             ITUtilStructureElement.assertValidate(structureElement, StructureChoice.CREATE, Boolean.FALSE);
             ITUtilStructureElement.assertValidate(structureElement, StructureChoice.REJECT, Boolean.TRUE);
+            structureElement.setUuid(null);
+            ITUtilStructureElement.assertValidate(structureElement, StructureChoice.CREATE, Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(structureElement, StructureChoice.REJECT, Boolean.FALSE);
+            structureElement.setUuid(uuid);
 
             // reject
             ITUtilStructureElement.assertReject(structureElement);
@@ -431,6 +444,9 @@ class StructuresSystemIT {
             ITUtilStructureElement.assertExists         (Type.SYSTEM, "Cr", Boolean.FALSE);
             ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEM, "Cr", Boolean.TRUE);
 
+            ITUtilStructureElement.assertValidate(structureElement, StructureChoice.CREATE, Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(structureElement, StructureChoice.REJECT, Boolean.FALSE);
+            structureElement.setUuid(null);
             ITUtilStructureElement.assertValidate(structureElement, StructureChoice.CREATE, Boolean.TRUE);
             ITUtilStructureElement.assertValidate(structureElement, StructureChoice.REJECT, Boolean.FALSE);
         } catch (Exception e) {
-- 
GitLab