From f5d3bf0075612ffcde324c35cf23959cbb7e14c3 Mon Sep 17 00:00:00 2001 From: Serhat Yenican Date: Wed, 6 Nov 2024 10:18:10 +0100 Subject: [PATCH] CODEFIX-180 Migrate 'sonar.ai.suggestions.enabled' property values --- .../MigrateAiSuggestionEnabledValuesTest.java | 105 ++++++++++++++++++ .../migration/version/v108/DbVersion108.java | 3 +- .../MigrateAiSuggestionEnabledValues.java | 59 ++++++++++ 3 files changed, 166 insertions(+), 1 deletion(-) create mode 100644 server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/MigrateAiSuggestionEnabledValuesTest.java create mode 100644 server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/MigrateAiSuggestionEnabledValues.java diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/MigrateAiSuggestionEnabledValuesTest.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/MigrateAiSuggestionEnabledValuesTest.java new file mode 100644 index 00000000000..8491a827a15 --- /dev/null +++ b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/MigrateAiSuggestionEnabledValuesTest.java @@ -0,0 +1,105 @@ +/* + * SonarQube + * Copyright (C) 2009-2024 SonarSource SA + * mailto:info AT sonarsource DOT com + * + * This program 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. + * + * This program 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.platform.db.migration.version.v108; + +import java.sql.SQLException; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; +import org.sonar.db.MigrationDbTester; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.sonar.server.platform.db.migration.version.v108.MigrateAiSuggestionEnabledValues.AI_CODEFIX_ENABLED_PROP_KEY; +import static org.sonar.server.platform.db.migration.version.v108.MigrateAiSuggestionEnabledValues.DISABLED; +import static org.sonar.server.platform.db.migration.version.v108.MigrateAiSuggestionEnabledValues.ENABLED_FOR_ALL_PROJECTS; + +class MigrateAiSuggestionEnabledValuesTest { + @RegisterExtension + private final MigrationDbTester db = MigrationDbTester.createForMigrationStep(MigrateAiSuggestionEnabledValues.class); + private final MigrateAiSuggestionEnabledValues underTest = new MigrateAiSuggestionEnabledValues(db.database()); + + @BeforeEach + void init() { + insertProjects(); + } + + @Test + void execute_shouldNotUpdateAnything_whenThePropertyDoesNotExists() throws SQLException { + underTest.execute(); + + assertThat(db.countSql(String.format("select count(1) from properties where prop_key = '%s'", AI_CODEFIX_ENABLED_PROP_KEY))).isZero(); + assertThat(db.countSql("select count(1) from projects where ai_code_fix_enabled is true")).isZero(); + } + + @Test + void execute_shouldUpdatePropertyToDisabled_whenThePropertyIsFalse() throws SQLException { + addAISuggestionEnabledProperty(false); + underTest.execute(); + + assertThat(db.select(String.format("select text_value from properties where prop_key = '%s'", AI_CODEFIX_ENABLED_PROP_KEY))) + .extracting(r -> r.get("TEXT_VALUE")) + .containsExactly(DISABLED); + + assertThat(db.countSql("select count(1) from projects where ai_code_fix_enabled is true")).isZero(); + } + + @Test + void execute_shouldUpdatePropertyAndProjects_whenThePropertyIsTrue() throws SQLException { + addAISuggestionEnabledProperty(true); + underTest.execute(); + + assertThat(db.select(String.format("select text_value from properties where prop_key = '%s'", AI_CODEFIX_ENABLED_PROP_KEY))) + .extracting(r -> r.get("TEXT_VALUE")) + .containsExactly(ENABLED_FOR_ALL_PROJECTS); + + assertThat(db.countSql("select count(1) from projects where ai_code_fix_enabled is false")).isZero(); + } + + private void insertProjects() { + db.executeInsert("projects", + "kee", "proj1", + "qualifier", "TRK", + "uuid", "uuid1", + "private", false, + "creation_method", "LOCAL_BROWSER", + "ai_code_fix_enabled", false, + "created_at", 1L, + "updated_at", 1L); + db.executeInsert("projects", + "kee", "proj2", + "qualifier", "TRK", + "uuid", "uuid2", + "private", false, + "creation_method", "LOCAL_BROWSER", + "ai_code_fix_enabled", false, + "created_at", 1L, + "updated_at", 1L); + } + + private void addAISuggestionEnabledProperty(boolean enabled) { + db.executeInsert("properties", + "prop_key", AI_CODEFIX_ENABLED_PROP_KEY, + "is_empty", "false", + "uuid", "uuid2", + "text_value", enabled, + "created_at", 1L); + } + +} diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/DbVersion108.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/DbVersion108.java index 169a59e5fc2..e69eae20426 100644 --- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/DbVersion108.java +++ b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/DbVersion108.java @@ -63,7 +63,8 @@ public class DbVersion108 implements DbVersion { .add(10_8_020, "Create new software quality metrics", CreateNewSoftwareQualityMetrics.class) .add(10_8_021, "Migrate deprecated project_measures to replacement metrics", MigrateProjectMeasuresDeprecatedMetrics.class) .add(10_8_022, "Add 'manual_severity' column in 'issues_impacts' table", AddManualSeverityColumnInIssuesImpactsTable.class) - .add(10_8_023, "Add 'ai_code_fix_enabled' column to 'projects' table", AddAICodeFixEnabledColumnToProjectsTable.class); + .add(10_8_023, "Add 'ai_code_fix_enabled' column to 'projects' table", AddAICodeFixEnabledColumnToProjectsTable.class) + .add(10_8_024, "Migrate boolean values of 'sonar.ai.suggestions.enabled' property to new enum values", MigrateAiSuggestionEnabledValues.class); } } diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/MigrateAiSuggestionEnabledValues.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/MigrateAiSuggestionEnabledValues.java new file mode 100644 index 00000000000..6b0a0beedc2 --- /dev/null +++ b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/MigrateAiSuggestionEnabledValues.java @@ -0,0 +1,59 @@ +/* + * SonarQube + * Copyright (C) 2009-2024 SonarSource SA + * mailto:info AT sonarsource DOT com + * + * This program 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. + * + * This program 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.platform.db.migration.version.v108; + +import java.sql.SQLException; +import java.util.Optional; +import org.sonar.db.Database; +import org.sonar.server.platform.db.migration.step.DataChange; + +public class MigrateAiSuggestionEnabledValues extends DataChange { + + static final String AI_CODEFIX_ENABLED_PROP_KEY = "sonar.ai.suggestions.enabled"; + static final String ENABLED_FOR_ALL_PROJECTS = "ENABLED_FOR_ALL_PROJECTS"; + static final String DISABLED = "DISABLED"; + + public MigrateAiSuggestionEnabledValues(Database db) { + super(db); + } + + @Override + protected void execute(Context context) throws SQLException { + + var isAiCodeFixEnabledOptional = Optional.ofNullable(context.prepareSelect("select text_value from properties where prop_key=?") + .setString(1, AI_CODEFIX_ENABLED_PROP_KEY) + .get(r -> r.getBoolean(1))); + + if (isAiCodeFixEnabledOptional.isPresent()) { + boolean isAiCodeFixEnabled = isAiCodeFixEnabledOptional.get(); + context.prepareUpsert("update properties set text_value=? where prop_key=?") + .setString(1, isAiCodeFixEnabled ? ENABLED_FOR_ALL_PROJECTS : DISABLED) + .setString(2, AI_CODEFIX_ENABLED_PROP_KEY) + .execute() + .commit(); + if (isAiCodeFixEnabled) { + context.prepareUpsert("update projects set ai_code_fix_enabled=true") + .execute() + .commit(); + } + } + } + +} -- 2.39.5