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
9 * http://www.apache.org/licenses/LICENSE-2.0
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.
17 * SPDX-License-Identifier: Apache-2.0
18 * ============LICENSE_END=========================================================
21 package org.onap.so.adapters.vnfmadapter.rest;
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;
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;
76 * @author Ronan Kenny (ronan.kenny@est.tech)
77 * @author Gareth Roper (gareth.roper@est.tech)
79 @RunWith(SpringRunner.class)
80 @SpringBootTest(classes = VnfmAdapterApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
81 @ActiveProfiles("test")
82 public class Sol003PackageManagementSubscriptionControllerTest {
84 private final Gson gson = new Gson();
85 private final URI msbEndpoint = URI.create("http://msb-iag.onap:80/api/vnfpkgm/v1/subscriptions");
87 @Qualifier(CONFIGURABLE_REST_TEMPLATE)
88 private RestTemplate restTemplate;
89 private MockRestServiceServer mockRestServiceServer;
91 private CacheManager cacheServiceProvider;
93 private Sol003PackageManagementSubscriptionController sol003PackageManagementSubscriptionController;
95 private static final String ID = UUID.randomUUID().toString();
99 mockRestServiceServer = MockRestServiceServer.bindTo(restTemplate).build();
100 final Cache cache = cacheServiceProvider.getCache(Constants.PACKAGE_MANAGEMENT_SUBSCRIPTION_CACHE);
105 public void testSuccessPostSubscription() throws GeneralSecurityException, URISyntaxException {
106 final PkgmSubscriptionRequest pkgmSubscriptionRequest = postSubscriptionForTest();
107 final ResponseEntity<InlineResponse2002> response =
108 (ResponseEntity<InlineResponse2002>) sol003PackageManagementSubscriptionController
109 .postSubscriptionRequest(pkgmSubscriptionRequest);
111 final HttpHeaders headers = buildHttpHeaders(Objects.requireNonNull(response.getBody()).getCallbackUri());
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);
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());
128 public void testFailPostSubscriptionAlreadyExists() throws GeneralSecurityException {
129 final PkgmSubscriptionRequest pkgmSubscriptionRequest = postSubscriptionForTest();
131 final ResponseEntity<InlineResponse2002> response =
132 (ResponseEntity<InlineResponse2002>) sol003PackageManagementSubscriptionController
133 .postSubscriptionRequest(pkgmSubscriptionRequest);
135 // Create duplicate entry
136 final PkgmSubscriptionRequest pkgmSubscriptionRequest2 = buildPkgmSubscriptionRequest();
138 final ResponseEntity<InlineResponse2002> response2002 =
139 (ResponseEntity<InlineResponse2002>) sol003PackageManagementSubscriptionController
140 .postSubscriptionRequest(pkgmSubscriptionRequest2);
142 assertEquals(HttpStatus.SEE_OTHER, response2002.getStatusCode());
146 public void testSuccessGetSubscriptionWithSubscriptionId() throws GeneralSecurityException, URISyntaxException {
148 final PkgmSubscriptionRequest pkgmSubscriptionRequest = postSubscriptionForTest();
150 mockRestServiceServer.expect(requestTo(msbEndpoint + "/" + ID)).andExpect(method(HttpMethod.GET))
151 .andRespond(withSuccess(gson.toJson(new NsdmSubscription().id(ID)), MediaType.APPLICATION_JSON));
153 final ResponseEntity<InlineResponse2002> response =
154 (ResponseEntity<InlineResponse2002>) sol003PackageManagementSubscriptionController
155 .postSubscriptionRequest(pkgmSubscriptionRequest);
156 final String subscriptionId = response.getBody().getId();
160 final ResponseEntity<InlineResponse2002> response2002 =
161 (ResponseEntity<InlineResponse2002>) sol003PackageManagementSubscriptionController
162 .getSubscription(subscriptionId);
164 final HttpHeaders headers = buildHttpHeaders(response.getBody().getCallbackUri());
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());
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());
186 public void testSuccessGetSubscriptions() throws GeneralSecurityException {
187 final PkgmSubscription pkgmSubscription = buildPkgmSubscription();
188 final PkgmSubscriptionRequest pkgmSubscriptionRequest = buildPkgmSubscriptionRequest();
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));
195 sol003PackageManagementSubscriptionController.postSubscriptionRequest(pkgmSubscriptionRequest);
196 final ResponseEntity<List<InlineResponse2002>> response =
197 sol003PackageManagementSubscriptionController.getSubscriptions();
199 final List<InlineResponse2002> subscriptionsList = response.getBody();
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());
209 public void testSuccessDeleteSubscriptionWithSubscriptionId() throws GeneralSecurityException {
210 final PkgmSubscriptionRequest pkgmSubscriptionRequest = buildPkgmSubscriptionRequest();
211 final PkgmSubscription pkgmSubscription = buildPkgmSubscription();
212 final String subscriptionId = pkgmSubscription.getId();
214 mockRestServiceServer.expect(requestTo(msbEndpoint)).andExpect(method(HttpMethod.POST))
215 .andRespond(withSuccess(gson.toJson(pkgmSubscription), MediaType.APPLICATION_JSON));
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));
223 final ResponseEntity<InlineResponse2002> responsePost =
224 (ResponseEntity<InlineResponse2002>) sol003PackageManagementSubscriptionController
225 .postSubscriptionRequest(pkgmSubscriptionRequest);
227 final ResponseEntity responseDelete =
228 sol003PackageManagementSubscriptionController.deleteSubscription(subscriptionId);
230 // Attempt to retrieve the subscription after delete
231 final ResponseEntity<InlineResponse2002> responseGetSubscription =
232 (ResponseEntity<InlineResponse2002>) sol003PackageManagementSubscriptionController
233 .getSubscription(subscriptionId);
235 assertEquals(HttpStatus.NOT_FOUND, responseGetSubscription.getStatusCode());
236 assertEquals(HttpStatus.NO_CONTENT, responseDelete.getStatusCode());
240 public void testDeleteSubscription_SubscripitonNotFoundInEtsiCatalogManager_SubscriptionDeletedFromLocalCache()
241 throws GeneralSecurityException {
242 final PkgmSubscriptionRequest pkgmSubscriptionRequest = buildPkgmSubscriptionRequest();
243 final PkgmSubscription pkgmSubscription = buildPkgmSubscription();
245 mockRestServiceServer.expect(requestTo(msbEndpoint)).andExpect(method(HttpMethod.POST))
246 .andRespond(withSuccess(gson.toJson(pkgmSubscription), MediaType.APPLICATION_JSON));
248 mockRestServiceServer.expect(requestTo(msbEndpoint + "/" + ID)).andExpect(method(HttpMethod.DELETE))
249 .andRespond(withStatus(HttpStatus.NOT_FOUND));
251 final ResponseEntity<InlineResponse2002> responsePost =
252 (ResponseEntity<InlineResponse2002>) sol003PackageManagementSubscriptionController
253 .postSubscriptionRequest(pkgmSubscriptionRequest);
255 final Cache cache = cacheServiceProvider.getCache(Constants.PACKAGE_MANAGEMENT_SUBSCRIPTION_CACHE);
256 assertNotNull(cache.get(ID));
258 final ResponseEntity responseDelete = sol003PackageManagementSubscriptionController.deleteSubscription(ID);
260 assertEquals(HttpStatus.NO_CONTENT, responseDelete.getStatusCode());
261 assertNull(cache.get(ID));
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());
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;
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<>();
291 vnfProductsFromProviders.add(subscriptionsFilterVnfProductsFromProviders);
292 sub.setVnfdId(vnfdIdList);
293 sub.setNotificationTypes(notificationTypes);
294 sub.setVnfPkgId(vnfPkgIdList);
295 sub.setVnfProductsFromProviders(vnfProductsFromProviders);
299 private PkgmSubscription buildPkgmSubscription() {
300 final PkgmSubscription pkgmSubscription = new PkgmSubscription();
301 final PkgmNotificationsFilter pkgmNotificationsFilter = new PkgmNotificationsFilter();
302 final LinkSelf linkSelf = new LinkSelf();
304 pkgmSubscription.setId(ID);
305 pkgmSubscription.setCallbackUri(msbEndpoint + "/" + pkgmSubscription.getId().toString());
306 pkgmSubscription.setFilter(pkgmNotificationsFilter);
307 pkgmSubscription.setLinks(linkSelf);
308 return pkgmSubscription;
311 private PkgmSubscriptionRequest postSubscriptionForTest() {
312 final PkgmSubscriptionRequest pkgmSubscriptionRequest = buildPkgmSubscriptionRequest();
313 final PkgmSubscription pkgmSubscription = buildPkgmSubscription();
315 mockRestServiceServer.expect(requestTo(msbEndpoint)).andExpect(method(HttpMethod.POST))
316 .andRespond(withSuccess(gson.toJson(pkgmSubscription), MediaType.APPLICATION_JSON));
317 return pkgmSubscriptionRequest;
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);