private static Request buildHttpRequest(HttpUrl url, WebhookPayload payload) { Request.Builder request = new Request.Builder(); request.url(url); request.header(PROJECT_KEY_HEADER, payload.getProjectKey()); if (isNotEmpty(url.username())) { request.header("Authorization", Credentials.basic(url.username(), url.password(), UTF_8)); } RequestBody body = RequestBody.create(JSON, payload.getJson()); request.post(body); return request.build(); }
@Override public WebhookPayload create(ProjectAnalysis analysis) { Writer string = new StringWriter(); try (JsonWriter writer = JsonWriter.of(string)) { writer.beginObject(); writeServer(writer); writeTask(writer, analysis.getCeTask()); writeDates(writer, analysis, system2); writeProject(analysis, writer, analysis.getProject()); analysis.getBranch().ifPresent(b -> writeBranch(writer, analysis.getProject(), b)); analysis.getQualityGate().ifPresent(qualityGate -> writeQualityGate(writer, qualityGate)); writeAnalysisProperties(writer, analysis.getProperties()); writer.endObject().close(); return new WebhookPayload(analysis.getProject().getKey(), string.toString()); } }
@Test public void persist_generates_uuid_then_inserts_record() { when(uuidFactory.create()).thenReturn(DELIVERY_UUID); WebhookDelivery delivery = newBuilderTemplate().build(); underTest.persist(delivery); WebhookDeliveryDto dto = dbClient.webhookDeliveryDao().selectByUuid(dbSession, DELIVERY_UUID).get(); assertThat(dto.getUuid()).isEqualTo(DELIVERY_UUID); assertThat(dto.getWebhookUuid()).isEqualTo("WEBHOOK_UUID_1"); assertThat(dto.getComponentUuid()).isEqualTo(delivery.getWebhook().getComponentUuid()); assertThat(dto.getCeTaskUuid()).isEqualTo(delivery.getWebhook().getCeTaskUuid().get()); assertThat(dto.getName()).isEqualTo(delivery.getWebhook().getName()); assertThat(dto.getUrl()).isEqualTo(delivery.getWebhook().getUrl()); assertThat(dto.getCreatedAt()).isEqualTo(delivery.getAt()); assertThat(dto.getHttpStatus()).isEqualTo(delivery.getHttpStatus().get()); assertThat(dto.getDurationMs()).isEqualTo(delivery.getDurationInMs().get()); assertThat(dto.getPayload()).isEqualTo(delivery.getPayload().getJson()); assertThat(dto.getErrorStacktrace()).isNull(); }
private WebhookDeliveryDto toDto(WebhookDelivery delivery) { WebhookDeliveryDto dto = new WebhookDeliveryDto(); dto.setUuid(uuidFactory.create()); dto.setWebhookUuid(delivery.getWebhook().getUuid()); dto.setComponentUuid(delivery.getWebhook().getComponentUuid()); delivery.getWebhook().getCeTaskUuid().ifPresent(dto::setCeTaskUuid); delivery.getWebhook().getAnalysisUuid().ifPresent(dto::setAnalysisUuid); dto.setName(delivery.getWebhook().getName()); dto.setUrl(delivery.getEffectiveUrl().orElse(delivery.getWebhook().getUrl())); dto.setSuccess(delivery.isSuccess()); dto.setHttpStatus(delivery.getHttpStatus().orElse(null)); dto.setDurationMs(delivery.getDurationInMs().orElse(null)); dto.setErrorStacktrace(delivery.getError().map(Throwables::getStackTraceAsString).orElse(null)); dto.setPayload(delivery.getPayload().getJson()); dto.setCreatedAt(delivery.getAt()); return dto; } }
@Test public void create_payload_for_no_analysis_date() { CeTask ceTask = new CeTask("#1", CeTask.Status.FAILED); ProjectAnalysis analysis = newAnalysis(ceTask, null, null, null, emptyMap()); WebhookPayload payload = underTest.create(analysis); assertThat(payload.getProjectKey()).isEqualTo(PROJECT_KEY); assertJson(payload.getJson()) .isSimilarTo("{" + " \"serverUrl\": \"http://foo\"," + " \"taskId\": \"#1\"," + " \"status\": \"FAILED\"," + " \"changedAt\": \"1970-01-01T01:25:00+0100\"," + " \"project\": {" + " \"key\": \"P1\"," + " \"name\": \"Project One\"" + " }," + " \"properties\": {" + " }" + "}"); }
@Test public void create_without_ce_task() { ProjectAnalysis analysis = newAnalysis(null, null, null, null, emptyMap()); WebhookPayload payload = underTest.create(analysis); String json = payload.getJson(); assertThat(json).doesNotContain("taskId"); assertJson(json) .isSimilarTo("{" + " \"serverUrl\": \"http://foo\"," + " \"status\": \"SUCCESS\"," + " \"changedAt\": \"1970-01-01T01:25:00+0100\"," + " \"project\": {" + " \"key\": \"P1\"," + " \"name\": \"Project One\"" + " }," + " \"properties\": {" + " }" + "}"); }
@Override public WebhookPayload create(ProjectAnalysis analysis) { Writer string = new StringWriter(); try (JsonWriter writer = JsonWriter.of(string)) { writer.beginObject(); writeServer(writer); writeTask(writer, analysis.getCeTask()); writeDates(writer, analysis, system2); writeProject(analysis, writer, analysis.getProject()); analysis.getBranch().ifPresent(b -> writeBranch(writer, analysis.getProject(), b)); analysis.getQualityGate().ifPresent(qualityGate -> writeQualityGate(writer, qualityGate)); writeAnalysisProperties(writer, analysis.getProperties()); writer.endObject().close(); return new WebhookPayload(analysis.getProject().getKey(), string.toString()); } }
@Test public void send_posts_payload_to_http_server() throws Exception { Webhook webhook = new Webhook(WEBHOOK_UUID, PROJECT_UUID, CE_TASK_UUID, RandomStringUtils.randomAlphanumeric(40),"my-webhook", server.url("/ping").toString()); server.enqueue(new MockResponse().setBody("pong").setResponseCode(201)); WebhookDelivery delivery = newSender().call(webhook, PAYLOAD); assertThat(delivery.getHttpStatus()).hasValue(201); assertThat(delivery.getWebhook().getUuid()).isEqualTo(WEBHOOK_UUID); assertThat(delivery.getDurationInMs().get()).isGreaterThanOrEqualTo(0); assertThat(delivery.getError()).isEmpty(); assertThat(delivery.getAt()).isEqualTo(NOW); assertThat(delivery.getWebhook()).isSameAs(webhook); assertThat(delivery.getPayload()).isSameAs(PAYLOAD); RecordedRequest recordedRequest = server.takeRequest(); assertThat(recordedRequest.getMethod()).isEqualTo("POST"); assertThat(recordedRequest.getPath()).isEqualTo("/ping"); assertThat(recordedRequest.getBody().readUtf8()).isEqualTo(PAYLOAD.getJson()); assertThat(recordedRequest.getHeader("User-Agent")).isEqualTo("SonarQube/6.2"); assertThat(recordedRequest.getHeader("Content-Type")).isEqualTo("application/json; charset=utf-8"); assertThat(recordedRequest.getHeader("X-SonarQube-Project")).isEqualTo(PAYLOAD.getProjectKey()); }
private WebhookDeliveryDto toDto(WebhookDelivery delivery) { WebhookDeliveryDto dto = new WebhookDeliveryDto(); dto.setUuid(uuidFactory.create()); dto.setWebhookUuid(delivery.getWebhook().getUuid()); dto.setComponentUuid(delivery.getWebhook().getComponentUuid()); delivery.getWebhook().getCeTaskUuid().ifPresent(dto::setCeTaskUuid); delivery.getWebhook().getAnalysisUuid().ifPresent(dto::setAnalysisUuid); dto.setName(delivery.getWebhook().getName()); dto.setUrl(delivery.getWebhook().getUrl()); dto.setSuccess(delivery.isSuccess()); dto.setHttpStatus(delivery.getHttpStatus().orElse(null)); dto.setDurationMs(delivery.getDurationInMs().orElse(null)); dto.setErrorStacktrace(delivery.getError().map(Throwables::getStackTraceAsString).orElse(null)); dto.setPayload(delivery.getPayload().getJson()); dto.setCreatedAt(delivery.getAt()); return dto; } }
private static Request buildHttpRequest(Webhook webhook, WebhookPayload payload) { HttpUrl url = HttpUrl.parse(webhook.getUrl()); if (url == null) { throw new IllegalArgumentException("Webhook URL is not valid: " + webhook.getUrl()); } Request.Builder request = new Request.Builder(); request.url(url); request.header(PROJECT_KEY_HEADER, payload.getProjectKey()); if (isNotEmpty(url.username())) { request.header("Authorization", Credentials.basic(url.username(), url.password(), UTF_8)); } RequestBody body = RequestBody.create(JSON, payload.getJson()); request.post(body); return request.build(); }