Enhancements for the aai-common library
[aai/aai-common.git] / aai-core / src / test / java / org / onap / aai / serialization / db / ImpliedDeleteUnitTest.java
1 /**
2  * ============LICENSE_START=======================================================
3  * org.onap.aai
4  * ================================================================================
5  * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
6  * ================================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *    http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ============LICENSE_END=========================================================
19  */
20 package org.onap.aai.serialization.db;
21
22 import org.apache.tinkerpop.gremlin.structure.Vertex;
23 import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerGraph;
24 import org.hamcrest.CoreMatchers;
25 import org.junit.Before;
26 import org.junit.Rule;
27 import org.junit.Test;
28 import org.mockito.Matchers;
29 import org.mockito.Mockito;
30 import org.onap.aai.exceptions.AAIException;
31 import org.onap.aai.introspection.Introspector;
32 import org.onap.aai.serialization.engines.TransactionalGraphEngine;
33 import org.onap.aai.serialization.engines.query.QueryEngine;
34 import org.onap.aai.util.AAIConstants;
35 import org.springframework.boot.test.rule.OutputCapture;
36
37 import java.io.UnsupportedEncodingException;
38 import java.util.ArrayList;
39 import java.util.List;
40
41 import static org.mockito.Matchers.eq;
42
43 public class ImpliedDeleteUnitTest {
44
45     private TransactionalGraphEngine mockEngine;
46     private DBSerializer mockSerializer;
47
48     private ImpliedDelete impliedDelete;
49
50     @Rule
51     public final OutputCapture outputCapture = new OutputCapture();
52
53     @Before
54     public void setup(){
55         mockEngine     = Mockito.mock(TransactionalGraphEngine.class);
56         mockSerializer = Mockito.mock(DBSerializer.class);
57         impliedDelete  = Mockito.spy(new ImpliedDelete(mockEngine, mockSerializer));
58     }
59
60     // aai.implied.delete.whitelist.sdnc=*
61     @Test
62     public void testImpliedDeleteWhenUserIsAllowedToInvokeAnyMethod() throws AAIException {
63
64         QueryEngine mockQueryEngine = Mockito.mock(QueryEngine.class);
65
66         Mockito
67             .doReturn("*")
68             .when(impliedDelete)
69             .get(AAIConstants.AAI_IMPLIED_DELETE_WHITELIST + "sdnc","");
70
71         Mockito.when(mockEngine.getQueryEngine()).thenReturn(mockQueryEngine);
72
73         TinkerGraph graph = TinkerGraph.open();
74
75         Vertex vserver = graph.addVertex("vertex");
76         vserver.property("vserver-id", "some-id");
77
78         Vertex volume = graph.addVertex("vertex");
79         volume.property("volume-id", "some-id");
80
81         List<Vertex> vertices = new ArrayList<>();
82         vertices.add(volume);
83
84         impliedDelete.execute(vserver.id(), "SDNC", "vserver", vertices);
85
86     }
87
88     // aai.implied.delete.whitelist.sdnc='vserver'
89     @Test
90     public void testImpliedDeleteWhenUserIsAllowedToInvokeCertainMethod() throws AAIException {
91
92         QueryEngine mockQueryEngine = Mockito.mock(QueryEngine.class);
93
94         Mockito
95             .doReturn("'vserver'")
96             .when(impliedDelete)
97             .get(AAIConstants.AAI_IMPLIED_DELETE_WHITELIST + "sdnc","");
98
99         Mockito.when(mockEngine.getQueryEngine()).thenReturn(mockQueryEngine);
100
101         TinkerGraph graph = TinkerGraph.open();
102
103         Vertex vserver = graph.addVertex("vertex");
104         vserver.property("vserver-id", "some-id");
105
106         Vertex volume = graph.addVertex("vertex");
107         volume.property("volume-id", "some-id");
108
109         List<Vertex> vertices = new ArrayList<>();
110         vertices.add(volume);
111
112         impliedDelete.execute(vserver.id(), "SDNC", "vserver", vertices);
113     }
114
115     // aai.implied.delete.whitelist.sdnc='vserver'
116     @Test
117     public void testImpliedDeleteWhenUserIsAllowedAndTryVariationsOfSOTValueSDNC() throws AAIException {
118
119         QueryEngine mockQueryEngine = Mockito.mock(QueryEngine.class);
120
121         Mockito
122             .doReturn("'vserver'")
123             .when(impliedDelete)
124             .get(AAIConstants.AAI_IMPLIED_DELETE_WHITELIST + "sdnc","");
125
126         Mockito.when(mockEngine.getQueryEngine()).thenReturn(mockQueryEngine);
127
128         TinkerGraph graph = TinkerGraph.open();
129
130         Vertex vserver = graph.addVertex("vertex");
131         vserver.property("vserver-id", "some-id");
132
133         Vertex volume = graph.addVertex("vertex");
134         volume.property("volume-id", "some-id");
135
136         List<Vertex> vertices = new ArrayList<>();
137         vertices.add(volume);
138
139         impliedDelete.execute(vserver.id(), "SDNC", "vserver", vertices);
140         impliedDelete.execute(vserver.id(), "sDNC", "vserver", vertices);
141         impliedDelete.execute(vserver.id(), "sdNC", "vserver", vertices);
142         impliedDelete.execute(vserver.id(), "sdnC", "vserver", vertices);
143         impliedDelete.execute(vserver.id(), "sdnc", "vserver", vertices);
144     }
145
146     // aai.implied.delete.whitelist.sdnc='vserver','vce','pserver'
147     @Test
148     public void testImpliedDeleteWhenUserIsAllowedToInvokeMultipleMethods() throws AAIException {
149
150         QueryEngine mockQueryEngine = Mockito.mock(QueryEngine.class);
151
152         Mockito
153             .doReturn("'vce','pserver','vserver','cloud-region'")
154             .when(impliedDelete)
155             .get(AAIConstants.AAI_IMPLIED_DELETE_WHITELIST + "sdnc","");
156
157         Mockito.when(mockEngine.getQueryEngine()).thenReturn(mockQueryEngine);
158
159         TinkerGraph graph = TinkerGraph.open();
160
161         Vertex vserver = graph.addVertex("vertex");
162         vserver.property("vserver-id", "some-id");
163
164         Vertex volume = graph.addVertex("vertex");
165         volume.property("volume-id", "some-id");
166
167         List<Vertex> vertices = new ArrayList<>();
168         vertices.add(volume);
169
170         impliedDelete.execute(vserver.id(), "SDNC", "vserver", vertices);
171     }
172
173     // aai.implied.delete.whitelist.sdnc='vserver','vce','pserver'
174     @Test
175     public void testImpliedDeleteWhenUserIsAllowedToInvokeMultipleMethodsAndDeletableReturnsMultipleVertexes()
176         throws AAIException, UnsupportedEncodingException {
177
178         QueryEngine mockQueryEngine = Mockito.mock(QueryEngine.class);
179
180         // On a spy the syntax should be doReturn => when => method to spy
181         // On a mock the syntax should be when => thenReturn|thenAnswer
182         Mockito
183             .doReturn("'vserver'")
184             .when(impliedDelete)
185             .get(AAIConstants.AAI_IMPLIED_DELETE_WHITELIST + "sdnc","");
186
187
188         Introspector mockIntrospector = Mockito.mock(Introspector.class);
189
190         Mockito.when(mockEngine.getQueryEngine()).thenReturn(mockQueryEngine);
191
192         TinkerGraph graph = TinkerGraph.open();
193
194         Vertex vserver = graph.addVertex("vertex");
195         vserver.property("vserver-id", "some-id");
196
197         Vertex volume1 = graph.addVertex("vertex");
198         volume1.property("volume-id", "volume-1");
199
200         Vertex volume2 = graph.addVertex("vertex");
201         volume1.property("volume-id", "volume-2");
202
203         Vertex volume3 = graph.addVertex("vertex");
204         volume1.property("volume-id", "volume-3");
205
206         Vertex volume4 = graph.addVertex("vertex");
207         volume1.property("volume-id", "volume-4");
208
209         List<Vertex> vertices = new ArrayList<>();
210
211         vertices.add(volume1);
212         vertices.add(volume2);
213         vertices.add(volume3);
214         vertices.add(volume4);
215
216         Mockito
217             .when(mockQueryEngine.findDeletable(Mockito.anyList()))
218             .thenReturn(vertices);
219
220         Mockito
221             .when(mockSerializer.getLatestVersionView(Mockito.anyObject()))
222             .thenReturn(mockIntrospector);
223
224         Mockito
225             .when(mockIntrospector.marshal(false))
226             .thenReturn("{\"volume-id\":\"volume-1\"}")
227             .thenReturn("{\"volume-id\":\"volume-2\"}")
228             .thenReturn("{\"volume-id\":\"volume-3\"}")
229             .thenReturn("{\"volume-id\":\"volume-4\"}");
230
231         impliedDelete.execute(vserver.id(), "SDNC", "vserver", vertices);
232     }
233
234     // aai.implied.delete.whitelist.sdnc=
235     @Test(expected = AAIException.class)
236     public void testImpliedDeleteWhenUserIsNotAllowedToDelete() throws AAIException {
237
238         QueryEngine mockQueryEngine = Mockito.mock(QueryEngine.class);
239
240         Mockito
241             .doReturn("")
242             .when(impliedDelete)
243             .get(AAIConstants.AAI_IMPLIED_DELETE_WHITELIST + "sdnc","");
244
245         Mockito.when(mockEngine.getQueryEngine()).thenReturn(mockQueryEngine);
246
247         TinkerGraph graph = TinkerGraph.open();
248
249         Vertex vserver = graph.addVertex("vertex");
250         vserver.property("vserver-id", "some-id");
251
252         Vertex volume = graph.addVertex("vertex");
253         volume.property("volume-id", "some-id");
254
255         List<Vertex> vertices = new ArrayList<>();
256         vertices.add(volume);
257
258         impliedDelete.execute(vserver.id(), "SDNC", "vserver", vertices);
259     }
260
261     // aai.implied.delete.whitelist.sdnc='vce'
262     @Test(expected = AAIException.class)
263     public void testImpliedDeleteWhenUserIsAllowedToDeleteVceChildrenButRequestedToDeleteVserverChildren() throws AAIException {
264
265         QueryEngine mockQueryEngine = Mockito.mock(QueryEngine.class);
266
267         Mockito
268             .doReturn("'vce'")
269             .when(impliedDelete)
270             .get(AAIConstants.AAI_IMPLIED_DELETE_WHITELIST + "sdnc","");
271
272         Mockito.when(mockEngine.getQueryEngine()).thenReturn(mockQueryEngine);
273
274         TinkerGraph graph = TinkerGraph.open();
275
276         Vertex vserver = graph.addVertex("vertex");
277         vserver.property("vserver-id", "some-id");
278
279         Vertex volume = graph.addVertex("vertex");
280         volume.property("volume-id", "some-id");
281
282         List<Vertex> vertices = new ArrayList<>();
283         vertices.add(volume);
284
285         impliedDelete.execute(vserver.id(), "SDNC", "vserver", vertices);
286     }
287
288     @Test
289     public void testImpliedDeleteWhenUserIsAllowedToDeleteAndPrintingDeletingVertexItThrowsExceptionVerifyLog() throws AAIException, UnsupportedEncodingException {
290
291         QueryEngine mockQueryEngine = Mockito.mock(QueryEngine.class);
292
293         // On a spy the syntax should be doReturn => when => method to spy
294         // On a mock the syntax should be when => thenReturn|thenAnswer
295         Mockito
296             .doReturn("'vserver'")
297             .when(impliedDelete)
298             .get(AAIConstants.AAI_IMPLIED_DELETE_WHITELIST + "sdnc","");
299
300
301         Introspector mockIntrospector = Mockito.mock(Introspector.class);
302
303         Mockito.when(mockEngine.getQueryEngine()).thenReturn(mockQueryEngine);
304
305         TinkerGraph graph = TinkerGraph.open();
306
307         Vertex vserver = graph.addVertex("vertex");
308         vserver.property("vserver-id", "some-id");
309
310         Vertex volume1 = graph.addVertex("vertex");
311         volume1.property("volume-id", "volume-1");
312
313         List<Vertex> vertices = new ArrayList<>();
314
315         vertices.add(volume1);
316
317         Mockito
318             .when(mockQueryEngine.findDeletable(Mockito.anyList()))
319             .thenReturn(vertices);
320
321         Mockito
322             .when(mockSerializer.getLatestVersionView(Mockito.anyObject()))
323             .thenThrow(new RuntimeException("Unable to find node"));
324
325         impliedDelete.execute(vserver.id(), "SDNC", "vserver", vertices);
326
327         outputCapture.expect(
328             CoreMatchers.containsString("Encountered an exception during retrieval of vertex properties with vertex-id " + vserver.id())
329         );
330     }
331 }