private QualityGate toQualityGate(DbSession dbSession, QualityGateDto qualityGateDto) { Collection<QualityGateConditionDto> dtos = dbClient.gateConditionDao().selectForQualityGate(dbSession, qualityGateDto.getId()); Iterable<Condition> conditions = dtos.stream() .map(input -> metricRepository.getOptionalById(input.getMetricId()) .map(metric -> new Condition(metric, input.getOperator(), input.getErrorThreshold())) .orElse(null)) .filter(Objects::nonNull) .collect(toList(dtos.size())); return new QualityGate(qualityGateDto.getId(), qualityGateDto.getName(), conditions); }
private static Function<QualityGateConditionDto, ShowWsResponse.Condition> toWsCondition(Map<Integer, MetricDto> metricsById) { return condition -> { int metricId = (int) condition.getMetricId(); MetricDto metric = metricsById.get(metricId); checkState(metric != null, "Could not find metric with id %s", metricId); ShowWsResponse.Condition.Builder builder = ShowWsResponse.Condition.newBuilder() .setId(condition.getId()) .setMetric(metric.getKey()) .setOp(condition.getOperator()); ofNullable(condition.getErrorThreshold()).ifPresent(builder::setError); return builder.build(); }; }
@Test public void findById_ignores_conditions_on_missing_metrics() { when(qualityGateDao.selectById(any(), eq(SOME_ID))).thenReturn(QUALITY_GATE_DTO); when(qualityGateConditionDao.selectForQualityGate(any(), eq(SOME_ID))).thenReturn(ImmutableList.of(CONDITION_1, CONDITION_2)); // metrics are always supposed to be there when(metricRepository.getOptionalById(METRIC_ID_1)).thenReturn(Optional.empty()); when(metricRepository.getOptionalById(METRIC_ID_2)).thenReturn(Optional.of(METRIC_2)); Optional<QualityGate> res = underTest.findById(SOME_ID); assertThat(res).isPresent(); assertThat(res.get().getId()).isEqualTo(SOME_ID); assertThat(res.get().getName()).isEqualTo(SOME_NAME); assertThat(res.get().getConditions()).containsOnly( new Condition(METRIC_2, CONDITION_2.getOperator(), CONDITION_2.getErrorThreshold())); }
@Override public QualityGate loadQualityGate(DbSession dbSession, OrganizationDto organization, ComponentDto project, BranchDto branch) { if (branch.getBranchType() == BranchType.SHORT || branch.getBranchType() == BranchType.PULL_REQUEST) { return ShortLivingBranchQualityGate.GATE; } ComponentDto mainProject = project.getMainBranchProjectUuid() == null ? project : dbClient.componentDao().selectOrFailByKey(dbSession, project.getKey()); QualityGateDto gateDto = qGateFinder.getQualityGate(dbSession, organization, mainProject) .orElseThrow(() -> new IllegalStateException(format("Quality Gate not found for project %s", mainProject.getKey()))) .getQualityGate(); Collection<QualityGateConditionDto> conditionDtos = dbClient.gateConditionDao().selectForQualityGate(dbSession, gateDto.getId()); Set<Integer> metricIds = conditionDtos.stream().map(c -> (int) c.getMetricId()) .collect(toHashSet(conditionDtos.size())); Map<Integer, MetricDto> metricsById = dbClient.metricDao().selectByIds(dbSession, metricIds).stream() .collect(uniqueIndex(MetricDto::getId)); Set<Condition> conditions = conditionDtos.stream().map(conditionDto -> { String metricKey = metricsById.get((int) conditionDto.getMetricId()).getKey(); Condition.Operator operator = Condition.Operator.fromDbValue(conditionDto.getOperator()); return new Condition(metricKey, operator, conditionDto.getErrorThreshold()); }).collect(toHashSet(conditionDtos.size())); return new QualityGate(String.valueOf(gateDto.getId()), gateDto.getName(), conditions); }
@Test public void findById_returns_conditions_when_there_is_some_in_DB() { when(qualityGateDao.selectById(any(), eq(SOME_ID))).thenReturn(QUALITY_GATE_DTO); when(qualityGateConditionDao.selectForQualityGate(any(), eq(SOME_ID))).thenReturn(ImmutableList.of(CONDITION_1, CONDITION_2)); // metrics are always supposed to be there when(metricRepository.getOptionalById(METRIC_ID_1)).thenReturn(Optional.of(METRIC_1)); when(metricRepository.getOptionalById(METRIC_ID_2)).thenReturn(Optional.of(METRIC_2)); Optional<QualityGate> res = underTest.findById(SOME_ID); assertThat(res).isPresent(); assertThat(res.get().getId()).isEqualTo(SOME_ID); assertThat(res.get().getName()).isEqualTo(SOME_NAME); assertThat(res.get().getConditions()).containsOnly( new Condition(METRIC_1, CONDITION_1.getOperator(), CONDITION_1.getErrorThreshold()), new Condition(METRIC_2, CONDITION_2.getOperator(), CONDITION_2.getErrorThreshold())); }
@Test public void testSelectById() { dbTester.prepareDbUnit(getClass(), "selectForQualityGate.xml"); QualityGateConditionDto selectById = underTest.selectById(1L, dbSession); assertThat(selectById).isNotNull(); assertThat(selectById.getId()).isNotNull().isNotEqualTo(0L); assertThat(selectById.getMetricId()).isEqualTo(2L); assertThat(selectById.getOperator()).isEqualTo("<"); assertThat(selectById.getQualityGateId()).isEqualTo(1L); assertThat(selectById.getErrorThreshold()).isEqualTo("20"); assertThat(underTest.selectById(42L, dbSession)).isNull(); }
public static QualityGateCondition from(QualityGateConditionDto qualityGateConditionDto, Map<Long, String> mapping) { return new QualityGateCondition() .setId(qualityGateConditionDto.getId()) .setMetricKey(mapping.get(qualityGateConditionDto.getMetricId())) .setOperator(qualityGateConditionDto.getOperator()) .setErrorThreshold(qualityGateConditionDto.getErrorThreshold()); }
private void verifyCondition(QualityGateConditionDto dto, QualityGateDto qualityGate, MetricDto metric, String operator, String error) { QualityGateConditionDto reloaded = db.getDbClient().gateConditionDao().selectById(dto.getId(), db.getSession()); assertThat(reloaded.getQualityGateId()).isEqualTo(qualityGate.getId()); assertThat(reloaded.getMetricId()).isEqualTo(metric.getId().longValue()); assertThat(reloaded.getOperator()).isEqualTo(operator); assertThat(reloaded.getErrorThreshold()).isEqualTo(error); assertThat(dto.getQualityGateId()).isEqualTo(qualityGate.getId()); assertThat(dto.getMetricId()).isEqualTo(metric.getId().longValue()); assertThat(dto.getOperator()).isEqualTo(operator); assertThat(dto.getErrorThreshold()).isEqualTo(error); }
public QualityGateDto copy(DbSession dbSession, OrganizationDto organizationDto, QualityGateDto qualityGateDto, String destinationName) { QualityGateDto destinationGate = create(dbSession, organizationDto, destinationName); for (QualityGateConditionDto sourceCondition : dbClient.gateConditionDao().selectForQualityGate(dbSession, qualityGateDto.getId())) { dbClient.gateConditionDao().insert(new QualityGateConditionDto() .setQualityGateId(destinationGate.getId()) .setMetricId(sourceCondition.getMetricId()) .setOperator(sourceCondition.getOperator()) .setErrorThreshold(sourceCondition.getErrorThreshold()), dbSession); } return destinationGate; }
@Test public void show() { OrganizationDto organization = db.organizations().insert(); QGateWithOrgDto qualityGate = db.qualityGates().insertQualityGate(organization); db.qualityGates().setDefaultQualityGate(organization, qualityGate); MetricDto metric1 = db.measures().insertMetric(); MetricDto metric2 = db.measures().insertMetric(); QualityGateConditionDto condition1 = db.qualityGates().addCondition(qualityGate, metric1, c -> c.setOperator("GT")); QualityGateConditionDto condition2 = db.qualityGates().addCondition(qualityGate, metric2, c -> c.setOperator("LT")); ShowWsResponse response = ws.newRequest() .setParam("name", qualityGate.getName()) .setParam("organization", organization.getKey()) .executeProtobuf(ShowWsResponse.class); assertThat(response.getId()).isEqualTo(qualityGate.getId()); assertThat(response.getName()).isEqualTo(qualityGate.getName()); assertThat(response.getIsBuiltIn()).isFalse(); assertThat(response.getConditionsList()).hasSize(2); assertThat(response.getConditionsList()) .extracting(Condition::getId, Condition::getMetric, Condition::getOp, Condition::getError) .containsExactlyInAnyOrder( tuple(condition1.getId(), metric1.getKey(), "GT", condition1.getErrorThreshold()), tuple(condition2.getId(), metric2.getKey(), "LT", condition2.getErrorThreshold())); }
@Override public void handle(Request request, Response response) { int id = request.mandatoryParamAsInt(PARAM_ID); String metric = request.mandatoryParam(PARAM_METRIC); String operator = request.mandatoryParam(PARAM_OPERATOR); String error = request.mandatoryParam(PARAM_ERROR); try (DbSession dbSession = dbClient.openSession(false)) { OrganizationDto organization = wsSupport.getOrganization(dbSession, request); QualityGateConditionDto condition = wsSupport.getCondition(dbSession, id); QGateWithOrgDto qualityGateDto = dbClient.qualityGateDao().selectByOrganizationAndId(dbSession, organization, condition.getQualityGateId()); checkState(qualityGateDto != null, "Condition '%s' is linked to an unknown quality gate '%s'", id, condition.getQualityGateId()); wsSupport.checkCanEdit(qualityGateDto); QualityGateConditionDto updatedCondition = qualityGateConditionsUpdater.updateCondition(dbSession, condition, metric, operator, error); UpdateConditionResponse.Builder updateConditionResponse = UpdateConditionResponse.newBuilder() .setId(updatedCondition.getId()) .setMetric(updatedCondition.getMetricKey()) .setError(updatedCondition.getErrorThreshold()) .setOp(updatedCondition.getOperator()); writeProtobuf(updateConditionResponse.build(), request, response); dbSession.commit(); } } }
@Test public void copy() { OrganizationDto organization = db.organizations().insert(); userSession.addPermission(ADMINISTER_QUALITY_GATES, organization); QGateWithOrgDto qualityGate = db.qualityGates().insertQualityGate(organization); MetricDto metric = db.measures().insertMetric(); QualityGateConditionDto condition = db.qualityGates().addCondition(qualityGate, metric); ws.newRequest() .setParam(PARAM_ID, qualityGate.getId().toString()) .setParam(PARAM_NAME, "new-name") .setParam(PARAM_ORGANIZATION, organization.getKey()) .execute(); QGateWithOrgDto actual = db.getDbClient().qualityGateDao().selectByOrganizationAndName(dbSession, organization, "new-name"); assertThat(actual).isNotNull(); assertThat(actual.isBuiltIn()).isFalse(); assertThat(actual.getId()).isNotEqualTo(qualityGate.getId()); assertThat(actual.getUuid()).isNotEqualTo(qualityGate.getUuid()); assertThat(db.getDbClient().gateConditionDao().selectForQualityGate(dbSession, qualityGate.getId())) .extracting(c-> (int) c.getMetricId(), QualityGateConditionDto::getErrorThreshold) .containsExactlyInAnyOrder(tuple(metric.getId(), condition.getErrorThreshold())); }
@Override public void handle(Request request, Response response) { int gateId = request.mandatoryParamAsInt(PARAM_GATE_ID); String metric = request.mandatoryParam(PARAM_METRIC); String operator = request.mandatoryParam(PARAM_OPERATOR); String error = request.mandatoryParam(PARAM_ERROR); try (DbSession dbSession = dbClient.openSession(false)) { OrganizationDto organization = wsSupport.getOrganization(dbSession, request); QGateWithOrgDto qualityGate = wsSupport.getByOrganizationAndId(dbSession, organization, gateId); wsSupport.checkCanEdit(qualityGate); QualityGateConditionDto condition = qualityGateConditionsUpdater.createCondition(dbSession, qualityGate, metric, operator, error); CreateConditionResponse.Builder createConditionResponse = CreateConditionResponse.newBuilder() .setId(condition.getId()) .setMetric(condition.getMetricKey()) .setError(condition.getErrorThreshold()) .setOp(condition.getOperator()); writeProtobuf(createConditionResponse.build(), request, response); dbSession.commit(); } }
@Test public void loadQualityGate_on_long_branch_returns_organization_default_gate() { OrganizationDto organization = db.organizations().insert(); ComponentDto project = db.components().insertPublicProject(organization); BranchDto branch = newBranchDto(project).setBranchType(BranchType.LONG); db.components().insertProjectBranch(project, branch); MetricDto metric = db.measures().insertMetric(); QGateWithOrgDto gate = db.qualityGates().insertQualityGate(organization); db.qualityGates().setDefaultQualityGate(organization, gate); QualityGateConditionDto condition = db.qualityGates().addCondition(gate, metric); QualityGate result = underTest.loadQualityGate(db.getSession(), organization, project, branch); assertThat(result.getId()).isEqualTo("" + gate.getId()); assertThat(result.getConditions()) .extracting(Condition::getMetricKey, Condition::getOperator, Condition::getErrorThreshold) .containsExactlyInAnyOrder( tuple(metric.getKey(), Condition.Operator.fromDbValue(condition.getOperator()), condition.getErrorThreshold())); }
private QualityGate toQualityGate(DbSession dbSession, QualityGateDto qualityGateDto) { Collection<QualityGateConditionDto> dtos = dbClient.gateConditionDao().selectForQualityGate(dbSession, qualityGateDto.getId()); Iterable<Condition> conditions = dtos.stream() .map(input -> metricRepository.getOptionalById(input.getMetricId()) .map(metric -> new Condition(metric, input.getOperator(), input.getErrorThreshold(), input.getWarningThreshold(), input.getPeriod() != null)) .orElse(null)) .filter(Objects::nonNull) .collect(toList(dtos.size())); return new QualityGate(qualityGateDto.getId(), qualityGateDto.getName(), conditions); }
@Override public QualityGate loadQualityGate(DbSession dbSession, OrganizationDto organization, ComponentDto project, BranchDto branch) { if (branch.getBranchType() == BranchType.SHORT || branch.getBranchType() == BranchType.PULL_REQUEST) { return ShortLivingBranchQualityGate.GATE; } ComponentDto mainProject = project.getMainBranchProjectUuid() == null ? project : dbClient.componentDao().selectOrFailByKey(dbSession, project.getKey()); QualityGateDto gateDto = qGateFinder.getQualityGate(dbSession, organization, mainProject).getQualityGate(); Collection<QualityGateConditionDto> conditionDtos = dbClient.gateConditionDao().selectForQualityGate(dbSession, gateDto.getId()); Set<Integer> metricIds = conditionDtos.stream().map(c -> (int) c.getMetricId()) .collect(toHashSet(conditionDtos.size())); Map<Integer, MetricDto> metricsById = dbClient.metricDao().selectByIds(dbSession, metricIds).stream() .collect(uniqueIndex(MetricDto::getId)); Set<Condition> conditions = conditionDtos.stream().map(conditionDto -> { String metricKey = metricsById.get((int) conditionDto.getMetricId()).getKey(); Condition.Operator operator = Condition.Operator.fromDbValue(conditionDto.getOperator()); boolean onLeak = Objects.equals(conditionDto.getPeriod(), 1); return new Condition(metricKey, operator, conditionDto.getErrorThreshold(), conditionDto.getWarningThreshold(), onLeak); }).collect(toHashSet(conditionDtos.size())); return new QualityGate(String.valueOf(gateDto.getId()), gateDto.getName(), conditions); }
public static QualityGateCondition from(QualityGateConditionDto qualityGateConditionDto, Map<Long, String> mapping) { return new QualityGateCondition() .setId(qualityGateConditionDto.getId()) .setMetricKey(mapping.get(qualityGateConditionDto.getMetricId())) .setOperator(qualityGateConditionDto.getOperator()) .setPeriod(qualityGateConditionDto.getPeriod()) .setErrorThreshold(qualityGateConditionDto.getErrorThreshold()) .setWarningThreshold(qualityGateConditionDto.getWarningThreshold()); }
private static Function<QualityGateConditionDto, ShowWsResponse.Condition> toWsCondition(Map<Integer, MetricDto> metricsById) { return condition -> { int metricId = (int) condition.getMetricId(); MetricDto metric = metricsById.get(metricId); checkState(metric != null, "Could not find metric with id %s", metricId); ShowWsResponse.Condition.Builder builder = ShowWsResponse.Condition.newBuilder() .setId(condition.getId()) .setMetric(metric.getKey()) .setOp(condition.getOperator()); setNullable(condition.getPeriod(), builder::setPeriod); setNullable(condition.getErrorThreshold(), builder::setError); setNullable(condition.getWarningThreshold(), builder::setWarning); return builder.build(); }; }
public QualityGateDto copy(DbSession dbSession, OrganizationDto organizationDto, QualityGateDto qualityGateDto, String destinationName) { QualityGateDto destinationGate = create(dbSession, organizationDto, destinationName); for (QualityGateConditionDto sourceCondition : dbClient.gateConditionDao().selectForQualityGate(dbSession, qualityGateDto.getId())) { dbClient.gateConditionDao().insert(new QualityGateConditionDto().setQualityGateId(destinationGate.getId()) .setMetricId(sourceCondition.getMetricId()).setOperator(sourceCondition.getOperator()) .setWarningThreshold(sourceCondition.getWarningThreshold()).setErrorThreshold(sourceCondition.getErrorThreshold()).setPeriod(sourceCondition.getPeriod()), dbSession); } return destinationGate; }
@Override public void handle(Request request, Response response) { int gateId = request.mandatoryParamAsInt(PARAM_GATE_ID); String metric = request.mandatoryParam(PARAM_METRIC); String operator = request.mandatoryParam(PARAM_OPERATOR); String warning = request.param(PARAM_WARNING); String error = request.param(PARAM_ERROR); Integer period = request.paramAsInt(PARAM_PERIOD); try (DbSession dbSession = dbClient.openSession(false)) { OrganizationDto organization = wsSupport.getOrganization(dbSession, request); QGateWithOrgDto qualityGate = qualityGateFinder.getByOrganizationAndId(dbSession, organization, gateId); wsSupport.checkCanEdit(qualityGate); QualityGateConditionDto condition = qualityGateConditionsUpdater.createCondition(dbSession, qualityGate, metric, operator, emptyToNull(warning), emptyToNull(error), period); CreateConditionResponse.Builder createConditionResponse = CreateConditionResponse.newBuilder() .setId(condition.getId()) .setMetric(condition.getMetricKey()) .setOp(condition.getOperator()); setNullable(condition.getWarningThreshold(), createConditionResponse::setWarning); setNullable(condition.getErrorThreshold(), createConditionResponse::setError); setNullable(condition.getPeriod(), createConditionResponse::setPeriod); writeProtobuf(createConditionResponse.build(), request, response); dbSession.commit(); } }