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