diff --git a/Dockerfile b/Dockerfile
index bb646ab8688d30e22f210c08a727409476d50f5a..3c8e1ce1b6de906e47bdafa927f3c92c6d0b3daf 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.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 495c8effaf1c2d42ecda1544b78630c6edcf1aef..4ec8921192d65b04cc14a2cdde1de610bb4d8360 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,7 +5,7 @@
org.etsi.osl
org.etsi.osl.main
- 2025Q4-SNAPSHOT
+ 2026Q2-SNAPSHOT
../org.etsi.osl.main
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 0000000000000000000000000000000000000000..63fc3bfce1d90017218d31a1a7afc090e8e0f675
--- /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 8ffb421a7a7030a830cce0a4b91ee5c89cb85248..9681eb51f9ca9db98255889d370f5d252312dc37 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 e734699daf01529c9737813eea851128251f3e91..5d7cb748579899577d5137301d5a65361bd9b2a0 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,47 @@ 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) {
+ 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;
+ }
+
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");
+
+ if (serviceSpecCharacteristic != null && serviceSpecCharacteristic.getServiceSpecCharacteristicValue() != null) {
+ 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 0dc2074ead7d8fe6fc2a90e1de611abe216febc6..00d3b026218c064e5a7a269120b9869f63a2b3f9 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 0c3d2b3970c74b444c45256d286c63b030ea49c4..33a0cd228e6d04b75a8c800afb687eaa4e3fcbb2 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");
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 edce9a8560d36e7f0ab4f33e0f10b1cfaa4e3d61..46b42cf078d1869b1c2221985b02c66074c06f4d 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 7318123d8bbd1d9602ba1e6f8262d9598b29c001..7376c500e5453d9ece265f48230beade5730cc7e 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 {