aboutsummaryrefslogtreecommitdiffstats
path: root/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/events/cmsubscription/DmiCmNotificationSubscriptionCacheHandlerSpec.groovy
blob: 132c4bc4a7583515cac9b0a3e977cab4b4b6bc3e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
/*
 *  ============LICENSE_START=======================================================
 *  Copyright (C) 2024 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.api.impl.events.cmsubscription

import com.fasterxml.jackson.databind.ObjectMapper
import io.cloudevents.CloudEvent
import io.cloudevents.core.builder.CloudEventBuilder
import org.apache.kafka.clients.consumer.ConsumerRecord
import org.onap.cps.ncmp.api.impl.inventory.InventoryPersistence
import org.onap.cps.ncmp.api.impl.yangmodels.YangModelCmHandle
import org.onap.cps.ncmp.api.kafka.MessagingBaseSpec
import org.onap.cps.ncmp.events.cmnotificationsubscription_merge1_0_0.client_to_ncmp.CmNotificationSubscriptionNcmpInEvent
import org.onap.cps.ncmp.utils.TestUtils
import org.onap.cps.utils.JsonObjectMapper
import org.spockframework.spring.SpringBean
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.context.SpringBootTest

import static org.onap.cps.ncmp.api.impl.events.mapper.CloudEventMapper.toTargetEvent

@SpringBootTest(classes = [ObjectMapper, JsonObjectMapper])
class DmiCmNotificationSubscriptionCacheHandlerSpec extends MessagingBaseSpec {

    @Autowired
    JsonObjectMapper jsonObjectMapper
    @Autowired
    ObjectMapper objectMapper
    @SpringBean
    InventoryPersistence mockInventoryPersistence = Mock(InventoryPersistence)

    def testCache = [:]
    def objectUnderTest = new DmiCmNotificationSubscriptionCacheHandler(testCache, mockInventoryPersistence)

    CmNotificationSubscriptionNcmpInEvent cmNotificationSubscriptionNcmpInEvent
    def yangModelCmHandle1 = new YangModelCmHandle(id:'ch1',dmiServiceName:'dmi-1')
    def yangModelCmHandle2 = new YangModelCmHandle(id:'ch2',dmiServiceName:'dmi-2')
    def yangModelCmHandle3 = new YangModelCmHandle(id:'ch3',dmiServiceName:'dmi-1')
    def yangModelCmHandle4 = new YangModelCmHandle(id:'ch4',dmiServiceName:'dmi-2')

    def setup() {
        setUpTestEvent()
        initialiseMockInventoryPersistenceResponses()
    }

    def 'Load CM subscription event to cache'() {
        given: 'a valid subscription event with Id'
            def subscriptionId = cmNotificationSubscriptionNcmpInEvent.getData().getSubscriptionId();
        and: 'list of predicates'
            def predicates = cmNotificationSubscriptionNcmpInEvent.getData().getPredicates();
        when: 'a valid event object loaded in cache'
            objectUnderTest.add(subscriptionId, predicates)
        then: 'the cache contains the correct entry with #subscriptionId subscription ID'
            assert testCache.containsKey(subscriptionId)
    }

    def 'Create map for DMI cm notification subscription per DMI service name'() {
        given: 'list of predicates from the create subscription event'
            def predicates = cmNotificationSubscriptionNcmpInEvent.getData().getPredicates()
        when: 'method to create map of DMI cm notification subscription per DMI service name is called'
            def result = objectUnderTest.createDmiCmNotificationSubscriptionsPerDmi(predicates)
        then: 'the result size of resulting map is correct to the number of DMIs'
            assert result.size() == 2
        and: 'the cache objects per DMI exists'
            def resultMapForDmi1 = result.get('dmi-1')
            def resultMapForDmi2 = result.get('dmi-2')
            assert resultMapForDmi1 != null
            assert resultMapForDmi2 != null
        and: 'the size of predicates in each object is correct'
            assert resultMapForDmi1.dmiCmNotificationSubscriptionPredicates.size() == 2
            assert resultMapForDmi2.dmiCmNotificationSubscriptionPredicates.size() == 2
        and: 'the subscription status in each object is correct'
            assert resultMapForDmi1.cmNotificationSubscriptionStatus.toString() == 'PENDING'
            assert resultMapForDmi2.cmNotificationSubscriptionStatus.toString() == 'PENDING'
        and: 'the target cmHandles for each predicate is correct'
            assert resultMapForDmi1.dmiCmNotificationSubscriptionPredicates[0].targetCmHandleIds == ['ch1'].toSet()
            assert resultMapForDmi1.dmiCmNotificationSubscriptionPredicates[1].targetCmHandleIds == ['ch3'].toSet()

            assert resultMapForDmi2.dmiCmNotificationSubscriptionPredicates[0].targetCmHandleIds == ['ch2'].toSet()
            assert resultMapForDmi2.dmiCmNotificationSubscriptionPredicates[1].targetCmHandleIds == ['ch4'].toSet()
        and: 'the list of xpath for each is correct'
            assert resultMapForDmi1.dmiCmNotificationSubscriptionPredicates[0].xpaths
                    && resultMapForDmi2.dmiCmNotificationSubscriptionPredicates[0].xpaths == ['/x1/y1','x2/y2'].toSet()

            assert resultMapForDmi1.dmiCmNotificationSubscriptionPredicates[1].xpaths
                    && resultMapForDmi2.dmiCmNotificationSubscriptionPredicates[1].xpaths == ['/x3/y3','x4/y4'].toSet()
    }

    def 'Get map for cm handle IDs by DMI service name'() {
        given: 'the predicate from the test request CM subscription event'
            def targetFilter = cmNotificationSubscriptionNcmpInEvent.getData().getPredicates().get(0).getTargetFilter()
        when: 'the method to group all target CM handles by DMI service name is called'
            def mapOfCMHandleIDsByDmi = objectUnderTest.groupTargetCmHandleIdsByDmi(targetFilter)
        then: 'the size of the resulting map is correct'
            assert mapOfCMHandleIDsByDmi.size() == 2
        and: 'the values in the map is as expected'
            assert mapOfCMHandleIDsByDmi.get('dmi-1') == ['ch1'].toSet()
            assert mapOfCMHandleIDsByDmi.get('dmi-2') == ['ch2'].toSet()
    }

    def setUpTestEvent(){
        def jsonData = TestUtils.getResourceFileContent('cmSubscription/cmNotificationSubscriptionNcmpInEvent.json')
        def testEventSent = jsonObjectMapper.convertJsonString(jsonData, CmNotificationSubscriptionNcmpInEvent.class)
        def testCloudEventSent = CloudEventBuilder.v1()
                .withData(objectMapper.writeValueAsBytes(testEventSent))
                .withId('subscriptionCreated')
                .withType('subscriptionCreated')
                .withSource(URI.create('some-resource'))
                .withExtension('correlationid', 'test-cmhandle1').build()
        def consumerRecord = new ConsumerRecord<String, CloudEvent>('topic-name', 0, 0, 'event-key', testCloudEventSent)
        def cloudEvent = consumerRecord.value()

        cmNotificationSubscriptionNcmpInEvent = toTargetEvent(cloudEvent, CmNotificationSubscriptionNcmpInEvent.class);
    }

    def initialiseMockInventoryPersistenceResponses(){
        mockInventoryPersistence.getYangModelCmHandles(['ch1','ch2'])
                >> [yangModelCmHandle1, yangModelCmHandle2]

        mockInventoryPersistence.getYangModelCmHandles(['ch3','ch4'])
                >> [yangModelCmHandle3, yangModelCmHandle4]
    }

}