]> source.dussan.org Git - sonarqube.git/commitdiff
Sanitize ShowActionTest
authorJulien Lancelot <julien.lancelot@sonarsource.com>
Fri, 6 Jul 2018 09:50:01 +0000 (11:50 +0200)
committerSonarTech <sonartech@sonarsource.com>
Wed, 11 Jul 2018 18:21:22 +0000 (20:21 +0200)
23 files changed:
server/sonar-server/src/main/java/org/sonar/server/rule/ws/CreateAction.java
server/sonar-server/src/main/java/org/sonar/server/rule/ws/RepositoriesAction.java
server/sonar-server/src/main/java/org/sonar/server/rule/ws/ShowAction.java
server/sonar-server/src/main/java/org/sonar/server/rule/ws/TagsAction.java
server/sonar-server/src/main/java/org/sonar/server/rule/ws/UpdateAction.java
server/sonar-server/src/main/resources/org/sonar/server/rule/ws/create-example.json [new file with mode: 0644]
server/sonar-server/src/main/resources/org/sonar/server/rule/ws/example-create.json [deleted file]
server/sonar-server/src/main/resources/org/sonar/server/rule/ws/example-repositories.json [deleted file]
server/sonar-server/src/main/resources/org/sonar/server/rule/ws/example-show.json [deleted file]
server/sonar-server/src/main/resources/org/sonar/server/rule/ws/example-tags.json [deleted file]
server/sonar-server/src/main/resources/org/sonar/server/rule/ws/example-update.json [deleted file]
server/sonar-server/src/main/resources/org/sonar/server/rule/ws/repositories-example.json [new file with mode: 0644]
server/sonar-server/src/main/resources/org/sonar/server/rule/ws/show-example.json [new file with mode: 0644]
server/sonar-server/src/main/resources/org/sonar/server/rule/ws/tags-example.json [new file with mode: 0644]
server/sonar-server/src/main/resources/org/sonar/server/rule/ws/update-example.json [new file with mode: 0644]
server/sonar-server/src/test/java/org/sonar/server/rule/ws/ShowActionTest.java
server/sonar-server/src/test/resources/org/sonar/server/rule/ws/ShowActionTest/show_deprecated_rule_rem_function_fields.json [deleted file]
server/sonar-server/src/test/resources/org/sonar/server/rule/ws/ShowActionTest/show_rule.json [deleted file]
server/sonar-server/src/test/resources/org/sonar/server/rule/ws/ShowActionTest/show_rule_when_activated.json [deleted file]
server/sonar-server/src/test/resources/org/sonar/server/rule/ws/ShowActionTest/show_rule_with_default_and_overridden_debt_infos.json [deleted file]
server/sonar-server/src/test/resources/org/sonar/server/rule/ws/ShowActionTest/show_rule_with_default_debt_infos.json [deleted file]
server/sonar-server/src/test/resources/org/sonar/server/rule/ws/ShowActionTest/show_rule_with_no_default_and_no_overridden_debt.json [deleted file]
server/sonar-server/src/test/resources/org/sonar/server/rule/ws/ShowActionTest/show_rule_with_overridden_debt_infos.json [deleted file]

index 2fdde1ed1e8c9f784b9f8cc4f23f0317e293f221..a93a4766f5d9690a4c5f21e2c75d03d22af6b36a 100644 (file)
@@ -82,7 +82,7 @@ public class CreateAction implements RulesWsAction {
       .setPost(true)
       .setDescription("Create a custom rule.<br>" +
         "Requires the 'Administer Quality Profiles' permission")
-      .setResponseExample(Resources.getResource(getClass(), "example-create.json"))
+      .setResponseExample(Resources.getResource(getClass(), "create-example.json"))
       .setSince("4.4")
       .setChangelog(
         new Change("5.5", "Creating manual rule is not more possible"))
index f01b749aebfd9c6b8dcc447a3ab913ffc4e745be..f628f7e34be55c8ab481b0aace37beb4602eb3f5 100644 (file)
@@ -56,7 +56,7 @@ public class RepositoriesAction implements RulesWsAction {
       .setDescription("List available rule repositories")
       .setSince("4.5")
       .setHandler(this)
-      .setResponseExample(Resources.getResource(getClass(), "example-repositories.json"));
+      .setResponseExample(Resources.getResource(getClass(), "repositories-example.json"));
 
     action.createParam(Param.TEXT_QUERY)
       .setDescription("A pattern to match repository keys/names against")
index 0b1faf67fd0ec1233e3055a59e5bfeac0ca52950..bd374a495f772a10963f17ede4efaea5a5364478 100644 (file)
@@ -76,7 +76,7 @@ public class ShowAction implements RulesWsAction {
         "</ul>" +
         "In 7.1, the field 'scope' has been added.")
       .setSince("4.2")
-      .setResponseExample(Resources.getResource(getClass(), "example-show.json"))
+      .setResponseExample(Resources.getResource(getClass(), "show-example.json"))
       .setHandler(this);
 
     action
index 2ca5812c6d7d0939d330f306af267095a5e604b4..ed2d917ee4d7f9ec539b2587ad55f50cc7bcddb1 100644 (file)
@@ -57,7 +57,7 @@ public class TagsAction implements RulesWsAction {
       .setDescription("List rule tags")
       .setSince("4.4")
       .setHandler(this)
-      .setResponseExample(Resources.getResource(getClass(), "example-tags.json"));
+      .setResponseExample(Resources.getResource(getClass(), "tags-example.json"));
 
     action.createSearchQuery("misra", "tags");
     action.createPageSize(10, 100);
index 76f9d51a19e598b6db05d339ecbef9c1c94c615e..4325ff8e6dc61ae38cc064311fb0da17bd1f1f90 100644 (file)
@@ -93,7 +93,7 @@ public class UpdateAction implements RulesWsAction {
     WebService.NewAction action = controller
       .createAction("update")
       .setPost(true)
-      .setResponseExample(Resources.getResource(getClass(), "example-update.json"))
+      .setResponseExample(Resources.getResource(getClass(), "update-example.json"))
       .setDescription("Update an existing rule.<br>" +
         "Requires the 'Administer Quality Profiles' permission")
       .setSince("4.4")
diff --git a/server/sonar-server/src/main/resources/org/sonar/server/rule/ws/create-example.json b/server/sonar-server/src/main/resources/org/sonar/server/rule/ws/create-example.json
new file mode 100644 (file)
index 0000000..7fab5a0
--- /dev/null
@@ -0,0 +1,28 @@
+{
+  "rule":{
+    "key":"squid:forbidSonar",
+    "repo":"squid",
+    "name":"forbidSonar",
+    "createdAt":"2018-06-06T16:04:28+0200",
+    "htmlDesc":"Forbid classes with name starting with Sonar",
+    "mdDesc":"Forbid classes with name starting with Sonar",
+    "severity":"MAJOR",
+    "status":"READY",
+    "isTemplate":false,
+    "templateKey":"squid:S3688",
+    "sysTags":[],
+    "lang":"java",
+    "langName":"Java",
+    "params":[
+    {
+      "key":"className",
+      "htmlDesc":"Fully qualified name of the forbidden class. Use a regex to forbid a package.",
+      "defaultValue":"**/Sonar*",
+      "type":"STRING"
+    }
+    ],
+    "scope":"MAIN",
+    "isExternal":false,
+    "type":"CODE_SMELL"
+  }
+}
\ No newline at end of file
diff --git a/server/sonar-server/src/main/resources/org/sonar/server/rule/ws/example-create.json b/server/sonar-server/src/main/resources/org/sonar/server/rule/ws/example-create.json
deleted file mode 100644 (file)
index 7fab5a0..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-{
-  "rule":{
-    "key":"squid:forbidSonar",
-    "repo":"squid",
-    "name":"forbidSonar",
-    "createdAt":"2018-06-06T16:04:28+0200",
-    "htmlDesc":"Forbid classes with name starting with Sonar",
-    "mdDesc":"Forbid classes with name starting with Sonar",
-    "severity":"MAJOR",
-    "status":"READY",
-    "isTemplate":false,
-    "templateKey":"squid:S3688",
-    "sysTags":[],
-    "lang":"java",
-    "langName":"Java",
-    "params":[
-    {
-      "key":"className",
-      "htmlDesc":"Fully qualified name of the forbidden class. Use a regex to forbid a package.",
-      "defaultValue":"**/Sonar*",
-      "type":"STRING"
-    }
-    ],
-    "scope":"MAIN",
-    "isExternal":false,
-    "type":"CODE_SMELL"
-  }
-}
\ No newline at end of file
diff --git a/server/sonar-server/src/main/resources/org/sonar/server/rule/ws/example-repositories.json b/server/sonar-server/src/main/resources/org/sonar/server/rule/ws/example-repositories.json
deleted file mode 100644 (file)
index e73c411..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-{
-  "repositories": [
-    {"key": "clirr", "name": "Clirr", "language": "java"},
-    {"key": "common-c", "name": "Common SonarQube", "language": "c"},
-    {"key": "common-cpp", "name": "Common SonarQube", "language": "cpp"},
-    {"key": "common-cs", "name": "Common SonarQube", "language": "cs"},
-    {"key": "common-java", "name": "Common SonarQube", "language": "java"},
-    {"key": "common-js", "name": "Common SonarQube", "language": "js"},
-    {"key": "common-objc", "name": "Common SonarQube", "language": "objc"},
-    {"key": "common-php", "name": "Common SonarQube", "language": "php"},
-    {"key": "c-cppcheck", "name": "Cppcheck", "language": "c"},
-    {"key": "cpp-cppcheck", "name": "Cppcheck", "language": "cpp"},
-    {"key": "fb-contrib", "name": "fb-contrib", "language": "java"},
-    {"key": "findbugs", "name": "FindBugs", "language": "java"},
-    {"key": "fxcop", "name": "FxCop / Code Analysis", "language": "cs"},
-    {"key": "resharper-cs", "name": "ReSharper", "language": "cs"},
-    {"key": "resharper-vbnet", "name": "ReSharper", "language": "vbnet"},
-    {"key": "c", "name": "SonarQube", "language": "c"},
-    {"key": "cpp", "name": "SonarQube", "language": "cpp"},
-    {"key": "csharpsquid", "name": "SonarQube", "language": "cs"},
-    {"key": "javascript", "name": "SonarQube", "language": "js"},
-    {"key": "objc", "name": "SonarQube", "language": "objc"},
-    {"key": "php", "name": "SonarQube", "language": "php"},
-    {"key": "squid", "name": "SonarQube", "language": "java"},
-    {"key": "stylecop", "name": "StyleCop", "language": "cs"}
-  ]
-}
diff --git a/server/sonar-server/src/main/resources/org/sonar/server/rule/ws/example-show.json b/server/sonar-server/src/main/resources/org/sonar/server/rule/ws/example-show.json
deleted file mode 100644 (file)
index 8664d15..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-{"rule": {
-    "key": "squid:ClassCyclomaticComplexity",
-    "repo": "squid",
-    "name": "Avoid too complex class",
-    "htmlDesc": "<p>The Cyclomatic Complexity is measured by the number of (&&, ||)\n\toperators and (if, while, do, for, ?:, catch, switch, case, return,\n\tthrow) statements in the body of a class plus one for each constructor,\n\tmethod (but not getter/setter), static initializer, or instance\n\tinitializer in the class. The last return stament in method, if exists,\n\tis not taken into account.</p>\n<p>\n\tEven when the Cyclomatic Complexity of a class is very high, this\n\tcomplexity might be well distributed among all methods. Nevertheless,\n\tmost of the time, a very complex class is a class which breaks the <a\n\t\thref='http://en.wikipedia.org/wiki/Single_responsibility_principle'>Single\n\t\tResponsibility Principle</a> and which should be re-factored to be split\n\tin several classes.\n</p>",
-    "severity": "MAJOR",
-    "status": "READY",
-    "internalKey": "ClassCyclomaticComplexity",
-    "template": false,
-    "tags": [],
-    "sysTags": ["brain-overload"],
-    "remFnType": "LINEAR_OFFSET",
-    "remFnGapMultiplier": "5d",
-    "remFnBaseEffort": "10h",
-    "defaultRemFnType": "LINEAR_OFFSET",
-    "defaultRemFnGapMultiplier": "6d",
-    "defaultRemFnBaseEffort": "11h",
-    "remFnOverloaded": true,
-    "gapDescription": "java.S001.effortToFix",
-    "lang": "java",
-    "langName": "Java",
-    "scope": "MAIN",
-    "isExternal": false,
-    "type": "CODE_SMELL",
-    "params": [
-        {
-            "key": "max",
-            "desc": "Maximum complexity allowed.",
-            "defaultValue": "200"
-        }
-    ]
-}, "actives": [
-    {
-        "qProfile": "Sonar way with Findbugs:java",
-        "inherit": "NONE",
-        "severity": "MAJOR",
-        "params": [
-            {
-                "key": "max",
-                "value": "200"
-            }
-        ]
-    },
-    {
-        "qProfile": "Sonar way:java",
-        "inherit": "NONE",
-        "severity": "MAJOR",
-        "params": [
-            {
-                "key": "max",
-                "value": "200"
-            }
-        ]
-    }
-]}
diff --git a/server/sonar-server/src/main/resources/org/sonar/server/rule/ws/example-tags.json b/server/sonar-server/src/main/resources/org/sonar/server/rule/ws/example-tags.json
deleted file mode 100644 (file)
index a6e6ea9..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-{
-  "tags": [
-    "java8",
-    "performance",
-    "security"
-  ]
-}
diff --git a/server/sonar-server/src/main/resources/org/sonar/server/rule/ws/example-update.json b/server/sonar-server/src/main/resources/org/sonar/server/rule/ws/example-update.json
deleted file mode 100644 (file)
index 1b8d109..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-{
-  "rule":{
-    "key":"squid:forbidSonar",
-    "repo":"squid",
-    "name":"forbidSonar",
-    "createdAt":"2018-06-06T16:09:09+0200",
-    "htmlDesc":"Forbid classes with name starting with Sonar",
-    "mdDesc":"Forbid classes with name starting with Sonar",
-    "severity":"MAJOR",
-    "status":"READY",
-    "isTemplate":false,
-    "templateKey":"squid:S3688",
-    "tags":[],
-    "sysTags":[],
-    "lang":"java",
-    "langName":"Java",
-    "params":[
-    {
-      "key":"className",
-      "htmlDesc":"Fully qualified name of the forbidden class. Use a regex to forbid a package.",
-      "defaultValue":"**/Sonar*","type":"STRING"
-    }
-    ],
-    "debtOverloaded":false,
-    "remFnOverloaded":false,
-    "scope":"MAIN",
-    "isExternal":false,
-    "type":"CODE_SMELL"
-  }
-}
\ No newline at end of file
diff --git a/server/sonar-server/src/main/resources/org/sonar/server/rule/ws/repositories-example.json b/server/sonar-server/src/main/resources/org/sonar/server/rule/ws/repositories-example.json
new file mode 100644 (file)
index 0000000..e73c411
--- /dev/null
@@ -0,0 +1,27 @@
+{
+  "repositories": [
+    {"key": "clirr", "name": "Clirr", "language": "java"},
+    {"key": "common-c", "name": "Common SonarQube", "language": "c"},
+    {"key": "common-cpp", "name": "Common SonarQube", "language": "cpp"},
+    {"key": "common-cs", "name": "Common SonarQube", "language": "cs"},
+    {"key": "common-java", "name": "Common SonarQube", "language": "java"},
+    {"key": "common-js", "name": "Common SonarQube", "language": "js"},
+    {"key": "common-objc", "name": "Common SonarQube", "language": "objc"},
+    {"key": "common-php", "name": "Common SonarQube", "language": "php"},
+    {"key": "c-cppcheck", "name": "Cppcheck", "language": "c"},
+    {"key": "cpp-cppcheck", "name": "Cppcheck", "language": "cpp"},
+    {"key": "fb-contrib", "name": "fb-contrib", "language": "java"},
+    {"key": "findbugs", "name": "FindBugs", "language": "java"},
+    {"key": "fxcop", "name": "FxCop / Code Analysis", "language": "cs"},
+    {"key": "resharper-cs", "name": "ReSharper", "language": "cs"},
+    {"key": "resharper-vbnet", "name": "ReSharper", "language": "vbnet"},
+    {"key": "c", "name": "SonarQube", "language": "c"},
+    {"key": "cpp", "name": "SonarQube", "language": "cpp"},
+    {"key": "csharpsquid", "name": "SonarQube", "language": "cs"},
+    {"key": "javascript", "name": "SonarQube", "language": "js"},
+    {"key": "objc", "name": "SonarQube", "language": "objc"},
+    {"key": "php", "name": "SonarQube", "language": "php"},
+    {"key": "squid", "name": "SonarQube", "language": "java"},
+    {"key": "stylecop", "name": "StyleCop", "language": "cs"}
+  ]
+}
diff --git a/server/sonar-server/src/main/resources/org/sonar/server/rule/ws/show-example.json b/server/sonar-server/src/main/resources/org/sonar/server/rule/ws/show-example.json
new file mode 100644 (file)
index 0000000..8664d15
--- /dev/null
@@ -0,0 +1,55 @@
+{"rule": {
+    "key": "squid:ClassCyclomaticComplexity",
+    "repo": "squid",
+    "name": "Avoid too complex class",
+    "htmlDesc": "<p>The Cyclomatic Complexity is measured by the number of (&&, ||)\n\toperators and (if, while, do, for, ?:, catch, switch, case, return,\n\tthrow) statements in the body of a class plus one for each constructor,\n\tmethod (but not getter/setter), static initializer, or instance\n\tinitializer in the class. The last return stament in method, if exists,\n\tis not taken into account.</p>\n<p>\n\tEven when the Cyclomatic Complexity of a class is very high, this\n\tcomplexity might be well distributed among all methods. Nevertheless,\n\tmost of the time, a very complex class is a class which breaks the <a\n\t\thref='http://en.wikipedia.org/wiki/Single_responsibility_principle'>Single\n\t\tResponsibility Principle</a> and which should be re-factored to be split\n\tin several classes.\n</p>",
+    "severity": "MAJOR",
+    "status": "READY",
+    "internalKey": "ClassCyclomaticComplexity",
+    "template": false,
+    "tags": [],
+    "sysTags": ["brain-overload"],
+    "remFnType": "LINEAR_OFFSET",
+    "remFnGapMultiplier": "5d",
+    "remFnBaseEffort": "10h",
+    "defaultRemFnType": "LINEAR_OFFSET",
+    "defaultRemFnGapMultiplier": "6d",
+    "defaultRemFnBaseEffort": "11h",
+    "remFnOverloaded": true,
+    "gapDescription": "java.S001.effortToFix",
+    "lang": "java",
+    "langName": "Java",
+    "scope": "MAIN",
+    "isExternal": false,
+    "type": "CODE_SMELL",
+    "params": [
+        {
+            "key": "max",
+            "desc": "Maximum complexity allowed.",
+            "defaultValue": "200"
+        }
+    ]
+}, "actives": [
+    {
+        "qProfile": "Sonar way with Findbugs:java",
+        "inherit": "NONE",
+        "severity": "MAJOR",
+        "params": [
+            {
+                "key": "max",
+                "value": "200"
+            }
+        ]
+    },
+    {
+        "qProfile": "Sonar way:java",
+        "inherit": "NONE",
+        "severity": "MAJOR",
+        "params": [
+            {
+                "key": "max",
+                "value": "200"
+            }
+        ]
+    }
+]}
diff --git a/server/sonar-server/src/main/resources/org/sonar/server/rule/ws/tags-example.json b/server/sonar-server/src/main/resources/org/sonar/server/rule/ws/tags-example.json
new file mode 100644 (file)
index 0000000..a6e6ea9
--- /dev/null
@@ -0,0 +1,7 @@
+{
+  "tags": [
+    "java8",
+    "performance",
+    "security"
+  ]
+}
diff --git a/server/sonar-server/src/main/resources/org/sonar/server/rule/ws/update-example.json b/server/sonar-server/src/main/resources/org/sonar/server/rule/ws/update-example.json
new file mode 100644 (file)
index 0000000..1b8d109
--- /dev/null
@@ -0,0 +1,30 @@
+{
+  "rule":{
+    "key":"squid:forbidSonar",
+    "repo":"squid",
+    "name":"forbidSonar",
+    "createdAt":"2018-06-06T16:09:09+0200",
+    "htmlDesc":"Forbid classes with name starting with Sonar",
+    "mdDesc":"Forbid classes with name starting with Sonar",
+    "severity":"MAJOR",
+    "status":"READY",
+    "isTemplate":false,
+    "templateKey":"squid:S3688",
+    "tags":[],
+    "sysTags":[],
+    "lang":"java",
+    "langName":"Java",
+    "params":[
+    {
+      "key":"className",
+      "htmlDesc":"Fully qualified name of the forbidden class. Use a regex to forbid a package.",
+      "defaultValue":"**/Sonar*","type":"STRING"
+    }
+    ],
+    "debtOverloaded":false,
+    "remFnOverloaded":false,
+    "scope":"MAIN",
+    "isExternal":false,
+    "type":"CODE_SMELL"
+  }
+}
\ No newline at end of file
index eda926b60dc23dc9dc1c9829b7bf68eeb384badb..3b860357eebd087cd5fdb9bba533fb86a386b476 100644 (file)
  */
 package org.sonar.server.rule.ws;
 
-import java.util.Date;
 import java.util.List;
-import java.util.function.Consumer;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.rules.ExpectedException;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Mockito;
 import org.sonar.api.resources.Languages;
 import org.sonar.api.rule.RuleKey;
-import org.sonar.api.rule.RuleStatus;
-import org.sonar.api.rules.RuleType;
-import org.sonar.api.utils.System2;
-import org.sonar.db.DbClient;
-import org.sonar.db.DbSession;
+import org.sonar.api.server.ws.WebService;
 import org.sonar.db.DbTester;
 import org.sonar.db.organization.OrganizationDto;
 import org.sonar.db.qualityprofile.ActiveRuleDto;
 import org.sonar.db.qualityprofile.ActiveRuleParamDto;
 import org.sonar.db.qualityprofile.QProfileDto;
-import org.sonar.db.rule.RuleDao;
 import org.sonar.db.rule.RuleDefinitionDto;
 import org.sonar.db.rule.RuleDto;
-import org.sonar.db.rule.RuleDto.Format;
-import org.sonar.db.rule.RuleDto.Scope;
 import org.sonar.db.rule.RuleMetadataDto;
 import org.sonar.db.rule.RuleParamDto;
-import org.sonar.db.rule.RuleTesting;
 import org.sonar.db.user.UserDto;
-import org.sonar.server.es.EsClient;
-import org.sonar.server.es.EsTester;
-import org.sonar.server.es.StartupIndexer;
 import org.sonar.server.exceptions.NotFoundException;
-import org.sonar.server.language.LanguageTesting;
-import org.sonar.server.organization.DefaultOrganizationProvider;
 import org.sonar.server.organization.TestDefaultOrganizationProvider;
-import org.sonar.server.qualityprofile.QProfileTesting;
-import org.sonar.server.qualityprofile.index.ActiveRuleIndexer;
-import org.sonar.server.rule.NewCustomRule;
-import org.sonar.server.rule.RuleCreator;
-import org.sonar.server.rule.index.RuleIndexer;
 import org.sonar.server.tester.UserSessionRule;
 import org.sonar.server.text.MacroInterpreter;
-import org.sonar.server.util.TypeValidations;
-import org.sonar.server.ws.TestResponse;
-import org.sonar.server.ws.WsAction;
 import org.sonar.server.ws.WsActionTester;
 import org.sonarqube.ws.Rules;
 import org.sonarqube.ws.Rules.Rule;
+import org.sonarqube.ws.Rules.ShowResponse;
 
-import static com.google.common.collect.Sets.newHashSet;
-import static java.util.Arrays.asList;
-import static java.util.Collections.singletonList;
-import static org.apache.commons.lang.RandomStringUtils.randomAlphanumeric;
 import static org.assertj.core.api.Assertions.assertThat;
-import static org.mockito.ArgumentMatchers.any;
+import static org.assertj.core.api.Assertions.tuple;
 import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
-import static org.sonar.api.rule.Severity.MINOR;
+import static org.mockito.Mockito.verify;
+import static org.sonar.db.rule.RuleDto.Format.MARKDOWN;
+import static org.sonar.db.rule.RuleTesting.newCustomRule;
+import static org.sonar.db.rule.RuleTesting.newTemplateRule;
 import static org.sonar.db.rule.RuleTesting.setTags;
+import static org.sonar.server.language.LanguageTesting.newLanguage;
+import static org.sonar.server.rule.ws.ShowAction.PARAM_ACTIVES;
 import static org.sonar.server.rule.ws.ShowAction.PARAM_KEY;
 import static org.sonar.server.rule.ws.ShowAction.PARAM_ORGANIZATION;
-import static org.sonarqube.ws.MediaTypes.PROTOBUF;
 
 public class ShowActionTest {
 
@@ -93,22 +69,15 @@ public class ShowActionTest {
   @org.junit.Rule
   public DbTester db = DbTester.create();
   @org.junit.Rule
-  public EsTester es = EsTester.create();
-  @org.junit.Rule
   public ExpectedException thrown = ExpectedException.none();
 
-  private DbClient dbClient = db.getDbClient();
-  private EsClient esClient = es.client();
-
-  private DefaultOrganizationProvider defaultOrganizationProvider = TestDefaultOrganizationProvider.from(db);
   private MacroInterpreter macroInterpreter = mock(MacroInterpreter.class);
-  private Languages languages = new Languages(LanguageTesting.newLanguage("xoo", "Xoo"));
-  private RuleMapper mapper = new RuleMapper(languages, macroInterpreter);
-  private ActiveRuleCompleter activeRuleCompleter = mock(ActiveRuleCompleter.class);
-  private WsAction underTest = new ShowAction(dbClient, mapper, activeRuleCompleter, new RuleWsSupport(db.getDbClient(), userSession, defaultOrganizationProvider));
-  private WsActionTester actionTester = new WsActionTester(underTest);
+  private Languages languages = new Languages(newLanguage("xoo", "Xoo"));
 
-  private RuleIndexer ruleIndexer = new RuleIndexer(esClient, dbClient);
+  private WsActionTester ws = new WsActionTester(
+    new ShowAction(db.getDbClient(), new RuleMapper(languages, macroInterpreter),
+      new ActiveRuleCompleter(db.getDbClient(), languages),
+      new RuleWsSupport(db.getDbClient(), userSession, TestDefaultOrganizationProvider.from(db))));
 
   @Before
   public void before() {
@@ -116,415 +85,305 @@ public class ShowActionTest {
   }
 
   @Test
-  public void should_show_rule_key() {
-    RuleDefinitionDto rule = insertRule();
+  public void show_rule_key() {
+    RuleDefinitionDto rule = db.rules().insert();
 
-    Rules.ShowResponse result = actionTester.newRequest()
+    ShowResponse result = ws.newRequest()
       .setParam(PARAM_KEY, rule.getKey().toString())
-      .executeProtobuf(Rules.ShowResponse.class);
+      .executeProtobuf(ShowResponse.class);
+
     assertThat(result.getRule()).extracting(Rule::getKey).containsExactly(rule.getKey().toString());
   }
 
   @Test
-  public void should_show_rule_tags_in_default_organization() {
-    RuleDefinitionDto rule = insertRule();
-    RuleMetadataDto metadata = insertMetadata(db.getDefaultOrganization(), rule, setTags("tag1", "tag2"), m -> m.setNoteData(null).setNoteUserUuid(null));
+  public void show_rule_with_basic_info() {
+    RuleDefinitionDto rule = db.rules().insert();
+    RuleParamDto ruleParam = db.rules().insertRuleParam(rule);
 
-    Rules.ShowResponse result = actionTester.newRequest()
+    ShowResponse result = ws.newRequest()
       .setParam(PARAM_KEY, rule.getKey().toString())
-      .executeProtobuf(Rules.ShowResponse.class);
-    assertThat(result.getRule().getTags().getTagsList())
-      .containsExactly(metadata.getTags().toArray(new String[0]));
+      .executeProtobuf(ShowResponse.class);
+
+    Rule resultRule = result.getRule();
+    assertThat(resultRule.getKey()).isEqualTo(rule.getKey().toString());
+    assertThat(resultRule.getRepo()).isEqualTo(rule.getRepositoryKey());
+    assertThat(resultRule.getName()).isEqualTo(rule.getName());
+    assertThat(resultRule.getSeverity()).isEqualTo(rule.getSeverityString());
+    assertThat(resultRule.getStatus().toString()).isEqualTo(rule.getStatus().toString());
+    assertThat(resultRule.getInternalKey()).isEqualTo(rule.getConfigKey());
+    assertThat(resultRule.getIsTemplate()).isEqualTo(rule.isTemplate());
+    assertThat(resultRule.getLang()).isEqualTo(rule.getLanguage());
+    assertThat(resultRule.getParams().getParamsList())
+      .extracting(Rule.Param::getKey, Rule.Param::getHtmlDesc, Rule.Param::getDefaultValue)
+      .containsExactlyInAnyOrder(tuple(ruleParam.getName(), ruleParam.getDescription(), ruleParam.getDefaultValue()));
   }
 
   @Test
-  public void should_show_rule_tags_in_specific_organization() {
-    RuleDefinitionDto rule = insertRule();
-    OrganizationDto organization = db.organizations().insert();
-    RuleMetadataDto metadata = insertMetadata(organization, rule, setTags("tag1", "tag2"), m -> m.setNoteData(null).setNoteUserUuid(null));
+  public void show_rule_tags_in_default_organization() {
+    RuleDefinitionDto rule = db.rules().insert();
+    RuleMetadataDto metadata = db.rules().insertOrUpdateMetadata(rule, db.getDefaultOrganization(), setTags("tag1", "tag2"), m -> m.setNoteData(null).setNoteUserUuid(null));
 
-    Rules.ShowResponse result = actionTester.newRequest()
+    ShowResponse result = ws.newRequest()
       .setParam(PARAM_KEY, rule.getKey().toString())
-      .setParam(PARAM_ORGANIZATION, organization.getKey())
-      .executeProtobuf(Rules.ShowResponse.class);
+      .executeProtobuf(ShowResponse.class);
+
     assertThat(result.getRule().getTags().getTagsList())
       .containsExactly(metadata.getTags().toArray(new String[0]));
   }
 
   @Test
-  public void show_rule_with_activation() {
-    OrganizationDto organization = db.organizations().insert();
-    QProfileDto profile = QProfileTesting.newXooP1(organization);
-    dbClient.qualityProfileDao().insert(db.getSession(), profile);
-    db.commit();
-
-    RuleDefinitionDto rule = insertRule();
-    RuleMetadataDto ruleMetadata = db.rules().insertOrUpdateMetadata(rule, organization, m -> m.setNoteData(null).setNoteUserUuid(null));
-
-    ArgumentCaptor<OrganizationDto> orgCaptor = ArgumentCaptor.forClass(OrganizationDto.class);
-    ArgumentCaptor<RuleDefinitionDto> ruleCaptor = ArgumentCaptor.forClass(RuleDefinitionDto.class);
-    Rules.Active active = Rules.Active.newBuilder()
-      .setQProfile(randomAlphanumeric(5))
-      .setInherit(randomAlphanumeric(5))
-      .setSeverity(randomAlphanumeric(5))
-      .build();
-    Mockito.doReturn(singletonList(active)).when(activeRuleCompleter).completeShow(any(DbSession.class), orgCaptor.capture(), ruleCaptor.capture());
-
-    ActiveRuleIndexer activeRuleIndexer = new ActiveRuleIndexer(dbClient, esClient);
-    activeRuleIndexer.indexOnStartup(activeRuleIndexer.getIndexTypes());
-
-    TestResponse response = actionTester.newRequest().setMethod("GET")
-      .setMediaType(PROTOBUF)
-      .setParam(ShowAction.PARAM_KEY, rule.getKey().toString())
-      .setParam(ShowAction.PARAM_ACTIVES, "true")
-      .setParam(ShowAction.PARAM_ORGANIZATION, organization.getKey())
-      .execute();
-
-    assertThat(orgCaptor.getValue().getUuid()).isEqualTo(organization.getUuid());
-    assertThat(ruleCaptor.getValue().getKey()).isEqualTo(rule.getKey());
-
-    Rules.ShowResponse result = response.getInputObject(Rules.ShowResponse.class);
-    Rule resultRule = result.getRule();
-    assertEqual(rule, ruleMetadata, resultRule);
-
-    List<Rules.Active> actives = result.getActivesList();
-    assertThat(actives).extracting(Rules.Active::getQProfile).containsExactly(active.getQProfile());
-    assertThat(actives).extracting(Rules.Active::getInherit).containsExactly(active.getInherit());
-    assertThat(actives).extracting(Rules.Active::getSeverity).containsExactly(active.getSeverity());
-  }
-
-  @Test
-  public void show_rule_without_activation() {
+  public void show_rule_tags_in_specific_organization() {
+    RuleDefinitionDto rule = db.rules().insert();
     OrganizationDto organization = db.organizations().insert();
+    RuleMetadataDto metadata = db.rules().insertOrUpdateMetadata(rule, organization, setTags("tag1", "tag2"), m -> m.setNoteData(null).setNoteUserUuid(null));
 
-    QProfileDto profile = QProfileTesting.newXooP1(organization);
-    dbClient.qualityProfileDao().insert(db.getSession(), profile);
-    db.commit();
-
-    RuleDefinitionDto rule = insertRule();
-    RuleMetadataDto ruleMetadata = db.rules().insertOrUpdateMetadata(rule, organization, m -> m.setNoteData(null).setNoteUserUuid(null));
-
-    db.qualityProfiles().activateRule(profile, rule, a -> a.setSeverity("BLOCKER"));
-    ActiveRuleIndexer activeRuleIndexer = new ActiveRuleIndexer(dbClient, esClient);
-    activeRuleIndexer.indexOnStartup(activeRuleIndexer.getIndexTypes());
-
-    TestResponse response = actionTester.newRequest().setMethod("GET")
-      .setParam(ShowAction.PARAM_KEY, rule.getKey().toString())
-      .setParam(ShowAction.PARAM_ORGANIZATION, organization.getKey())
-      .setMediaType(PROTOBUF)
-      .execute();
-
-    Rules.ShowResponse result = response.getInputObject(Rules.ShowResponse.class);
-    Rule resultRule = result.getRule();
-    assertEqual(rule, ruleMetadata, resultRule);
+    ShowResponse result = ws.newRequest()
+      .setParam(PARAM_KEY, rule.getKey().toString())
+      .setParam(PARAM_ORGANIZATION, organization.getKey())
+      .executeProtobuf(ShowResponse.class);
 
-    List<Rules.Active> actives = result.getActivesList();
-    assertThat(actives).isEmpty();
+    assertThat(result.getRule().getTags().getTagsList())
+      .containsExactly(metadata.getTags().toArray(new String[0]));
   }
 
   @Test
-  public void throw_NotFoundException_if_organization_cannot_be_found() {
+  public void show_rule_with_note_login() {
     RuleDefinitionDto rule = db.rules().insert();
+    UserDto user = db.users().insertUser();
+    OrganizationDto organization = db.organizations().insert();
+    db.rules().insertOrUpdateMetadata(rule, user, organization);
 
-    thrown.expect(NotFoundException.class);
-
-    actionTester.newRequest().setMethod("POST")
-      .setParam("key", rule.getKey().toString())
-      .setParam("organization", "foo")
-      .execute();
-  }
+    ShowResponse result = ws.newRequest()
+      .setParam(PARAM_KEY, rule.getKey().toString())
+      .setParam(PARAM_ORGANIZATION, organization.getKey())
+      .executeProtobuf(ShowResponse.class);
 
-  @Test
-  public void show_rule() {
-    RuleDto ruleDto = RuleTesting.newDto(RuleKey.of("java", "S001"), db.getDefaultOrganization())
-      .setName("Rule S001")
-      .setDescription("Rule S001 <b>description</b>")
-      .setDescriptionFormat(Format.HTML)
-      .setSeverity(MINOR)
-      .setStatus(RuleStatus.BETA)
-      .setConfigKey("InternalKeyS001")
-      .setLanguage("xoo")
-      .setTags(newHashSet("tag1", "tag2"))
-      .setSystemTags(newHashSet("systag1", "systag2"))
-      .setType(RuleType.BUG)
-      .setScope(Scope.ALL);
-    RuleDefinitionDto definition = ruleDto.getDefinition();
-    RuleDao ruleDao = dbClient.ruleDao();
-    DbSession session = db.getSession();
-    ruleDao.insert(session, definition);
-    ruleDao.insertOrUpdate(session, ruleDto.getMetadata().setRuleId(ruleDto.getId()));
-    RuleParamDto param = RuleParamDto.createFor(definition).setName("regex").setType("STRING").setDescription("Reg *exp*").setDefaultValue(".*");
-    ruleDao.insertRuleParam(session, definition, param);
-    session.commit();
-    session.clearCache();
-
-    actionTester.newRequest()
-      .setParam("key", ruleDto.getKey().toString())
-      .execute().assertJson(getClass(), "show_rule.json");
+    assertThat(result.getRule().getNoteLogin()).isEqualTo(user.getLogin());
   }
 
   @Test
   public void show_rule_with_default_debt_infos() {
-    RuleDto ruleDto = RuleTesting.newDto(RuleKey.of("java", "S001"), db.getDefaultOrganization())
-      .setName("Rule S001")
-      .setDescription("Rule S001 <b>description</b>")
-      .setSeverity(MINOR)
-      .setStatus(RuleStatus.BETA)
-      .setConfigKey("InternalKeyS001")
-      .setLanguage("xoo")
+    RuleDefinitionDto rule = db.rules().insert(r -> r
       .setDefRemediationFunction("LINEAR_OFFSET")
       .setDefRemediationGapMultiplier("5d")
       .setDefRemediationBaseEffort("10h")
-      .setRemediationFunction(null)
-      .setRemediationGapMultiplier(null)
-      .setRemediationBaseEffort(null)
-      .setScope(Scope.ALL);
-    RuleDao ruleDao = dbClient.ruleDao();
-    DbSession session = db.getSession();
-    ruleDao.insert(session, ruleDto.getDefinition());
-    ruleDao.insertOrUpdate(session, ruleDto.getMetadata());
-    session.commit();
-    session.clearCache();
-
-    actionTester.newRequest()
-      .setParam("key", ruleDto.getKey().toString())
-      .execute()
-      .assertJson(getClass(), "show_rule_with_default_debt_infos.json");
+      .setGapDescription("gap desc"));
+
+    ShowResponse result = ws.newRequest()
+      .setParam(PARAM_KEY, rule.getKey().toString())
+      .executeProtobuf(ShowResponse.class);
+
+    Rule resultRule = result.getRule();
+    assertThat(resultRule.getDefaultRemFnType()).isEqualTo("LINEAR_OFFSET");
+    assertThat(resultRule.getDefaultRemFnGapMultiplier()).isEqualTo("5d");
+    assertThat(resultRule.getDefaultRemFnBaseEffort()).isEqualTo("10h");
+    assertThat(resultRule.getGapDescription()).isEqualTo("gap desc");
+    assertThat(resultRule.getRemFnType()).isEqualTo("LINEAR_OFFSET");
+    assertThat(resultRule.getRemFnGapMultiplier()).isEqualTo("5d");
+    assertThat(resultRule.getRemFnBaseEffort()).isEqualTo("10h");
+    assertThat(resultRule.getRemFnOverloaded()).isFalse();
   }
 
   @Test
-  public void show_rule_with_overridden_debt() {
-    RuleDto ruleDto = RuleTesting.newDto(RuleKey.of("java", "S001"), db.getDefaultOrganization())
-      .setName("Rule S001")
-      .setDescription("Rule S001 <b>description</b>")
-      .setSeverity(MINOR)
-      .setStatus(RuleStatus.BETA)
-      .setConfigKey("InternalKeyS001")
-      .setLanguage("xoo")
+  public void show_rule_with_only_overridden_debt() {
+    RuleDefinitionDto rule = db.rules().insert(r -> r
       .setDefRemediationFunction(null)
       .setDefRemediationGapMultiplier(null)
-      .setDefRemediationBaseEffort(null)
-      .setRemediationFunction("LINEAR_OFFSET")
-      .setRemediationGapMultiplier("5d")
-      .setRemediationBaseEffort("10h")
-      .setScope(Scope.ALL);
-    RuleDao ruleDao = dbClient.ruleDao();
-    DbSession session = db.getSession();
-    ruleDao.insert(session, ruleDto.getDefinition());
-    ruleDao.insertOrUpdate(session, ruleDto.getMetadata().setRuleId(ruleDto.getId()));
-    session.commit();
-    session.clearCache();
-
-    actionTester.newRequest()
-      .setParam("key", ruleDto.getKey().toString())
-      .execute().assertJson(getClass(), "show_rule_with_overridden_debt_infos.json");
+      .setDefRemediationBaseEffort(null));
+    db.rules().insertOrUpdateMetadata(rule, db.getDefaultOrganization(),
+      m -> m.setNoteData(null).setNoteUserUuid(null),
+      m -> m
+        .setRemediationFunction("LINEAR_OFFSET")
+        .setRemediationGapMultiplier("5d")
+        .setRemediationBaseEffort("10h"));
+
+    ShowResponse result = ws.newRequest()
+      .setParam(PARAM_KEY, rule.getKey().toString())
+      .executeProtobuf(ShowResponse.class);
+
+    Rule resultRule = result.getRule();
+    assertThat(resultRule.hasDefaultRemFnType()).isFalse();
+    assertThat(resultRule.hasDefaultRemFnGapMultiplier()).isFalse();
+    assertThat(resultRule.hasDefaultRemFnBaseEffort()).isFalse();
+    assertThat(resultRule.getRemFnType()).isEqualTo("LINEAR_OFFSET");
+    assertThat(resultRule.getRemFnGapMultiplier()).isEqualTo("5d");
+    assertThat(resultRule.getRemFnBaseEffort()).isEqualTo("10h");
+    assertThat(resultRule.getRemFnOverloaded()).isTrue();
   }
 
   @Test
   public void show_rule_with_default_and_overridden_debt_infos() {
-    RuleDto ruleDto = RuleTesting.newDto(RuleKey.of("java", "S001"), db.getDefaultOrganization())
-      .setName("Rule S001")
-      .setDescription("Rule S001 <b>description</b>")
-      .setSeverity(MINOR)
-      .setStatus(RuleStatus.BETA)
-      .setConfigKey("InternalKeyS001")
-      .setLanguage("xoo")
-      .setDefRemediationFunction("LINEAR")
-      .setDefRemediationGapMultiplier("5min")
-      .setDefRemediationBaseEffort(null)
-      .setRemediationFunction("LINEAR_OFFSET")
-      .setRemediationGapMultiplier("5d")
-      .setRemediationBaseEffort("10h")
-      .setScope(Scope.ALL);
-    RuleDao ruleDao = dbClient.ruleDao();
-    DbSession session = db.getSession();
-    ruleDao.insert(session, ruleDto.getDefinition());
-    ruleDao.insertOrUpdate(session, ruleDto.getMetadata().setRuleId(ruleDto.getId()));
-    session.commit();
-    session.clearCache();
-
-    actionTester.newRequest()
-      .setParam("key", ruleDto.getKey().toString())
-      .execute().assertJson(getClass(), "show_rule_with_default_and_overridden_debt_infos.json");
+    RuleDefinitionDto rule = db.rules().insert(r -> r
+      .setDefRemediationFunction("LINEAR_OFFSET")
+      .setDefRemediationGapMultiplier("5d")
+      .setDefRemediationBaseEffort("10h"));
+    db.rules().insertOrUpdateMetadata(rule, db.getDefaultOrganization(), m -> m.setNoteData(null).setNoteUserUuid(null),
+      m -> m
+        .setRemediationFunction("CONSTANT_ISSUE")
+        .setRemediationGapMultiplier(null)
+        .setRemediationBaseEffort("15h"));
+
+    ShowResponse result = ws.newRequest()
+      .setParam(PARAM_KEY, rule.getKey().toString())
+      .executeProtobuf(ShowResponse.class);
+
+    Rule resultRule = result.getRule();
+    assertThat(resultRule.getDefaultRemFnType()).isEqualTo("LINEAR_OFFSET");
+    assertThat(resultRule.getDefaultRemFnGapMultiplier()).isEqualTo("5d");
+    assertThat(resultRule.getDefaultRemFnBaseEffort()).isEqualTo("10h");
+    assertThat(resultRule.getRemFnType()).isEqualTo("CONSTANT_ISSUE");
+    assertThat(resultRule.hasRemFnGapMultiplier()).isFalse();
+    assertThat(resultRule.getRemFnBaseEffort()).isEqualTo("15h");
+    assertThat(resultRule.getRemFnOverloaded()).isTrue();
   }
 
   @Test
   public void show_rule_with_no_default_and_no_overridden_debt() {
-    RuleDefinitionDto ruleDto = RuleTesting.newRule(RuleKey.of("java", "S001"))
-      .setName("Rule S001")
-      .setDescription("Rule S001 <b>description</b>")
-      .setDescriptionFormat(Format.HTML)
-      .setSeverity(MINOR)
-      .setStatus(RuleStatus.BETA)
-      .setConfigKey("InternalKeyS001")
-      .setLanguage("xoo")
+    RuleDefinitionDto rule = db.rules().insert(r -> r
       .setDefRemediationFunction(null)
       .setDefRemediationGapMultiplier(null)
-      .setDefRemediationBaseEffort(null)
-      .setScope(Scope.ALL);
-    RuleDao ruleDao = dbClient.ruleDao();
-    DbSession session = db.getSession();
-    ruleDao.insert(session, ruleDto);
-    session.commit();
-    session.clearCache();
-
-    actionTester.newRequest()
-      .setParam("key", ruleDto.getKey().toString())
-      .execute().assertJson(getClass(), "show_rule_with_no_default_and_no_overridden_debt.json");
+      .setDefRemediationBaseEffort(null));
+    db.rules().insertOrUpdateMetadata(rule, db.getDefaultOrganization(), m -> m.setNoteData(null).setNoteUserUuid(null),
+      m -> m
+        .setRemediationFunction(null)
+        .setRemediationGapMultiplier(null)
+        .setRemediationBaseEffort(null));
+
+    ShowResponse result = ws.newRequest()
+      .setParam(PARAM_KEY, rule.getKey().toString())
+      .executeProtobuf(ShowResponse.class);
+
+    Rule resultRule = result.getRule();
+    assertThat(resultRule.hasDefaultRemFnType()).isFalse();
+    assertThat(resultRule.hasDefaultRemFnGapMultiplier()).isFalse();
+    assertThat(resultRule.hasDefaultRemFnBaseEffort()).isFalse();
+    assertThat(resultRule.hasRemFnType()).isFalse();
+    assertThat(resultRule.hasRemFnGapMultiplier()).isFalse();
+    assertThat(resultRule.hasRemFnBaseEffort()).isFalse();
+    assertThat(resultRule.getRemFnOverloaded()).isFalse();
+  }
+
+  @Test
+  public void show_deprecated_rule_debt_fields() {
+    RuleDefinitionDto rule = db.rules().insert(r -> r
+      .setDefRemediationFunction("LINEAR_OFFSET")
+      .setDefRemediationGapMultiplier("5d")
+      .setDefRemediationBaseEffort("10h")
+      .setGapDescription("gap desc"));
+    db.rules().insertOrUpdateMetadata(rule, db.getDefaultOrganization(), m -> m.setNoteData(null).setNoteUserUuid(null),
+      m -> m
+        .setRemediationFunction("CONSTANT_ISSUE")
+        .setRemediationGapMultiplier(null)
+        .setRemediationBaseEffort("15h"));
+
+    ShowResponse result = ws.newRequest()
+      .setParam(PARAM_KEY, rule.getKey().toString())
+      .executeProtobuf(ShowResponse.class);
+
+    Rule resultRule = result.getRule();
+    assertThat(resultRule.getDefaultRemFnType()).isEqualTo("LINEAR_OFFSET");
+    assertThat(resultRule.getDefaultDebtRemFnCoeff()).isEqualTo("5d");
+    assertThat(resultRule.getDefaultDebtRemFnOffset()).isEqualTo("10h");
+    assertThat(resultRule.getEffortToFixDescription()).isEqualTo("gap desc");
+    assertThat(resultRule.getDebtRemFnType()).isEqualTo("CONSTANT_ISSUE");
+    assertThat(resultRule.hasDebtRemFnCoeff()).isFalse();
+    assertThat(resultRule.getDebtRemFnOffset()).isEqualTo("15h");
+    assertThat(resultRule.getDebtOverloaded()).isTrue();
   }
 
   @Test
   public void encode_html_description_of_custom_rule() {
     // Template rule
-    RuleDto templateRule = RuleTesting.newTemplateRule(RuleKey.of("java", "S001"));
-    RuleDao ruleDao = dbClient.ruleDao();
-    DbSession session = db.getSession();
-    ruleDao.insert(session, templateRule.getDefinition());
-    session.commit();
-
+    RuleDto templateRule = newTemplateRule(RuleKey.of("java", "S001"));
+    db.rules().insert(templateRule.getDefinition());
     // Custom rule
-    NewCustomRule customRule = NewCustomRule.createForCustomRule("MY_CUSTOM", templateRule.getKey())
-      .setName("My custom")
-      .setSeverity(MINOR)
-      .setStatus(RuleStatus.READY)
-      .setMarkdownDescription("<div>line1\nline2</div>");
-    RuleKey customRuleKey = new RuleCreator(System2.INSTANCE, ruleIndexer, dbClient, new TypeValidations(asList()), TestDefaultOrganizationProvider.from(db)).create(session, customRule);
-    session.clearCache();
-
+    RuleDefinitionDto customRule = newCustomRule(templateRule.getDefinition())
+      .setDescription("<div>line1\nline2</div>")
+      .setDescriptionFormat(MARKDOWN);
+    db.rules().insert(customRule);
     doReturn("&lt;div&gt;line1<br/>line2&lt;/div&gt;").when(macroInterpreter).interpret("<div>line1\nline2</div>");
 
-    Rules.ShowResponse result = actionTester.newRequest()
-      .setParam("key", customRuleKey.toString())
-      .executeProtobuf(Rules.ShowResponse.class);
+    ShowResponse result = ws.newRequest()
+      .setParam("key", customRule.getKey().toString())
+      .executeProtobuf(ShowResponse.class);
 
-    Mockito.verify(macroInterpreter).interpret("&lt;div&gt;line1<br/>line2&lt;/div&gt;");
-
-    assertThat(result.getRule().getKey()).isEqualTo("java:MY_CUSTOM");
     assertThat(result.getRule().getHtmlDesc()).isEqualTo(INTERPRETED);
-    assertThat(result.getRule().getTemplateKey()).isEqualTo("java:S001");
-  }
-
-  @Test
-  public void show_deprecated_rule_rem_function_fields() {
-    RuleDto ruleDto = RuleTesting.newDto(RuleKey.of("java", "S001"), db.getDefaultOrganization())
-      .setName("Rule S001")
-      .setDescription("Rule S001 <b>description</b>")
-      .setSeverity(MINOR)
-      .setStatus(RuleStatus.BETA)
-      .setConfigKey("InternalKeyS001")
-      .setLanguage("xoo")
-      .setDefRemediationFunction("LINEAR_OFFSET")
-      .setDefRemediationGapMultiplier("6d")
-      .setDefRemediationBaseEffort("11h")
-      .setRemediationFunction("LINEAR_OFFSET")
-      .setRemediationGapMultiplier("5d")
-      .setRemediationBaseEffort("10h")
-      .setScope(Scope.ALL);
-    RuleDao ruleDao = dbClient.ruleDao();
-    DbSession session = db.getSession();
-    ruleDao.insert(session, ruleDto.getDefinition());
-    ruleDao.insertOrUpdate(session, ruleDto.getMetadata().setRuleId(ruleDto.getId()));
-    session.commit();
-
-    actionTester.newRequest()
-      .setParam("key", ruleDto.getKey().toString())
-      .execute().assertJson(getClass(), "show_deprecated_rule_rem_function_fields.json");
+    assertThat(result.getRule().getTemplateKey()).isEqualTo(templateRule.getKey().toString());
+    verify(macroInterpreter).interpret("&lt;div&gt;line1<br/>line2&lt;/div&gt;");
   }
 
   @Test
-  public void show_rule_when_activated() {
-    RuleDefinitionDto ruleDto = RuleTesting.newRule(RuleKey.of("java", "S001"))
-      .setName("Rule S001")
-      .setDescription("Rule S001 <b>description</b>")
-      .setDescriptionFormat(Format.HTML)
-      .setSeverity(MINOR)
-      .setStatus(RuleStatus.BETA)
-      .setLanguage("xoo")
-      .setType(RuleType.BUG)
-      .setCreatedAt(new Date().getTime())
-      .setUpdatedAt(new Date().getTime())
-      .setScope(Scope.ALL);
-    RuleDao ruleDao = dbClient.ruleDao();
-    DbSession session = db.getSession();
-    ruleDao.insert(session, ruleDto);
-    session.commit();
-    ruleIndexer.commitAndIndex(session, ruleDto.getId());
-    RuleParamDto regexParam = RuleParamDto.createFor(ruleDto).setName("regex").setType("STRING").setDescription("Reg *exp*").setDefaultValue(".*");
-    ruleDao.insertRuleParam(session, ruleDto, regexParam);
-
-    QProfileDto profile = new QProfileDto()
-      .setRulesProfileUuid("profile")
-      .setKee("profile")
-      .setOrganizationUuid(defaultOrganizationProvider.get().getUuid())
-      .setName("Profile")
-      .setLanguage("xoo");
-    dbClient.qualityProfileDao().insert(session, profile);
-    ActiveRuleDto activeRuleDto = new ActiveRuleDto()
-      .setProfileId(profile.getId())
-      .setRuleId(ruleDto.getId())
-      .setSeverity(MINOR)
-      .setCreatedAt(new Date().getTime())
-      .setUpdatedAt(new Date().getTime());
-    dbClient.activeRuleDao().insert(session, activeRuleDto);
-    dbClient.activeRuleDao().insertParam(session, activeRuleDto, new ActiveRuleParamDto()
-      .setRulesParameterId(regexParam.getId())
-      .setKey(regexParam.getName())
+  public void show_rule_with_activation() {
+    OrganizationDto organization = db.organizations().insert();
+    RuleDefinitionDto rule = db.rules().insert();
+    RuleParamDto ruleParam = db.rules().insertRuleParam(rule, p -> p.setType("STRING").setDescription("Reg *exp*").setDefaultValue(".*"));
+    RuleMetadataDto ruleMetadata = db.rules().insertOrUpdateMetadata(rule, organization, m -> m.setNoteData(null).setNoteUserUuid(null));
+    QProfileDto qProfile = db.qualityProfiles().insert(organization);
+    ActiveRuleDto activeRule = db.qualityProfiles().activateRule(qProfile, rule);
+    db.getDbClient().activeRuleDao().insertParam(db.getSession(), activeRule, new ActiveRuleParamDto()
+      .setRulesParameterId(ruleParam.getId())
+      .setKey(ruleParam.getName())
       .setValue(".*?"));
-    session.commit();
-
-    StartupIndexer activeRuleIndexer = new ActiveRuleIndexer(dbClient, esClient);
-    activeRuleIndexer.indexOnStartup(activeRuleIndexer.getIndexTypes());
+    db.commit();
 
-    ActiveRuleCompleter activeRuleCompleter = new ActiveRuleCompleter(dbClient, languages);
-    WsAction underTest = new ShowAction(dbClient, mapper, activeRuleCompleter, new RuleWsSupport(db.getDbClient(), userSession, defaultOrganizationProvider));
-    WsActionTester actionTester = new WsActionTester(underTest);
+    ShowResponse result = ws.newRequest()
+      .setParam(PARAM_KEY, rule.getKey().toString())
+      .setParam(PARAM_ACTIVES, "true")
+      .setParam(PARAM_ORGANIZATION, organization.getKey())
+      .executeProtobuf(ShowResponse.class);
 
-    actionTester.newRequest()
-      .setParam("key", ruleDto.getKey().toString())
-      .setParam("actives", "true")
-      .execute().assertJson(getClass(), "show_rule_when_activated.json");
+    List<Rules.Active> actives = result.getActivesList();
+    assertThat(actives).extracting(Rules.Active::getQProfile).containsExactly(qProfile.getKee());
+    assertThat(actives).extracting(Rules.Active::getSeverity).containsExactly(activeRule.getSeverityString());
+    assertThat(actives).extracting(Rules.Active::getInherit).containsExactly("NONE");
+    assertThat(actives.get(0).getParamsList())
+      .extracting(Rules.Active.Param::getKey, Rules.Active.Param::getValue)
+      .containsExactlyInAnyOrder(tuple(ruleParam.getName(), ".*?"));
   }
 
   @Test
-  public void show_rule_with_note_login() {
-    RuleDefinitionDto rule = insertRule();
-    UserDto user = db.users().insertUser();
+  public void show_rule_without_activation() {
     OrganizationDto organization = db.organizations().insert();
-    db.rules().insertOrUpdateMetadata(rule, user, organization);
-    ruleIndexer.commitAndIndex(db.getSession(), rule.getId(), organization);
+    RuleDefinitionDto rule = db.rules().insert();
+    RuleMetadataDto ruleMetadata = db.rules().insertOrUpdateMetadata(rule, organization, m -> m.setNoteData(null).setNoteUserUuid(null));
+    QProfileDto qProfile = db.qualityProfiles().insert(organization);
+    ActiveRuleDto activeRule = db.qualityProfiles().activateRule(qProfile, rule);
 
-    Rules.ShowResponse result = actionTester.newRequest()
+    ShowResponse result = ws.newRequest()
       .setParam(PARAM_KEY, rule.getKey().toString())
+      .setParam(PARAM_ACTIVES, "false")
       .setParam(PARAM_ORGANIZATION, organization.getKey())
-      .executeProtobuf(Rules.ShowResponse.class);
+      .executeProtobuf(ShowResponse.class);
 
-    assertThat(result.getRule().getNoteLogin()).isEqualTo(user.getLogin());
+    assertThat(result.getActivesList()).isEmpty();
   }
 
-  private void assertEqual(RuleDefinitionDto rule, RuleMetadataDto ruleMetadata, Rule resultRule) {
-    assertThat(resultRule.getKey()).isEqualTo(rule.getKey().toString());
-    assertThat(resultRule.getRepo()).isEqualTo(rule.getRepositoryKey());
-    assertThat(resultRule.getName()).isEqualTo(rule.getName());
-    assertThat(resultRule.getSeverity()).isEqualTo(rule.getSeverityString());
-    assertThat(resultRule.getStatus().toString()).isEqualTo(rule.getStatus().toString());
-    assertThat(resultRule.getInternalKey()).isEqualTo(rule.getConfigKey());
-    assertThat(resultRule.getIsTemplate()).isEqualTo(rule.isTemplate());
-    assertThat(resultRule.getTags().getTagsList()).containsExactlyInAnyOrder(ruleMetadata.getTags().toArray(new String[0]));
-    assertThat(resultRule.getSysTags().getSysTagsList()).containsExactlyInAnyOrder(rule.getSystemTags().toArray(new String[0]));
-    assertThat(resultRule.getLang()).isEqualTo(rule.getLanguage());
-    assertThat(resultRule.getParams().getParamsList()).isEmpty();
-  }
-
-  private RuleDefinitionDto insertRule() {
+  @Test
+  public void throw_NotFoundException_if_organization_cannot_be_found() {
     RuleDefinitionDto rule = db.rules().insert();
-    ruleIndexer.commitAndIndex(db.getSession(), rule.getId());
-    return rule;
+
+    thrown.expect(NotFoundException.class);
+
+    ws.newRequest()
+      .setParam("key", rule.getKey().toString())
+      .setParam("organization", "foo")
+      .execute();
   }
 
-  @SafeVarargs
-  private final RuleMetadataDto insertMetadata(OrganizationDto organization, RuleDefinitionDto rule, Consumer<RuleMetadataDto>... populaters) {
-    RuleMetadataDto metadata = db.rules().insertOrUpdateMetadata(rule, organization, populaters);
-    ruleIndexer.commitAndIndex(db.getSession(), rule.getId(), organization);
-    return metadata;
+  @Test
+  public void test_definition() {
+    WebService.Action def = ws.getDef();
+
+    assertThat(def.isPost()).isFalse();
+    assertThat(def.since()).isEqualTo("4.2");
+    assertThat(def.isInternal()).isFalse();
+    assertThat(def.responseExampleAsString()).isNotEmpty();
+    assertThat(def.params())
+      .extracting(WebService.Param::key, WebService.Param::isRequired)
+      .containsExactlyInAnyOrder(
+        tuple("key", true),
+        tuple("actives", false),
+        tuple("organization", false));
   }
+
 }
diff --git a/server/sonar-server/src/test/resources/org/sonar/server/rule/ws/ShowActionTest/show_deprecated_rule_rem_function_fields.json b/server/sonar-server/src/test/resources/org/sonar/server/rule/ws/ShowActionTest/show_deprecated_rule_rem_function_fields.json
deleted file mode 100644 (file)
index c519f28..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-{
-  "rule": {
-    "internalKey": "InternalKeyS001",
-    "isTemplate": false,
-    "key": "java:S001",
-    "lang": "xoo",
-    "name": "Rule S001",
-    "repo": "java",
-    "severity": "MINOR",
-    "status": "BETA",
-    "remFnType": "LINEAR_OFFSET",
-    "remFnGapMultiplier": "5d",
-    "remFnBaseEffort": "10h",
-    "defaultRemFnType": "LINEAR_OFFSET",
-    "defaultRemFnGapMultiplier": "6d",
-    "defaultRemFnBaseEffort": "11h",
-    "remFnOverloaded": true,
-    "gapDescription": "java.S001.effortToFix",
-    "debtRemFnType": "LINEAR_OFFSET",
-    "debtRemFnCoeff": "5d",
-    "debtRemFnOffset": "10h",
-    "defaultDebtRemFnType": "LINEAR_OFFSET",
-    "defaultDebtRemFnCoeff": "6d",
-    "defaultDebtRemFnOffset": "11h",
-    "debtOverloaded": true,
-    "effortToFixDescription": "java.S001.effortToFix"
-  }
-}
diff --git a/server/sonar-server/src/test/resources/org/sonar/server/rule/ws/ShowActionTest/show_rule.json b/server/sonar-server/src/test/resources/org/sonar/server/rule/ws/ShowActionTest/show_rule.json
deleted file mode 100644 (file)
index 191f2e6..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-{
-  "rule": {
-    "key": "java:S001",
-    "repo": "java",
-    "name": "Rule S001",
-    "htmlDesc": "interpreted",
-    "severity": "MINOR",
-    "status": "BETA",
-    "isTemplate": false,
-    "tags": ["tag1", "tag2"],
-    "sysTags": ["systag1", "systag2"],
-    "type": "BUG",
-    "lang": "xoo",
-    "params": [
-      {
-        "key": "regex",
-        "htmlDesc": "Reg <strong>exp</strong>",
-        "defaultValue": ".*"
-      }
-    ]
-  }
-}
diff --git a/server/sonar-server/src/test/resources/org/sonar/server/rule/ws/ShowActionTest/show_rule_when_activated.json b/server/sonar-server/src/test/resources/org/sonar/server/rule/ws/ShowActionTest/show_rule_when_activated.json
deleted file mode 100644 (file)
index 4298bb2..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-{
-  "rule": {
-    "key": "java:S001",
-    "params": [
-      {
-        "key": "regex",
-        "htmlDesc": "Reg \u003cstrong\u003eexp\u003c/strong\u003e",
-        "defaultValue": ".*",
-        "type": "STRING"
-      }
-    ]
-  },
-  "actives": [
-    {
-      "qProfile": "profile",
-      "inherit": "NONE",
-      "severity": "MINOR",
-      "params": [
-        {
-          "key": "regex",
-          "value": ".*?"
-        }
-      ]
-    }
-  ]
-}
diff --git a/server/sonar-server/src/test/resources/org/sonar/server/rule/ws/ShowActionTest/show_rule_with_default_and_overridden_debt_infos.json b/server/sonar-server/src/test/resources/org/sonar/server/rule/ws/ShowActionTest/show_rule_with_default_and_overridden_debt_infos.json
deleted file mode 100644 (file)
index ef3917d..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-{
-  "rule": {
-    "key": "java:S001",
-    "repo": "java",
-    "name": "Rule S001",
-    "htmlDesc": "interpreted",
-    "severity": "MINOR",
-    "status": "BETA",
-    "isTemplate": false,
-    "remFnType": "LINEAR_OFFSET",
-    "remFnGapMultiplier": "5d",
-    "remFnBaseEffort": "10h",
-    "defaultRemFnType": "LINEAR",
-    "defaultRemFnGapMultiplier": "5min",
-    "debtOverloaded": true,
-    "lang": "xoo"
-  }
-}
-
diff --git a/server/sonar-server/src/test/resources/org/sonar/server/rule/ws/ShowActionTest/show_rule_with_default_debt_infos.json b/server/sonar-server/src/test/resources/org/sonar/server/rule/ws/ShowActionTest/show_rule_with_default_debt_infos.json
deleted file mode 100644 (file)
index db25bfe..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-{
-  "rule": {
-    "remFnType": "LINEAR_OFFSET",
-    "remFnGapMultiplier": "5d",
-    "remFnBaseEffort": "10h",
-    "defaultRemFnType": "LINEAR_OFFSET",
-    "defaultRemFnGapMultiplier": "5d",
-    "defaultRemFnBaseEffort": "10h",
-    "debtOverloaded": false,
-    "gapDescription": "java.S001.effortToFix",
-    "htmlDesc": "interpreted",
-    "internalKey": "InternalKeyS001",
-    "isTemplate": false,
-    "key": "java:S001",
-    "lang": "xoo",
-    "name": "Rule S001",
-    "repo": "java",
-    "severity": "MINOR",
-    "status": "BETA"
-  }
-}
diff --git a/server/sonar-server/src/test/resources/org/sonar/server/rule/ws/ShowActionTest/show_rule_with_no_default_and_no_overridden_debt.json b/server/sonar-server/src/test/resources/org/sonar/server/rule/ws/ShowActionTest/show_rule_with_no_default_and_no_overridden_debt.json
deleted file mode 100644 (file)
index 893cba6..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-{
-  "rule": {
-    "key": "java:S001",
-    "repo": "java",
-    "name": "Rule S001",
-    "htmlDesc": "interpreted",
-    "severity": "MINOR",
-    "status": "BETA",
-    "isTemplate": false,
-    "debtOverloaded": false,
-    "lang": "xoo"
-  }
-}
-
diff --git a/server/sonar-server/src/test/resources/org/sonar/server/rule/ws/ShowActionTest/show_rule_with_overridden_debt_infos.json b/server/sonar-server/src/test/resources/org/sonar/server/rule/ws/ShowActionTest/show_rule_with_overridden_debt_infos.json
deleted file mode 100644 (file)
index 9f59737..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-{
-  "rule": {
-    "key": "java:S001",
-    "repo": "java",
-    "name": "Rule S001",
-    "htmlDesc": "interpreted",
-    "severity": "MINOR",
-    "status": "BETA",
-    "isTemplate": false,
-    "remFnType": "LINEAR_OFFSET",
-    "remFnGapMultiplier": "5d",
-    "remFnBaseEffort": "10h",
-    "debtOverloaded": true,
-    "lang": "xoo"
-  }
-}
-