diff --git a/src/main/java/co/lettermint/api/ApiClient.java b/src/main/java/co/lettermint/api/ApiClient.java index cc81c56..641c305 100644 --- a/src/main/java/co/lettermint/api/ApiClient.java +++ b/src/main/java/co/lettermint/api/ApiClient.java @@ -141,8 +141,8 @@ public RescheduleMessageResponse reschedule(String messageId, RescheduleMessageR return client.patch("/messages/" + segment(messageId), payload, RescheduleMessageResponse.class); } - public RescheduleMessageResponse cancel(String messageId) { - return client.post("/messages/" + segment(messageId) + "/cancel", null, RescheduleMessageResponse.class); + public CancelScheduledMessageResponse cancel(String messageId) { + return client.post("/messages/" + segment(messageId) + "/cancel", null, CancelScheduledMessageResponse.class); } public ProcessInboundMessageResponse process(String messageId) { diff --git a/src/main/java/co/lettermint/endpoints/EmailEndpoint.java b/src/main/java/co/lettermint/endpoints/EmailEndpoint.java index 6d40b3d..96936cd 100644 --- a/src/main/java/co/lettermint/endpoints/EmailEndpoint.java +++ b/src/main/java/co/lettermint/endpoints/EmailEndpoint.java @@ -31,6 +31,7 @@ public class EmailEndpoint extends Endpoint { private String tag; private List tags; private Map settings; + private String sandboxResult; private String idempotencyKey; public EmailEndpoint(LettermintClient client) { @@ -58,6 +59,7 @@ private void reset() { this.tag = null; this.tags = new ArrayList<>(); this.settings = null; + this.sandboxResult = null; this.idempotencyKey = null; } @@ -257,6 +259,14 @@ public EmailEndpoint settings(Map settings) { return this; } + /** + * Select the simulated result for a Sandbox project message. + */ + public EmailEndpoint sandboxResult(String sandboxResult) { + this.sandboxResult = sandboxResult; + return this; + } + /** * Set an idempotency key for the request. */ @@ -369,6 +379,10 @@ private Map buildPayload() { payload.put("settings", settings); } + if (sandboxResult != null) { + payload.put("sandbox_result", sandboxResult); + } + return payload; } } diff --git a/src/main/java/co/lettermint/models/SendEmailResponse.java b/src/main/java/co/lettermint/models/SendEmailResponse.java index a990aa7..a8182b4 100644 --- a/src/main/java/co/lettermint/models/SendEmailResponse.java +++ b/src/main/java/co/lettermint/models/SendEmailResponse.java @@ -15,6 +15,12 @@ public class SendEmailResponse { @JsonProperty("status") private String status; + @JsonProperty("sandbox") + private Boolean sandbox; + + @JsonProperty("sandbox_result") + private String sandboxResult; + public SendEmailResponse() { } @@ -39,11 +45,29 @@ public void setStatus(String status) { this.status = status; } + public Boolean getSandbox() { + return sandbox; + } + + public void setSandbox(Boolean sandbox) { + this.sandbox = sandbox; + } + + public String getSandboxResult() { + return sandboxResult; + } + + public void setSandboxResult(String sandboxResult) { + this.sandboxResult = sandboxResult; + } + @Override public String toString() { return "SendEmailResponse{" + "messageId='" + messageId + '\'' + ", status='" + status + '\'' + + ", sandbox=" + sandbox + + ", sandboxResult='" + sandboxResult + '\'' + '}'; } } diff --git a/src/main/java/co/lettermint/models/api/CancelScheduledMessageResponse.java b/src/main/java/co/lettermint/models/api/CancelScheduledMessageResponse.java new file mode 100644 index 0000000..4ab0526 --- /dev/null +++ b/src/main/java/co/lettermint/models/api/CancelScheduledMessageResponse.java @@ -0,0 +1,16 @@ +package co.lettermint.models.api; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +public class CancelScheduledMessageResponse { + @JsonProperty("message_id") + public String messageId; + + @JsonProperty("status") + public String status; + + @JsonProperty("scheduled_at") + public String scheduledAt; +} diff --git a/src/main/java/co/lettermint/models/api/DeliveryMode.java b/src/main/java/co/lettermint/models/api/DeliveryMode.java new file mode 100644 index 0000000..7af48f2 --- /dev/null +++ b/src/main/java/co/lettermint/models/api/DeliveryMode.java @@ -0,0 +1,8 @@ +package co.lettermint.models.api; + +public final class DeliveryMode { + public static final String LIVE = "live"; + public static final String SANDBOX = "sandbox"; + + private DeliveryMode() {} +} diff --git a/src/main/java/co/lettermint/models/api/MessageData.java b/src/main/java/co/lettermint/models/api/MessageData.java index 3d92447..40d737f 100644 --- a/src/main/java/co/lettermint/models/api/MessageData.java +++ b/src/main/java/co/lettermint/models/api/MessageData.java @@ -66,4 +66,10 @@ public class MessageData { @JsonProperty("created_at") public String createdAt; + + @JsonProperty("delivery_mode") + public String deliveryMode; + + @JsonProperty("sandbox_result") + public String sandboxResult; } diff --git a/src/main/java/co/lettermint/models/api/MessageListData.java b/src/main/java/co/lettermint/models/api/MessageListData.java index eddc6e3..30efbf6 100644 --- a/src/main/java/co/lettermint/models/api/MessageListData.java +++ b/src/main/java/co/lettermint/models/api/MessageListData.java @@ -54,4 +54,10 @@ public class MessageListData { @JsonProperty("created_at") public String createdAt; + + @JsonProperty("delivery_mode") + public String deliveryMode; + + @JsonProperty("sandbox_result") + public String sandboxResult; } diff --git a/src/main/java/co/lettermint/models/api/MessageRecipientData.java b/src/main/java/co/lettermint/models/api/MessageRecipientData.java index aded76e..c15c50f 100644 --- a/src/main/java/co/lettermint/models/api/MessageRecipientData.java +++ b/src/main/java/co/lettermint/models/api/MessageRecipientData.java @@ -10,4 +10,7 @@ public class MessageRecipientData { @JsonProperty("name") public String name; + + @JsonProperty("sandbox_result") + public String sandboxResult; } diff --git a/src/main/java/co/lettermint/models/api/ProjectData.java b/src/main/java/co/lettermint/models/api/ProjectData.java index 3734281..ee95fd5 100644 --- a/src/main/java/co/lettermint/models/api/ProjectData.java +++ b/src/main/java/co/lettermint/models/api/ProjectData.java @@ -50,4 +50,7 @@ public class ProjectData { @JsonProperty("updated_at") public String updatedAt; + + @JsonProperty("delivery_mode") + public String deliveryMode; } diff --git a/src/main/java/co/lettermint/models/api/RouteData.java b/src/main/java/co/lettermint/models/api/RouteData.java index 240c937..ffe00b6 100644 --- a/src/main/java/co/lettermint/models/api/RouteData.java +++ b/src/main/java/co/lettermint/models/api/RouteData.java @@ -28,6 +28,9 @@ public class RouteData { @JsonProperty("inbound_address") public String inboundAddress; + @JsonProperty("inbound_mx_hostname") + public String inboundMxHostname; + @JsonProperty("inbound_domain") public String inboundDomain; diff --git a/src/main/java/co/lettermint/models/api/SandboxResult.java b/src/main/java/co/lettermint/models/api/SandboxResult.java new file mode 100644 index 0000000..a75a163 --- /dev/null +++ b/src/main/java/co/lettermint/models/api/SandboxResult.java @@ -0,0 +1,17 @@ +package co.lettermint.models.api; + +public final class SandboxResult { + public static final String DELIVERED = "delivered"; + public static final String HARDBOUNCED = "hard_bounced"; + public static final String SOFTBOUNCED = "soft_bounced"; + public static final String DEFERRED = "deferred"; + public static final String FAILED = "failed"; + public static final String SUPPRESSED = "suppressed"; + public static final String SPAMCOMPLAINT = "spam_complaint"; + public static final String AUTOREPLIED = "auto_replied"; + public static final String OPENED = "opened"; + public static final String CLICKED = "clicked"; + public static final String UNSUBSCRIBED = "unsubscribed"; + + private SandboxResult() {} +} diff --git a/src/main/java/co/lettermint/models/api/SendMailRequest.java b/src/main/java/co/lettermint/models/api/SendMailRequest.java index 22aadd2..e6980c3 100644 --- a/src/main/java/co/lettermint/models/api/SendMailRequest.java +++ b/src/main/java/co/lettermint/models/api/SendMailRequest.java @@ -54,4 +54,7 @@ public class SendMailRequest { @JsonProperty("attachments") public List> attachments; + + @JsonProperty("sandbox_result") + public String sandboxResult; } diff --git a/src/main/java/co/lettermint/models/api/SendMailResponse.java b/src/main/java/co/lettermint/models/api/SendMailResponse.java index 91f906d..81ad75e 100644 --- a/src/main/java/co/lettermint/models/api/SendMailResponse.java +++ b/src/main/java/co/lettermint/models/api/SendMailResponse.java @@ -13,4 +13,10 @@ public class SendMailResponse { @JsonProperty("scheduled_at") public String scheduledAt; + + @JsonProperty("sandbox") + public Boolean sandbox; + + @JsonProperty("sandbox_result") + public String sandboxResult; } diff --git a/src/main/java/co/lettermint/models/api/StoreProjectData.java b/src/main/java/co/lettermint/models/api/StoreProjectData.java index 2bb93cb..5ac9f69 100644 --- a/src/main/java/co/lettermint/models/api/StoreProjectData.java +++ b/src/main/java/co/lettermint/models/api/StoreProjectData.java @@ -16,4 +16,7 @@ public class StoreProjectData { @JsonProperty("short_token") public Boolean shortToken; + + @JsonProperty("delivery_mode") + public String deliveryMode; } diff --git a/src/main/java/co/lettermint/models/api/StoreSuppressionData.java b/src/main/java/co/lettermint/models/api/StoreSuppressionData.java index ebc3313..de4b5ce 100644 --- a/src/main/java/co/lettermint/models/api/StoreSuppressionData.java +++ b/src/main/java/co/lettermint/models/api/StoreSuppressionData.java @@ -23,4 +23,7 @@ public class StoreSuppressionData { @JsonProperty("project_id") public String projectId; + + @JsonProperty("applies_to") + public String appliesTo; } diff --git a/src/main/java/co/lettermint/models/api/StoreWebhookData.java b/src/main/java/co/lettermint/models/api/StoreWebhookData.java index 82f3195..7c4ca5f 100644 --- a/src/main/java/co/lettermint/models/api/StoreWebhookData.java +++ b/src/main/java/co/lettermint/models/api/StoreWebhookData.java @@ -6,9 +6,6 @@ @JsonIgnoreProperties(ignoreUnknown = true) public class StoreWebhookData { - @JsonProperty("route_id") - public String routeId; - @JsonProperty("name") public String name; @@ -23,4 +20,19 @@ public class StoreWebhookData { @JsonProperty("include_machine_events") public Boolean includeMachineEvents; + + @JsonProperty("scope") + public String scope; + + @JsonProperty("project_ids") + public List projectIds; + + @JsonProperty("route_ids") + public List routeIds; + + @JsonProperty("route_id") + public String routeId; + + @JsonProperty("delivery_mode_filter") + public String deliveryModeFilter; } diff --git a/src/main/java/co/lettermint/models/api/SuppressedRecipientData.java b/src/main/java/co/lettermint/models/api/SuppressedRecipientData.java index 4f0c819..5ed02d5 100644 --- a/src/main/java/co/lettermint/models/api/SuppressedRecipientData.java +++ b/src/main/java/co/lettermint/models/api/SuppressedRecipientData.java @@ -20,6 +20,9 @@ public class SuppressedRecipientData { @JsonProperty("scope") public String scope; + @JsonProperty("applies_to") + public String appliesTo; + @JsonProperty("project_id") public String projectId; @@ -31,7 +34,4 @@ public class SuppressedRecipientData { @JsonProperty("created_at") public String createdAt; - - @JsonProperty("updated_at") - public String updatedAt; } diff --git a/src/main/java/co/lettermint/models/api/SuppressionAppliesTo.java b/src/main/java/co/lettermint/models/api/SuppressionAppliesTo.java new file mode 100644 index 0000000..5502e54 --- /dev/null +++ b/src/main/java/co/lettermint/models/api/SuppressionAppliesTo.java @@ -0,0 +1,8 @@ +package co.lettermint.models.api; + +public final class SuppressionAppliesTo { + public static final String ALL = "all"; + public static final String BROADCAST = "broadcast"; + + private SuppressionAppliesTo() {} +} diff --git a/src/main/java/co/lettermint/models/api/SuppressionScope.java b/src/main/java/co/lettermint/models/api/SuppressionScope.java index 322672f..dd20e96 100644 --- a/src/main/java/co/lettermint/models/api/SuppressionScope.java +++ b/src/main/java/co/lettermint/models/api/SuppressionScope.java @@ -1,7 +1,6 @@ package co.lettermint.models.api; public final class SuppressionScope { - public static final String GLOBAL = "global"; public static final String TEAM = "team"; public static final String PROJECT = "project"; public static final String ROUTE = "route"; diff --git a/src/main/java/co/lettermint/models/api/UpdateProjectData.java b/src/main/java/co/lettermint/models/api/UpdateProjectData.java index 2c4a84e..e6a14f0 100644 --- a/src/main/java/co/lettermint/models/api/UpdateProjectData.java +++ b/src/main/java/co/lettermint/models/api/UpdateProjectData.java @@ -16,4 +16,7 @@ public class UpdateProjectData { @JsonProperty("default_route_id") public String defaultRouteId; + + @JsonProperty("delivery_mode") + public String deliveryMode; } diff --git a/src/main/java/co/lettermint/models/api/UpdateWebhookData.java b/src/main/java/co/lettermint/models/api/UpdateWebhookData.java index 16e1de3..ca5c569 100644 --- a/src/main/java/co/lettermint/models/api/UpdateWebhookData.java +++ b/src/main/java/co/lettermint/models/api/UpdateWebhookData.java @@ -20,4 +20,19 @@ public class UpdateWebhookData { @JsonProperty("include_machine_events") public Boolean includeMachineEvents; + + @JsonProperty("scope") + public String scope; + + @JsonProperty("project_ids") + public List projectIds; + + @JsonProperty("route_ids") + public List routeIds; + + @JsonProperty("route_id") + public String routeId; + + @JsonProperty("delivery_mode_filter") + public String deliveryModeFilter; } diff --git a/src/main/java/co/lettermint/models/api/WebhookData.java b/src/main/java/co/lettermint/models/api/WebhookData.java index f5546ce..14fc792 100644 --- a/src/main/java/co/lettermint/models/api/WebhookData.java +++ b/src/main/java/co/lettermint/models/api/WebhookData.java @@ -9,6 +9,15 @@ public class WebhookData { @JsonProperty("id") public String id; + @JsonProperty("scope") + public String scope; + + @JsonProperty("project_ids") + public List projectIds; + + @JsonProperty("route_ids") + public List routeIds; + @JsonProperty("route_id") public String routeId; @@ -27,9 +36,6 @@ public class WebhookData { @JsonProperty("include_machine_events") public Boolean includeMachineEvents; - @JsonProperty("secret") - public String secret; - @JsonProperty("last_called_at") public String lastCalledAt; @@ -38,4 +44,7 @@ public class WebhookData { @JsonProperty("updated_at") public String updatedAt; + + @JsonProperty("delivery_mode_filter") + public String deliveryModeFilter; } diff --git a/src/main/java/co/lettermint/models/api/WebhookDeliveryData.java b/src/main/java/co/lettermint/models/api/WebhookDeliveryData.java index a85a7de..cda4b85 100644 --- a/src/main/java/co/lettermint/models/api/WebhookDeliveryData.java +++ b/src/main/java/co/lettermint/models/api/WebhookDeliveryData.java @@ -15,6 +15,15 @@ public class WebhookDeliveryData { @JsonProperty("event_type") public String eventType; + @JsonProperty("source_scope") + public String sourceScope; + + @JsonProperty("source_project_id") + public String sourceProjectId; + + @JsonProperty("source_route_id") + public String sourceRouteId; + @JsonProperty("status") public String status; @@ -44,4 +53,7 @@ public class WebhookDeliveryData { @JsonProperty("timestamp") public String timestamp; + + @JsonProperty("sandbox") + public Boolean sandbox; } diff --git a/src/main/java/co/lettermint/models/api/WebhookDeliveryListData.java b/src/main/java/co/lettermint/models/api/WebhookDeliveryListData.java index d128b29..5cbb9c1 100644 --- a/src/main/java/co/lettermint/models/api/WebhookDeliveryListData.java +++ b/src/main/java/co/lettermint/models/api/WebhookDeliveryListData.java @@ -14,6 +14,15 @@ public class WebhookDeliveryListData { @JsonProperty("event_type") public String eventType; + @JsonProperty("source_scope") + public String sourceScope; + + @JsonProperty("source_project_id") + public String sourceProjectId; + + @JsonProperty("source_route_id") + public String sourceRouteId; + @JsonProperty("status") public String status; diff --git a/src/main/java/co/lettermint/models/api/WebhookDeliveryModeFilter.java b/src/main/java/co/lettermint/models/api/WebhookDeliveryModeFilter.java new file mode 100644 index 0000000..fda23a3 --- /dev/null +++ b/src/main/java/co/lettermint/models/api/WebhookDeliveryModeFilter.java @@ -0,0 +1,9 @@ +package co.lettermint.models.api; + +public final class WebhookDeliveryModeFilter { + public static final String LIVE = "live"; + public static final String SANDBOX = "sandbox"; + public static final String BOTH = "both"; + + private WebhookDeliveryModeFilter() {} +} diff --git a/src/main/java/co/lettermint/models/api/WebhookEvent.java b/src/main/java/co/lettermint/models/api/WebhookEvent.java index 5428226..46fe0a4 100644 --- a/src/main/java/co/lettermint/models/api/WebhookEvent.java +++ b/src/main/java/co/lettermint/models/api/WebhookEvent.java @@ -15,6 +15,10 @@ public final class WebhookEvent { public static final String MESSAGECLICKED = "message.clicked"; public static final String MESSAGEINBOUND = "message.inbound"; public static final String MESSAGEPOLICYREJECTED = "message.policy_rejected"; + public static final String MESSAGESCHEDULED = "message.scheduled"; + public static final String MESSAGERESCHEDULED = "message.rescheduled"; + public static final String MESSAGECANCELED = "message.canceled"; + public static final String MESSAGERELEASED = "message.released"; public static final String SUPPRESSIONADDED = "suppression.added"; public static final String SUPPRESSIONREMOVED = "suppression.removed"; public static final String WEBHOOKTEST = "webhook.test"; diff --git a/src/main/java/co/lettermint/models/api/WebhookListData.java b/src/main/java/co/lettermint/models/api/WebhookListData.java index 185452b..7085c8b 100644 --- a/src/main/java/co/lettermint/models/api/WebhookListData.java +++ b/src/main/java/co/lettermint/models/api/WebhookListData.java @@ -9,6 +9,15 @@ public class WebhookListData { @JsonProperty("id") public String id; + @JsonProperty("scope") + public String scope; + + @JsonProperty("project_ids") + public List projectIds; + + @JsonProperty("route_ids") + public List routeIds; + @JsonProperty("route_id") public String routeId; diff --git a/src/main/java/co/lettermint/models/api/WebhookRegenerateSecretResponse.java b/src/main/java/co/lettermint/models/api/WebhookRegenerateSecretResponse.java index 38928fc..da5ffef 100644 --- a/src/main/java/co/lettermint/models/api/WebhookRegenerateSecretResponse.java +++ b/src/main/java/co/lettermint/models/api/WebhookRegenerateSecretResponse.java @@ -6,7 +6,7 @@ @JsonIgnoreProperties(ignoreUnknown = true) public class WebhookRegenerateSecretResponse { @JsonProperty("data") - public WebhookData data; + public WebhookSecretData data; @JsonProperty("message") public String message; diff --git a/src/main/java/co/lettermint/models/api/WebhookScope.java b/src/main/java/co/lettermint/models/api/WebhookScope.java new file mode 100644 index 0000000..8122fc0 --- /dev/null +++ b/src/main/java/co/lettermint/models/api/WebhookScope.java @@ -0,0 +1,9 @@ +package co.lettermint.models.api; + +public final class WebhookScope { + public static final String TEAM = "team"; + public static final String PROJECT = "project"; + public static final String ROUTE = "route"; + + private WebhookScope() {} +} diff --git a/src/main/java/co/lettermint/models/api/WebhookSecretData.java b/src/main/java/co/lettermint/models/api/WebhookSecretData.java new file mode 100644 index 0000000..0f66c8a --- /dev/null +++ b/src/main/java/co/lettermint/models/api/WebhookSecretData.java @@ -0,0 +1,53 @@ +package co.lettermint.models.api; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.List; + +@JsonIgnoreProperties(ignoreUnknown = true) +public class WebhookSecretData { + @JsonProperty("id") + public String id; + + @JsonProperty("scope") + public String scope; + + @JsonProperty("project_ids") + public List projectIds; + + @JsonProperty("route_ids") + public List routeIds; + + @JsonProperty("route_id") + public String routeId; + + @JsonProperty("name") + public String name; + + @JsonProperty("url") + public String url; + + @JsonProperty("events") + public List events; + + @JsonProperty("enabled") + public Boolean enabled; + + @JsonProperty("include_machine_events") + public Boolean includeMachineEvents; + + @JsonProperty("secret") + public String secret; + + @JsonProperty("last_called_at") + public String lastCalledAt; + + @JsonProperty("created_at") + public String createdAt; + + @JsonProperty("updated_at") + public String updatedAt; + + @JsonProperty("delivery_mode_filter") + public String deliveryModeFilter; +} diff --git a/src/main/java/co/lettermint/models/api/WebhookStoreResponse.java b/src/main/java/co/lettermint/models/api/WebhookStoreResponse.java index 583e892..2e0c2e3 100644 --- a/src/main/java/co/lettermint/models/api/WebhookStoreResponse.java +++ b/src/main/java/co/lettermint/models/api/WebhookStoreResponse.java @@ -6,7 +6,7 @@ @JsonIgnoreProperties(ignoreUnknown = true) public class WebhookStoreResponse { @JsonProperty("data") - public WebhookData data; + public WebhookSecretData data; @JsonProperty("message") public String message; diff --git a/src/test/java/co/lettermint/ApiClientTest.java b/src/test/java/co/lettermint/ApiClientTest.java index 06d2308..4d8f44c 100644 --- a/src/test/java/co/lettermint/ApiClientTest.java +++ b/src/test/java/co/lettermint/ApiClientTest.java @@ -74,13 +74,14 @@ void sendsBatchEmailsWithTypedPayloads() throws Exception { try (MockWebServer server = new MockWebServer()) { server.enqueue(new MockResponse() .setHeader("Content-Type", "application/json") - .setBody("[{\"message_id\":\"msg_123\",\"status\":\"queued\"}]")); + .setBody("[{\"message_id\":\"msg_123\",\"status\":\"queued\",\"sandbox\":true,\"sandbox_result\":\"hard_bounced\"}]")); server.start(); SendMailRequest payload = new SendMailRequest(); payload.fromValue = "from@example.com"; payload.to = Collections.singletonList("to@example.com"); payload.subject = "Hello"; + payload.sandboxResult = co.lettermint.models.api.SandboxResult.HARDBOUNCED; List response = Lettermint .email("sending-token", server.url("/v1").toString()) @@ -91,7 +92,10 @@ void sendsBatchEmailsWithTypedPayloads() throws Exception { assertEquals("/v1/send/batch", request.getPath()); assertEquals("sending-token", request.getHeader("x-lettermint-token")); assertEquals("batch-key", request.getHeader("Idempotency-Key")); + assertTrue(request.getBody().readUtf8().contains("\"sandbox_result\":\"hard_bounced\"")); assertEquals("msg_123", response.get(0).messageId); + assertTrue(response.get(0).sandbox); + assertEquals("hard_bounced", response.get(0).sandboxResult); } } @@ -232,30 +236,50 @@ void generatedApiModelsMatchCurrentTeamSchema() { co.lettermint.models.api.DomainData domain = new co.lettermint.models.api.DomainData(); domain.dkimMode = co.lettermint.models.api.DkimMode.MANAGEDCNAME; - co.lettermint.models.api.SuppressedRecipientData recipient = new co.lettermint.models.api.SuppressedRecipientData(); - recipient.sourceMessage = new co.lettermint.models.api.SuppressionSourceMessageData(); - recipient.sourceMessage.id = "msg_123"; + co.lettermint.models.api.SuppressedRecipientData suppressedRecipient = new co.lettermint.models.api.SuppressedRecipientData(); + suppressedRecipient.sourceMessage = new co.lettermint.models.api.SuppressionSourceMessageData(); + suppressedRecipient.sourceMessage.id = "msg_123"; co.lettermint.models.api.MessageListData message = new co.lettermint.models.api.MessageListData(); message.spamScore = 2.5; message.scheduledAt = "2026-08-27T09:00:00Z"; + co.lettermint.models.api.SendMailRequest sandboxSend = new co.lettermint.models.api.SendMailRequest(); + sandboxSend.sandboxResult = co.lettermint.models.api.SandboxResult.CLICKED; + co.lettermint.models.api.MessageRecipientData recipient = new co.lettermint.models.api.MessageRecipientData(); + recipient.sandboxResult = co.lettermint.models.api.SandboxResult.CLICKED; + project.deliveryMode = co.lettermint.models.api.DeliveryMode.SANDBOX; + co.lettermint.models.api.WebhookDeliveryData delivery = new co.lettermint.models.api.WebhookDeliveryData(); + delivery.sandbox = true; + co.lettermint.models.api.StoreWebhookData webhook = new co.lettermint.models.api.StoreWebhookData(); + webhook.deliveryModeFilter = co.lettermint.models.api.WebhookDeliveryModeFilter.BOTH; + co.lettermint.models.api.CursorPaginator cursor = new co.lettermint.models.api.CursorPaginator(); + cursor.perPage = 25; + cursor.data = Collections.emptyList(); + assertFalse(routeUpdate.settings.generatePlaintextFallback); assertEquals("enforced", routeUpdate.settings.tls); assertEquals(3.0, routeUpdate.inboundSettings.inboundSpamThreshold); assertFalse(projectUpdate.redactEmailContent); assertTrue(projectCreate.shortToken); assertTrue(project.redactEmailContent); - assertEquals("global", co.lettermint.models.api.SuppressionScope.GLOBAL); + assertEquals("team", co.lettermint.models.api.SuppressionScope.TEAM); assertEquals("application/x-msdownload", blockedFileTypes.mimeTypes.get(0)); assertEquals(300000, team.includedVolume); assertTrue(role.assignable); assertEquals("members:manage", role.permissions.get(0)); assertEquals("role_123", assignment.roleId); assertEquals("managed_cname", domain.dkimMode); - assertEquals("msg_123", recipient.sourceMessage.id); + assertEquals("msg_123", suppressedRecipient.sourceMessage.id); assertEquals(2.5, message.spamScore); assertEquals("2026-08-27T09:00:00Z", message.scheduledAt); + assertEquals("clicked", sandboxSend.sandboxResult); + assertEquals("clicked", recipient.sandboxResult); + assertEquals("sandbox", project.deliveryMode); + assertTrue(delivery.sandbox); + assertEquals("both", webhook.deliveryModeFilter); + assertEquals(25, cursor.perPage); + assertTrue(cursor.data.isEmpty()); } @Test diff --git a/src/test/java/co/lettermint/EmailEndpointTest.java b/src/test/java/co/lettermint/EmailEndpointTest.java index 961f9ab..6c66383 100644 --- a/src/test/java/co/lettermint/EmailEndpointTest.java +++ b/src/test/java/co/lettermint/EmailEndpointTest.java @@ -60,7 +60,7 @@ void testSimpleEmail() throws Exception { @Test void testEmailWithAllOptions() throws Exception { mockWebServer.enqueue(new MockResponse() - .setBody("{\"message_id\": \"msg_456\", \"status\": \"queued\"}") + .setBody("{\"message_id\":\"msg_456\",\"status\":\"queued\",\"sandbox\":true,\"sandbox_result\":\"deferred\"}") .setHeader("Content-Type", "application/json")); Map headers = new HashMap<>(); @@ -98,10 +98,13 @@ void testEmailWithAllOptions() throws Exception { .tag("welcome") .tags(tags) .settings(settings) + .sandboxResult(co.lettermint.models.api.SandboxResult.DEFERRED) .idempotencyKey("unique-key-123") .send(); assertEquals("msg_456", response.getMessageId()); + assertTrue(response.getSandbox()); + assertEquals("deferred", response.getSandboxResult()); RecordedRequest request = mockWebServer.takeRequest(); assertEquals("unique-key-123", request.getHeader("Idempotency-Key")); @@ -124,6 +127,7 @@ void testEmailWithAllOptions() throws Exception { assertTrue(body.contains("\"tls\":\"enforced\"")); assertTrue(body.contains("\"Message-ID\":\"\"")); assertTrue(body.contains("\"X-LM-Preserve-Message-ID\":\"true\"")); + assertTrue(body.contains("\"sandbox_result\":\"deferred\"")); assertTrue(body.contains("{\"filename\":\"document.pdf\",\"content\":\"base64content\"}")); assertTrue(body.contains("{\"filename\":\"logo.png\",\"content\":\"base64logo\",\"content_id\":\"logo-cid\"}")); assertTrue(body.contains("{\"filename\":\"invite.ics\",\"content\":\"base64icalFile\",\"content_type\":\"text/calendar; method=REQUEST\"}"));