package rocks.inspectit.server.alerting.action.impl; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.hasItem; import static org.mockito.Matchers.any; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.verifyZeroInteractions; import static org.mockito.Mockito.when; import java.io.IOException; import java.util.Arrays; import java.util.List; import org.mockito.ArgumentCaptor; import org.mockito.InjectMocks; import org.mockito.Mock; import org.slf4j.Logger; import org.testng.annotations.Test; import rocks.inspectit.server.alerting.state.AlertingState; import rocks.inspectit.server.influx.constants.Series; import rocks.inspectit.server.mail.EMailSender; import rocks.inspectit.server.template.AlertEMailTemplateType; import rocks.inspectit.server.template.EMailTemplateResolver; import rocks.inspectit.shared.all.testbase.TestBase; import rocks.inspectit.shared.cs.ci.AlertingDefinition; /** * * Test the {@link EmailAlertActionTest}. * * @author Marius Oehler * */ @SuppressWarnings("PMD") public class EmailAlertActionTest extends TestBase { @InjectMocks EmailAlertAction emailAction; @Mock Logger log; @Mock EMailSender emailSender; @Mock EMailTemplateResolver templateResolver; /** * Test the * {@link EmailAlertAction#onStarting(rocks.inspectit.server.alerting.state.AlertingState, double)} * method. */ public static class OnStarting extends EmailAlertActionTest { @Mock AlertingState alertingState; @Mock AlertingDefinition alertingDefinition; @Test @SuppressWarnings({ "unchecked", "rawtypes" }) public void onStartNoBtx() throws IOException { when(alertingState.getAlertingDefinition()).thenReturn(alertingDefinition); when(alertingDefinition.getName()).thenReturn("myName"); when(alertingDefinition.getNotificationEmailAddresses()).thenReturn(Arrays.asList("test@example.com")); when(templateResolver.resolveTemplate(AlertEMailTemplateType.HTML_ALERT_OPEN, alertingState)).thenReturn("htmlBody"); when(templateResolver.resolveTemplate(AlertEMailTemplateType.TXT_ALERT_OPEN, alertingState)).thenReturn("textBody"); emailAction.onStarting(alertingState); verify(alertingDefinition).getName(); verify(alertingDefinition).getMeasurement(); verify(alertingDefinition).getNotificationEmailAddresses(); verifyNoMoreInteractions(alertingDefinition); verify(alertingState, times(3)).getAlertingDefinition(); verifyNoMoreInteractions(alertingState); verify(templateResolver).resolveTemplate(AlertEMailTemplateType.HTML_ALERT_OPEN, alertingState); verify(templateResolver).resolveTemplate(AlertEMailTemplateType.TXT_ALERT_OPEN, alertingState); verifyNoMoreInteractions(templateResolver); ArgumentCaptor<String> captorSubject = ArgumentCaptor.forClass(String.class); ArgumentCaptor<String> captorHtmlBody = ArgumentCaptor.forClass(String.class); ArgumentCaptor<String> captorTextBody = ArgumentCaptor.forClass(String.class); ArgumentCaptor<List> captorRecipients = ArgumentCaptor.forClass(List.class); verify(emailSender).sendEMail(captorSubject.capture(), captorHtmlBody.capture(), captorTextBody.capture(), captorRecipients.capture()); assertThat(captorHtmlBody.getValue(), equalTo("htmlBody")); assertThat(captorTextBody.getValue(), equalTo("textBody")); assertThat(captorSubject.getValue(), containsString("myName")); assertThat((List<String>) captorRecipients.getValue(), hasItem("test@example.com")); verifyNoMoreInteractions(emailSender); } @Test @SuppressWarnings({ "unchecked", "rawtypes" }) public void onStartIsBtx() throws IOException { when(alertingState.getAlertingDefinition()).thenReturn(alertingDefinition); when(alertingDefinition.getName()).thenReturn("myName"); when(alertingDefinition.getNotificationEmailAddresses()).thenReturn(Arrays.asList("test@example.com")); when(alertingDefinition.getMeasurement()).thenReturn(Series.BusinessTransaction.NAME); when(alertingDefinition.getField()).thenReturn(Series.BusinessTransaction.FIELD_DURATION); when(templateResolver.resolveTemplate(AlertEMailTemplateType.HTML_BUSINESS_TX_ALERT_OPEN, alertingState)).thenReturn("htmlBody"); when(templateResolver.resolveTemplate(AlertEMailTemplateType.TXT_BUSINESS_TX_ALERT_OPEN, alertingState)).thenReturn("textBody"); emailAction.onStarting(alertingState); verify(alertingDefinition).getName(); verify(alertingDefinition).getMeasurement(); verify(alertingDefinition).getNotificationEmailAddresses(); verify(alertingDefinition).getField(); verifyNoMoreInteractions(alertingDefinition); verify(alertingState, times(3)).getAlertingDefinition(); verifyNoMoreInteractions(alertingState); verify(templateResolver).resolveTemplate(AlertEMailTemplateType.HTML_BUSINESS_TX_ALERT_OPEN, alertingState); verify(templateResolver).resolveTemplate(AlertEMailTemplateType.TXT_BUSINESS_TX_ALERT_OPEN, alertingState); verifyNoMoreInteractions(templateResolver); ArgumentCaptor<String> captorSubject = ArgumentCaptor.forClass(String.class); ArgumentCaptor<String> captorHtmlBody = ArgumentCaptor.forClass(String.class); ArgumentCaptor<String> captorTextBody = ArgumentCaptor.forClass(String.class); ArgumentCaptor<List> captorRecipients = ArgumentCaptor.forClass(List.class); verify(emailSender).sendEMail(captorSubject.capture(), captorHtmlBody.capture(), captorTextBody.capture(), captorRecipients.capture()); assertThat(captorHtmlBody.getValue(), equalTo("htmlBody")); assertThat(captorTextBody.getValue(), equalTo("textBody")); assertThat(captorSubject.getValue(), containsString("myName")); assertThat((List<String>) captorRecipients.getValue(), hasItem("test@example.com")); verifyNoMoreInteractions(emailSender); } @Test @SuppressWarnings("unchecked") public void templateResolverThrowsException() throws IOException { when(alertingState.getAlertingDefinition()).thenReturn(alertingDefinition); when(alertingDefinition.getName()).thenReturn("myName"); when(templateResolver.resolveTemplate(any(AlertEMailTemplateType.class), any(AlertingState.class))).thenThrow(IOException.class); emailAction.onStarting(alertingState); verify(alertingDefinition).getName(); verify(alertingDefinition).getMeasurement(); verifyNoMoreInteractions(alertingDefinition); verify(alertingState, times(2)).getAlertingDefinition(); verifyNoMoreInteractions(alertingState); verify(templateResolver).resolveTemplate(any(AlertEMailTemplateType.class), eq(alertingState)); verifyNoMoreInteractions(templateResolver); verifyZeroInteractions(emailSender); } @Test @SuppressWarnings({ "unchecked", "rawtypes" }) public void onStartUseDefaultName() throws IOException { when(alertingState.getAlertingDefinition()).thenReturn(alertingDefinition); when(alertingDefinition.getNotificationEmailAddresses()).thenReturn(Arrays.asList("test@example.com")); when(templateResolver.resolveTemplate(AlertEMailTemplateType.HTML_ALERT_OPEN, alertingState)).thenReturn("htmlBody"); when(templateResolver.resolveTemplate(AlertEMailTemplateType.TXT_ALERT_OPEN, alertingState)).thenReturn("textBody"); emailAction.onStarting(alertingState); verify(alertingDefinition).getName(); verify(alertingDefinition).getMeasurement(); verify(alertingDefinition).getNotificationEmailAddresses(); verifyNoMoreInteractions(alertingDefinition); verify(alertingState, times(3)).getAlertingDefinition(); verifyNoMoreInteractions(alertingState); verify(templateResolver).resolveTemplate(AlertEMailTemplateType.HTML_ALERT_OPEN, alertingState); verify(templateResolver).resolveTemplate(AlertEMailTemplateType.TXT_ALERT_OPEN, alertingState); verifyNoMoreInteractions(templateResolver); ArgumentCaptor<String> captorSubject = ArgumentCaptor.forClass(String.class); ArgumentCaptor<String> captorHtmlBody = ArgumentCaptor.forClass(String.class); ArgumentCaptor<String> captorTextBody = ArgumentCaptor.forClass(String.class); ArgumentCaptor<List> captorRecipients = ArgumentCaptor.forClass(List.class); verify(emailSender).sendEMail(captorSubject.capture(), captorHtmlBody.capture(), captorTextBody.capture(), captorRecipients.capture()); assertThat(captorHtmlBody.getValue(), equalTo("htmlBody")); assertThat(captorTextBody.getValue(), equalTo("textBody")); assertThat(captorSubject.getValue(), containsString(EmailAlertAction.DEFAULT_ALERTING_NAME)); assertThat((List<String>) captorRecipients.getValue(), hasItem("test@example.com")); verifyNoMoreInteractions(emailSender); } @Test(expectedExceptions = IllegalArgumentException.class) public void alertingStateIsNull() throws IOException { try { emailAction.onStarting(null); } finally { verifyZeroInteractions(alertingDefinition); verifyZeroInteractions(alertingState); verifyZeroInteractions(templateResolver); verifyZeroInteractions(emailSender); } } } /** * Test the {@link EmailAlertAction#onEnding(AlertingState) method. */ public static class OnEnding extends EmailAlertActionTest { @Mock AlertingState alertingState; @Mock AlertingDefinition alertingDefinition; @Test @SuppressWarnings({ "unchecked", "rawtypes" }) public void onEndNoBtx() throws IOException { when(alertingState.getAlertingDefinition()).thenReturn(alertingDefinition); when(alertingDefinition.getName()).thenReturn("myName"); when(alertingDefinition.getNotificationEmailAddresses()).thenReturn(Arrays.asList("test@example.com")); when(templateResolver.resolveTemplate(AlertEMailTemplateType.HTML_ALERT_CLOSED, alertingState)).thenReturn("htmlBody"); when(templateResolver.resolveTemplate(AlertEMailTemplateType.TXT_ALERT_CLOSED, alertingState)).thenReturn("textBody"); emailAction.onEnding(alertingState); verify(alertingDefinition).getName(); verify(alertingDefinition).getMeasurement(); verify(alertingDefinition).getNotificationEmailAddresses(); verifyNoMoreInteractions(alertingDefinition); verify(alertingState, times(3)).getAlertingDefinition(); verifyNoMoreInteractions(alertingState); verify(templateResolver).resolveTemplate(AlertEMailTemplateType.HTML_ALERT_CLOSED, alertingState); verify(templateResolver).resolveTemplate(AlertEMailTemplateType.TXT_ALERT_CLOSED, alertingState); verifyNoMoreInteractions(templateResolver); ArgumentCaptor<String> captorSubject = ArgumentCaptor.forClass(String.class); ArgumentCaptor<String> captorHtmlBody = ArgumentCaptor.forClass(String.class); ArgumentCaptor<String> captorTextBody = ArgumentCaptor.forClass(String.class); ArgumentCaptor<List> captorRecipients = ArgumentCaptor.forClass(List.class); verify(emailSender).sendEMail(captorSubject.capture(), captorHtmlBody.capture(), captorTextBody.capture(), captorRecipients.capture()); assertThat(captorHtmlBody.getValue(), equalTo("htmlBody")); assertThat(captorTextBody.getValue(), equalTo("textBody")); assertThat(captorSubject.getValue(), containsString("myName")); assertThat((List<String>) captorRecipients.getValue(), hasItem("test@example.com")); verifyNoMoreInteractions(emailSender); } @Test @SuppressWarnings({ "unchecked", "rawtypes" }) public void onEndIsBtx() throws IOException { when(alertingState.getAlertingDefinition()).thenReturn(alertingDefinition); when(alertingDefinition.getName()).thenReturn("myName"); when(alertingDefinition.getNotificationEmailAddresses()).thenReturn(Arrays.asList("test@example.com")); when(alertingDefinition.getMeasurement()).thenReturn(Series.BusinessTransaction.NAME); when(alertingDefinition.getField()).thenReturn(Series.BusinessTransaction.FIELD_DURATION); when(templateResolver.resolveTemplate(AlertEMailTemplateType.HTML_BUSINESS_TX_ALERT_CLOSED, alertingState)).thenReturn("htmlBody"); when(templateResolver.resolveTemplate(AlertEMailTemplateType.TXT_BUSINESS_TX_ALERT_CLOSED, alertingState)).thenReturn("textBody"); emailAction.onEnding(alertingState); verify(alertingDefinition).getName(); verify(alertingDefinition).getMeasurement(); verify(alertingDefinition).getNotificationEmailAddresses(); verify(alertingDefinition).getField(); verifyNoMoreInteractions(alertingDefinition); verify(alertingState, times(3)).getAlertingDefinition(); verifyNoMoreInteractions(alertingState); verify(templateResolver).resolveTemplate(AlertEMailTemplateType.HTML_BUSINESS_TX_ALERT_CLOSED, alertingState); verify(templateResolver).resolveTemplate(AlertEMailTemplateType.TXT_BUSINESS_TX_ALERT_CLOSED, alertingState); verifyNoMoreInteractions(templateResolver); ArgumentCaptor<String> captorSubject = ArgumentCaptor.forClass(String.class); ArgumentCaptor<String> captorHtmlBody = ArgumentCaptor.forClass(String.class); ArgumentCaptor<String> captorTextBody = ArgumentCaptor.forClass(String.class); ArgumentCaptor<List> captorRecipients = ArgumentCaptor.forClass(List.class); verify(emailSender).sendEMail(captorSubject.capture(), captorHtmlBody.capture(), captorTextBody.capture(), captorRecipients.capture()); assertThat(captorHtmlBody.getValue(), equalTo("htmlBody")); assertThat(captorTextBody.getValue(), equalTo("textBody")); assertThat(captorSubject.getValue(), containsString("myName")); assertThat((List<String>) captorRecipients.getValue(), hasItem("test@example.com")); verifyNoMoreInteractions(emailSender); } @Test @SuppressWarnings("unchecked") public void templateResolverThrowsException() throws IOException { when(alertingState.getAlertingDefinition()).thenReturn(alertingDefinition); when(alertingDefinition.getName()).thenReturn("myName"); when(templateResolver.resolveTemplate(any(AlertEMailTemplateType.class), any(AlertingState.class))).thenThrow(IOException.class); emailAction.onEnding(alertingState); verify(alertingDefinition).getName(); verify(alertingDefinition).getMeasurement(); verifyNoMoreInteractions(alertingDefinition); verify(alertingState, times(2)).getAlertingDefinition(); verifyNoMoreInteractions(alertingState); verify(templateResolver).resolveTemplate(any(AlertEMailTemplateType.class), eq(alertingState)); verifyNoMoreInteractions(templateResolver); verifyZeroInteractions(emailSender); } @Test @SuppressWarnings({ "unchecked", "rawtypes" }) public void onEndUseDefaultName() throws IOException { when(alertingState.getAlertingDefinition()).thenReturn(alertingDefinition); when(alertingDefinition.getNotificationEmailAddresses()).thenReturn(Arrays.asList("test@example.com")); when(templateResolver.resolveTemplate(AlertEMailTemplateType.HTML_ALERT_CLOSED, alertingState)).thenReturn("htmlBody"); when(templateResolver.resolveTemplate(AlertEMailTemplateType.TXT_ALERT_CLOSED, alertingState)).thenReturn("textBody"); emailAction.onEnding(alertingState); verify(alertingDefinition).getName(); verify(alertingDefinition).getMeasurement(); verify(alertingDefinition).getNotificationEmailAddresses(); verifyNoMoreInteractions(alertingDefinition); verify(alertingState, times(3)).getAlertingDefinition(); verifyNoMoreInteractions(alertingState); verify(templateResolver).resolveTemplate(AlertEMailTemplateType.HTML_ALERT_CLOSED, alertingState); verify(templateResolver).resolveTemplate(AlertEMailTemplateType.TXT_ALERT_CLOSED, alertingState); verifyNoMoreInteractions(templateResolver); ArgumentCaptor<String> captorSubject = ArgumentCaptor.forClass(String.class); ArgumentCaptor<String> captorHtmlBody = ArgumentCaptor.forClass(String.class); ArgumentCaptor<String> captorTextBody = ArgumentCaptor.forClass(String.class); ArgumentCaptor<List> captorRecipients = ArgumentCaptor.forClass(List.class); verify(emailSender).sendEMail(captorSubject.capture(), captorHtmlBody.capture(), captorTextBody.capture(), captorRecipients.capture()); assertThat(captorHtmlBody.getValue(), equalTo("htmlBody")); assertThat(captorTextBody.getValue(), equalTo("textBody")); assertThat(captorSubject.getValue(), containsString(EmailAlertAction.DEFAULT_ALERTING_NAME)); assertThat((List<String>) captorRecipients.getValue(), hasItem("test@example.com")); verifyNoMoreInteractions(emailSender); } @Test(expectedExceptions = IllegalArgumentException.class) public void alertingStateIsNull() throws IOException { try { emailAction.onEnding(null); } finally { verifyZeroInteractions(alertingDefinition); verifyZeroInteractions(alertingState); verifyZeroInteractions(templateResolver); verifyZeroInteractions(emailSender); } } } }