]> source.dussan.org Git - sonarqube.git/commitdiff
Refactor declaration of language related params in Q profiles WS
authorJean-Baptiste Lievremont <jean-baptiste.lievremont@sonarsource.com>
Tue, 31 Mar 2015 08:59:48 +0000 (10:59 +0200)
committerJean-Baptiste Lievremont <jean-baptiste.lievremont@sonarsource.com>
Wed, 1 Apr 2015 08:49:25 +0000 (10:49 +0200)
server/sonar-server/src/main/java/org/sonar/server/qualityprofile/ws/LanguageParamUtils.java [new file with mode: 0644]
server/sonar-server/src/main/java/org/sonar/server/qualityprofile/ws/ProjectAssociationActions.java
server/sonar-server/src/main/java/org/sonar/server/qualityprofile/ws/QProfileSearchAction.java
server/sonar-server/src/main/java/org/sonar/server/qualityprofile/ws/QProfileSetDefaultAction.java
server/sonar-server/src/test/java/org/sonar/server/language/LanguageTesting.java [new file with mode: 0644]
server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/QProfileSearchActionTest.java
server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/QProfileSetDefaultActionTest.java
server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/QProfilesWsTest.java

diff --git a/server/sonar-server/src/main/java/org/sonar/server/qualityprofile/ws/LanguageParamUtils.java b/server/sonar-server/src/main/java/org/sonar/server/qualityprofile/ws/LanguageParamUtils.java
new file mode 100644 (file)
index 0000000..a8ff5ee
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * SonarQube is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * SonarQube is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+package org.sonar.server.qualityprofile.ws;
+
+import com.google.common.collect.Collections2;
+import org.sonar.api.resources.Language;
+import org.sonar.api.resources.Languages;
+import org.sonar.core.util.NonNullInputFunction;
+
+import java.util.Arrays;
+import java.util.Collection;
+
+class LanguageParamUtils {
+
+  static Collection<String> getLanguageKeys(Languages languages) {
+    return Collections2.transform(Arrays.asList(languages.all()), new NonNullInputFunction<Language, String>() {
+      @Override
+      public String doApply(Language input) {
+        return input.getKey();
+      }
+    });
+  }
+}
index 08e7411cf85c7c1bb45d04775d1fcd89d3f49c19..ded3b7f597e73ad08fa187c1b5320c1b4499a339 100644 (file)
 package org.sonar.server.qualityprofile.ws;
 
 import com.google.common.base.Preconditions;
-import com.google.common.collect.Collections2;
 import org.sonar.api.ServerComponent;
-import org.sonar.api.resources.Language;
 import org.sonar.api.resources.Languages;
 import org.sonar.api.server.ws.*;
 import org.sonar.api.server.ws.WebService.NewAction;
-import org.sonar.core.util.NonNullInputFunction;
 import org.sonar.server.component.ComponentService;
 import org.sonar.server.exceptions.NotFoundException;
 import org.sonar.server.qualityprofile.QProfile;
@@ -34,8 +31,6 @@ import org.sonar.server.qualityprofile.QProfileLookup;
 import org.sonar.server.qualityprofile.QProfileProjectOperations;
 import org.sonar.server.user.UserSession;
 
-import java.util.Arrays;
-
 import static org.apache.commons.lang.StringUtils.isEmpty;
 
 public class ProjectAssociationActions implements ServerComponent {
@@ -94,12 +89,7 @@ public class ProjectAssociationActions implements ServerComponent {
       .setDescription("A quality profile name. If this parameter is set, profileKey must not be set and language must be set to disambiguate.");
     action.createParam(PARAM_LANGUAGE)
       .setDescription("A quality profile language. If this parameter is set, profileKey must not be set and profileName must be set to disambiguate.")
-      .setPossibleValues(Collections2.transform(Arrays.asList(languages.all()), new NonNullInputFunction<Language, String>() {
-        @Override
-        public String doApply(Language input) {
-          return input.getKey();
-        }
-      }));
+      .setPossibleValues(LanguageParamUtils.getLanguageKeys(languages));
   }
 
   private abstract static class AssociationHandler implements RequestHandler {
index fcdfea11a98e588faf6a0fee6f08777a0f3cd465..cb13f83630f4f0ad3d91b07b37f9c111ae23c230 100644 (file)
  */
 package org.sonar.server.qualityprofile.ws;
 
-import com.google.common.base.Function;
-import com.google.common.collect.Collections2;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Maps;
 import org.apache.commons.lang.builder.CompareToBuilder;
-import org.sonar.api.resources.Language;
 import org.sonar.api.resources.Languages;
 import org.sonar.api.server.ws.Request;
 import org.sonar.api.server.ws.Response;
@@ -169,12 +166,7 @@ public class QProfileSearchAction implements BaseQProfileWsAction {
     search.createParam(PARAM_LANGUAGE)
       .setDescription("The key of a language supported by the platform. If specified, only profiles for the given language are returned.")
       .setExampleValue("js")
-      .setPossibleValues(Collections2.transform(Arrays.asList(languages.all()), new Function<Language, String>() {
-        @Override
-        public String apply(Language input) {
-          return input.getKey();
-        }
-      }));
+      .setPossibleValues(LanguageParamUtils.getLanguageKeys(languages));
 
     search.createParam(PARAM_FIELDS)
       .setDescription("Use to restrict returned fields.")
index ec88a6c165c8322b3b742ae962bac3d0144f3862..462b626205a2a397aef40a28efb6feeda960ad3c 100644 (file)
  */
 package org.sonar.server.qualityprofile.ws;
 
-import com.google.common.base.Function;
 import com.google.common.base.Preconditions;
-import com.google.common.collect.Collections2;
-import org.sonar.api.resources.Language;
 import org.sonar.api.resources.Languages;
 import org.sonar.api.server.ws.Request;
 import org.sonar.api.server.ws.Response;
@@ -35,8 +32,6 @@ import org.sonar.server.qualityprofile.QProfileFactory;
 import org.sonar.server.qualityprofile.QProfileLookup;
 import org.sonar.server.user.UserSession;
 
-import java.util.Arrays;
-
 import static org.apache.commons.lang.StringUtils.isEmpty;
 
 public class QProfileSetDefaultAction implements BaseQProfileWsAction {
@@ -90,18 +85,14 @@ public class QProfileSetDefaultAction implements BaseQProfileWsAction {
     NewAction setDefault = controller.createAction("set_default")
       .setSince("5.2")
       .setDescription("Select the default profile for a given language.")
+      .setPost(true)
       .setHandler(this)
       .setResponseExample(getClass().getResource("example-search.json"));
 
     setDefault.createParam(PARAM_LANGUAGE)
       .setDescription("The key of a language supported by the platform. If specified, profileName must be set to select the default profile for the selected language.")
       .setExampleValue("js")
-      .setPossibleValues(Collections2.transform(Arrays.asList(languages.all()), new Function<Language, String>() {
-        @Override
-        public String apply(Language input) {
-          return input.getKey();
-        }
-      }));
+      .setPossibleValues(LanguageParamUtils.getLanguageKeys(languages));
 
     setDefault.createParam(PARAM_PROFILE_NAME)
       .setDescription("The name of a quality profile. If specified, language must be set. The matching profile will be used as default for the selected language.")
diff --git a/server/sonar-server/src/test/java/org/sonar/server/language/LanguageTesting.java b/server/sonar-server/src/test/java/org/sonar/server/language/LanguageTesting.java
new file mode 100644 (file)
index 0000000..667db85
--- /dev/null
@@ -0,0 +1,55 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * SonarQube is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * SonarQube is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+package org.sonar.server.language;
+
+import com.google.common.collect.Collections2;
+import org.apache.commons.lang.StringUtils;
+import org.sonar.api.resources.AbstractLanguage;
+import org.sonar.api.resources.Language;
+import org.sonar.api.resources.Languages;
+import org.sonar.core.util.NonNullInputFunction;
+
+import java.util.Arrays;
+
+public class LanguageTesting {
+
+  public static Language newLanguage(String key, String name, final String... prefixes) {
+    return new AbstractLanguage(key, name) {
+      @Override
+      public String[] getFileSuffixes() {
+        return prefixes;
+      }
+    };
+  }
+
+  public static Language newLanguage(String key) {
+    return newLanguage(key, StringUtils.capitalize(key));
+  }
+
+  public static Languages newLanguages(String... languageKeys) {
+    return new Languages(Collections2.transform(Arrays.asList(languageKeys), new NonNullInputFunction<String, Language>() {
+      @Override
+      protected Language doApply(String languageKey) {
+        return newLanguage(languageKey);
+      }
+
+    }).toArray(new Language[0]));
+  }
+}
index 44165ee051632ab3e4bdd4be320ba0810b1374d7..6252a9d81e09f0c0ccc601ceb77a07745e641e9d 100644 (file)
 package org.sonar.server.qualityprofile.ws;
 
 import com.google.common.collect.ImmutableMap;
-import org.apache.commons.lang.StringUtils;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.ClassRule;
 import org.junit.Test;
-import org.sonar.api.resources.AbstractLanguage;
 import org.sonar.api.resources.Language;
 import org.sonar.api.resources.Languages;
 import org.sonar.api.utils.System2;
@@ -34,6 +32,7 @@ import org.sonar.core.persistence.DbTester;
 import org.sonar.core.qualityprofile.db.QualityProfileDao;
 import org.sonar.core.qualityprofile.db.QualityProfileDto;
 import org.sonar.server.db.DbClient;
+import org.sonar.server.language.LanguageTesting;
 import org.sonar.server.qualityprofile.QProfileLoader;
 import org.sonar.server.qualityprofile.QProfileLookup;
 import org.sonar.server.ws.WsTester;
@@ -68,8 +67,8 @@ public class QProfileSearchActionTest {
     // TODO Replace with actual implementation after removal of DaoV2...
     profileLoader = mock(QProfileLoader.class);
 
-    xoo1 = createLanguage("xoo1");
-    xoo2 = createLanguage("xoo2");
+    xoo1 = LanguageTesting.newLanguage("xoo1");
+    xoo2 = LanguageTesting.newLanguage("xoo2");
 
     tester = new WsTester(new QProfilesWs(
       mock(RuleActivationActions.class),
@@ -128,13 +127,4 @@ public class QProfileSearchActionTest {
 
     tester.newGetRequest("api/qualityprofiles", "search").setParam("language", xoo1.getKey()).execute().assertJson(this.getClass(), "search_xoo1.json");
   }
-
-  private Language createLanguage(final String key) {
-    return new AbstractLanguage(key, StringUtils.capitalize(key)) {
-      @Override
-      public String[] getFileSuffixes() {
-        return new String[] {key};
-      }
-    };
-  }
 }
index 8dac75022ab80bea2fdac30b22d6832d9c7d27eb..fbb13d55de19a880e49ead90fcc6acb744d127a8 100644 (file)
  */
 package org.sonar.server.qualityprofile.ws;
 
-import org.sonar.server.exceptions.ForbiddenException;
-
-import org.apache.commons.lang.StringUtils;
 import org.assertj.core.api.Fail;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.ClassRule;
 import org.junit.Test;
-import org.sonar.api.resources.AbstractLanguage;
-import org.sonar.api.resources.Language;
-import org.sonar.api.resources.Languages;
 import org.sonar.api.utils.System2;
 import org.sonar.core.permission.GlobalPermissions;
 import org.sonar.core.persistence.DbSession;
@@ -37,11 +31,14 @@ import org.sonar.core.persistence.DbTester;
 import org.sonar.core.qualityprofile.db.QualityProfileDao;
 import org.sonar.core.qualityprofile.db.QualityProfileDto;
 import org.sonar.server.db.DbClient;
+import org.sonar.server.exceptions.ForbiddenException;
 import org.sonar.server.exceptions.NotFoundException;
+import org.sonar.server.language.LanguageTesting;
 import org.sonar.server.qualityprofile.QProfileFactory;
 import org.sonar.server.qualityprofile.QProfileLookup;
 import org.sonar.server.user.MockUserSession;
 import org.sonar.server.ws.WsTester;
+
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.Mockito.mock;
 
@@ -54,7 +51,7 @@ public class QProfileSetDefaultActionTest {
 
   private QualityProfileDao qualityProfileDao;
 
-  private Language xoo1, xoo2;
+  private String xoo1Key = "xoo1", xoo2Key = "xoo2";
 
   private WsTester tester;
 
@@ -68,15 +65,13 @@ public class QProfileSetDefaultActionTest {
     dbClient = new DbClient(dbTester.database(), dbTester.myBatis(), qualityProfileDao);
     session = dbClient.openSession(false);
 
-    xoo1 = createLanguage("xoo1");
-    xoo2 = createLanguage("xoo2");
     createProfiles();
 
     tester = new WsTester(new QProfilesWs(
       mock(RuleActivationActions.class),
       mock(BulkRuleActivationActions.class),
       mock(ProjectAssociationActions.class),
-      new QProfileSetDefaultAction(new Languages(xoo1, xoo2), new QProfileLookup(dbClient), new QProfileFactory(dbClient))));
+      new QProfileSetDefaultAction(LanguageTesting.newLanguages(xoo1Key, xoo2Key), new QProfileLookup(dbClient), new QProfileFactory(dbClient))));
   }
 
   @After
@@ -89,30 +84,30 @@ public class QProfileSetDefaultActionTest {
     MockUserSession.set().setLogin("obiwan").setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
 
 
-    checkDefaultProfile("xoo1", "sonar-way-xoo1-12345");
-    checkDefaultProfile("xoo2", "my-sonar-way-xoo2-34567");
+    checkDefaultProfile(xoo1Key, "sonar-way-xoo1-12345");
+    checkDefaultProfile(xoo2Key, "my-sonar-way-xoo2-34567");
 
     tester.newPostRequest("api/qualityprofiles", "set_default").setParam("profileKey", "sonar-way-xoo2-23456").execute().assertNoContent();
 
-    checkDefaultProfile("xoo1", "sonar-way-xoo1-12345");
-    checkDefaultProfile("xoo2", "sonar-way-xoo2-23456");
+    checkDefaultProfile(xoo1Key, "sonar-way-xoo1-12345");
+    checkDefaultProfile(xoo2Key, "sonar-way-xoo2-23456");
     assertThat(dbClient.qualityProfileDao().getByKey(session, "sonar-way-xoo2-23456").isDefault()).isTrue();
     assertThat(dbClient.qualityProfileDao().getByKey(session, "my-sonar-way-xoo2-34567").isDefault()).isFalse();
 
     // One more time!
     tester.newPostRequest("api/qualityprofiles", "set_default").setParam("profileKey", "sonar-way-xoo2-23456").execute().assertNoContent();
-    checkDefaultProfile("xoo1", "sonar-way-xoo1-12345");
-    checkDefaultProfile("xoo2", "sonar-way-xoo2-23456");
+    checkDefaultProfile(xoo1Key, "sonar-way-xoo1-12345");
+    checkDefaultProfile(xoo2Key, "sonar-way-xoo2-23456");
   }
 
   @Test
   public void set_default_profile_using_language_and_name() throws Exception {
     MockUserSession.set().setLogin("obiwan").setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
 
-    tester.newPostRequest("api/qualityprofiles", "set_default").setParam("language", "xoo2").setParam("profileName", "Sonar way").execute().assertNoContent();
+    tester.newPostRequest("api/qualityprofiles", "set_default").setParam("language", xoo2Key).setParam("profileName", "Sonar way").execute().assertNoContent();
 
-    checkDefaultProfile("xoo1", "sonar-way-xoo1-12345");
-    checkDefaultProfile("xoo2", "sonar-way-xoo2-23456");
+    checkDefaultProfile(xoo1Key, "sonar-way-xoo1-12345");
+    checkDefaultProfile(xoo2Key, "sonar-way-xoo2-23456");
   }
 
   @Test
@@ -124,8 +119,8 @@ public class QProfileSetDefaultActionTest {
       Fail.failBecauseExceptionWasNotThrown(IllegalArgumentException.class);
     } catch(IllegalArgumentException nfe) {
       assertThat(nfe).hasMessage("Quality profile not found: unknown-profile-666");
-      checkDefaultProfile("xoo1", "sonar-way-xoo1-12345");
-      checkDefaultProfile("xoo2", "my-sonar-way-xoo2-34567");
+      checkDefaultProfile(xoo1Key, "sonar-way-xoo1-12345");
+      checkDefaultProfile(xoo2Key, "my-sonar-way-xoo2-34567");
     }
   }
 
@@ -135,12 +130,12 @@ public class QProfileSetDefaultActionTest {
     MockUserSession.set().setLogin("obiwan").setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
 
     try {
-      tester.newPostRequest("api/qualityprofiles", "set_default").setParam("language", "xoo2").setParam("profileName", "Unknown").execute();
+      tester.newPostRequest("api/qualityprofiles", "set_default").setParam("language", xoo2Key).setParam("profileName", "Unknown").execute();
       Fail.failBecauseExceptionWasNotThrown(NotFoundException.class);
     } catch(NotFoundException nfe) {
       assertThat(nfe).hasMessage("Unable to find a profile for language 'xoo2' with name 'Unknown'");
-      checkDefaultProfile("xoo1", "sonar-way-xoo1-12345");
-      checkDefaultProfile("xoo2", "my-sonar-way-xoo2-34567");
+      checkDefaultProfile(xoo1Key, "sonar-way-xoo1-12345");
+      checkDefaultProfile(xoo2Key, "my-sonar-way-xoo2-34567");
     }
   }
 
@@ -152,16 +147,16 @@ public class QProfileSetDefaultActionTest {
       tester.newPostRequest("api/qualityprofiles", "set_default").setParam("profileKey", "sonar-way-xoo2-23456").execute().assertNoContent();
       Fail.failBecauseExceptionWasNotThrown(ForbiddenException.class);
     } catch(ForbiddenException forbidden) {
-      checkDefaultProfile("xoo1", "sonar-way-xoo1-12345");
-      checkDefaultProfile("xoo2", "my-sonar-way-xoo2-34567");
+      checkDefaultProfile(xoo1Key, "sonar-way-xoo1-12345");
+      checkDefaultProfile(xoo2Key, "my-sonar-way-xoo2-34567");
     }
   }
 
   private void createProfiles() {
     qualityProfileDao.insert(session,
-      QualityProfileDto.createFor("sonar-way-xoo1-12345").setLanguage(xoo1.getKey()).setName("Sonar way").setDefault(true),
-      QualityProfileDto.createFor("sonar-way-xoo2-23456").setLanguage(xoo2.getKey()).setName("Sonar way"),
-      QualityProfileDto.createFor("my-sonar-way-xoo2-34567").setLanguage(xoo2.getKey()).setName("My Sonar way").setParentKee("sonar-way-xoo2-23456").setDefault(true)
+      QualityProfileDto.createFor("sonar-way-xoo1-12345").setLanguage(xoo1Key).setName("Sonar way").setDefault(true),
+      QualityProfileDto.createFor("sonar-way-xoo2-23456").setLanguage(xoo2Key).setName("Sonar way"),
+      QualityProfileDto.createFor("my-sonar-way-xoo2-34567").setLanguage(xoo2Key).setName("My Sonar way").setParentKee("sonar-way-xoo2-23456").setDefault(true)
       );
     session.commit();
   }
@@ -169,13 +164,4 @@ public class QProfileSetDefaultActionTest {
   private void checkDefaultProfile(String language, String key) throws Exception {
     assertThat(dbClient.qualityProfileDao().getDefaultProfile(language).getKey()).isEqualTo(key);
   }
-
-  private Language createLanguage(final String key) {
-    return new AbstractLanguage(key, StringUtils.capitalize(key)) {
-      @Override
-      public String[] getFileSuffixes() {
-        return new String[] {key};
-      }
-    };
-  }
 }
index c2eb08cab48e555f5d70bdbc89a538cc9eb3e70e..e48291f8221240a08e4e7c2752828b86e13bc32b 100644 (file)
 
 package org.sonar.server.qualityprofile.ws;
 
-import org.apache.commons.lang.StringUtils;
 import org.junit.Before;
 import org.junit.Test;
 import org.sonar.api.i18n.I18n;
-import org.sonar.api.resources.AbstractLanguage;
-import org.sonar.api.resources.Language;
 import org.sonar.api.resources.Languages;
 import org.sonar.api.server.ws.WebService;
+import org.sonar.server.language.LanguageTesting;
 import org.sonar.server.qualityprofile.QProfileService;
 import org.sonar.server.rule.RuleService;
 import org.sonar.server.ws.WsTester;
@@ -39,38 +37,23 @@ public class QProfilesWsTest {
 
   WebService.Controller controller;
 
-  Language xoo1, xoo2;
+  String xoo1Key = "xoo1", xoo2Key = "xoo2";
 
   @Before
   public void setUp() {
-    Language xoo1 = new AbstractLanguage("xoo1", "Xoo1") {
-      @Override
-      public String[] getFileSuffixes() {
-        return new String[] {"xoo1"};
-      }
-    };
-    Language xoo2 = new AbstractLanguage("xoo2", "Xoo2") {
-      @Override
-      public String[] getFileSuffixes() {
-        return new String[] {"xoo2"};
-      }
-    };
-
     QProfileService profileService = mock(QProfileService.class);
     RuleService ruleService = mock(RuleService.class);
     I18n i18n = mock(I18n.class);
 
-    xoo1 = createLanguage("xoo1");
-    xoo2 = createLanguage("xoo2");
-    Languages languages = new Languages(xoo1, xoo2);
+    Languages languages = LanguageTesting.newLanguages(xoo1Key, xoo2Key);
 
     controller = new WsTester(new QProfilesWs(
       new RuleActivationActions(profileService),
       new BulkRuleActivationActions(profileService, ruleService, i18n),
       new ProjectAssociationActions(null, null, null, languages),
-      new QProfileRestoreBuiltInAction(
-        mock(QProfileService.class)),
-      new QProfileSearchAction(new Languages(xoo1, xoo2), null, null)
+      new QProfileRestoreBuiltInAction(null),
+      new QProfileSearchAction(languages, null, null),
+      new QProfileSetDefaultAction(languages, null, null)
     )).controller(QProfilesWs.API_ENDPOINT);
   }
 
@@ -79,7 +62,7 @@ public class QProfilesWsTest {
     assertThat(controller).isNotNull();
     assertThat(controller.path()).isEqualTo(QProfilesWs.API_ENDPOINT);
     assertThat(controller.description()).isNotEmpty();
-    assertThat(controller.actions()).hasSize(8);
+    assertThat(controller.actions()).hasSize(9);
   }
 
   @Test
@@ -96,7 +79,7 @@ public class QProfilesWsTest {
     assertThat(search).isNotNull();
     assertThat(search.isPost()).isFalse();
     assertThat(search.params()).hasSize(2);
-    assertThat(search.param("language").possibleValues()).containsOnly("xoo1", "xoo2");
+    assertThat(search.param("language").possibleValues()).containsOnly(xoo1Key, xoo2Key);
     assertThat(search.param("f").possibleValues())
       .containsOnly("key", "name", "language", "languageName", "isInherited", "parentKey", "parentName", "isDefault", "activeRuleCount");
   }
@@ -133,13 +116,12 @@ public class QProfilesWsTest {
     assertThat(removeProject.params()).hasSize(5);
   }
 
-  private Language createLanguage(final String key) {
-    return new AbstractLanguage(key, StringUtils.capitalize(key)) {
-      @Override
-      public String[] getFileSuffixes() {
-        return new String[] {key};
-      }
-    };
+  @Test
+  public void define_set_default_action() throws Exception {
+    WebService.Action setDefault = controller.action("set_default");
+    assertThat(setDefault).isNotNull();
+    assertThat(setDefault.isPost()).isTrue();
+    assertThat(setDefault.params()).hasSize(3);
   }
 
   public void define_bulk_activate_rule_action() throws Exception {