]> source.dussan.org Git - sonarqube.git/commitdiff
CODEFIX-187 Add `isAiCodeFixEnabled` property to the Component Response (#12212)
authorSerhat Yenican <104850907+serhat-yenican-sonarsource@users.noreply.github.com>
Thu, 7 Nov 2024 08:38:00 +0000 (09:38 +0100)
committersonartech <sonartech@sonarsource.com>
Tue, 19 Nov 2024 20:02:53 +0000 (20:02 +0000)
server/sonar-db-dao/src/it/java/org/sonar/db/project/ProjectDaoIT.java
server/sonar-db-dao/src/main/java/org/sonar/db/project/ProjectDto.java
server/sonar-db-dao/src/main/resources/org/sonar/db/project/ProjectMapper.xml
server/sonar-webserver-webapi/src/it/java/org/sonar/server/component/ws/ShowActionIT.java
server/sonar-webserver-webapi/src/main/java/org/sonar/server/component/ws/ComponentDtoToWsComponent.java
sonar-ws/src/main/protobuf/ws-components.proto

index 2ebe14fa96c562bf02b9ced4949605c7c0aed1f0..0157ec892888ed4d59f5093c60cdaedf002868a6 100644 (file)
@@ -35,7 +35,6 @@ import org.assertj.core.groups.Tuple;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.RegisterExtension;
 import org.sonar.api.impl.utils.AlwaysIncreasingSystem2;
-import org.sonar.db.component.ComponentQualifiers;
 import org.sonar.api.utils.System2;
 import org.sonar.db.DbTester;
 import org.sonar.db.Pagination;
@@ -44,6 +43,7 @@ import org.sonar.db.audit.NoOpAuditPersister;
 import org.sonar.db.component.BranchDto;
 import org.sonar.db.component.BranchType;
 import org.sonar.db.component.ComponentDto;
+import org.sonar.db.component.ComponentQualifiers;
 import org.sonar.db.entity.EntityDto;
 
 import static java.util.Collections.emptySet;
@@ -149,6 +149,23 @@ class ProjectDaoIT {
       .containsEntry("projectName_p2", false);
   }
 
+  @Test
+  void selectProjects_returnsAiCodeFixEnabled() {
+    var dbSession = db.getSession();
+
+    var dto1 = createProject("o1", "p1").setAiCodeFixEnabled(true);
+    var dto2 = createProject("o1", "p2");
+
+    projectDao.insert(dbSession, dto1);
+    projectDao.insert(dbSession, dto2);
+
+    assertThat(projectDao.selectProjects(dbSession))
+      .extracting(EntityDto::getName, ProjectDto::getAiCodeFixEnabled)
+      .containsExactlyInAnyOrder(
+        tuple("projectName_p1", true),
+        tuple("projectName_p2", false));
+  }
+
   @Test
   void select_all() {
     ProjectDto dto1 = createProject("o1", "p1");
index e7abfb11eced21b0c01b54d686bc1a0761ed6c91..06414302257ba3f6a7c35f1f84932d03c9103741 100644 (file)
@@ -33,6 +33,7 @@ public class ProjectDto extends EntityDto {
   private String tags;
   private CreationMethod creationMethod;
   private boolean aiCodeAssurance;
+  private boolean aiCodeFixEnabled = false;
   private long createdAt;
   private long updatedAt;
 
@@ -133,4 +134,13 @@ public class ProjectDto extends EntityDto {
     this.aiCodeAssurance = aiCodeAssurance;
     return this;
   }
+
+  public boolean getAiCodeFixEnabled() {
+    return aiCodeFixEnabled;
+  }
+
+  public ProjectDto setAiCodeFixEnabled(boolean aiCodeFixEnabled) {
+    this.aiCodeFixEnabled = aiCodeFixEnabled;
+    return this;
+  }
 }
index c54aa32323fe04403d125fa0d7fb1197d6ae6ae6..9f332354d875e3146524ac769baac9955b0305c3 100644 (file)
@@ -12,6 +12,7 @@
       p.private as isPrivate,
       p.creation_method as creationMethod,
       p.ai_code_assurance as aiCodeAssurance,
+      p.ai_code_fix_enabled as aiCodeFixEnabled,
       p.created_at as createdAt,
       p.updated_at as updatedAt
     </sql>
       tags,
       creation_method,
       ai_code_assurance,
+      ai_code_fix_enabled,
       created_at,
       updated_at
     )
     #{tagsString, jdbcType=VARCHAR},
     #{creationMethod, jdbcType=VARCHAR},
     #{aiCodeAssurance, jdbcType=BOOLEAN},
+    #{aiCodeFixEnabled, jdbcType=BOOLEAN},
     #{createdAt,jdbcType=BIGINT},
     #{updatedAt,jdbcType=BIGINT}
     )
index 13291397296f2e9b33ca501f1c91306fbab67a16..83d62b8fdc1594ff570738a01baea6ce2e350535 100644 (file)
@@ -24,13 +24,16 @@ import java.util.Optional;
 import javax.annotation.Nullable;
 import org.junit.Rule;
 import org.junit.Test;
-import org.sonar.db.component.ComponentQualifiers;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.ValueSource;
 import org.sonar.api.server.ws.Change;
 import org.sonar.api.server.ws.WebService;
 import org.sonar.api.utils.System2;
 import org.sonar.api.web.UserRole;
 import org.sonar.db.DbTester;
+import org.sonar.db.component.ComponentDbTester;
 import org.sonar.db.component.ComponentDto;
+import org.sonar.db.component.ComponentQualifiers;
 import org.sonar.db.component.ProjectData;
 import org.sonar.server.component.TestComponentFinder;
 import org.sonar.server.exceptions.ForbiddenException;
@@ -463,6 +466,19 @@ public class ShowActionIT {
       .hasMessage(String.format("Component '%s' on branch '%s' not found", file.getKey(), "another_branch"));
   }
 
+  @ParameterizedTest
+  @ValueSource(booleans = {true, false})
+  void return_isAiCodeFixEnabled(boolean isAiCodeFixEnabled) {
+    var projectData = db.components().insertPrivateProject(ComponentDbTester.defaults(),
+      p -> p.setAiCodeFixEnabled(isAiCodeFixEnabled));
+    userSession.addProjectPermission(USER, projectData.getProjectDto())
+      .registerBranches(projectData.getMainBranchDto());
+
+    var response = newRequest(projectData.projectKey());
+
+    assertThat(response.getComponent().getIsAiCodeFixEnabled()).isEqualTo(isAiCodeFixEnabled);
+  }
+
   private ShowWsResponse newRequest(@Nullable String key) {
     TestRequest request = ws.newRequest();
     if (key != null) {
index 3daa11d4f54b5690f0ab99c31192a1f4b5070789..e2ef0c75f0a6c2804cc702f56ab6fbf5106b2092 100644 (file)
@@ -48,7 +48,8 @@ class ComponentDtoToWsComponent {
     Components.Component.Builder wsComponent = Components.Component.newBuilder()
       .setKey(project.getKey())
       .setName(project.getName())
-      .setQualifier(project.getQualifier());
+      .setQualifier(project.getQualifier())
+      .setIsAiCodeFixEnabled(project.getAiCodeFixEnabled());
 
     ofNullable(emptyToNull(project.getDescription())).ifPresent(wsComponent::setDescription);
     ofNullable(lastAnalysis).ifPresent(
index b0ec074464ace6b9e64fa78400526efe09213910..d3704c795f11183cfc195fa426d9adb894265693 100644 (file)
@@ -115,6 +115,7 @@ message Component {
   optional string pullRequest = 20;
   optional bool needIssueSync = 21;
   optional bool isAiCodeAssured = 22;
+  optional bool isAiCodeFixEnabled = 23;
 
   message Tags {
     repeated string tags = 1;