NcmpCloudEventBuilder refactoring
[cps.git] / integration-test / src / test / groovy / org / onap / cps / integration / functional / NcmpRestApiSpec.groovy
1 /*
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
8  *
9  *        http://www.apache.org/licenses/LICENSE-2.0
10  *
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.
16  *
17  *  SPDX-License-Identifier: Apache-2.0
18  *  ============LICENSE_END=========================================================
19  */
20
21 package org.onap.cps.integration.functional
22
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
32
33 class NcmpRestApiSpec extends CpsIntegrationSpecBase {
34
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')
39
40     def setup() {
41         mockDmiWillRespondToHealthChecks(DMI_URL)
42     }
43
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'))
60             }
61     }
62
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": [
67                             {
68                                 "conditionName": "hasAllModules",
69                                 "conditionParameters": [ {"moduleName": "%s"} ]
70                             }
71                     ]
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())));
78         where:
79             moduleName || expectedCmHandles
80             'M1'       || ['ch-1', 'ch-2', 'ch-3']
81             'M2'       || ['ch-1', 'ch-2']
82             'M3'       || ['ch-3']
83     }
84
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'
91             (1..3).each {
92                 mvc.perform(get('/ncmp/v1/ch/ch-'+it)).andExpect(status().is4xxClientError())
93             }
94     }
95 }