2 * ============LICENSE_START=======================================================
3 * Copyright (C) 2024 Nordix Foundation
4 * ================================================================================
5 * Licensed under the Apache License, Version 2.0 (the 'License');
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an 'AS IS' BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
17 * SPDX-License-Identifier: Apache-2.0
18 * ============LICENSE_END=========================================================
21 package org.onap.cps.integration.functional
23 import org.onap.cps.integration.base.CpsIntegrationSpecBase
24 import org.springframework.http.MediaType
25 import spock.util.concurrent.PollingConditions
26 import static org.hamcrest.Matchers.containsInAnyOrder
27 import static org.hamcrest.Matchers.hasSize
28 import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get
29 import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post
30 import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath
31 import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status
33 class NcmpRestApiSpec extends CpsIntegrationSpecBase {
35 static final MODULE_REFERENCES_RESPONSE_A = readResourceDataFile('mock-dmi-responses/bookStoreAWithModules_M1_M2_Response.json')
36 static final MODULE_RESOURCES_RESPONSE_A = readResourceDataFile('mock-dmi-responses/bookStoreAWithModules_M1_M2_ResourcesResponse.json')
37 static final MODULE_REFERENCES_RESPONSE_B = readResourceDataFile('mock-dmi-responses/bookStoreBWithModules_M1_M3_Response.json')
38 static final MODULE_RESOURCES_RESPONSE_B = readResourceDataFile('mock-dmi-responses/bookStoreBWithModules_M1_M3_ResourcesResponse.json')
41 mockDmiWillRespondToHealthChecks(DMI_URL)
44 def 'Register CM Handles using REST API.'() {
45 given: 'DMI will return modules'
46 mockDmiResponsesForModuleSync(DMI_URL, 'ch-1', MODULE_REFERENCES_RESPONSE_A, MODULE_RESOURCES_RESPONSE_A)
47 mockDmiResponsesForModuleSync(DMI_URL, 'ch-2', MODULE_REFERENCES_RESPONSE_A, MODULE_RESOURCES_RESPONSE_A)
48 mockDmiResponsesForModuleSync(DMI_URL, 'ch-3', MODULE_REFERENCES_RESPONSE_B, MODULE_RESOURCES_RESPONSE_B)
49 and: 'a POST request is made to register the CM Handles'
50 def requestBody = '{"dmiPlugin":"'+DMI_URL+'","createdCmHandles":[{"cmHandle":"ch-1"},{"cmHandle":"ch-2"},{"cmHandle":"ch-3"}]}'
51 mvc.perform(post('/ncmpInventory/v1/ch').contentType(MediaType.APPLICATION_JSON).content(requestBody))
52 .andExpect(status().is2xxSuccessful())
53 when: 'module sync runs'
54 moduleSyncWatchdog.moduleSyncAdvisedCmHandles()
55 then: 'CM-handles go to READY state'
56 new PollingConditions(timeout: 3, delay: 0.5).eventually {
57 mvc.perform(get('/ncmp/v1/ch/ch-1'))
58 .andExpect(status().isOk())
59 .andExpect(jsonPath('$.state.cmHandleState').value('READY'))
63 def 'Search for CM Handles by module using REST API.'() {
64 given: 'a JSON request body containing search parameter'
65 def requestBodyWithModuleCondition = """{
66 "cmHandleQueryParameters": [
68 "conditionName": "hasAllModules",
69 "conditionParameters": [ {"moduleName": "%s"} ]
72 }""".formatted(moduleName)
73 expect: "a search for module ${moduleName} returns expected CM handles"
74 mvc.perform(post(DMI_URL+'/ncmp/v1/ch/id-searches').contentType(MediaType.APPLICATION_JSON).content(requestBodyWithModuleCondition))
75 .andExpect(status().is2xxSuccessful())
76 .andExpect(jsonPath('$[*]', containsInAnyOrder(expectedCmHandles.toArray())))
77 .andExpect(jsonPath('$', hasSize(expectedCmHandles.size())));
79 moduleName || expectedCmHandles
80 'M1' || ['ch-1', 'ch-2', 'ch-3']
81 'M2' || ['ch-1', 'ch-2']
85 def 'De-register CM handles using REST API.'() {
86 when: 'a POST request is made to deregister the CM Handle'
87 def requestBody = '{"dmiPlugin":"'+DMI_URL+'", "removedCmHandles": ["ch-1", "ch-2", "ch-3"]}'
88 mvc.perform(post('/ncmpInventory/v1/ch').contentType(MediaType.APPLICATION_JSON).content(requestBody))
89 .andExpect(status().is2xxSuccessful())
90 then: 'the CM handles are not found using GET'
92 mvc.perform(get('/ncmp/v1/ch/ch-'+it)).andExpect(status().is4xxClientError())