aboutsummaryrefslogtreecommitdiffstats
path: root/src/test/groovy/org/onap/cps/temporal/controller/event/listener/kafka/DataUpdatedEventListenerSpec.groovy
blob: 055147fb8c4388d15fe1dbdac76379bd193b9167 (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
/*
 * ============LICENSE_START=======================================================
 * Copyright (c) 2021 Bell Canada.
 * ================================================================================
 * 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.
 * ============LICENSE_END=========================================================
 */

package org.onap.cps.temporal.controller.event.listener.kafka

import org.mapstruct.factory.Mappers
import org.onap.cps.event.model.CpsDataUpdatedEvent
import org.onap.cps.temporal.controller.event.listener.exception.InvalidEventEnvelopException
import org.onap.cps.temporal.controller.event.model.CpsDataUpdatedEventMapper
import org.onap.cps.temporal.service.NetworkDataService
import spock.lang.Specification

import static org.onap.cps.temporal.controller.event.listener.exception.InvalidEventEnvelopException.InvalidField.ErrorType.MISSING
import static org.onap.cps.temporal.controller.event.listener.exception.InvalidEventEnvelopException.InvalidField.ErrorType.UNEXPECTED

/**
 * Test specification for data updated event listener.
 */
class DataUpdatedEventListenerSpec extends Specification {

    public static final String EXPECTED_SCHEMA_EXCEPTION_MESSAGE = 'urn:cps:org.onap.cps:data-updated-event-schema:v99'

    // Define event data
    def anEventType = 'my-event-type'
    def anEventSchema = new URI('my-event-schema')
    def anEventSource = new URI('my-event-source')
    def aTimestamp = EventFixtures.currentIsoTimestamp()
    def aDataspace = 'my-dataspace'
    def aSchemaSet = 'my-schema-set'
    def anAnchor = 'my-anchor'
    def aDataName = 'my-data-name'
    def aDataValue = 'my-data-value'

    // Define service mock
    def mockService = Mock(NetworkDataService)

    // Define mapper
    def mapper = Mappers.getMapper(CpsDataUpdatedEventMapper.class)

    // Define listener under test
    def objectUnderTest = new DataUpdatedEventListener(mockService, mapper)

    def 'Event message consumption'() {
        when: 'an event is received'
            def event =
                    EventFixtures.buildEvent(
                            timestamp: aTimestamp, dataspace: aDataspace, schemaSet: aSchemaSet, anchor: anAnchor,
                            dataName: aDataName, dataValue: aDataValue)
            objectUnderTest.consume(event)
        then: 'network data service is requested to persisted the data change'
            1 * mockService.addNetworkData(
                    {
                        it.getObservedTimestamp() == EventFixtures.toOffsetDateTime(aTimestamp)
                        && it.getDataspace() == aDataspace
                        && it.getSchemaSet() == aSchemaSet
                        && it.getAnchor() == anAnchor
                        && it.getPayload() == String.format('{"%s":"%s"}', aDataName, aDataValue)
                        && it.getCreatedTimestamp() == null
                    }
            )
    }

    def 'Event message consumption fails because of missing envelop'() {
        when: 'an event without envelop information is received'
            def invalidEvent = new CpsDataUpdatedEvent().withSchema(null)
            objectUnderTest.consume(invalidEvent)
        then: 'an exception is thrown with 4 invalid fields'
            def e = thrown(InvalidEventEnvelopException)
            e.getCpsDataUpdatedEvent() == invalidEvent
            e.getInvalidFields().size() == 4
            e.getInvalidFields().contains(
                    new InvalidEventEnvelopException.InvalidField(
                            UNEXPECTED,"schema", null, EXPECTED_SCHEMA_EXCEPTION_MESSAGE))
            e.getInvalidFields().contains(
                    new InvalidEventEnvelopException.InvalidField(
                            MISSING, "id", null, null))
            e.getInvalidFields().contains(
                    new InvalidEventEnvelopException.InvalidField(
                            UNEXPECTED, "source", null, EventFixtures.defaultEventSource.toString()))
            e.getInvalidFields().contains(
                    new InvalidEventEnvelopException.InvalidField(
                            UNEXPECTED, "type", null, EventFixtures.defaultEventType))
            e.getMessage().contains(e.getInvalidFields().toString())
    }

    def 'Event message consumption fails because of invalid envelop'() {
        when: 'an event with an invalid envelop is received'
            def invalidEvent =
                    new CpsDataUpdatedEvent()
                            .withId('my-id')
                            .withSchema(anEventSchema)
                            .withSource(anEventSource)
                            .withType(anEventType)
            objectUnderTest.consume(invalidEvent)
        then: 'an exception is thrown with 2 invalid fields'
            def e = thrown(InvalidEventEnvelopException)
            e.getCpsDataUpdatedEvent() == invalidEvent
            e.getInvalidFields().size() == 3
            e.getInvalidFields().contains(
                    new InvalidEventEnvelopException.InvalidField(
                            UNEXPECTED, "schema", anEventSchema.toString(),
                            EXPECTED_SCHEMA_EXCEPTION_MESSAGE))
            e.getInvalidFields().contains(
                    new InvalidEventEnvelopException.InvalidField(
                            UNEXPECTED, "type", anEventType, EventFixtures.defaultEventType))
            e.getInvalidFields().contains(
                    new InvalidEventEnvelopException.InvalidField(
                            UNEXPECTED, "source", anEventSource.toString(),
                            EventFixtures.defaultEventSource.toString()))
    }

}