package io.coreflodev.openchat.api; import android.content.Context; import com.jakewharton.retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory; import org.junit.rules.TestRule; import org.junit.runner.Description; import org.junit.runners.model.Statement; import java.io.File; import io.coreflodev.openchat.common.network.GsonService; import io.coreflodev.openchat.common.network.HttpService; import okhttp3.mockwebserver.MockResponse; import okhttp3.mockwebserver.MockWebServer; import retrofit2.Retrofit; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; public class ApiTestRule implements TestRule { private Context context; private MockWebServer server; private Retrofit retrofit; public ApiTestRule() { server = new MockWebServer(); context = mock(Context.class); when(context.getCacheDir()).thenReturn(new File("src/test/resources")); } @Override public Statement apply(Statement base, Description description) { return new Statement() { @Override public void evaluate() throws Throwable { server.start(); retrofit = new Retrofit.Builder() .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .addConverterFactory(new GsonService().getGsonConverterFactory()) .baseUrl(server.url("").toString()) .client(new HttpService(context).getHttpClient()) .build(); base.evaluate(); server.shutdown(); } }; } public void stopServerForOfflineTest() throws Throwable { server.shutdown(); } public <T> T create(Class<T> service) { return retrofit.create(service); } public void enqueue(String body) { MockResponse response = new MockResponse(); response.setBody(body); enqueue(response); } public void enqueue(MockResponse mockResponse) { server.enqueue(mockResponse); } }