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.common.api.Constants;
53 import org.springframework.context.annotation.Bean;
54 import org.springframework.context.annotation.Import;
56 import javax.ws.rs.client.Entity;
57 import javax.ws.rs.core.MediaType;
58 import javax.ws.rs.core.Response;
60 import java.util.ArrayList;
61 import java.util.List;
63 import static java.util.Collections.emptyMap;
64 import static org.assertj.core.api.Assertions.assertThat;
65 import static org.mockito.ArgumentMatchers.any;
66 import static org.mockito.ArgumentMatchers.anyList;
67 import static org.mockito.ArgumentMatchers.anyMap;
68 import static org.mockito.ArgumentMatchers.anyString;
69 import static org.mockito.ArgumentMatchers.eq;
70 import static org.mockito.ArgumentMatchers.isA;
71 import static org.mockito.Mockito.*;
73 public class TypesUploadEndpointTest extends JerseySpringBaseTest {
75 static final String userId = "jh0003";
77 private static AccessValidations accessValidations;
78 private static HealingJanusGraphGenericDao janusGraphGenericDao;
79 private static PropertyOperation propertyOperation;
80 private static ComponentsUtils componentUtils;
81 private static OperationUtils operationUtils;
83 @org.springframework.context.annotation.Configuration
84 @Import(BaseTestConfig.class)
85 static class TypesUploadTestConfig {
88 TypesUploadEndpoint typesUploadEndpoint() {
89 return new TypesUploadEndpoint(commonImportManager(), annotationTypeOperations(), accessValidations);
93 CommonImportManager commonImportManager() {
94 return new CommonImportManager(componentUtils, propertyOperation);
98 AnnotationTypeOperations annotationTypeOperations() {
99 return new AnnotationTypeOperations(commonTypeOperations());
103 CommonTypeOperations commonTypeOperations() {
104 return new CommonTypeOperations(janusGraphGenericDao, propertyOperation, operationUtils);
109 public static void initClass() {
110 janusGraphGenericDao = mock(HealingJanusGraphGenericDao.class);
111 accessValidations = mock(AccessValidations.class);
112 propertyOperation = mock(PropertyOperation.class);
113 componentUtils = Mockito.mock(ComponentsUtils.class);
114 operationUtils = Mockito.mock(OperationUtils.class);
118 protected void configureClient(ClientConfig config) {
119 final JacksonJsonProvider jacksonJsonProvider = new JacksonJaxbJsonProvider()
120 .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
121 config.register(jacksonJsonProvider);
122 config.register(MultiPartFeature.class);
126 protected ResourceConfig configure() {
127 return super.configure(TypesUploadEndpointTest.TypesUploadTestConfig.class)
128 .register(TypesUploadEndpoint.class)
129 .property(LoggingFeature.LOGGING_FEATURE_LOGGER_LEVEL_SERVER, "WARNING");
133 public void creatingAnnotationTypeSuccessTest() {
134 doNothing().when(accessValidations).validateUserExists(eq(userId), anyString());
135 when(janusGraphGenericDao.createNode(isA(AnnotationTypeData.class), eq(AnnotationTypeData.class))).thenReturn(Either.left(new AnnotationTypeData()));
136 when(janusGraphGenericDao.getNode(anyString(), eq("org.openecomp.annotations.source.1.0.annotationtype"), eq(AnnotationTypeData.class))).thenReturn(Either.left(new AnnotationTypeData()));
137 when(janusGraphGenericDao.getByCriteria(eq(NodeTypeEnum.AnnotationType), anyMap(), eq(AnnotationTypeData.class))).thenReturn(Either.right(
138 JanusGraphOperationStatus.NOT_FOUND));
139 when(propertyOperation.addPropertiesToElementType(anyString(), eq(NodeTypeEnum.AnnotationType), anyList())).thenReturn(Either.left(emptyMap()));
140 when(propertyOperation.fillPropertiesList(anyString(), eq(NodeTypeEnum.AnnotationType), any())).thenReturn(
141 JanusGraphOperationStatus.OK);
142 when(propertyOperation.getJanusGraphGenericDao()).thenReturn(janusGraphGenericDao);
143 when(janusGraphGenericDao.commit()).thenReturn(JanusGraphOperationStatus.OK);
144 when(janusGraphGenericDao.rollback()).thenReturn(JanusGraphOperationStatus.OK);
145 FileDataBodyPart filePart = new FileDataBodyPart("annotationTypesZip", new File("src/test/resources/types/annotationTypes.zip"));
146 MultiPart multipartEntity = new FormDataMultiPart();
147 multipartEntity.bodyPart(filePart);
149 Response response = target().path("/v1/catalog/uploadType/annotationtypes")
150 .request(MediaType.APPLICATION_JSON)
151 .header(Constants.USER_ID_HEADER, userId)
152 .post(Entity.entity(multipartEntity, MediaType.MULTIPART_FORM_DATA), Response.class);
153 assertThat(response.getStatus()).isEqualTo(HttpStatus.CREATED_201);
154 assertThat(Boolean.valueOf(getTypeActionResult(response))).isTrue();
157 private String getTypeActionResult(Response response) {
158 String typeResult = "";
159 String body = response.readEntity(String.class);
160 int indexColon = body.lastIndexOf(':');
161 if (indexColon > 0) {
162 int indexCurly = body.indexOf('}', indexColon);
163 if (indexCurly > 0) {
164 typeResult = body.substring(indexColon+1, indexCurly);
171 public void creatingAnnotationTypeFailureTest() {
172 doNothing().when(accessValidations).validateUserExists(eq(userId), anyString());
173 when(janusGraphGenericDao.createNode(isA(AnnotationTypeData.class), eq(AnnotationTypeData.class))).thenReturn(Either.left(new AnnotationTypeData()));
174 when(janusGraphGenericDao.getNode(anyString(), eq("org.openecomp.annotations.source.1.0.annotationtype"), eq(AnnotationTypeData.class))).thenReturn(Either.left(new AnnotationTypeData()));
175 when(janusGraphGenericDao.getByCriteria(eq(NodeTypeEnum.AnnotationType), anyMap(), eq(AnnotationTypeData.class))).thenReturn(Either.right(
176 JanusGraphOperationStatus.NOT_FOUND));
177 when(propertyOperation.addPropertiesToElementType(anyString(), eq(NodeTypeEnum.AnnotationType), anyList())).thenThrow(new StorageException(
178 JanusGraphOperationStatus.MATCH_NOT_FOUND));
179 when(propertyOperation.fillPropertiesList(anyString(), eq(NodeTypeEnum.AnnotationType), any())).thenReturn(
180 JanusGraphOperationStatus.OK);
181 when(propertyOperation.getJanusGraphGenericDao()).thenReturn(janusGraphGenericDao);
182 when(janusGraphGenericDao.commit()).thenReturn(JanusGraphOperationStatus.OK);
183 when(janusGraphGenericDao.rollback()).thenReturn(JanusGraphOperationStatus.OK);
184 FileDataBodyPart filePart = new FileDataBodyPart("annotationTypesZip", new File("src/test/resources/types/annotationTypes.zip"));
185 MultiPart multipartEntity = new FormDataMultiPart();
186 multipartEntity.bodyPart(filePart);
188 Response response = target().path("/v1/catalog/uploadType/annotationtypes")
189 .request(MediaType.APPLICATION_JSON)
190 .header(Constants.USER_ID_HEADER, userId)
191 .post(Entity.entity(multipartEntity, MediaType.MULTIPART_FORM_DATA), Response.class);
192 assertThat(response.getStatus()).isEqualTo(HttpStatus.BAD_REQUEST_400);
193 assertThat(Boolean.valueOf(getTypeActionResult(response))).isFalse();
197 public void singleTypeSucceeded_statusIsCreated() {
198 List<ImmutablePair<AnnotationTypeDefinition, Boolean>> typeActionResults = new ArrayList<>();
199 AnnotationTypeDefinition dummyDefition = new AnnotationTypeDefinition();
200 typeActionResults.add(new ImmutablePair(dummyDefition, true));
201 assertThat(TypesUploadEndpoint.getHttpStatus(typeActionResults).value()).isEqualTo(HttpStatus.CREATED_201);
205 public void singleTypeExists_statusIsConflict() {
206 List<ImmutablePair<AnnotationTypeDefinition, Boolean>> typeActionResults = new ArrayList<>();
207 AnnotationTypeDefinition dummyDefition = new AnnotationTypeDefinition();
208 typeActionResults.add(new ImmutablePair(dummyDefition, null));
209 assertThat(TypesUploadEndpoint.getHttpStatus(typeActionResults).value()).isEqualTo(HttpStatus.CONFLICT_409);
213 public void mixedSuccessAndExists_statusIsCreated() {
214 List<ImmutablePair<AnnotationTypeDefinition, Boolean>> typeActionResults = new ArrayList<>();
215 AnnotationTypeDefinition dummyDefition = new AnnotationTypeDefinition();
216 typeActionResults.add(new ImmutablePair(dummyDefition, true));
217 typeActionResults.add(new ImmutablePair(dummyDefition, null));
218 assertThat(TypesUploadEndpoint.getHttpStatus(typeActionResults).value()).isEqualTo(HttpStatus.CREATED_201);
222 public void mixedSuccessAndFailure_statusIsBadRequest() {
223 List<ImmutablePair<AnnotationTypeDefinition, Boolean>> typeActionResults = new ArrayList<>();
224 AnnotationTypeDefinition dummyDefition = new AnnotationTypeDefinition();
225 typeActionResults.add(new ImmutablePair(dummyDefition, true));
226 typeActionResults.add(new ImmutablePair(dummyDefition, false));
227 typeActionResults.add(new ImmutablePair(dummyDefition, null));
228 assertThat(TypesUploadEndpoint.getHttpStatus(typeActionResults).value()).isEqualTo(HttpStatus.BAD_REQUEST_400);