@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(); }
@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"); }
@Test public void isSuccess_returns_true_if_http_response_returns_2xx_code() { WebhookDelivery delivery = newBuilderTemplate() .setHttpStatus(204) .build(); assertThat(delivery.isSuccess()).isTrue(); }
@Override public WebhookDelivery call(Webhook webhook, WebhookPayload payload) { WebhookDelivery.Builder builder = new WebhookDelivery.Builder(); long startedAt = system.now(); builder .setAt(startedAt) .setPayload(payload) .setWebhook(webhook); try { Request request = buildHttpRequest(webhook, payload); try (Response response = execute(request)) { builder.setHttpStatus(response.code()); } } catch (Exception e) { builder.setError(e); } return builder .setDurationInMs((int) (system.now() - startedAt)) .build(); }
@Override public WebhookDelivery call(Webhook webhook, WebhookPayload payload) { WebhookDelivery.Builder builder = new WebhookDelivery.Builder(); long startedAt = system.now(); builder .setAt(startedAt) .setPayload(payload) .setWebhook(webhook); try { HttpUrl url = HttpUrl.parse(webhook.getUrl()); if (url == null) { throw new IllegalArgumentException("Webhook URL is not valid: " + webhook.getUrl()); } builder.setEffectiveUrl(HttpUrlHelper.obfuscateCredentials(webhook.getUrl(), url)); Request request = buildHttpRequest(url, payload); try (Response response = execute(request)) { builder.setHttpStatus(response.code()); } } catch (Exception e) { builder.setError(e); } return builder .setDurationInMs((int) (system.now() - startedAt)) .build(); }
@Test public void isSuccess_returns_false_if_http_response_returns_error_status() { WebhookDelivery delivery = newBuilderTemplate() .setHttpStatus(404) .build(); assertThat(delivery.isSuccess()).isFalse(); }
@Test public void persist_effective_url_if_present() { when(uuidFactory.create()).thenReturn(DELIVERY_UUID); String effectiveUrl = randomAlphabetic(15); WebhookDelivery delivery = newBuilderTemplate() .setEffectiveUrl(effectiveUrl) .build(); underTest.persist(delivery); WebhookDeliveryDto dto = dbClient.webhookDeliveryDao().selectByUuid(dbSession, DELIVERY_UUID).get(); assertThat(dto.getUrl()).isEqualTo(effectiveUrl); }
@Test public void getErrorMessage_returns_empty_if_no_error() { WebhookDelivery delivery = newBuilderTemplate().build(); assertThat(delivery.getErrorMessage()).isEmpty(); }
@Test public void persist_error_stacktrace() { when(uuidFactory.create()).thenReturn(DELIVERY_UUID); WebhookDelivery delivery = newBuilderTemplate() .setError(new IOException("fail to connect")) .build(); underTest.persist(delivery); WebhookDeliveryDto dto = dbClient.webhookDeliveryDao().selectByUuid(dbSession, DELIVERY_UUID).get(); assertThat(dto.getErrorStacktrace()).contains("java.io.IOException", "fail to connect"); }
@Override public WebhookDelivery call(Webhook webhook, WebhookPayload payload) { Item item = requireNonNull(deliveries.poll(), "Queue is empty"); countSent.incrementAndGet(); return new WebhookDelivery.Builder() .setAt(item.at) .setHttpStatus(item.httpCode) .setDurationInMs(item.durationMs) .setError(item.throwable) .setPayload(payload) .setWebhook(webhook) .build(); }