content: package com.pivotallabs.tracker;
  
  import android.app.Activity;
  import com.pivotallabs.TestCallbacks;
  import com.pivotallabs.api.TestApiGateway;
  import org.robolectric.RobolectricTestRunner;
  import org.junit.Before;
  import org.junit.Test;
  import org.junit.runner.RunWith;
  
  import static android.content.Context.MODE_PRIVATE;
  import static com.pivotallabs.TestResponses.AUTH_SUCCESS;
  import static com.pivotallabs.tracker.AuthenticationGateway.TRACKER_AUTH_PREF_KEY;
  import static org.hamcrest.CoreMatchers.equalTo;
  import static org.junit.Assert.assertThat;
  
  @RunWith(RobolectricTestRunner.class)
  public class AuthenticationGatewayTest {
  
      private TestApiGateway apiGateway;
      private TestCallbacks callbacks;
      private Activity context;
      private AuthenticationGateway authenticationGateway;
  
      @Before
      public void setUp() throws Exception {
          apiGateway = new TestApiGateway();
          context = new Activity();
          callbacks = new TestCallbacks();
          authenticationGateway = new AuthenticationGateway(apiGateway, context);
      }
  
      @Test
      public void shouldMakeARemoteCallWhenSigningIn() throws Exception {
          authenticationGateway.signIn("spongebob", "squidward", callbacks);
          String urlString = apiGateway.getLatestRequest().getUrlString();
          assertThat(urlString, equalTo("https://www.pivotaltracker.com/services/v3/tokens/active"));
      }
  
      @Test
      public void shouldSendUsernameAndPassword() throws Exception {
          authenticationGateway.signIn("spongebob", "squidward", callbacks);
          TrackerAuthenticationRequest request = (TrackerAuthenticationRequest) apiGateway.getLatestRequest();
          assertThat(request, equalTo(new TrackerAuthenticationRequest("spongebob", "squidward")));
      }
  
      @Test
      public void authenticated_shouldReturnTrueWhenSignedIn() throws Exception {
          assertThat(authenticationGateway.isAuthenticated(), equalTo(false));
          authenticationGateway.signIn("spongebob", "squidward", callbacks);
          apiGateway.simulateResponse(200, AUTH_SUCCESS);
          assertThat(authenticationGateway.isAuthenticated(), equalTo(true));
      }
  
      @Test
      public void signOutShouldRemoveTheSharedPreferences() throws Exception {
          authenticationGateway.signIn("spongebob", "squidward", callbacks);
          apiGateway.simulateResponse(200, AUTH_SUCCESS);
          authenticationGateway.signOut();
          assertThat(getStoredGuid(), equalTo(""));
      }
  
      @Test
      public void shouldCallSuccessWhenAuthenticationSucceeds() throws Exception {
          authenticationGateway.signIn("spongebob", "squidward", callbacks);
          apiGateway.simulateResponse(200, AUTH_SUCCESS);
          assertThat(callbacks.successWasCalled, equalTo(true));
          assertThat(callbacks.failureWasCalled, equalTo(false));
          assertThat(callbacks.completeWasCalled, equalTo(true));
      }
  
      @Test
      public void shouldCallFailureWhenAuthenticationFails() throws Exception {
          authenticationGateway.signIn("spongebob", "squidward", callbacks);
          apiGateway.simulateResponse(401, "Access Denied");
          assertThat(callbacks.failureWasCalled, equalTo(true));
          assertThat(callbacks.successWasCalled, equalTo(false));
          assertThat(callbacks.completeWasCalled, equalTo(true));
      }
  
      @Test
      public void shouldCallFailureWhenServerReturnsError() throws Exception {
          authenticationGateway.signIn("spongebob", "squidward", callbacks);
          apiGateway.simulateResponse(500, "ERROR");
          assertThat(callbacks.failureWasCalled, equalTo(true));
          assertThat(callbacks.successWasCalled, equalTo(false));
          assertThat(callbacks.completeWasCalled, equalTo(true));
      }
  
      @Test
      public void shouldStoreApiTokenInPrefs() throws Exception {
          authenticationGateway.signIn("spongebob", "squidward", callbacks);
          apiGateway.simulateResponse(200, AUTH_SUCCESS);
          assertThat(getStoredGuid(), equalTo("c93f12c"));
      }
  
      @Test
      public void getGuid_shouldReturnGuidFromResponse() throws Exception {
          authenticationGateway.signIn("spongebob", "squidward", callbacks);
          apiGateway.simulateResponse(200, AUTH_SUCCESS);
          assertThat(authenticationGateway.getToken(), equalTo("c93f12c"));
      }
  
      private String getStoredGuid() {
          return context.getSharedPreferences(TRACKER_AUTH_PREF_KEY, MODE_PRIVATE).getString("guid", "");
      }
  }
  