/*
* ============LICENSE_START=======================================================
* Copyright (C) 2021 Pantheon.tech
+ * Modification Copyright (C) 2021 highstreet technologies GmbH
+ * Modification Copyright (C) 2021 Nordix Foundation
* ================================================================================
* 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.nfproxy.rest.controller
+
+import com.google.gson.Gson
+import org.onap.cps.nfproxy.api.NfProxyDataService
+import org.onap.cps.spi.model.DataNodeBuilder
+import org.spockframework.spring.SpringBean
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.beans.factory.annotation.Value
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest
import org.springframework.http.HttpStatus
+import org.springframework.http.MediaType
import org.springframework.test.web.servlet.MockMvc
-import org.springframework.test.web.servlet.request.MockMvcRequestBuilders
import spock.lang.Specification
+import spock.lang.Unroll
+
+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.*
@WebMvcTest
class NfProxyControllerSpec extends Specification {
@Autowired
MockMvc mvc
- @Value('${rest.api.base-path}')
+ @SpringBean
+ NfProxyDataService mockNfProxyDataService = Mock()
+
+ @Value('${rest.api.xnf-base-path}')
def basePath
- def 'Hello world method invocation.'(){
- when: 'hello-world request performed'
- def response = mvc.perform(MockMvcRequestBuilders.get("$basePath/v1/hello-world")).andReturn().response
- then: 'success response returned'
+ def dataNodeBaseEndpoint
+
+ def setup() {
+ dataNodeBaseEndpoint = "$basePath/v1"
+ }
+
+ def cmHandle = 'some handle'
+ def xpath = 'some xpath'
+
+ @Unroll
+ def 'Query data node by cps path for the given cm handle with #scenario.'() {
+ given: 'service method returns a list containing a data node'
+ def dataNode = new DataNodeBuilder().withXpath('/xpath').build()
+ def cpsPath = 'some cps-path'
+ mockNfProxyDataService.queryDataNodes(cmHandle, cpsPath, expectedCpsDataServiceOption) >> [dataNode]
+ and: 'the query endpoint'
+ def dataNodeEndpoint = "$dataNodeBaseEndpoint/cm-handles/$cmHandle/nodes/query"
+ when: 'query data nodes API is invoked'
+ def response = mvc.perform(get(dataNodeEndpoint)
+ .param('cps-path', cpsPath)
+ .param('include-descendants', includeDescendantsOption))
+ .andReturn().response
+ then: 'the response contains the the datanode in json format'
response.status == HttpStatus.OK.value()
- response.getContentAsString().contains("Hello World!")
+ def expectedJsonContent = new Gson().toJson(dataNode)
+ response.getContentAsString().contains(expectedJsonContent)
+ where: 'the following options for include descendants are provided in the request'
+ scenario | includeDescendantsOption || expectedCpsDataServiceOption
+ 'no descendants by default'| '' || OMIT_DESCENDANTS
+ 'no descendant explicitly' | 'false' || OMIT_DESCENDANTS
+ 'descendants' | 'true' || INCLUDE_ALL_DESCENDANTS
}
- def 'Example error handling.'(){
- when: 'hello-error request performed'
- def response = mvc.perform(MockMvcRequestBuilders.get("$basePath/v1/hello-error")).andReturn().response
- then: 'error response returned'
- response.status == HttpStatus.INTERNAL_SERVER_ERROR.value()
- response.getContentAsString().contains("Example error")
+ def 'Update data node leaves.'() {
+ given: 'json data'
+ def jsonData = 'json data'
+ and: 'the query endpoint'
+ def endpoint = "$dataNodeBaseEndpoint/cm-handles/$cmHandle/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 once with expected parameters'
+ 1 * mockNfProxyDataService.updateNodeLeaves(cmHandle, xpath, jsonData)
+ and: 'response status indicates success'
+ response.status == HttpStatus.OK.value()
+ }
+
+ def 'Replace data node tree.'() {
+ given: 'json data'
+ def jsonData = 'json data'
+ and: 'the query endpoint'
+ def endpoint = "$dataNodeBaseEndpoint/cm-handles/$cmHandle/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 once with expected parameters'
+ 1 * mockNfProxyDataService.replaceNodeTree(cmHandle, xpath, jsonData)
+ and: 'response status indicates success'
+ response.status == HttpStatus.OK.value()
+ }
+
+ def 'Get data node.'() {
+ given: 'the service returns a data node'
+ def xpath = 'some xpath'
+ def dataNode = new DataNodeBuilder().withXpath(xpath).withLeaves(["leaf": "value"]).build()
+ mockNfProxyDataService.getDataNode(cmHandle, xpath, OMIT_DESCENDANTS) >> dataNode
+ and: 'the query endpoint'
+ def endpoint = "$dataNodeBaseEndpoint/cm-handles/$cmHandle/node"
+ when: 'get request is performed through REST API'
+ def response = mvc.perform(get(endpoint).param('xpath', xpath)).andReturn().response
+ then: 'a success response is returned'
+ response.status == HttpStatus.OK.value()
+ and: 'response contains expected leaf and value'
+ response.contentAsString.contains('"leaf":"value"')
}
}
+