3d26c33679cdb469f6bbcc457c25a93180244674
[so.git] /
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.junit.Assert.assertEquals;
24 import static org.junit.Assert.assertNotEquals;
25 import static org.junit.Assert.assertNotNull;
26 import static org.junit.Assert.assertThat;
27 import static org.onap.so.adapters.vnfmadapter.Constants.PACKAGE_MANAGEMENT_BASE_URL;
28 import static org.onap.so.client.RestTemplateConfig.CONFIGURABLE_REST_TEMPLATE;
29 import static org.springframework.test.web.client.match.MockRestRequestMatchers.requestTo;
30 import java.security.GeneralSecurityException;
31 import java.net.URI;
32 import java.net.URISyntaxException;
33 import java.util.ArrayList;
34 import java.util.List;
35 import java.util.Objects;
36 import java.util.UUID;
37 import com.google.gson.Gson;
38 import org.junit.Before;
39 import org.junit.Test;
40 import org.junit.runner.RunWith;
41 import org.onap.so.adapters.vnfmadapter.Constants;
42 import org.onap.so.adapters.vnfmadapter.VnfmAdapterApplication;
43 import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.LinkSelf;
44 import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.PkgmNotificationsFilter;
45 import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.PkgmSubscription;
46 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.InlineResponse2002;
47 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.PkgmSubscriptionRequest;
48 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.SubscriptionsAuthentication;
49 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.SubscriptionsFilter;
50 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.SubscriptionsFilter.NotificationTypesEnum;
51 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.SubscriptionsFilterVnfProductsFromProviders;
52 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.SubscriptionsLinks;
53 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.VnfPackagesLinksSelf;
54 import org.onap.so.utils.CryptoUtils;
55 import org.springframework.beans.factory.annotation.Autowired;
56 import org.springframework.beans.factory.annotation.Qualifier;
57 import org.springframework.boot.test.context.SpringBootTest;
58 import org.springframework.cache.Cache;
59 import org.springframework.cache.CacheManager;
60 import org.springframework.http.HttpHeaders;
61 import org.springframework.http.HttpStatus;
62 import org.springframework.http.MediaType;
63 import org.springframework.http.ResponseEntity;
64 import org.springframework.test.context.ActiveProfiles;
65 import org.springframework.test.context.junit4.SpringRunner;
66 import org.springframework.test.web.client.MockRestServiceServer;
67 import org.springframework.web.client.RestTemplate;
68 import org.springframework.http.HttpMethod;
69 import static org.springframework.test.web.client.match.MockRestRequestMatchers.method;
70 import static org.hamcrest.Matchers.is;
71 import static org.springframework.test.web.client.response.MockRestResponseCreators.withStatus;
72 import static org.springframework.test.web.client.response.MockRestResponseCreators.withSuccess;
73
74 /**
75  * @author Ronan Kenny (ronan.kenny@est.tech)
76  * @author Gareth Roper (gareth.roper@est.tech)
77  *
78  */
79 @RunWith(SpringRunner.class)
80 @SpringBootTest(classes = VnfmAdapterApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
81 @ActiveProfiles("test")
82 @SuppressWarnings("unchecked")
83 public class Sol003PackageManagementSubscriptionControllerTest {
84
85     private static String subscriptionId;
86     private final Gson gson = new Gson();
87
88     @Autowired
89     @Qualifier(CONFIGURABLE_REST_TEMPLATE)
90     private RestTemplate testRestTemplate;
91
92     private MockRestServiceServer mockRestServer;
93
94     @Autowired
95     private CacheManager cacheServiceProvider;
96     private final URI msbEndpoint = URI.create("http://msb-iag.onap:80/api/vnfpkgm/v1/subscriptions");
97
98     @Autowired
99     private Sol003PackageManagementSubscriptionController sol003PackageManagementSubscriptionController;
100
101     @Before
102     public void setUp() {
103         mockRestServer = MockRestServiceServer.bindTo(testRestTemplate).build();
104         final Cache cache = cacheServiceProvider.getCache(Constants.PACKAGE_MANAGEMENT_SUBSCRIPTION_CACHE);
105         cache.clear();
106     }
107
108     @Test
109     public void testSuccessPostSubscription() throws GeneralSecurityException, URISyntaxException {
110         final PkgmSubscriptionRequest pkgmSubscriptionRequest = postSubscriptionForTest();
111         final ResponseEntity<InlineResponse2002> response =
112                 (ResponseEntity<InlineResponse2002>) sol003PackageManagementSubscriptionController
113                         .postSubscriptionRequest(pkgmSubscriptionRequest);
114
115         final HttpHeaders headers = buildHttpHeaders(Objects.requireNonNull(response.getBody()).getCallbackUri());
116
117         SubscriptionsLinks subscriptionsLinks = new SubscriptionsLinks();
118         VnfPackagesLinksSelf vnfPackagesLinksSelf = new VnfPackagesLinksSelf();
119         vnfPackagesLinksSelf.setHref("https://so-vnfm-adapter.onap:30406" + PACKAGE_MANAGEMENT_BASE_URL
120                 + "/subscriptions/" + response.getBody().getId());
121         subscriptionsLinks.setSelf(vnfPackagesLinksSelf);
122
123         assertEquals(pkgmSubscriptionRequest.getFilter(), response.getBody().getFilter());
124         assertEquals(subscriptionsLinks, response.getBody().getLinks());
125         assertEquals(response.getBody().getFilter(), pkgmSubscriptionRequest.getFilter());
126         assert (response.getHeaders().equals(headers));
127         assertThat(response.getStatusCode(), is(HttpStatus.CREATED));
128         assertNotNull(response.getBody().getCallbackUri());
129     }
130
131     @Test
132     public void testFailPostSubscriptionAlreadyExists() throws GeneralSecurityException {
133         final PkgmSubscriptionRequest pkgmSubscriptionRequest = postSubscriptionForTest();
134
135         final ResponseEntity<InlineResponse2002> response =
136                 (ResponseEntity<InlineResponse2002>) sol003PackageManagementSubscriptionController
137                         .postSubscriptionRequest(pkgmSubscriptionRequest);
138         subscriptionId = Objects.requireNonNull(response.getBody()).getId();
139
140         // Create duplicate entry
141         final PkgmSubscriptionRequest pkgmSubscriptionRequest2 = buildPkgmSubscriptionRequest();
142
143         final ResponseEntity<InlineResponse2002> response2002 =
144                 (ResponseEntity<InlineResponse2002>) sol003PackageManagementSubscriptionController
145                         .postSubscriptionRequest(pkgmSubscriptionRequest2);
146
147         assertEquals(HttpStatus.SEE_OTHER, response2002.getStatusCode());
148     }
149
150     @Test
151     public void testSuccessGetSubscriptionWithSubscriptionId() throws GeneralSecurityException, URISyntaxException {
152         final PkgmSubscriptionRequest pkgmSubscriptionRequest = postSubscriptionForTest();
153
154         final ResponseEntity<InlineResponse2002> response =
155                 (ResponseEntity<InlineResponse2002>) sol003PackageManagementSubscriptionController
156                         .postSubscriptionRequest(pkgmSubscriptionRequest);
157         subscriptionId = Objects.requireNonNull(response.getBody()).getId();
158
159         final ResponseEntity<InlineResponse2002> response2002 =
160                 (ResponseEntity<InlineResponse2002>) sol003PackageManagementSubscriptionController
161                         .getSubscription(subscriptionId);
162
163         final HttpHeaders headers = buildHttpHeaders(response.getBody().getCallbackUri());
164
165
166         assertEquals(response.getBody().getFilter(), pkgmSubscriptionRequest.getFilter());
167         assert (response.getHeaders().equals(headers));
168         assertEquals(HttpStatus.OK, response2002.getStatusCode());
169         assertEquals(pkgmSubscriptionRequest.getFilter(), response.getBody().getFilter());
170         // Ensure CallBackUri is set to new URI
171         assertNotEquals(pkgmSubscriptionRequest.getCallbackUri(), response.getBody().getCallbackUri());
172     }
173
174     @Test
175     public void testFailGetSubscriptionWithInvalidSubscriptionId() {
176         final ResponseEntity<InlineResponse2002> response =
177                 (ResponseEntity<InlineResponse2002>) sol003PackageManagementSubscriptionController
178                         .getSubscription("invalidSubscriptionId");
179         assertEquals(HttpStatus.NOT_FOUND, response.getStatusCode());
180     }
181
182     @Test
183     public void testSuccessGetSubscriptions() throws GeneralSecurityException {
184         final PkgmSubscription pkgmSubscription = buildPkgmSubscription();
185         final PkgmSubscriptionRequest pkgmSubscriptionRequest = buildPkgmSubscriptionRequest();
186
187         mockRestServer.expect(requestTo(msbEndpoint)).andExpect(method(HttpMethod.POST))
188                 .andRespond(withSuccess(gson.toJson(pkgmSubscription), MediaType.APPLICATION_JSON));
189
190         sol003PackageManagementSubscriptionController.postSubscriptionRequest(pkgmSubscriptionRequest);
191         ResponseEntity<List<InlineResponse2002>> response =
192                 sol003PackageManagementSubscriptionController.getSubscriptions();
193
194         List<InlineResponse2002> subscriptionsList = response.getBody();
195
196         assertEquals(Objects.requireNonNull(response.getBody()).get(0).getFilter(),
197                 pkgmSubscriptionRequest.getFilter());
198         assert (subscriptionsList != null);
199         assertNotEquals('0', subscriptionsList.size());
200         assertEquals(HttpStatus.OK, response.getStatusCode());
201     }
202
203     @Test
204     public void testSuccessDeleteSubscriptionWithSubscriptionId() throws GeneralSecurityException {
205         final PkgmSubscriptionRequest pkgmSubscriptionRequest = buildPkgmSubscriptionRequest();
206         final PkgmSubscription pkgmSubscription = buildPkgmSubscription();
207         final String subscriptionId = pkgmSubscription.getId();
208
209         mockRestServer.expect(requestTo(msbEndpoint)).andExpect(method(HttpMethod.POST))
210                 .andRespond(withSuccess(gson.toJson(pkgmSubscription), MediaType.APPLICATION_JSON));
211         mockRestServer.expect(requestTo(msbEndpoint + "/" + subscriptionId)).andExpect(method(HttpMethod.DELETE))
212                 .andRespond(withStatus(HttpStatus.NO_CONTENT));
213
214         final ResponseEntity<InlineResponse2002> responsePost =
215                 (ResponseEntity<InlineResponse2002>) sol003PackageManagementSubscriptionController
216                         .postSubscriptionRequest(pkgmSubscriptionRequest);
217
218
219         final ResponseEntity responseDelete =
220                 sol003PackageManagementSubscriptionController.deleteSubscription(subscriptionId);
221
222         // Attempt to retrieve the subscription after delete
223         final ResponseEntity<InlineResponse2002> responseGetSubscription =
224                 (ResponseEntity<InlineResponse2002>) sol003PackageManagementSubscriptionController
225                         .getSubscription(subscriptionId);
226
227         assertEquals(HttpStatus.NOT_FOUND, responseGetSubscription.getStatusCode());
228         assertEquals(HttpStatus.NO_CONTENT, responseDelete.getStatusCode());
229     }
230
231     @Test
232     public void testFailDeleteSubscriptionWithInvalidSubscriptionId() throws URISyntaxException, InterruptedException {
233         final ResponseEntity<Void> responseDelete = (ResponseEntity<Void>) sol003PackageManagementSubscriptionController
234                 .deleteSubscription("invalidSubscriptionId");
235         assertEquals(HttpStatus.NOT_FOUND, responseDelete.getStatusCode());
236     }
237
238     private PkgmSubscriptionRequest buildPkgmSubscriptionRequest() {
239         final PkgmSubscriptionRequest pkgmSubscriptionRequest = new PkgmSubscriptionRequest();
240         final SubscriptionsFilter sub = buildSubscriptionsFilter();
241         final SubscriptionsAuthentication auth = new SubscriptionsAuthentication();
242         pkgmSubscriptionRequest.setFilter(sub);
243         pkgmSubscriptionRequest.setCallbackUri(msbEndpoint.toString());
244         pkgmSubscriptionRequest.setAuthentication(auth);
245         return pkgmSubscriptionRequest;
246     }
247
248     private SubscriptionsFilter buildSubscriptionsFilter() {
249         final SubscriptionsFilter sub = new SubscriptionsFilter();
250         final List<String> vnfdIdList = new ArrayList();
251         final List<String> vnfPkgIdList = new ArrayList();
252         final List<NotificationTypesEnum> notificationTypes = new ArrayList<>();
253         final SubscriptionsFilterVnfProductsFromProviders subscriptionsFilterVnfProductsFromProviders =
254                 new SubscriptionsFilterVnfProductsFromProviders();
255         final List<SubscriptionsFilterVnfProductsFromProviders> vnfProductsFromProviders = new ArrayList<>();
256
257         vnfProductsFromProviders.add(subscriptionsFilterVnfProductsFromProviders);
258         sub.setVnfdId(vnfdIdList);
259         sub.setNotificationTypes(notificationTypes);
260         sub.setVnfPkgId(vnfPkgIdList);
261         sub.setVnfProductsFromProviders(vnfProductsFromProviders);
262         return sub;
263     }
264
265     private PkgmSubscription buildPkgmSubscription() {
266         PkgmSubscription pkgmSubscription = new PkgmSubscription();
267         PkgmNotificationsFilter pkgmNotificationsFilter = new PkgmNotificationsFilter();
268         LinkSelf linkSelf = new LinkSelf();
269         String id = UUID.randomUUID().toString();
270         pkgmSubscription.setId(id);
271         pkgmSubscription.setCallbackUri(msbEndpoint + "/" + pkgmSubscription.getId().toString());
272         pkgmSubscription.setFilter(pkgmNotificationsFilter);
273         pkgmSubscription.setLinks(linkSelf);
274         return pkgmSubscription;
275     }
276
277     private PkgmSubscriptionRequest postSubscriptionForTest() {
278         final PkgmSubscriptionRequest pkgmSubscriptionRequest = buildPkgmSubscriptionRequest();
279         final PkgmSubscription pkgmSubscription = buildPkgmSubscription();
280
281         mockRestServer.expect(requestTo(msbEndpoint)).andExpect(method(HttpMethod.POST))
282                 .andRespond(withSuccess(gson.toJson(pkgmSubscription), MediaType.APPLICATION_JSON));
283         return pkgmSubscriptionRequest;
284     }
285
286     private HttpHeaders buildHttpHeaders(String uri) throws URISyntaxException {
287         final HttpHeaders headers = new HttpHeaders();
288         URI myUri = new URI(uri);
289         headers.setLocation(myUri);
290         return headers;
291     }
292
293 }