From 6aa4042d7f21079606e7dc9d8e631512db3724a3 Mon Sep 17 00:00:00 2001 From: Kostis Trantzas Date: Sat, 24 Jan 2026 21:21:57 +0000 Subject: [PATCH 1/4] Preparation for Release 2025Q4 --- Dockerfile | 4 ++-- pom.xml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index bb646ab..fcdd0c0 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,6 @@ FROM ibm-semeru-runtimes:open-17.0.7_7-jdk # RUN mkdir /opt/shareclasses RUN mkdir -p /opt/openslice/lib/ -COPY target/org.etsi.osl.tmf.api-1.3.0-SNAPSHOT-exec.jar /opt/openslice/lib/ -CMD ["java", "-Xshareclasses:cacheDir=/opt/shareclasses", "-jar", "/opt/openslice/lib/org.etsi.osl.tmf.api-1.3.0-SNAPSHOT-exec.jar"] +COPY target/org.etsi.osl.tmf.api-1.3.0-exec.jar /opt/openslice/lib/ +CMD ["java", "-Xshareclasses:cacheDir=/opt/shareclasses", "-jar", "/opt/openslice/lib/org.etsi.osl.tmf.api-1.3.0-exec.jar"] EXPOSE 13082 \ No newline at end of file diff --git a/pom.xml b/pom.xml index 495c8ef..4f971d9 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ org.etsi.osl org.etsi.osl.main - 2025Q4-SNAPSHOT + 2025Q4 ../org.etsi.osl.main -- GitLab From f8626fc362afd4edc2bc8be26d4d883d34e8fe77 Mon Sep 17 00:00:00 2001 From: denazi Date: Wed, 8 Apr 2026 11:03:35 +0300 Subject: [PATCH 2/4] Fix Service Order Validation --- .../ServiceCharacteristicValueValidator.java | 92 +++++++++++++++++++ .../tmf/util/ServiceInventoryValidator.java | 4 +- .../osl/tmf/util/ServiceOrderValidator.java | 42 ++++++--- ...SpecCharacteristicValueTypeValidator.java} | 4 +- .../util/ServiceSpecificationValidator.java | 6 +- 5 files changed, 128 insertions(+), 20 deletions(-) create mode 100644 src/main/java/org/etsi/osl/tmf/util/ServiceCharacteristicValueValidator.java rename src/main/java/org/etsi/osl/tmf/util/{ServiceSpecCharacteristicValueValidator.java => ServiceSpecCharacteristicValueTypeValidator.java} (95%) diff --git a/src/main/java/org/etsi/osl/tmf/util/ServiceCharacteristicValueValidator.java b/src/main/java/org/etsi/osl/tmf/util/ServiceCharacteristicValueValidator.java new file mode 100644 index 0000000..63fc3bf --- /dev/null +++ b/src/main/java/org/etsi/osl/tmf/util/ServiceCharacteristicValueValidator.java @@ -0,0 +1,92 @@ +package org.etsi.osl.tmf.util; + +import org.etsi.osl.tmf.common.model.Any; +import org.etsi.osl.tmf.common.model.ERangeInterval; +import org.etsi.osl.tmf.common.model.EValueType; +import org.etsi.osl.tmf.scm633.model.ServiceSpecCharacteristicValue; +import org.etsi.osl.tmf.common.model.service.Characteristic; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; +import java.util.Objects; + +public class ServiceCharacteristicValueValidator { + private final ServiceSpecCharacteristicValue serviceSpecCharacteristicValue; + private final Characteristic characteristic; + + public ServiceCharacteristicValueValidator(ServiceSpecCharacteristicValue serviceSpecCharacteristicValue, Characteristic characteristic) { + this.serviceSpecCharacteristicValue = serviceSpecCharacteristicValue; + this.characteristic = characteristic; + } + + public boolean validateType() { + final String INTEGER_REGEX = "[-+]?\\d+"; + final String FLOAT_REGEX = "[-+]?\\d*([.,]\\d+)?([eE][-+]?\\d+)?"; + final String BOOLEAN_REGEX = "(?i)true|false"; + final DateTimeFormatter ISO_DATE_TIME = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + if (serviceSpecCharacteristicValue.getValueType() == null) { + return true; + } + Any characteristicValue = characteristic.getValue(); + if (characteristicValue == null) { + return true; + } + String characteristicStringValue = characteristicValue.getValue(); + if (characteristicStringValue == null || characteristicStringValue.isBlank()) { + return true; + } + try { + return switch (EValueType.getEnum(serviceSpecCharacteristicValue.getValueType())) { + case INTEGER, SMALLINT, lONGINT -> characteristicStringValue.matches(INTEGER_REGEX); + case FLOAT -> characteristicStringValue.matches(FLOAT_REGEX); + case BOOLEAN -> characteristicStringValue.matches(BOOLEAN_REGEX) || characteristicStringValue.matches(INTEGER_REGEX); + case TIMESTAMP -> { + try { + LocalDateTime.parse(characteristicStringValue, ISO_DATE_TIME); + yield true; + } catch (DateTimeParseException e) { + yield false; + } + } + default -> true; + }; + } catch (IllegalArgumentException e) { + return false; + } + } + + public boolean isWithinRangeInterval() { + if (serviceSpecCharacteristicValue.getRangeInterval() == null) { + return true; + } + if (!Objects.equals(serviceSpecCharacteristicValue.getValueType(), EValueType.INTEGER.getValue()) && + !Objects.equals(serviceSpecCharacteristicValue.getValueType(), EValueType.SMALLINT.getValue()) && + !Objects.equals(serviceSpecCharacteristicValue.getValueType(), EValueType.lONGINT.getValue())) { + return true; + } + Any characteristicValue = characteristic.getValue(); + if (characteristicValue == null) { + return true; + } + String characteristicStringValue = characteristicValue.getValue(); + if (characteristicStringValue == null || characteristicStringValue.isBlank()) { + return true; + } + Integer valueFrom = serviceSpecCharacteristicValue.getValueFrom(); + Integer valueTo = serviceSpecCharacteristicValue.getValueTo(); + int specValueFrom = valueFrom != null ? valueFrom : Integer.MIN_VALUE; + int specValueTo = valueTo != null ? valueTo : Integer.MAX_VALUE; + try { + int characteristicIntValue = Integer.parseInt(characteristicStringValue); + return switch (ERangeInterval.getEnum(serviceSpecCharacteristicValue.getRangeInterval())) { + case OPEN -> characteristicIntValue > specValueFrom && characteristicIntValue < specValueTo; + case CLOSED -> characteristicIntValue >= specValueFrom && characteristicIntValue <= specValueTo; + case CLOSED_BOTTOM -> characteristicIntValue >= specValueFrom && characteristicIntValue < specValueTo; + case CLOSED_TOP -> characteristicIntValue > specValueFrom && characteristicIntValue <= specValueTo; + }; + } catch (IllegalArgumentException e) { + return false; + } + } +} diff --git a/src/main/java/org/etsi/osl/tmf/util/ServiceInventoryValidator.java b/src/main/java/org/etsi/osl/tmf/util/ServiceInventoryValidator.java index 8ffb421..9681eb5 100644 --- a/src/main/java/org/etsi/osl/tmf/util/ServiceInventoryValidator.java +++ b/src/main/java/org/etsi/osl/tmf/util/ServiceInventoryValidator.java @@ -38,8 +38,8 @@ public class ServiceInventoryValidator implements Validator { Set serviceSpecCharacteristicValues = serviceSpecCharacteristic.getServiceSpecCharacteristicValue(); characteristicParser.updateServiceSpecCharacteristicValues(serviceSpecCharacteristicValues, characteristic); if (serviceSpecCharacteristicValues.stream().anyMatch(value -> { - ServiceSpecCharacteristicValueValidator serviceSpecCharacteristicValueValidator = new ServiceSpecCharacteristicValueValidator(value); - return !serviceSpecCharacteristicValueValidator.validateType() || !serviceSpecCharacteristicValueValidator.isWithinRangeInterval(); + ServiceSpecCharacteristicValueTypeValidator serviceSpecCharacteristicValueTypeValidator = new ServiceSpecCharacteristicValueTypeValidator(value); + return !serviceSpecCharacteristicValueTypeValidator.validateType() || !serviceSpecCharacteristicValueTypeValidator.isWithinRangeInterval(); })) { errors.reject("invalid.request"); return; diff --git a/src/main/java/org/etsi/osl/tmf/util/ServiceOrderValidator.java b/src/main/java/org/etsi/osl/tmf/util/ServiceOrderValidator.java index e734699..4e5179f 100644 --- a/src/main/java/org/etsi/osl/tmf/util/ServiceOrderValidator.java +++ b/src/main/java/org/etsi/osl/tmf/util/ServiceOrderValidator.java @@ -2,7 +2,6 @@ package org.etsi.osl.tmf.util; import org.etsi.osl.tmf.common.model.service.Characteristic; import org.etsi.osl.tmf.scm633.model.ServiceSpecCharacteristic; -import org.etsi.osl.tmf.scm633.model.ServiceSpecCharacteristicValue; import org.etsi.osl.tmf.scm633.model.ServiceSpecification; import org.etsi.osl.tmf.scm633.reposervices.ServiceSpecificationRepoService; import org.etsi.osl.tmf.so641.model.ServiceOrderCreate; @@ -14,8 +13,6 @@ import org.springframework.stereotype.Component; import org.springframework.validation.Errors; import org.springframework.validation.Validator; -import java.util.Set; - @Component public class ServiceOrderValidator implements Validator { @Autowired @@ -32,27 +29,46 @@ public class ServiceOrderValidator implements Validator { return; } ServiceOrderCreate create = (ServiceOrderCreate) target; + for (ServiceOrderItem orderItem: create.getOrderItem()) { if (orderItem.getService() == null) { + errors.reject("service.required", "Service is required in order item"); return; } + ServiceRestriction service = orderItem.getService(); - if (service.getServiceCharacteristic() == null || service.getServiceSpecification() == null) { + + if (service.getServiceSpecification() == null) { + errors.reject("serviceSpecification.required", "Service Specification is required"); + return; + } + + if (service.getServiceCharacteristic() == null || service.getServiceCharacteristic().isEmpty()) { return; } String serviceSpecificationId = service.getServiceSpecification().getId(); ServiceSpecification serviceSpecification = serviceSpecificationRepoService.findByUuid(serviceSpecificationId); - CharacteristicParser characteristicParser = new CharacteristicParser(); + + if (serviceSpecification == null) { + errors.reject("serviceSpecification.notFound", "Service Specification not found: " + serviceSpecificationId); + return; + } + + // Validate only characteristics that exist in the ServiceSpecification for (Characteristic characteristic: service.getServiceCharacteristic()) { ServiceSpecCharacteristic serviceSpecCharacteristic = serviceSpecification.findSpecCharacteristicByName(characteristic.getName()); - if (serviceSpecCharacteristic != null) { - Set serviceSpecCharacteristicValues = serviceSpecCharacteristic.getServiceSpecCharacteristicValue(); - characteristicParser.updateServiceSpecCharacteristicValues(serviceSpecCharacteristicValues, characteristic); - if (serviceSpecCharacteristicValues.stream().anyMatch(value -> { - ServiceSpecCharacteristicValueValidator serviceSpecCharacteristicValueValidator = new ServiceSpecCharacteristicValueValidator(value); - return !serviceSpecCharacteristicValueValidator.validateType() || !serviceSpecCharacteristicValueValidator.isWithinRangeInterval(); - })) { - errors.reject("invalid.request"); + + // Only validate characteristics that exist in the spec + if (serviceSpecCharacteristic != null && serviceSpecCharacteristic.getServiceSpecCharacteristicValue() != null) { + // Validate the characteristic against all spec values to find at least one match + boolean isValid = serviceSpecCharacteristic.getServiceSpecCharacteristicValue().stream() + .anyMatch(specValue -> { + ServiceCharacteristicValueValidator validator = new ServiceCharacteristicValueValidator(specValue, characteristic); + return validator.validateType() && validator.isWithinRangeInterval(); + }); + + if (!isValid) { + errors.reject("serviceCharacteristics.invalid", "Service characteristic '" + characteristic.getName() + "' validation failed"); return; } } diff --git a/src/main/java/org/etsi/osl/tmf/util/ServiceSpecCharacteristicValueValidator.java b/src/main/java/org/etsi/osl/tmf/util/ServiceSpecCharacteristicValueTypeValidator.java similarity index 95% rename from src/main/java/org/etsi/osl/tmf/util/ServiceSpecCharacteristicValueValidator.java rename to src/main/java/org/etsi/osl/tmf/util/ServiceSpecCharacteristicValueTypeValidator.java index 0dc2074..00d3b02 100644 --- a/src/main/java/org/etsi/osl/tmf/util/ServiceSpecCharacteristicValueValidator.java +++ b/src/main/java/org/etsi/osl/tmf/util/ServiceSpecCharacteristicValueTypeValidator.java @@ -10,10 +10,10 @@ import java.time.format.DateTimeFormatter; import java.time.format.DateTimeParseException; import java.util.Objects; -public class ServiceSpecCharacteristicValueValidator { +public class ServiceSpecCharacteristicValueTypeValidator { private final ServiceSpecCharacteristicValue serviceSpecCharacteristicValue; - public ServiceSpecCharacteristicValueValidator(ServiceSpecCharacteristicValue serviceSpecCharacteristicValue) { + public ServiceSpecCharacteristicValueTypeValidator(ServiceSpecCharacteristicValue serviceSpecCharacteristicValue) { this.serviceSpecCharacteristicValue = serviceSpecCharacteristicValue; } diff --git a/src/main/java/org/etsi/osl/tmf/util/ServiceSpecificationValidator.java b/src/main/java/org/etsi/osl/tmf/util/ServiceSpecificationValidator.java index 0c3d2b3..33a0cd2 100644 --- a/src/main/java/org/etsi/osl/tmf/util/ServiceSpecificationValidator.java +++ b/src/main/java/org/etsi/osl/tmf/util/ServiceSpecificationValidator.java @@ -23,9 +23,9 @@ public class ServiceSpecificationValidator implements Validator { .flatMap(serviceSpecCharacteristic -> serviceSpecCharacteristic.getServiceSpecCharacteristicValue().stream()) .anyMatch(serviceSpecCharacteristicValue -> { - ServiceSpecCharacteristicValueValidator serviceSpecCharacteristicValueValidator = - new ServiceSpecCharacteristicValueValidator(serviceSpecCharacteristicValue); - return !serviceSpecCharacteristicValueValidator.validateType() || !serviceSpecCharacteristicValueValidator.isWithinRangeInterval(); + ServiceSpecCharacteristicValueTypeValidator serviceSpecCharacteristicValueTypeValidator = + new ServiceSpecCharacteristicValueTypeValidator(serviceSpecCharacteristicValue); + return !serviceSpecCharacteristicValueTypeValidator.validateType() || !serviceSpecCharacteristicValueTypeValidator.isWithinRangeInterval(); }); if (invalid) { errors.reject("invalid.request"); -- GitLab From 896dedd9c8c0f6965f427840e1534854cd8deddc Mon Sep 17 00:00:00 2001 From: denazi Date: Wed, 8 Apr 2026 13:20:38 +0300 Subject: [PATCH 3/4] add order item validation --- Dockerfile | 4 ++-- pom.xml | 2 +- .../java/org/etsi/osl/tmf/util/ServiceOrderValidator.java | 7 ++++--- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/Dockerfile b/Dockerfile index fcdd0c0..3c8e1ce 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,6 @@ FROM ibm-semeru-runtimes:open-17.0.7_7-jdk # RUN mkdir /opt/shareclasses RUN mkdir -p /opt/openslice/lib/ -COPY target/org.etsi.osl.tmf.api-1.3.0-exec.jar /opt/openslice/lib/ -CMD ["java", "-Xshareclasses:cacheDir=/opt/shareclasses", "-jar", "/opt/openslice/lib/org.etsi.osl.tmf.api-1.3.0-exec.jar"] +COPY target/org.etsi.osl.tmf.api-1.4.0-SNAPSHOT-exec.jar /opt/openslice/lib/ +CMD ["java", "-Xshareclasses:cacheDir=/opt/shareclasses", "-jar", "/opt/openslice/lib/org.etsi.osl.tmf.api-1.4.0-SNAPSHOT-exec.jar"] EXPOSE 13082 \ No newline at end of file diff --git a/pom.xml b/pom.xml index 4f971d9..4ec8921 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ org.etsi.osl org.etsi.osl.main - 2025Q4 + 2026Q2-SNAPSHOT ../org.etsi.osl.main diff --git a/src/main/java/org/etsi/osl/tmf/util/ServiceOrderValidator.java b/src/main/java/org/etsi/osl/tmf/util/ServiceOrderValidator.java index 4e5179f..5d7cb74 100644 --- a/src/main/java/org/etsi/osl/tmf/util/ServiceOrderValidator.java +++ b/src/main/java/org/etsi/osl/tmf/util/ServiceOrderValidator.java @@ -29,6 +29,10 @@ public class ServiceOrderValidator implements Validator { return; } ServiceOrderCreate create = (ServiceOrderCreate) target; + if (create.getOrderItem() == null || create.getOrderItem().isEmpty()) { + errors.reject("orderItem.required", "At least one order item is required"); + return; + } for (ServiceOrderItem orderItem: create.getOrderItem()) { if (orderItem.getService() == null) { @@ -54,13 +58,10 @@ public class ServiceOrderValidator implements Validator { return; } - // Validate only characteristics that exist in the ServiceSpecification for (Characteristic characteristic: service.getServiceCharacteristic()) { ServiceSpecCharacteristic serviceSpecCharacteristic = serviceSpecification.findSpecCharacteristicByName(characteristic.getName()); - // Only validate characteristics that exist in the spec if (serviceSpecCharacteristic != null && serviceSpecCharacteristic.getServiceSpecCharacteristicValue() != null) { - // Validate the characteristic against all spec values to find at least one match boolean isValid = serviceSpecCharacteristic.getServiceSpecCharacteristicValue().stream() .anyMatch(specValue -> { ServiceCharacteristicValueValidator validator = new ServiceCharacteristicValueValidator(specValue, characteristic); -- GitLab From 61fc1c5bb00e461e9cf69febbb0769657ffc428f Mon Sep 17 00:00:00 2001 From: denazi Date: Wed, 8 Apr 2026 14:43:49 +0300 Subject: [PATCH 4/4] Fix and add unittests --- .../ServiceOrderMetricsApiControllerTest.java | 44 +++++++++-- .../so641/ServiceOrderApiControllerTest.java | 79 ++++++++++++++++--- 2 files changed, 104 insertions(+), 19 deletions(-) diff --git a/src/test/java/org/etsi/osl/services/api/metrics/ServiceOrderMetricsApiControllerTest.java b/src/test/java/org/etsi/osl/services/api/metrics/ServiceOrderMetricsApiControllerTest.java index edce9a8..46b42cf 100644 --- a/src/test/java/org/etsi/osl/services/api/metrics/ServiceOrderMetricsApiControllerTest.java +++ b/src/test/java/org/etsi/osl/services/api/metrics/ServiceOrderMetricsApiControllerTest.java @@ -1,9 +1,5 @@ package org.etsi.osl.services.api.metrics; -import static org.assertj.core.api.Assertions.assertThat; -import static org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.springSecurity; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import java.time.OffsetDateTime; import java.time.ZoneOffset; import java.time.format.DateTimeFormatter; @@ -11,30 +7,40 @@ import java.time.temporal.ChronoUnit; import java.util.List; import java.util.Map; import java.util.stream.Collectors; + +import static org.assertj.core.api.Assertions.assertThat; import org.etsi.osl.services.api.BaseIT; import org.etsi.osl.tmf.JsonUtils; -import org.etsi.osl.tmf.metrics.api.ServiceOrderMetricsApiController; +import org.etsi.osl.tmf.common.model.service.ServiceSpecificationRef; +import org.etsi.osl.tmf.scm633.model.ServiceSpecification; +import org.etsi.osl.tmf.scm633.model.ServiceSpecificationCreate; import org.etsi.osl.tmf.so641.model.ServiceOrder; import org.etsi.osl.tmf.so641.model.ServiceOrderCreate; +import org.etsi.osl.tmf.so641.model.ServiceOrderItem; import org.etsi.osl.tmf.so641.model.ServiceOrderStateType; import org.etsi.osl.tmf.so641.model.ServiceOrderUpdate; +import org.etsi.osl.tmf.so641.model.ServiceRestriction; import org.etsi.osl.tmf.so641.reposervices.ServiceOrderRepoService; -import jakarta.persistence.EntityManager; -import jakarta.persistence.PersistenceContext; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.http.MediaType; import org.springframework.security.test.context.support.WithMockUser; import org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors; +import static org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.springSecurity; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.web.context.WebApplicationContext; + import com.jayway.jsonpath.JsonPath; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; + public class ServiceOrderMetricsApiControllerTest extends BaseIT { @@ -216,12 +222,34 @@ public class ServiceOrderMetricsApiControllerTest extends BaseIT { } private void createServiceOrder(ServiceOrderStateType stateType) throws Exception { + // Create a real service spec first + ServiceSpecificationCreate serviceSpecCreate = new ServiceSpecificationCreate(); + serviceSpecCreate.setName("Test Service Spec"); + serviceSpecCreate.setDescription("A test service specification"); + + String specResponse = mvc.perform(MockMvcRequestBuilders.post("/serviceCatalogManagement/v4/serviceSpecification") + .with(SecurityMockMvcRequestPostProcessors.csrf()) + .contentType(MediaType.APPLICATION_JSON) + .content(JsonUtils.toJson(serviceSpecCreate))) + .andExpect(status().isOk()) + .andReturn().getResponse().getContentAsString(); + + ServiceSpecification createdSpec = JsonUtils.toJsonObj(specResponse, ServiceSpecification.class); ServiceOrderCreate serviceOrder = new ServiceOrderCreate(); serviceOrder.setCategory("Test Category"); serviceOrder.setDescription("A Test Service Order"); serviceOrder.setRequestedStartDate(OffsetDateTime.now(ZoneOffset.UTC).toString()); serviceOrder.setRequestedCompletionDate(OffsetDateTime.now(ZoneOffset.UTC).plusDays(3).toString()); + + ServiceOrderItem orderItem = new ServiceOrderItem(); + ServiceRestriction service = new ServiceRestriction(); + ServiceSpecificationRef serviceSpec = new ServiceSpecificationRef(); + serviceSpec.setId(createdSpec.getId()); + serviceSpec.setName(createdSpec.getName()); + service.setServiceSpecification(serviceSpec); + orderItem.setService(service); + serviceOrder.getOrderItem().add(orderItem); String response = mvc .perform(MockMvcRequestBuilders.post("/serviceOrdering/v4/serviceOrder") diff --git a/src/test/java/org/etsi/osl/services/api/so641/ServiceOrderApiControllerTest.java b/src/test/java/org/etsi/osl/services/api/so641/ServiceOrderApiControllerTest.java index 7318123..7376c50 100644 --- a/src/test/java/org/etsi/osl/services/api/so641/ServiceOrderApiControllerTest.java +++ b/src/test/java/org/etsi/osl/services/api/so641/ServiceOrderApiControllerTest.java @@ -1,11 +1,5 @@ package org.etsi.osl.services.api.so641; -import static org.assertj.core.api.Assertions.assertThat; -import static org.hamcrest.CoreMatchers.is; -import static org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.springSecurity; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; @@ -15,17 +9,16 @@ import java.util.ArrayList; import java.util.List; import java.util.Optional; import java.util.Set; + import org.apache.commons.io.IOUtils; +import static org.assertj.core.api.Assertions.assertThat; import org.etsi.osl.services.api.BaseIT; import org.etsi.osl.tmf.JsonUtils; import org.etsi.osl.tmf.common.model.Any; import org.etsi.osl.tmf.common.model.service.Characteristic; import org.etsi.osl.tmf.common.model.service.Place; import org.etsi.osl.tmf.common.model.service.ServiceSpecificationRef; -import org.etsi.osl.tmf.pm632.model.ContactMedium; import org.etsi.osl.tmf.pm632.model.Individual; -import org.etsi.osl.tmf.pm632.model.IndividualCreate; -import org.etsi.osl.tmf.pm632.model.MediumCharacteristic; import org.etsi.osl.tmf.pm632.reposervices.IndividualRepoService; import org.etsi.osl.tmf.prm669.model.RelatedParty; import org.etsi.osl.tmf.scm633.model.ServiceSpecification; @@ -41,18 +34,23 @@ import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import jakarta.persistence.EntityManager; -import jakarta.persistence.PersistenceContext; import org.springframework.http.MediaType; import org.springframework.security.test.context.support.WithMockUser; import org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors; +import static org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.springSecurity; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.web.context.WebApplicationContext; + import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; + public class ServiceOrderApiControllerTest extends BaseIT { private static final int FIXED_BOOTSTRAPS_SPECS = 0; @@ -135,6 +133,65 @@ public class ServiceOrderApiControllerTest extends BaseIT { } + @WithMockUser(username="osadmin", roles = {"ADMIN","USER"}) + @Test + public void testCreateServiceOrderWithNoOrderItemIsBadRequest() throws Exception { + ServiceOrderCreate serviceOrder = new ServiceOrderCreate(); + serviceOrder.setCategory("Test Category"); + serviceOrder.setDescription("A Test Service Order"); + serviceOrder.setRequestedStartDate(OffsetDateTime.now(ZoneOffset.UTC).toString()); + serviceOrder.setRequestedCompletionDate(OffsetDateTime.now(ZoneOffset.UTC).toString()); + + mvc.perform(MockMvcRequestBuilders.post("/serviceOrdering/v4/serviceOrder") + .with(SecurityMockMvcRequestPostProcessors.csrf()) + .contentType(MediaType.APPLICATION_JSON) + .content(JsonUtils.toJson(serviceOrder))) + .andExpect(status().isBadRequest()); + } + + + @WithMockUser(username="osadmin", roles = {"ADMIN","USER"}) + @Test + public void testCreateServiceOrderWithNoServiceIsBadRequest() throws Exception { + ServiceOrderCreate serviceOrder = new ServiceOrderCreate(); + serviceOrder.setCategory("Test Category"); + serviceOrder.setDescription("A Test Service Order"); + serviceOrder.setRequestedStartDate(OffsetDateTime.now(ZoneOffset.UTC).toString()); + serviceOrder.setRequestedCompletionDate(OffsetDateTime.now(ZoneOffset.UTC).toString()); + + ServiceOrderItem orderItem = new ServiceOrderItem(); + serviceOrder.getOrderItem().add(orderItem); + + mvc.perform(MockMvcRequestBuilders.post("/serviceOrdering/v4/serviceOrder") + .with(SecurityMockMvcRequestPostProcessors.csrf()) + .contentType(MediaType.APPLICATION_JSON) + .content(JsonUtils.toJson(serviceOrder))) + .andExpect(status().isBadRequest()); + } + + + @WithMockUser(username="osadmin", roles = {"ADMIN","USER"}) + @Test + public void testCreateServiceOrderWithNoServiceSpecificationIsBadRequest() throws Exception { + ServiceOrderCreate serviceOrder = new ServiceOrderCreate(); + serviceOrder.setCategory("Test Category"); + serviceOrder.setDescription("A Test Service Order"); + serviceOrder.setRequestedStartDate(OffsetDateTime.now(ZoneOffset.UTC).toString()); + serviceOrder.setRequestedCompletionDate(OffsetDateTime.now(ZoneOffset.UTC).toString()); + + ServiceOrderItem orderItem = new ServiceOrderItem(); + ServiceRestriction service = new ServiceRestriction(); + orderItem.setService(service); + serviceOrder.getOrderItem().add(orderItem); + + mvc.perform(MockMvcRequestBuilders.post("/serviceOrdering/v4/serviceOrder") + .with(SecurityMockMvcRequestPostProcessors.csrf()) + .contentType(MediaType.APPLICATION_JSON) + .content(JsonUtils.toJson(serviceOrder))) + .andExpect(status().isBadRequest()); + } + + @WithMockUser(username="osadmin", roles = {"ADMIN","USER"}) @Test public void testDeleteServiceOrder() throws Exception { -- GitLab