import static org.onap.cps.spi.FetchDescendantsOption.INCLUDE_ALL_DESCENDANTS
import static org.onap.cps.spi.FetchDescendantsOption.OMIT_DESCENDANTS
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.patch
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put
import org.modelmapper.ModelMapper
+import org.onap.cps.api.CpsQueryService
import org.onap.cps.api.CpsAdminService
import org.onap.cps.api.CpsDataService
import org.onap.cps.api.CpsModuleService
@SpringBean
CpsAdminService mockCpsAdminService = Mock()
+ @SpringBean
+ CpsQueryService mockCpsQueryService = Mock()
+
@SpringBean
ModelMapper modelMapper = Mock()
@Value('${rest.api.cps-base-path}')
def basePath
- def dataNodeEndpoint
+ def dataNodeBaseEndpoint
def dataspaceName = 'my_dataspace'
def anchorName = 'my_anchor'
@Shared
static DataNode dataNodeWithLeavesNoChildren = new DataNodeBuilder().withXpath('/xpath')
- .withLeaves([leaf:'value', leafList:['leaveListElement1','leaveListElement2']]).build()
+ .withLeaves([leaf: 'value', leafList: ['leaveListElement1', 'leaveListElement2']]).build()
@Shared
static DataNode dataNodeWithChild = new DataNodeBuilder().withXpath('/parent')
.withChildDataNodes([new DataNodeBuilder().withXpath("/parent/child").build()]).build()
def setup() {
- dataNodeEndpoint = "$basePath/v1/dataspaces/$dataspaceName/anchors/$anchorName/nodes"
+ dataNodeBaseEndpoint = "$basePath/v1/dataspaces/$dataspaceName"
}
def 'Create a node.'() {
given: 'some json to create a data node'
+ def endpoint = "$dataNodeBaseEndpoint/anchors/$anchorName/nodes"
def json = 'some json (this is not validated)'
when: 'post is invoked with datanode endpoint and json'
def response = mvc.perform(
- post(dataNodeEndpoint).contentType(MediaType.APPLICATION_JSON).content(json)
+ post(endpoint).contentType(MediaType.APPLICATION_JSON).content(json)
).andReturn().response
then: 'a created response is returned'
response.status == HttpStatus.CREATED.value()
def 'Get data node with leaves'() {
given: 'the service returns data node leaves'
def xpath = 'some xPath'
+ def endpoint = "$dataNodeBaseEndpoint/anchors/$anchorName/node"
mockCpsDataService.getDataNode(dataspaceName, anchorName, xpath, OMIT_DESCENDANTS) >> dataNodeWithLeavesNoChildren
when: 'get request is performed through REST API'
def response = mvc.perform(
- get(dataNodeEndpoint)
- .param('cps-path', xpath)
+ get(endpoint).param('xpath', xpath)
).andReturn().response
then: 'a success response is returned'
response.status == HttpStatus.OK.value()
def 'Get data node with #scenario.'() {
given: 'the service returns data node with #scenario'
def xpath = 'some xPath'
+ def endpoint = "$dataNodeBaseEndpoint/anchors/$anchorName/node"
mockCpsDataService.getDataNode(dataspaceName, anchorName, xpath, expectedCpsDataServiceOption) >> dataNode
when: 'get request is performed through REST API'
- def response = mvc.perform(get(dataNodeEndpoint)
- .param('cps-path', xpath)
- .param('include-descendants', urlOption))
- .andReturn().response
+ def response = mvc.perform(get(endpoint)
+ .param('xpath', xpath)
+ .param('include-descendants', includeDescendantsOption))
+ .andReturn().response
then: 'a success response is returned'
response.status == HttpStatus.OK.value()
and: 'the response contains child is #expectChildInResponse'
response.contentAsString.contains('"child"') == expectChildInResponse
where:
- scenario | dataNode | urlOption || expectedCpsDataServiceOption | expectChildInResponse
- 'no descendants by default' | dataNodeWithLeavesNoChildren | '' || OMIT_DESCENDANTS | false
- 'no descendant explicitly' | dataNodeWithLeavesNoChildren | 'false' || OMIT_DESCENDANTS | false
- 'with descendants' | dataNodeWithChild | 'true' || INCLUDE_ALL_DESCENDANTS | true
+ scenario | dataNode | includeDescendantsOption || expectedCpsDataServiceOption | expectChildInResponse
+ 'no descendants by default' | dataNodeWithLeavesNoChildren | '' || OMIT_DESCENDANTS | false
+ 'no descendant explicitly' | dataNodeWithLeavesNoChildren | 'false' || OMIT_DESCENDANTS | false
+ 'with descendants' | dataNodeWithChild | 'true' || INCLUDE_ALL_DESCENDANTS | true
}
@Unroll
def 'Get data node error scenario: #scenario.'() {
given: 'the service throws an exception'
+ def endpoint = "$dataNodeBaseEndpoint/anchors/$anchorName/node"
mockCpsDataService.getDataNode(dataspaceName, anchorName, xpath, _) >> { throw exception }
when: 'get request is performed through REST API'
def response = mvc.perform(
- get(dataNodeEndpoint).param("cps-path", xpath)
+ get(endpoint).param("xpath", xpath)
).andReturn().response
then: 'a success response is returned'
response.status == httpStatus.value()
'no data' | '/x-path' | new DataNodeNotFoundException('', '', '') || HttpStatus.NOT_FOUND
'empty path' | '' | new IllegalStateException() || HttpStatus.NOT_IMPLEMENTED
}
+
+ @Unroll
+ def 'Update data node leaves: #scenario.'() {
+ given: 'json data'
+ def jsonData = 'json data'
+ def endpoint = "$dataNodeBaseEndpoint/anchors/$anchorName/nodes"
+ when: 'patch request is performed'
+ def response = mvc.perform(
+ patch(endpoint)
+ .contentType(MediaType.APPLICATION_JSON)
+ .content(jsonData)
+ .param('xpath', xpath)
+ ).andReturn().response
+ then: 'the service method is invoked with expected parameters'
+ 1 * mockCpsDataService.updateNodeLeaves(dataspaceName, anchorName, xpathServiceParameter, jsonData)
+ and: 'response status indicates success'
+ response.status == HttpStatus.OK.value()
+ where:
+ scenario | xpath | xpathServiceParameter
+ 'root node by default' | '' | '/'
+ 'node by parent xpath' | '/xpath' | '/xpath'
+ }
+
+ @Unroll
+ def 'Replace data node tree: #scenario.'() {
+ given: 'json data'
+ def jsonData = 'json data'
+ def endpoint = "$dataNodeBaseEndpoint/anchors/$anchorName/nodes"
+ when: 'put request is performed'
+ def response = mvc.perform(
+ put(endpoint)
+ .contentType(MediaType.APPLICATION_JSON)
+ .content(jsonData)
+ .param('xpath', xpath)
+ ).andReturn().response
+ then: 'the service method is invoked with expected parameters'
+ 1 * mockCpsDataService.replaceNodeTree(dataspaceName, anchorName, xpathServiceParameter, jsonData)
+ and: 'response status indicates success'
+ response.status == HttpStatus.OK.value()
+ where:
+ scenario | xpath | xpathServiceParameter
+ 'root node by default' | '' | '/'
+ 'node by parent xpath' | '/xpath' | '/xpath'
+ }
}