*/ | */ | ||||
private String almSlug; | private String almSlug; | ||||
/** | |||||
* Boolean flag which enable/disable inserting summary of analysis as a comment | |||||
* It will be null when the ALM is other than GitHub | |||||
*/ | |||||
private Boolean summaryCommentEnabled; | |||||
private long updatedAt; | private long updatedAt; | ||||
private long createdAt; | private long createdAt; | ||||
return this; | return this; | ||||
} | } | ||||
public Boolean getSummaryCommentEnabled() { | |||||
return summaryCommentEnabled; | |||||
} | |||||
public ProjectAlmSettingDto setSummaryCommentEnabled(@Nullable Boolean summaryCommentEnabled) { | |||||
this.summaryCommentEnabled = summaryCommentEnabled; | |||||
return this; | |||||
} | |||||
long getUpdatedAt() { | long getUpdatedAt() { | ||||
return updatedAt; | return updatedAt; | ||||
} | } |
p.alm_setting_uuid as almSettingUuid, | p.alm_setting_uuid as almSettingUuid, | ||||
p.alm_repo as almRepo, | p.alm_repo as almRepo, | ||||
p.alm_slug as almSlug, | p.alm_slug as almSlug, | ||||
p.summary_comment_enabled as summaryCommentEnabled, | |||||
p.created_at as createdAt, | p.created_at as createdAt, | ||||
p.updated_at as updatedAt | p.updated_at as updatedAt | ||||
</sql> | </sql> | ||||
alm_setting_uuid, | alm_setting_uuid, | ||||
alm_repo, | alm_repo, | ||||
alm_slug, | alm_slug, | ||||
summary_comment_enabled, | |||||
created_at, | created_at, | ||||
updated_at | updated_at | ||||
) | ) | ||||
#{dto.almSettingUuid, jdbcType=VARCHAR}, | #{dto.almSettingUuid, jdbcType=VARCHAR}, | ||||
#{dto.almRepo, jdbcType=VARCHAR}, | #{dto.almRepo, jdbcType=VARCHAR}, | ||||
#{dto.almSlug, jdbcType=VARCHAR}, | #{dto.almSlug, jdbcType=VARCHAR}, | ||||
#{dto.summaryCommentEnabled, jdbcType=BOOLEAN}, | |||||
#{now, jdbcType=BIGINT}, | |||||
#{now, jdbcType=BIGINT} | |||||
) | |||||
</insert> | |||||
<!-- Oracle --> | |||||
<insert id="insert" parameterType="Map" useGeneratedKeys="false" databaseId="oracle"> | |||||
INSERT INTO project_alm_settings | |||||
( | |||||
uuid, | |||||
project_uuid, | |||||
alm_setting_uuid, | |||||
alm_repo, | |||||
alm_slug, | |||||
summary_comment_enabled, | |||||
created_at, | |||||
updated_at | |||||
) | |||||
VALUES ( | |||||
#{uuid, jdbcType=VARCHAR}, | |||||
#{dto.projectUuid, jdbcType=VARCHAR}, | |||||
#{dto.almSettingUuid, jdbcType=VARCHAR}, | |||||
#{dto.almRepo, jdbcType=VARCHAR}, | |||||
#{dto.almSlug, jdbcType=VARCHAR}, | |||||
#{dto.summaryCommentEnabled, jdbcType=NUMERIC}, | |||||
#{now, jdbcType=BIGINT}, | #{now, jdbcType=BIGINT}, | ||||
#{now, jdbcType=BIGINT} | #{now, jdbcType=BIGINT} | ||||
) | ) | ||||
alm_setting_uuid = #{dto.almSettingUuid, jdbcType=VARCHAR}, | alm_setting_uuid = #{dto.almSettingUuid, jdbcType=VARCHAR}, | ||||
alm_repo = #{dto.almRepo, jdbcType=VARCHAR}, | alm_repo = #{dto.almRepo, jdbcType=VARCHAR}, | ||||
alm_slug = #{dto.almSlug, jdbcType=VARCHAR}, | alm_slug = #{dto.almSlug, jdbcType=VARCHAR}, | ||||
summary_comment_enabled = #{dto.summaryCommentEnabled, jdbcType=BOOLEAN}, | |||||
updated_at = #{now, jdbcType=BIGINT} | |||||
WHERE | |||||
project_uuid = #{dto.projectUuid, jdbcType=VARCHAR} | |||||
</update> | |||||
<!-- Oracle --> | |||||
<update id="update" parameterType="map" databaseId="oracle"> | |||||
UPDATE project_alm_settings | |||||
SET | |||||
alm_setting_uuid = #{dto.almSettingUuid, jdbcType=VARCHAR}, | |||||
alm_repo = #{dto.almRepo, jdbcType=VARCHAR}, | |||||
alm_slug = #{dto.almSlug, jdbcType=VARCHAR}, | |||||
summary_comment_enabled = #{dto.summaryCommentEnabled, jdbcType=NUMERIC}, | |||||
updated_at = #{now, jdbcType=BIGINT} | updated_at = #{now, jdbcType=BIGINT} | ||||
WHERE | WHERE | ||||
project_uuid = #{dto.projectUuid, jdbcType=VARCHAR} | project_uuid = #{dto.projectUuid, jdbcType=VARCHAR} |
"ALM_REPO" VARCHAR(256), | "ALM_REPO" VARCHAR(256), | ||||
"ALM_SLUG" VARCHAR(256), | "ALM_SLUG" VARCHAR(256), | ||||
"UPDATED_AT" BIGINT NOT NULL, | "UPDATED_AT" BIGINT NOT NULL, | ||||
"CREATED_AT" BIGINT NOT NULL | |||||
"CREATED_AT" BIGINT NOT NULL, | |||||
"SUMMARY_COMMENT_ENABLED" BOOLEAN | |||||
); | ); | ||||
ALTER TABLE "PROJECT_ALM_SETTINGS" ADD CONSTRAINT "PK_PROJECT_ALM_SETTINGS" PRIMARY KEY("UUID"); | ALTER TABLE "PROJECT_ALM_SETTINGS" ADD CONSTRAINT "PK_PROJECT_ALM_SETTINGS" PRIMARY KEY("UUID"); | ||||
CREATE UNIQUE INDEX "UNIQ_PROJECT_ALM_SETTINGS" ON "PROJECT_ALM_SETTINGS"("PROJECT_UUID"); | CREATE UNIQUE INDEX "UNIQ_PROJECT_ALM_SETTINGS" ON "PROJECT_ALM_SETTINGS"("PROJECT_UUID"); |
import org.sonar.db.project.ProjectDto; | import org.sonar.db.project.ProjectDto; | ||||
import static org.assertj.core.api.Assertions.assertThat; | import static org.assertj.core.api.Assertions.assertThat; | ||||
import static org.assertj.core.api.Assertions.tuple; | |||||
import static org.mockito.Mockito.mock; | import static org.mockito.Mockito.mock; | ||||
import static org.mockito.Mockito.when; | import static org.mockito.Mockito.when; | ||||
import static org.sonar.db.almsettings.AlmSettingsTesting.newBitbucketProjectAlmSettingDto; | import static org.sonar.db.almsettings.AlmSettingsTesting.newBitbucketProjectAlmSettingDto; | ||||
assertThat(underTest.selectByProject(dbSession, project).get()) | assertThat(underTest.selectByProject(dbSession, project).get()) | ||||
.extracting(ProjectAlmSettingDto::getUuid, ProjectAlmSettingDto::getAlmSettingUuid, ProjectAlmSettingDto::getProjectUuid, | .extracting(ProjectAlmSettingDto::getUuid, ProjectAlmSettingDto::getAlmSettingUuid, ProjectAlmSettingDto::getProjectUuid, | ||||
ProjectAlmSettingDto::getAlmRepo, ProjectAlmSettingDto::getAlmSlug, | ProjectAlmSettingDto::getAlmRepo, ProjectAlmSettingDto::getAlmSlug, | ||||
ProjectAlmSettingDto::getCreatedAt, ProjectAlmSettingDto::getUpdatedAt) | |||||
ProjectAlmSettingDto::getCreatedAt, ProjectAlmSettingDto::getUpdatedAt, | |||||
ProjectAlmSettingDto::getSummaryCommentEnabled) | |||||
.containsExactly(A_UUID, githubAlmSettingDto.getUuid(), project.getUuid(), | .containsExactly(A_UUID, githubAlmSettingDto.getUuid(), project.getUuid(), | ||||
githubProjectAlmSettingDto.getAlmRepo(), githubProjectAlmSettingDto.getAlmSlug(), | githubProjectAlmSettingDto.getAlmRepo(), githubProjectAlmSettingDto.getAlmSlug(), | ||||
A_DATE, A_DATE); | |||||
A_DATE, A_DATE, githubProjectAlmSettingDto.getSummaryCommentEnabled()); | |||||
assertThat(underTest.selectByProject(dbSession, anotherProject)).isNotPresent(); | assertThat(underTest.selectByProject(dbSession, anotherProject)).isNotPresent(); | ||||
} | } | ||||
when(system2.now()).thenReturn(A_DATE); | when(system2.now()).thenReturn(A_DATE); | ||||
AlmSettingDto almSettingsDto = db.almSettings().insertBitbucketAlmSetting(); | AlmSettingDto almSettingsDto = db.almSettings().insertBitbucketAlmSetting(); | ||||
ProjectDto project = db.components().insertPrivateProjectDto(); | ProjectDto project = db.components().insertPrivateProjectDto(); | ||||
ProjectAlmSettingDto githubProjectAlmSettingDto = newBitbucketProjectAlmSettingDto(almSettingsDto, project); | |||||
githubProjectAlmSettingDto.setAlmSlug("slug1"); | |||||
underTest.insertOrUpdate(dbSession, githubProjectAlmSettingDto); | |||||
ProjectAlmSettingDto githubProjectAlmSettingDto2 = newBitbucketProjectAlmSettingDto(almSettingsDto, db.components().insertPrivateProjectDto()); | |||||
githubProjectAlmSettingDto2.setAlmSlug("slug2"); | |||||
ProjectAlmSettingDto bitbucketProjectAlmSettingDto = newBitbucketProjectAlmSettingDto(almSettingsDto, project); | |||||
bitbucketProjectAlmSettingDto.setAlmSlug("slug1"); | |||||
underTest.insertOrUpdate(dbSession, bitbucketProjectAlmSettingDto); | |||||
ProjectAlmSettingDto bitbucketProjectAlmSettingDto2 = newBitbucketProjectAlmSettingDto(almSettingsDto, db.components().insertPrivateProjectDto()); | |||||
bitbucketProjectAlmSettingDto2.setAlmSlug("slug2"); | |||||
when(uuidFactory.create()).thenReturn(A_UUID + 1); | when(uuidFactory.create()).thenReturn(A_UUID + 1); | ||||
underTest.insertOrUpdate(dbSession, githubProjectAlmSettingDto2); | |||||
underTest.insertOrUpdate(dbSession, bitbucketProjectAlmSettingDto2); | |||||
Set<String> slugs = new HashSet<>(); | Set<String> slugs = new HashSet<>(); | ||||
slugs.add("slug1"); | slugs.add("slug1"); | ||||
assertThat(underTest.selectByAlmSettingAndSlugs(dbSession, almSettingsDto, slugs)) | assertThat(underTest.selectByAlmSettingAndSlugs(dbSession, almSettingsDto, slugs)) | ||||
.extracting(ProjectAlmSettingDto::getProjectUuid) | |||||
.containsExactly(project.getUuid()); | |||||
.extracting(ProjectAlmSettingDto::getProjectUuid, ProjectAlmSettingDto::getSummaryCommentEnabled) | |||||
.containsExactly(tuple(project.getUuid(), bitbucketProjectAlmSettingDto2.getSummaryCommentEnabled())); | |||||
} | } | ||||
@Test | @Test | ||||
AlmSettingDto anotherGithubAlmSetting = db.almSettings().insertGitHubAlmSetting(); | AlmSettingDto anotherGithubAlmSetting = db.almSettings().insertGitHubAlmSetting(); | ||||
when(system2.now()).thenReturn(A_DATE_LATER); | when(system2.now()).thenReturn(A_DATE_LATER); | ||||
ProjectAlmSettingDto newProjectAlmSettingDto = newGithubProjectAlmSettingDto(anotherGithubAlmSetting, project); | |||||
ProjectAlmSettingDto newProjectAlmSettingDto = newGithubProjectAlmSettingDto(anotherGithubAlmSetting, project) | |||||
.setSummaryCommentEnabled(false); | |||||
underTest.insertOrUpdate(dbSession, newProjectAlmSettingDto); | underTest.insertOrUpdate(dbSession, newProjectAlmSettingDto); | ||||
assertThat(underTest.selectByProject(dbSession, project).get()) | assertThat(underTest.selectByProject(dbSession, project).get()) | ||||
.extracting(ProjectAlmSettingDto::getUuid, ProjectAlmSettingDto::getAlmSettingUuid, ProjectAlmSettingDto::getProjectUuid, | .extracting(ProjectAlmSettingDto::getUuid, ProjectAlmSettingDto::getAlmSettingUuid, ProjectAlmSettingDto::getProjectUuid, | ||||
ProjectAlmSettingDto::getAlmRepo, ProjectAlmSettingDto::getAlmSlug, | ProjectAlmSettingDto::getAlmRepo, ProjectAlmSettingDto::getAlmSlug, | ||||
ProjectAlmSettingDto::getCreatedAt, ProjectAlmSettingDto::getUpdatedAt) | |||||
ProjectAlmSettingDto::getCreatedAt, ProjectAlmSettingDto::getUpdatedAt, | |||||
ProjectAlmSettingDto::getSummaryCommentEnabled) | |||||
.containsExactly(projectAlmSettingDto.getUuid(), anotherGithubAlmSetting.getUuid(), project.getUuid(), | .containsExactly(projectAlmSettingDto.getUuid(), anotherGithubAlmSetting.getUuid(), project.getUuid(), | ||||
newProjectAlmSettingDto.getAlmRepo(), newProjectAlmSettingDto.getAlmSlug(), | newProjectAlmSettingDto.getAlmRepo(), newProjectAlmSettingDto.getAlmSlug(), | ||||
A_DATE, A_DATE_LATER); | |||||
A_DATE, A_DATE_LATER, newProjectAlmSettingDto.getSummaryCommentEnabled()); | |||||
} | } | ||||
@Test | @Test |
return new ProjectAlmSettingDto() | return new ProjectAlmSettingDto() | ||||
.setAlmSettingUuid(githubAlmSetting.getUuid()) | .setAlmSettingUuid(githubAlmSetting.getUuid()) | ||||
.setProjectUuid(project.getUuid()) | .setProjectUuid(project.getUuid()) | ||||
.setAlmRepo(randomAlphanumeric(256)); | |||||
.setAlmRepo(randomAlphanumeric(256)) | |||||
.setSummaryCommentEnabled(true); | |||||
} | } | ||||
static ProjectAlmSettingDto newGitlabProjectAlmSettingDto(AlmSettingDto gitlabAlmSetting, ProjectDto project) { | static ProjectAlmSettingDto newGitlabProjectAlmSettingDto(AlmSettingDto gitlabAlmSetting, ProjectDto project) { |
import org.sonar.server.platform.db.migration.version.v80.DbVersion80; | import org.sonar.server.platform.db.migration.version.v80.DbVersion80; | ||||
import org.sonar.server.platform.db.migration.version.v81.DbVersion81; | import org.sonar.server.platform.db.migration.version.v81.DbVersion81; | ||||
import org.sonar.server.platform.db.migration.version.v82.DbVersion82; | import org.sonar.server.platform.db.migration.version.v82.DbVersion82; | ||||
import org.sonar.server.platform.db.migration.version.v83.DbVersion83; | |||||
public class MigrationConfigurationModule extends Module { | public class MigrationConfigurationModule extends Module { | ||||
@Override | @Override | ||||
DbVersion80.class, | DbVersion80.class, | ||||
DbVersion81.class, | DbVersion81.class, | ||||
DbVersion82.class, | DbVersion82.class, | ||||
DbVersion83.class, | |||||
// migration steps | // migration steps | ||||
MigrationStepRegistryImpl.class, | MigrationStepRegistryImpl.class, |
/* | |||||
* SonarQube | |||||
* Copyright (C) 2009-2020 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.v83; | |||||
import java.sql.SQLException; | |||||
import org.sonar.db.Database; | |||||
import org.sonar.server.platform.db.migration.def.BooleanColumnDef; | |||||
import org.sonar.server.platform.db.migration.sql.AddColumnsBuilder; | |||||
import org.sonar.server.platform.db.migration.step.DdlChange; | |||||
import static org.sonar.server.platform.db.migration.def.BooleanColumnDef.newBooleanColumnDefBuilder; | |||||
public class AddSummaryEnabledColumnToAlmSettings extends DdlChange { | |||||
private static final String TABLE = "project_alm_settings"; | |||||
private static final String NEW_COLUMN = "summary_comment_enabled"; | |||||
private static final BooleanColumnDef SUMMARY_COMMENT_ENABLED = newBooleanColumnDefBuilder() | |||||
.setColumnName(NEW_COLUMN) | |||||
.setIsNullable(true) | |||||
.setDefaultValue(null) | |||||
.build(); | |||||
public AddSummaryEnabledColumnToAlmSettings(Database db) { | |||||
super(db); | |||||
} | |||||
@Override | |||||
public void execute(Context context) throws SQLException { | |||||
context.execute(new AddColumnsBuilder(getDialect(), TABLE) | |||||
.addColumn(SUMMARY_COMMENT_ENABLED) | |||||
.build()); | |||||
} | |||||
} |
/* | |||||
* SonarQube | |||||
* Copyright (C) 2009-2020 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.v83; | |||||
import org.sonar.server.platform.db.migration.step.MigrationStepRegistry; | |||||
import org.sonar.server.platform.db.migration.version.DbVersion; | |||||
public class DbVersion83 implements DbVersion { | |||||
@Override | |||||
public void addSteps(MigrationStepRegistry registry) { | |||||
registry | |||||
.add(3300, "Add 'summary_comment_enabled' boolean column to 'project_alm_settings'", AddSummaryEnabledColumnToAlmSettings.class) | |||||
.add(3301, "Enable 'summary_comment_enabled' for GitHub based projects", PopulateSummaryCommentEnabledColumnForGitHub.class); | |||||
} | |||||
} |
/* | |||||
* SonarQube | |||||
* Copyright (C) 2009-2020 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.v83; | |||||
import java.sql.SQLException; | |||||
import org.sonar.api.utils.System2; | |||||
import org.sonar.db.Database; | |||||
import org.sonar.server.platform.db.migration.step.DataChange; | |||||
import org.sonar.server.platform.db.migration.step.MassUpdate; | |||||
public class PopulateSummaryCommentEnabledColumnForGitHub extends DataChange { | |||||
private final System2 system; | |||||
public PopulateSummaryCommentEnabledColumnForGitHub(Database db, System2 system) { | |||||
super(db); | |||||
this.system = system; | |||||
} | |||||
@Override | |||||
protected void execute(Context context) throws SQLException { | |||||
MassUpdate massUpdate = context.prepareMassUpdate(); | |||||
massUpdate.select("select uuid from alm_settings where alm_id = ? ") | |||||
.setString(1, "github"); | |||||
massUpdate.update("update project_alm_settings set summary_comment_enabled = ?, updated_at = ? where alm_setting_uuid = ?"); | |||||
massUpdate.execute((row, update) -> { | |||||
update.setBoolean(1, true) | |||||
.setLong(2, system.now()) | |||||
.setString(3, row.getString(1)); | |||||
return true; | |||||
}); | |||||
} | |||||
} |
/* | |||||
* SonarQube | |||||
* Copyright (C) 2009-2020 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. | |||||
*/ | |||||
@ParametersAreNonnullByDefault | |||||
package org.sonar.server.platform.db.migration.version.v83; | |||||
import javax.annotation.ParametersAreNonnullByDefault; |
assertThat(container.getPicoContainer().getComponentAdapters()) | assertThat(container.getPicoContainer().getComponentAdapters()) | ||||
.hasSize(COMPONENTS_IN_EMPTY_COMPONENT_CONTAINER | .hasSize(COMPONENTS_IN_EMPTY_COMPONENT_CONTAINER | ||||
// DbVersion classes | // DbVersion classes | ||||
+ 4 | |||||
+ 5 | |||||
// Others | // Others | ||||
+ 4); | + 4); | ||||
} | } |
/* | |||||
* SonarQube | |||||
* Copyright (C) 2009-2020 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.v83; | |||||
import java.sql.SQLException; | |||||
import org.junit.Before; | |||||
import org.junit.Rule; | |||||
import org.junit.Test; | |||||
import org.sonar.api.utils.System2; | |||||
import org.sonar.db.CoreDbTester; | |||||
import org.sonar.server.platform.db.migration.step.DdlChange; | |||||
import static java.sql.Types.BOOLEAN; | |||||
import static org.assertj.core.api.Assertions.assertThat; | |||||
public class AddSummaryEnabledColumnToAlmSettingsTest { | |||||
@Rule | |||||
public CoreDbTester db = CoreDbTester.createForSchema(AddSummaryEnabledColumnToAlmSettingsTest.class, "schema.sql"); | |||||
private DdlChange underTest = new AddSummaryEnabledColumnToAlmSettings(db.database()); | |||||
@Before | |||||
public void setup() { | |||||
insertProjectAlmSetting("1"); | |||||
insertProjectAlmSetting("2"); | |||||
insertProjectAlmSetting("3"); | |||||
insertProjectAlmSetting("4"); | |||||
insertProjectAlmSetting("5"); | |||||
} | |||||
@Test | |||||
public void should_add_summary_comment_enabled_column() throws SQLException { | |||||
underTest.execute(); | |||||
db.assertColumnDefinition("project_alm_settings", "summary_comment_enabled", BOOLEAN, null, true); | |||||
assertThat(db.countSql("select count(uuid) from project_alm_settings where summary_comment_enabled is null")) | |||||
.isEqualTo(5); | |||||
} | |||||
private void insertProjectAlmSetting(String uuid) { | |||||
db.executeInsert("PROJECT_ALM_SETTINGS", | |||||
"UUID", uuid, | |||||
"ALM_SETTING_UUID", uuid + "-name", | |||||
"PROJECT_UUID", uuid + "-description", | |||||
"UPDATED_AT", System2.INSTANCE.now(), | |||||
"CREATED_AT", System2.INSTANCE.now()); | |||||
} | |||||
} |
/* | |||||
* SonarQube | |||||
* Copyright (C) 2009-2020 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.v83; | |||||
import org.junit.Test; | |||||
import org.sonar.server.platform.db.migration.version.DbVersion; | |||||
import static org.sonar.server.platform.db.migration.version.DbVersionTestUtils.verifyMigrationCount; | |||||
import static org.sonar.server.platform.db.migration.version.DbVersionTestUtils.verifyMinimumMigrationNumber; | |||||
public class DbVersion83Test { | |||||
private DbVersion underTest = new DbVersion83(); | |||||
@Test | |||||
public void migrationNumber_starts_at_3300() { | |||||
verifyMinimumMigrationNumber(underTest, 3300); | |||||
} | |||||
@Test | |||||
public void verify_migration_count() { | |||||
verifyMigrationCount(underTest, 2); | |||||
} | |||||
} |
/* | |||||
* SonarQube | |||||
* Copyright (C) 2009-2020 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.v83; | |||||
import java.sql.SQLException; | |||||
import java.util.Objects; | |||||
import java.util.stream.Collectors; | |||||
import javax.annotation.Nullable; | |||||
import org.junit.Rule; | |||||
import org.junit.Test; | |||||
import org.sonar.api.utils.System2; | |||||
import org.sonar.db.CoreDbTester; | |||||
import org.sonar.server.platform.db.migration.step.DataChange; | |||||
import static org.assertj.core.api.Assertions.assertThat; | |||||
public class PopulateSummaryCommentEnabledColumnForGitHubTest { | |||||
@Rule | |||||
public CoreDbTester db = CoreDbTester.createForSchema(PopulateSummaryCommentEnabledColumnForGitHubTest.class, "schema.sql"); | |||||
private System2 system = System2.INSTANCE; | |||||
private DataChange underTest = new PopulateSummaryCommentEnabledColumnForGitHub(db.database(), system); | |||||
@Test | |||||
public void does_not_fail_if_alm_settings_are_empty() throws SQLException { | |||||
underTest.execute(); | |||||
assertThat(db.countSql("select count(uuid) from project_alm_settings where summary_comment_enabled is null")) | |||||
.isEqualTo(0); | |||||
// re-entrant migration | |||||
underTest.execute(); | |||||
} | |||||
@Test | |||||
public void does_not_set_comment_summary_enabled_flag_for_alms_other_than_github() throws SQLException { | |||||
insertAlmSetting("alm-bitbucket", "bitbucket"); | |||||
insertAlmSetting("alm-azure", "azure"); | |||||
insertAlmSetting("alm-gitlab", "gitlab"); | |||||
insertProjectAlmSetting("project-alm-1", "alm-bitbucket"); | |||||
insertProjectAlmSetting("project-alm-2", "alm-bitbucket"); | |||||
insertProjectAlmSetting("project-alm-3", "alm-azure"); | |||||
insertProjectAlmSetting("project-alm-4", "alm-azure"); | |||||
insertProjectAlmSetting("project-alm-5", "alm-azure"); | |||||
insertProjectAlmSetting("project-alm-6", "alm-gitlab"); | |||||
underTest.execute(); | |||||
verifySummaryColumnForProjectAlmSettings(null, "project-alm-1", "project-alm-2", "project-alm-3", | |||||
"project-alm-4", "project-alm-5", "project-alm-6"); | |||||
} | |||||
@Test | |||||
public void set_comment_summary_enabled_flag_to_true_for_github_alm_only() throws SQLException { | |||||
insertAlmSetting("alm-github", "github"); | |||||
insertAlmSetting("alm-azure", "azure"); | |||||
insertAlmSetting("alm-gitlab", "gitlab"); | |||||
insertProjectAlmSetting("project-alm-1", "alm-bitbucket"); | |||||
insertProjectAlmSetting("project-alm-2", "alm-bitbucket"); | |||||
insertProjectAlmSetting("project-alm-3", "alm-github"); | |||||
insertProjectAlmSetting("project-alm-4", "alm-github"); | |||||
insertProjectAlmSetting("project-alm-5", "alm-github"); | |||||
insertProjectAlmSetting("project-alm-6", "alm-github"); | |||||
insertProjectAlmSetting("project-alm-7", "alm-gitlab"); | |||||
underTest.execute(); | |||||
verifySummaryColumnForProjectAlmSettings(null, "project-alm-1", "project-alm-2", "project-alm-7"); | |||||
verifySummaryColumnForProjectAlmSettings(true, "project-alm-3", "project-alm-4", "project-alm-5", "project-alm-6"); | |||||
} | |||||
@Test | |||||
public void migration_is_reentrant() throws SQLException { | |||||
insertAlmSetting("alm-github", "github"); | |||||
insertAlmSetting("alm-azure", "azure"); | |||||
insertAlmSetting("alm-gitlab", "gitlab"); | |||||
insertProjectAlmSetting("project-alm-1", "alm-bitbucket"); | |||||
insertProjectAlmSetting("project-alm-2", "alm-github"); | |||||
underTest.execute(); | |||||
// re-entrant | |||||
underTest.execute(); | |||||
verifySummaryColumnForProjectAlmSettings(null, "project-alm-1"); | |||||
verifySummaryColumnForProjectAlmSettings(true, "project-alm-2"); | |||||
} | |||||
private void verifySummaryColumnForProjectAlmSettings(@Nullable Boolean expectedSummarColumnValue, String... projectUuids) { | |||||
assertThat(db.select("select uuid, summary_comment_enabled from project_alm_settings") | |||||
.stream() | |||||
.filter(rowColumns -> Objects.equals(expectedSummarColumnValue, getBooleanValue(rowColumns.get("SUMMARY_COMMENT_ENABLED")))) | |||||
.map(row -> row.get("UUID")) | |||||
.collect(Collectors.toList())) | |||||
.containsExactly(projectUuids); | |||||
} | |||||
private Boolean getBooleanValue(@Nullable Object value) { | |||||
return value == null ? null : Boolean.parseBoolean(value.toString()); | |||||
} | |||||
private void insertProjectAlmSetting(String uuid, String almSettingsUuid) { | |||||
db.executeInsert("PROJECT_ALM_SETTINGS", | |||||
"UUID", uuid, | |||||
"ALM_SETTING_UUID", almSettingsUuid, | |||||
"PROJECT_UUID", uuid + "-description", | |||||
"UPDATED_AT", system.now(), | |||||
"CREATED_AT", system.now()); | |||||
} | |||||
private void insertAlmSetting(String uuid, String almId) { | |||||
db.executeInsert("ALM_SETTINGS", | |||||
"UUID", uuid, | |||||
"ALM_ID", almId, | |||||
"KEE", uuid + "-key", | |||||
"UPDATED_AT", system.now(), | |||||
"CREATED_AT", system.now()); | |||||
} | |||||
} |
CREATE TABLE "PROJECT_ALM_SETTINGS"( | |||||
"UUID" VARCHAR(40) NOT NULL, | |||||
"ALM_SETTING_UUID" VARCHAR(40) NOT NULL, | |||||
"PROJECT_UUID" VARCHAR(50) NOT NULL, | |||||
"ALM_REPO" VARCHAR(256), | |||||
"ALM_SLUG" VARCHAR(256), | |||||
"UPDATED_AT" BIGINT NOT NULL, | |||||
"CREATED_AT" BIGINT NOT NULL | |||||
); | |||||
ALTER TABLE "PROJECT_ALM_SETTINGS" ADD CONSTRAINT "PK_PROJECT_ALM_SETTINGS" PRIMARY KEY("UUID"); | |||||
CREATE UNIQUE INDEX "UNIQ_PROJECT_ALM_SETTINGS" ON "PROJECT_ALM_SETTINGS"("PROJECT_UUID"); | |||||
CREATE INDEX "PROJECT_ALM_SETTINGS_ALM" ON "PROJECT_ALM_SETTINGS"("ALM_SETTING_UUID"); | |||||
CREATE INDEX "PROJECT_ALM_SETTINGS_SLUG" ON "PROJECT_ALM_SETTINGS"("ALM_SLUG"); |
CREATE TABLE "ALM_SETTINGS"( | |||||
"UUID" VARCHAR(40) NOT NULL, | |||||
"ALM_ID" VARCHAR(40) NOT NULL, | |||||
"KEE" VARCHAR(200) NOT NULL, | |||||
"URL" VARCHAR(2000), | |||||
"APP_ID" VARCHAR(80), | |||||
"PRIVATE_KEY" VARCHAR(2000), | |||||
"PAT" VARCHAR(2000), | |||||
"UPDATED_AT" BIGINT NOT NULL, | |||||
"CREATED_AT" BIGINT NOT NULL | |||||
); | |||||
ALTER TABLE "ALM_SETTINGS" ADD CONSTRAINT "PK_ALM_SETTINGS" PRIMARY KEY("UUID"); | |||||
CREATE UNIQUE INDEX "UNIQ_ALM_SETTINGS" ON "ALM_SETTINGS"("KEE"); | |||||
CREATE TABLE "PROJECT_ALM_SETTINGS"( | |||||
"UUID" VARCHAR(40) NOT NULL, | |||||
"ALM_SETTING_UUID" VARCHAR(40) NOT NULL, | |||||
"PROJECT_UUID" VARCHAR(50) NOT NULL, | |||||
"ALM_REPO" VARCHAR(256), | |||||
"ALM_SLUG" VARCHAR(256), | |||||
"UPDATED_AT" BIGINT NOT NULL, | |||||
"CREATED_AT" BIGINT NOT NULL, | |||||
"SUMMARY_COMMENT_ENABLED" BOOLEAN | |||||
); | |||||
ALTER TABLE "PROJECT_ALM_SETTINGS" ADD CONSTRAINT "PK_PROJECT_ALM_SETTINGS" PRIMARY KEY("UUID"); | |||||
CREATE UNIQUE INDEX "UNIQ_PROJECT_ALM_SETTINGS" ON "PROJECT_ALM_SETTINGS"("PROJECT_UUID"); | |||||
CREATE INDEX "PROJECT_ALM_SETTINGS_ALM" ON "PROJECT_ALM_SETTINGS"("ALM_SETTING_UUID"); | |||||
CREATE INDEX "PROJECT_ALM_SETTINGS_SLUG" ON "PROJECT_ALM_SETTINGS"("ALM_SLUG"); |
.setParam("almSetting", request.getAlmSetting()) | .setParam("almSetting", request.getAlmSetting()) | ||||
.setParam("project", request.getProject()) | .setParam("project", request.getProject()) | ||||
.setParam("repository", request.getRepository()) | .setParam("repository", request.getRepository()) | ||||
.setParam("summaryCommentEnabled", request.getSummaryCommentEnabled()) | |||||
.setMediaType(MediaTypes.JSON)).content(); | .setMediaType(MediaTypes.JSON)).content(); | ||||
} | } | ||||
private String almSetting; | private String almSetting; | ||||
private String project; | private String project; | ||||
private String repository; | private String repository; | ||||
private String summaryCommentEnabled; | |||||
/** | /** | ||||
* This is a mandatory parameter. | * This is a mandatory parameter. | ||||
public String getRepository() { | public String getRepository() { | ||||
return repository; | return repository; | ||||
} | } | ||||
public String getSummaryCommentEnabled() { | |||||
return summaryCommentEnabled; | |||||
} | |||||
public SetGithubBindingRequest setSummaryCommentEnabled(String summaryCommentEnabled) { | |||||
this.summaryCommentEnabled = summaryCommentEnabled; | |||||
return this; | |||||
} | |||||
} | } |
optional string repository = 3; | optional string repository = 3; | ||||
optional string url = 4; | optional string url = 4; | ||||
optional string slug = 5; | optional string slug = 5; | ||||
optional bool summaryCommentEnabled = 6; | |||||
} | } | ||||
enum Alm { | enum Alm { |