1 package org.openecomp.sdc.be.servlets;
3 import com.fasterxml.jackson.databind.DeserializationFeature;
5 import org.apache.commons.lang3.tuple.ImmutablePair;
6 import org.eclipse.jetty.http.HttpStatus;
7 import org.glassfish.jersey.client.ClientConfig;
8 import org.glassfish.jersey.jackson.internal.jackson.jaxrs.json.JacksonJaxbJsonProvider;
9 import org.glassfish.jersey.jackson.internal.jackson.jaxrs.json.JacksonJsonProvider;
10 import org.glassfish.jersey.logging.LoggingFeature;
11 import org.glassfish.jersey.media.multipart.FormDataMultiPart;
12 import org.glassfish.jersey.media.multipart.MultiPart;
13 import org.glassfish.jersey.media.multipart.MultiPartFeature;
14 import org.glassfish.jersey.media.multipart.file.FileDataBodyPart;
15 import org.glassfish.jersey.server.ResourceConfig;
16 import org.junit.BeforeClass;
17 import org.junit.Test;
18 import org.mockito.Mockito;
19 import org.openecomp.sdc.be.components.impl.CommonImportManager;
20 import org.openecomp.sdc.be.components.validation.AccessValidations;
21 import org.openecomp.sdc.be.dao.titan.TitanGenericDao;
22 import org.openecomp.sdc.be.dao.titan.TitanOperationStatus;
23 import org.openecomp.sdc.be.datatypes.enums.NodeTypeEnum;
24 import org.openecomp.sdc.be.impl.ComponentsUtils;
25 import org.openecomp.sdc.be.model.AnnotationTypeDefinition;
26 import org.openecomp.sdc.be.model.operations.StorageException;
27 import org.openecomp.sdc.be.model.operations.impl.AnnotationTypeOperations;
28 import org.openecomp.sdc.be.model.operations.impl.CommonTypeOperations;
29 import org.openecomp.sdc.be.model.operations.impl.OperationUtils;
30 import org.openecomp.sdc.be.model.operations.impl.PropertyOperation;
31 import org.openecomp.sdc.be.resources.data.AnnotationTypeData;
32 import org.openecomp.sdc.common.api.Constants;
33 import org.springframework.context.annotation.Bean;
34 import org.springframework.context.annotation.Import;
36 import javax.ws.rs.client.Entity;
37 import javax.ws.rs.core.MediaType;
38 import javax.ws.rs.core.Response;
40 import java.util.ArrayList;
41 import java.util.List;
43 import static java.util.Collections.emptyMap;
44 import static org.assertj.core.api.Assertions.assertThat;
45 import static org.mockito.ArgumentMatchers.any;
46 import static org.mockito.ArgumentMatchers.anyList;
47 import static org.mockito.ArgumentMatchers.anyMap;
48 import static org.mockito.ArgumentMatchers.anyString;
49 import static org.mockito.ArgumentMatchers.eq;
50 import static org.mockito.ArgumentMatchers.isA;
51 import static org.mockito.Mockito.*;
53 public class TypesUploadEndpointTest extends JerseySpringBaseTest {
55 static final String userId = "jh0003";
57 private static AccessValidations accessValidations;
58 private static TitanGenericDao titanGenericDao;
59 private static PropertyOperation propertyOperation;
60 private static ComponentsUtils componentUtils;
61 private static OperationUtils operationUtils;
63 @org.springframework.context.annotation.Configuration
64 @Import(BaseTestConfig.class)
65 static class TypesUploadTestConfig {
68 TypesUploadEndpoint typesUploadEndpoint() {
69 return new TypesUploadEndpoint(commonImportManager(), annotationTypeOperations(), accessValidations);
73 CommonImportManager commonImportManager() {
74 return new CommonImportManager(componentUtils, propertyOperation);
78 AnnotationTypeOperations annotationTypeOperations() {
79 return new AnnotationTypeOperations(commonTypeOperations());
83 CommonTypeOperations commonTypeOperations() {
84 return new CommonTypeOperations(titanGenericDao, propertyOperation, operationUtils);
89 public static void initClass() {
90 titanGenericDao = mock(TitanGenericDao.class);
91 accessValidations = mock(AccessValidations.class);
92 propertyOperation = mock(PropertyOperation.class);
93 componentUtils = Mockito.mock(ComponentsUtils.class);
94 operationUtils = Mockito.mock(OperationUtils.class);
98 protected void configureClient(ClientConfig config) {
99 final JacksonJsonProvider jacksonJsonProvider = new JacksonJaxbJsonProvider()
100 .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
101 config.register(jacksonJsonProvider);
102 config.register(MultiPartFeature.class);
106 protected ResourceConfig configure() {
107 return super.configure(TypesUploadEndpointTest.TypesUploadTestConfig.class)
108 .register(TypesUploadEndpoint.class)
109 .property(LoggingFeature.LOGGING_FEATURE_LOGGER_LEVEL_SERVER, "WARNING");
113 public void creatingAnnotationTypeSuccessTest() {
114 doNothing().when(accessValidations).validateUserExists(eq(userId), anyString());
115 when(titanGenericDao.createNode(isA(AnnotationTypeData.class), eq(AnnotationTypeData.class))).thenReturn(Either.left(new AnnotationTypeData()));
116 when(titanGenericDao.getNode(anyString(), eq("org.openecomp.annotations.source.1.0.annotationtype"), eq(AnnotationTypeData.class))).thenReturn(Either.left(new AnnotationTypeData()));
117 when(titanGenericDao.getByCriteria(eq(NodeTypeEnum.AnnotationType), anyMap(), eq(AnnotationTypeData.class))).thenReturn(Either.right(TitanOperationStatus.NOT_FOUND));
118 when(propertyOperation.addPropertiesToElementType(anyString(), eq(NodeTypeEnum.AnnotationType), anyList())).thenReturn(Either.left(emptyMap()));
119 when(propertyOperation.fillPropertiesList(anyString(), eq(NodeTypeEnum.AnnotationType), any())).thenReturn(TitanOperationStatus.OK);
120 when(propertyOperation.getTitanGenericDao()).thenReturn(titanGenericDao);
121 when(titanGenericDao.commit()).thenReturn(TitanOperationStatus.OK);
122 when(titanGenericDao.rollback()).thenReturn(TitanOperationStatus.OK);
123 FileDataBodyPart filePart = new FileDataBodyPart("annotationTypesZip", new File("src/test/resources/types/annotationTypes.zip"));
124 MultiPart multipartEntity = new FormDataMultiPart();
125 multipartEntity.bodyPart(filePart);
127 Response response = target().path("/v1/catalog/uploadType/annotationtypes")
128 .request(MediaType.APPLICATION_JSON)
129 .header(Constants.USER_ID_HEADER, userId)
130 .post(Entity.entity(multipartEntity, MediaType.MULTIPART_FORM_DATA), Response.class);
131 assertThat(response.getStatus()).isEqualTo(HttpStatus.CREATED_201);
132 assertThat(Boolean.valueOf(getTypeActionResult(response))).isTrue();
135 private String getTypeActionResult(Response response) {
136 String typeResult = "";
137 String body = response.readEntity(String.class);
138 int indexColon = body.lastIndexOf(':');
139 if (indexColon > 0) {
140 int indexCurly = body.indexOf('}', indexColon);
141 if (indexCurly > 0) {
142 typeResult = body.substring(indexColon+1, indexCurly);
149 public void creatingAnnotationTypeFailureTest() {
150 doNothing().when(accessValidations).validateUserExists(eq(userId), anyString());
151 when(titanGenericDao.createNode(isA(AnnotationTypeData.class), eq(AnnotationTypeData.class))).thenReturn(Either.left(new AnnotationTypeData()));
152 when(titanGenericDao.getNode(anyString(), eq("org.openecomp.annotations.source.1.0.annotationtype"), eq(AnnotationTypeData.class))).thenReturn(Either.left(new AnnotationTypeData()));
153 when(titanGenericDao.getByCriteria(eq(NodeTypeEnum.AnnotationType), anyMap(), eq(AnnotationTypeData.class))).thenReturn(Either.right(TitanOperationStatus.NOT_FOUND));
154 when(propertyOperation.addPropertiesToElementType(anyString(), eq(NodeTypeEnum.AnnotationType), anyList())).thenThrow(new StorageException(TitanOperationStatus.MATCH_NOT_FOUND));
155 when(propertyOperation.fillPropertiesList(anyString(), eq(NodeTypeEnum.AnnotationType), any())).thenReturn(TitanOperationStatus.OK);
156 when(propertyOperation.getTitanGenericDao()).thenReturn(titanGenericDao);
157 when(titanGenericDao.commit()).thenReturn(TitanOperationStatus.OK);
158 when(titanGenericDao.rollback()).thenReturn(TitanOperationStatus.OK);
159 FileDataBodyPart filePart = new FileDataBodyPart("annotationTypesZip", new File("src/test/resources/types/annotationTypes.zip"));
160 MultiPart multipartEntity = new FormDataMultiPart();
161 multipartEntity.bodyPart(filePart);
163 Response response = target().path("/v1/catalog/uploadType/annotationtypes")
164 .request(MediaType.APPLICATION_JSON)
165 .header(Constants.USER_ID_HEADER, userId)
166 .post(Entity.entity(multipartEntity, MediaType.MULTIPART_FORM_DATA), Response.class);
167 assertThat(response.getStatus()).isEqualTo(HttpStatus.BAD_REQUEST_400);
168 assertThat(Boolean.valueOf(getTypeActionResult(response))).isFalse();
172 public void singleTypeSucceeded_statusIsCreated() {
173 List<ImmutablePair<AnnotationTypeDefinition, Boolean>> typeActionResults = new ArrayList<>();
174 AnnotationTypeDefinition dummyDefition = new AnnotationTypeDefinition();
175 typeActionResults.add(new ImmutablePair(dummyDefition, true));
176 assertThat(TypesUploadEndpoint.getHttpStatus(typeActionResults).value()).isEqualTo(HttpStatus.CREATED_201);
180 public void singleTypeExists_statusIsConflict() {
181 List<ImmutablePair<AnnotationTypeDefinition, Boolean>> typeActionResults = new ArrayList<>();
182 AnnotationTypeDefinition dummyDefition = new AnnotationTypeDefinition();
183 typeActionResults.add(new ImmutablePair(dummyDefition, null));
184 assertThat(TypesUploadEndpoint.getHttpStatus(typeActionResults).value()).isEqualTo(HttpStatus.CONFLICT_409);
188 public void mixedSuccessAndExists_statusIsCreated() {
189 List<ImmutablePair<AnnotationTypeDefinition, Boolean>> typeActionResults = new ArrayList<>();
190 AnnotationTypeDefinition dummyDefition = new AnnotationTypeDefinition();
191 typeActionResults.add(new ImmutablePair(dummyDefition, true));
192 typeActionResults.add(new ImmutablePair(dummyDefition, null));
193 assertThat(TypesUploadEndpoint.getHttpStatus(typeActionResults).value()).isEqualTo(HttpStatus.CREATED_201);
197 public void mixedSuccessAndFailure_statusIsBadRequest() {
198 List<ImmutablePair<AnnotationTypeDefinition, Boolean>> typeActionResults = new ArrayList<>();
199 AnnotationTypeDefinition dummyDefition = new AnnotationTypeDefinition();
200 typeActionResults.add(new ImmutablePair(dummyDefition, true));
201 typeActionResults.add(new ImmutablePair(dummyDefition, false));
202 typeActionResults.add(new ImmutablePair(dummyDefition, null));
203 assertThat(TypesUploadEndpoint.getHttpStatus(typeActionResults).value()).isEqualTo(HttpStatus.BAD_REQUEST_400);