aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--cps-tbdmt-rest/docs/api/swagger/openapi.yaml175
-rw-r--r--cps-tbdmt-rest/pom.xml30
-rw-r--r--cps-tbdmt-rest/src/main/java/org/onap/cps/tbdmt/exception/TemplateExceptionHandler.java82
-rw-r--r--cps-tbdmt-rest/src/main/java/org/onap/cps/tbdmt/rest/ExecutionController.java56
-rw-r--r--cps-tbdmt-rest/src/main/java/org/onap/cps/tbdmt/rest/TemplateController.java92
-rw-r--r--cps-tbdmt-rest/src/test/java/org/onap/cps/tbdmt/TestApplication.java32
-rw-r--r--cps-tbdmt-rest/src/test/java/org/onap/cps/tbdmt/rest/ExecutionControllerTest.java142
-rw-r--r--cps-tbdmt-rest/src/test/java/org/onap/cps/tbdmt/rest/TemplateControllerTest.java145
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());
+ }
+
+}