Merge SW Upgrade Blueprint into PNF_AAI and create one UAT BP for PNF
[ccsdk/cds.git] / ms / blueprintsprocessor / application / src / test / kotlin / org / onap / ccsdk / cds / blueprintsprocessor / uat / utils / UatDefinition.kt
1 /*-
2  * ============LICENSE_START=======================================================
3  *  Copyright (C) 2019 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 package org.onap.ccsdk.cds.blueprintsprocessor.uat.utils
21
22 import com.fasterxml.jackson.annotation.JsonAlias
23 import com.fasterxml.jackson.annotation.JsonInclude
24 import com.fasterxml.jackson.databind.JsonNode
25 import com.fasterxml.jackson.databind.ObjectMapper
26 import com.fasterxml.jackson.databind.annotation.JsonDeserialize
27 import com.fasterxml.jackson.module.kotlin.convertValue
28 import org.yaml.snakeyaml.DumperOptions
29 import org.yaml.snakeyaml.Yaml
30 import org.yaml.snakeyaml.nodes.Tag
31
32 @JsonInclude(JsonInclude.Include.NON_EMPTY)
33 data class ProcessDefinition(
34     val name: String,
35     val request: JsonNode,
36     val expectedResponse: JsonNode? = null,
37     val responseNormalizerSpec: JsonNode? = null
38 )
39
40 @JsonInclude(JsonInclude.Include.NON_EMPTY)
41 data class RequestDefinition(
42     val method: String,
43     @JsonDeserialize(using = PathDeserializer::class)
44     val path: String,
45     val headers: Map<String, String> = emptyMap(),
46     val body: JsonNode? = null
47 )
48
49 @JsonInclude(JsonInclude.Include.NON_EMPTY)
50 data class ResponseDefinition(val status: Int = 200, val body: JsonNode? = null, val headers: Map<String, String> = mapOf("Content-Type" to "application/json")) {
51
52     companion object {
53         val DEFAULT_RESPONSES = listOf(ResponseDefinition())
54     }
55 }
56
57 @JsonInclude(JsonInclude.Include.NON_EMPTY)
58 class ExpectationDefinition(
59     val request: RequestDefinition,
60     response: ResponseDefinition?,
61     responses: List<ResponseDefinition>? = null,
62     val times: String = ">= 1"
63 ) {
64     val responses: List<ResponseDefinition> = resolveOneOrMany(response, responses, ResponseDefinition.DEFAULT_RESPONSES)
65
66     companion object {
67         fun <T> resolveOneOrMany(one: T?, many: List<T>?, defaultMany: List<T>): List<T> = when {
68             many != null -> many
69             one != null -> listOf(one)
70             else -> defaultMany
71         }
72     }
73 }
74
75 @JsonInclude(JsonInclude.Include.NON_EMPTY)
76 data class ServiceDefinition(val selector: String, val expectations: List<ExpectationDefinition>)
77
78 @JsonInclude(JsonInclude.Include.NON_EMPTY)
79 data class UatDefinition(
80     val processes: List<ProcessDefinition>,
81     @JsonAlias("external-services")
82     val externalServices: List<ServiceDefinition> = emptyList()
83 ) {
84
85     fun dump(mapper: ObjectMapper, excludedProperties: List<String> = emptyList()): String {
86         val uatAsMap: Map<String, Any> = mapper.convertValue(this)
87         if (excludedProperties.isNotEmpty()) {
88             pruneTree(uatAsMap, excludedProperties)
89         }
90         return Yaml().dumpAs(uatAsMap, Tag.MAP, DumperOptions.FlowStyle.BLOCK)
91     }
92
93     fun toBare(): UatDefinition {
94         val newProcesses = processes.map { p ->
95             ProcessDefinition(p.name, p.request, null, p.responseNormalizerSpec)
96         }
97         return UatDefinition(newProcesses)
98     }
99
100     private fun pruneTree(node: Any?, excludedProperties: List<String>) {
101         when (node) {
102             is MutableMap<*, *> -> {
103                 excludedProperties.forEach { key -> node.remove(key) }
104                 node.forEach { (_, value) -> pruneTree(value, excludedProperties) }
105             }
106             is List<*> -> node.forEach { value -> pruneTree(value, excludedProperties) }
107         }
108     }
109
110     companion object {
111         fun load(mapper: ObjectMapper, spec: String): UatDefinition =
112                 mapper.convertValue(Yaml().load(spec), UatDefinition::class.java)
113     }
114 }