2 * ============LICENSE_START======================================================================
3 * Copyright (C) 2023 OpenInfra Foundation Europe. All rights reserved.
4 * ===============================================================================================
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 * ============LICENSE_END========================================================================
19 package com.oransc.rappmanager.rest;
21 import static org.hamcrest.Matchers.hasSize;
22 import static org.mockito.ArgumentMatchers.any;
23 import static org.mockito.Mockito.when;
24 import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
25 import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
27 import com.fasterxml.jackson.databind.ObjectMapper;
28 import com.oransc.rappmanager.acm.service.AcmDeployer;
29 import com.oransc.rappmanager.dme.service.DmeDeployer;
30 import com.oransc.rappmanager.models.cache.RappCacheService;
31 import com.oransc.rappmanager.models.rapp.PrimeOrder;
32 import com.oransc.rappmanager.models.rapp.Rapp;
33 import com.oransc.rappmanager.models.rapp.RappPrimeOrder;
34 import com.oransc.rappmanager.models.rapp.RappState;
35 import com.oransc.rappmanager.sme.service.SmeLifecycleManager;
37 import java.io.FileInputStream;
38 import java.util.UUID;
39 import org.apache.http.entity.ContentType;
40 import org.junit.jupiter.api.Test;
41 import org.junit.jupiter.params.ParameterizedTest;
42 import org.junit.jupiter.params.provider.EnumSource;
43 import org.springframework.beans.factory.annotation.Autowired;
44 import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
45 import org.springframework.boot.test.context.SpringBootTest;
46 import org.springframework.boot.test.mock.mockito.MockBean;
47 import org.springframework.http.MediaType;
48 import org.springframework.mock.web.MockMultipartFile;
49 import org.springframework.test.web.servlet.MockMvc;
50 import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
52 @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
54 class RappControllerTest {
57 private MockMvc mockMvc;
60 private RappCacheService rappCacheService;
63 AcmDeployer acmDeployer;
66 DmeDeployer dmeDeployer;
69 SmeLifecycleManager smeLifecycleManager;
71 private final String validRappFile = "valid-rapp-package.csar";
73 private final String invalidRappFile = "invalid-rapp-package.csar";
74 private final String validCsarFileLocation = "src/test/resources/";
76 private final ObjectMapper objectMapper = new ObjectMapper();
79 void testGetRapps() throws Exception {
80 mockMvc.perform(MockMvcRequestBuilders.get("/rapps")).andExpect(status().isOk())
81 .andExpect(jsonPath("$", hasSize(0)));
82 UUID rappId = UUID.randomUUID();
83 Rapp rapp = Rapp.builder().rappId(rappId).name(String.valueOf(rappId)).packageName(validRappFile)
84 .packageLocation(validCsarFileLocation).state(RappState.COMMISSIONED).build();
85 rappCacheService.putRapp(rapp);
86 mockMvc.perform(MockMvcRequestBuilders.get("/rapps")).andExpect(status().isOk())
87 .andExpect(jsonPath("$", hasSize(1)));
91 void testGetRapp() throws Exception {
92 UUID rappId = UUID.randomUUID();
93 Rapp rapp = Rapp.builder().rappId(rappId).name(String.valueOf(rappId)).packageName(validRappFile)
94 .packageLocation(validCsarFileLocation).state(RappState.COMMISSIONED).build();
95 rappCacheService.putRapp(rapp);
96 mockMvc.perform(MockMvcRequestBuilders.get("/rapps/{rapp_id}", rappId)).andExpect(status().isOk())
97 .andExpect(jsonPath("$.rappId").value(rappId.toString()))
98 .andExpect(jsonPath("$.state").value(RappState.COMMISSIONED.name()));
102 void testGetInvalidRapp() throws Exception {
103 mockMvc.perform(MockMvcRequestBuilders.get("/rapps/{rapp_id}", UUID.randomUUID()))
104 .andExpect(status().isNotFound());
108 void testCreateRapp() throws Exception {
109 String rappCsarPath = validCsarFileLocation + File.separator + validRappFile;
110 MockMultipartFile multipartFile =
111 new MockMultipartFile("file", validRappFile, ContentType.MULTIPART_FORM_DATA.getMimeType(),
112 new FileInputStream(rappCsarPath));
113 mockMvc.perform(MockMvcRequestBuilders.multipart("/rapps/{rapp_id}", UUID.randomUUID()).file(multipartFile))
114 .andExpect(status().isAccepted());
118 void testCreateInvalidRapp() throws Exception {
119 String rappCsarPath = validCsarFileLocation + File.separator + invalidRappFile;
120 MockMultipartFile multipartFile =
121 new MockMultipartFile("file", invalidRappFile, ContentType.MULTIPART_FORM_DATA.getMimeType(),
122 new FileInputStream(rappCsarPath));
123 mockMvc.perform(MockMvcRequestBuilders.multipart("/rapps/{rapp_id}", UUID.randomUUID()).file(multipartFile))
124 .andExpect(status().isBadRequest());
128 void testPrimeRapp() throws Exception {
129 UUID rappId = UUID.randomUUID();
130 Rapp rapp = Rapp.builder().rappId(rappId).name(String.valueOf(rappId)).packageName(validRappFile)
131 .packageLocation(validCsarFileLocation).state(RappState.COMMISSIONED).build();
132 rappCacheService.putRapp(rapp);
133 when(acmDeployer.primeRapp(any())).thenReturn(true);
134 when(dmeDeployer.primeRapp(any())).thenReturn(true);
135 RappPrimeOrder rappPrimeOrder = new RappPrimeOrder();
136 rappPrimeOrder.setPrimeOrder(PrimeOrder.PRIME);
137 mockMvc.perform(MockMvcRequestBuilders.put("/rapps/{rapp_id}", rappId).contentType(MediaType.APPLICATION_JSON)
138 .content(objectMapper.writeValueAsString(rappPrimeOrder))).andExpect(status().isOk());
142 @EnumSource(value = PrimeOrder.class, names = {"PRIME", "DEPRIME"})
143 void testPrimeRappFailure(PrimeOrder primeOrder) throws Exception {
144 RappPrimeOrder rappPrimeOrder = new RappPrimeOrder();
145 rappPrimeOrder.setPrimeOrder(primeOrder);
146 mockMvc.perform(MockMvcRequestBuilders.put("/rapps/{rapp_id}", UUID.randomUUID())
147 .contentType(MediaType.APPLICATION_JSON)
148 .content(objectMapper.writeValueAsString(rappPrimeOrder)))
149 .andExpect(status().isNotFound());
153 void testDeprimeRapp() throws Exception {
154 UUID rappId = UUID.randomUUID();
155 Rapp rapp = Rapp.builder().rappId(rappId).name(String.valueOf(rappId)).packageName(validRappFile)
156 .packageLocation(validCsarFileLocation).state(RappState.PRIMED).build();
157 rappCacheService.putRapp(rapp);
158 when(acmDeployer.deprimeRapp(any())).thenReturn(true);
159 when(dmeDeployer.deprimeRapp(any())).thenReturn(true);
160 RappPrimeOrder rappPrimeOrder = new RappPrimeOrder();
161 rappPrimeOrder.setPrimeOrder(PrimeOrder.DEPRIME);
162 mockMvc.perform(MockMvcRequestBuilders.put("/rapps/{rapp_id}", rappId).contentType(MediaType.APPLICATION_JSON)
163 .content(objectMapper.writeValueAsString(rappPrimeOrder))).andExpect(status().isOk());
167 void testDeleteRapp() throws Exception {
168 UUID rappId = UUID.randomUUID();
169 Rapp rapp = Rapp.builder().rappId(rappId).name(String.valueOf(rappId)).packageName(validRappFile)
170 .packageLocation(validCsarFileLocation).state(RappState.COMMISSIONED).build();
171 rappCacheService.putRapp(rapp);
172 mockMvc.perform(MockMvcRequestBuilders.delete("/rapps/{rapp_id}", rappId)).andExpect(status().isOk());
176 void testDeleteRappFailure() throws Exception {
177 mockMvc.perform(MockMvcRequestBuilders.delete("/rapps/{rapp_id}", UUID.randomUUID()))
178 .andExpect(status().isNotFound());