package com.quran.labs.androidquran.presenter.translation;
import android.content.Context;
import com.quran.labs.androidquran.dao.translation.TranslationList;
import com.quran.labs.androidquran.util.QuranSettings;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mockito;
import java.io.File;
import java.io.IOException;
import io.reactivex.observers.TestObserver;
import okhttp3.OkHttpClient;
import okhttp3.mockwebserver.MockResponse;
import okhttp3.mockwebserver.MockWebServer;
import okio.Buffer;
import okio.Okio;
import static com.google.common.truth.Truth.assertThat;
public class TranslationManagerPresenterTest {
private static final String CLI_ROOT_DIRECTORY = "src/test/resources";
private MockWebServer mockWebServer;
private TranslationManagerPresenter translationManager;
@Before
public void setup() {
Context mockAppContext = Mockito.mock(Context.class);
QuranSettings mockSettings = Mockito.mock(QuranSettings.class);
OkHttpClient mockOkHttp = new OkHttpClient.Builder().build();
mockWebServer = new MockWebServer();
translationManager = new TranslationManagerPresenter(
mockAppContext, mockOkHttp, mockSettings, null) {
@Override
void writeTranslationList(TranslationList list) {
// no op
}
};
translationManager.host = mockWebServer.url("").toString();
}
@After
public void tearDown() {
try {
mockWebServer.shutdown();
} catch (Exception e) {
// no op
}
}
@Test
public void testGetCachedTranslationListObservable() {
TestObserver<TranslationList> testObserver = new TestObserver<>();
this.translationManager.getCachedTranslationListObservable(true)
.subscribe(testObserver);
testObserver.awaitTerminalEvent();
testObserver.assertNoValues();
testObserver.assertNoErrors();
}
@Test
public void getRemoteTranslationListObservable() throws Exception {
MockResponse mockResponse = new MockResponse();
File file = new File(CLI_ROOT_DIRECTORY, "translations.json");
Buffer buffer = new Buffer();
buffer.writeAll(Okio.source(file));
mockResponse.setBody(buffer);
this.mockWebServer.enqueue(mockResponse);
TestObserver<TranslationList> testObserver = new TestObserver<>();
this.translationManager.getRemoteTranslationListObservable()
.subscribe(testObserver);
testObserver.awaitTerminalEvent();
testObserver.assertValueCount(1);
testObserver.assertNoErrors();
TranslationList list = testObserver.values().get(0);
assertThat(list.translations).hasSize(50);
}
@Test
public void getRemoteTranslationListObservableIssue() throws Exception {
MockResponse mockResponse = new MockResponse();
mockResponse.setResponseCode(500);
this.mockWebServer.enqueue(mockResponse);
TestObserver<TranslationList> testObserver = new TestObserver<>();
this.translationManager.getRemoteTranslationListObservable()
.subscribe(testObserver);
testObserver.awaitTerminalEvent();
testObserver.assertNoValues();
testObserver.assertError(IOException.class);
}
}