package com.novoda.bonfire;
import com.novoda.bonfire.analytics.Analytics;
import com.novoda.bonfire.analytics.ErrorLogger;
import com.novoda.bonfire.channel.service.ChannelService;
import com.novoda.bonfire.chat.service.ChatService;
import com.novoda.bonfire.login.service.LoginService;
import com.novoda.bonfire.user.service.UserService;
import com.novoda.notils.exception.DeveloperError;
import java.lang.reflect.Field;
import org.mockito.Mockito;
public class TestDependencies {
private TestDependencies() {
// use init method to create an instance
}
public static TestDependencies init() {
return new TestDependencies()
.withLoginService(Mockito.mock(LoginService.class))
.withUserService(Mockito.mock(UserService.class))
.withChatService(Mockito.mock(ChatService.class))
.withChannelService(Mockito.mock(ChannelService.class))
.withAnalytics(Mockito.mock(Analytics.class))
.withErrorLogger(Mockito.mock(ErrorLogger.class));
}
public TestDependencies withLoginService(LoginService loginService) {
setDependency("loginService", loginService);
return this;
}
public TestDependencies withUserService(UserService userService) {
setDependency("userService", userService);
return this;
}
public TestDependencies withChatService(ChatService chatService) {
setDependency("chatService", chatService);
return this;
}
public TestDependencies withChannelService(ChannelService channelService) {
setDependency("channelService", channelService);
return this;
}
public TestDependencies withAnalytics(Analytics analytics) {
setDependency("analytics", analytics);
return this;
}
private TestDependencies withErrorLogger(ErrorLogger errorLogger) {
setDependency("errorLogger", errorLogger);
return this;
}
private void setDependency(String fieldName, Object value) {
try {
Dependencies dependencies = Dependencies.INSTANCE;
Field field = dependencies.getClass().getDeclaredField(fieldName);
field.setAccessible(true);
field.set(dependencies, value);
} catch (NoSuchFieldException e) {
throw new DeveloperError("The field you're trying to access does not exist: " + fieldName, e);
} catch (IllegalAccessException e) {
throw new DeveloperError("Cannot access the field " + fieldName, e);
}
}
}