diff options
9 files changed, 89 insertions, 129 deletions
diff --git a/cps-ncmp-rest/docs/openapi/components.yaml b/cps-ncmp-rest/docs/openapi/components.yaml index 560c945dd7..d35919da4b 100644 --- a/cps-ncmp-rest/docs/openapi/components.yaml +++ b/cps-ncmp-rest/docs/openapi/components.yaml @@ -133,21 +133,24 @@ components: schema: type: string enum: [ application/json, application/yang-data+json ] - fieldsParamInQuery: - name: fields + optionsParamInQuery: + name: options in: query - description: Fields parameter to filter resource + description: options parameter in query, it is mandatory to wrap key(s)=value(s) in parenthesis'()'. required: false schema: type: string - depthParamInQuery: - name: depth - in: query - description: Depth parameter for response - required: false - schema: - type: integer - minimum: 1 + allowReserved: true + examples: + sample1: + value: + options: (key1=value1,key2=value2) + sample2: + value: + options: (key1=value1,key2=value1/value2) + sample3: + value: + options: (key1=10,key2=value2,key3=[val31;val32]) contentParamInHeader: name: Content-Type in: header diff --git a/cps-ncmp-rest/docs/openapi/ncmproxy.yml b/cps-ncmp-rest/docs/openapi/ncmproxy.yml index 263c76c134..5a45a5c837 100755 --- a/cps-ncmp-rest/docs/openapi/ncmproxy.yml +++ b/cps-ncmp-rest/docs/openapi/ncmproxy.yml @@ -213,8 +213,7 @@ getResourceDataForPassthroughOperational: - $ref: 'components.yaml#/components/parameters/cmHandleInPath' - $ref: 'components.yaml#/components/parameters/resourceIdentifierInQuery' - $ref: 'components.yaml#/components/parameters/acceptParamInHeader' - - $ref: 'components.yaml#/components/parameters/fieldsParamInQuery' - - $ref: 'components.yaml#/components/parameters/depthParamInQuery' + - $ref: 'components.yaml#/components/parameters/optionsParamInQuery' responses: 200: $ref: 'components.yaml#/components/responses/Ok' @@ -238,8 +237,7 @@ resourceDataForPassthroughRunning: - $ref: 'components.yaml#/components/parameters/cmHandleInPath' - $ref: 'components.yaml#/components/parameters/resourceIdentifierInQuery' - $ref: 'components.yaml#/components/parameters/acceptParamInHeader' - - $ref: 'components.yaml#/components/parameters/fieldsParamInQuery' - - $ref: 'components.yaml#/components/parameters/depthParamInQuery' + - $ref: 'components.yaml#/components/parameters/optionsParamInQuery' responses: 200: $ref: 'components.yaml#/components/responses/Ok' diff --git a/cps-ncmp-rest/src/main/java/org/onap/cps/ncmp/rest/controller/NetworkCmProxyController.java b/cps-ncmp-rest/src/main/java/org/onap/cps/ncmp/rest/controller/NetworkCmProxyController.java index 0a1a6419e7..4a9527a832 100755 --- a/cps-ncmp-rest/src/main/java/org/onap/cps/ncmp/rest/controller/NetworkCmProxyController.java +++ b/cps-ncmp-rest/src/main/java/org/onap/cps/ncmp/rest/controller/NetworkCmProxyController.java @@ -157,22 +157,19 @@ public class NetworkCmProxyController implements NetworkCmProxyApi { * * @param cmHandle cm handle identifier * @param resourceIdentifier resource identifier - * @param accept accept header parameter - * @param fields fields query parameter - * @param depth depth query parameter + * @param acceptParamInHeader accept header parameter + * @param optionsParamInQuery options query parameter * @return {@code ResponseEntity} response from dmi plugin */ @Override public ResponseEntity<Object> getResourceDataOperationalForCmHandle(final String cmHandle, - final String resourceIdentifier, - final String accept, - final String fields, - final Integer depth) { + final @NotNull @Valid String resourceIdentifier, + final String acceptParamInHeader, + final @Valid String optionsParamInQuery) { final Object responseObject = networkCmProxyDataService.getResourceDataOperationalForCmHandle(cmHandle, resourceIdentifier, - accept, - fields, - depth); + acceptParamInHeader, + optionsParamInQuery); return ResponseEntity.ok(responseObject); } @@ -181,22 +178,19 @@ public class NetworkCmProxyController implements NetworkCmProxyApi { * * @param cmHandle cm handle identifier * @param resourceIdentifier resource identifier - * @param accept accept header parameter - * @param fields fields query parameter - * @param depth depth query parameter + * @param acceptParamInHeader accept header parameter + * @param optionsParamInQuery options query parameter * @return {@code ResponseEntity} response from dmi plugin */ @Override public ResponseEntity<Object> getResourceDataRunningForCmHandle(final String cmHandle, - final String resourceIdentifier, - final String accept, - final String fields, - final Integer depth) { + final @NotNull @Valid String resourceIdentifier, + final String acceptParamInHeader, + final @Valid String optionsParamInQuery) { final Object responseObject = networkCmProxyDataService.getResourceDataPassThroughRunningForCmHandle(cmHandle, resourceIdentifier, - accept, - fields, - depth); + acceptParamInHeader, + optionsParamInQuery); return ResponseEntity.ok(responseObject); } diff --git a/cps-ncmp-rest/src/test/groovy/org/onap/cps/ncmp/rest/controller/NetworkCmProxyControllerSpec.groovy b/cps-ncmp-rest/src/test/groovy/org/onap/cps/ncmp/rest/controller/NetworkCmProxyControllerSpec.groovy index d62ae93b09..b8c68d913b 100644 --- a/cps-ncmp-rest/src/test/groovy/org/onap/cps/ncmp/rest/controller/NetworkCmProxyControllerSpec.groovy +++ b/cps-ncmp-rest/src/test/groovy/org/onap/cps/ncmp/rest/controller/NetworkCmProxyControllerSpec.groovy @@ -193,7 +193,7 @@ class NetworkCmProxyControllerSpec extends Specification { def 'Get Resource Data from pass-through operational.' () { given: 'resource data url' def getUrl = "$ncmpBasePathV1/ch/testCmHandle/data/ds/ncmp-datastore:passthrough-operational" + - "?resourceIdentifier=parent/child&fields=testFields&depth=5" + "?resourceIdentifier=parent/child&options=(a=1,b=2)" when: 'get data resource request is performed' def response = mvc.perform( get(getUrl) @@ -204,8 +204,7 @@ class NetworkCmProxyControllerSpec extends Specification { 1 * mockNetworkCmProxyDataService.getResourceDataOperationalForCmHandle('testCmHandle', 'parent/child', 'application/json', - 'testFields', - 5) + '(a=1,b=2)') and: 'response status is Ok' response.status == HttpStatus.OK.value() } @@ -213,13 +212,12 @@ class NetworkCmProxyControllerSpec extends Specification { def 'Get Resource Data from pass-through running with #scenario value in resource identifier param.' () { given: 'resource data url' def getUrl = "$ncmpBasePathV1/ch/testCmHandle/data/ds/ncmp-datastore:passthrough-running" + - "?resourceIdentifier=" + resourceIdentifier + "&fields=testFields&depth=5" + "?resourceIdentifier=" + resourceIdentifier + "&options=(a=1,b=2)" and: 'ncmp service returns json object' mockNetworkCmProxyDataService.getResourceDataPassThroughRunningForCmHandle('testCmHandle', resourceIdentifier, 'application/json', - 'testFields', - 5) >> '{valid-json}' + '(a=1,b=2)') >> '{valid-json}' when: 'get data resource request is performed' def response = mvc.perform( get(getUrl) diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/NetworkCmProxyDataService.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/NetworkCmProxyDataService.java index 2f91ed30e1..cb2f78206c 100644 --- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/NetworkCmProxyDataService.java +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/NetworkCmProxyDataService.java @@ -114,16 +114,14 @@ public interface NetworkCmProxyDataService { * * @param cmHandle cm handle * @param resourceIdentifier resource identifier - * @param accept accept param - * @param fields fields query - * @param depth depth query + * @param acceptParamInHeader accept param + * @param optionsParamInQuery options query * @return {@code Object} resource data */ Object getResourceDataOperationalForCmHandle(@NotNull String cmHandle, @NotNull String resourceIdentifier, - String accept, - String fields, - Integer depth); + String acceptParamInHeader, + String optionsParamInQuery); /** * Get resource data for data store pass-through running @@ -131,16 +129,14 @@ public interface NetworkCmProxyDataService { * * @param cmHandle cm handle * @param resourceIdentifier resource identifier - * @param acceptParam accept param - * @param fields fields query - * @param depth depth query + * @param acceptParamInHeader accept param + * @param optionsParamInQuery options query * @return {@code Object} resource data */ Object getResourceDataPassThroughRunningForCmHandle(@NotNull String cmHandle, @NotNull String resourceIdentifier, - String acceptParam, - String fields, - Integer depth); + String acceptParamInHeader, + String optionsParamInQuery); /** * Create resource data for data store pass-through running diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServiceImpl.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServiceImpl.java index 291b0bf330..889d38efb5 100755 --- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServiceImpl.java +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServiceImpl.java @@ -169,9 +169,8 @@ public class NetworkCmProxyDataServiceImpl implements NetworkCmProxyDataService @Override public Object getResourceDataOperationalForCmHandle(final @NotNull String cmHandle, final @NotNull String resourceIdentifier, - final String acceptParam, - final String fieldsQueryParam, - final Integer depthQueryParam) { + final String acceptParamInHeader, + final String optionsParamInQuery) { final DataNode cmHandleDataNode = fetchDataNodeFromDmiRegistryForCmHandle(cmHandle); final String dmiServiceName = String.valueOf(cmHandleDataNode.getLeaves().get(NCMP_DMI_SERVICE_NAME)); @@ -179,9 +178,8 @@ public class NetworkCmProxyDataServiceImpl implements NetworkCmProxyDataService final ResponseEntity<Object> response = dmiOperations.getResourceDataOperationalFromDmi(dmiServiceName, cmHandle, resourceIdentifier, - fieldsQueryParam, - depthQueryParam, - acceptParam, + optionsParamInQuery, + acceptParamInHeader, dmiRequestBody); return handleResponse(response); } @@ -189,18 +187,16 @@ public class NetworkCmProxyDataServiceImpl implements NetworkCmProxyDataService @Override public Object getResourceDataPassThroughRunningForCmHandle(final @NotNull String cmHandle, final @NotNull String resourceIdentifier, - final String acceptParam, - final String fields, - final Integer depth) { + final String acceptParamInHeader, + final String optionsParamInQuery) { final DataNode cmHandleDataNode = fetchDataNodeFromDmiRegistryForCmHandle(cmHandle); final String dmiServiceName = String.valueOf(cmHandleDataNode.getLeaves().get(NCMP_DMI_SERVICE_NAME)); final String dmiRequestBody = getGenericRequestBody(cmHandleDataNode); final ResponseEntity<Object> response = dmiOperations.getResourceDataPassThroughRunningFromDmi(dmiServiceName, cmHandle, resourceIdentifier, - fields, - depth, - acceptParam, + optionsParamInQuery, + acceptParamInHeader, dmiRequestBody); return handleResponse(response); } diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/operation/DmiOperations.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/operation/DmiOperations.java index c295e0328e..363b0ef9b2 100644 --- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/operation/DmiOperations.java +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/operation/DmiOperations.java @@ -53,6 +53,7 @@ public class DmiOperations { private static final String DMI_CM_HANDLE_DATASTORE_PATH = DMI_CM_HANDLE_PATH + "/data/ds"; private static final String URL_SEPARATOR = "/"; private static final String RESOURCE_IDENTIFIER = "resourceIdentifier"; + private static final String OPTIONS_QUERY_KEY = "options"; /** @@ -104,22 +105,20 @@ public class DmiOperations { * @param dmiServiceName dmi service name * @param cmHandle network resource identifier * @param resourceId resource identifier - * @param fieldsQuery fields query - * @param depthQuery depth query - * @param acceptParam accept parameter + * @param optionsParamInQuery options query + * @param acceptParamInHeader accept parameter * @param jsonBody json body for put operation * @return {@code ResponseEntity} response entity */ public ResponseEntity<Object> getResourceDataOperationalFromDmi(final String dmiServiceName, final String cmHandle, final String resourceId, - final String fieldsQuery, - final Integer depthQuery, - final String acceptParam, + final String optionsParamInQuery, + final String acceptParamInHeader, final String jsonBody) { final var dmiResourceDataUrl = getDmiDatastoreUrl(dmiServiceName, cmHandle, resourceId, - fieldsQuery, depthQuery, DataStoreEnum.PASSTHROUGH_OPERATIONAL); - final var httpHeaders = prepareHeader(acceptParam); + optionsParamInQuery, DataStoreEnum.PASSTHROUGH_OPERATIONAL); + final var httpHeaders = prepareHeader(acceptParamInHeader); return dmiRestClient.putOperationWithJsonData(dmiResourceDataUrl, jsonBody, httpHeaders); } @@ -130,22 +129,20 @@ public class DmiOperations { * @param dmiServiceName dmi service name * @param cmHandle network resource identifier * @param resourceId resource identifier - * @param fieldsQuery fields query - * @param depthQuery depth query - * @param acceptParam accept parameter + * @param optionsParamInQuery fields query + * @param acceptParamInHeader accept parameter * @param jsonBody json body for put operation * @return {@code ResponseEntity} response entity */ public ResponseEntity<Object> getResourceDataPassThroughRunningFromDmi(final String dmiServiceName, final String cmHandle, final String resourceId, - final String fieldsQuery, - final Integer depthQuery, - final String acceptParam, + final String optionsParamInQuery, + final String acceptParamInHeader, final String jsonBody) { final var dmiResourceDataUrl = getDmiDatastoreUrl(dmiServiceName, cmHandle, resourceId, - fieldsQuery, depthQuery, DataStoreEnum.PASSTHROUGH_RUNNING); - final var httpHeaders = prepareHeader(acceptParam); + optionsParamInQuery, DataStoreEnum.PASSTHROUGH_RUNNING); + final var httpHeaders = prepareHeader(acceptParamInHeader); return dmiRestClient.putOperationWithJsonData(dmiResourceDataUrl, jsonBody, httpHeaders); } @@ -163,7 +160,7 @@ public class DmiOperations { final String cmHandle, final String resourceId, final String jsonBody) { - final var stringBuilder = getStringBuilderForPassThroughRunningUrl(dmiServiceName, + final var stringBuilder = getStringBuilderForPassThroughUrl(dmiServiceName, cmHandle, resourceId, DataStoreEnum.PASSTHROUGH_RUNNING); return dmiRestClient.postOperationWithJsonData(stringBuilder.toString(), jsonBody, new HttpHeaders()); } @@ -183,20 +180,19 @@ public class DmiOperations { private String getDmiDatastoreUrl(final String dmiServiceName, final String cmHandle, final String resourceId, - final String fieldsQuery, - final Integer depthQuery, + final String optionsParamInQuery, final DataStoreEnum dataStoreEnum) { - final var stringBuilder = getStringBuilderForPassThroughRunningUrl(dmiServiceName, + final var stringBuilder = getStringBuilderForPassThroughUrl(dmiServiceName, cmHandle, resourceId, dataStoreEnum); - appendFieldsAndDepth(stringBuilder, fieldsQuery, depthQuery); + appendOptionsQuery(stringBuilder, optionsParamInQuery); return stringBuilder.toString(); } @NotNull - private StringBuilder getStringBuilderForPassThroughRunningUrl(final String dmiServiceName, - final String cmHandle, - final String resourceId, - final DataStoreEnum dataStoreEnum) { + private StringBuilder getStringBuilderForPassThroughUrl(final String dmiServiceName, + final String cmHandle, + final String resourceId, + final DataStoreEnum dataStoreEnum) { final var stringBuilder = new StringBuilder(dmiServiceName); stringBuilder.append(DMI_API_PATH); stringBuilder.append(DMI_CM_HANDLE_DATASTORE_PATH.replace("{cmHandle}", cmHandle)); @@ -205,23 +201,14 @@ public class DmiOperations { return stringBuilder; } - private void appendFieldsAndDepth(final StringBuilder stringBuilder, - final String fieldsQuery, - final Integer depthQuery) { - final var doesFieldExists = (fieldsQuery != null && !fieldsQuery.isEmpty()); - if (doesFieldExists) { - stringBuilder.append("&").append("fields=").append(fieldsQuery); - } - if (depthQuery != null) { - stringBuilder.append("&").append("depth=").append(depthQuery); - } + private void appendOptionsQuery(final StringBuilder stringBuilder, + final String optionsParamInQuery) { + stringBuilder.append("&").append(OPTIONS_QUERY_KEY).append("=").append(optionsParamInQuery); } private HttpHeaders prepareHeader(final String acceptParam) { final var httpHeaders = new HttpHeaders(); - if (acceptParam != null && !acceptParam.isEmpty()) { - httpHeaders.set(HttpHeaders.ACCEPT, acceptParam); - } + httpHeaders.set(HttpHeaders.ACCEPT, acceptParam); return httpHeaders; } } diff --git a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServiceImplSpec.groovy b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServiceImplSpec.groovy index 2b376e97bf..51325015ba 100644 --- a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServiceImplSpec.groovy +++ b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServiceImplSpec.groovy @@ -231,16 +231,14 @@ class NetworkCmProxyDataServiceImplSpec extends Specification { mockDmiOperations.getResourceDataOperationalFromDmi('testDmiService', 'testCmHandle', 'testResourceId', - 'testFieldQuery', - 5, + '(a=1,b=2)', 'testAcceptParam', '{"operation":"read","cmHandleProperties":{"testName":"testValue"}}') >> new ResponseEntity<>('result-json', HttpStatus.OK) when: 'get resource data is called' def response = objectUnderTest.getResourceDataOperationalForCmHandle('testCmHandle', 'testResourceId', 'testAcceptParam', - 'testFieldQuery', - 5) + '(a=1,b=2)') then: 'dmi returns ok response' response == 'result-json' } @@ -259,8 +257,7 @@ class NetworkCmProxyDataServiceImplSpec extends Specification { def response = objectUnderTest.getResourceDataOperationalForCmHandle('testCmHandle', 'testResourceId', 'testAcceptParam', - 'testFieldQuery', - 5) + '(a=1,b=2)') then: 'exception is thrown with the expected details' def exceptionThrown = thrown(NcmpException.class) exceptionThrown.details == 'testException' @@ -276,8 +273,7 @@ class NetworkCmProxyDataServiceImplSpec extends Specification { mockDmiOperations.getResourceDataOperationalFromDmi('testDmiService', 'testCmHandle', 'testResourceId', - 'testFieldQuery', - 5, + '(a=1,b=2)', 'testAcceptParam', '{"operation":"read","cmHandleProperties":{"testName":"testValue"}}') >> new ResponseEntity<>('NOK-json', HttpStatus.NOT_FOUND) @@ -285,8 +281,7 @@ class NetworkCmProxyDataServiceImplSpec extends Specification { def response = objectUnderTest.getResourceDataOperationalForCmHandle('testCmHandle', 'testResourceId', 'testAcceptParam', - 'testFieldQuery', - 5) + '(a=1,b=2)') then: 'exception is thrown' def exceptionThrown = thrown(NcmpException.class) and: 'details contains the original response' @@ -303,16 +298,14 @@ class NetworkCmProxyDataServiceImplSpec extends Specification { mockDmiOperations.getResourceDataPassThroughRunningFromDmi('testDmiService', 'testCmHandle', 'testResourceId', - 'testFieldQuery', - 5, + '(a=1,b=2)', 'testAcceptParam', '{"operation":"read","cmHandleProperties":{"testName":"testValue"}}') >> new ResponseEntity<>('{result-json}', HttpStatus.OK) when: 'get resource data is called' def response = objectUnderTest.getResourceDataPassThroughRunningForCmHandle('testCmHandle', 'testResourceId', 'testAcceptParam', - 'testFieldQuery', - 5) + '(a=1,b=2)') then: 'get resource data returns expected response' response == '{result-json}' } @@ -331,8 +324,7 @@ class NetworkCmProxyDataServiceImplSpec extends Specification { def response = objectUnderTest.getResourceDataPassThroughRunningForCmHandle('testCmHandle', 'testResourceId', 'testAcceptParam', - 'testFieldQuery', - 5) + '(a=1,b=2)') then: 'exception is thrown with the expected details' def exceptionThrown = thrown(NcmpException.class) exceptionThrown.details == 'testException' @@ -348,8 +340,7 @@ class NetworkCmProxyDataServiceImplSpec extends Specification { mockDmiOperations.getResourceDataPassThroughRunningFromDmi('testDmiService', 'testCmHandle', 'testResourceId', - 'testFieldQuery', - 5, + '(a=1,b=2)', 'testAcceptParam', '{"operation":"read","cmHandleProperties":{"testName":"testValue"}}') >> new ResponseEntity<>('NOK-json', HttpStatus.NOT_FOUND) @@ -357,8 +348,7 @@ class NetworkCmProxyDataServiceImplSpec extends Specification { def response = objectUnderTest.getResourceDataPassThroughRunningForCmHandle('testCmHandle', 'testResourceId', 'testAcceptParam', - 'testFieldQuery', - 5) + '(a=1,b=2)') then: 'exception is thrown' def exceptionThrown = thrown(NcmpException.class) and: 'details contains the original response' diff --git a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/operation/DmiOperationsSpec.groovy b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/operation/DmiOperationsSpec.groovy index 8af778106a..8e0fb76a56 100644 --- a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/operation/DmiOperationsSpec.groovy +++ b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/operation/DmiOperationsSpec.groovy @@ -42,13 +42,12 @@ class DmiOperationsSpec extends Specification { def 'call get resource data for pass-through:operational datastore from DMI.'() { given: 'expected url' def expectedUrl = 'testDmiBasePath/dmi/v1/ch/testCmhandle/data/ds' + - '/ncmp-datastore:passthrough-operational?resourceIdentifier=parent/child&fields=testFieldsQuery&depth=10' + '/ncmp-datastore:passthrough-operational?resourceIdentifier=parent/child&options=(a=1,b=2)' when: 'get resource data is called to DMI' objectUnderTest.getResourceDataOperationalFromDmi('testDmiBasePath', 'testCmhandle', 'parent/child', - 'testFieldsQuery', - 10, + '(a=1,b=2)', 'testAcceptJson', 'testJsonbody') then: 'the put operation is executed with the correct URL' @@ -57,13 +56,12 @@ class DmiOperationsSpec extends Specification { def 'call get resource data for pass-through:running datastore from DMI.'() { given: 'expected url' def expectedUrl = 'testDmiBasePath/dmi/v1/ch/testCmhandle/data/ds' + - '/ncmp-datastore:passthrough-running?resourceIdentifier=parent/child&fields=testFieldsQuery&depth=10' + '/ncmp-datastore:passthrough-running?resourceIdentifier=parent/child&options=(a=1,b=2)' when: 'get resource data is called to DMI' objectUnderTest.getResourceDataPassThroughRunningFromDmi('testDmiBasePath', 'testCmhandle', 'parent/child', - 'testFieldsQuery', - 10, + '(a=1,b=2)', 'testAcceptJson', 'testJsonbody') then: 'the put operation is executed with the correct URL' |