Apply multiplicity Rule upon Edge creation
[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     ClassLoader classLoader = getClass().getClassLoader();
81     File dir = new File(classLoader.getResource("rules").getFile());
82     System.setProperty("CONFIG_HOME", dir.getParent());
83     EdgeRulesLoader.resetSchemaVersionContext();
84
85     CrudGraphDataService service = new CrudGraphDataService(new TestDao());
86     CrudRestService restService = new CrudRestService(service, null);
87     mockService = Mockito.spy(restService);
88
89     Mockito.doReturn(true).when(mockService).validateRequest(Mockito.any(HttpServletRequest.class),
90         Mockito.anyString(), Mockito.anyString(), Mockito.any(CrudRestService.Action.class), Mockito.anyString(),
91         Mockito.any(HttpHeaders.class));
92   }
93
94   @Test
95   public void testDelete() throws CrudException {
96     Response response;
97
98     response = mockService.deleteVertex("", "v11", "pserver", "872dd5df-0be9-4167-95e9-2cf4b21165ed",
99         "services/inventory/v11", new TestHeaders(), null, new TestRequest());
100     assertTrue(response.getStatus() == 200);
101
102     response = mockService.deleteEdge("", "v11", "tosca.relationships.HostedOn", "872dd5df-0be9-4167-95e9-2cf4b21165ed",
103         "services/inventory/v11", new TestHeaders(), null, new TestRequest());
104     assertTrue(response.getStatus() == 200);
105   }
106
107   @Test
108   public void testAddVertex() throws CrudException {
109     Response response;
110
111         // Cannot find OXM version
112     response = mockService.addVertex(postVertexPayload, "v7", "services/inventory/v8",
113             new TestHeaders(), null, new TestRequest());
114     System.out.println("Response: " + response.getStatus() + "\n" + response.getEntity().toString());
115     assertTrue(response.getStatus() == 500);
116     Assert.assertNull(response.getEntityTag());
117
118     response = mockService.addVertex(postMissingPropVertexPayload, "v11", "services/inventory/v11",
119         new TestHeaders(), null, new TestRequest());
120     System.out.println("Response: " + response.getStatus() + "\n" + response.getEntity().toString());
121     assertTrue(response.getStatus() == 400);
122         Assert.assertNull(response.getEntityTag());
123
124     response = mockService.addVertex(postVertexPayload, "v11", "services/inventory/v11",
125         new TestHeaders(), null, new TestRequest());
126     System.out.println("Response: " + response.getStatus() + "\n" + response.getEntity().toString());
127     assertTrue(response.getStatus() == 201);
128         Assert.assertEquals(response.getEntityTag().getValue(), "test123");
129
130     response = mockService.addVertex(postMissingPropVertexPayload, "v11", "pserver", "services/inventory/v11",
131         new TestHeaders(), null, new TestRequest());
132     System.out.println("Response: " + response.getStatus() + "\n" + response.getEntity().toString());
133     assertTrue(response.getStatus() == 400);
134         Assert.assertNull(response.getEntityTag());
135
136     response = mockService.addVertex(postVertexPayload, "v11", "pserver", "services/inventory/v11",
137         new TestHeaders(), null, new TestRequest());
138     System.out.println("Response: " + response.getStatus() + "\n" + response.getEntity().toString());
139     assertTrue(response.getStatus() == 201);
140         Assert.assertEquals(response.getEntityTag().getValue(), "test123");
141   }
142
143   @Test
144   public void testAddEdge() throws CrudException {
145     Response response;
146
147     response = mockService.addEdge(postEdgePayload, "v9", "services/inventory/v9",
148         new TestHeaders(), null, new TestRequest());
149     System.out.println("Response: " + response.getStatus() + "\n" + response.getEntity().toString());
150     assertTrue(response.getStatus() == 201);
151         Assert.assertEquals(response.getEntityTag().getValue(), "test123");
152
153     response = mockService.addEdge(postEdgePayload, "v9", "tosca.relationships.HostedOn", "services/inventory/v11",
154         new TestHeaders(), null, new TestRequest());
155     System.out.println("Response: " + response.getStatus() + "\n" + response.getEntity().toString());
156     assertTrue(response.getStatus() == 201);
157         Assert.assertEquals(response.getEntityTag().getValue(), "test123");
158   }
159
160   @Test
161   public void testAddEdgeMultiplicityRules() throws CrudException {
162     Response response;
163
164     response = mockService.addEdge(postEdgePayload, "v10", "services/inventory/v10",
165         new TestHeaders(), null, new TestRequest());
166     Assert.assertEquals("MANY2ONE multiplicity rule broken for Edge:vserver:pserver:tosca.relationships.HostedOn",
167             response.getEntity().toString());
168     Assert.assertEquals(400, response.getStatus());
169
170     response = mockService.addEdge(postEdgePayload, "v9", "tosca.relationships.HostedOn", "services/inventory/v9",
171         new TestHeaders(), null, new TestRequest());
172     Assert.assertEquals(201, response.getStatus());
173
174     response = mockService.addEdge(postEdgePayload, "v8", "tosca.relationships.HostedOn", "services/inventory/v8",
175         new TestHeaders(), null, new TestRequest());
176     Assert.assertEquals("ONE2MANY multiplicity rule broken for Edge:vserver:pserver:tosca.relationships.HostedOn",
177             response.getEntity().toString());
178     Assert.assertEquals(400, response.getStatus());
179   }
180
181   @Test
182   public void testUpdateVertex() throws CrudException {
183     Response response;
184
185         // Cannot find OXM version
186     response = mockService.updateVertex(putVertexPayload, "v7", "pserver", "test-uuid", "services/inventory/v8",
187             new TestHeaders(), null, new TestRequest());
188     System.out.println("Response: " + response.getStatus() + "\n" + response.getEntity().toString());
189     assertTrue(response.getStatus() == 500);
190     Assert.assertNull(response.getEntityTag());
191
192     // Test ID mismatch
193     response = mockService.updateVertex(putVertexPayload, "v11", "pserver", "bad-id",
194         "services/inventory/v11", new TestHeaders(), null, new TestRequest());
195     System.out.println("Response: " + response.getStatus() + "\n" + response.getEntity().toString());
196     assertTrue(response.getStatus() == 400);
197     Assert.assertNull(response.getEntityTag());
198
199     // Success case
200     response = mockService.updateVertex(putVertexPayload, "v11", "pserver", "test-uuid", "services/inventory/v11",
201                 new TestHeaders(), null, new TestRequest());
202     System.out.println("Response: " + response.getStatus() + "\n" + response.getEntity().toString());
203     assertTrue(response.getStatus() == 200);
204         Assert.assertEquals(response.getEntityTag().getValue(), "test123");
205
206     // Patch
207     response = mockService.patchVertex(putVertexPayload, "v11", "pserver", "test-uuid",
208         "services/inventory/v11", new TestHeaders(), null, new TestRequest());
209     System.out.println("Response: " + response.getStatus() + "\n" + response.getEntity().toString());
210     assertTrue(response.getStatus() == 200);
211         Assert.assertEquals(response.getEntityTag().getValue(), "test123");
212   }
213
214   @Test
215   public void testUpdateEdge() throws CrudException {
216     Response response;
217
218     response = mockService.updateEdge(postEdgePayload, "v9", "tosca.relationships.HostedOn", "my-uuid",
219         "services/inventory/v9", new TestHeaders(), null, new TestRequest());
220     System.out.println("Response: " + response.getStatus() + "\n" + response.getEntity().toString());
221     assertTrue(response.getStatus() == 200);
222         Assert.assertEquals(response.getEntityTag().getValue(), "test123");
223
224     // Patch
225     response = mockService.patchEdge(postEdgePayload, "v9", "tosca.relationships.HostedOn", "my-uuid",
226         "services/inventory/v9", new TestHeaders(), null, new TestRequest());
227     System.out.println("Response: " + response.getStatus() + "\n" + response.getEntity().toString());
228     assertTrue(response.getStatus() == 200);
229         Assert.assertEquals(response.getEntityTag().getValue(), "test123");
230   }
231
232   @Test
233   public void testGet() throws CrudException {
234     Response response;
235
236     response = mockService.getVertex("", "v11", "pserver", "872dd5df-0be9-4167-95e9-2cf4b21165ed",
237         "services/inventory/v11", new TestHeaders(), new TestUriInfo(), new TestRequest());
238     System.out.println("Response: " + response.getStatus() + "\n" + response.getEntity().toString());
239     assertTrue(response.getStatus() == 200);
240
241     response = mockService.getEdge("", "v11", "tosca.relationships.HostedOn", "872dd5df-0be9-4167-95e9-2cf4b21165ed",
242         "services/inventory/v11", new TestHeaders(), new TestUriInfo(), new TestRequest());
243     System.out.println("Response: " + response.getStatus() + "\n" + response.getEntity().toString());
244     assertTrue(response.getStatus() == 200);
245
246     response = mockService.getVertices("", "v11", "pserver",
247         "services/inventory/v11", new TestHeaders(), new TestUriInfo(), new TestRequest());
248     System.out.println("Response: " + response.getStatus() + "\n" + response.getEntity().toString());
249     assertTrue(response.getStatus() == 200);
250
251     response = mockService.getEdges("", "v11", "tosca.relationships.HostedOn",
252         "services/inventory/v11", new TestHeaders(), new TestUriInfo(), new TestRequest());
253     System.out.println("Response: " + response.getStatus() + "\n" + response.getEntity().toString());
254     assertTrue(response.getStatus() == 200);
255   }
256
257   @Test
258   public void testValidRequestHeader() throws CrudException {
259     TestHeaders testHeaders = new TestHeaders();
260     mockService.validateRequestHeader(testHeaders);
261   }
262
263   @Test
264   public void testInvalidRequestHeaderXTransactionId() throws CrudException {
265     thrown.expect(CrudException.class);
266     thrown.expectMessage("Invalid request, Missing X-TransactionId header");
267
268     TestHeaders testHeaders = new TestHeaders();
269     testHeaders.clearRequestHeader("X-TransactionId");
270     mockService.validateRequestHeader(testHeaders);
271   }
272
273   @Test
274   public void testInvalidRequestHeaderXFromAppId() throws CrudException {
275     thrown.expect(CrudException.class);
276     thrown.expectMessage("Invalid request, Missing X-FromAppId header");
277
278     TestHeaders testHeaders = new TestHeaders();
279     testHeaders.clearRequestHeader("X-FromAppId");
280     mockService.validateRequestHeader(testHeaders);
281   }
282
283   @Test
284   public void testRequestHeaderWithMsId() throws CrudException {
285     thrown.expect(CrudException.class);
286     thrown.expectMessage("Invalid request, Missing X-FromAppId header");
287
288     TestHeaders testHeaders = new TestHeaders();
289     testHeaders.clearRequestHeader("X-TransactionId", "X-FromAppId");
290     mockService.validateRequestHeader(testHeaders);
291   }
292
293   @Test
294   public void testEmptyRequestHeader() throws CrudException {
295     thrown.expect(CrudException.class);
296     thrown.expectMessage("Invalid request, Missing X-FromAppId header");
297
298     TestHeaders testHeaders = new TestHeaders();
299     testHeaders.clearRequestHeader("X-TransactionId", "X-FromAppId");
300     mockService.validateRequestHeader(testHeaders);
301   }
302
303   @Test
304     public void testGetMultiOxm() throws CrudException {
305         Response response;
306
307         response = mockService.getVertex("", "v13", "pserver", "872dd5df-0be9-4167-95e9-2cf4b21165ed",
308                 "services/inventory/v11", new TestHeaders(), new TestUriInfo(), new TestRequest());
309         System.out.println("Response: " + response.getStatus() + "\n" + response.getEntity().toString());
310         assertTrue(response.getStatus() == 200);
311
312         response =
313                 mockService.getEdge("", "v11", "tosca.relationships.HostedOn", "872dd5df-0be9-4167-95e9-2cf4b21165ed",
314                         "services/inventory/v11", new TestHeaders(), new TestUriInfo(), new TestRequest());
315         System.out.println("Response: " + response.getStatus() + "\n" + response.getEntity().toString());
316         assertTrue(response.getStatus() == 200);
317
318         response = mockService.getVertices("", "v13", "pserver", "services/inventory/v11", new TestHeaders(),
319                 new TestUriInfo(), new TestRequest());
320         System.out.println("Response: " + response.getStatus() + "\n" + response.getEntity().toString());
321         assertTrue(response.getStatus() == 200);
322
323         response = mockService.getEdges("", "v11", "tosca.relationships.HostedOn", "services/inventory/v11",
324                 new TestHeaders(), new TestUriInfo(), new TestRequest());
325         System.out.println("Response: " + response.getStatus() + "\n" + response.getEntity().toString());
326         assertTrue(response.getStatus() == 200);
327     }
328
329   @Test
330   public void testBulk() throws CrudException, IOException {
331     Response response;
332
333     File bulkFile = new File("src/test/resources/payloads/bulk.json");
334     String payloadStr = readFileToString(bulkFile);
335     System.out.println(payloadStr);
336
337     response = mockService.addBulk(payloadStr, "v9", "",
338         "services/inventory/v9", new TestHeaders(), null, new TestRequest());
339     System.out.println("Bulk Response: " + response.getStatus() + "\n" + 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 }