Skip to content

Commit

Permalink
SONAR-10134 Add organization parameter in rename action
Browse files Browse the repository at this point in the history
  • Loading branch information
julienlancelot committed Dec 14, 2017
1 parent 108c687 commit a92d72f
Show file tree
Hide file tree
Showing 4 changed files with 80 additions and 58 deletions.
Expand Up @@ -49,7 +49,8 @@ public QualityGateFinder(DbClient dbClient) {
public Optional<QualityGateData> getQualityGate(DbSession dbSession, long componentId) { public Optional<QualityGateData> getQualityGate(DbSession dbSession, long componentId) {
Optional<Long> qualityGateId = dbClient.projectQgateAssociationDao().selectQGateIdByComponentId(dbSession, componentId); Optional<Long> qualityGateId = dbClient.projectQgateAssociationDao().selectQGateIdByComponentId(dbSession, componentId);
if (qualityGateId.isPresent()) { if (qualityGateId.isPresent()) {
return Optional.of(new QualityGateData(getById(dbSession, qualityGateId.get()), false)); QualityGateDto qualityGate = checkFound(dbClient.qualityGateDao().selectById(dbSession, qualityGateId.get()), "No quality gate has been found for id %s", qualityGateId);
return Optional.of(new QualityGateData(qualityGate, false));
} else { } else {
Optional<QualityGateDto> defaultQualityGate = getDefault(dbSession); Optional<QualityGateDto> defaultQualityGate = getDefault(dbSession);
if (!defaultQualityGate.isPresent()) { if (!defaultQualityGate.isPresent()) {
Expand All @@ -59,14 +60,6 @@ public Optional<QualityGateData> getQualityGate(DbSession dbSession, long compon
} }
} }


/**
* @deprecated Use {@link #getByOrganizationAndId(DbSession, OrganizationDto, long)}
*/
@Deprecated
public QualityGateDto getById(DbSession dbSession, long qualityGateId) {
return checkFound(dbClient.qualityGateDao().selectById(dbSession, qualityGateId), "No quality gate has been found for id %s", qualityGateId);
}

public QGateWithOrgDto getByOrganizationAndId(DbSession dbSession, OrganizationDto organization, long qualityGateId) { public QGateWithOrgDto getByOrganizationAndId(DbSession dbSession, OrganizationDto organization, long qualityGateId) {
return checkFound(dbClient.qualityGateDao().selectByOrganizationAndId(dbSession, organization, qualityGateId), return checkFound(dbClient.qualityGateDao().selectByOrganizationAndId(dbSession, organization, qualityGateId),
"No quality gate has been found for id %s in organization %s", qualityGateId, organization.getName()); "No quality gate has been found for id %s in organization %s", qualityGateId, organization.getName());
Expand Down
Expand Up @@ -98,15 +98,6 @@ OrganizationDto getOrganization(DbSession dbSession, Request request) {
return checkFoundWithOptional(organizationDto, "No organization with key '%s'", organizationKey); return checkFoundWithOptional(organizationDto, "No organization with key '%s'", organizationKey);
} }


/**
* @deprecated use {@link #checkCanEdit(QGateWithOrgDto)} instead
*/
@Deprecated
void checkCanEdit(QualityGateDto qualityGate) {
checkNotBuiltIn(qualityGate);
userSession.checkPermission(ADMINISTER_QUALITY_GATES, defaultOrganizationProvider.get().getUuid());
}

void checkCanEdit(QGateWithOrgDto qualityGate) { void checkCanEdit(QGateWithOrgDto qualityGate) {
checkNotBuiltIn(qualityGate); checkNotBuiltIn(qualityGate);
userSession.checkPermission(ADMINISTER_QUALITY_GATES, qualityGate.getOrganizationUuid()); userSession.checkPermission(ADMINISTER_QUALITY_GATES, qualityGate.getOrganizationUuid());
Expand All @@ -120,7 +111,7 @@ void checkCanAdminProject(OrganizationDto organization, ComponentDto project) {
throw insufficientPrivilegesException(); throw insufficientPrivilegesException();
} }


void checkProjectBelongsToOrganization(OrganizationDto organization, ComponentDto project){ void checkProjectBelongsToOrganization(OrganizationDto organization, ComponentDto project) {
if (project.getOrganizationUuid().equals(organization.getUuid())) { if (project.getOrganizationUuid().equals(organization.getUuid())) {
return; return;
} }
Expand Down
Expand Up @@ -24,6 +24,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;
import org.sonarqube.ws.Qualitygates.QualityGate; import org.sonarqube.ws.Qualitygates.QualityGate;
Expand Down Expand Up @@ -67,33 +69,36 @@ public void define(WebService.NewController controller) {
.setMaximumLength(NAME_MAXIMUM_LENGTH) .setMaximumLength(NAME_MAXIMUM_LENGTH)
.setDescription("New name of the quality gate") .setDescription("New name of the quality gate")
.setExampleValue("My Quality Gate"); .setExampleValue("My Quality Gate");

wsSupport.createOrganizationParam(action);
} }


@Override @Override
public void handle(Request request, Response response) { public void handle(Request request, Response response) {
long id = QualityGatesWs.parseId(request, PARAM_ID); long id = QualityGatesWs.parseId(request, PARAM_ID);
QualityGateDto qualityGate = rename(id, request.mandatoryParam(PARAM_NAME));
writeProtobuf(QualityGate.newBuilder()
.setId(qualityGate.getId())
.setName(qualityGate.getName())
.build(), request, response);
}

private QualityGateDto rename(long id, String name) {
try (DbSession dbSession = dbClient.openSession(false)) { try (DbSession dbSession = dbClient.openSession(false)) {
QualityGateDto qualityGate = qualityGateFinder.getById(dbSession, id); OrganizationDto organization = wsSupport.getOrganization(dbSession, request);
wsSupport.checkCanEdit(qualityGate); QualityGateDto qualityGate = rename(dbSession, organization, id, request.mandatoryParam(PARAM_NAME));
checkArgument(!isNullOrEmpty(name), CANT_BE_EMPTY_MESSAGE, "Name"); writeProtobuf(QualityGate.newBuilder()
checkNotAlreadyExists(dbSession, qualityGate, name); .setId(qualityGate.getId())
qualityGate.setName(name); .setName(qualityGate.getName())
dbClient.qualityGateDao().update(qualityGate, dbSession); .build(), request, response);
dbSession.commit();
return qualityGate;
} }
} }


private void checkNotAlreadyExists(DbSession dbSession, QualityGateDto qualityGate, String name) { private QualityGateDto rename(DbSession dbSession, OrganizationDto organization, long id, String name) {
QualityGateDto existingQgate = dbClient.qualityGateDao().selectByName(dbSession, name); QGateWithOrgDto qualityGate = qualityGateFinder.getByOrganizationAndId(dbSession, organization, id);
wsSupport.checkCanEdit(qualityGate);
checkArgument(!isNullOrEmpty(name), CANT_BE_EMPTY_MESSAGE, "Name");
checkNotAlreadyExists(dbSession, organization, qualityGate, name);
qualityGate.setName(name);
dbClient.qualityGateDao().update(qualityGate, dbSession);
dbSession.commit();
return qualityGate;
}

private void checkNotAlreadyExists(DbSession dbSession, OrganizationDto organization, QualityGateDto qualityGate, String name) {
QualityGateDto existingQgate = dbClient.qualityGateDao().selectByOrganizationAndName(dbSession, organization, name);
boolean isModifyingCurrentQgate = existingQgate == null || existingQgate.getId().equals(qualityGate.getId()); boolean isModifyingCurrentQgate = existingQgate == null || existingQgate.getId().equals(qualityGate.getId());
checkArgument(isModifyingCurrentQgate, "Name '%s' has already been taken", name); checkArgument(isModifyingCurrentQgate, "Name '%s' has already been taken", name);
} }
Expand Down
Expand Up @@ -26,7 +26,8 @@
import org.sonar.api.server.ws.WebService; import org.sonar.api.server.ws.WebService;
import org.sonar.api.utils.System2; import org.sonar.api.utils.System2;
import org.sonar.db.DbTester; import org.sonar.db.DbTester;
import org.sonar.db.qualitygate.QualityGateDto; import org.sonar.db.organization.OrganizationDto;
import org.sonar.db.qualitygate.QGateWithOrgDto;
import org.sonar.server.exceptions.ForbiddenException; import org.sonar.server.exceptions.ForbiddenException;
import org.sonar.server.exceptions.NotFoundException; import org.sonar.server.exceptions.NotFoundException;
import org.sonar.server.organization.DefaultOrganizationProvider; import org.sonar.server.organization.DefaultOrganizationProvider;
Expand Down Expand Up @@ -64,30 +65,37 @@ public void verify_definition() {
assertThat(action.changelog()).isEmpty(); assertThat(action.changelog()).isEmpty();
assertThat(action.params()) assertThat(action.params())
.extracting(WebService.Param::key, WebService.Param::isRequired) .extracting(WebService.Param::key, WebService.Param::isRequired)
.containsExactlyInAnyOrder(tuple("id", true), tuple("name", true)); .containsExactlyInAnyOrder(
tuple("id", true),
tuple("name", true),
tuple("organization", false));
} }


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


ws.newRequest() ws.newRequest()
.setParam("id", qualityGate.getId().toString()) .setParam("id", qualityGate.getId().toString())
.setParam("name", "new name") .setParam("name", "new name")
.setParam("organization", organization.getKey())
.execute(); .execute();


assertThat(db.getDbClient().qualityGateDao().selectById(db.getSession(), qualityGate.getId()).getName()).isEqualTo("new name"); assertThat(db.getDbClient().qualityGateDao().selectById(db.getSession(), qualityGate.getId()).getName()).isEqualTo("new name");
} }


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


QualityGate result = ws.newRequest() QualityGate result = ws.newRequest()
.setParam("id", qualityGate.getId().toString()) .setParam("id", qualityGate.getId().toString())
.setParam("name", "new name") .setParam("name", "new name")
.setParam("organization", organization.getKey())
.executeProtobuf(QualityGate.class); .executeProtobuf(QualityGate.class);


assertThat(result.getId()).isEqualTo(qualityGate.getId()); assertThat(result.getId()).isEqualTo(qualityGate.getId());
Expand All @@ -96,86 +104,111 @@ public void response_contains_quality_gate() {


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


ws.newRequest() ws.newRequest()
.setParam("id", qualityGate.getId().toString()) .setParam("id", qualityGate.getId().toString())
.setParam("name", "name") .setParam("name", "name")
.setParam("organization", organization.getKey())
.execute(); .execute();


assertThat(db.getDbClient().qualityGateDao().selectById(db.getSession(), qualityGate.getId()).getName()).isEqualTo("name"); assertThat(db.getDbClient().qualityGateDao().selectById(db.getSession(), qualityGate.getId()).getName()).isEqualTo("name");
} }


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

QualityGate result = ws.newRequest()
.setParam("id", qualityGate.getId().toString())
.setParam("name", "new name")
.executeProtobuf(QualityGate.class);

assertThat(result.getId()).isEqualTo(qualityGate.getId());
assertThat(result.getName()).isEqualTo("new name");
}

@Test @Test
public void fail_on_built_in_quality_gate() { public void fail_on_built_in_quality_gate() {
logAsQualityGateAdminister(); OrganizationDto organization = db.organizations().insert();
QualityGateDto qualityGate = db.qualityGates().insertQualityGate(qg -> qg.setBuiltIn(true)); userSession.logIn("john").addPermission(ADMINISTER_QUALITY_GATES, organization);
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("id", qualityGate.getId().toString()) .setParam("id", qualityGate.getId().toString())
.setParam("name", "name") .setParam("name", "name")
.setParam("organization", organization.getKey())
.execute(); .execute();
} }


@Test @Test
public void fail_on_empty_name() { public void fail_on_empty_name() {
logAsQualityGateAdminister(); OrganizationDto organization = db.organizations().insert();
QualityGateDto qualityGate = db.qualityGates().insertQualityGate(); userSession.logIn("john").addPermission(ADMINISTER_QUALITY_GATES, organization);
QGateWithOrgDto qualityGate = db.qualityGates().insertQualityGate(organization);


expectedException.expect(IllegalArgumentException.class); expectedException.expect(IllegalArgumentException.class);
expectedException.expectMessage("Name can't be empty"); expectedException.expectMessage("Name can't be empty");


ws.newRequest() ws.newRequest()
.setParam("id", qualityGate.getId().toString()) .setParam("id", qualityGate.getId().toString())
.setParam("name", "") .setParam("name", "")
.setParam("organization", organization.getKey())
.execute(); .execute();
} }


@Test @Test
public void fail_when_using_existing_name() { public void fail_when_using_existing_name() {
logAsQualityGateAdminister(); OrganizationDto organization = db.organizations().insert();
QualityGateDto qualityGate1 = db.qualityGates().insertQualityGate(); userSession.logIn("john").addPermission(ADMINISTER_QUALITY_GATES, organization);
QualityGateDto qualityGate2 = db.qualityGates().insertQualityGate(); QGateWithOrgDto qualityGate1 = db.qualityGates().insertQualityGate(organization);
QGateWithOrgDto qualityGate2 = db.qualityGates().insertQualityGate(organization);


expectedException.expect(IllegalArgumentException.class); expectedException.expect(IllegalArgumentException.class);
expectedException.expectMessage(format("Name '%s' has already been taken", qualityGate2.getName())); expectedException.expectMessage(format("Name '%s' has already been taken", qualityGate2.getName()));


ws.newRequest() ws.newRequest()
.setParam("id", qualityGate1.getId().toString()) .setParam("id", qualityGate1.getId().toString())
.setParam("name", qualityGate2.getName()) .setParam("name", qualityGate2.getName())
.setParam("organization", organization.getKey())
.execute(); .execute();
} }


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


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


ws.newRequest() ws.newRequest()
.setParam("id", "123") .setParam("id", "123")
.setParam("name", "new name") .setParam("name", "new name")
.setParam("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, defaultOrganizationProvider.get().getUuid()); 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, qg -> qg.setName("old name"));


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


ws.newRequest() ws.newRequest()
.setParam("id", qualityGate.getId().toString()) .setParam("id", qualityGate.getId().toString())
.setParam("name", "new name") .setParam("name", "new name")
.setParam("organization", organization.getKey())
.execute(); .execute();
} }


private void logAsQualityGateAdminister() {
userSession.logIn("john").addPermission(ADMINISTER_QUALITY_GATES, defaultOrganizationProvider.get().getUuid());
}
} }

0 comments on commit a92d72f

Please sign in to comment.