Added oparent to sdc main
[sdc.git] / catalog-be / src / test / java / org / openecomp / sdc / be / servlets / TypesUploadEndpointTest.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * SDC
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
10  * 
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  * 
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=========================================================
19  */
20
21 package org.openecomp.sdc.be.servlets;
22
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;
55
56 import javax.ws.rs.client.Entity;
57 import javax.ws.rs.core.MediaType;
58 import javax.ws.rs.core.Response;
59 import java.io.File;
60 import java.util.ArrayList;
61 import java.util.List;
62
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.*;
72
73 public class TypesUploadEndpointTest extends JerseySpringBaseTest {
74
75     static final String userId = "jh0003";
76
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;
82
83     @org.springframework.context.annotation.Configuration
84     @Import(BaseTestConfig.class)
85     static class TypesUploadTestConfig {
86
87         @Bean
88         TypesUploadEndpoint typesUploadEndpoint() {
89             return new TypesUploadEndpoint(commonImportManager(), annotationTypeOperations(), accessValidations);
90         }
91
92         @Bean
93         CommonImportManager commonImportManager() {
94             return new CommonImportManager(componentUtils, propertyOperation);
95         }
96
97         @Bean
98         AnnotationTypeOperations annotationTypeOperations() {
99             return new AnnotationTypeOperations(commonTypeOperations());
100         }
101
102         @Bean
103         CommonTypeOperations commonTypeOperations() {
104             return new CommonTypeOperations(janusGraphGenericDao, propertyOperation, operationUtils);
105         }
106     }
107
108     @BeforeClass
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);
115     }
116
117     @Override
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);
123     }
124
125     @Override
126     protected ResourceConfig configure() {
127         return super.configure(TypesUploadEndpointTest.TypesUploadTestConfig.class)
128                 .register(TypesUploadEndpoint.class)
129                 .property(LoggingFeature.LOGGING_FEATURE_LOGGER_LEVEL_SERVER, "WARNING");
130     }
131
132     @Test
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);
148
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();
155     }
156
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);
165             }
166         }
167         return typeResult;
168     }
169
170     @Test
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);
187
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();
194     }
195
196     @Test
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);
202     }
203
204     @Test
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);
210     }
211
212     @Test
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);
219     }
220
221     @Test
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);
229     }
230 }