X-Git-Url: https://gerrit.onap.org/r/gitweb?a=blobdiff_plain;f=cps-ncmp-service%2Fsrc%2Ftest%2Fgroovy%2Forg%2Fonap%2Fcps%2Fncmp%2Fapi%2Fimpl%2Fclient%2FDmiRestClientSpec.groovy;h=80c0a27bf703bbe76f0e1aa7feb67ff7fe33b726;hb=a01f8861a84931f4bdf2d69fa05a793afabc22e0;hp=bf6179ba1bedaaf76b7e1ffc3c5f5c5155fd4582;hpb=bd8ab2fc4737aebada59962baed8b35d4f86dd1c;p=cps.git diff --git a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/client/DmiRestClientSpec.groovy b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/client/DmiRestClientSpec.groovy index bf6179ba1..80c0a27bf 100644 --- a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/client/DmiRestClientSpec.groovy +++ b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/client/DmiRestClientSpec.groovy @@ -1,6 +1,7 @@ /* * ============LICENSE_START======================================================= - * Copyright (C) 2021 Nordix Foundation + * Copyright (C) 2021-2023 Nordix Foundation + * Modifications Copyright (C) 2022 Bell Canada * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,20 +21,31 @@ package org.onap.cps.ncmp.api.impl.client +import com.fasterxml.jackson.databind.JsonNode +import com.fasterxml.jackson.databind.ObjectMapper +import com.fasterxml.jackson.databind.node.ObjectNode import org.onap.cps.ncmp.api.impl.config.NcmpConfiguration +import org.onap.cps.ncmp.api.impl.exception.HttpClientRequestException +import org.onap.cps.ncmp.api.impl.trustlevel.dmiavailability.DmiPluginStatus +import org.onap.cps.ncmp.utils.TestUtils import org.spockframework.spring.SpringBean import org.springframework.beans.factory.annotation.Autowired import org.springframework.boot.test.context.SpringBootTest import org.springframework.http.HttpEntity import org.springframework.http.HttpHeaders -import org.springframework.http.HttpMethod +import org.springframework.http.HttpStatus import org.springframework.http.ResponseEntity import org.springframework.test.context.ContextConfiguration +import org.springframework.web.client.HttpServerErrorException import org.springframework.web.client.RestTemplate import spock.lang.Specification +import static org.onap.cps.ncmp.api.impl.operations.OperationType.READ +import static org.onap.cps.ncmp.api.impl.operations.OperationType.PATCH +import static org.onap.cps.ncmp.api.impl.operations.OperationType.CREATE + @SpringBootTest -@ContextConfiguration(classes = [NcmpConfiguration.DmiProperties, DmiRestClient]) +@ContextConfiguration(classes = [NcmpConfiguration.DmiProperties, DmiRestClient, ObjectMapper]) class DmiRestClientSpec extends Specification { @SpringBean @@ -42,28 +54,85 @@ class DmiRestClientSpec extends Specification { @Autowired DmiRestClient objectUnderTest - def 'DMI PUT operation.'() { - given: 'a PUT url' - def getResourceDataUrl = 'http://some-uri/getResourceDataUrl' - and: 'the rest template returns a valid response entity' - def mockResponseEntity = Mock(ResponseEntity) - mockRestTemplate.exchange(getResourceDataUrl, HttpMethod.PUT, _ as HttpEntity, Object.class) >> mockResponseEntity - when: 'PUT operation is invoked' - def result = objectUnderTest.putOperationWithJsonData(getResourceDataUrl, 'json-data', new HttpHeaders()) - then: 'the output of the method is equal to the output from the test template' - result == mockResponseEntity + @Autowired + ObjectMapper objectMapper + + def resourceUrl = 'some url' + def mockResponseEntity = Mock(ResponseEntity) + def dmiProperties = new NcmpConfiguration.DmiProperties() + + def setup() { + dmiProperties.authUsername = 'test user' + dmiProperties.authPassword = 'test pass' + dmiProperties.dmiBasePath = 'dmi' } - def 'DMI POST operation.'() { - given: 'a POST url' - def getResourceDataUrl = 'http://some-uri/createResourceDataUrl' - and: 'the rest template returns a valid response entity' - def mockResponseEntity = Mock(ResponseEntity) - mockRestTemplate.postForEntity(getResourceDataUrl, _ as HttpEntity, String.class) >> mockResponseEntity + def 'DMI POST operation with JSON.'() { + given: 'the rest template returns a valid response entity' + mockRestTemplate.postForEntity(resourceUrl, _ as HttpEntity, Object.class) >> mockResponseEntity when: 'POST operation is invoked' - def result = objectUnderTest.postOperationWithJsonData(getResourceDataUrl, 'json-data', new HttpHeaders()) + def result = objectUnderTest.postOperationWithJsonData(resourceUrl, 'json-data', READ) then: 'the output of the method is equal to the output from the test template' result == mockResponseEntity } + def 'Failing DMI POST operation.'() { + given: 'the rest template returns a valid response entity' + def serverResponse = 'server response'.getBytes() + def httpServerErrorException = new HttpServerErrorException(HttpStatus.FORBIDDEN, 'status text', serverResponse, null) + mockRestTemplate.postForEntity(*_) >> { throw httpServerErrorException } + when: 'POST operation is invoked' + def result = objectUnderTest.postOperationWithJsonData('some url', 'some json', operation) + then: 'a Http Client Exception is thrown' + def thrown = thrown(HttpClientRequestException) + and: 'the exception has the relevant details from the error response' + assert thrown.httpStatus == 403 + assert thrown.message == "Unable to ${operation} resource data." + assert thrown.details == 'server response' + where: 'the following operation is executed' + operation << [CREATE, READ, PATCH] + } + + def 'Get dmi plugin health status #scenario'() { + given: 'a health check response data as jsonNode' + def dmiPluginHealthCheckResponseJsonData = TestUtils.getResourceFileContent('dmiPluginHealthCheckResponse.json') + def jsonNode = objectMapper.readValue(dmiPluginHealthCheckResponseJsonData, JsonNode.class) + ((ObjectNode) jsonNode).put('status', dmiAliveness); + and: 'the rest template return a valid json node' + mockRestTemplate.getForObject(*_) >> {jsonNode} + when: 'get aliveness of the dmi plugin' + def result = objectUnderTest.getDmiPluginStatus(resourceUrl) + then: 'return value is equal to result of rest template call' + result == expectedResult + where: 'the following dmi aliveness are being used' + scenario | dmiAliveness || expectedResult + 'dmi plugin is UP' | 'UP' || DmiPluginStatus.UP + 'dmi plugin is DOWN' | 'DOWN' || DmiPluginStatus.DOWN + } + + def 'Failing to get dmi plugin health status #scenario'() { + given: 'the rest template return null' + mockRestTemplate.getForObject(*_) >> {getResponse} + when: 'get aliveness of the dmi plugin' + def result = objectUnderTest.getDmiPluginStatus(resourceUrl) + then: 'return value is equal to result of rest template call' + result == expectedResult + where: 'the following dmi responses are being used' + scenario | getResponse || expectedResult + 'get response is null' | null || DmiPluginStatus.DOWN + 'get response throws exception' | {throw new Exception()} || DmiPluginStatus.DOWN + } + + def 'Basic auth header #scenario'() { + when: 'Specific dmi properties are provided' + dmiProperties.dmiBasicAuthEnabled = authEnabled + objectUnderTest.dmiProperties = dmiProperties + then: 'http headers to conditionally have Authorization header' + assert (objectUnderTest.configureHttpHeaders(new HttpHeaders()).get('Authorization') != null) == isPresentInHttpHeader + where: 'the following configurations are used' + scenario | authEnabled || isPresentInHttpHeader + 'auth enabled' | true || true + 'auth disabled' | false || false + } + }