Upgrade SDC from Titan to Janus Graph
[sdc.git] / catalog-be / src / test / java / org / openecomp / sdc / be / servlets / TypesUploadEndpointTest.java
1 package org.openecomp.sdc.be.servlets;
2
3 import com.fasterxml.jackson.databind.DeserializationFeature;
4 import fj.data.Either;
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.janusgraph.HealingJanusGraphGenericDao;
22 import org.openecomp.sdc.be.dao.janusgraph.JanusGraphOperationStatus;
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;
35
36 import javax.ws.rs.client.Entity;
37 import javax.ws.rs.core.MediaType;
38 import javax.ws.rs.core.Response;
39 import java.io.File;
40 import java.util.ArrayList;
41 import java.util.List;
42
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.*;
52
53 public class TypesUploadEndpointTest extends JerseySpringBaseTest {
54
55     static final String userId = "jh0003";
56
57     private static AccessValidations accessValidations;
58     private static HealingJanusGraphGenericDao janusGraphGenericDao;
59     private static PropertyOperation propertyOperation;
60     private static ComponentsUtils componentUtils;
61     private static OperationUtils operationUtils;
62
63     @org.springframework.context.annotation.Configuration
64     @Import(BaseTestConfig.class)
65     static class TypesUploadTestConfig {
66
67         @Bean
68         TypesUploadEndpoint typesUploadEndpoint() {
69             return new TypesUploadEndpoint(commonImportManager(), annotationTypeOperations(), accessValidations);
70         }
71
72         @Bean
73         CommonImportManager commonImportManager() {
74             return new CommonImportManager(componentUtils, propertyOperation);
75         }
76
77         @Bean
78         AnnotationTypeOperations annotationTypeOperations() {
79             return new AnnotationTypeOperations(commonTypeOperations());
80         }
81
82         @Bean
83         CommonTypeOperations commonTypeOperations() {
84             return new CommonTypeOperations(janusGraphGenericDao, propertyOperation, operationUtils);
85         }
86     }
87
88     @BeforeClass
89     public static void initClass() {
90         janusGraphGenericDao = mock(HealingJanusGraphGenericDao.class);
91         accessValidations = mock(AccessValidations.class);
92         propertyOperation = mock(PropertyOperation.class);
93         componentUtils = Mockito.mock(ComponentsUtils.class);
94         operationUtils = Mockito.mock(OperationUtils.class);
95     }
96
97     @Override
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);
103     }
104
105     @Override
106     protected ResourceConfig configure() {
107         return super.configure(TypesUploadEndpointTest.TypesUploadTestConfig.class)
108                 .register(TypesUploadEndpoint.class)
109                 .property(LoggingFeature.LOGGING_FEATURE_LOGGER_LEVEL_SERVER, "WARNING");
110     }
111
112     @Test
113     public void creatingAnnotationTypeSuccessTest() {
114         doNothing().when(accessValidations).validateUserExists(eq(userId), anyString());
115         when(janusGraphGenericDao.createNode(isA(AnnotationTypeData.class), eq(AnnotationTypeData.class))).thenReturn(Either.left(new AnnotationTypeData()));
116         when(janusGraphGenericDao.getNode(anyString(), eq("org.openecomp.annotations.source.1.0.annotationtype"), eq(AnnotationTypeData.class))).thenReturn(Either.left(new AnnotationTypeData()));
117         when(janusGraphGenericDao.getByCriteria(eq(NodeTypeEnum.AnnotationType), anyMap(), eq(AnnotationTypeData.class))).thenReturn(Either.right(
118             JanusGraphOperationStatus.NOT_FOUND));
119         when(propertyOperation.addPropertiesToElementType(anyString(), eq(NodeTypeEnum.AnnotationType), anyList())).thenReturn(Either.left(emptyMap()));
120         when(propertyOperation.fillPropertiesList(anyString(), eq(NodeTypeEnum.AnnotationType), any())).thenReturn(
121             JanusGraphOperationStatus.OK);
122         when(propertyOperation.getJanusGraphGenericDao()).thenReturn(janusGraphGenericDao);
123         when(janusGraphGenericDao.commit()).thenReturn(JanusGraphOperationStatus.OK);
124         when(janusGraphGenericDao.rollback()).thenReturn(JanusGraphOperationStatus.OK);
125         FileDataBodyPart filePart = new FileDataBodyPart("annotationTypesZip", new File("src/test/resources/types/annotationTypes.zip"));
126         MultiPart multipartEntity = new FormDataMultiPart();
127         multipartEntity.bodyPart(filePart);
128
129         Response response = target().path("/v1/catalog/uploadType/annotationtypes")
130                 .request(MediaType.APPLICATION_JSON)
131                 .header(Constants.USER_ID_HEADER, userId)
132                 .post(Entity.entity(multipartEntity, MediaType.MULTIPART_FORM_DATA), Response.class);
133         assertThat(response.getStatus()).isEqualTo(HttpStatus.CREATED_201);
134         assertThat(Boolean.valueOf(getTypeActionResult(response))).isTrue();
135     }
136
137     private String getTypeActionResult(Response response) {
138         String typeResult = "";
139         String body = response.readEntity(String.class);
140         int indexColon = body.lastIndexOf(':');
141         if (indexColon > 0) {
142             int indexCurly = body.indexOf('}', indexColon);
143             if (indexCurly > 0) {
144                 typeResult = body.substring(indexColon+1, indexCurly);
145             }
146         }
147         return typeResult;
148     }
149
150     @Test
151     public void creatingAnnotationTypeFailureTest() {
152         doNothing().when(accessValidations).validateUserExists(eq(userId), anyString());
153         when(janusGraphGenericDao.createNode(isA(AnnotationTypeData.class), eq(AnnotationTypeData.class))).thenReturn(Either.left(new AnnotationTypeData()));
154         when(janusGraphGenericDao.getNode(anyString(), eq("org.openecomp.annotations.source.1.0.annotationtype"), eq(AnnotationTypeData.class))).thenReturn(Either.left(new AnnotationTypeData()));
155         when(janusGraphGenericDao.getByCriteria(eq(NodeTypeEnum.AnnotationType), anyMap(), eq(AnnotationTypeData.class))).thenReturn(Either.right(
156             JanusGraphOperationStatus.NOT_FOUND));
157         when(propertyOperation.addPropertiesToElementType(anyString(), eq(NodeTypeEnum.AnnotationType), anyList())).thenThrow(new StorageException(
158             JanusGraphOperationStatus.MATCH_NOT_FOUND));
159         when(propertyOperation.fillPropertiesList(anyString(), eq(NodeTypeEnum.AnnotationType), any())).thenReturn(
160             JanusGraphOperationStatus.OK);
161         when(propertyOperation.getJanusGraphGenericDao()).thenReturn(janusGraphGenericDao);
162         when(janusGraphGenericDao.commit()).thenReturn(JanusGraphOperationStatus.OK);
163         when(janusGraphGenericDao.rollback()).thenReturn(JanusGraphOperationStatus.OK);
164         FileDataBodyPart filePart = new FileDataBodyPart("annotationTypesZip", new File("src/test/resources/types/annotationTypes.zip"));
165         MultiPart multipartEntity = new FormDataMultiPart();
166         multipartEntity.bodyPart(filePart);
167
168         Response response = target().path("/v1/catalog/uploadType/annotationtypes")
169                 .request(MediaType.APPLICATION_JSON)
170                 .header(Constants.USER_ID_HEADER, userId)
171                 .post(Entity.entity(multipartEntity, MediaType.MULTIPART_FORM_DATA), Response.class);
172         assertThat(response.getStatus()).isEqualTo(HttpStatus.BAD_REQUEST_400);
173         assertThat(Boolean.valueOf(getTypeActionResult(response))).isFalse();
174     }
175
176     @Test
177     public void singleTypeSucceeded_statusIsCreated() {
178         List<ImmutablePair<AnnotationTypeDefinition, Boolean>> typeActionResults = new ArrayList<>();
179         AnnotationTypeDefinition dummyDefition = new AnnotationTypeDefinition();
180         typeActionResults.add(new ImmutablePair(dummyDefition, true));
181         assertThat(TypesUploadEndpoint.getHttpStatus(typeActionResults).value()).isEqualTo(HttpStatus.CREATED_201);
182     }
183
184     @Test
185     public void singleTypeExists_statusIsConflict() {
186         List<ImmutablePair<AnnotationTypeDefinition, Boolean>> typeActionResults = new ArrayList<>();
187         AnnotationTypeDefinition dummyDefition = new AnnotationTypeDefinition();
188         typeActionResults.add(new ImmutablePair(dummyDefition, null));
189         assertThat(TypesUploadEndpoint.getHttpStatus(typeActionResults).value()).isEqualTo(HttpStatus.CONFLICT_409);
190     }
191
192     @Test
193     public void mixedSuccessAndExists_statusIsCreated() {
194         List<ImmutablePair<AnnotationTypeDefinition, Boolean>> typeActionResults = new ArrayList<>();
195         AnnotationTypeDefinition dummyDefition = new AnnotationTypeDefinition();
196         typeActionResults.add(new ImmutablePair(dummyDefition, true));
197         typeActionResults.add(new ImmutablePair(dummyDefition, null));
198         assertThat(TypesUploadEndpoint.getHttpStatus(typeActionResults).value()).isEqualTo(HttpStatus.CREATED_201);
199     }
200
201     @Test
202     public void mixedSuccessAndFailure_statusIsBadRequest() {
203         List<ImmutablePair<AnnotationTypeDefinition, Boolean>> typeActionResults = new ArrayList<>();
204         AnnotationTypeDefinition dummyDefition = new AnnotationTypeDefinition();
205         typeActionResults.add(new ImmutablePair(dummyDefition, true));
206         typeActionResults.add(new ImmutablePair(dummyDefition, false));
207         typeActionResults.add(new ImmutablePair(dummyDefition, null));
208         assertThat(TypesUploadEndpoint.getHttpStatus(typeActionResults).value()).isEqualTo(HttpStatus.BAD_REQUEST_400);
209     }
210 }