diff options
Diffstat (limited to 'cps-ncmp-rest/src/test')
8 files changed, 171 insertions, 54 deletions
diff --git a/cps-ncmp-rest/src/test/groovy/org/onap/cps/ncmp/rest/controller/NetworkCmProxyInventoryControllerSpec.groovy b/cps-ncmp-rest/src/test/groovy/org/onap/cps/ncmp/rest/controller/NetworkCmProxyInventoryControllerSpec.groovy index 3c603ed425..079554a22d 100644 --- a/cps-ncmp-rest/src/test/groovy/org/onap/cps/ncmp/rest/controller/NetworkCmProxyInventoryControllerSpec.groovy +++ b/cps-ncmp-rest/src/test/groovy/org/onap/cps/ncmp/rest/controller/NetworkCmProxyInventoryControllerSpec.groovy @@ -24,8 +24,9 @@ package org.onap.cps.ncmp.rest.controller import com.fasterxml.jackson.databind.ObjectMapper import org.onap.cps.TestUtils import org.onap.cps.ncmp.api.NetworkCmProxyDataService -import org.onap.cps.ncmp.api.models.CmHandle import org.onap.cps.ncmp.api.models.DmiPluginRegistration +import org.onap.cps.ncmp.rest.model.RestDmiPluginRegistration +import org.onap.cps.utils.JsonObjectMapper import org.spockframework.spring.SpringBean import org.springframework.beans.factory.annotation.Autowired import org.springframework.beans.factory.annotation.Value @@ -47,46 +48,51 @@ class NetworkCmProxyInventoryControllerSpec extends Specification { @SpringBean NetworkCmProxyDataService mockNetworkCmProxyDataService = Mock() + @SpringBean + RestInputMapper restInputMapper = Mock() + + DmiPluginRegistration mockDmiPluginRegistration = Mock() + + JsonObjectMapper jsonObjectMapper = new JsonObjectMapper(new ObjectMapper()) + @Value('${rest.api.ncmp-inventory-base-path}/v1') def ncmpBasePathV1 - def 'Register CM Handle Event' () { - given: 'jsonData' - def jsonData = TestUtils.getResourceFileContent('dmi-registration.json') - when: 'post request is performed' + def 'Dmi plugin registration #scenario' () { + given: 'a dmi plugin registration with #scenario' + def jsonData = TestUtils.getResourceFileContent(dmiRegistrationJson) + and: 'the expected rest input as an object' + def expectedRestDmiPluginRegistration = jsonObjectMapper.convertJsonString(jsonData, RestDmiPluginRegistration) + and: 'the converter returns a dmi registration (only for the expected input object)' + restInputMapper.toDmiPluginRegistration(expectedRestDmiPluginRegistration) >> mockDmiPluginRegistration + when: 'post request is performed & registration is called with correct DMI plugin information' def response = mvc.perform( post("$ncmpBasePathV1/ch") - .contentType(MediaType.APPLICATION_JSON) - .content(jsonData) + .contentType(MediaType.APPLICATION_JSON) + .content(jsonData) ).andReturn().response - then: 'the cm handles are registered with the service' - 1 * mockNetworkCmProxyDataService.updateDmiRegistrationAndSyncModule(_) - and: 'response status is No Content' - response.status == HttpStatus.NO_CONTENT.value() + then: 'the converted object is forwarded to the registration service' + 1 * mockNetworkCmProxyDataService.updateDmiRegistrationAndSyncModule(mockDmiPluginRegistration) + and: 'response status is no content' + response.status == HttpStatus.NO_CONTENT.value() + where: 'the following registration json is used' + scenario | dmiRegistrationJson + 'multiple services, added, updated and removed cm handles and many properties' | 'dmi_registration_all_singing_and_dancing.json' + 'updated cm handle with updated/new and removed properties' | 'dmi_registration_updates_only.json' + 'without any properties' | 'dmi_registration_without_properties.json' } - def 'Dmi plugin registration with #scenario' () { - given: 'jsonData, cmHandle, & DmiPluginRegistration' - def jsonData = TestUtils.getResourceFileContent('dmi_registration_combined_valid.json' ) - def cmHandle = new CmHandle(cmHandleID : 'example-name') - def expectedDmiPluginRegistration = new DmiPluginRegistration( - dmiPlugin: 'service1', - dmiDataPlugin: '', - dmiModelPlugin: '', - createdCmHandles: [cmHandle]) + def 'Dmi plugin registration with invalid json' () { + given: 'a dmi plugin registration with #scenario' + def jsonDataWithUndefinedDataLabel = '{"notAdmiPlugin":""}' when: 'post request is performed & registration is called with correct DMI plugin information' def response = mvc.perform( post("$ncmpBasePathV1/ch") .contentType(MediaType.APPLICATION_JSON) - .content(jsonData) + .content(jsonDataWithUndefinedDataLabel) ).andReturn().response - then: 'no NcmpException is thrown & updateDmiRegistrationAndSyncModule is called with correct parameters' - 1 * mockNetworkCmProxyDataService.updateDmiRegistrationAndSyncModule({ - it.getDmiPlugin() == expectedDmiPluginRegistration.getDmiPlugin() - it.getDmiDataPlugin() == expectedDmiPluginRegistration.getDmiDataPlugin() - it.getDmiModelPlugin() == expectedDmiPluginRegistration.getDmiModelPlugin() - it.getCreatedCmHandles().get(0).getCmHandleID() == expectedDmiPluginRegistration.getCreatedCmHandles().get(0).getCmHandleID() - }) + then: 'response status is bad request' + response.status == HttpStatus.BAD_REQUEST.value() } -} +} diff --git a/cps-ncmp-rest/src/test/groovy/org/onap/cps/ncmp/rest/controller/RestInputMapperSpec.groovy b/cps-ncmp-rest/src/test/groovy/org/onap/cps/ncmp/rest/controller/RestInputMapperSpec.groovy new file mode 100644 index 0000000000..c48a8ed360 --- /dev/null +++ b/cps-ncmp-rest/src/test/groovy/org/onap/cps/ncmp/rest/controller/RestInputMapperSpec.groovy @@ -0,0 +1,64 @@ +/* + * ============LICENSE_START======================================================= + * Copyright (C) 2022 Nordix Foundation + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.cps.ncmp.rest.controller + +import org.mapstruct.factory.Mappers +import org.onap.cps.ncmp.rest.model.RestCmHandle +import org.onap.cps.ncmp.rest.model.RestDmiPluginRegistration +import spock.lang.Specification + +class RestInputMapperSpec extends Specification { + + def objectUnderTest = Mappers.getMapper(RestInputMapper.class) + + def 'Convert a created REST CM Handle Input to an NCMP Service CM Handle with #scenario'() { + given: 'a rest cm handle input' + def inputRestCmHandle = new RestCmHandle(cmHandle : 'example-id', cmHandleProperties: dmiProperties, + publicCmHandleProperties: publicProperties) + def restDmiPluginRegistration = new RestDmiPluginRegistration( + createdCmHandles: [inputRestCmHandle]) + when: 'to plugin dmi registration is called' + def result = objectUnderTest.toDmiPluginRegistration(restDmiPluginRegistration) + then: 'the result returns the correct number of cm handles' + result.createdCmHandles.size() == 1 + and: 'the converted cm handle has the same id' + result.createdCmHandles[0].cmHandleID == 'example-id' + and: '(empty) properties are converted correctly' + result.createdCmHandles[0].dmiProperties == expectedDmiProperties + result.createdCmHandles[0].publicProperties == expectedPublicProperties + where: 'the following parameters are used' + scenario | dmiProperties | publicProperties || expectedDmiProperties | expectedPublicProperties + 'dmi and public properties' | ['Property-Example': 'example property'] | ['Public-Property-Example': 'public example property'] || ['Property-Example': 'example property'] | ['Public-Property-Example': 'public example property'] + 'no properties' | null | null || [:] | [:] + } + + def 'Handling empty dmi registration'() { + given: 'a rest cm handle input without any cm handles' + def restDmiPluginRegistration = new RestDmiPluginRegistration() + when: 'to plugin dmi registration is called' + def result = objectUnderTest.toDmiPluginRegistration(restDmiPluginRegistration) + then: 'unspecified lists remain as empty lists' + assert result.createdCmHandles == [] + assert result.updatedCmHandles == [] + assert result.removedCmHandles == [] + } + +} diff --git a/cps-ncmp-rest/src/test/groovy/org/onap/cps/ncmp/rest/exceptions/NetworkCmProxyRestExceptionHandlerSpec.groovy b/cps-ncmp-rest/src/test/groovy/org/onap/cps/ncmp/rest/exceptions/NetworkCmProxyRestExceptionHandlerSpec.groovy index 35544d9411..306f546f32 100644 --- a/cps-ncmp-rest/src/test/groovy/org/onap/cps/ncmp/rest/exceptions/NetworkCmProxyRestExceptionHandlerSpec.groovy +++ b/cps-ncmp-rest/src/test/groovy/org/onap/cps/ncmp/rest/exceptions/NetworkCmProxyRestExceptionHandlerSpec.groovy @@ -27,6 +27,7 @@ import org.onap.cps.TestUtils import org.onap.cps.ncmp.api.NetworkCmProxyDataService import org.onap.cps.ncmp.api.impl.exception.DmiRequestException import org.onap.cps.ncmp.api.impl.exception.ServerNcmpException +import org.onap.cps.ncmp.rest.controller.RestInputMapper import org.onap.cps.spi.exceptions.CpsException import org.onap.cps.spi.exceptions.DataValidationException import org.onap.cps.utils.JsonObjectMapper @@ -61,6 +62,9 @@ class NetworkCmProxyRestExceptionHandlerSpec extends Specification { @SpringBean JsonObjectMapper jsonObjectMapper = Stub() + @SpringBean + RestInputMapper restInputMapper = Mock() + @Value('${rest.api.ncmp-base-path}') def basePathNcmp @@ -105,17 +109,17 @@ class NetworkCmProxyRestExceptionHandlerSpec extends Specification { } def setupTestException(exception, apiType) { - if (NCMP.equals(apiType)) { + if (NCMP == apiType) { mockNetworkCmProxyDataService.getYangResourcesModuleReferences(*_) >> { throw exception } } mockNetworkCmProxyDataService.updateDmiRegistrationAndSyncModule(*_) >> { throw exception } } def performTestRequest(apiType) { - if (NCMP.equals(apiType)) { + if (NCMP == apiType) { return mvc.perform(get("$dataNodeBaseEndpointNcmp/ch/testCmHandle/modules")).andReturn().response } - def jsonData = TestUtils.getResourceFileContent('dmi-registration.json') + def jsonData = TestUtils.getResourceFileContent('dmi_registration_all_singing_and_dancing.json') return mvc.perform(post("$dataNodeBaseEndpointNcmpInventory/ch").contentType(MediaType.APPLICATION_JSON).content(jsonData)).andReturn().response } diff --git a/cps-ncmp-rest/src/test/resources/dmi-registration.json b/cps-ncmp-rest/src/test/resources/dmi-registration.json deleted file mode 100644 index 4f27e11843..0000000000 --- a/cps-ncmp-rest/src/test/resources/dmi-registration.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "dmiPlugin": "onap-dmi-plugin", - "createdCmHandles": [ - { - "cmHandle": "example-name", - "cmHandleProperties": { - "subSystemId" : "system-001" - }, - "publicCmHandleProperties": { - "area" : "south" - } - } - ] -}
\ No newline at end of file diff --git a/cps-ncmp-rest/src/test/resources/dmi_registration_all_singing_and_dancing.json b/cps-ncmp-rest/src/test/resources/dmi_registration_all_singing_and_dancing.json new file mode 100644 index 0000000000..fd8b56b02d --- /dev/null +++ b/cps-ncmp-rest/src/test/resources/dmi_registration_all_singing_and_dancing.json @@ -0,0 +1,43 @@ +{ + "dmiDataPlugin":"service2", + "dmiModelPlugin":"service3", + "createdCmHandles":[ + { + "cmHandle":"ch1(new)", + "cmHandleProperties":{ + "dmiProp1":"ch1-dmi1", + "dmiProp2":"ch1-dmi2" + }, + "publicCmHandleProperties":{ + "pubProp1":"ch1-pub1", + "pubProp2":"ch1-pub2" + } + }, + { + "cmHandle":"ch2(new)", + "cmHandleProperties":{ + "dmiProp1":"ch2-dmi1", + "dmiProp2":"ch2-dmi2" + }, + "publicCmHandleProperties":{ + "pubProp1":"ch2-pub1", + "pubProp2":"ch2-pub2" + } + } + ], + "updatedCmHandles":[ + { + "cmHandle":"ch3(upd)", + "cmHandleProperties":{ + "dmiProp1":"ch3-dmi1" + }, + "publicCmHandleProperties":{ + "pubProp2":"ch3-pub1" + } + } + ], + "removedCmHandles":[ + "ch4", + "ch5" + ] +} diff --git a/cps-ncmp-rest/src/test/resources/dmi_registration_combined_valid.json b/cps-ncmp-rest/src/test/resources/dmi_registration_combined_valid.json deleted file mode 100644 index bded4f215c..0000000000 --- a/cps-ncmp-rest/src/test/resources/dmi_registration_combined_valid.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "dmiPlugin": "service1", - "dmiDataPlugin": "", - "dmiModelPlugin": "", - "createdCmHandles": [{ - "cmHandle": "example-name" - }] -}
\ No newline at end of file diff --git a/cps-ncmp-rest/src/test/resources/dmi_registration_updates_only.json b/cps-ncmp-rest/src/test/resources/dmi_registration_updates_only.json new file mode 100644 index 0000000000..58a1a9836b --- /dev/null +++ b/cps-ncmp-rest/src/test/resources/dmi_registration_updates_only.json @@ -0,0 +1,12 @@ +{ + "dmiPlugin": "service1", + "updatedCmHandles":[ + { + "cmHandle":"ch3(upd)", + "cmHandleProperties":{ + "dmiProp1":"ch3-dmi1", + "dmiProp2":null + } + } + ] +} diff --git a/cps-ncmp-rest/src/test/resources/dmi_registration_without_properties.json b/cps-ncmp-rest/src/test/resources/dmi_registration_without_properties.json new file mode 100644 index 0000000000..395c098d21 --- /dev/null +++ b/cps-ncmp-rest/src/test/resources/dmi_registration_without_properties.json @@ -0,0 +1,10 @@ +{ + "dmiPlugin":"", + "dmiDataPlugin":"service2", + "dmiModelPlugin":"service3", + "createdCmHandles":[ + { + "cmHandle": "ch1(new)" + } + ] +} |