Fixing SO build
[so.git] / adapters / etsi-sol003-adapter / etsi-sol003-package-management / etsi-sol003-package-management-adapter / src / test / java / org / onap / so / adapters / vnfmadapter / rest / Sol003PackageManagementSubscriptionControllerTest.java
1 /*-
2  * ============LICENSE_START=======================================================
3  *  Copyright (C) 2020 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
21 package org.onap.so.adapters.vnfmadapter.rest;
22
23 import static org.hamcrest.Matchers.is;
24 import static org.junit.Assert.assertEquals;
25 import static org.junit.Assert.assertNotEquals;
26 import static org.junit.Assert.assertNotNull;
27 import static org.junit.Assert.assertNull;
28 import static org.junit.Assert.assertThat;
29 import static org.junit.Assert.assertTrue;
30 import static org.onap.so.adapters.vnfmadapter.common.CommonConstants.ETSI_SUBSCRIPTION_NOTIFICATION_BASE_URL;
31 import static org.onap.so.adapters.vnfmadapter.common.CommonConstants.PACKAGE_MANAGEMENT_BASE_URL;
32 import static org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.EtsiCatalogServiceProviderConfiguration.ETSI_CATALOG_REST_TEMPLATE_BEAN;
33 import static org.springframework.test.web.client.match.MockRestRequestMatchers.method;
34 import static org.springframework.test.web.client.match.MockRestRequestMatchers.requestTo;
35 import static org.springframework.test.web.client.response.MockRestResponseCreators.withStatus;
36 import static org.springframework.test.web.client.response.MockRestResponseCreators.withSuccess;
37 import java.io.File;
38 import java.net.URI;
39 import java.net.URISyntaxException;
40 import java.nio.file.Files;
41 import java.nio.file.Paths;
42 import java.security.GeneralSecurityException;
43 import java.util.ArrayList;
44 import java.util.List;
45 import java.util.Objects;
46 import java.util.UUID;
47 import org.junit.After;
48 import org.junit.Before;
49 import org.junit.Test;
50 import org.junit.runner.RunWith;
51 import org.onap.so.adapters.vnfmadapter.PackageManagementConstants;
52 import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.BasicAuth;
53 import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.LinkSelf;
54 import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.NsdmSubscription;
55 import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.PkgmNotificationsFilter;
56 import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.PkgmSubscription;
57 import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.ProblemDetails;
58 import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.SubscriptionAuthentication;
59 import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.Version;
60 import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.VnfProducts;
61 import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.VnfProductsProviders;
62 import org.onap.so.adapters.vnfmadapter.packagemanagement.model.InlineResponse2002;
63 import org.onap.so.adapters.vnfmadapter.packagemanagement.model.InlineResponse201;
64 import org.onap.so.adapters.vnfmadapter.packagemanagement.model.PkgmSubscriptionRequest;
65 import org.onap.so.adapters.vnfmadapter.packagemanagement.model.SubscriptionsAuthentication;
66 import org.onap.so.adapters.vnfmadapter.packagemanagement.model.SubscriptionsFilter1;
67 import org.onap.so.adapters.vnfmadapter.packagemanagement.model.SubscriptionsFilterVnfProductsFromProviders;
68 import org.onap.so.adapters.vnfmadapter.packagemanagement.model.SubscriptionsLinks;
69 import org.onap.so.adapters.vnfmadapter.packagemanagement.model.VnfPackagesLinksSelf;
70 import org.springframework.beans.factory.annotation.Autowired;
71 import org.springframework.beans.factory.annotation.Qualifier;
72 import org.springframework.boot.test.context.SpringBootTest;
73 import org.springframework.boot.test.web.client.TestRestTemplate;
74 import org.springframework.boot.web.server.LocalServerPort;
75 import org.springframework.cache.Cache;
76 import org.springframework.cache.CacheManager;
77 import org.springframework.http.HttpHeaders;
78 import org.springframework.http.HttpMethod;
79 import org.springframework.http.HttpStatus;
80 import org.springframework.http.MediaType;
81 import org.springframework.http.ResponseEntity;
82 import org.springframework.test.context.ActiveProfiles;
83 import org.springframework.test.context.junit4.SpringRunner;
84 import org.springframework.test.web.client.MockRestServiceServer;
85 import org.springframework.test.web.client.match.MockRestRequestMatchers;
86 import org.springframework.web.client.RestTemplate;
87 import com.google.gson.Gson;
88
89 /**
90  * @author Ronan Kenny (ronan.kenny@est.tech)
91  * @author Gareth Roper (gareth.roper@est.tech)
92  */
93 @RunWith(SpringRunner.class)
94 @SpringBootTest(classes = TestApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
95 @ActiveProfiles("test")
96 public class Sol003PackageManagementSubscriptionControllerTest {
97
98     private final Gson gson = new Gson();
99     private final URI msbEndpoint = URI.create("http://msb-iag.onap:80/api/vnfpkgm/v1/subscriptions");
100     private static final String _NOTIFICATION_CALLBACK_URI =
101             "https://so-vnfm-adapter.onap:30406" + ETSI_SUBSCRIPTION_NOTIFICATION_BASE_URL;
102     private static final String LOCALHOST_URL = "http://localhost:";
103
104     @Autowired
105     @Qualifier(ETSI_CATALOG_REST_TEMPLATE_BEAN)
106     private RestTemplate restTemplate;
107     private MockRestServiceServer mockRestServiceServer;
108     @Autowired
109     private CacheManager cacheServiceProvider;
110     @Autowired
111     private Sol003PackageManagementSubscriptionController sol003PackageManagementSubscriptionController;
112
113     @Autowired
114     private TestRestTemplate testRestTemplate;
115
116     @LocalServerPort
117     private int port;
118
119     private static final String ID = UUID.randomUUID().toString();
120
121     @Before
122     public void setUp() {
123         mockRestServiceServer = MockRestServiceServer.bindTo(restTemplate).build();
124         final Cache cache =
125                 cacheServiceProvider.getCache(PackageManagementConstants.PACKAGE_MANAGEMENT_SUBSCRIPTION_CACHE);
126         cache.clear();
127     }
128
129     @After
130     public void after() {
131         mockRestServiceServer.reset();
132     }
133
134     @Test
135     public void testSuccessPostSubscription() throws GeneralSecurityException, URISyntaxException {
136         final PkgmSubscriptionRequest pkgmSubscriptionRequest = postSubscriptionForTest();
137         final ResponseEntity<InlineResponse201> response =
138                 (ResponseEntity<InlineResponse201>) sol003PackageManagementSubscriptionController
139                         .postSubscriptionRequest(pkgmSubscriptionRequest);
140
141         final HttpHeaders headers = buildHttpHeaders(Objects.requireNonNull(response.getBody()).getCallbackUri());
142
143         final SubscriptionsLinks subscriptionsLinks = new SubscriptionsLinks();
144         final VnfPackagesLinksSelf vnfPackagesLinksSelf = new VnfPackagesLinksSelf();
145         vnfPackagesLinksSelf.setHref("https://so-vnfm-adapter.onap:30406" + PACKAGE_MANAGEMENT_BASE_URL
146                 + "/subscriptions/" + response.getBody().getId());
147         subscriptionsLinks.setSelf(vnfPackagesLinksSelf);
148
149         assertEquals(pkgmSubscriptionRequest.getFilter(), response.getBody().getFilter());
150         assertEquals(subscriptionsLinks, response.getBody().getLinks());
151         assertEquals(response.getBody().getFilter(), pkgmSubscriptionRequest.getFilter());
152         assert (response.getHeaders().equals(headers));
153         assertThat(response.getStatusCode(), is(HttpStatus.CREATED));
154         assertNotNull(response.getBody().getCallbackUri());
155     }
156
157     @Test
158     public void testFailPostSubscriptionAlreadyExists() throws GeneralSecurityException {
159         final PkgmSubscriptionRequest pkgmSubscriptionRequest = postSubscriptionForTest();
160
161         final ResponseEntity<InlineResponse2002> response =
162                 (ResponseEntity<InlineResponse2002>) sol003PackageManagementSubscriptionController
163                         .postSubscriptionRequest(pkgmSubscriptionRequest);
164
165         // Create duplicate entry
166         final PkgmSubscriptionRequest pkgmSubscriptionRequest2 = buildPkgmSubscriptionRequest();
167
168         final ResponseEntity<InlineResponse2002> response2002 =
169                 (ResponseEntity<InlineResponse2002>) sol003PackageManagementSubscriptionController
170                         .postSubscriptionRequest(pkgmSubscriptionRequest2);
171
172         assertEquals(HttpStatus.SEE_OTHER, response2002.getStatusCode());
173     }
174
175     @Test
176     public void testSuccessGetSubscriptionWithSubscriptionId() throws GeneralSecurityException, URISyntaxException {
177
178         final PkgmSubscriptionRequest pkgmSubscriptionRequest = postSubscriptionForTest();
179
180         mockRestServiceServer.expect(requestTo(msbEndpoint + "/" + ID)).andExpect(method(HttpMethod.GET))
181                 .andRespond(withSuccess(gson.toJson(new NsdmSubscription().id(ID)), MediaType.APPLICATION_JSON));
182
183         final ResponseEntity<InlineResponse201> response =
184                 (ResponseEntity<InlineResponse201>) sol003PackageManagementSubscriptionController
185                         .postSubscriptionRequest(pkgmSubscriptionRequest);
186         final String subscriptionId = response.getBody().getId();
187
188
189
190         final ResponseEntity<InlineResponse201> responseEntity =
191                 (ResponseEntity<InlineResponse201>) sol003PackageManagementSubscriptionController
192                         .getSubscription(subscriptionId);
193
194         final HttpHeaders headers = buildHttpHeaders(response.getBody().getCallbackUri());
195
196         assertEquals(response.getBody().getFilter(), pkgmSubscriptionRequest.getFilter());
197         assertEquals(response.getHeaders(), headers);
198         assertEquals(HttpStatus.OK, responseEntity.getStatusCode());
199         assertEquals(pkgmSubscriptionRequest.getFilter(), response.getBody().getFilter());
200         // Ensure CallBackUri is set to new URI
201         assertNotEquals(pkgmSubscriptionRequest.getCallbackUri(), response.getBody().getCallbackUri());
202     }
203
204     @Test
205     public void testFailGetSubscriptionWithInvalidSubscriptionId() {
206         final String invalidId = "invalidSubscriptionId";
207         mockRestServiceServer.expect(requestTo(msbEndpoint + "/" + invalidId)).andExpect(method(HttpMethod.GET))
208                 .andRespond(withStatus(HttpStatus.NOT_FOUND));
209         final ResponseEntity<?> response = sol003PackageManagementSubscriptionController.getSubscription(invalidId);
210         assertEquals(HttpStatus.NOT_FOUND, response.getStatusCode());
211         assertTrue(response.getBody() instanceof ProblemDetails);
212     }
213
214     @Test
215     public void testSuccessGetSubscriptions() throws GeneralSecurityException {
216         final PkgmSubscription pkgmSubscription = buildPkgmSubscription();
217         final PkgmSubscriptionRequest pkgmSubscriptionRequest = buildPkgmSubscriptionRequest();
218
219         mockRestServiceServer.expect(requestTo(msbEndpoint)).andExpect(method(HttpMethod.POST))
220                 .andRespond(withSuccess(gson.toJson(pkgmSubscription), MediaType.APPLICATION_JSON));
221         mockRestServiceServer.expect(requestTo(msbEndpoint + "/" + ID)).andExpect(method(HttpMethod.GET))
222                 .andRespond(withSuccess(gson.toJson(new NsdmSubscription().id(ID)), MediaType.APPLICATION_JSON));
223
224         sol003PackageManagementSubscriptionController.postSubscriptionRequest(pkgmSubscriptionRequest);
225         final ResponseEntity<List<InlineResponse201>> response =
226                 sol003PackageManagementSubscriptionController.getSubscriptions();
227
228         final List<InlineResponse201> subscriptionsList = response.getBody();
229
230         assertEquals(Objects.requireNonNull(response.getBody()).get(0).getFilter(),
231                 pkgmSubscriptionRequest.getFilter());
232         assertNotNull(subscriptionsList != null);
233         assertNotEquals('0', subscriptionsList.size());
234         assertEquals(HttpStatus.OK, response.getStatusCode());
235     }
236
237     @Test
238     public void testSuccessDeleteSubscriptionWithSubscriptionId() throws GeneralSecurityException {
239         final PkgmSubscriptionRequest pkgmSubscriptionRequest = buildPkgmSubscriptionRequest();
240         final PkgmSubscription pkgmSubscription = buildPkgmSubscription();
241         final String subscriptionId = pkgmSubscription.getId();
242
243         mockRestServiceServer.expect(requestTo(msbEndpoint)).andExpect(method(HttpMethod.POST))
244                 .andRespond(withSuccess(gson.toJson(pkgmSubscription), MediaType.APPLICATION_JSON));
245
246         mockRestServiceServer.expect(requestTo(msbEndpoint + "/" + subscriptionId)).andExpect(method(HttpMethod.DELETE))
247                 .andRespond(withStatus(HttpStatus.NO_CONTENT));
248         mockRestServiceServer.expect(requestTo(msbEndpoint + "/" + subscriptionId)).andExpect(method(HttpMethod.GET))
249                 .andRespond(withSuccess(gson.toJson(new NsdmSubscription().id(subscriptionId)),
250                         MediaType.APPLICATION_JSON));
251
252         final ResponseEntity<InlineResponse2002> responsePost =
253                 (ResponseEntity<InlineResponse2002>) sol003PackageManagementSubscriptionController
254                         .postSubscriptionRequest(pkgmSubscriptionRequest);
255
256         final ResponseEntity responseDelete =
257                 sol003PackageManagementSubscriptionController.deleteSubscription(subscriptionId);
258
259         // Attempt to retrieve the subscription after delete
260         final ResponseEntity<InlineResponse2002> responseGetSubscription =
261                 (ResponseEntity<InlineResponse2002>) sol003PackageManagementSubscriptionController
262                         .getSubscription(subscriptionId);
263
264         assertEquals(HttpStatus.NOT_FOUND, responseGetSubscription.getStatusCode());
265         assertEquals(HttpStatus.NO_CONTENT, responseDelete.getStatusCode());
266     }
267
268     @Test
269     public void testDeleteSubscription_SubscripitonNotFoundInEtsiCatalogManager_SubscriptionDeletedFromLocalCache()
270             throws GeneralSecurityException {
271         final PkgmSubscriptionRequest pkgmSubscriptionRequest = buildPkgmSubscriptionRequest();
272         final PkgmSubscription pkgmSubscription = buildPkgmSubscription();
273
274         mockRestServiceServer.expect(requestTo(msbEndpoint)).andExpect(method(HttpMethod.POST))
275                 .andRespond(withSuccess(gson.toJson(pkgmSubscription), MediaType.APPLICATION_JSON));
276
277         mockRestServiceServer.expect(requestTo(msbEndpoint + "/" + ID)).andExpect(method(HttpMethod.DELETE))
278                 .andRespond(withStatus(HttpStatus.NOT_FOUND));
279
280         final ResponseEntity<InlineResponse2002> responsePost =
281                 (ResponseEntity<InlineResponse2002>) sol003PackageManagementSubscriptionController
282                         .postSubscriptionRequest(pkgmSubscriptionRequest);
283
284         final Cache cache =
285                 cacheServiceProvider.getCache(PackageManagementConstants.PACKAGE_MANAGEMENT_SUBSCRIPTION_CACHE);
286         assertNotNull(cache.get(ID));
287
288         final ResponseEntity responseDelete = sol003PackageManagementSubscriptionController.deleteSubscription(ID);
289
290         assertEquals(HttpStatus.NO_CONTENT, responseDelete.getStatusCode());
291         assertNull(cache.get(ID));
292
293     }
294
295     @Test
296     public void testFailDeleteSubscriptionWithInvalidSubscriptionId() throws URISyntaxException, InterruptedException {
297         final ResponseEntity<Void> responseDelete = (ResponseEntity<Void>) sol003PackageManagementSubscriptionController
298                 .deleteSubscription("invalidSubscriptionId");
299         assertEquals(HttpStatus.NOT_FOUND, responseDelete.getStatusCode());
300     }
301
302
303     @Test
304     public void testSuccessPostSubscriptionWithValidNotificationTypes() throws Exception {
305
306         final String file = getAbsolutePath("src/test/resources/requests/SubscriptionRequest.json");
307         final String json = new String(Files.readAllBytes(Paths.get(file)));
308         final PkgmSubscriptionRequest request = gson.fromJson(json, PkgmSubscriptionRequest.class);
309
310         mockRestServiceServer.expect(requestTo(msbEndpoint)).andExpect(method(HttpMethod.POST))
311                 .andExpect(MockRestRequestMatchers.content().json(gson.toJson(getEtsiCatalogPkgmSubscriptionRequest())))
312                 .andRespond(withSuccess(gson.toJson(buildPkgmSubscription()), MediaType.APPLICATION_JSON));
313
314
315         final ResponseEntity<InlineResponse201> responseEntity =
316                 testRestTemplate.postForEntity(LOCALHOST_URL + port + PACKAGE_MANAGEMENT_BASE_URL + "/subscriptions",
317                         request, InlineResponse201.class);
318
319         assertEquals(HttpStatus.CREATED, responseEntity.getStatusCode());
320         assertTrue(responseEntity.hasBody());
321         final InlineResponse201 actual = responseEntity.getBody();
322         assertEquals(ID, actual.getId());
323
324
325     }
326
327     private org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.PkgmSubscriptionRequest getEtsiCatalogPkgmSubscriptionRequest() {
328         return new org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.PkgmSubscriptionRequest()
329                 .filter(new PkgmNotificationsFilter()
330                         .addNotificationTypesItem(
331                                 PkgmNotificationsFilter.NotificationTypesEnum.VNFPACKAGEONBOARDINGNOTIFICATION)
332                         .addVnfdIdItem("VNFDID").addVnfPkgIdItem("VNFPKGID")
333                         .addOperationalStateItem(PkgmNotificationsFilter.OperationalStateEnum.ENABLED)
334                         .addVnfProductsFromProvidersItem(new VnfProductsProviders().vnfProvider("EST")
335                                 .addVnfProductsItem(new VnfProducts().vnfProductName("VnfProducts")
336                                         .addVersionsItem(new Version().vnfSoftwareVersion("vnfSoftwareVersion")
337                                                 .addVnfdVersionsItem("version1")))))
338                 .callbackUri(_NOTIFICATION_CALLBACK_URI).authentication(
339                         new SubscriptionAuthentication().addAuthTypeItem(SubscriptionAuthentication.AuthTypeEnum.BASIC)
340                                 .paramsBasic(new BasicAuth().userName("vnfm").password("password1$")));
341     }
342
343     private PkgmSubscriptionRequest buildPkgmSubscriptionRequest() {
344         final PkgmSubscriptionRequest pkgmSubscriptionRequest = new PkgmSubscriptionRequest();
345         final SubscriptionsFilter1 sub = buildSubscriptionsFilter();
346         final SubscriptionsAuthentication auth = new SubscriptionsAuthentication();
347         pkgmSubscriptionRequest.setFilter(sub);
348         pkgmSubscriptionRequest.setCallbackUri(msbEndpoint.toString());
349         pkgmSubscriptionRequest.setAuthentication(auth);
350         return pkgmSubscriptionRequest;
351     }
352
353     private SubscriptionsFilter1 buildSubscriptionsFilter() {
354         final SubscriptionsFilter1 sub = new SubscriptionsFilter1();
355         final List<String> vnfdIdList = new ArrayList<>();
356         final List<String> vnfPkgIdList = new ArrayList<>();
357         final List<SubscriptionsFilter1.NotificationTypesEnum> notificationTypes = new ArrayList<>();
358         final SubscriptionsFilterVnfProductsFromProviders subscriptionsFilterVnfProductsFromProviders =
359                 new SubscriptionsFilterVnfProductsFromProviders();
360         final List<SubscriptionsFilterVnfProductsFromProviders> vnfProductsFromProviders = new ArrayList<>();
361
362         vnfProductsFromProviders.add(subscriptionsFilterVnfProductsFromProviders);
363         sub.setVnfdId(vnfdIdList);
364         sub.setNotificationTypes(notificationTypes);
365         sub.setVnfPkgId(vnfPkgIdList);
366         sub.setVnfProductsFromProviders(vnfProductsFromProviders);
367         return sub;
368     }
369
370     private PkgmSubscription buildPkgmSubscription() {
371         final PkgmSubscription pkgmSubscription = new PkgmSubscription();
372         final PkgmNotificationsFilter pkgmNotificationsFilter = new PkgmNotificationsFilter();
373         final LinkSelf linkSelf = new LinkSelf();
374
375         pkgmSubscription.setId(ID);
376         pkgmSubscription.setCallbackUri(msbEndpoint + "/" + pkgmSubscription.getId().toString());
377         pkgmSubscription.setFilter(pkgmNotificationsFilter);
378         pkgmSubscription.setLinks(linkSelf);
379         return pkgmSubscription;
380     }
381
382     private PkgmSubscriptionRequest postSubscriptionForTest() {
383         final PkgmSubscriptionRequest pkgmSubscriptionRequest = buildPkgmSubscriptionRequest();
384         final PkgmSubscription pkgmSubscription = buildPkgmSubscription();
385
386         mockRestServiceServer.expect(requestTo(msbEndpoint)).andExpect(method(HttpMethod.POST))
387                 .andRespond(withSuccess(gson.toJson(pkgmSubscription), MediaType.APPLICATION_JSON));
388         return pkgmSubscriptionRequest;
389     }
390
391     private HttpHeaders buildHttpHeaders(final String uri) throws URISyntaxException {
392         final HttpHeaders headers = new HttpHeaders();
393         final URI myUri = new URI(uri);
394         headers.setLocation(myUri);
395         return headers;
396     }
397
398     private String getAbsolutePath(final String path) {
399         final File file = new File(path);
400         return file.getAbsolutePath();
401     }
402
403 }