package com.truckmuncher.app.data; import com.truckmuncher.api.auth.AuthRequest; import com.truckmuncher.api.auth.AuthResponse; import com.truckmuncher.api.auth.AuthService; import com.truckmuncher.app.authentication.SessionTokenPreference; import com.truckmuncher.app.authentication.UserAccount; import com.truckmuncher.app.data.sync.ApiExceptionResolver; import com.truckmuncher.app.data.sync.ApiResult; import com.truckmuncher.testlib.ReadableRunner; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import retrofit.RetrofitError; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Matchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @RunWith(ReadableRunner.class) public class ApiExceptionResolverTest { @Mock AuthService authService; @Mock SessionTokenPreference sessionTokenPreference; @Mock UserAccount userAccount; ApiExceptionResolver resolver; @Before public void setUp() { MockitoAnnotations.initMocks(this); resolver = new ApiExceptionResolver(authService, sessionTokenPreference, userAccount); } @Test public void expiredSessionRefreshesAuthToken() { AuthResponse response = new AuthResponse.Builder() .sessionToken("SessionToken") .userId("UserId") .username("Username") .build(); when(authService.getAuth(any(AuthRequest.class))).thenReturn(response); assertThat(resolver.resolve(mock(ExpiredSessionException.class))).isEqualTo(ApiResult.SHOULD_RETRY); verify(sessionTokenPreference).set("SessionToken"); verify(userAccount).setUserId("UserId"); } @Test public void errorWithSocialCredentialsResultsInNeedingUserInput() { assertThat(resolver.resolve(mock(SocialCredentialsException.class))).isEqualTo(ApiResult.NEEDS_USER_INPUT); } @Test public void conversionErrorsArePermanent() { RetrofitError cause = mock(RetrofitError.class); when(cause.getKind()).thenReturn(RetrofitError.Kind.CONVERSION); ApiException exception = new ApiException("message", cause); assertThat(resolver.resolve(exception)).isEqualTo(ApiResult.PERMANENT_ERROR); } @Test public void networkErrorsAreTemporary() { RetrofitError cause = mock(RetrofitError.class); when(cause.getKind()).thenReturn(RetrofitError.Kind.NETWORK); ApiException exception = new ApiException("message", cause); assertThat(resolver.resolve(exception)).isEqualTo(ApiResult.TEMPORARY_ERROR); } @Test public void unknownRetrofitErrorsArePermanent() { RetrofitError cause = mock(RetrofitError.class); when(cause.getKind()).thenReturn(RetrofitError.Kind.UNEXPECTED); ApiException exception = new ApiException("message", cause); assertThat(resolver.resolve(exception)).isEqualTo(ApiResult.PERMANENT_ERROR); } @Test public void unknownErrorsArePermanent() { assertThat(resolver.resolve(mock(ApiException.class))).isEqualTo(ApiResult.PERMANENT_ERROR); } }