package com.pivotallabs.tracker; import android.app.Activity; import android.app.AlertDialog; import android.view.View; import android.widget.TextView; import com.pivotallabs.R; import com.pivotallabs.TestResponses; import com.pivotallabs.api.ApiRequest; import com.pivotallabs.api.TestApiGateway; import org.robolectric.RobolectricTestRunner; import org.robolectric.shadows.ShadowAlertDialog; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import static org.robolectric.Robolectric.clickOn; import static org.robolectric.Robolectric.shadowOf; import static org.hamcrest.CoreMatchers.equalTo; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertThat; @RunWith(RobolectricTestRunner.class) public class SignInDialogTest { private View signInButton; private TextView usernameEditText; private TextView passwordEditText; private TestApiGateway apiGateway; private SignInDialog signInDialog; @Before public void setUp() throws Exception { apiGateway = new TestApiGateway(); signInDialog = new SignInDialog(new Activity(), new AuthenticationGateway(apiGateway, new Activity())); signInDialog.show(); usernameEditText = (TextView) signInDialog.findViewById(R.id.username); passwordEditText = (TextView) signInDialog.findViewById(R.id.password); signInButton = signInDialog.findViewById(R.id.sign_in_button); } @Test public void shouldNotEnableTheSignInButtonUntilUsernameAndPasswordFieldsHaveText() throws Exception { assertThat(signInButton.isEnabled(), equalTo(false)); usernameEditText.setText("Sponge Bob"); assertThat(signInButton.isEnabled(), equalTo(false)); passwordEditText.setText("squidward"); assertThat(signInButton.isEnabled(), equalTo(true)); } @Test(expected = RuntimeException.class) public void shouldNotBeAbleToSignInIfUserNameHasNotBeenSet() throws Exception { passwordEditText.setText("squidward"); clickOn(signInButton); } @Test(expected = RuntimeException.class) public void shouldNotBeAbleToSignInIfPasswordHasNotBeenSet() throws Exception { usernameEditText.setText("Sponge Bob"); clickOn(signInButton); } @Test public void shouldCallTheTrackerApiUponClickingSignIn() throws Exception { usernameEditText.setText("Sponge Bob"); passwordEditText.setText("squidward"); clickOn(signInButton); assertRequestWasMade(apiGateway, new TrackerAuthenticationRequest("Sponge Bob", "squidward")); } @Test public void shouldDisableTheSignInButtonWhileRequestIsOutstanding() { usernameEditText.setText("Sponge Bob"); passwordEditText.setText("squidward"); clickOn(signInButton); assertThat(signInButton.isEnabled(), equalTo(false)); } @Test public void shouldReEnableTheSignInButtonIfSignInFails() throws Exception { usernameEditText.setText("Sponge Bob"); passwordEditText.setText("squidward"); clickOn(signInButton); apiGateway.simulateResponse(401, "Access Denied"); assertThat(signInButton.isEnabled(), equalTo(true)); } @Test public void shouldDismissWhenSuccessfullySignedIn() throws Exception { usernameEditText.setText("Spongebob"); passwordEditText.setText("squidward"); clickOn(signInButton); assertThat(signInDialog.isShowing(), equalTo(true)); apiGateway.simulateResponse(200, TestResponses.AUTH_SUCCESS); assertThat(signInDialog.isShowing(), equalTo(false)); } @Test public void shouldNotDismissWhenUnSuccessfullySignedIn() throws Exception { usernameEditText.setText("Spongebob"); passwordEditText.setText("squidward"); clickOn(signInButton); assertThat(signInDialog.isShowing(), equalTo(true)); apiGateway.simulateResponse(401, "Access Denied"); assertThat(signInDialog.isShowing(), equalTo(true)); } @Test public void shouldShowAlertDialogWhenUnSuccessfullySignedIn() throws Exception { usernameEditText.setText("Spongebob"); passwordEditText.setText("squidward"); clickOn(signInButton); apiGateway.simulateResponse(401, "Access Denied"); AlertDialog alertDialog = ShadowAlertDialog.getLatestAlertDialog(); assertThat(alertDialog.isShowing(), equalTo(true)); assertThat(((String) shadowOf(alertDialog).getTitle()), equalTo("Error")); assertThat(((String) shadowOf(alertDialog).getMessage()), equalTo("Username/Password combination is not recognized.")); assertNotNull(alertDialog.getButton(AlertDialog.BUTTON_POSITIVE)); } private void assertRequestWasMade(TestApiGateway apiGateway, ApiRequest request) { assertThat(apiGateway.getLatestRequest(), equalTo(request)); } }