/*
* ============LICENSE_START=======================================================
* Copyright (C) 2020 Pantheon.tech
- * Modifications Copyright (C) 2021 Nordix Foundation
+ * Modifications Copyright (C) 2021-2023 Nordix Foundation
* Modifications Copyright (C) 2021 Bell Canada.
+ * Modifications Copyright (C) 2022 TechMahindra Ltd.
+ * Modifications Copyright (C) 2022 Deutsche Telekom AG
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
package org.onap.cps.rest.exceptions
+import com.fasterxml.jackson.databind.ObjectMapper
import groovy.json.JsonSlurper
-import org.modelmapper.ModelMapper
-import org.onap.cps.api.CpsAdminService
+import org.onap.cps.api.CpsDataspaceService
+import org.onap.cps.api.CpsAnchorService
import org.onap.cps.api.CpsDataService
import org.onap.cps.api.CpsModuleService
import org.onap.cps.api.CpsQueryService
+import org.onap.cps.rest.controller.CpsRestInputMapper
import org.onap.cps.spi.exceptions.AlreadyDefinedException
import org.onap.cps.spi.exceptions.CpsException
import org.onap.cps.spi.exceptions.CpsPathException
import org.onap.cps.spi.exceptions.ModelValidationException
import org.onap.cps.spi.exceptions.NotFoundInDataspaceException
import org.onap.cps.spi.exceptions.SchemaSetInUseException
+import org.onap.cps.spi.exceptions.DataspaceInUseException
+import org.onap.cps.utils.JsonObjectMapper
+import org.onap.cps.utils.PrefixResolver
import org.spockframework.spring.SpringBean
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.beans.factory.annotation.Value
class CpsRestExceptionHandlerSpec extends Specification {
@SpringBean
- CpsAdminService mockCpsAdminService = Mock()
+ CpsDataspaceService mockCpsAdminService = Stub()
@SpringBean
- CpsModuleService mockCpsModuleService = Mock()
+ CpsAnchorService mockCpsAnchorService = Stub()
@SpringBean
- CpsDataService mockCpsDataService = Mock()
+ CpsModuleService mockCpsModuleService = Stub()
@SpringBean
- CpsQueryService mockCpsQueryService = Mock()
+ CpsDataService mockCpsDataService = Stub()
@SpringBean
- ModelMapper modelMapper = Mock()
+ CpsQueryService mockCpsQueryService = Stub()
+
+ @SpringBean
+ JsonObjectMapper jsonObjectMapper = new JsonObjectMapper(new ObjectMapper())
+
+ @SpringBean
+ CpsRestInputMapper cpsRestInputMapper = Stub()
+
+ @SpringBean
+ PrefixResolver prefixResolver = Mock()
@Autowired
MockMvc mvc
def response = performTestRequest()
then: 'an HTTP Not Found response is returned with correct message and details'
assertTestResponse(response, NOT_FOUND, 'Object not found',
- 'Description does not exist in dataspace MyDataSpace.')
+ 'Description does not exist in dataspace MyDataSpace.')
}
def 'Request with an object already defined exception returns HTTP Status Conflict.'() {
def response = performTestRequest()
then: 'a HTTP conflict response is returned with correct message an details'
assertTestResponse(response, CONFLICT,
- "Already defined exception",
- "Anchor with name ${existingObjectName} already exists for ${dataspaceName}.")
+ "Already defined exception",
+ "Anchor with name ${existingObjectName} already exists for ${dataspaceName}.")
+ }
+
+ def 'Request with a schema set in use exception returns HTTP Status Conflict.'() {
+ when: 'Schema set in use exception is thrown by the service'
+ setupTestException(new SchemaSetInUseException(dataspaceName, existingObjectName))
+ def response = performTestRequest()
+ then: 'a HTTP conflict response is returned with correct message an details'
+ assertTestResponse(response, CONFLICT,
+ "Schema Set is being used.",
+ "Schema Set with name ${existingObjectName} in dataspace ${dataspaceName} is having Anchor records associated.")
}
def 'Get request with a #exceptionThrown.class.simpleName returns HTTP Status Bad Request'() {
- when: 'CPS validation exception is thrown by the service'
+ when: '#exceptionThrown.class.simpleName is thrown by the service'
setupTestException(exceptionThrown)
def response = performTestRequest()
then: 'an HTTP Bad Request response is returned with correct message and details'
assertTestResponse(response, CONFLICT, exceptionThrown.getMessage(), exceptionThrown.getDetails())
where: 'the following exceptions are thrown'
exceptionThrown << [new DataInUseException(dataspaceName, existingObjectName),
- new SchemaSetInUseException(dataspaceName, existingObjectName)]
+ new SchemaSetInUseException(dataspaceName, existingObjectName),
+ new DataspaceInUseException(dataspaceName, errorDetails)]
}
/*
* NB. This method tests the expected behavior for POST request only;
* testing of PUT and PATCH requests omitted due to same NOT 'GET' condition is being used.
*/
+
def 'Post request with #exceptionThrown.class.simpleName returns HTTP Status Bad Request.'() {
given: '#exception is thrown the service indicating data is not found'
- mockCpsDataService.saveData(_, _, _, _) >> { throw exceptionThrown }
+ mockCpsDataService.saveData(*_) >> { throw exceptionThrown }
when: 'data update request is performed'
def response = mvc.perform(
- post("$basePath/v1/dataspaces/dataspace-name/anchors/anchor-name/nodes")
- .contentType(MediaType.APPLICATION_JSON)
- .param('xpath', 'parent node xpath')
- .content('json data')
+ post("$basePath/v1/dataspaces/dataspace-name/anchors/anchor-name/nodes")
+ .contentType(MediaType.APPLICATION_JSON)
+ .param('xpath', 'parent node xpath')
+ .content('{"some-key" : "some-value"}')
).andReturn().response
then: 'response code indicates bad input parameters'
response.status == BAD_REQUEST.value()
*/
def setupTestException(exception) {
- mockCpsAdminService.getAnchors(_) >> { throw exception }
+ mockCpsAnchorService.getAnchors(_) >> { throw exception }
}
def performTestRequest() {
return mvc.perform(
- get("$basePath/v1/dataspaces/dataspace-name/anchors"))
- .andReturn().response
+ get("$basePath/v1/dataspaces/dataspace-name/anchors"))
+ .andReturn().response
}
static void assertTestResponse(response, expectedStatus, expectedErrorMessage, expectedErrorDetails) {