package org.iilab.pb.alert; import android.content.Context; import android.location.Location; import android.location.LocationManager; import org.iilab.pb.R; import org.iilab.pb.common.ApplicationSettings; import org.iilab.pb.location.LocationTestUtil; import org.iilab.pb.model.SMSSettings; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.robolectric.Robolectric; import org.robolectric.RobolectricTestRunner; import static java.lang.System.currentTimeMillis; import static java.util.Arrays.asList; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.MockitoAnnotations.initMocks; @RunWith(RobolectricTestRunner.class) public class PanicMessageTest { private String normalLocationText; private String finerLocationText; private String message; private String mobile1; private String mobile3; private Location location, finerLocation; private Context context; @Mock public SMSAdapter mockSMSAdapter; @Before public void setUp() { initMocks(this); context = Robolectric.application; mobile1 = "1231231222"; String mobile2 = ""; mobile3 = "6786786789"; double latitude = 12.9839562; double longitude = 80.2467788; double finerLatitude = 12.983956212345; double finerLongitude = 80.246778812345; message = "Normal test message.Normal test message.Normal test message.Normal test message.12345"; normalLocationText = "I\\'m at https://maps.google.com/maps?q=12.9839562,80.2467788 via network"; finerLocationText = "I\\'m at https://maps.google.com/maps?q=12.983956212345,80.246778812345 via network"; location = LocationTestUtil.location(LocationManager.NETWORK_PROVIDER, latitude, longitude, currentTimeMillis(), 10.0f); finerLocation = LocationTestUtil.location(LocationManager.NETWORK_PROVIDER, finerLatitude, finerLongitude, currentTimeMillis(), 10.0f); SMSSettings smsSettings = new SMSSettings(asList(mobile1, mobile2, mobile3), message); SMSSettings.saveContacts(context, smsSettings); SMSSettings.saveMessage(context, message); } @Test public void shouldSendFirstSMSWithLocationToAllConfiguredPhoneNumbersIgnoringInValidNumbers() { PanicMessage panicMessage = createPanicMessage(); ApplicationSettings.setFirstMsgSent(context, false); panicMessage.sendAlertMessage(location); String messageWithLocation = message + " - " + normalLocationText; verify(mockSMSAdapter).sendSMS(context, mobile1, messageWithLocation); verify(mockSMSAdapter).sendSMS(context, mobile3, messageWithLocation); verifyNoMoreInteractions(mockSMSAdapter); } @Test public void shouldSendLaterSMSWithLocationToAllConfiguredPhoneNumbersIgnoringInValidNumbers() { ApplicationSettings.setFirstMsgSent(context, true); PanicMessage panicMessage = createPanicMessage(); panicMessage.sendAlertMessage(location); String messageWithLocation = message + " - " + normalLocationText; verify(mockSMSAdapter).sendSMS(context, mobile1, messageWithLocation); verify(mockSMSAdapter).sendSMS(context, mobile3, messageWithLocation); verifyNoMoreInteractions(mockSMSAdapter); } @Test public void shouldSendFirstSMSWithOutLocationToAllConfiguredPhoneNumbersIfTheLocationIsNotAvailable() { PanicMessage panicMessage = createPanicMessage(); panicMessage.sendAlertMessage(null); ApplicationSettings.setFirstMsgSent(context, false); String messageWithoutLocation = message + " - " + context.getResources().getString(R.string.location_not_found); verify(mockSMSAdapter).sendSMS(context, mobile1, messageWithoutLocation); verify(mockSMSAdapter).sendSMS(context, mobile3, messageWithoutLocation); verifyNoMoreInteractions(mockSMSAdapter); } @Test public void shouldSendLaterSMSWithOutLocationToAllConfiguredPhoneNumbersIfTheLocationIsNotAvailable() { ApplicationSettings.setFirstMsgSent(context, true); PanicMessage panicMessage = createPanicMessage(); panicMessage.sendAlertMessage(null); String messageWithoutLocation = message + " - " + context.getResources().getString(R.string.location_not_found); verify(mockSMSAdapter).sendSMS(context, mobile1, messageWithoutLocation); verify(mockSMSAdapter).sendSMS(context, mobile3, messageWithoutLocation); verifyNoMoreInteractions(mockSMSAdapter); } @Test public void shouldTruncateTheMessagePartIfItExceeds() { String expectedMessage = "Normal test message.Normal test message.Normal test message.Normal test messag" + finerLocationText; PanicMessage panicMessage = createPanicMessage(); panicMessage.sendAlertMessage(finerLocation); verify(mockSMSAdapter).sendSMS(context, mobile1, expectedMessage); } private PanicMessage createPanicMessage() { return new PanicMessage(context) { @Override SMSAdapter getSMSAdapter() { return mockSMSAdapter; } }; } }