Catalog alignment
[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.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;
56
57 import javax.ws.rs.client.Entity;
58 import javax.ws.rs.core.MediaType;
59 import javax.ws.rs.core.Response;
60 import java.io.File;
61 import java.util.ArrayList;
62 import java.util.List;
63
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;
75
76 public class TypesUploadEndpointTest extends JerseySpringBaseTest {
77
78     static final String userId = "jh0003";
79
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;
85
86     @org.springframework.context.annotation.Configuration
87     @Import(BaseTestConfig.class)
88     static class TypesUploadTestConfig {
89
90         @Bean
91         TypesUploadEndpoint typesUploadEndpoint() {
92             UserBusinessLogic userBusinessLogic = mock(UserBusinessLogic.class);
93             ComponentsUtils componentsUtils = mock(ComponentsUtils.class);
94             return new TypesUploadEndpoint(userBusinessLogic, componentsUtils, commonImportManager(), annotationTypeOperations(), accessValidations);
95         }
96
97         @Bean
98         CommonImportManager commonImportManager() {
99             return new CommonImportManager(componentUtils, propertyOperation);
100         }
101
102         @Bean
103         AnnotationTypeOperations annotationTypeOperations() {
104             return new AnnotationTypeOperations(commonTypeOperations());
105         }
106
107         @Bean
108         CommonTypeOperations commonTypeOperations() {
109             return new CommonTypeOperations(janusGraphGenericDao, propertyOperation, operationUtils);
110         }
111     }
112
113     @BeforeClass
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);
120     }
121
122     @Override
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);
128     }
129
130     @Override
131     protected ResourceConfig configure() {
132         return super.configure(TypesUploadEndpointTest.TypesUploadTestConfig.class)
133                 .register(TypesUploadEndpoint.class)
134                 .property(LoggingFeature.LOGGING_FEATURE_LOGGER_LEVEL_SERVER, "WARNING");
135     }
136
137     @Test
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);
153
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();
160     }
161
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);
170             }
171         }
172         return typeResult;
173     }
174
175     @Test
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);
192
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();
199     }
200
201     @Test
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);
207     }
208
209     @Test
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);
215     }
216
217     @Test
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);
224     }
225
226     @Test
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);
234     }
235 }