2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
6 * ================================================================================
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 * ============LICENSE_END=========================================================
21 package org.openecomp.sdc.be.servlets;
23 import com.fasterxml.jackson.databind.DeserializationFeature;
24 import fj.data.Either;
25 import org.apache.commons.lang3.tuple.ImmutablePair;
26 import org.eclipse.jetty.http.HttpStatus;
27 import org.glassfish.jersey.client.ClientConfig;
28 import org.glassfish.jersey.jackson.internal.jackson.jaxrs.json.JacksonJaxbJsonProvider;
29 import org.glassfish.jersey.jackson.internal.jackson.jaxrs.json.JacksonJsonProvider;
30 import org.glassfish.jersey.logging.LoggingFeature;
31 import org.glassfish.jersey.media.multipart.FormDataMultiPart;
32 import org.glassfish.jersey.media.multipart.MultiPart;
33 import org.glassfish.jersey.media.multipart.MultiPartFeature;
34 import org.glassfish.jersey.media.multipart.file.FileDataBodyPart;
35 import org.glassfish.jersey.server.ResourceConfig;
36 import org.junit.BeforeClass;
37 import org.junit.Test;
38 import org.mockito.Mockito;
39 import org.openecomp.sdc.be.components.impl.CommonImportManager;
40 import org.openecomp.sdc.be.components.validation.AccessValidations;
41 import org.openecomp.sdc.be.dao.janusgraph.HealingJanusGraphGenericDao;
42 import org.openecomp.sdc.be.dao.janusgraph.JanusGraphOperationStatus;
43 import org.openecomp.sdc.be.datatypes.enums.NodeTypeEnum;
44 import org.openecomp.sdc.be.impl.ComponentsUtils;
45 import org.openecomp.sdc.be.model.AnnotationTypeDefinition;
46 import org.openecomp.sdc.be.model.operations.StorageException;
47 import org.openecomp.sdc.be.model.operations.impl.AnnotationTypeOperations;
48 import org.openecomp.sdc.be.model.operations.impl.CommonTypeOperations;
49 import org.openecomp.sdc.be.model.operations.impl.OperationUtils;
50 import org.openecomp.sdc.be.model.operations.impl.PropertyOperation;
51 import org.openecomp.sdc.be.resources.data.AnnotationTypeData;
52 import org.openecomp.sdc.be.user.UserBusinessLogic;
53 import org.openecomp.sdc.common.api.Constants;
54 import org.springframework.context.annotation.Bean;
55 import org.springframework.context.annotation.Import;
57 import javax.ws.rs.client.Entity;
58 import javax.ws.rs.core.MediaType;
59 import javax.ws.rs.core.Response;
61 import java.util.ArrayList;
62 import java.util.List;
64 import static java.util.Collections.emptyMap;
65 import static org.assertj.core.api.Assertions.assertThat;
66 import static org.mockito.ArgumentMatchers.any;
67 import static org.mockito.ArgumentMatchers.anyList;
68 import static org.mockito.ArgumentMatchers.anyMap;
69 import static org.mockito.ArgumentMatchers.anyString;
70 import static org.mockito.ArgumentMatchers.eq;
71 import static org.mockito.ArgumentMatchers.isA;
72 import static org.mockito.Mockito.doNothing;
73 import static org.mockito.Mockito.mock;
74 import static org.mockito.Mockito.when;
76 public class TypesUploadEndpointTest extends JerseySpringBaseTest {
78 static final String userId = "jh0003";
80 private static AccessValidations accessValidations;
81 private static HealingJanusGraphGenericDao janusGraphGenericDao;
82 private static PropertyOperation propertyOperation;
83 private static ComponentsUtils componentUtils;
84 private static OperationUtils operationUtils;
86 @org.springframework.context.annotation.Configuration
87 @Import(BaseTestConfig.class)
88 static class TypesUploadTestConfig {
91 TypesUploadEndpoint typesUploadEndpoint() {
92 UserBusinessLogic userBusinessLogic = mock(UserBusinessLogic.class);
93 ComponentsUtils componentsUtils = mock(ComponentsUtils.class);
94 return new TypesUploadEndpoint(userBusinessLogic, componentsUtils, commonImportManager(), annotationTypeOperations(), accessValidations);
98 CommonImportManager commonImportManager() {
99 return new CommonImportManager(componentUtils, propertyOperation);
103 AnnotationTypeOperations annotationTypeOperations() {
104 return new AnnotationTypeOperations(commonTypeOperations());
108 CommonTypeOperations commonTypeOperations() {
109 return new CommonTypeOperations(janusGraphGenericDao, propertyOperation, operationUtils);
114 public static void initClass() {
115 janusGraphGenericDao = mock(HealingJanusGraphGenericDao.class);
116 accessValidations = mock(AccessValidations.class);
117 propertyOperation = mock(PropertyOperation.class);
118 componentUtils = Mockito.mock(ComponentsUtils.class);
119 operationUtils = Mockito.mock(OperationUtils.class);
123 protected void configureClient(ClientConfig config) {
124 final JacksonJsonProvider jacksonJsonProvider = new JacksonJaxbJsonProvider()
125 .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
126 config.register(jacksonJsonProvider);
127 config.register(MultiPartFeature.class);
131 protected ResourceConfig configure() {
132 return super.configure(TypesUploadEndpointTest.TypesUploadTestConfig.class)
133 .register(TypesUploadEndpoint.class)
134 .property(LoggingFeature.LOGGING_FEATURE_LOGGER_LEVEL_SERVER, "WARNING");
138 public void creatingAnnotationTypeSuccessTest() {
139 doNothing().when(accessValidations).validateUserExists(eq(userId), anyString());
140 when(janusGraphGenericDao.createNode(isA(AnnotationTypeData.class), eq(AnnotationTypeData.class))).thenReturn(Either.left(new AnnotationTypeData()));
141 when(janusGraphGenericDao.getNode(anyString(), eq("org.openecomp.annotations.source.1.0.annotationtype"), eq(AnnotationTypeData.class))).thenReturn(Either.left(new AnnotationTypeData()));
142 when(janusGraphGenericDao.getByCriteria(eq(NodeTypeEnum.AnnotationType), anyMap(), eq(AnnotationTypeData.class))).thenReturn(Either.right(
143 JanusGraphOperationStatus.NOT_FOUND));
144 when(propertyOperation.addPropertiesToElementType(anyString(), eq(NodeTypeEnum.AnnotationType), anyList())).thenReturn(Either.left(emptyMap()));
145 when(propertyOperation.fillPropertiesList(anyString(), eq(NodeTypeEnum.AnnotationType), any())).thenReturn(
146 JanusGraphOperationStatus.OK);
147 when(propertyOperation.getJanusGraphGenericDao()).thenReturn(janusGraphGenericDao);
148 when(janusGraphGenericDao.commit()).thenReturn(JanusGraphOperationStatus.OK);
149 when(janusGraphGenericDao.rollback()).thenReturn(JanusGraphOperationStatus.OK);
150 FileDataBodyPart filePart = new FileDataBodyPart("annotationTypesZip", new File("src/test/resources/types/annotationTypes.zip"));
151 MultiPart multipartEntity = new FormDataMultiPart();
152 multipartEntity.bodyPart(filePart);
154 Response response = target().path("/v1/catalog/uploadType/annotationtypes")
155 .request(MediaType.APPLICATION_JSON)
156 .header(Constants.USER_ID_HEADER, userId)
157 .post(Entity.entity(multipartEntity, MediaType.MULTIPART_FORM_DATA), Response.class);
158 assertThat(response.getStatus()).isEqualTo(HttpStatus.CREATED_201);
159 assertThat(Boolean.valueOf(getTypeActionResult(response))).isTrue();
162 private String getTypeActionResult(Response response) {
163 String typeResult = "";
164 String body = response.readEntity(String.class);
165 int indexColon = body.lastIndexOf(':');
166 if (indexColon > 0) {
167 int indexCurly = body.indexOf('}', indexColon);
168 if (indexCurly > 0) {
169 typeResult = body.substring(indexColon+1, indexCurly);
176 public void creatingAnnotationTypeFailureTest() {
177 doNothing().when(accessValidations).validateUserExists(eq(userId), anyString());
178 when(janusGraphGenericDao.createNode(isA(AnnotationTypeData.class), eq(AnnotationTypeData.class))).thenReturn(Either.left(new AnnotationTypeData()));
179 when(janusGraphGenericDao.getNode(anyString(), eq("org.openecomp.annotations.source.1.0.annotationtype"), eq(AnnotationTypeData.class))).thenReturn(Either.left(new AnnotationTypeData()));
180 when(janusGraphGenericDao.getByCriteria(eq(NodeTypeEnum.AnnotationType), anyMap(), eq(AnnotationTypeData.class))).thenReturn(Either.right(
181 JanusGraphOperationStatus.NOT_FOUND));
182 when(propertyOperation.addPropertiesToElementType(anyString(), eq(NodeTypeEnum.AnnotationType), anyList())).thenThrow(new StorageException(
183 JanusGraphOperationStatus.MATCH_NOT_FOUND));
184 when(propertyOperation.fillPropertiesList(anyString(), eq(NodeTypeEnum.AnnotationType), any())).thenReturn(
185 JanusGraphOperationStatus.OK);
186 when(propertyOperation.getJanusGraphGenericDao()).thenReturn(janusGraphGenericDao);
187 when(janusGraphGenericDao.commit()).thenReturn(JanusGraphOperationStatus.OK);
188 when(janusGraphGenericDao.rollback()).thenReturn(JanusGraphOperationStatus.OK);
189 FileDataBodyPart filePart = new FileDataBodyPart("annotationTypesZip", new File("src/test/resources/types/annotationTypes.zip"));
190 MultiPart multipartEntity = new FormDataMultiPart();
191 multipartEntity.bodyPart(filePart);
193 Response response = target().path("/v1/catalog/uploadType/annotationtypes")
194 .request(MediaType.APPLICATION_JSON)
195 .header(Constants.USER_ID_HEADER, userId)
196 .post(Entity.entity(multipartEntity, MediaType.MULTIPART_FORM_DATA), Response.class);
197 assertThat(response.getStatus()).isEqualTo(HttpStatus.BAD_REQUEST_400);
198 assertThat(Boolean.valueOf(getTypeActionResult(response))).isFalse();
202 public void singleTypeSucceeded_statusIsCreated() {
203 List<ImmutablePair<AnnotationTypeDefinition, Boolean>> typeActionResults = new ArrayList<>();
204 AnnotationTypeDefinition dummyDefition = new AnnotationTypeDefinition();
205 typeActionResults.add(new ImmutablePair(dummyDefition, true));
206 assertThat(TypesUploadEndpoint.getHttpStatus(typeActionResults).value()).isEqualTo(HttpStatus.CREATED_201);
210 public void singleTypeExists_statusIsConflict() {
211 List<ImmutablePair<AnnotationTypeDefinition, Boolean>> typeActionResults = new ArrayList<>();
212 AnnotationTypeDefinition dummyDefition = new AnnotationTypeDefinition();
213 typeActionResults.add(new ImmutablePair(dummyDefition, null));
214 assertThat(TypesUploadEndpoint.getHttpStatus(typeActionResults).value()).isEqualTo(HttpStatus.CONFLICT_409);
218 public void mixedSuccessAndExists_statusIsCreated() {
219 List<ImmutablePair<AnnotationTypeDefinition, Boolean>> typeActionResults = new ArrayList<>();
220 AnnotationTypeDefinition dummyDefition = new AnnotationTypeDefinition();
221 typeActionResults.add(new ImmutablePair(dummyDefition, true));
222 typeActionResults.add(new ImmutablePair(dummyDefition, null));
223 assertThat(TypesUploadEndpoint.getHttpStatus(typeActionResults).value()).isEqualTo(HttpStatus.CREATED_201);
227 public void mixedSuccessAndFailure_statusIsBadRequest() {
228 List<ImmutablePair<AnnotationTypeDefinition, Boolean>> typeActionResults = new ArrayList<>();
229 AnnotationTypeDefinition dummyDefition = new AnnotationTypeDefinition();
230 typeActionResults.add(new ImmutablePair(dummyDefition, true));
231 typeActionResults.add(new ImmutablePair(dummyDefition, false));
232 typeActionResults.add(new ImmutablePair(dummyDefition, null));
233 assertThat(TypesUploadEndpoint.getHttpStatus(typeActionResults).value()).isEqualTo(HttpStatus.BAD_REQUEST_400);