@Override protected void configureModule() { add( WebhookCallerImpl.class, WebhookDeliveryStorage.class, WebHooksImpl.class, WebhookPayloadFactoryImpl.class); } }
public WebhookCallerImpl(System2 system, OkHttpClient okHttpClient) { this.system = system; this.okHttpClient = newClientWithoutRedirect(okHttpClient); }
public WebhookDelivery build() { return new WebhookDelivery(this); } }
private static void log(WebhookDelivery delivery) { Optional<String> error = delivery.getErrorMessage(); if (error.isPresent()) { LOGGER.debug("Failed to send webhook '{}' | url={} | message={}", delivery.getWebhook().getName(), delivery.getWebhook().getUrl(), error.get()); } else { LOGGER.debug("Sent webhook '{}' | url={} | time={}ms | status={}", delivery.getWebhook().getName(), delivery.getWebhook().getUrl(), delivery.getDurationInMs().orElse(-1), delivery.getHttpStatus().orElse(-1)); } }
private static ProjectAnalysis newAnalysis(@Nullable CeTask task, @Nullable EvaluatedQualityGate gate, @Nullable Branch branch, @Nullable Long analysisDate, Map<String, String> scannerProperties) { return new ProjectAnalysis(new Project("P1_UUID", PROJECT_KEY, "Project One"), task, analysisDate == null ? null : new Analysis("A_UUID1", analysisDate), branch, gate, analysisDate, scannerProperties); } }
@Override public void finished(ProjectAnalysis analysis) { webHooks.sendProjectAnalysisUpdate( new WebHooks.Analysis( analysis.getProject().getUuid(), analysis.getAnalysis().map(org.sonar.api.ce.posttask.Analysis::getAnalysisUuid).orElse(null), analysis.getCeTask().getId()), () -> payloadFactory.create(convert(analysis))); }
private void verifyWebhookCalled(ComponentAndBranch componentAndBranch, SnapshotDto analysis, ComponentDto project) { verify(webHooks).isEnabled(project); verify(webHooks).sendProjectAnalysisUpdate( eq(new WebHooks.Analysis(componentAndBranch.uuid(), analysis.getUuid(), null)), any()); }
private void writeBranch(JsonWriter writer, Project project, Branch branch) { writer .name("branch") .beginObject() .prop("name", branch.getName().orElse(null)) .prop("type", branch.getType().name()) .prop("isMain", branch.isMain()) .prop("url", branchUrlOf(project, branch)) .endObject(); }
private void callWebhook(DbSession dbSession, QGChangeEvent event, @Nullable EvaluatedQualityGate evaluatedQualityGate) { webhooks.sendProjectAnalysisUpdate( new WebHooks.Analysis(event.getBranch().getUuid(), event.getAnalysis().getUuid(), null), () -> buildWebHookPayload(dbSession, event, evaluatedQualityGate)); }
@Test public void isSuccess_returns_true_if_http_response_returns_2xx_code() { WebhookDelivery delivery = newBuilderTemplate() .setHttpStatus(204) .build(); assertThat(delivery.isSuccess()).isTrue(); }
@Test public void isSuccess_returns_false_if_failed_to_send_http_request() { WebhookDelivery delivery = newBuilderTemplate() .setError(new IOException("Fail to connect")) .build(); assertThat(delivery.isSuccess()).isFalse(); }
@Test public void getErrorMessage_returns_root_cause_message_if_error() { Exception rootCause = new IOException("fail to connect"); Exception cause = new IOException("nested", rootCause); WebhookDelivery delivery = newBuilderTemplate() .setError(cause) .build(); assertThat(delivery.getErrorMessage().get()).isEqualTo("fail to connect"); }
private void writeProject(ProjectAnalysis analysis, JsonWriter writer, Project project) { writer .name("project") .beginObject() .prop("key", project.getKey()) .prop("name", analysis.getProject().getName()) .prop("url", projectUrlOf(project)) .endObject(); }
@Test public void getErrorMessage_returns_empty_if_no_error() { WebhookDelivery delivery = newBuilderTemplate().build(); assertThat(delivery.getErrorMessage()).isEmpty(); }
public static String obfuscateCredentials(String originalUrl) { HttpUrl parsedUrl = HttpUrl.parse(originalUrl); if (parsedUrl != null) { return obfuscateCredentials(originalUrl, parsedUrl); } return originalUrl; }
@Test public void onIssueChanges_has_no_effect_if_event_has_neither_previousQGStatus_nor_qualityGate() { Configuration configuration = mock(Configuration.class); QGChangeEvent qualityGateEvent = newQGChangeEvent(configuration, null, null); mockWebhookEnabled(qualityGateEvent.getProject()); underTest.onIssueChanges(qualityGateEvent, CHANGED_ISSUES_ARE_IGNORED); verifyZeroInteractions(webhookPayloadFactory, mockedDbClient); }
public TestWebhookCaller enqueueFailure(long at, Throwable t) { deliveries.add(new Item(at, null, null, t)); return this; }
@Test public void isSuccess_returns_false_if_http_response_returns_error_status() { WebhookDelivery delivery = newBuilderTemplate() .setHttpStatus(404) .build(); assertThat(delivery.isSuccess()).isFalse(); }