package ph.devcon.android.test.auth;
import com.google.common.base.Optional;
import com.squareup.okhttp.mockwebserver.MockResponse;
import com.squareup.okhttp.mockwebserver.MockWebServer;
import com.squareup.okhttp.mockwebserver.RecordedRequest;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import javax.inject.Inject;
import dagger.Module;
import ph.devcon.android.auth.AuthService;
import ph.devcon.android.test.BaseApplicationTestCase;
import ph.devcon.android.test.base.DevConTestModule;
import ph.devcon.android.test.base.FakeAPITestModule;
import ph.devcon.android.test.base.Mocker;
/**
* Created by lope on 11/11/14.
*/
public class AuthTestCase extends BaseApplicationTestCase {
@Inject
MockWebServer mockWebServer;
@Inject
AuthService authService;
@Override
protected void tearDown() throws Exception {
super.tearDown();
if (Optional.fromNullable(mockWebServer).isPresent())
mockWebServer.shutdown();
}
public void testShouldReturnTokenFromResponseString() {
final CountDownLatch signal = new CountDownLatch(1);
mockWebServer.enqueue(new MockResponse().setBody("{status_code: 200, message: " +
"\"Successfully authenticated\", authentication_token: \"" + Mocker.TOKEN + "\"}"));
authService.authenticate(Mocker.USERNAME_VALID, Mocker.PASSWORD_VALID,
new AuthService.AuthCallback() {
@Override
public void onAuthenticated(String token) {
signal.countDown();
assertEquals(Mocker.TOKEN, token);
}
@Override
public void onAuthenticationFailed(Integer statusCode, String message) {
signal.countDown();
assertFalse();
}
});
try {
signal.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
try {
RecordedRequest request1 = mockWebServer.takeRequest();
assertEquals("/tokens", request1.getPath());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void testShouldCacheTokenResponse() {
testShouldReturnTokenFromResponseString();
try {
assertEquals(authService.getCachedToken(), Mocker.TOKEN);
} catch (AuthService.TokenNotExistsException e) {
e.printStackTrace();
assertFalse();
}
}
public void testShouldLogout() {
authService.logout();
assertEquals(false, authService.isAuthenticated());
}
@Override
protected List<Object> getModules() {
List<Object> objects = super.getModules();
objects.add(new AuthFakeAPITestModule());
return objects;
}
@Module(injects = {AuthTestCase.class},
includes = {FakeAPITestModule.class, DevConTestModule.class},
library = true,
complete = true,
overrides = true)
static class AuthFakeAPITestModule {
}
}