aboutsummaryrefslogtreecommitdiffstats
path: root/cps-service/src/test/groovy/org/onap/cps/api/impl/CpsAnchorServiceImplSpec.groovy
blob: c7865386bc6f779879fc47263efa405381e34518 (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
142
143
144
145
146
147
148
149
150
151
152
/*
 * ============LICENSE_START=======================================================
 *  Copyright (C) 2023 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.api.impl

import org.onap.cps.spi.CpsAdminPersistenceService
import org.onap.cps.spi.CpsDataPersistenceService
import org.onap.cps.spi.exceptions.ModuleNamesNotFoundException
import org.onap.cps.spi.model.Anchor
import org.onap.cps.spi.utils.CpsValidator
import spock.lang.Specification

class CpsAnchorServiceImplSpec extends Specification {

    def mockCpsAdminPersistenceService = Mock(CpsAdminPersistenceService)
    def mockCpsDataPersistenceService = Mock(CpsDataPersistenceService)
    def mockCpsValidator = Mock(CpsValidator)

    def objectUnderTest = new CpsAnchorServiceImpl(mockCpsAdminPersistenceService, mockCpsDataPersistenceService, mockCpsValidator)

    def 'Create anchor method invokes persistence service.'() {
        when: 'create anchor method is invoked'
            objectUnderTest.createAnchor('someDataspace', 'someSchemaSet', 'someAnchorName')
        then: 'the persistence service method is invoked with same parameters'
            1 * mockCpsAdminPersistenceService.createAnchor('someDataspace', 'someSchemaSet', 'someAnchorName')
        and: 'the CpsValidator is called on the dataspaceName, schemaSetName and anchorName'
            1 * mockCpsValidator.validateNameCharacters('someDataspace', 'someSchemaSet', 'someAnchorName')
    }

    def 'Retrieve all anchors for dataspace.'() {
        given: 'that an anchor is associated with the dataspace'
            def anchors = [new Anchor()]
            mockCpsAdminPersistenceService.getAnchors('someDataspace') >> anchors
        when: 'get Anchors is called for a dataspace name'
            def result = objectUnderTest.getAnchors('someDataspace')
        then: 'the collection provided by persistence service is returned as result'
            result == anchors
        and: 'the CpsValidator is called on the dataspaceName'
            1 * mockCpsValidator.validateNameCharacters('someDataspace')
    }

    def 'Retrieve all anchors for schema-set.'() {
        given: 'that anchor is associated with the dataspace and schemaset'
            def anchors = [new Anchor()]
            mockCpsAdminPersistenceService.getAnchors('someDataspace', 'someSchemaSet') >> anchors
        when: 'get anchors is called for a dataspace name and schema set name'
            def result = objectUnderTest.getAnchors('someDataspace', 'someSchemaSet')
        then: 'the collection provided by persistence service is returned as result'
            result == anchors
        and: 'the CpsValidator is called on the dataspaceName, schemaSetName'
            1 * mockCpsValidator.validateNameCharacters('someDataspace', 'someSchemaSet')
    }

    def 'Retrieve all anchors for multiple schema-sets.'() {
        given: 'that anchor is associated with the dataspace and schemasets'
            def anchors = [new Anchor(), new Anchor()]
            mockCpsAdminPersistenceService.getAnchors('someDataspace', _ as Collection<String>) >> anchors
        when: 'get anchors is called for a dataspace name and schema set names'
            def result = objectUnderTest.getAnchors('someDataspace', ['schemaSet1', 'schemaSet2'])
        then: 'the collection provided by persistence service is returned as result'
            result == anchors
        and: 'the CpsValidator is called on the dataspace name and schema-set names'
            1 * mockCpsValidator.validateNameCharacters('someDataspace')
            1 * mockCpsValidator.validateNameCharacters(_)
    }

    def 'Retrieve anchor for dataspace and provided anchor name.'() {
        given: 'that anchor name is associated with the dataspace'
            Anchor anchor = new Anchor()
            mockCpsAdminPersistenceService.getAnchor('someDataspace','someAnchor') >>  anchor
        when: 'get anchor is called for a dataspace name and anchor name'
            def result = objectUnderTest.getAnchor('someDataspace','someAnchor')
        then: 'the anchor provided by persistence service is returned as result'
            result == anchor
        and: 'the CpsValidator is called on the dataspaceName, anchorName'
            1 * mockCpsValidator.validateNameCharacters('someDataspace', 'someAnchor')
    }

    def 'Delete anchor.'() {
        when: 'delete anchor is invoked'
            objectUnderTest.deleteAnchor('someDataspace','someAnchor')
        then: 'delete data nodes is invoked on the data service with expected parameters'
            1 * mockCpsDataPersistenceService.deleteDataNodes('someDataspace','someAnchor')
        and: 'the persistence service method is invoked with same parameters to delete anchor'
            1 * mockCpsAdminPersistenceService.deleteAnchor('someDataspace','someAnchor')
        and: 'the CpsValidator is called on the dataspaceName, anchorName'
            1 * mockCpsValidator.validateNameCharacters('someDataspace', 'someAnchor')
    }

    def 'Delete multiple anchors.'() {
        when: 'delete anchors is invoked'
            objectUnderTest.deleteAnchors('someDataspace', ['anchor1', 'anchor2'])
        then: 'delete data nodes is invoked on the data service with expected parameters'
            1 * mockCpsDataPersistenceService.deleteDataNodes('someDataspace', _ as Collection<String>)
        and: 'the persistence service method is invoked with same parameters to delete anchor'
            1 * mockCpsAdminPersistenceService.deleteAnchors('someDataspace',_ as Collection<String>)
        and: 'the CpsValidator is called on the dataspace name and anchor names'
            1 * mockCpsValidator.validateNameCharacters('someDataspace')
            1 * mockCpsValidator.validateNameCharacters(_)
    }

    def 'Query all anchor identifiers for a dataspace and module names.'() {
        given: 'the persistence service is invoked with the expected parameters and returns a list of anchors'
            mockCpsAdminPersistenceService.queryAnchorNames('some-dataspace-name', ['some-module-name']) >> ['some-anchor-identifier']
        when: 'query anchor names is called using a dataspace name and module name'
            def result = objectUnderTest.queryAnchorNames('some-dataspace-name', ['some-module-name'])
        then: 'get anchor identifiers returns the same anchor identifier returned by the persistence layer'
            result == ['some-anchor-identifier']
        and: 'the CpsValidator is called on the dataspaceName'
            1 * mockCpsValidator.validateNameCharacters('some-dataspace-name')
    }

    def 'Query all anchors with Module Names Not Found Exception in persistence layer.'() {
        given: 'the persistence layer throws a Module Names Not Found Exception'
            def originalException = new ModuleNamesNotFoundException('exception-ds', ['m1', 'm2'])
            mockCpsAdminPersistenceService.queryAnchorNames(*_) >> { throw originalException}
        when: 'attempt query anchors'
            objectUnderTest.queryAnchorNames('some-dataspace-name', [])
        then: 'the same exception is thrown (up)'
            def thrownUp = thrown(ModuleNamesNotFoundException)
            assert thrownUp == originalException
        and: 'the exception details contains the relevant data'
            assert thrownUp.details.contains('exception-ds')
            assert thrownUp.details.contains('m1')
            assert thrownUp.details.contains('m2')
    }

    def 'Update anchor schema set.'() {
        when: 'update anchor is invoked'
            objectUnderTest.updateAnchorSchemaSet('someDataspace', 'someAnchor', 'someSchemaSetName')
        then: 'associated persistence service method is invoked with correct parameter'
            1 * mockCpsAdminPersistenceService.updateAnchorSchemaSet('someDataspace', 'someAnchor', 'someSchemaSetName')
    }

}