From 86683c58addadfeabe12d10c2fa26cfead22c2fe Mon Sep 17 00:00:00 2001 From: Wojciech Sliwka Date: Tue, 9 Apr 2019 14:57:02 +0200 Subject: Support for swagger API definitions available under /vid/v2/api-docs Change-Id: Ie7e63bfbdb8d41c43bc04ca13351dba533776a8a Issue-ID: VID-377 Signed-off-by: Wojciech Sliwka --- vid-app-common/pom.xml | 5 + .../onap/vid/controller/HealthCheckController.java | 135 -------- .../onap/vid/controller/MaintenanceController.java | 151 --------- .../vid/controller/RoleGeneratorController.java | 48 --- .../org/onap/vid/controller/VersionController.java | 83 ----- .../java/org/onap/vid/controller/WebConfig.java | 15 + .../vid/controller/open/HealthCheckController.java | 136 +++++++++ .../vid/controller/open/MaintenanceController.java | 151 +++++++++ .../controller/open/RoleGeneratorController.java | 48 +++ .../vid/controller/open/VersionController.java | 83 +++++ .../vid/controller/HealthCheckControllerTest.java | 121 -------- .../vid/controller/MaintenanceControllerTest.java | 338 -------------------- .../controller/RoleGeneratorControllerTest.java | 79 ----- .../onap/vid/controller/VersionControllerTest.java | 51 ---- .../controller/open/HealthCheckControllerTest.java | 122 ++++++++ .../controller/open/MaintenanceControllerTest.java | 339 +++++++++++++++++++++ .../open/RoleGeneratorControllerTest.java | 80 +++++ .../vid/controller/open/VersionControllerTest.java | 52 ++++ 18 files changed, 1031 insertions(+), 1006 deletions(-) delete mode 100644 vid-app-common/src/main/java/org/onap/vid/controller/HealthCheckController.java delete mode 100644 vid-app-common/src/main/java/org/onap/vid/controller/MaintenanceController.java delete mode 100644 vid-app-common/src/main/java/org/onap/vid/controller/RoleGeneratorController.java delete mode 100644 vid-app-common/src/main/java/org/onap/vid/controller/VersionController.java create mode 100644 vid-app-common/src/main/java/org/onap/vid/controller/open/HealthCheckController.java create mode 100644 vid-app-common/src/main/java/org/onap/vid/controller/open/MaintenanceController.java create mode 100644 vid-app-common/src/main/java/org/onap/vid/controller/open/RoleGeneratorController.java create mode 100644 vid-app-common/src/main/java/org/onap/vid/controller/open/VersionController.java delete mode 100644 vid-app-common/src/test/java/org/onap/vid/controller/HealthCheckControllerTest.java delete mode 100644 vid-app-common/src/test/java/org/onap/vid/controller/MaintenanceControllerTest.java delete mode 100644 vid-app-common/src/test/java/org/onap/vid/controller/RoleGeneratorControllerTest.java delete mode 100644 vid-app-common/src/test/java/org/onap/vid/controller/VersionControllerTest.java create mode 100644 vid-app-common/src/test/java/org/onap/vid/controller/open/HealthCheckControllerTest.java create mode 100644 vid-app-common/src/test/java/org/onap/vid/controller/open/MaintenanceControllerTest.java create mode 100644 vid-app-common/src/test/java/org/onap/vid/controller/open/RoleGeneratorControllerTest.java create mode 100644 vid-app-common/src/test/java/org/onap/vid/controller/open/VersionControllerTest.java diff --git a/vid-app-common/pom.xml b/vid-app-common/pom.xml index 205d6422a..0cc2195e9 100755 --- a/vid-app-common/pom.xml +++ b/vid-app-common/pom.xml @@ -818,5 +818,10 @@ com.google.guava guava + + io.springfox + springfox-swagger2 + 2.9.2 + diff --git a/vid-app-common/src/main/java/org/onap/vid/controller/HealthCheckController.java b/vid-app-common/src/main/java/org/onap/vid/controller/HealthCheckController.java deleted file mode 100644 index 04d5babcc..000000000 --- a/vid-app-common/src/main/java/org/onap/vid/controller/HealthCheckController.java +++ /dev/null @@ -1,135 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * VID - * ================================================================================ - * Copyright (C) 2017 - 2019 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * 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.vid.controller; - -import org.onap.portalsdk.core.controller.UnRestrictedBaseController; -import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate; -import org.onap.portalsdk.core.util.SystemProperties; -import org.onap.vid.dao.FnAppDoaImpl; -import org.onap.vid.model.GitRepositoryState; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.MediaType; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RestController; - -import java.io.IOException; -import java.text.DateFormat; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.Properties; - -import static org.springframework.http.HttpStatus.INTERNAL_SERVER_ERROR; -import static org.springframework.http.HttpStatus.OK; - -/** - * Controller for user profile view. The view is restricted to authenticated - * users. The view name resolves to page user_profile.jsp which uses Angular. - */ - -@RestController -@RequestMapping("/") -public class HealthCheckController extends UnRestrictedBaseController { - - private static final EELFLoggerDelegate LOGGER = EELFLoggerDelegate.getLogger(HealthCheckController.class); - private static final DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss:SSSS"); - private static final String GIT_PROPERTIES_FILENAME = "git.properties"; - private FnAppDoaImpl fnAppDoaImpl; - - @Autowired - public HealthCheckController(FnAppDoaImpl fnAppDoaImpl) { - this.fnAppDoaImpl = fnAppDoaImpl; - } - - /** - * Obtain the HealthCheck Status from the System.Properties file. - * Used by IDNS for redundancy - * - * @return ResponseEntity The response entity - */ - @RequestMapping(value = "/healthCheck", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) - public HealthStatus getHealthCheckStatusForIDNS() { - return createCorrespondingStatus(); - } - - /** - * Obtain the HealthCheck Status from the System.Properties file. - * - * @return ResponseEntity The response entity - */ - @RequestMapping(value = "rest/healthCheck/{User-Agent}/{X-ECOMP-RequestID}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) - public HealthStatus getHealthCheck( - @PathVariable("User-Agent") String UserAgent, - @PathVariable("X-ECOMP-RequestID") String ECOMPRequestID) { - LOGGER.debug(EELFLoggerDelegate.debugLogger, "User-Agent ", UserAgent); - LOGGER.debug(EELFLoggerDelegate.debugLogger, "X-ECOMP-RequestID ", ECOMPRequestID); - return createCorrespondingStatus(); - } - - @RequestMapping(value = "/commitInfo", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) - public GitRepositoryState getCommitInfo() throws IOException { - Properties properties = new Properties(); - properties.load(getClass().getClassLoader().getResourceAsStream(GIT_PROPERTIES_FILENAME)); - return new GitRepositoryState(properties); - } - - private HealthStatus createCorrespondingStatus() { - logData(); - try { - int count = fnAppDoaImpl.getProfileCount(getUrl(), getUsername(), getPassword()); - LOGGER.debug(EELFLoggerDelegate.debugLogger, "count:::", count); - return okStatus(); - } catch (Exception ex) { - String errorMsg = ex.getMessage(); - LOGGER.error(EELFLoggerDelegate.errorLogger, errorMsg); - return errorStatus(errorMsg); - } - } - - private void logData() { - LOGGER.debug(EELFLoggerDelegate.debugLogger, "Performing health check"); - LOGGER.debug(EELFLoggerDelegate.debugLogger, "URL::", getUrl()); - LOGGER.debug(EELFLoggerDelegate.debugLogger, "username::", getUsername()); - } - - private HealthStatus okStatus() { - return new HealthStatus(OK, dateFormat.format(new Date()), "health check succeeded"); - } - - private HealthStatus errorStatus(String msg) { - return new HealthStatus(INTERNAL_SERVER_ERROR, dateFormat.format( - new Date()), "health check failed: " + msg); - } - - private String getUrl() { - return SystemProperties.getProperty("db.connectionURL"); - } - - private String getUsername() { - return SystemProperties.getProperty("db.userName"); - } - - private String getPassword() { - return SystemProperties.getProperty("db.password"); - } -} - diff --git a/vid-app-common/src/main/java/org/onap/vid/controller/MaintenanceController.java b/vid-app-common/src/main/java/org/onap/vid/controller/MaintenanceController.java deleted file mode 100644 index dfba4e31a..000000000 --- a/vid-app-common/src/main/java/org/onap/vid/controller/MaintenanceController.java +++ /dev/null @@ -1,151 +0,0 @@ -package org.onap.vid.controller; - -/*- - * ============LICENSE_START======================================================= - * VID - * ================================================================================ - * Copyright (C) 2017 - 2019 AT&T Intellectual Property. All rights reserved. - * Modifications Copyright (C) 2018 - 2019 Nokia. All rights reserved. - * ================================================================================ - * 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========================================================= - */ - -import org.onap.portalsdk.core.controller.UnRestrictedBaseController; -import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate; -import org.onap.vid.category.AddCategoryOptionResponse; -import org.onap.vid.category.AddCategoryOptionsRequest; -import org.onap.vid.category.CategoryParameterOptionRep; -import org.onap.vid.category.CategoryParametersResponse; -import org.onap.vid.model.CategoryParameter.Family; -import org.onap.vid.model.CategoryParameterOption; -import org.onap.vid.services.CategoryParameterService; -import org.onap.vid.services.CategoryParameterServiceImpl; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -import javax.ws.rs.ForbiddenException; - -import static org.onap.vid.utils.Logging.getMethodCallerName; - -/** - * Controler for APIs that are used only by vid operators - */ - -@RestController -@RequestMapping("maintenance") -public class MaintenanceController extends UnRestrictedBaseController { - - private static final EELFLoggerDelegate LOGGER = EELFLoggerDelegate.getLogger(MaintenanceController.class); - private CategoryParameterService categoryParameterService; - - @Autowired - public MaintenanceController(CategoryParameterService categoryParameterService) { - this.categoryParameterService = categoryParameterService; - } - - /** - * Add list of options to one category parameter - */ - @RequestMapping(value = "/category_parameter/{categoryName}", method = RequestMethod.POST) - public ResponseEntity addCategoryOptions(@PathVariable String categoryName, - @RequestBody AddCategoryOptionsRequest option) { - debugStartLog(); - try { - AddCategoryOptionResponse response = categoryParameterService - .createCategoryParameterOptions(categoryName, option); - HttpStatus httpStatus = response.getErrors().isEmpty() ? HttpStatus.OK : HttpStatus.MULTI_STATUS; - debugEndLog(response); - return createResponseWithBody(httpStatus, response); - } catch (CategoryParameterServiceImpl.UnfoundedCategoryException exception) { - return createResponseWithBody(HttpStatus.NOT_FOUND, new AddCategoryOptionResponse(exception.getMessage())); - } catch (RuntimeException exception) { - LOGGER.error("failed to add option to parameter category " + categoryName, exception); - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); - } - } - - @RequestMapping(value = "/category_parameter/{categoryName}", method = RequestMethod.PUT) - public ResponseEntity updateNameForOption(@PathVariable String categoryName, - @RequestBody CategoryParameterOptionRep option) { - debugStartLog(); - try { - AddCategoryOptionResponse response = categoryParameterService - .updateCategoryParameterOption(categoryName, option); - HttpStatus httpStatus = response.getErrors().isEmpty() ? HttpStatus.OK : HttpStatus.MULTI_STATUS; - debugEndLog(response); - return createResponseWithBody(httpStatus, response); - } catch (ForbiddenException exception) { - return createResponseWithBody(HttpStatus.FORBIDDEN, new AddCategoryOptionResponse(exception.getMessage())); - } catch (CategoryParameterServiceImpl.UnfoundedCategoryException | CategoryParameterServiceImpl.UnfoundedCategoryOptionException exception) { - return createResponseWithBody(HttpStatus.NOT_FOUND, new AddCategoryOptionResponse(exception.getMessage())); - - } catch (CategoryParameterServiceImpl.AlreadyExistOptionNameException exception) { - return createResponseWithBody(HttpStatus.CONFLICT, new AddCategoryOptionResponse(exception.getMessage())); - - } catch (RuntimeException exception) { - LOGGER.error("failed to update option to parameter category " + categoryName, exception); - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); - } - } - - /** - * Gets the owning entity properties. - */ - @RequestMapping(value = "/category_parameter", method = RequestMethod.GET) - public ResponseEntity getCategoryParameter(@RequestParam(value = "familyName", required = true) Family familyName) { - debugStartLog(); - try { - CategoryParametersResponse response = categoryParameterService.getCategoryParameters(familyName); - debugEndLog(response); - return ResponseEntity.ok().body(response); - } catch (RuntimeException exception) { - LOGGER.error("failed to retrieve category parameter list from DB.", exception); - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); - } - } - - /** - * Delete option of the category. - */ - @RequestMapping(value = "/delete_category_parameter/{categoryName}", method = RequestMethod.DELETE) - public ResponseEntity deleteCategoryOption(@PathVariable String categoryName, - @RequestBody CategoryParameterOption option) { - debugStartLog(); - - try { - categoryParameterService.deleteCategoryOption(categoryName, option); - debugEndLog(HttpStatus.OK); - return ResponseEntity.status(HttpStatus.OK).build(); - } catch (CategoryParameterServiceImpl.UnfoundedCategoryException exception) { - return createResponseWithBody(HttpStatus.NOT_FOUND, new AddCategoryOptionResponse(exception.getMessage())); - } catch (RuntimeException exception) { - LOGGER.error("failed to add/update owning entity option", exception); - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); - } - } - - private ResponseEntity createResponseWithBody(HttpStatus status, AddCategoryOptionResponse response) { - return ResponseEntity.status(status).body(response); - } - - private void debugStartLog() { - LOGGER.debug(EELFLoggerDelegate.debugLogger, "start {}({})", getMethodCallerName()); - } - - private void debugEndLog(Object response) { - LOGGER.debug(EELFLoggerDelegate.debugLogger, "end {}() => {}", getMethodCallerName(), response); - } -} diff --git a/vid-app-common/src/main/java/org/onap/vid/controller/RoleGeneratorController.java b/vid-app-common/src/main/java/org/onap/vid/controller/RoleGeneratorController.java deleted file mode 100644 index 107142d7f..000000000 --- a/vid-app-common/src/main/java/org/onap/vid/controller/RoleGeneratorController.java +++ /dev/null @@ -1,48 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * VID - * ================================================================================ - * Copyright (C) 2017 - 2019 AT&T Intellectual Property. All rights reserved. - * Modifications Copyright 2019 Nokia - * ================================================================================ - * 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.vid.controller; - -import static org.springframework.http.HttpStatus.OK; - -import org.onap.portalsdk.core.controller.UnRestrictedBaseController; -import org.onap.vid.services.RoleGeneratorService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RestController; - -@RestController -public class RoleGeneratorController extends UnRestrictedBaseController { - public static final String GENERATE_ROLE_SCRIPT = "generateRoleScript"; - private RoleGeneratorService roleGeneratorService; - - @Autowired - public RoleGeneratorController(RoleGeneratorService roleGeneratorService) { - this.roleGeneratorService = roleGeneratorService; - } - @RequestMapping(value = GENERATE_ROLE_SCRIPT +"/{firstRun}", method = RequestMethod.GET ) - public ResponseEntity generateRoleScript (@PathVariable("firstRun") boolean firstRun) { - return ResponseEntity.status(OK).body(roleGeneratorService.generateRoleScript(firstRun)); - } -} diff --git a/vid-app-common/src/main/java/org/onap/vid/controller/VersionController.java b/vid-app-common/src/main/java/org/onap/vid/controller/VersionController.java deleted file mode 100644 index aa15f0fa3..000000000 --- a/vid-app-common/src/main/java/org/onap/vid/controller/VersionController.java +++ /dev/null @@ -1,83 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * VID - * ================================================================================ - * Copyright (C) 2017 - 2019 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * 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.vid.controller; - - -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.google.common.collect.ImmutableMap; -import org.apache.commons.lang3.StringUtils; -import org.onap.portalsdk.core.controller.UnRestrictedBaseController; -import org.onap.portalsdk.core.util.SystemProperties; -import org.springframework.http.MediaType; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RestController; - -import javax.inject.Inject; -import javax.servlet.ServletContext; -import java.io.IOException; -import java.net.URL; -import java.util.HashMap; -import java.util.Map; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import static org.apache.commons.lang3.StringUtils.substringAfterLast; - -@RestController -@RequestMapping("version") -public class VersionController extends UnRestrictedBaseController { - - private final ServletContext servletContext; - - @Inject - public VersionController(ServletContext servletContext) { - this.servletContext = servletContext; - } - - @RequestMapping(method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) - public Map getVersionAndFeatures() - { - String features = SystemProperties.getProperty("features.set.filename"); - String version; - try { - final URL resource = servletContext.getResource("/app/vid/scripts/constants/version.json"); - HashMap versionFile = new HashMap <>(); - ObjectMapper mapper = new ObjectMapper(); - versionFile.putAll(mapper.readValue(resource, new TypeReference>() {})); - version = versionFile.get("Version"); - } catch (IOException e) { - version = "Error retrieving build number"; - } - String majorVersion = getDisplayVersion(features, version); - return ImmutableMap.of("Features", features, "Build", version, "DisplayVersion", majorVersion); - } - - String getDisplayVersion(String features, String build) { - Matcher matcher = Pattern.compile("([^/]+?)(\\.features|$)").matcher(features); - final String majorByFeatures = matcher.find() ? matcher.group(1) : features; - - final String buildByVersion = StringUtils.defaultIfBlank(substringAfterLast(build, "."), build); - - return StringUtils.join(majorByFeatures, ".", buildByVersion); - } -} diff --git a/vid-app-common/src/main/java/org/onap/vid/controller/WebConfig.java b/vid-app-common/src/main/java/org/onap/vid/controller/WebConfig.java index 543aa9432..e00c2d7a5 100644 --- a/vid-app-common/src/main/java/org/onap/vid/controller/WebConfig.java +++ b/vid-app-common/src/main/java/org/onap/vid/controller/WebConfig.java @@ -42,11 +42,18 @@ import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.togglz.core.manager.FeatureManager; +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spring.web.plugins.Docket; +import springfox.documentation.swagger2.annotations.EnableSwagger2; + import javax.servlet.ServletContext; import java.io.File; import java.io.IOException; +@EnableSwagger2 @Configuration public class WebConfig { @@ -193,4 +200,12 @@ public class WebConfig { } + @Bean + public Docket api(){ + return new Docket(DocumentationType.SWAGGER_2) + .select() + .apis(RequestHandlerSelectors.basePackage("org.onap.vid.controller.open")) + .paths(PathSelectors.any()) + .build(); + } } diff --git a/vid-app-common/src/main/java/org/onap/vid/controller/open/HealthCheckController.java b/vid-app-common/src/main/java/org/onap/vid/controller/open/HealthCheckController.java new file mode 100644 index 000000000..92e1a1802 --- /dev/null +++ b/vid-app-common/src/main/java/org/onap/vid/controller/open/HealthCheckController.java @@ -0,0 +1,136 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * Copyright (C) 2017 - 2019 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.vid.controller.open; + +import org.onap.portalsdk.core.controller.UnRestrictedBaseController; +import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate; +import org.onap.portalsdk.core.util.SystemProperties; +import org.onap.vid.controller.HealthStatus; +import org.onap.vid.dao.FnAppDoaImpl; +import org.onap.vid.model.GitRepositoryState; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Properties; + +import static org.springframework.http.HttpStatus.INTERNAL_SERVER_ERROR; +import static org.springframework.http.HttpStatus.OK; + +/** + * Controller for user profile view. The view is restricted to authenticated + * users. The view name resolves to page user_profile.jsp which uses Angular. + */ + +@RestController +@RequestMapping("/") +public class HealthCheckController extends UnRestrictedBaseController { + + private static final EELFLoggerDelegate LOGGER = EELFLoggerDelegate.getLogger(HealthCheckController.class); + private static final DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss:SSSS"); + private static final String GIT_PROPERTIES_FILENAME = "git.properties"; + private FnAppDoaImpl fnAppDoaImpl; + + @Autowired + public HealthCheckController(FnAppDoaImpl fnAppDoaImpl) { + this.fnAppDoaImpl = fnAppDoaImpl; + } + + /** + * Obtain the HealthCheck Status from the System.Properties file. + * Used by IDNS for redundancy + * + * @return ResponseEntity The response entity + */ + @RequestMapping(value = "/healthCheck", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) + public HealthStatus getHealthCheckStatusForIDNS() { + return createCorrespondingStatus(); + } + + /** + * Obtain the HealthCheck Status from the System.Properties file. + * + * @return ResponseEntity The response entity + */ + @RequestMapping(value = "rest/healthCheck/{User-Agent}/{X-ECOMP-RequestID}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) + public HealthStatus getHealthCheck( + @PathVariable("User-Agent") String UserAgent, + @PathVariable("X-ECOMP-RequestID") String ECOMPRequestID) { + LOGGER.debug(EELFLoggerDelegate.debugLogger, "User-Agent ", UserAgent); + LOGGER.debug(EELFLoggerDelegate.debugLogger, "X-ECOMP-RequestID ", ECOMPRequestID); + return createCorrespondingStatus(); + } + + @RequestMapping(value = "/commitInfo", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) + public GitRepositoryState getCommitInfo() throws IOException { + Properties properties = new Properties(); + properties.load(getClass().getClassLoader().getResourceAsStream(GIT_PROPERTIES_FILENAME)); + return new GitRepositoryState(properties); + } + + private HealthStatus createCorrespondingStatus() { + logData(); + try { + int count = fnAppDoaImpl.getProfileCount(getUrl(), getUsername(), getPassword()); + LOGGER.debug(EELFLoggerDelegate.debugLogger, "count:::", count); + return okStatus(); + } catch (Exception ex) { + String errorMsg = ex.getMessage(); + LOGGER.error(EELFLoggerDelegate.errorLogger, errorMsg); + return errorStatus(errorMsg); + } + } + + private void logData() { + LOGGER.debug(EELFLoggerDelegate.debugLogger, "Performing health check"); + LOGGER.debug(EELFLoggerDelegate.debugLogger, "URL::", getUrl()); + LOGGER.debug(EELFLoggerDelegate.debugLogger, "username::", getUsername()); + } + + private HealthStatus okStatus() { + return new HealthStatus(OK, dateFormat.format(new Date()), "health check succeeded"); + } + + private HealthStatus errorStatus(String msg) { + return new HealthStatus(INTERNAL_SERVER_ERROR, dateFormat.format( + new Date()), "health check failed: " + msg); + } + + private String getUrl() { + return SystemProperties.getProperty("db.connectionURL"); + } + + private String getUsername() { + return SystemProperties.getProperty("db.userName"); + } + + private String getPassword() { + return SystemProperties.getProperty("db.password"); + } +} + diff --git a/vid-app-common/src/main/java/org/onap/vid/controller/open/MaintenanceController.java b/vid-app-common/src/main/java/org/onap/vid/controller/open/MaintenanceController.java new file mode 100644 index 000000000..d1004401a --- /dev/null +++ b/vid-app-common/src/main/java/org/onap/vid/controller/open/MaintenanceController.java @@ -0,0 +1,151 @@ +package org.onap.vid.controller.open; + +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * Copyright (C) 2017 - 2019 AT&T Intellectual Property. All rights reserved. + * Modifications Copyright (C) 2018 - 2019 Nokia. All rights reserved. + * ================================================================================ + * 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========================================================= + */ + +import org.onap.portalsdk.core.controller.UnRestrictedBaseController; +import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate; +import org.onap.vid.category.AddCategoryOptionResponse; +import org.onap.vid.category.AddCategoryOptionsRequest; +import org.onap.vid.category.CategoryParameterOptionRep; +import org.onap.vid.category.CategoryParametersResponse; +import org.onap.vid.model.CategoryParameter.Family; +import org.onap.vid.model.CategoryParameterOption; +import org.onap.vid.services.CategoryParameterService; +import org.onap.vid.services.CategoryParameterServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import javax.ws.rs.ForbiddenException; + +import static org.onap.vid.utils.Logging.getMethodCallerName; + +/** + * Controler for APIs that are used only by vid operators + */ + +@RestController +@RequestMapping("maintenance") +public class MaintenanceController extends UnRestrictedBaseController { + + private static final EELFLoggerDelegate LOGGER = EELFLoggerDelegate.getLogger(MaintenanceController.class); + private CategoryParameterService categoryParameterService; + + @Autowired + public MaintenanceController(CategoryParameterService categoryParameterService) { + this.categoryParameterService = categoryParameterService; + } + + /** + * Add list of options to one category parameter + */ + @RequestMapping(value = "/category_parameter/{categoryName}", method = RequestMethod.POST) + public ResponseEntity addCategoryOptions(@PathVariable String categoryName, + @RequestBody AddCategoryOptionsRequest option) { + debugStartLog(); + try { + AddCategoryOptionResponse response = categoryParameterService + .createCategoryParameterOptions(categoryName, option); + HttpStatus httpStatus = response.getErrors().isEmpty() ? HttpStatus.OK : HttpStatus.MULTI_STATUS; + debugEndLog(response); + return createResponseWithBody(httpStatus, response); + } catch (CategoryParameterServiceImpl.UnfoundedCategoryException exception) { + return createResponseWithBody(HttpStatus.NOT_FOUND, new AddCategoryOptionResponse(exception.getMessage())); + } catch (RuntimeException exception) { + LOGGER.error("failed to add option to parameter category " + categoryName, exception); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); + } + } + + @RequestMapping(value = "/category_parameter/{categoryName}", method = RequestMethod.PUT) + public ResponseEntity updateNameForOption(@PathVariable String categoryName, + @RequestBody CategoryParameterOptionRep option) { + debugStartLog(); + try { + AddCategoryOptionResponse response = categoryParameterService + .updateCategoryParameterOption(categoryName, option); + HttpStatus httpStatus = response.getErrors().isEmpty() ? HttpStatus.OK : HttpStatus.MULTI_STATUS; + debugEndLog(response); + return createResponseWithBody(httpStatus, response); + } catch (ForbiddenException exception) { + return createResponseWithBody(HttpStatus.FORBIDDEN, new AddCategoryOptionResponse(exception.getMessage())); + } catch (CategoryParameterServiceImpl.UnfoundedCategoryException | CategoryParameterServiceImpl.UnfoundedCategoryOptionException exception) { + return createResponseWithBody(HttpStatus.NOT_FOUND, new AddCategoryOptionResponse(exception.getMessage())); + + } catch (CategoryParameterServiceImpl.AlreadyExistOptionNameException exception) { + return createResponseWithBody(HttpStatus.CONFLICT, new AddCategoryOptionResponse(exception.getMessage())); + + } catch (RuntimeException exception) { + LOGGER.error("failed to update option to parameter category " + categoryName, exception); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); + } + } + + /** + * Gets the owning entity properties. + */ + @RequestMapping(value = "/category_parameter", method = RequestMethod.GET) + public ResponseEntity getCategoryParameter(@RequestParam(value = "familyName", required = true) Family familyName) { + debugStartLog(); + try { + CategoryParametersResponse response = categoryParameterService.getCategoryParameters(familyName); + debugEndLog(response); + return ResponseEntity.ok().body(response); + } catch (RuntimeException exception) { + LOGGER.error("failed to retrieve category parameter list from DB.", exception); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); + } + } + + /** + * Delete option of the category. + */ + @RequestMapping(value = "/delete_category_parameter/{categoryName}", method = RequestMethod.DELETE) + public ResponseEntity deleteCategoryOption(@PathVariable String categoryName, + @RequestBody CategoryParameterOption option) { + debugStartLog(); + + try { + categoryParameterService.deleteCategoryOption(categoryName, option); + debugEndLog(HttpStatus.OK); + return ResponseEntity.status(HttpStatus.OK).build(); + } catch (CategoryParameterServiceImpl.UnfoundedCategoryException exception) { + return createResponseWithBody(HttpStatus.NOT_FOUND, new AddCategoryOptionResponse(exception.getMessage())); + } catch (RuntimeException exception) { + LOGGER.error("failed to add/update owning entity option", exception); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); + } + } + + private ResponseEntity createResponseWithBody(HttpStatus status, AddCategoryOptionResponse response) { + return ResponseEntity.status(status).body(response); + } + + private void debugStartLog() { + LOGGER.debug(EELFLoggerDelegate.debugLogger, "start {}({})", getMethodCallerName()); + } + + private void debugEndLog(Object response) { + LOGGER.debug(EELFLoggerDelegate.debugLogger, "end {}() => {}", getMethodCallerName(), response); + } +} diff --git a/vid-app-common/src/main/java/org/onap/vid/controller/open/RoleGeneratorController.java b/vid-app-common/src/main/java/org/onap/vid/controller/open/RoleGeneratorController.java new file mode 100644 index 000000000..7b57df2c7 --- /dev/null +++ b/vid-app-common/src/main/java/org/onap/vid/controller/open/RoleGeneratorController.java @@ -0,0 +1,48 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * Copyright (C) 2017 - 2019 AT&T Intellectual Property. All rights reserved. + * Modifications Copyright 2019 Nokia + * ================================================================================ + * 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.vid.controller.open; + +import static org.springframework.http.HttpStatus.OK; + +import org.onap.portalsdk.core.controller.UnRestrictedBaseController; +import org.onap.vid.services.RoleGeneratorService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class RoleGeneratorController extends UnRestrictedBaseController { + public static final String GENERATE_ROLE_SCRIPT = "generateRoleScript"; + private RoleGeneratorService roleGeneratorService; + + @Autowired + public RoleGeneratorController(RoleGeneratorService roleGeneratorService) { + this.roleGeneratorService = roleGeneratorService; + } + @RequestMapping(value = GENERATE_ROLE_SCRIPT +"/{firstRun}", method = RequestMethod.GET ) + public ResponseEntity generateRoleScript (@PathVariable("firstRun") boolean firstRun) { + return ResponseEntity.status(OK).body(roleGeneratorService.generateRoleScript(firstRun)); + } +} diff --git a/vid-app-common/src/main/java/org/onap/vid/controller/open/VersionController.java b/vid-app-common/src/main/java/org/onap/vid/controller/open/VersionController.java new file mode 100644 index 000000000..0a4d6f5ac --- /dev/null +++ b/vid-app-common/src/main/java/org/onap/vid/controller/open/VersionController.java @@ -0,0 +1,83 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * Copyright (C) 2017 - 2019 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.vid.controller.open; + + +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.common.collect.ImmutableMap; +import org.apache.commons.lang3.StringUtils; +import org.onap.portalsdk.core.controller.UnRestrictedBaseController; +import org.onap.portalsdk.core.util.SystemProperties; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +import javax.inject.Inject; +import javax.servlet.ServletContext; +import java.io.IOException; +import java.net.URL; +import java.util.HashMap; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import static org.apache.commons.lang3.StringUtils.substringAfterLast; + +@RestController +@RequestMapping("version") +public class VersionController extends UnRestrictedBaseController { + + private final ServletContext servletContext; + + @Inject + public VersionController(ServletContext servletContext) { + this.servletContext = servletContext; + } + + @RequestMapping(method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) + public Map getVersionAndFeatures() + { + String features = SystemProperties.getProperty("features.set.filename"); + String version; + try { + final URL resource = servletContext.getResource("/app/vid/scripts/constants/version.json"); + HashMap versionFile = new HashMap <>(); + ObjectMapper mapper = new ObjectMapper(); + versionFile.putAll(mapper.readValue(resource, new TypeReference>() {})); + version = versionFile.get("Version"); + } catch (IOException e) { + version = "Error retrieving build number"; + } + String majorVersion = getDisplayVersion(features, version); + return ImmutableMap.of("Features", features, "Build", version, "DisplayVersion", majorVersion); + } + + String getDisplayVersion(String features, String build) { + Matcher matcher = Pattern.compile("([^/]+?)(\\.features|$)").matcher(features); + final String majorByFeatures = matcher.find() ? matcher.group(1) : features; + + final String buildByVersion = StringUtils.defaultIfBlank(substringAfterLast(build, "."), build); + + return StringUtils.join(majorByFeatures, ".", buildByVersion); + } +} diff --git a/vid-app-common/src/test/java/org/onap/vid/controller/HealthCheckControllerTest.java b/vid-app-common/src/test/java/org/onap/vid/controller/HealthCheckControllerTest.java deleted file mode 100644 index 49e6645bc..000000000 --- a/vid-app-common/src/test/java/org/onap/vid/controller/HealthCheckControllerTest.java +++ /dev/null @@ -1,121 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * VID - * ================================================================================ - * Copyright (C) 2017 - 2019 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * 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.vid.controller; - -import org.apache.log4j.BasicConfigurator; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mock; -import org.mockito.junit.MockitoJUnitRunner; -import org.onap.vid.dao.FnAppDoaImpl; -import org.springframework.http.MediaType; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.setup.MockMvcBuilders; - -import java.sql.SQLException; - -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.BDDMockito.given; -import static org.springframework.http.HttpStatus.INTERNAL_SERVER_ERROR; -import static org.springframework.http.HttpStatus.OK; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -@RunWith(MockitoJUnitRunner.class) -public class HealthCheckControllerTest { - - private static final String ERROR_MESSAGE = "error message"; - private HealthCheckController testSubject; - private MockMvc mockMvc; - - @Mock - private FnAppDoaImpl fnAppDoa; - - @Before - public void setUp() { - testSubject = new HealthCheckController(fnAppDoa); - BasicConfigurator.configure(); - mockMvc = MockMvcBuilders.standaloneSetup(testSubject).build(); - } - - @Test - public void getHealthCheckStatusForIDNS_shouldReturnSuccess_whenNoExceptionIsThrown() throws Exception { - databaseConnectionEstablished(); - mockMvc.perform(get("/healthCheck") - .accept(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.statusCode").value(OK.value())) - .andExpect(jsonPath("$.detailedMsg").value("health check succeeded")); - } - - @Test - public void getHealthCheckStatusForIDNS_shouldReturnErrorCode_whenExceptionIsThrown() throws Exception { - databaseNotAccessible(); - mockMvc.perform(get("/healthCheck") - .accept(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.statusCode").value(INTERNAL_SERVER_ERROR.value())) - .andExpect(jsonPath("$.detailedMsg").value("health check failed: " + ERROR_MESSAGE)); - } - - @Test - public void getHealthCheck_shouldReturnSuccess_whenNoExceptionIsThrown() throws Exception { - databaseConnectionEstablished(); - mockMvc.perform(get("/rest/healthCheck/{User-Agent}/{X-ECOMP-RequestID}", "userAgent", "requestId") - .accept(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.statusCode").value(OK.value())) - .andExpect(jsonPath("$.detailedMsg").value("health check succeeded")) - .andExpect(jsonPath("$.date").isString()); - } - - @Test - public void getHealthCheck_shouldReturnErrorCode_whenExceptionIsThrown() throws Exception { - databaseNotAccessible(); - mockMvc.perform(get("/rest/healthCheck/{User-Agent}/{X-ECOMP-RequestID}", "userAgent", "requestId") - .accept(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.statusCode").value(INTERNAL_SERVER_ERROR.value())) - .andExpect(jsonPath("$.detailedMsg").value("health check failed: " + ERROR_MESSAGE)); - } - - @Test - public void getCommitInfo_shouldReturnCommitData_whenCorrectPropertiesFileExists() throws Exception { - mockMvc.perform(get("/commitInfo") - .accept(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.commitId").value("123")) - .andExpect(jsonPath("$.commitMessageShort").value("Test short commit message")) - .andExpect(jsonPath("$.commitTime").value("1999-09-12T13:48:55+0200")); - } - - private void databaseConnectionEstablished() throws SQLException { - given(fnAppDoa.getProfileCount(anyString(), anyString(), anyString())) - .willReturn(0); - } - - private void databaseNotAccessible() throws SQLException { - given(fnAppDoa.getProfileCount(anyString(), anyString(), anyString())) - .willThrow(new SQLException(ERROR_MESSAGE)); - } -} diff --git a/vid-app-common/src/test/java/org/onap/vid/controller/MaintenanceControllerTest.java b/vid-app-common/src/test/java/org/onap/vid/controller/MaintenanceControllerTest.java deleted file mode 100644 index b9193810a..000000000 --- a/vid-app-common/src/test/java/org/onap/vid/controller/MaintenanceControllerTest.java +++ /dev/null @@ -1,338 +0,0 @@ -package org.onap.vid.controller; - -/*- - * ============LICENSE_START======================================================= - * VID - * ================================================================================ - * Copyright (C) 2017 - 2019 AT&T Intellectual Property. All rights reserved. - * Modifications Copyright (C) 2018 - 2019 Nokia. All rights reserved. - * ================================================================================ - * 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========================================================= - */ - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; -import org.apache.log4j.BasicConfigurator; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.ArgumentMatcher; -import org.mockito.Mock; -import org.mockito.junit.MockitoJUnitRunner; -import org.onap.vid.category.AddCategoryOptionResponse; -import org.onap.vid.category.AddCategoryOptionsRequest; -import org.onap.vid.category.CategoryParameterOptionRep; -import org.onap.vid.category.CategoryParametersResponse; -import org.onap.vid.model.CategoryParameter; -import org.onap.vid.model.CategoryParameterOption; -import org.onap.vid.services.CategoryParameterService; -import org.onap.vid.services.CategoryParameterServiceImpl; -import org.springframework.http.MediaType; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.ResultActions; -import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; -import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; -import org.springframework.test.web.servlet.setup.MockMvcBuilders; - -import javax.ws.rs.ForbiddenException; -import java.util.Collections; -import java.util.function.BiFunction; - -import static org.mockito.ArgumentMatchers.argThat; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.BDDMockito.*; -import static org.mockito.Mockito.times; -import static org.onap.vid.model.CategoryParameter.Family.PARAMETER_STANDARDIZATION; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -@RunWith(MockitoJUnitRunner.class) -public class MaintenanceControllerTest { - - final private String MAINTENANCE_CATEGORY_PATH = "/maintenance/category_parameter"; - final private String CATEGORY_PARAMETER_PATH = MAINTENANCE_CATEGORY_PATH + "/{name}"; - final private String DELETE_CATEGORY_PATH = "/maintenance/delete_category_parameter/{name}"; - - @Mock - private CategoryParameterService service; - private MaintenanceController maintenanceController; - private MockMvc mockMvc; - private ObjectMapper objectMapper; - - @Before - public void setUp() { - maintenanceController = new MaintenanceController(service); - BasicConfigurator.configure(); - mockMvc = MockMvcBuilders.standaloneSetup(maintenanceController).build(); - objectMapper = new ObjectMapper(); - } - - @Test - public void addCategoryOptions_shouldReturnMultiStatus_whenErrorsExist() throws Exception { - String categoryName = "catName1"; - AddCategoryOptionsRequest req = new AddCategoryOptionsRequest(); - req.options = ImmutableList.of("first option", "second option"); - AddCategoryOptionResponse addCategoryOptionResponse = new AddCategoryOptionResponse( - ImmutableList.of("error one", "error two")); - - given(service.createCategoryParameterOptions(eq(categoryName), argThat(requestMatcher(req)))) - .willReturn(addCategoryOptionResponse); - - prepareRequestExpectations(MockMvcRequestBuilders::post, CATEGORY_PARAMETER_PATH, categoryName, - objectMapper.writeValueAsString(req)) - .andExpect(status().isMultiStatus()) - .andExpect( - content().json(objectMapper - .writeValueAsString(addCategoryOptionResponse))); - } - - @Test - public void addCategoryOptions_shouldReturnOk_whenNoErrorsExist() throws Exception { - String categoryName = "catName2"; - AddCategoryOptionsRequest req = new AddCategoryOptionsRequest(); - req.options = ImmutableList.of("first option", "second option", "third option"); - AddCategoryOptionResponse addCategoryOptionResponse = new AddCategoryOptionResponse(Collections.emptyList()); - - given(service.createCategoryParameterOptions(eq(categoryName), argThat(requestMatcher(req)))) - .willReturn(addCategoryOptionResponse); - prepareRequestExpectations(MockMvcRequestBuilders::post, CATEGORY_PARAMETER_PATH, categoryName, - objectMapper.writeValueAsString(req)) - .andExpect(status().isOk()) - .andExpect(content().json( - objectMapper.writeValueAsString(addCategoryOptionResponse))); - } - - @Test - public void addCategoryOptions_shouldReturnNotFound_whenUnfoundedCategoryExceptionIsThrown() throws Exception { - String unfoundedMsg = "unfounded category exception message"; - String categoryName = "catName3"; - AddCategoryOptionsRequest req = new AddCategoryOptionsRequest(); - req.options = ImmutableList.of("first option"); - - given(service.createCategoryParameterOptions(eq(categoryName), argThat(requestMatcher(req)))) - .willThrow(new CategoryParameterServiceImpl.UnfoundedCategoryException(unfoundedMsg)); - - prepareRequestExpectations(MockMvcRequestBuilders::post, CATEGORY_PARAMETER_PATH, categoryName, - objectMapper.writeValueAsString(req)) - .andExpect(status().isNotFound()) - .andExpect(content().json( - objectMapper.writeValueAsString(new AddCategoryOptionResponse(ImmutableList.of(unfoundedMsg))))); - } - - @Test - public void addCategoryOptions_shouldReturnInternalServerError_whenExceptionIsThrown() throws Exception { - String categoryName = "catName13"; - AddCategoryOptionsRequest req = new AddCategoryOptionsRequest(); - req.options = ImmutableList.of("option second", "first option"); - - given(service.createCategoryParameterOptions(eq(categoryName), argThat(requestMatcher(req)))) - .willThrow(new RuntimeException()); - - prepareRequestExpectations(MockMvcRequestBuilders::post, CATEGORY_PARAMETER_PATH, categoryName, - objectMapper.writeValueAsString(req)) - .andExpect(status().isInternalServerError()); - } - - @Test - public void updateNameForOption_shouldReturnMultiStatus_whenErrorsExist() throws Exception { - String categoryName = "catName4"; - CategoryParameterOptionRep categoryParameterOptionRep = new CategoryParameterOptionRep("id1", "name1"); - AddCategoryOptionResponse addCategoryOptionResponse = new AddCategoryOptionResponse( - ImmutableList.of("error one", "error two")); - - given(service - .updateCategoryParameterOption(eq(categoryName), argThat(requestMatcher(categoryParameterOptionRep)))) - .willReturn(addCategoryOptionResponse); - - prepareRequestExpectations(MockMvcRequestBuilders::put, CATEGORY_PARAMETER_PATH, categoryName, - objectMapper.writeValueAsString(categoryParameterOptionRep)) - .andExpect(status().isMultiStatus()) - .andExpect( - content().json(objectMapper - .writeValueAsString(addCategoryOptionResponse))); - } - - @Test - public void updateNameForOption_shouldReturnOk_whenNoErrorsExist() throws Exception { - String categoryName = "catName5"; - CategoryParameterOptionRep categoryParameterOptionRep = new CategoryParameterOptionRep("id2", "name2"); - AddCategoryOptionResponse addCategoryOptionResponse = new AddCategoryOptionResponse(Collections.emptyList()); - - given(service - .updateCategoryParameterOption(eq(categoryName), argThat(requestMatcher(categoryParameterOptionRep)))) - .willReturn(addCategoryOptionResponse); - prepareRequestExpectations(MockMvcRequestBuilders::put, CATEGORY_PARAMETER_PATH, categoryName, - objectMapper.writeValueAsString(categoryParameterOptionRep)) - .andExpect(status().isOk()) - .andExpect(content().json( - objectMapper.writeValueAsString(addCategoryOptionResponse))); - } - - @Test - public void updateNameForOption_shouldReturnForbidden_whenForbiddenExceptionIsThrown() throws Exception { - String categoryName = "catName6"; - CategoryParameterOptionRep categoryParameterOptionRep = new CategoryParameterOptionRep("id3", "name3"); - - given(service - .updateCategoryParameterOption(eq(categoryName), argThat(requestMatcher(categoryParameterOptionRep)))) - .willThrow(new ForbiddenException()); - prepareRequestExpectations(MockMvcRequestBuilders::put, CATEGORY_PARAMETER_PATH, categoryName, - objectMapper.writeValueAsString(categoryParameterOptionRep)) - .andExpect(status().isForbidden()) - .andExpect(content().json( - objectMapper - .writeValueAsString(new AddCategoryOptionResponse(ImmutableList.of("HTTP 403 Forbidden"))))); - } - - @Test - public void updateNameForOption_shouldReturnNotFound_whenUnfoundedIsThrown() throws Exception { - String unfoundedOptionMsg = "unfounded category option exception message"; - String categoryName = "catName7"; - CategoryParameterOptionRep categoryParameterOptionRep = new CategoryParameterOptionRep("id4", "name4"); - - given(service - .updateCategoryParameterOption(eq(categoryName), argThat(requestMatcher(categoryParameterOptionRep)))) - .willThrow(new CategoryParameterServiceImpl.UnfoundedCategoryOptionException(unfoundedOptionMsg)); - - prepareRequestExpectations(MockMvcRequestBuilders::put, CATEGORY_PARAMETER_PATH, categoryName, - objectMapper.writeValueAsString(categoryParameterOptionRep)) - .andExpect(status().isNotFound()) - .andExpect(content().json( - objectMapper.writeValueAsString(new AddCategoryOptionResponse(ImmutableList.of(unfoundedOptionMsg))))); - } - - @Test - public void updateNameForOption_shouldReturnConflict_whenAlreadyExistOptionNameIsThrown() throws Exception { - String conflictMsg = "already exists option name exception message"; - String categoryName = "catName8"; - CategoryParameterOptionRep categoryParameterOptionRep = new CategoryParameterOptionRep("id5", "name5"); - - given(service - .updateCategoryParameterOption(eq(categoryName), argThat(requestMatcher(categoryParameterOptionRep)))) - .willThrow(new CategoryParameterServiceImpl.AlreadyExistOptionNameException(conflictMsg)); - - prepareRequestExpectations(MockMvcRequestBuilders::put, CATEGORY_PARAMETER_PATH, categoryName, - objectMapper.writeValueAsString(categoryParameterOptionRep)) - .andExpect(status().isConflict()) - .andExpect(content().json( - objectMapper.writeValueAsString(new AddCategoryOptionResponse(ImmutableList.of(conflictMsg))))); - } - - @Test - public void updateNameForOption_shouldReturnInternalServerError_whenExceptionIsThrown() throws Exception { - String categoryName = "catName18"; - CategoryParameterOptionRep categoryParameterOptionRep = new CategoryParameterOptionRep("id6", "name6"); - - given(service - .updateCategoryParameterOption(eq(categoryName), argThat(requestMatcher(categoryParameterOptionRep)))) - .willThrow(new RuntimeException()); - - prepareRequestExpectations(MockMvcRequestBuilders::put, CATEGORY_PARAMETER_PATH, categoryName, - objectMapper.writeValueAsString(categoryParameterOptionRep)) - .andExpect(status().isInternalServerError()); - } - - @Test - public void getCategoryParameter_shouldReturnExistingMap() throws Exception { - CategoryParametersResponse categoryParametersResponse = - new CategoryParametersResponse( - ImmutableMap.of( - "key1", ImmutableList.of( - new CategoryParameterOptionRep("testId", "testName")))); - - given(service.getCategoryParameters(PARAMETER_STANDARDIZATION)) - .willReturn(categoryParametersResponse); - - mockMvc.perform(get(MAINTENANCE_CATEGORY_PATH) - .param("familyName", "PARAMETER_STANDARDIZATION") - .accept(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()) - .andExpect(content().json(objectMapper.writeValueAsString(categoryParametersResponse))); - } - - @Test - public void getCategoryParameter_shouldReturnInternalServerError_whenExceptionIsThrown() throws Exception { - given(service.getCategoryParameters(PARAMETER_STANDARDIZATION)) - .willThrow(new RuntimeException()); - - mockMvc.perform(get(MAINTENANCE_CATEGORY_PATH) - .param("familyName", "PARAMETER_STANDARDIZATION") - .accept(MediaType.APPLICATION_JSON)) - .andExpect(status().isInternalServerError()); - } - - @Test - public void deleteCategoryOption_shouldReturnOk_whenNoExceptionIsThrown() throws Exception { - String categoryName = "catName9"; - CategoryParameterOption categoryParameterOption = new CategoryParameterOption("id1", "name1", - new CategoryParameter()); - - prepareRequestExpectations(MockMvcRequestBuilders::delete, DELETE_CATEGORY_PATH, categoryName, - objectMapper.writeValueAsString(categoryParameterOption)) - .andExpect(status().isOk()); - - then(service).should(times(1)) - .deleteCategoryOption(eq(categoryName), argThat(requestMatcher(categoryParameterOption))); - } - - @Test - public void deleteCategoryOption_shouldReturnNotFound_whenUnfoundedExceptionIsThrown() throws Exception { - String unfoundedMsg = "unfounded category exception message"; - String categoryName = "catName10"; - CategoryParameterOption categoryParameterOption = new CategoryParameterOption("id2", "name2", - new CategoryParameter()); - - willThrow(new CategoryParameterServiceImpl.UnfoundedCategoryException(unfoundedMsg)) - .given(service).deleteCategoryOption(eq(categoryName), argThat(requestMatcher(categoryParameterOption))); - - prepareRequestExpectations(MockMvcRequestBuilders::delete, DELETE_CATEGORY_PATH, categoryName, - objectMapper.writeValueAsString(categoryParameterOption)) - .andExpect(status().isNotFound()) - .andExpect(content().json( - objectMapper.writeValueAsString(new AddCategoryOptionResponse(ImmutableList.of(unfoundedMsg))))); - } - - @Test - public void deleteCategoryOption_shouldReturnInternalServerError_whenExceptionIsThrown() throws Exception { - String categoryName = "catName19"; - CategoryParameterOption categoryParameterOption = new CategoryParameterOption("id3", "name3", - new CategoryParameter()); - - willThrow(new RuntimeException()).given(service) - .deleteCategoryOption(eq(categoryName), argThat(requestMatcher(categoryParameterOption))); - - prepareRequestExpectations(MockMvcRequestBuilders::delete, DELETE_CATEGORY_PATH, categoryName, - objectMapper.writeValueAsString(categoryParameterOption)) - .andExpect(status().isInternalServerError()); - } - - private ArgumentMatcher requestMatcher(T t) { - return new ArgumentMatcher() { - @Override - public boolean matches(Object o) { - return t.equals(o); - } - }; - } - - private ResultActions prepareRequestExpectations( - BiFunction httpMethod, - String path, String name, String jsonContent) throws Exception { - return mockMvc.perform(httpMethod.apply(path, name) - .contentType(MediaType.APPLICATION_JSON) - .content(jsonContent)); - } -} diff --git a/vid-app-common/src/test/java/org/onap/vid/controller/RoleGeneratorControllerTest.java b/vid-app-common/src/test/java/org/onap/vid/controller/RoleGeneratorControllerTest.java deleted file mode 100644 index c5b4a55dc..000000000 --- a/vid-app-common/src/test/java/org/onap/vid/controller/RoleGeneratorControllerTest.java +++ /dev/null @@ -1,79 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * VID - * ================================================================================ - * Copyright (C) 2017 - 2019 AT&T Intellectual Property. All rights reserved. - * Modifications Copyright 2019 Nokia - * ================================================================================ - * 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.vid.controller; - -import static org.mockito.BDDMockito.given; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -import org.apache.log4j.BasicConfigurator; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mock; -import org.mockito.runners.MockitoJUnitRunner; -import org.onap.vid.services.RoleGeneratorService; -import org.springframework.http.MediaType; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.setup.MockMvcBuilders; - -@RunWith(MockitoJUnitRunner.class) -public class RoleGeneratorControllerTest { - - private static final String PATH = "/generateRoleScript/{firstRun}"; - - private static final String FIRST_JSON = "{key1: val1}"; - private static final String SECOND_JSON = "{key2: val2}"; - - private RoleGeneratorController roleGeneratorController; - private MockMvc mockMvc; - - @Mock - private RoleGeneratorService service; - - @Before - public void setUp() { - roleGeneratorController = new RoleGeneratorController(service); - BasicConfigurator.configure(); - mockMvc = MockMvcBuilders.standaloneSetup(roleGeneratorController).build(); - - given(service.generateRoleScript(true)).willReturn(FIRST_JSON); - given(service.generateRoleScript(false)).willReturn(SECOND_JSON); - } - - @Test - public void generateRoleScript_shouldReturnJson_whenFirstRun() throws Exception { - mockMvc.perform(get(PATH, "true") - .contentType(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()) - .andExpect(content().json(FIRST_JSON)); - } - - @Test - public void generateRoleScript_shouldReturnJson_whenNoFirstRun() throws Exception { - mockMvc.perform(get(PATH, "false") - .contentType(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()) - .andExpect(content().json(SECOND_JSON)); - } -} diff --git a/vid-app-common/src/test/java/org/onap/vid/controller/VersionControllerTest.java b/vid-app-common/src/test/java/org/onap/vid/controller/VersionControllerTest.java deleted file mode 100644 index f92a26ea7..000000000 --- a/vid-app-common/src/test/java/org/onap/vid/controller/VersionControllerTest.java +++ /dev/null @@ -1,51 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * VID - * ================================================================================ - * Copyright (C) 2017 - 2019 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * 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.vid.controller; - -import org.testng.annotations.DataProvider; -import org.testng.annotations.Test; - -import static org.hamcrest.CoreMatchers.is; -import static org.junit.Assert.assertThat; - - -public class VersionControllerTest { - - @DataProvider - public static Object[][] majorVersionContainer() { - return new Object[][]{ - {"features.properties", "1.0.2000", "features.properties.2000"}, - {"", "1.0.2000", ".2000"}, - {"kuku", "1.0.2000", "kuku.2000"}, - {"/kuku", "1.0.2000", "kuku.2000"}, - {"1810p.features.properties", "1.0.2000", "1810p.2000"}, - {"/opt/app/dev.features.properties", "1.0.2000", "dev.2000"}, - {"foo", "2000", "foo.2000"}, - }; - } - - final VersionController versionController = new VersionController(null); - - @Test(dataProvider = "majorVersionContainer") - public void testGetDisplayVersion(String majorVersionContainer, String buildNumberContainer, String expected) { - assertThat(versionController.getDisplayVersion(majorVersionContainer, buildNumberContainer), is(expected)); - } -} diff --git a/vid-app-common/src/test/java/org/onap/vid/controller/open/HealthCheckControllerTest.java b/vid-app-common/src/test/java/org/onap/vid/controller/open/HealthCheckControllerTest.java new file mode 100644 index 000000000..76ee5617b --- /dev/null +++ b/vid-app-common/src/test/java/org/onap/vid/controller/open/HealthCheckControllerTest.java @@ -0,0 +1,122 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * Copyright (C) 2017 - 2019 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.vid.controller.open; + +import org.apache.log4j.BasicConfigurator; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnitRunner; +import org.onap.vid.controller.open.HealthCheckController; +import org.onap.vid.dao.FnAppDoaImpl; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; + +import java.sql.SQLException; + +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.BDDMockito.given; +import static org.springframework.http.HttpStatus.INTERNAL_SERVER_ERROR; +import static org.springframework.http.HttpStatus.OK; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@RunWith(MockitoJUnitRunner.class) +public class HealthCheckControllerTest { + + private static final String ERROR_MESSAGE = "error message"; + private HealthCheckController testSubject; + private MockMvc mockMvc; + + @Mock + private FnAppDoaImpl fnAppDoa; + + @Before + public void setUp() { + testSubject = new HealthCheckController(fnAppDoa); + BasicConfigurator.configure(); + mockMvc = MockMvcBuilders.standaloneSetup(testSubject).build(); + } + + @Test + public void getHealthCheckStatusForIDNS_shouldReturnSuccess_whenNoExceptionIsThrown() throws Exception { + databaseConnectionEstablished(); + mockMvc.perform(get("/healthCheck") + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.statusCode").value(OK.value())) + .andExpect(jsonPath("$.detailedMsg").value("health check succeeded")); + } + + @Test + public void getHealthCheckStatusForIDNS_shouldReturnErrorCode_whenExceptionIsThrown() throws Exception { + databaseNotAccessible(); + mockMvc.perform(get("/healthCheck") + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.statusCode").value(INTERNAL_SERVER_ERROR.value())) + .andExpect(jsonPath("$.detailedMsg").value("health check failed: " + ERROR_MESSAGE)); + } + + @Test + public void getHealthCheck_shouldReturnSuccess_whenNoExceptionIsThrown() throws Exception { + databaseConnectionEstablished(); + mockMvc.perform(get("/rest/healthCheck/{User-Agent}/{X-ECOMP-RequestID}", "userAgent", "requestId") + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.statusCode").value(OK.value())) + .andExpect(jsonPath("$.detailedMsg").value("health check succeeded")) + .andExpect(jsonPath("$.date").isString()); + } + + @Test + public void getHealthCheck_shouldReturnErrorCode_whenExceptionIsThrown() throws Exception { + databaseNotAccessible(); + mockMvc.perform(get("/rest/healthCheck/{User-Agent}/{X-ECOMP-RequestID}", "userAgent", "requestId") + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.statusCode").value(INTERNAL_SERVER_ERROR.value())) + .andExpect(jsonPath("$.detailedMsg").value("health check failed: " + ERROR_MESSAGE)); + } + + @Test + public void getCommitInfo_shouldReturnCommitData_whenCorrectPropertiesFileExists() throws Exception { + mockMvc.perform(get("/commitInfo") + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.commitId").value("123")) + .andExpect(jsonPath("$.commitMessageShort").value("Test short commit message")) + .andExpect(jsonPath("$.commitTime").value("1999-09-12T13:48:55+0200")); + } + + private void databaseConnectionEstablished() throws SQLException { + given(fnAppDoa.getProfileCount(anyString(), anyString(), anyString())) + .willReturn(0); + } + + private void databaseNotAccessible() throws SQLException { + given(fnAppDoa.getProfileCount(anyString(), anyString(), anyString())) + .willThrow(new SQLException(ERROR_MESSAGE)); + } +} diff --git a/vid-app-common/src/test/java/org/onap/vid/controller/open/MaintenanceControllerTest.java b/vid-app-common/src/test/java/org/onap/vid/controller/open/MaintenanceControllerTest.java new file mode 100644 index 000000000..3e78828f0 --- /dev/null +++ b/vid-app-common/src/test/java/org/onap/vid/controller/open/MaintenanceControllerTest.java @@ -0,0 +1,339 @@ +package org.onap.vid.controller.open; + +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * Copyright (C) 2017 - 2019 AT&T Intellectual Property. All rights reserved. + * Modifications Copyright (C) 2018 - 2019 Nokia. All rights reserved. + * ================================================================================ + * 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========================================================= + */ + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; +import org.apache.log4j.BasicConfigurator; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentMatcher; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnitRunner; +import org.onap.vid.category.AddCategoryOptionResponse; +import org.onap.vid.category.AddCategoryOptionsRequest; +import org.onap.vid.category.CategoryParameterOptionRep; +import org.onap.vid.category.CategoryParametersResponse; +import org.onap.vid.controller.open.MaintenanceController; +import org.onap.vid.model.CategoryParameter; +import org.onap.vid.model.CategoryParameterOption; +import org.onap.vid.services.CategoryParameterService; +import org.onap.vid.services.CategoryParameterServiceImpl; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.ResultActions; +import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; + +import javax.ws.rs.ForbiddenException; +import java.util.Collections; +import java.util.function.BiFunction; + +import static org.mockito.ArgumentMatchers.argThat; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.BDDMockito.*; +import static org.mockito.Mockito.times; +import static org.onap.vid.model.CategoryParameter.Family.PARAMETER_STANDARDIZATION; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@RunWith(MockitoJUnitRunner.class) +public class MaintenanceControllerTest { + + final private String MAINTENANCE_CATEGORY_PATH = "/maintenance/category_parameter"; + final private String CATEGORY_PARAMETER_PATH = MAINTENANCE_CATEGORY_PATH + "/{name}"; + final private String DELETE_CATEGORY_PATH = "/maintenance/delete_category_parameter/{name}"; + + @Mock + private CategoryParameterService service; + private MaintenanceController maintenanceController; + private MockMvc mockMvc; + private ObjectMapper objectMapper; + + @Before + public void setUp() { + maintenanceController = new MaintenanceController(service); + BasicConfigurator.configure(); + mockMvc = MockMvcBuilders.standaloneSetup(maintenanceController).build(); + objectMapper = new ObjectMapper(); + } + + @Test + public void addCategoryOptions_shouldReturnMultiStatus_whenErrorsExist() throws Exception { + String categoryName = "catName1"; + AddCategoryOptionsRequest req = new AddCategoryOptionsRequest(); + req.options = ImmutableList.of("first option", "second option"); + AddCategoryOptionResponse addCategoryOptionResponse = new AddCategoryOptionResponse( + ImmutableList.of("error one", "error two")); + + given(service.createCategoryParameterOptions(eq(categoryName), argThat(requestMatcher(req)))) + .willReturn(addCategoryOptionResponse); + + prepareRequestExpectations(MockMvcRequestBuilders::post, CATEGORY_PARAMETER_PATH, categoryName, + objectMapper.writeValueAsString(req)) + .andExpect(status().isMultiStatus()) + .andExpect( + content().json(objectMapper + .writeValueAsString(addCategoryOptionResponse))); + } + + @Test + public void addCategoryOptions_shouldReturnOk_whenNoErrorsExist() throws Exception { + String categoryName = "catName2"; + AddCategoryOptionsRequest req = new AddCategoryOptionsRequest(); + req.options = ImmutableList.of("first option", "second option", "third option"); + AddCategoryOptionResponse addCategoryOptionResponse = new AddCategoryOptionResponse(Collections.emptyList()); + + given(service.createCategoryParameterOptions(eq(categoryName), argThat(requestMatcher(req)))) + .willReturn(addCategoryOptionResponse); + prepareRequestExpectations(MockMvcRequestBuilders::post, CATEGORY_PARAMETER_PATH, categoryName, + objectMapper.writeValueAsString(req)) + .andExpect(status().isOk()) + .andExpect(content().json( + objectMapper.writeValueAsString(addCategoryOptionResponse))); + } + + @Test + public void addCategoryOptions_shouldReturnNotFound_whenUnfoundedCategoryExceptionIsThrown() throws Exception { + String unfoundedMsg = "unfounded category exception message"; + String categoryName = "catName3"; + AddCategoryOptionsRequest req = new AddCategoryOptionsRequest(); + req.options = ImmutableList.of("first option"); + + given(service.createCategoryParameterOptions(eq(categoryName), argThat(requestMatcher(req)))) + .willThrow(new CategoryParameterServiceImpl.UnfoundedCategoryException(unfoundedMsg)); + + prepareRequestExpectations(MockMvcRequestBuilders::post, CATEGORY_PARAMETER_PATH, categoryName, + objectMapper.writeValueAsString(req)) + .andExpect(status().isNotFound()) + .andExpect(content().json( + objectMapper.writeValueAsString(new AddCategoryOptionResponse(ImmutableList.of(unfoundedMsg))))); + } + + @Test + public void addCategoryOptions_shouldReturnInternalServerError_whenExceptionIsThrown() throws Exception { + String categoryName = "catName13"; + AddCategoryOptionsRequest req = new AddCategoryOptionsRequest(); + req.options = ImmutableList.of("option second", "first option"); + + given(service.createCategoryParameterOptions(eq(categoryName), argThat(requestMatcher(req)))) + .willThrow(new RuntimeException()); + + prepareRequestExpectations(MockMvcRequestBuilders::post, CATEGORY_PARAMETER_PATH, categoryName, + objectMapper.writeValueAsString(req)) + .andExpect(status().isInternalServerError()); + } + + @Test + public void updateNameForOption_shouldReturnMultiStatus_whenErrorsExist() throws Exception { + String categoryName = "catName4"; + CategoryParameterOptionRep categoryParameterOptionRep = new CategoryParameterOptionRep("id1", "name1"); + AddCategoryOptionResponse addCategoryOptionResponse = new AddCategoryOptionResponse( + ImmutableList.of("error one", "error two")); + + given(service + .updateCategoryParameterOption(eq(categoryName), argThat(requestMatcher(categoryParameterOptionRep)))) + .willReturn(addCategoryOptionResponse); + + prepareRequestExpectations(MockMvcRequestBuilders::put, CATEGORY_PARAMETER_PATH, categoryName, + objectMapper.writeValueAsString(categoryParameterOptionRep)) + .andExpect(status().isMultiStatus()) + .andExpect( + content().json(objectMapper + .writeValueAsString(addCategoryOptionResponse))); + } + + @Test + public void updateNameForOption_shouldReturnOk_whenNoErrorsExist() throws Exception { + String categoryName = "catName5"; + CategoryParameterOptionRep categoryParameterOptionRep = new CategoryParameterOptionRep("id2", "name2"); + AddCategoryOptionResponse addCategoryOptionResponse = new AddCategoryOptionResponse(Collections.emptyList()); + + given(service + .updateCategoryParameterOption(eq(categoryName), argThat(requestMatcher(categoryParameterOptionRep)))) + .willReturn(addCategoryOptionResponse); + prepareRequestExpectations(MockMvcRequestBuilders::put, CATEGORY_PARAMETER_PATH, categoryName, + objectMapper.writeValueAsString(categoryParameterOptionRep)) + .andExpect(status().isOk()) + .andExpect(content().json( + objectMapper.writeValueAsString(addCategoryOptionResponse))); + } + + @Test + public void updateNameForOption_shouldReturnForbidden_whenForbiddenExceptionIsThrown() throws Exception { + String categoryName = "catName6"; + CategoryParameterOptionRep categoryParameterOptionRep = new CategoryParameterOptionRep("id3", "name3"); + + given(service + .updateCategoryParameterOption(eq(categoryName), argThat(requestMatcher(categoryParameterOptionRep)))) + .willThrow(new ForbiddenException()); + prepareRequestExpectations(MockMvcRequestBuilders::put, CATEGORY_PARAMETER_PATH, categoryName, + objectMapper.writeValueAsString(categoryParameterOptionRep)) + .andExpect(status().isForbidden()) + .andExpect(content().json( + objectMapper + .writeValueAsString(new AddCategoryOptionResponse(ImmutableList.of("HTTP 403 Forbidden"))))); + } + + @Test + public void updateNameForOption_shouldReturnNotFound_whenUnfoundedIsThrown() throws Exception { + String unfoundedOptionMsg = "unfounded category option exception message"; + String categoryName = "catName7"; + CategoryParameterOptionRep categoryParameterOptionRep = new CategoryParameterOptionRep("id4", "name4"); + + given(service + .updateCategoryParameterOption(eq(categoryName), argThat(requestMatcher(categoryParameterOptionRep)))) + .willThrow(new CategoryParameterServiceImpl.UnfoundedCategoryOptionException(unfoundedOptionMsg)); + + prepareRequestExpectations(MockMvcRequestBuilders::put, CATEGORY_PARAMETER_PATH, categoryName, + objectMapper.writeValueAsString(categoryParameterOptionRep)) + .andExpect(status().isNotFound()) + .andExpect(content().json( + objectMapper.writeValueAsString(new AddCategoryOptionResponse(ImmutableList.of(unfoundedOptionMsg))))); + } + + @Test + public void updateNameForOption_shouldReturnConflict_whenAlreadyExistOptionNameIsThrown() throws Exception { + String conflictMsg = "already exists option name exception message"; + String categoryName = "catName8"; + CategoryParameterOptionRep categoryParameterOptionRep = new CategoryParameterOptionRep("id5", "name5"); + + given(service + .updateCategoryParameterOption(eq(categoryName), argThat(requestMatcher(categoryParameterOptionRep)))) + .willThrow(new CategoryParameterServiceImpl.AlreadyExistOptionNameException(conflictMsg)); + + prepareRequestExpectations(MockMvcRequestBuilders::put, CATEGORY_PARAMETER_PATH, categoryName, + objectMapper.writeValueAsString(categoryParameterOptionRep)) + .andExpect(status().isConflict()) + .andExpect(content().json( + objectMapper.writeValueAsString(new AddCategoryOptionResponse(ImmutableList.of(conflictMsg))))); + } + + @Test + public void updateNameForOption_shouldReturnInternalServerError_whenExceptionIsThrown() throws Exception { + String categoryName = "catName18"; + CategoryParameterOptionRep categoryParameterOptionRep = new CategoryParameterOptionRep("id6", "name6"); + + given(service + .updateCategoryParameterOption(eq(categoryName), argThat(requestMatcher(categoryParameterOptionRep)))) + .willThrow(new RuntimeException()); + + prepareRequestExpectations(MockMvcRequestBuilders::put, CATEGORY_PARAMETER_PATH, categoryName, + objectMapper.writeValueAsString(categoryParameterOptionRep)) + .andExpect(status().isInternalServerError()); + } + + @Test + public void getCategoryParameter_shouldReturnExistingMap() throws Exception { + CategoryParametersResponse categoryParametersResponse = + new CategoryParametersResponse( + ImmutableMap.of( + "key1", ImmutableList.of( + new CategoryParameterOptionRep("testId", "testName")))); + + given(service.getCategoryParameters(PARAMETER_STANDARDIZATION)) + .willReturn(categoryParametersResponse); + + mockMvc.perform(get(MAINTENANCE_CATEGORY_PATH) + .param("familyName", "PARAMETER_STANDARDIZATION") + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(content().json(objectMapper.writeValueAsString(categoryParametersResponse))); + } + + @Test + public void getCategoryParameter_shouldReturnInternalServerError_whenExceptionIsThrown() throws Exception { + given(service.getCategoryParameters(PARAMETER_STANDARDIZATION)) + .willThrow(new RuntimeException()); + + mockMvc.perform(get(MAINTENANCE_CATEGORY_PATH) + .param("familyName", "PARAMETER_STANDARDIZATION") + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isInternalServerError()); + } + + @Test + public void deleteCategoryOption_shouldReturnOk_whenNoExceptionIsThrown() throws Exception { + String categoryName = "catName9"; + CategoryParameterOption categoryParameterOption = new CategoryParameterOption("id1", "name1", + new CategoryParameter()); + + prepareRequestExpectations(MockMvcRequestBuilders::delete, DELETE_CATEGORY_PATH, categoryName, + objectMapper.writeValueAsString(categoryParameterOption)) + .andExpect(status().isOk()); + + then(service).should(times(1)) + .deleteCategoryOption(eq(categoryName), argThat(requestMatcher(categoryParameterOption))); + } + + @Test + public void deleteCategoryOption_shouldReturnNotFound_whenUnfoundedExceptionIsThrown() throws Exception { + String unfoundedMsg = "unfounded category exception message"; + String categoryName = "catName10"; + CategoryParameterOption categoryParameterOption = new CategoryParameterOption("id2", "name2", + new CategoryParameter()); + + willThrow(new CategoryParameterServiceImpl.UnfoundedCategoryException(unfoundedMsg)) + .given(service).deleteCategoryOption(eq(categoryName), argThat(requestMatcher(categoryParameterOption))); + + prepareRequestExpectations(MockMvcRequestBuilders::delete, DELETE_CATEGORY_PATH, categoryName, + objectMapper.writeValueAsString(categoryParameterOption)) + .andExpect(status().isNotFound()) + .andExpect(content().json( + objectMapper.writeValueAsString(new AddCategoryOptionResponse(ImmutableList.of(unfoundedMsg))))); + } + + @Test + public void deleteCategoryOption_shouldReturnInternalServerError_whenExceptionIsThrown() throws Exception { + String categoryName = "catName19"; + CategoryParameterOption categoryParameterOption = new CategoryParameterOption("id3", "name3", + new CategoryParameter()); + + willThrow(new RuntimeException()).given(service) + .deleteCategoryOption(eq(categoryName), argThat(requestMatcher(categoryParameterOption))); + + prepareRequestExpectations(MockMvcRequestBuilders::delete, DELETE_CATEGORY_PATH, categoryName, + objectMapper.writeValueAsString(categoryParameterOption)) + .andExpect(status().isInternalServerError()); + } + + private ArgumentMatcher requestMatcher(T t) { + return new ArgumentMatcher() { + @Override + public boolean matches(Object o) { + return t.equals(o); + } + }; + } + + private ResultActions prepareRequestExpectations( + BiFunction httpMethod, + String path, String name, String jsonContent) throws Exception { + return mockMvc.perform(httpMethod.apply(path, name) + .contentType(MediaType.APPLICATION_JSON) + .content(jsonContent)); + } +} diff --git a/vid-app-common/src/test/java/org/onap/vid/controller/open/RoleGeneratorControllerTest.java b/vid-app-common/src/test/java/org/onap/vid/controller/open/RoleGeneratorControllerTest.java new file mode 100644 index 000000000..c1509d956 --- /dev/null +++ b/vid-app-common/src/test/java/org/onap/vid/controller/open/RoleGeneratorControllerTest.java @@ -0,0 +1,80 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * Copyright (C) 2017 - 2019 AT&T Intellectual Property. All rights reserved. + * Modifications Copyright 2019 Nokia + * ================================================================================ + * 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.vid.controller.open; + +import static org.mockito.BDDMockito.given; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import org.apache.log4j.BasicConfigurator; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.runners.MockitoJUnitRunner; +import org.onap.vid.controller.open.RoleGeneratorController; +import org.onap.vid.services.RoleGeneratorService; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; + +@RunWith(MockitoJUnitRunner.class) +public class RoleGeneratorControllerTest { + + private static final String PATH = "/generateRoleScript/{firstRun}"; + + private static final String FIRST_JSON = "{key1: val1}"; + private static final String SECOND_JSON = "{key2: val2}"; + + private RoleGeneratorController roleGeneratorController; + private MockMvc mockMvc; + + @Mock + private RoleGeneratorService service; + + @Before + public void setUp() { + roleGeneratorController = new RoleGeneratorController(service); + BasicConfigurator.configure(); + mockMvc = MockMvcBuilders.standaloneSetup(roleGeneratorController).build(); + + given(service.generateRoleScript(true)).willReturn(FIRST_JSON); + given(service.generateRoleScript(false)).willReturn(SECOND_JSON); + } + + @Test + public void generateRoleScript_shouldReturnJson_whenFirstRun() throws Exception { + mockMvc.perform(get(PATH, "true") + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(content().json(FIRST_JSON)); + } + + @Test + public void generateRoleScript_shouldReturnJson_whenNoFirstRun() throws Exception { + mockMvc.perform(get(PATH, "false") + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(content().json(SECOND_JSON)); + } +} diff --git a/vid-app-common/src/test/java/org/onap/vid/controller/open/VersionControllerTest.java b/vid-app-common/src/test/java/org/onap/vid/controller/open/VersionControllerTest.java new file mode 100644 index 000000000..835ea4a66 --- /dev/null +++ b/vid-app-common/src/test/java/org/onap/vid/controller/open/VersionControllerTest.java @@ -0,0 +1,52 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * Copyright (C) 2017 - 2019 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.vid.controller.open; + +import org.onap.vid.controller.open.VersionController; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; + +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertThat; + + +public class VersionControllerTest { + + @DataProvider + public static Object[][] majorVersionContainer() { + return new Object[][]{ + {"features.properties", "1.0.2000", "features.properties.2000"}, + {"", "1.0.2000", ".2000"}, + {"kuku", "1.0.2000", "kuku.2000"}, + {"/kuku", "1.0.2000", "kuku.2000"}, + {"1810p.features.properties", "1.0.2000", "1810p.2000"}, + {"/opt/app/dev.features.properties", "1.0.2000", "dev.2000"}, + {"foo", "2000", "foo.2000"}, + }; + } + + final VersionController versionController = new VersionController(null); + + @Test(dataProvider = "majorVersionContainer") + public void testGetDisplayVersion(String majorVersionContainer, String buildNumberContainer, String expected) { + assertThat(versionController.getDisplayVersion(majorVersionContainer, buildNumberContainer), is(expected)); + } +} -- cgit 1.2.3-korg