package io.kaif.web; import static java.util.Arrays.asList; import static org.junit.Assert.*; import static org.mockito.Mockito.*; import java.io.IOException; import org.junit.Before; import org.junit.Test; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.springframework.mock.web.MockHttpServletRequest; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.collect.ImmutableMap; import io.kaif.service.AccountService; public class AwsSnsRestControllerTest { private static String q(String singleQuoted) { return singleQuoted.replaceAll("'", "\""); } private AwsSnsRestController controller; private MockHttpServletRequest request = new MockHttpServletRequest(); @Mock private AccountService accountService; @Before public void setup() { MockitoAnnotations.initMocks(this); controller = new AwsSnsRestController(accountService); } @Test public void mailFeedback_confirmNotification() throws Exception { request.addHeader("x-amz-sns-message-type", "SubscriptionConfirmation"); setJsonContent("{" + " 'Type':'SubscriptionConfirmation'," + " 'MessageId':'8b0f0abf-09f4-4208-bb88-a333a53615e0'," + " 'SubscribeURL':'http://httpbin.org/get'" + "}"); controller.mailFeedback(request); } private void setJsonContent(String singleQuoted) { // System.out.println(q(singleQuoted)); request.setContent(q(singleQuoted).getBytes()); } @Test public void mailFeedback_delivery() throws Exception { request.addHeader("x-amz-sns-message-type", "Notification"); String message = q("{" + " 'notificationType':'Delivery'," + " 'mail':{" + " 'timestamp':'2014-10-26T12:20:16.071Z'," + " 'source':'noreply@kaif.io'," + " 'messageId':'000001494c665847-0a24c891-a43a-4b7a-99c0-60968e638bc4-000000'," + " 'destination':[" + " 'success@simulator.amazonses.com'" + " ]" + " }," + " 'delivery':{" + " 'timestamp':'2014-10-26T12:20:16.689Z'," + " 'processingTimeMillis':618," + " 'recipients':[" + " 'success@simulator.amazonses.com'" + " ]," + " 'smtpResponse':'250 2.6.0 Message received'," + " 'reportingMTA':'a8-52.smtp-out.amazonses.com'" + " }" + "}"); request.setContent(toJsonBytes(ImmutableMap.of("Type", "Notification", "MessageId", "21b2766f-a4c2-5e4f-8eaa-3aa9775ce46f", "Message", message))); controller.mailFeedback(request); q(""); } @Test public void mailFeedback_complaint() throws Exception { request.addHeader("x-amz-sns-message-type", "Notification"); String message = q("{" + " 'notificationType':'Complaint'," + " 'complaint':{" + " 'complaintFeedbackType':'abuse'," + " 'complainedRecipients':[" + " {" + " 'emailAddress':'complaint@simulator.amazonses.com'" + " }" + " ]," + " 'userAgent':'Amazon SES Mailbox Simulator'," + " 'timestamp':'2014-10-26T14:24:39.000Z'," + " 'feedbackId':'000001494cd839bf-d1d08066-5d1b-11e4-8869-1119a4f60aa4-000000'" + " }," + " 'mail':{" + " 'timestamp':'2014-10-26T14:24:38.000Z'," + " 'source':'noreply@kaif.io'," + " 'messageId':'000001494cd8372a-d52bda52-c14b-46fa-a624-b6a85d22d289-000000'," + " 'destination':[" + " 'complaint@simulator.amazonses.com'" + " ]" + " }" + "}"); request.setContent(toJsonBytes(ImmutableMap.of("Type", "Notification", "MessageId", "7eac2174-75c1-5c0a-9a5d-6db373a6be23", "Message", message))); controller.mailFeedback(request); verify(accountService).complaintEmail(asList("complaint@simulator.amazonses.com")); } @Test public void mailFeedback_bounce() throws Exception { request.addHeader("x-amz-sns-message-type", "Notification"); String message = q("{" + " 'notificationType':'Bounce'," + " 'bounce':{" + " 'bounceSubType':'General'," + " 'bounceType':'Permanent'," + " 'reportingMTA':'dsn; a8-26.smtp-out.amazonses.com'," + " 'bouncedRecipients':[" + " {" + " 'status':'5.1.1'," + " 'action':'failed'," + " 'diagnosticCode':'smtp; 550 5.1.1 user unknown'," + " 'emailAddress':'bounce@simulator.amazonses.com'" + " }" + " ]," + " 'timestamp':'2014-10-26T15:10:47.544Z'," + " 'feedbackId':'000001494d02704b-70c6bee9-bd31-4e2b-aeb3-2adcc5104d25-000000'" + " }," + " 'mail':{" + " 'timestamp':'2014-10-26T15:10:45.000Z'," + " 'source':'noreply@kaif.io'," + " 'messageId':'000001494d026e8c-49338317-a0e9-4b69-b351-cb2e368778ee-000000'," + " 'destination':[" + " 'bounce@simulator.amazonses.com'" + " ]" + " }" + "}"); request.setContent(toJsonBytes(ImmutableMap.of("Type", "Notification", "MessageId", "cb0b3e1f-01f0-531c-90f5-72d810c7f6a7", "Message", message))); controller.mailFeedback(request); verify(accountService).muteEmail(asList("bounce@simulator.amazonses.com")); } @Test public void mailFeedback_confirmNotification_subscribe_fail() throws Exception { request.addHeader("x-amz-sns-message-type", "SubscriptionConfirmation"); request.setContent(toJsonBytes(ImmutableMap.of("SubscribeURL", "http://httpbin.org/status/500"))); try { controller.mailFeedback(request); fail("IOException expected"); } catch (IOException expected) { } } private byte[] toJsonBytes(ImmutableMap<String, Object> body) throws JsonProcessingException { return new ObjectMapper().writeValueAsBytes(body); } }