Skip to content

Commit

Permalink
SONAR-10134 Add organization parameter in api/qualitygates/destroy
Browse files Browse the repository at this point in the history
  • Loading branch information
julienlancelot committed Dec 14, 2017
1 parent 456e3c9 commit 4a0c3a9
Show file tree
Hide file tree
Showing 6 changed files with 88 additions and 46 deletions.
Expand Up @@ -72,7 +72,8 @@ public QGateWithOrgDto selectDefault(DbSession dbSession, OrganizationDto organi
} }


public void delete(QualityGateDto qGate, DbSession session) { public void delete(QualityGateDto qGate, DbSession session) {
mapper(session).delete(qGate.getId()); mapper(session).delete(qGate.getUuid());
mapper(session).deleteOrgQualityGatesByQualityGateUuid(qGate.getUuid());
} }


public void update(QualityGateDto qGate, DbSession session) { public void update(QualityGateDto qGate, DbSession session) {
Expand Down
Expand Up @@ -44,7 +44,9 @@ public interface QualityGateMapper {


QualityGateDto selectBuiltIn(); QualityGateDto selectBuiltIn();


void delete(long id); void delete(String uuid);

void deleteOrgQualityGatesByQualityGateUuid(String uuid);


void update(QualityGateDto qGate); void update(QualityGateDto qGate);


Expand Down
Expand Up @@ -99,8 +99,12 @@
INNER JOIN organizations o ON o.default_quality_gate_uuid = qg.uuid AND o.uuid=#{organizationUuid, jdbcType=VARCHAR} INNER JOIN organizations o ON o.default_quality_gate_uuid = qg.uuid AND o.uuid=#{organizationUuid, jdbcType=VARCHAR}
</select> </select>


<update id="delete" parameterType="long"> <update id="delete" parameterType="String">
delete from quality_gates where id=#{id} delete from quality_gates where uuid=#{uuid}
</update>

<update id="deleteOrgQualityGatesByQualityGateUuid" parameterType="String">
delete from org_quality_gates where quality_gate_uuid=#{uuid}
</update> </update>


<update id="update" parameterType="QualityGate"> <update id="update" parameterType="QualityGate">
Expand Down
Expand Up @@ -28,6 +28,7 @@
import org.sonar.db.DbTester; import org.sonar.db.DbTester;
import org.sonar.db.organization.OrganizationDto; import org.sonar.db.organization.OrganizationDto;


import static java.lang.String.format;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;


public class QualityGateDaoTest { public class QualityGateDaoTest {
Expand Down Expand Up @@ -168,7 +169,9 @@ public void delete() {
dbSession.commit(); dbSession.commit();


assertThat(underTest.selectByOrganizationAndUuid(dbSession, organization, qualityGate.getUuid())).isNull(); assertThat(underTest.selectByOrganizationAndUuid(dbSession, organization, qualityGate.getUuid())).isNull();
assertThat(db.countSql(dbSession, format("select count(*) from org_quality_gates where quality_gate_uuid='%s'", qualityGate.getUuid()))).isZero();
assertThat(underTest.selectByOrganizationAndUuid(dbSession, organization, otherQualityGate.getUuid())).isNotNull(); assertThat(underTest.selectByOrganizationAndUuid(dbSession, organization, otherQualityGate.getUuid())).isNotNull();
assertThat(db.countSql(dbSession, format("select count(*) from org_quality_gates where quality_gate_uuid='%s'", otherQualityGate.getUuid()))).isEqualTo(1);
} }


@Test @Test
Expand Down
Expand Up @@ -25,6 +25,8 @@
import org.sonar.api.server.ws.WebService; import org.sonar.api.server.ws.WebService;
import org.sonar.db.DbClient; import org.sonar.db.DbClient;
import org.sonar.db.DbSession; import org.sonar.db.DbSession;
import org.sonar.db.organization.OrganizationDto;
import org.sonar.db.qualitygate.QGateWithOrgDto;
import org.sonar.db.qualitygate.QualityGateDto; import org.sonar.db.qualitygate.QualityGateDto;
import org.sonar.server.qualitygate.QualityGateFinder; import org.sonar.server.qualitygate.QualityGateFinder;


Expand Down Expand Up @@ -55,20 +57,21 @@ public void define(WebService.NewController controller) {
.setDescription("ID of the quality gate to delete") .setDescription("ID of the quality gate to delete")
.setRequired(true) .setRequired(true)
.setExampleValue("1"); .setExampleValue("1");

wsSupport.createOrganizationParam(action);
} }


@Override @Override
public void handle(Request request, Response response) { public void handle(Request request, Response response) {
long qualityGateId = request.mandatoryParamAsLong(QualityGatesWsParameters.PARAM_ID); long qualityGateId = request.mandatoryParamAsLong(QualityGatesWsParameters.PARAM_ID);
try (DbSession dbSession = dbClient.openSession(false)) { try (DbSession dbSession = dbClient.openSession(false)) {

OrganizationDto organization = wsSupport.getOrganization(dbSession, request);
QualityGateDto qualityGate = finder.getById(dbSession, qualityGateId); QGateWithOrgDto qualityGate = finder.getByOrganizationAndId(dbSession, organization, qualityGateId);
Optional<QualityGateDto> defaultQualityGate = finder.getDefault(dbSession); Optional<QualityGateDto> defaultQualityGate = finder.getDefault(dbSession);
checkArgument(!defaultQualityGate.isPresent() || !defaultQualityGate.get().getId().equals(qualityGate.getId()), "The default quality gate cannot be removed"); checkArgument(!defaultQualityGate.isPresent() || !defaultQualityGate.get().getId().equals(qualityGate.getId()), "The default quality gate cannot be removed");
wsSupport.checkCanEdit(qualityGate); wsSupport.checkCanEdit(qualityGate);


dbClient.qualityGateDao().delete(qualityGate, dbSession); dbClient.qualityGateDao().delete(qualityGate, dbSession);

dbSession.commit(); dbSession.commit();
response.noContent(); response.noContent();
} }
Expand Down
Expand Up @@ -27,6 +27,8 @@
import org.sonar.db.DbClient; import org.sonar.db.DbClient;
import org.sonar.db.DbSession; import org.sonar.db.DbSession;
import org.sonar.db.DbTester; import org.sonar.db.DbTester;
import org.sonar.db.organization.OrganizationDto;
import org.sonar.db.qualitygate.QGateWithOrgDto;
import org.sonar.db.qualitygate.QualityGateDto; import org.sonar.db.qualitygate.QualityGateDto;
import org.sonar.server.exceptions.ForbiddenException; import org.sonar.server.exceptions.ForbiddenException;
import org.sonar.server.exceptions.NotFoundException; import org.sonar.server.exceptions.NotFoundException;
Expand All @@ -39,9 +41,11 @@
import static java.lang.String.valueOf; import static java.lang.String.valueOf;
import static org.apache.commons.lang.StringUtils.EMPTY; import static org.apache.commons.lang.StringUtils.EMPTY;
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.sonar.db.permission.OrganizationPermission.ADMINISTER_QUALITY_GATES; import static org.sonar.db.permission.OrganizationPermission.ADMINISTER_QUALITY_GATES;
import static org.sonar.db.permission.OrganizationPermission.ADMINISTER_QUALITY_PROFILES; import static org.sonar.db.permission.OrganizationPermission.ADMINISTER_QUALITY_PROFILES;
import static org.sonar.server.qualitygate.ws.QualityGatesWsParameters.PARAM_ID; import static org.sonar.server.qualitygate.ws.QualityGatesWsParameters.PARAM_ID;
import static org.sonar.server.qualitygate.ws.QualityGatesWsParameters.PARAM_ORGANIZATION;


public class DestroyActionTest { public class DestroyActionTest {


Expand All @@ -61,68 +65,71 @@ public class DestroyActionTest {
private DestroyAction underTest = new DestroyAction(dbClient, wsSupport, qualityGateFinder); private DestroyAction underTest = new DestroyAction(dbClient, wsSupport, qualityGateFinder);
private WsActionTester ws = new WsActionTester(underTest); private WsActionTester ws = new WsActionTester(underTest);


@Test
public void definition() {
WebService.Action definition = ws.getDef();

assertThat(definition.since()).isEqualTo("4.3");
assertThat(definition.isPost()).isTrue();
assertThat(definition.params()).extracting(WebService.Param::key).containsExactlyInAnyOrder("id");

WebService.Param id = definition.param("id");
assertThat(id.isRequired()).isTrue();
}

@Test @Test
public void delete_quality_gate() { public void delete_quality_gate() {
userSession.addPermission(ADMINISTER_QUALITY_GATES, db.getDefaultOrganization()); OrganizationDto organization = db.organizations().insert();
QualityGateDto qualityGate = db.qualityGates().insertQualityGate(); userSession.addPermission(ADMINISTER_QUALITY_GATES, organization);
Long qualityGateId = qualityGate.getId(); QGateWithOrgDto qualityGate = db.qualityGates().insertQualityGate(organization);
assertThat(db.getDbClient().qualityGateDao().selectById(dbSession, qualityGateId)).isNotNull();


ws.newRequest() ws.newRequest()
.setParam(PARAM_ID, valueOf(qualityGateId)) .setParam(PARAM_ID, qualityGate.getId().toString())
.setParam(PARAM_ORGANIZATION, organization.getKey())
.execute(); .execute();


assertThat(db.getDbClient().qualityGateDao().selectById(dbSession, qualityGateId)).isNull(); assertThat(db.getDbClient().qualityGateDao().selectByOrganizationAndId(dbSession, organization, qualityGate.getId())).isNull();
assertThat(db.countRowsOfTable(dbSession, "org_quality_gates")).isZero();
} }


@Test @Test
public void delete_quality_gate_if_non_default_when_a_default_exist() { public void delete_quality_gate_if_non_default_when_a_default_exist() {
userSession.addPermission(ADMINISTER_QUALITY_GATES, db.getDefaultOrganization()); OrganizationDto organization = db.organizations().insert();
QualityGateDto qualityGate = db.qualityGates().insertQualityGate(qg -> qg.setName("To Delete")); userSession.addPermission(ADMINISTER_QUALITY_GATES, organization);
Long toDeleteQualityGateId = qualityGate.getId(); QGateWithOrgDto qualityGate = db.qualityGates().insertQualityGate(organization);
assertThat(db.getDbClient().qualityGateDao().selectById(dbSession, toDeleteQualityGateId)).isNotNull();


QualityGateDto defaultQualityGate = db.qualityGates().insertQualityGate(qg -> qg.setName("Default")); QualityGateDto defaultQualityGate = db.qualityGates().insertQualityGate();
db.qualityGates().setDefaultQualityGate(defaultQualityGate); db.qualityGates().setDefaultQualityGate(defaultQualityGate);


ws.newRequest() ws.newRequest()
.setParam(PARAM_ID, valueOf(toDeleteQualityGateId)) .setParam(PARAM_ID, valueOf(qualityGate.getId()))
.setParam(PARAM_ORGANIZATION, organization.getKey())
.execute(); .execute();


assertThat(db.getDbClient().qualityGateDao().selectById(dbSession, toDeleteQualityGateId)).isNull(); assertThat(db.getDbClient().qualityGateDao().selectByOrganizationAndId(dbSession, organization, qualityGate.getId())).isNull();
} }


@Test @Test
public void does_not_delete_built_in_quality_gate() { public void does_not_delete_built_in_quality_gate() {
userSession.addPermission(ADMINISTER_QUALITY_GATES, db.getDefaultOrganization()); OrganizationDto organization = db.organizations().insert();
QualityGateDto qualityGate = db.qualityGates().insertQualityGate(qg -> qg.setBuiltIn(true)); userSession.addPermission(ADMINISTER_QUALITY_GATES, organization);
Long qualityGateId = qualityGate.getId(); QGateWithOrgDto qualityGate = db.qualityGates().insertQualityGate(organization, qg -> qg.setBuiltIn(true));


expectedException.expect(IllegalArgumentException.class); expectedException.expect(IllegalArgumentException.class);
expectedException.expectMessage(format("Operation forbidden for built-in Quality Gate '%s'", qualityGate.getName())); expectedException.expectMessage(format("Operation forbidden for built-in Quality Gate '%s'", qualityGate.getName()));


ws.newRequest() ws.newRequest()
.setParam(PARAM_ID, valueOf(qualityGateId)) .setParam(PARAM_ID, valueOf(qualityGate.getId()))
.setParam(PARAM_ORGANIZATION, organization.getKey())
.execute(); .execute();
}

@Test
public void default_organization_is_used_when_no_organization_parameter() {
userSession.addPermission(ADMINISTER_QUALITY_GATES, db.getDefaultOrganization());
QGateWithOrgDto qualityGate = db.qualityGates().insertQualityGate(db.getDefaultOrganization());
OrganizationDto otherOrganization = db.organizations().insert();
QGateWithOrgDto otherQualityGate = db.qualityGates().insertQualityGate(otherOrganization);


assertThat(db.getDbClient().qualityGateDao().selectById(dbSession, qualityGateId)).isNotNull(); ws.newRequest()
.setParam(PARAM_ID, valueOf(qualityGate.getId()))
.execute();

assertThat(db.getDbClient().qualityGateDao().selectByOrganizationAndId(dbSession, db.getDefaultOrganization(), qualityGate.getId())).isNull();
} }


@Test @Test
public void fail_when_invalid_id() { public void fail_when_invalid_id() {
userSession.addPermission(ADMINISTER_QUALITY_GATES, db.getDefaultOrganization()); OrganizationDto organization = db.organizations().insert();
userSession.addPermission(ADMINISTER_QUALITY_GATES, organization);


String invalidId = "invalid-id"; String invalidId = "invalid-id";


Expand All @@ -131,56 +138,78 @@ public void fail_when_invalid_id() {


ws.newRequest() ws.newRequest()
.setParam(PARAM_ID, valueOf(invalidId)) .setParam(PARAM_ID, valueOf(invalidId))
.setParam(PARAM_ORGANIZATION, organization.getKey())
.execute(); .execute();
} }


@Test @Test
public void fail_when_missing_id() { public void fail_when_missing_id() {
userSession.addPermission(ADMINISTER_QUALITY_GATES, db.getDefaultOrganization()); OrganizationDto organization = db.organizations().insert();
userSession.addPermission(ADMINISTER_QUALITY_GATES, organization);


expectedException.expect(IllegalArgumentException.class); expectedException.expect(IllegalArgumentException.class);


ws.newRequest() ws.newRequest()
.setParam(PARAM_ID, valueOf(EMPTY)) .setParam(PARAM_ID, valueOf(EMPTY))
.setParam(PARAM_ORGANIZATION, organization.getKey())
.execute(); .execute();
} }


@Test @Test
public void fail_to_delete_default_quality_gate() { public void fail_to_delete_default_quality_gate() {
userSession.addPermission(ADMINISTER_QUALITY_GATES, db.getDefaultOrganization()); OrganizationDto organization = db.organizations().insert();
QualityGateDto qualityGate = db.qualityGates().insertQualityGate(qg -> qg.setName("To Delete")); userSession.addPermission(ADMINISTER_QUALITY_GATES, organization);
QGateWithOrgDto qualityGate = db.qualityGates().insertQualityGate(organization);
db.qualityGates().setDefaultQualityGate(qualityGate); db.qualityGates().setDefaultQualityGate(qualityGate);
Long qualityGateId = qualityGate.getId();


expectedException.expect(IllegalArgumentException.class); expectedException.expect(IllegalArgumentException.class);
expectedException.expectMessage("The default quality gate cannot be removed"); expectedException.expectMessage("The default quality gate cannot be removed");


ws.newRequest() ws.newRequest()
.setParam(PARAM_ID, valueOf(qualityGateId)) .setParam(PARAM_ID, valueOf(qualityGate.getId()))
.setParam(PARAM_ORGANIZATION, organization.getKey())
.execute(); .execute();
} }


@Test @Test
public void fail_on_unknown_quality_gate() { public void fail_on_unknown_quality_gate() {
userSession.addPermission(ADMINISTER_QUALITY_GATES, db.getDefaultOrganization()); OrganizationDto organization = db.organizations().insert();
userSession.addPermission(ADMINISTER_QUALITY_GATES, organization);


expectedException.expect(NotFoundException.class); expectedException.expect(NotFoundException.class);


ws.newRequest() ws.newRequest()
.setParam(PARAM_ID, "123") .setParam(PARAM_ID, "123")
.setParam(PARAM_ORGANIZATION, organization.getKey())
.execute(); .execute();
} }


@Test @Test
public void fail_when_not_quality_gates_administer() { public void fail_when_not_quality_gates_administer() {
userSession.logIn("john").addPermission(ADMINISTER_QUALITY_PROFILES, db.getDefaultOrganization()); OrganizationDto organization = db.organizations().insert();
QualityGateDto qualityGate = db.qualityGates().insertQualityGate(qg -> qg.setName("old name")); userSession.logIn("john").addPermission(ADMINISTER_QUALITY_PROFILES, organization);
QGateWithOrgDto qualityGate = db.qualityGates().insertQualityGate(organization);


expectedException.expect(ForbiddenException.class); expectedException.expect(ForbiddenException.class);


ws.newRequest() ws.newRequest()
.setParam(PARAM_ID, qualityGate.getId().toString()) .setParam(PARAM_ID, qualityGate.getId().toString())
.setParam(PARAM_ORGANIZATION, organization.getKey())
.execute(); .execute();
} }


@Test
public void definition() {
WebService.Action action = ws.getDef();

assertThat(action.since()).isEqualTo("4.3");
assertThat(action.isPost()).isTrue();

assertThat(action.params())
.extracting(WebService.Param::key, WebService.Param::isRequired)
.containsExactlyInAnyOrder(
tuple("id", true),
tuple("organization", false));
}

} }

0 comments on commit 4a0c3a9

Please sign in to comment.