Add cps-tbdmt-rest code 55/118555/8
authorkrishnaa96 <krishna.moorthy6@wipro.com>
Fri, 26 Feb 2021 07:44:09 +0000 (13:14 +0530)
committerkrishnaa96 <krishna.moorthy6@wipro.com>
Wed, 3 Mar 2021 13:20:34 +0000 (18:50 +0530)
Issue-ID: CPS-243
Signed-off-by: krishnaa96 <krishna.moorthy6@wipro.com>
Change-Id: I473135bc026a63cb6d644a42e54ffe45d1389fbd

cps-tbdmt-rest/docs/api/swagger/openapi.yaml [new file with mode: 0644]
cps-tbdmt-rest/pom.xml
cps-tbdmt-rest/src/main/java/org/onap/cps/tbdmt/exception/TemplateExceptionHandler.java [new file with mode: 0644]
cps-tbdmt-rest/src/main/java/org/onap/cps/tbdmt/rest/ExecutionController.java [new file with mode: 0644]
cps-tbdmt-rest/src/main/java/org/onap/cps/tbdmt/rest/TemplateController.java [new file with mode: 0644]
cps-tbdmt-rest/src/test/java/org/onap/cps/tbdmt/TestApplication.java [new file with mode: 0644]
cps-tbdmt-rest/src/test/java/org/onap/cps/tbdmt/rest/ExecutionControllerTest.java [new file with mode: 0644]
cps-tbdmt-rest/src/test/java/org/onap/cps/tbdmt/rest/TemplateControllerTest.java [new file with mode: 0644]

diff --git a/cps-tbdmt-rest/docs/api/swagger/openapi.yaml b/cps-tbdmt-rest/docs/api/swagger/openapi.yaml
new file mode 100644 (file)
index 0000000..f1c6514
--- /dev/null
@@ -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
index 048f243..c155196 100644 (file)
     <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 (file)
index 0000000..fa6fa28
--- /dev/null
@@ -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 (file)
index 0000000..b7dc4f6
--- /dev/null
@@ -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 (file)
index 0000000..15efdc5
--- /dev/null
@@ -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 (file)
index 0000000..db28e9e
--- /dev/null
@@ -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 (file)
index 0000000..23165a6
--- /dev/null
@@ -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 (file)
index 0000000..ce1178f
--- /dev/null
@@ -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());
+    }
+
+}