package com.pivotallabs.tracker; import android.view.View; import android.widget.EditText; import android.widget.ListView; 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.tester.android.view.TestMenu; import org.robolectric.tester.android.view.TestMenuItem; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import static com.pivotallabs.TestHelper.signIn; import static org.robolectric.Robolectric.shadowOf; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.nullValue; import static org.junit.Assert.assertThat; @RunWith(RobolectricTestRunner.class) public class RecentActivityActivityTest { private RecentActivityActivity activity; private AuthenticationGateway authenticationGateway; private TestApiGateway apiGateway; private ListView activityListView; @Before public void setUp() throws Exception { signIn(); createActivity(); authenticationGateway = new AuthenticationGateway(apiGateway, activity); activityListView = (ListView) activity.findViewById(R.id.recent_activity_list); } @Test public void shouldShowTheSignInDialogIfNotCurrentlySignedIn() throws Exception { signOutAndReCreateActivity(); assertThat(authenticationGateway.isAuthenticated(), equalTo(false)); assertThat(activity.signInDialog.isShowing(), equalTo(true)); } @Test public void shouldNotShowTheSignInDialogIfSignedIn() { assertThat(activity.signInDialog, nullValue()); } @Test public void shouldRetrieveRecentActivityUponSuccessfulSignIn() throws Exception { signOutAndReCreateActivity(); signInThroughDialog(); ApiRequest expectedRequest = new RecentActivityRequest("c93f12c"); assertThat(apiGateway.getLatestRequest(), equalTo(expectedRequest)); } @Test public void onCreate_shouldRetrieveRecentActivityWhenSignedIn() { assertThat(apiGateway.getLatestRequest(), equalTo((ApiRequest) new RecentActivityRequest("c93f12c"))); } @Test public void shouldPopulateViewWithRetrievedRecentActivity() throws Exception { apiGateway.simulateResponse(200, TestResponses.RECENT_ACTIVITY); String firstRowText = shadowOf((TextView) activityListView.getChildAt(0)).innerText(); assertThat(firstRowText, equalTo("I changed the 'request' for squidward. \"Add 'Buyout'\"")); } @Test public void shouldShowProgressBarWhileRequestIsOutstanding() throws Exception { View footerView = shadowOf(activityListView).getFooterViews().get(0); assertThat(footerView.getVisibility(), equalTo(View.VISIBLE)); apiGateway.simulateResponse(200, TestResponses.RECENT_ACTIVITY); assertThat(footerView.getVisibility(), equalTo(View.GONE)); } @Test public void shouldFinishWhenSignInDialogIsDismissedWithoutSuccessfulSignIn() { signOutAndReCreateActivity(); activity.signInDialog.cancel(); assertThat(shadowOf(activity).isFinishing(), equalTo(true)); } @Test public void shouldSignOutWhenTheSignOutButtonIsClicked() throws Exception { TestMenu menu = new TestMenu(); menu.add("garbage that should be cleared upon onPrepareOptionsMenu"); activity.onPrepareOptionsMenu(menu); TestMenuItem signOutMenuItem = (TestMenuItem) menu.getItem(0); assertThat(signOutMenuItem.isEnabled(), equalTo(true)); assertThat(signOutMenuItem.getTitle().toString(), equalTo("Sign Out")); signOutMenuItem.click(); assertThat(authenticationGateway.isAuthenticated(), equalTo(false)); assertThat(shadowOf(activity).isFinishing(), equalTo(true)); } @Test public void signOutButtonShouldBeDisabledWhenNotSignedIn() throws Exception { authenticationGateway.signOut(); TestMenu menu = new TestMenu(); activity.onPrepareOptionsMenu(menu); TestMenuItem signOutMenuItem = (TestMenuItem) menu.getItem(0); assertThat(signOutMenuItem.isEnabled(), equalTo(false)); assertThat(signOutMenuItem.getTitle().toString(), equalTo("Sign Out")); } private void signOutAndReCreateActivity() { authenticationGateway.signOut(); createActivity(); } private void signInThroughDialog() throws Exception { assertThat(activity.signInDialog.isShowing(), equalTo(true)); ((EditText) activity.signInDialog.findViewById(R.id.username)).setText("user"); ((EditText) activity.signInDialog.findViewById(R.id.password)).setText("pass"); activity.signInDialog.findViewById(R.id.sign_in_button).performClick(); apiGateway.simulateResponse(200, TestResponses.AUTH_SUCCESS); assertThat(activity.signInDialog.isShowing(), equalTo(false)); } private void createActivity() { apiGateway = new TestApiGateway(); activity = new RecentActivityActivity(); activity.apiGateway = apiGateway; activity.onCreate(null); } }