Auto-resolve edge type
[aai/gizmo.git] / src / test / java / org / onap / crud / service / CrudRestServiceTest.java
1 /**
2  * ============LICENSE_START=======================================================
3  * org.onap.aai
4  * ================================================================================
5  * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
6  * Copyright © 2017-2018 Amdocs
7  * ================================================================================
8  * Licensed under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  *
12  *       http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  * ============LICENSE_END=========================================================
20  */
21 package org.onap.crud.service;
22
23 import static org.junit.Assert.assertTrue;
24 import static org.junit.Assert.fail;
25 import java.io.BufferedReader;
26 import java.io.File;
27 import java.io.FileReader;
28 import java.io.IOException;
29 import javax.servlet.http.HttpServletRequest;
30 import javax.ws.rs.core.HttpHeaders;
31 import javax.ws.rs.core.Response;
32 import org.junit.Assert;
33 import org.junit.Before;
34 import org.junit.Rule;
35 import org.junit.Test;
36 import org.junit.rules.ExpectedException;
37 import org.mockito.Mockito;
38 import org.onap.crud.exception.CrudException;
39 import org.onap.crud.service.util.TestHeaders;
40 import org.onap.crud.service.util.TestRequest;
41 import org.onap.crud.service.util.TestUriInfo;
42 import org.onap.schema.EdgeRulesLoader;
43
44
45 public class CrudRestServiceTest {
46   private final String putVertexPayload = "{" +
47       "\"id\": \"test-uuid\"," +
48       "\"type\": \"pserver\"," +
49       "\"properties\": {" +
50       "\"fqdn\": \"myhost.onap.com\"," +
51       "\"hostname\": \"myhost\" } }";
52
53   private final String postVertexPayload = "{" +
54       "\"type\": \"pserver\"," +
55       "\"properties\": {" +
56       "\"fqdn\": \"myhost.onap.com\"," +
57       "\"hostname\": \"myhost\" } }";
58
59   private final String postMissingPropVertexPayload = "{" +
60       "\"type\": \"pserver\"," +
61       "\"properties\": {" +
62       "\"fqdn\": \"myhost.onap.com\"," +
63       "\"equip-type\": \"box\" } }";
64
65   private final String postEdgePayload = "{" +
66       "\"type\": \"tosca.relationships.HostedOn\"," +
67       "\"source\": \"services/inventory/v11/vserver/50bdab41-ad1c-4d00-952c-a0aa5d827811\"," +
68             "\"target\": \"services/inventory/v11/pserver/1d326bc7-b985-492b-9604-0d5d1f06f908\"," +
69       "\"properties\": {" +
70       "\"prevent-delete\": \"NONE\" } }";
71
72
73   private CrudRestService mockService;
74
75   @Rule
76   public ExpectedException thrown = ExpectedException.none();
77
78   @Before
79   public void init() throws Exception {
80     System.setProperty("CONFIG_HOME", "src/test/resources");
81     EdgeRulesLoader.resetSchemaVersionContext();
82
83     ChampDaoMockTest champDaoTest = new ChampDaoMockTest();
84     CrudGraphDataService service = new CrudGraphDataService(champDaoTest.getChampDao());
85     CrudRestService restService = new CrudRestService(service, null);
86     mockService = Mockito.spy(restService);
87
88     Mockito.doReturn(true).when(mockService).validateRequest(Mockito.any(HttpServletRequest.class),
89         Mockito.anyString(), Mockito.anyString(), Mockito.any(CrudRestService.Action.class), Mockito.anyString(),
90         Mockito.any(HttpHeaders.class));
91   }
92
93   @Test
94   public void testDelete() throws CrudException {
95     Response response;
96
97     response = mockService.deleteVertex("", "v11", "pserver", "872dd5df-0be9-4167-95e9-2cf4b21165ed",
98         "services/inventory/v11", new TestHeaders(), null, new TestRequest());
99     assertTrue(response.getStatus() == 200);
100
101     response = mockService.deleteEdge("", "v11", "tosca.relationships.HostedOn", "872dd5df-0be9-4167-95e9-2cf4b21165ed",
102         "services/inventory/v11", new TestHeaders(), null, new TestRequest());
103     assertTrue(response.getStatus() == 200);
104   }
105
106   @Test
107   public void testAddVertex() throws CrudException {
108     Response response;
109
110         // Cannot find OXM version
111     response = mockService.addVertex(postVertexPayload, "v7", "services/inventory/v8",
112             new TestHeaders(), null, new TestRequest());
113     System.out.println("Response: " + response.getStatus() + "\n" + response.getEntity().toString());
114     assertTrue(response.getStatus() == 500);
115     Assert.assertNull(response.getEntityTag());
116
117     response = mockService.addVertex(postMissingPropVertexPayload, "v11", "services/inventory/v11",
118         new TestHeaders(), null, new TestRequest());
119     System.out.println("Response: " + response.getStatus() + "\n" + response.getEntity().toString());
120     assertTrue(response.getStatus() == 400);
121         Assert.assertNull(response.getEntityTag());
122
123     response = mockService.addVertex(postVertexPayload, "v11", "services/inventory/v11",
124         new TestHeaders(), null, new TestRequest());
125     System.out.println("Response: " + response.getStatus() + "\n" + response.getEntity().toString());
126     assertTrue(response.getStatus() == 201);
127         Assert.assertEquals(response.getEntityTag().getValue(), "test123");
128
129     response = mockService.addVertex(postMissingPropVertexPayload, "v11", "pserver", "services/inventory/v11",
130         new TestHeaders(), null, new TestRequest());
131     System.out.println("Response: " + response.getStatus() + "\n" + response.getEntity().toString());
132     assertTrue(response.getStatus() == 400);
133         Assert.assertNull(response.getEntityTag());
134
135     response = mockService.addVertex(postVertexPayload, "v11", "pserver", "services/inventory/v11",
136         new TestHeaders(), null, new TestRequest());
137     System.out.println("Response: " + response.getStatus() + "\n" + response.getEntity().toString());
138     assertTrue(response.getStatus() == 201);
139         Assert.assertEquals(response.getEntityTag().getValue(), "test123");
140   }
141
142   @Test
143   public void testAddEdge() throws CrudException {
144     Response response;
145
146     response = mockService.addEdge(postEdgePayload, "v9", "services/inventory/v9",
147         new TestHeaders(), null, new TestRequest());
148     System.out.println("Response: " + response.getStatus() + "\n" + response.getEntity().toString());
149     assertTrue(response.getStatus() == 201);
150         Assert.assertEquals(response.getEntityTag().getValue(), "test123");
151
152     response = mockService.addEdge(postEdgePayload, "v9", "tosca.relationships.HostedOn", "services/inventory/v11",
153         new TestHeaders(), null, new TestRequest());
154     System.out.println("Response: " + response.getStatus() + "\n" + response.getEntity().toString());
155     assertTrue(response.getStatus() == 201);
156         Assert.assertEquals(response.getEntityTag().getValue(), "test123");
157   }
158
159   @Test
160   public void testAddEdgeMultiplicityRules() throws CrudException {
161     Response response;
162
163     response = mockService.addEdge(postEdgePayload, "v10", "services/inventory/v10",
164         new TestHeaders(), null, new TestRequest());
165     Assert.assertEquals("MANY2ONE multiplicity rule broken for Edge:vserver:pserver:tosca.relationships.HostedOn",
166             response.getEntity().toString());
167     Assert.assertEquals(400, response.getStatus());
168
169     response = mockService.addEdge(postEdgePayload, "v9", "tosca.relationships.HostedOn", "services/inventory/v9",
170         new TestHeaders(), null, new TestRequest());
171     Assert.assertEquals(201, response.getStatus());
172
173     response = mockService.addEdge(postEdgePayload, "v8", "tosca.relationships.HostedOn", "services/inventory/v8",
174         new TestHeaders(), null, new TestRequest());
175     Assert.assertEquals("ONE2MANY multiplicity rule broken for Edge:vserver:pserver:tosca.relationships.HostedOn",
176             response.getEntity().toString());
177     Assert.assertEquals(400, response.getStatus());
178   }
179
180   @Test
181   public void testUpdateVertex() throws CrudException {
182     Response response;
183
184         // Cannot find OXM version
185     response = mockService.updateVertex(putVertexPayload, "v7", "pserver", "test-uuid", "services/inventory/v8",
186             new TestHeaders(), null, new TestRequest());
187     System.out.println("Response: " + response.getStatus() + "\n" + response.getEntity().toString());
188     assertTrue(response.getStatus() == 500);
189     Assert.assertNull(response.getEntityTag());
190
191     // Test ID mismatch
192     response = mockService.updateVertex(putVertexPayload, "v11", "pserver", "bad-id",
193         "services/inventory/v11", new TestHeaders(), null, new TestRequest());
194     System.out.println("Response: " + response.getStatus() + "\n" + response.getEntity().toString());
195     assertTrue(response.getStatus() == 400);
196     Assert.assertNull(response.getEntityTag());
197
198     // Success case
199     response = mockService.updateVertex(putVertexPayload, "v11", "pserver", "test-uuid", "services/inventory/v11",
200                 new TestHeaders(), null, new TestRequest());
201     System.out.println("Response: " + response.getStatus() + "\n" + response.getEntity().toString());
202     assertTrue(response.getStatus() == 200);
203         Assert.assertEquals(response.getEntityTag().getValue(), "test123");
204
205     // Patch
206     response = mockService.patchVertex(putVertexPayload, "v11", "pserver", "test-uuid",
207         "services/inventory/v11", new TestHeaders(), null, new TestRequest());
208     System.out.println("Response: " + response.getStatus() + "\n" + response.getEntity().toString());
209     assertTrue(response.getStatus() == 200);
210         Assert.assertEquals(response.getEntityTag().getValue(), "test123");
211   }
212
213   @Test
214   public void testUpdateEdge() throws CrudException {
215     Response response;
216
217     response = mockService.updateEdge(postEdgePayload, "v9", "tosca.relationships.HostedOn", "my-uuid",
218         "services/inventory/v9", new TestHeaders(), null, new TestRequest());
219     System.out.println("Response: " + response.getStatus() + "\n" + response.getEntity().toString());
220     assertTrue(response.getStatus() == 200);
221         Assert.assertEquals(response.getEntityTag().getValue(), "test123");
222
223     // Patch
224     response = mockService.patchEdge(postEdgePayload, "v9", "tosca.relationships.HostedOn", "my-uuid",
225         "services/inventory/v9", new TestHeaders(), null, new TestRequest());
226     System.out.println("Response: " + response.getStatus() + "\n" + response.getEntity().toString());
227     assertTrue(response.getStatus() == 200);
228         Assert.assertEquals(response.getEntityTag().getValue(), "test123");
229   }
230
231   @Test
232   public void testGet() throws CrudException {
233     Response response;
234
235     response = mockService.getVertex("", "v11", "pserver", "872dd5df-0be9-4167-95e9-2cf4b21165ed",
236         "services/inventory/v11", new TestHeaders(), new TestUriInfo(), new TestRequest());
237     System.out.println("Response: " + response.getStatus() + "\n" + response.getEntity().toString());
238     assertTrue(response.getStatus() == 200);
239
240     response = mockService.getEdge("", "v11", "tosca.relationships.HostedOn", "872dd5df-0be9-4167-95e9-2cf4b21165ed",
241         "services/inventory/v11", new TestHeaders(), new TestUriInfo(), new TestRequest());
242     System.out.println("Response: " + response.getStatus() + "\n" + response.getEntity().toString());
243     assertTrue(response.getStatus() == 200);
244
245     response = mockService.getVertices("", "v11", "pserver",
246         "services/inventory/v11", new TestHeaders(), new TestUriInfo(), new TestRequest());
247     System.out.println("Response: " + response.getStatus() + "\n" + response.getEntity().toString());
248     assertTrue(response.getStatus() == 200);
249
250     response = mockService.getEdges("", "v11", "tosca.relationships.HostedOn",
251         "services/inventory/v11", new TestHeaders(), new TestUriInfo(), new TestRequest());
252     System.out.println("Response: " + response.getStatus() + "\n" + response.getEntity().toString());
253     assertTrue(response.getStatus() == 200);
254   }
255
256   @Test
257   public void testValidRequestHeader() throws CrudException {
258     TestHeaders testHeaders = new TestHeaders();
259     mockService.validateRequestHeader(testHeaders);
260   }
261
262   @Test
263   public void testInvalidRequestHeaderXTransactionId() throws CrudException {
264     thrown.expect(CrudException.class);
265     thrown.expectMessage("Invalid request, Missing X-TransactionId header");
266
267     TestHeaders testHeaders = new TestHeaders();
268     testHeaders.clearRequestHeader("X-TransactionId");
269     mockService.validateRequestHeader(testHeaders);
270   }
271
272   @Test
273   public void testInvalidRequestHeaderXFromAppId() throws CrudException {
274     thrown.expect(CrudException.class);
275     thrown.expectMessage("Invalid request, Missing X-FromAppId header");
276
277     TestHeaders testHeaders = new TestHeaders();
278     testHeaders.clearRequestHeader("X-FromAppId");
279     mockService.validateRequestHeader(testHeaders);
280   }
281
282   @Test
283   public void testRequestHeaderWithMsId() throws CrudException {
284     thrown.expect(CrudException.class);
285     thrown.expectMessage("Invalid request, Missing X-FromAppId header");
286
287     TestHeaders testHeaders = new TestHeaders();
288     testHeaders.clearRequestHeader("X-TransactionId", "X-FromAppId");
289     mockService.validateRequestHeader(testHeaders);
290   }
291
292   @Test
293   public void testEmptyRequestHeader() throws CrudException {
294     thrown.expect(CrudException.class);
295     thrown.expectMessage("Invalid request, Missing X-FromAppId header");
296
297     TestHeaders testHeaders = new TestHeaders();
298     testHeaders.clearRequestHeader("X-TransactionId", "X-FromAppId");
299     mockService.validateRequestHeader(testHeaders);
300   }
301
302   @Test
303     public void testGetMultiOxm() throws CrudException {
304         Response response;
305
306         response = mockService.getVertex("", "v13", "pserver", "872dd5df-0be9-4167-95e9-2cf4b21165ed",
307                 "services/inventory/v11", new TestHeaders(), new TestUriInfo(), new TestRequest());
308         System.out.println("Response: " + response.getStatus() + "\n" + response.getEntity().toString());
309         assertTrue(response.getStatus() == 200);
310
311         response =
312                 mockService.getEdge("", "v11", "tosca.relationships.HostedOn", "872dd5df-0be9-4167-95e9-2cf4b21165ed",
313                         "services/inventory/v11", new TestHeaders(), new TestUriInfo(), new TestRequest());
314         System.out.println("Response: " + response.getStatus() + "\n" + response.getEntity().toString());
315         assertTrue(response.getStatus() == 200);
316
317         response = mockService.getVertices("", "v13", "pserver", "services/inventory/v11", new TestHeaders(),
318                 new TestUriInfo(), new TestRequest());
319         System.out.println("Response: " + response.getStatus() + "\n" + response.getEntity().toString());
320         assertTrue(response.getStatus() == 200);
321
322         response = mockService.getEdges("", "v11", "tosca.relationships.HostedOn", "services/inventory/v11",
323                 new TestHeaders(), new TestUriInfo(), new TestRequest());
324         System.out.println("Response: " + response.getStatus() + "\n" + response.getEntity().toString());
325         assertTrue(response.getStatus() == 200);
326     }
327
328   @Test
329   public void testBulk() throws CrudException, IOException {
330     Response response;
331
332     File bulkFile = new File("src/test/resources/payloads/bulk.json");
333     String payloadStr = readFileToString(bulkFile);
334     System.out.println(payloadStr);
335
336     response = mockService.addBulk(payloadStr, "v9", "",
337         "services/inventory/v9", new TestHeaders(), null, new TestRequest());
338     System.out.println("Bulk Response: " + response);
339     System.out.println("Response Entity: " + response.getEntity().toString());
340     assertTrue(response.getStatus() == 200);
341   }
342
343   public static String readFileToString(File aFile) throws IOException {
344
345     BufferedReader br = new BufferedReader(new FileReader(aFile));
346     try {
347       StringBuilder sb = new StringBuilder();
348       String line = br.readLine();
349
350       while (line != null) {
351         sb.append(line);
352         line = br.readLine();
353       }
354
355       return sb.toString().replaceAll("\\s+", "");
356     } finally {
357       try {
358         br.close();
359       } catch (IOException e) {
360         fail("Unexpected IOException: " + e.getMessage());
361       }
362     }
363   }
364
365 }