diff options
author | krishnaa96 <krishna.moorthy6@wipro.com> | 2021-02-26 13:14:09 +0530 |
---|---|---|
committer | krishnaa96 <krishna.moorthy6@wipro.com> | 2021-03-03 18:50:34 +0530 |
commit | 00b90746ce2c65de3e7b50ef1b87af3933c895e7 (patch) | |
tree | 07d51a001b7fd7539c4781b243b90a92d0dfd080 | |
parent | eb514d63eb47f335a1eb3119124a56225ac730cc (diff) |
Add cps-tbdmt-rest code
Issue-ID: CPS-243
Signed-off-by: krishnaa96 <krishna.moorthy6@wipro.com>
Change-Id: I473135bc026a63cb6d644a42e54ffe45d1389fbd
8 files changed, 754 insertions, 0 deletions
diff --git a/cps-tbdmt-rest/docs/api/swagger/openapi.yaml b/cps-tbdmt-rest/docs/api/swagger/openapi.yaml new file mode 100644 index 0000000..f1c6514 --- /dev/null +++ b/cps-tbdmt-rest/docs/api/swagger/openapi.yaml @@ -0,0 +1,175 @@ +openapi: 3.0.0 +info: + description: APIS for Template based Data Model Transformer + version: 1.0.0 + title: Template based Data Model Transformer APIs + license: + name: Apache 2.0 + url: http://www.apache.org/licenses/LICENSE-2.0.html +tags: + - name: templates + description: CRUD APIs for xpath templates +paths: + /templates: + post: + tags: + - templates + summary: Add a new template + description: Creates a template in the database + operationId: addTemplate + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/Template" + description: Template object that needs to be added + required: true + responses: + "201": + description: Created successfully + "400": + description: Invalid input + "500": + description: Internal server error + get: + tags: + - templates + summary: Get all templates + description: Retrieves all the templates stored in database + operationId: getAllTemplates + responses: + "200": + description: Templates returned successfully + content: + application/json: + schema: + type: array + items: + $ref: "#/components/schemas/Template" + "404": + description: No templates found + "500": + description: Internal server error + "/templates/{model}/{template-id}": + get: + tags: + - templates + summary: Find template by ID and model + description: Returns a single template identified by template-id and model + operationId: getTemplateById + parameters: + - name: template-id + in: path + description: ID of template to return + required: true + schema: + type: string + - name: model + in: path + description: represents the yang model + required: true + schema: + type: string + responses: + "200": + description: Template returned successfully + content: + application/json: + schema: + $ref: "#/components/schemas/Template" + "400": + description: Invalid ID supplied + "404": + description: Not found + delete: + tags: + - templates + summary: Deletes a template + description: Deletes a template by id and model from the database + operationId: deleteTemplate + parameters: + - name: template-id + in: path + required: true + schema: + type: string + - name: model + in: path + description: represents the yang model + required: true + schema: + type: string + responses: + "200": + description: Deleted successfully + "400": + description: Invalid ID supplied + "404": + description: Template not found + "/execute/{model}/{template-id}": + post: + tags: + - template executions + summary: Execute a template + description: Returns the result of execution + operationId: executeTemplateById + parameters: + - name: template-id + in: path + description: ID of template to execute + required: true + schema: + type: string + - name: model + in: path + description: represents the yang model + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/ApiRequest" + description: Template object that needs to be added + required: true + responses: + "200": + description: Result returned successfully + content: + application/json: + schema: + $ref: "#/components/schemas/ApiResponse" + "400": + description: Invalid ID supplied + "404": + description: Not found + "500": + description: Internal server error +externalDocs: + description: Find out more about APIs + url: https://wiki.onap.org/display/DW/API+Mapper+Service +servers: + - url: http://localhost +components: + schemas: + Template: + type: object + required: + - template-id + - model + - xpath-template + properties: + template-id: + type: string + model: + type: string + xpath-template: + type: string + ApiRequest: + type: object + properties: + input: + type: object + ApiResponse: + type: object diff --git a/cps-tbdmt-rest/pom.xml b/cps-tbdmt-rest/pom.xml index 048f243..c155196 100644 --- a/cps-tbdmt-rest/pom.xml +++ b/cps-tbdmt-rest/pom.xml @@ -28,4 +28,34 @@ <modelVersion>4.0.0</modelVersion> <artifactId>cps-tbdmt-rest</artifactId> + <dependencies> + <dependency> + <groupId>${project.groupId}</groupId> + <artifactId>cps-tbdmt-service</artifactId> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-web</artifactId> + <exclusions> + <exclusion> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-tomcat</artifactId> + </exclusion> + </exclusions> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-jetty</artifactId> + </dependency> + <dependency> + <groupId>junit</groupId> + <artifactId>junit</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-test</artifactId> + <scope>test</scope> + </dependency> + </dependencies> </project>
\ No newline at end of file diff --git a/cps-tbdmt-rest/src/main/java/org/onap/cps/tbdmt/exception/TemplateExceptionHandler.java b/cps-tbdmt-rest/src/main/java/org/onap/cps/tbdmt/exception/TemplateExceptionHandler.java new file mode 100644 index 0000000..fa6fa28 --- /dev/null +++ b/cps-tbdmt-rest/src/main/java/org/onap/cps/tbdmt/exception/TemplateExceptionHandler.java @@ -0,0 +1,82 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP + * ================================================================================ + * Copyright (C) 2021 Wipro Limited. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.cps.tbdmt.exception; + +import java.util.ArrayList; +import java.util.List; +import org.onap.cps.tbdmt.model.ErrorResponse; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.ObjectError; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.context.request.WebRequest; +import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler; + +@ControllerAdvice +public class TemplateExceptionHandler extends ResponseEntityExceptionHandler { + + /** + * Handle TemplateNotFoundException. + * + * @param templateNotFoundException Exception + * @param webRequest web request + * @return response entity + */ + @ExceptionHandler(TemplateNotFoundException.class) + public final ResponseEntity<Object> handleTemplateNotFoundException( + final TemplateNotFoundException templateNotFoundException, final WebRequest webRequest) { + final List<String> details = new ArrayList<>(); + details.add(templateNotFoundException.getLocalizedMessage()); + final ErrorResponse ErrorResponse = new ErrorResponse("Template Not found", details); + return new ResponseEntity<>(ErrorResponse, HttpStatus.NOT_FOUND); + } + + /** + * Handle ExecuteException. + * + * @param executeException Exception + * @param webRequest web request + * @return response entity + */ + @ExceptionHandler(ExecuteException.class) + public final ResponseEntity<Object> handleExecutionException(final ExecuteException executeException, + final WebRequest webRequest) { + final List<String> details = new ArrayList<>(); + details.add(executeException.getLocalizedMessage()); + final ErrorResponse ErrorResponse = new ErrorResponse("Error while executing template", details); + return new ResponseEntity<>(ErrorResponse, HttpStatus.OK); + } + + @Override + protected ResponseEntity<Object> handleMethodArgumentNotValid( + final MethodArgumentNotValidException methodArgumentNotValidException, final HttpHeaders httpHeaders, + final HttpStatus httpStatus, final WebRequest webRequest) { + final List<String> details = new ArrayList<>(); + for (final ObjectError objectError : methodArgumentNotValidException.getBindingResult().getAllErrors()) { + details.add(objectError.getDefaultMessage()); + } + final ErrorResponse ErrorResponse = new ErrorResponse("Validation Failed", details); + return new ResponseEntity<>(ErrorResponse, HttpStatus.BAD_REQUEST); + } +} diff --git a/cps-tbdmt-rest/src/main/java/org/onap/cps/tbdmt/rest/ExecutionController.java b/cps-tbdmt-rest/src/main/java/org/onap/cps/tbdmt/rest/ExecutionController.java new file mode 100644 index 0000000..b7dc4f6 --- /dev/null +++ b/cps-tbdmt-rest/src/main/java/org/onap/cps/tbdmt/rest/ExecutionController.java @@ -0,0 +1,56 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP + * ================================================================================ + * Copyright (C) 2021 Wipro Limited. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.cps.tbdmt.rest; + +import javax.validation.Valid; +import org.onap.cps.tbdmt.model.ExecutionRequest; +import org.onap.cps.tbdmt.service.ExecutionBusinessLogic; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class ExecutionController { + + @Autowired + private ExecutionBusinessLogic executionBusinessLogic; + + /** + * Execute a template by model and templateId. + * + * @param model model to find the template + * @param templateId Id to find the template + * @param executionRequest execution request + * @return result of the execution + */ + @PostMapping(path = "/execute/{model}/{templateId}") + public ResponseEntity<String> executeTemplate(@Valid @PathVariable final String model, + @Valid @PathVariable final String templateId, + @Valid @RequestBody final ExecutionRequest executionRequest) { + final String result = executionBusinessLogic.executeTemplate(model, templateId, executionRequest); + return new ResponseEntity<>(result, HttpStatus.OK); + } + +} diff --git a/cps-tbdmt-rest/src/main/java/org/onap/cps/tbdmt/rest/TemplateController.java b/cps-tbdmt-rest/src/main/java/org/onap/cps/tbdmt/rest/TemplateController.java new file mode 100644 index 0000000..15efdc5 --- /dev/null +++ b/cps-tbdmt-rest/src/main/java/org/onap/cps/tbdmt/rest/TemplateController.java @@ -0,0 +1,92 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP + * ================================================================================ + * Copyright (C) 2021 Wipro Limited. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.cps.tbdmt.rest; + +import java.util.Collection; +import javax.validation.Valid; +import org.onap.cps.tbdmt.exception.TemplateNotFoundException; +import org.onap.cps.tbdmt.model.Template; +import org.onap.cps.tbdmt.model.TemplateKey; +import org.onap.cps.tbdmt.model.TemplateRequest; +import org.onap.cps.tbdmt.service.TemplateBusinessLogic; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class TemplateController { + + @Autowired + private TemplateBusinessLogic templateBusinessLogic; + + @PostMapping(path = "/templates") + public ResponseEntity<Template> createTemplate(@Valid @RequestBody final TemplateRequest templateRequest) { + return new ResponseEntity<>(templateBusinessLogic.createTemplate(templateRequest), + HttpStatus.CREATED); + } + + /** + * Get All Templates. + * + * @return templates + */ + @GetMapping(path = "/templates") + public ResponseEntity<Collection<Template>> getAllTemplates() { + final Collection<Template> templates = templateBusinessLogic.getAllTemplates(); + if (templates.isEmpty()) { + throw new TemplateNotFoundException("Template repository is empty"); + } + return new ResponseEntity<>(templates, HttpStatus.OK); + } + + /** + * Get Template by model and templateId. + * + * @param templateId Id to find the template + * @param model schema set to find the template + * @return template + */ + @GetMapping(path = "/templates/{model}/{templateId}") + public ResponseEntity<Template> getTemplate(@PathVariable final String templateId, + @PathVariable final String model) { + return new ResponseEntity<>( + templateBusinessLogic.getTemplate(new TemplateKey(templateId, model)), + HttpStatus.OK); + + } + + /** + * Delete Template by model and templateId. + * + * @param templateId Id to find the template + * @param model schema set to find the template + */ + @DeleteMapping(path = "/templates/{model}/{templateId}") + public void deleteTemplate(@PathVariable final String templateId, @PathVariable final String model) { + templateBusinessLogic.deleteTemplate(new TemplateKey(templateId, model)); + } +} diff --git a/cps-tbdmt-rest/src/test/java/org/onap/cps/tbdmt/TestApplication.java b/cps-tbdmt-rest/src/test/java/org/onap/cps/tbdmt/TestApplication.java new file mode 100644 index 0000000..db28e9e --- /dev/null +++ b/cps-tbdmt-rest/src/test/java/org/onap/cps/tbdmt/TestApplication.java @@ -0,0 +1,32 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP + * ================================================================================ + * Copyright (C) 2021 Wipro Limited. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.cps.tbdmt; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class TestApplication { + public static void main(final String[] args) { + SpringApplication.run(TestApplication.class, args); + } + +} diff --git a/cps-tbdmt-rest/src/test/java/org/onap/cps/tbdmt/rest/ExecutionControllerTest.java b/cps-tbdmt-rest/src/test/java/org/onap/cps/tbdmt/rest/ExecutionControllerTest.java new file mode 100644 index 0000000..23165a6 --- /dev/null +++ b/cps-tbdmt-rest/src/test/java/org/onap/cps/tbdmt/rest/ExecutionControllerTest.java @@ -0,0 +1,142 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP + * ================================================================================ + * Copyright (C) 2021 Wipro Limited. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.cps.tbdmt.rest; + +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import com.fasterxml.jackson.databind.ObjectMapper; +import java.nio.charset.StandardCharsets; +import java.util.HashMap; +import java.util.Map; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentMatchers; +import org.mockito.Mockito; +import org.onap.cps.tbdmt.exception.ExecuteException; +import org.onap.cps.tbdmt.exception.TemplateNotFoundException; +import org.onap.cps.tbdmt.model.ExecutionRequest; +import org.onap.cps.tbdmt.service.ExecutionBusinessLogic; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.http.MediaType; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.servlet.MockMvc; + + +@RunWith(SpringRunner.class) +@WebMvcTest(ExecutionController.class) +public class ExecutionControllerTest { + + private static final String UTF8 = StandardCharsets.UTF_8.name(); + + @Autowired + private MockMvc mockMvc; + + @MockBean + private ExecutionBusinessLogic executionBusinessLogic; + + private String executionRequestJson; + private String executePath; + + /** + * Setup variables before test. + * + */ + @Before + public void setup() throws Exception { + executePath = "/execute/ran-network/getNbr"; + final Map<String, String> inputParameters = new HashMap<>(); + inputParameters.put("coverageArea", "Zone 1"); + final ExecutionRequest executionRequest = new ExecutionRequest(inputParameters); + final ObjectMapper objectMapper = new ObjectMapper(); + executionRequestJson = objectMapper.writeValueAsString(executionRequest); + } + + @Test + public void testExecuteTemplate() throws Exception { + final String result = "{\"key\": \"value\"}"; + Mockito.when(executionBusinessLogic + .executeTemplate(ArgumentMatchers.any(), ArgumentMatchers.any(), + ArgumentMatchers.any())) + .thenReturn(result); + mockMvc.perform(post(executePath).contentType(MediaType.APPLICATION_JSON) + .characterEncoding(UTF8) + .content(executionRequestJson).accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(content().string(result)); + + Mockito.when(executionBusinessLogic + .executeTemplate(ArgumentMatchers.any(), ArgumentMatchers.any(), + ArgumentMatchers.any())) + .thenThrow(new TemplateNotFoundException("Template does not exist")); + mockMvc.perform(post(executePath).contentType(MediaType.APPLICATION_JSON) + .characterEncoding(UTF8) + .content(executionRequestJson).accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isNotFound()); + + mockMvc.perform(post(executePath).contentType(MediaType.APPLICATION_JSON) + .characterEncoding(UTF8) + .content("{\"bad\": \"request\"").accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isBadRequest()); + } + + @Test + public void testExecuteTemplateBadRequest() throws Exception { + mockMvc.perform(post(executePath).contentType(MediaType.APPLICATION_JSON) + .characterEncoding(UTF8) + .content("{\"bad\": \"request\"").accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isBadRequest()); + } + + @Test + public void testExecuteTemplateNotFound() throws Exception { + Mockito.when(executionBusinessLogic + .executeTemplate(ArgumentMatchers.any(), ArgumentMatchers.any(), + ArgumentMatchers.any())) + .thenThrow(new TemplateNotFoundException("Template does not exist")); + mockMvc.perform(post(executePath).contentType(MediaType.APPLICATION_JSON) + .characterEncoding(UTF8) + .content(executionRequestJson).accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isNotFound()); + } + + @Test + public void testExecuteTemplateException() throws Exception { + final String responseJson = "{\n" + + " \"message\": \"Error while executing template\",\n" + + " \"details\": [\"Response from CPS other than 200: 404\"]\n" + + "}"; + + Mockito.when(executionBusinessLogic + .executeTemplate(ArgumentMatchers.any(), ArgumentMatchers.any(), + ArgumentMatchers.any())) + .thenThrow(new ExecuteException("Response from CPS other than 200: 404")); + mockMvc.perform(post(executePath).contentType(MediaType.APPLICATION_JSON) + .characterEncoding(UTF8) + .content(executionRequestJson).accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(content().json(responseJson)); + } +} diff --git a/cps-tbdmt-rest/src/test/java/org/onap/cps/tbdmt/rest/TemplateControllerTest.java b/cps-tbdmt-rest/src/test/java/org/onap/cps/tbdmt/rest/TemplateControllerTest.java new file mode 100644 index 0000000..ce1178f --- /dev/null +++ b/cps-tbdmt-rest/src/test/java/org/onap/cps/tbdmt/rest/TemplateControllerTest.java @@ -0,0 +1,145 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP + * ================================================================================ + * Copyright (C) 2021 Wipro Limited. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.cps.tbdmt.rest; + +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import com.fasterxml.jackson.databind.ObjectMapper; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.List; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentMatchers; +import org.mockito.Mockito; +import org.onap.cps.tbdmt.exception.TemplateNotFoundException; +import org.onap.cps.tbdmt.model.Template; +import org.onap.cps.tbdmt.model.TemplateRequest; +import org.onap.cps.tbdmt.service.TemplateBusinessLogic; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.http.MediaType; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.servlet.MockMvc; + +@RunWith(SpringRunner.class) +@WebMvcTest(TemplateController.class) +public class TemplateControllerTest { + + private static final String UTF8 = StandardCharsets.UTF_8.name(); + + @Autowired + private MockMvc mockMvc; + + @MockBean + private TemplateBusinessLogic templateBusinessLogic; + + private ObjectMapper objectMapper; + + private Template template; + + @Before + public void setup() { + objectMapper = new ObjectMapper(); + template = new Template("getNbr", "ran-network", "sample"); + } + + @Test + public void testCreateTemplate() throws Exception { + final TemplateRequest templateRequest = new TemplateRequest("getNbr", "ran-network", "sample"); + final String templateJson = objectMapper.writeValueAsString(templateRequest); + Mockito.when(templateBusinessLogic.createTemplate(ArgumentMatchers.any())) + .thenReturn(template); + mockMvc.perform( + post("/templates").contentType(MediaType.APPLICATION_JSON).characterEncoding(UTF8) + .content(templateJson).accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isCreated()) + .andExpect(content().json(templateJson)); + } + + @Test + public void testCreateTemplateBadRequest() throws Exception { + final TemplateRequest emptyTemplateRequest = new TemplateRequest(); + emptyTemplateRequest.setTemplateId("getNbr"); + emptyTemplateRequest.setModel("ran-network"); + final String emptyTemplateJson = objectMapper.writeValueAsString(emptyTemplateRequest); + mockMvc.perform( + post("/templates").contentType(MediaType.APPLICATION_JSON).characterEncoding(UTF8) + .content(emptyTemplateJson).accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isBadRequest()); + } + + @Test + public void testGetAllTemplates() throws Exception { + final List<Template> templates = new ArrayList<>(); + templates.add(template); + final String templatesJson = objectMapper.writeValueAsString(templates); + Mockito.when(templateBusinessLogic.getAllTemplates()).thenReturn(templates); + mockMvc.perform(get("/templates").accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(content().json(templatesJson)); + } + + @Test + public void testGetAllTemplatesNotFound() throws Exception { + Mockito.when(templateBusinessLogic.getAllTemplates()).thenReturn(new ArrayList<>()); + mockMvc.perform(get("/templates").accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isNotFound()); + } + + @Test + public void testGetTemplate() throws Exception { + final String templateJson = objectMapper.writeValueAsString(template); + Mockito.when(templateBusinessLogic.getTemplate(ArgumentMatchers.any())) + .thenReturn(template); + mockMvc.perform(get("/templates/ran-network/getNbr").accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(content().json(templateJson)); + } + + @Test + public void testGetTemplateNotFound() throws Exception { + Mockito.when(templateBusinessLogic.getTemplate(ArgumentMatchers.any())) + .thenThrow(new TemplateNotFoundException("Template not found")); + mockMvc.perform(get("/templates/ran-network/getNbr").accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isNotFound()); + } + + @Test + public void testDeleteTemplate() throws Exception { + Mockito.doNothing().when(templateBusinessLogic).deleteTemplate(ArgumentMatchers.any()); + mockMvc.perform(delete("/templates/ran-network/getNbr").accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()); + + Mockito.doThrow(new TemplateNotFoundException("Template not found")) + .when(templateBusinessLogic) + .deleteTemplate(ArgumentMatchers.any()); + mockMvc.perform(delete("/templates/ran-network/getNbr").accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isNotFound()); + } + +} |