From 43f3322089f1dcc1f7d35f20c7dd742a515c7fc1 Mon Sep 17 00:00:00 2001
From: Piotr Gawron <piotr.gawron@uni.lu>
Date: Wed, 5 Jun 2019 18:37:09 +0200
Subject: [PATCH] proper status code is returned when trying to update
 configuration option with invalid data

---
 .../ConfigurationController.java              |  2 +-
 .../configuration/AllConfigurationTests.java  |  4 +-
 .../ConfigurationControllerTest.java          | 56 +++++++++++++++++++
 .../services/impl/ConfigurationService.java   |  1 +
 4 files changed, 61 insertions(+), 2 deletions(-)
 create mode 100644 rest-api/src/test/java/lcsb/mapviewer/api/configuration/ConfigurationControllerTest.java

diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/configuration/ConfigurationController.java b/rest-api/src/main/java/lcsb/mapviewer/api/configuration/ConfigurationController.java
index e9a8bf9d2f..949e03b593 100644
--- a/rest-api/src/main/java/lcsb/mapviewer/api/configuration/ConfigurationController.java
+++ b/rest-api/src/main/java/lcsb/mapviewer/api/configuration/ConfigurationController.java
@@ -73,7 +73,7 @@ public class ConfigurationController extends BaseController {
 
   @RequestMapping(value = "/configuration/options/{option}", method = { RequestMethod.PATCH }, produces = {
       MediaType.APPLICATION_JSON_VALUE })
-  public Map<String, Object> getOption(
+  public Map<String, Object> updateOption(
       @RequestBody String body,
       @CookieValue(value = Configuration.AUTH_TOKEN) String token,
       @PathVariable(value = "option") String option
diff --git a/rest-api/src/test/java/lcsb/mapviewer/api/configuration/AllConfigurationTests.java b/rest-api/src/test/java/lcsb/mapviewer/api/configuration/AllConfigurationTests.java
index 14956fb65e..1a95c60136 100644
--- a/rest-api/src/test/java/lcsb/mapviewer/api/configuration/AllConfigurationTests.java
+++ b/rest-api/src/test/java/lcsb/mapviewer/api/configuration/AllConfigurationTests.java
@@ -5,7 +5,9 @@ import org.junit.runners.Suite;
 import org.junit.runners.Suite.SuiteClasses;
 
 @RunWith(Suite.class)
-@SuiteClasses({ ConfigurationRestImplTest.class })
+@SuiteClasses({
+    ConfigurationControllerTest.class,
+    ConfigurationRestImplTest.class })
 public class AllConfigurationTests {
 
 }
diff --git a/rest-api/src/test/java/lcsb/mapviewer/api/configuration/ConfigurationControllerTest.java b/rest-api/src/test/java/lcsb/mapviewer/api/configuration/ConfigurationControllerTest.java
new file mode 100644
index 0000000000..40eee3082b
--- /dev/null
+++ b/rest-api/src/test/java/lcsb/mapviewer/api/configuration/ConfigurationControllerTest.java
@@ -0,0 +1,56 @@
+package lcsb.mapviewer.api.configuration;
+
+import static org.junit.Assert.fail;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.test.context.web.WebAppConfiguration;
+
+import com.google.gson.Gson;
+
+import lcsb.mapviewer.api.QueryException;
+import lcsb.mapviewer.api.SpringRestApiTestConfig;
+import lcsb.mapviewer.model.user.ConfigurationElementType;
+import lcsb.mapviewer.services.interfaces.IUserService;
+
+@ContextConfiguration(classes = SpringRestApiTestConfig.class)
+@WebAppConfiguration
+@RunWith(SpringJUnit4ClassRunner.class)
+public class ConfigurationControllerTest {
+  
+  @Autowired
+  ConfigurationController configurationController;
+  
+  @Autowired
+  IUserService userService;
+
+  @Test
+  public void testSetSmtpPortToInvalid() throws Exception {
+    try {
+      // assume that we have admin account with all the privileges
+      String adminToken = userService.login("admin", "admin");
+      
+      Map<String, Object> option= new HashMap<>();
+      option.put("value", "not a number");
+      option.put("type", "not a number");
+      Map<String, Object> data= new HashMap<>();
+      data.put("option", option);
+      
+      String body = new Gson().toJson(data);
+      configurationController.updateOption(body, adminToken, ConfigurationElementType.MAX_NUMBER_OF_MAP_LEVELS.name());
+      fail("Exception expected");
+    } catch (QueryException e) {
+    } catch (Exception e) {
+      e.printStackTrace();
+      throw e;
+    }
+  }
+
+
+}
diff --git a/service/src/main/java/lcsb/mapviewer/services/impl/ConfigurationService.java b/service/src/main/java/lcsb/mapviewer/services/impl/ConfigurationService.java
index 14141d92d1..336ddc20c7 100644
--- a/service/src/main/java/lcsb/mapviewer/services/impl/ConfigurationService.java
+++ b/service/src/main/java/lcsb/mapviewer/services/impl/ConfigurationService.java
@@ -65,6 +65,7 @@ public class ConfigurationService implements IConfigurationService {
   }
 
   @Override
+  @Transactional(noRollbackFor = InvalidArgumentException.class)
   public void setConfigurationValue(ConfigurationElementType type, String value) {
     if (value == null) {
       throw new InvalidArgumentException("null is not a proper value");
-- 
GitLab