From 4cbd60b974fa68cab8501e9f3e9edef134eac09b Mon Sep 17 00:00:00 2001 From: ToineSiebelink Date: Thu, 30 Sep 2021 16:53:42 +0100 Subject: Fix issues with SOnar Qube coverage report -removed invalid jacoco exclude -removed strange (generated/accidental?) comment in main pom header -moved manually coded 'models' package (included in coverage now) to separate it from swagger generated package/classes with same name (exluded in coverage) -added some missing test scenarios -increased coverage limit from 70 to 98% to prevent regression Issue-ID: CPS-475 Signed-off-by: ToineSiebelink Change-Id: I2f1c276c543926d2d259e33b418f21de4abfea96 --- .../ncmp/dmi/config/DmiConfigurationSpec.groovy | 66 ++++++++++++++++++++++ .../cps/ncmp/dmi/config/DmiPluginConfigSpec.groovy | 52 +++++++++++++++++ .../dmi/model/ModuleSchemaPropertiesSpec.groovy | 41 ++++++++++++++ .../rest/controller/DmiRestControllerSpec.groovy | 28 +++++++-- .../cps/ncmp/dmi/service/DmiServiceImplSpec.groovy | 35 +++++++++--- .../service/operation/SdncOperationsSpec.groovy | 2 +- src/test/resources/GetModules.json | 4 +- src/test/resources/application.yml | 12 ++++ 8 files changed, 224 insertions(+), 16 deletions(-) create mode 100644 src/test/groovy/org/onap/cps/ncmp/dmi/config/DmiConfigurationSpec.groovy create mode 100644 src/test/groovy/org/onap/cps/ncmp/dmi/config/DmiPluginConfigSpec.groovy create mode 100644 src/test/groovy/org/onap/cps/ncmp/dmi/model/ModuleSchemaPropertiesSpec.groovy (limited to 'src/test') diff --git a/src/test/groovy/org/onap/cps/ncmp/dmi/config/DmiConfigurationSpec.groovy b/src/test/groovy/org/onap/cps/ncmp/dmi/config/DmiConfigurationSpec.groovy new file mode 100644 index 00000000..1798c9f2 --- /dev/null +++ b/src/test/groovy/org/onap/cps/ncmp/dmi/config/DmiConfigurationSpec.groovy @@ -0,0 +1,66 @@ +/* + * ============LICENSE_START======================================================= + * 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. + * 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.dmi.config + +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.boot.test.context.SpringBootTest +import org.springframework.boot.web.client.RestTemplateBuilder +import org.springframework.test.context.ContextConfiguration +import spock.lang.Specification + +@SpringBootTest +@ContextConfiguration(classes = [DmiConfiguration.CpsProperties, DmiConfiguration.SdncProperties]) +class DmiConfigurationSpec extends Specification { + + @Autowired + DmiConfiguration.CpsProperties cpsProperties + + @Autowired + DmiConfiguration.SdncProperties sdncProperties + + def 'CPS properties configuration.'() { + expect: 'CPS properties are set to values in test configuration yaml file' + cpsProperties.baseUrl == 'some url for cps' + cpsProperties.dmiRegistrationUrl == 'some registration url' + cpsProperties.authUsername == 'some cps core user' + cpsProperties.authPassword == 'some cps core password' + } + + def 'SDNC properties configuration.'() { + expect: 'SDNC properties are set to values in test configuration yaml file' + sdncProperties.authUsername == 'test' + sdncProperties.authPassword == 'test' + sdncProperties.baseUrl == 'http://test' + sdncProperties.topologyId == 'test-topology' + } + + def 'Rest template building.'() { + given: 'a DMI configuration' + DmiConfiguration objectUnderTest = new DmiConfiguration() + and: 'a rest template builder' + RestTemplateBuilder mockRestTemplateBuilder = Mock(RestTemplateBuilder) + when: 'rest template method is invoked' + objectUnderTest.restTemplate(mockRestTemplateBuilder) + then: 'DMI configuration uses the build method on the template builder' + 1 * mockRestTemplateBuilder.build() + } + +} diff --git a/src/test/groovy/org/onap/cps/ncmp/dmi/config/DmiPluginConfigSpec.groovy b/src/test/groovy/org/onap/cps/ncmp/dmi/config/DmiPluginConfigSpec.groovy new file mode 100644 index 00000000..64b82329 --- /dev/null +++ b/src/test/groovy/org/onap/cps/ncmp/dmi/config/DmiPluginConfigSpec.groovy @@ -0,0 +1,52 @@ +/* + * ============LICENSE_START======================================================= + * 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. + * 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.dmi.config + +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.boot.test.context.SpringBootTest +import org.springframework.test.context.ContextConfiguration +import spock.lang.Specification +import springfox.documentation.spring.web.plugins.Docket + +@SpringBootTest +@ContextConfiguration(classes = [DmiPluginConfig.DmiPluginProperties]) +class DmiPluginConfigSpec extends Specification { + + @Autowired + DmiPluginConfig.DmiPluginProperties dmiPluginProperties + + def 'DMI plugin properties configuration.'() { + expect: 'DMI plugin properties are set to values in test configuration yaml file' + dmiPluginProperties.dmiServiceUrl == 'some url for the dmi service' + } + + def 'DMI plugin docket creation.'() { + given: 'a DMI plugin configuration' + DmiPluginConfig objectUnderTest = new DmiPluginConfig() + when: 'the api method is invoked' + def result = objectUnderTest.api() + then: 'a spring web plugin docket is returned' + result instanceof Docket + and: 'it is named "dmi-plugin-docket"' + result.groupName == 'dmi-plugin-docket' + } + +} diff --git a/src/test/groovy/org/onap/cps/ncmp/dmi/model/ModuleSchemaPropertiesSpec.groovy b/src/test/groovy/org/onap/cps/ncmp/dmi/model/ModuleSchemaPropertiesSpec.groovy new file mode 100644 index 00000000..51dddc7d --- /dev/null +++ b/src/test/groovy/org/onap/cps/ncmp/dmi/model/ModuleSchemaPropertiesSpec.groovy @@ -0,0 +1,41 @@ +/* + * ============LICENSE_START======================================================= + * 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. + * 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.dmi.model + +import org.onap.cps.ncmp.dmi.service.model.ModuleSchemaProperties +import spock.lang.Specification + +class ModuleSchemaPropertiesSpec extends Specification { + def objectUnderTest = new ModuleSchemaProperties(identifier:'some id', + version:'some version', + format:'some format', + namespace:'some namespace', + location: ['some','locations']) + + def 'Reading all properties.'() { + expect: 'all properties return the expected values' + objectUnderTest.identifier == 'some id' + objectUnderTest.version == 'some version' + objectUnderTest.format == 'some format' + objectUnderTest.namespace == 'some namespace' + objectUnderTest.location == ['some','locations'] + } +} diff --git a/src/test/groovy/org/onap/cps/ncmp/dmi/rest/controller/DmiRestControllerSpec.groovy b/src/test/groovy/org/onap/cps/ncmp/dmi/rest/controller/DmiRestControllerSpec.groovy index 9c27dc1b..8aebbca2 100644 --- a/src/test/groovy/org/onap/cps/ncmp/dmi/rest/controller/DmiRestControllerSpec.groovy +++ b/src/test/groovy/org/onap/cps/ncmp/dmi/rest/controller/DmiRestControllerSpec.groovy @@ -26,8 +26,8 @@ import org.onap.cps.ncmp.dmi.TestUtils import org.onap.cps.ncmp.dmi.exception.DmiException import org.onap.cps.ncmp.dmi.exception.ModuleResourceNotFoundException import org.onap.cps.ncmp.dmi.exception.ModulesNotFoundException -import org.onap.cps.ncmp.dmi.model.ModuleReference -import org.onap.cps.ncmp.dmi.model.ModuleSchemaList +import org.onap.cps.ncmp.dmi.service.model.ModuleReference +import org.onap.cps.ncmp.dmi.service.model.ModuleSchemaList import org.onap.cps.ncmp.dmi.model.ModuleSet import org.onap.cps.ncmp.dmi.model.ModuleSetSchemas import org.onap.cps.ncmp.dmi.model.YangResource @@ -151,7 +151,7 @@ class DmiRestControllerSpec extends Specification { def 'Retrieve module resources.'() { given: 'an endpoint and json data' def getModulesEndpoint = "$basePathV1/ch/some-cm-handle/moduleResources" - def jsonData = TestUtils.getResourceFileContent('GetModules.json') + String jsonData = getJsonDataForGetModules('read') and: 'the DMI service returns the yang resources' ModuleReference moduleReference1 = new ModuleReference(name: 'ietf-yang-library', revision: '2016-06-21') ModuleReference moduleReference2 = new ModuleReference(name: 'nc-notifications', revision: '2008-07-14') @@ -170,10 +170,22 @@ class DmiRestControllerSpec extends Specification { response.getContentAsString() == '[{"yangSource":"\\"some-data\\"","moduleName":"NAME","revision":"REVISION"}]' } + def 'Retrieve module resources with invalid operation.'() { + given: 'an endpoint and json data with invalid operation value' + def getModulesEndpoint = "$basePathV1/ch/some-cm-handle/moduleResources" + def jsonData = getJsonDataForGetModules('invalid operation') + when: 'get module resource api is invoked' + def response = mvc.perform(post(getModulesEndpoint) + .contentType(MediaType.APPLICATION_JSON) + .content(jsonData)).andReturn().response + then: 'a conflict status is returned' + response.status == HttpStatus.CONFLICT.value() + } + def 'Retrieve module resources with exception handling.'() { given: 'an endpoint and json data' def getModulesEndpoint = "$basePathV1/ch/some-cm-handle/moduleResources" - def jsonData = TestUtils.getResourceFileContent('GetModules.json') + String jsonData = getJsonDataForGetModules('read') and: 'the service method is invoked to get module resources and throws an exception' mockDmiService.getModuleResources('some-cm-handle', _) >> { throw Mock(ModuleResourceNotFoundException.class) } when: 'get module resource api is invoked' @@ -248,4 +260,10 @@ class DmiRestControllerSpec extends Specification { 5, ['prop1':'value1', 'prop2':'value2']) } -} \ No newline at end of file + + def getJsonDataForGetModules(operation) { + def jsonData = TestUtils.getResourceFileContent('GetModules.json') + return jsonData.replace('${operation-for-test}', operation) + } + +} diff --git a/src/test/groovy/org/onap/cps/ncmp/dmi/service/DmiServiceImplSpec.groovy b/src/test/groovy/org/onap/cps/ncmp/dmi/service/DmiServiceImplSpec.groovy index 93bc641e..4c6bc750 100644 --- a/src/test/groovy/org/onap/cps/ncmp/dmi/service/DmiServiceImplSpec.groovy +++ b/src/test/groovy/org/onap/cps/ncmp/dmi/service/DmiServiceImplSpec.groovy @@ -22,6 +22,7 @@ package org.onap.cps.ncmp.dmi.service import com.fasterxml.jackson.core.JsonProcessingException import com.fasterxml.jackson.databind.ObjectMapper +import com.fasterxml.jackson.databind.ObjectWriter import org.onap.cps.ncmp.dmi.TestUtils import org.onap.cps.ncmp.dmi.config.DmiPluginConfig import org.onap.cps.ncmp.dmi.exception.CmHandleRegistrationException @@ -29,7 +30,7 @@ import org.onap.cps.ncmp.dmi.exception.DmiException import org.onap.cps.ncmp.dmi.exception.ModuleResourceNotFoundException import org.onap.cps.ncmp.dmi.exception.ModulesNotFoundException import org.onap.cps.ncmp.dmi.exception.ResourceDataNotFound -import org.onap.cps.ncmp.dmi.model.ModuleReference +import org.onap.cps.ncmp.dmi.service.model.ModuleReference import org.onap.cps.ncmp.dmi.model.YangResource import org.onap.cps.ncmp.dmi.model.YangResources import org.onap.cps.ncmp.dmi.service.client.NcmpRestClient @@ -43,10 +44,10 @@ class DmiServiceImplSpec extends Specification { def mockNcmpRestClient = Mock(NcmpRestClient) def mockDmiPluginProperties = Mock(DmiPluginConfig.DmiPluginProperties) - def objectMapper = new ObjectMapper() + def spyObjectMapper = Spy(ObjectMapper) def mockObjectMapper = Mock(ObjectMapper) def mockSdncOperations = Mock(SdncOperations) - def objectUnderTest = new DmiServiceImpl(mockDmiPluginProperties, mockNcmpRestClient, mockSdncOperations, objectMapper) + def objectUnderTest = new DmiServiceImpl(mockDmiPluginProperties, mockNcmpRestClient, mockSdncOperations, spyObjectMapper) def 'Call get modules for cm-handle on dmi Service.'() { given: 'cm handle id' @@ -175,17 +176,35 @@ class DmiServiceImplSpec extends Specification { def 'Get module resources when sdnc returns #scenario response.'() { given: 'get module schema is invoked and returns a response from sdnc' - mockSdncOperations.getModuleResource(_ as String, _ as String) >> new ResponseEntity('some-response-body', httpResponse) + mockSdncOperations.getModuleResource(_ as String, _ as String) >> new ResponseEntity('some-response-body', httpStatus) when: 'get module resources is invoked with the given cm handle and a module list' objectUnderTest.getModuleResources('some-cmHandle', [new ModuleReference()] as LinkedList) - then: 'ModuleResourceNotFoundException is thrown' - thrown(exception) + then: '#expectedException is thrown' + thrown(expectedException) where: 'the following values are returned' - scenario | httpResponse || exception + scenario | httpStatus || expectedException 'not found' | HttpStatus.NOT_FOUND || ModuleResourceNotFoundException 'a internal server' | HttpStatus.INTERNAL_SERVER_ERROR || DmiException } + def 'Get module resources with JSON processing exception.'() { + given: 'a json processing exception during conversion' + def mockObjectWriter = Mock(ObjectWriter) + spyObjectMapper.writer() >> mockObjectWriter + mockObjectWriter.withRootName(_) >> mockObjectWriter + def jsonProcessingException = new JsonProcessingException('') + mockObjectWriter.writeValueAsString(_) >> { throw jsonProcessingException } + when: 'get module resources is invoked with the given cm handle and a module list' + objectUnderTest.getModuleResources('some-cmHandle', [new ModuleReference()] as LinkedList) + then: 'a DMI exception is thrown' + def thrownException = thrown(DmiException.class) + and: 'the exception has the expected message and details' + thrownException.message == 'Unable to process JSON.' + thrownException.details == 'JSON exception occurred when creating the module request.' + and: 'the cause is the original json processing exception' + thrownException.cause == jsonProcessingException + } + def 'Get resource data for pass through operational from cm handle.'() { given: 'cm-handle, pass through parameter, resourceId, accept header, fields, depth' def cmHandle = 'testCmHandle' @@ -278,4 +297,4 @@ class DmiServiceImplSpec extends Specification { then: 'a dmi exception is thrown' thrown(DmiException.class) } -} \ No newline at end of file +} diff --git a/src/test/groovy/org/onap/cps/ncmp/dmi/service/operation/SdncOperationsSpec.groovy b/src/test/groovy/org/onap/cps/ncmp/dmi/service/operation/SdncOperationsSpec.groovy index 14a62ebb..95a9c0a7 100644 --- a/src/test/groovy/org/onap/cps/ncmp/dmi/service/operation/SdncOperationsSpec.groovy +++ b/src/test/groovy/org/onap/cps/ncmp/dmi/service/operation/SdncOperationsSpec.groovy @@ -77,4 +77,4 @@ class SdncOperationsSpec extends Specification { then: 'the post operation is executed with the correct URL and data' 1 * mockSdncRestClient.postOperationWithJsonData(expectedUrl, 'requestData', _ as HttpHeaders) } -} \ No newline at end of file +} diff --git a/src/test/resources/GetModules.json b/src/test/resources/GetModules.json index 23fe77c2..98e41672 100644 --- a/src/test/resources/GetModules.json +++ b/src/test/resources/GetModules.json @@ -1,5 +1,5 @@ { - "operation": "read", + "operation": "${operation-for-test}", "data": { "modules": [ { @@ -15,4 +15,4 @@ "cmHandleProperties": { "subsystemId": "system-001" } -} \ No newline at end of file +} diff --git a/src/test/resources/application.yml b/src/test/resources/application.yml index e8ca3d01..dc30c9da 100644 --- a/src/test/resources/application.yml +++ b/src/test/resources/application.yml @@ -31,3 +31,15 @@ sdnc: auth: username: test password: test + +cps-core: + baseUrl: some url for cps + dmiRegistrationUrl: some registration url + auth: + username: some cps core user + password: some cps core password + +dmi: + service: + url: some url for the dmi service + -- cgit 1.2.3-korg