From 85570f67fffabc21182f0fe9bafe393b5215feeb Mon Sep 17 00:00:00 2001 From: Zeyad-37 Date: Tue, 12 Dec 2017 10:41:52 +0100 Subject: [PATCH] updated gradle and dependencies, updated realm --- .gitignore | 2 + .idea/codeStyleSettings.xml | 229 ++++++++++++++++++ .idea/eclipseCodeFormatter.xml | 13 + .idea/findbugs-idea.xml | 13 + .idea/misc.xml | 2 +- build.gradle | 47 +++- gradle/wrapper/gradle-wrapper.properties | 4 +- usecases/build.gradle | 64 ++--- .../com/zeyad/usecases/api/DataService.java | 28 +-- .../com/zeyad/usecases/db/RealmManager.java | 123 +++++----- .../usecases/ImmediateSchedulersRule.java | 33 +++ .../zeyad/usecases/db/RealmManagerTest.java | 3 +- .../integration/APIIntegrationTest.java | 17 +- 13 files changed, 446 insertions(+), 132 deletions(-) create mode 100644 .idea/codeStyleSettings.xml create mode 100644 .idea/eclipseCodeFormatter.xml create mode 100644 .idea/findbugs-idea.xml create mode 100644 usecases/src/test/java/com/zeyad/usecases/ImmediateSchedulersRule.java diff --git a/.gitignore b/.gitignore index 9997f3b..c113071 100644 --- a/.gitignore +++ b/.gitignore @@ -46,3 +46,5 @@ captures/ # Keystore files *.jks + +/.idea/sonarlint diff --git a/.idea/codeStyleSettings.xml b/.idea/codeStyleSettings.xml new file mode 100644 index 0000000..25a8b87 --- /dev/null +++ b/.idea/codeStyleSettings.xml @@ -0,0 +1,229 @@ + + + + + + \ No newline at end of file diff --git a/.idea/eclipseCodeFormatter.xml b/.idea/eclipseCodeFormatter.xml new file mode 100644 index 0000000..046b942 --- /dev/null +++ b/.idea/eclipseCodeFormatter.xml @@ -0,0 +1,13 @@ + + + + + + \ No newline at end of file diff --git a/.idea/findbugs-idea.xml b/.idea/findbugs-idea.xml new file mode 100644 index 0000000..6039420 --- /dev/null +++ b/.idea/findbugs-idea.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index 4490e9d..deec648 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -35,7 +35,7 @@ - + diff --git a/build.gradle b/build.gradle index 98d0555..87f16da 100644 --- a/build.gradle +++ b/build.gradle @@ -1,16 +1,57 @@ +project.ext { + supportLibrary = '26.1.0' + butterKnife = '8.8.1' + rxbinding = '2.0.0' + okhttpVersion = '3.9.1' + archComp = '1.0.0' + rxjava = '2.1.7' + rxAndroid = '2.0.1' + genericRecyclerViewAdapter = '1.6.2' + rxredux = '2.0.0' + glide = '4.0.0' + lottie = '2.2.0' + retrofit = '2.3.0' + + rxlint = '1.6' + leakCanary = '1.5.4' + androidSupportTest = '1.0.1' + espressoCore = '3.0.1' + powerMock = '1.7.3' + robolectric = '3.3.2' +// robolectric = '3.5.1' + okhttpIdelingResource = '1.0.0' + mockito = '1.10.19' +// mockito = '2.10.0' + mockitoKotlin = '1.5.0' + restMock = '0.2.2' + junit = '4.12' +} + // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { + ext.kotlin_version = '1.2.0' repositories { jcenter() + google() + mavenCentral() + maven { + url "https://plugins.gradle.org/m2/" // error-prone + } } dependencies { - classpath 'com.android.tools.build:gradle:2.3.3' + classpath 'com.android.tools.build:gradle:3.0.1' + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // classpath 'com.google.gms:google-services:3.1.0' - classpath 'io.realm:realm-gradle-plugin:3.4.0' + classpath 'io.realm:realm-gradle-plugin:4.2.0' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5' -// classpath "com.uber:infer-plugin:0.7.4" + classpath "com.uber:infer-plugin:0.7.4" + classpath "net.ltgt.gradle:gradle-errorprone-plugin:0.0.13" + classpath 'pl.droidsonroids.gradle:gradle-pitest-plugin:0.1.4' + classpath 'com.dicedmelon.gradle:jacoco-android:0.1.2' + classpath "gradle.plugin.org.jmailen.gradle:kotlinter-gradle:1.5.1" + classpath "gradle.plugin.io.gitlab.arturbosch.detekt:detekt-gradle-plugin:1.0.0.RC5-5" } } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index a2be7ed..27b8ec9 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Thu Jul 27 15:41:02 COT 2017 +#Mon Dec 11 16:14:29 CET 2017 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip diff --git a/usecases/build.gradle b/usecases/build.gradle index 9355f6f..0e674ed 100644 --- a/usecases/build.gradle +++ b/usecases/build.gradle @@ -1,36 +1,36 @@ apply plugin: 'com.android.library' -apply plugin: 'me.tatarka.retrolambda' -apply plugin: 'android-apt' // remove +//apply plugin: 'me.tatarka.retrolambda' +//apply plugin: 'android-apt' // remove apply plugin: 'maven' apply plugin: 'realm-android' apply plugin: 'com.github.dcendents.android-maven' -apply plugin: "net.ltgt.errorprone" +//apply plugin: "net.ltgt.errorprone" version = "1.0.1" group = "com.github.zeyad-37" -buildscript { - repositories { - maven { - url "https://plugins.gradle.org/m2/" - } - } - - dependencies { - classpath 'me.tatarka:gradle-retrolambda:3.7.0' - classpath "net.ltgt.gradle:gradle-errorprone-plugin:0.0.10" - } -} - -repositories { - mavenCentral() -} +//buildscript { +// repositories { +// maven { +// url "https://plugins.gradle.org/m2/" +// } +// } +// +// dependencies { +//// classpath 'me.tatarka:gradle-retrolambda:3.7.0' +//// classpath "net.ltgt.gradle:gradle-errorprone-plugin:0.0.13" +// } +//} +// +//repositories { +// mavenCentral() +//} android { compileSdkVersion 26 - buildToolsVersion '25.0.3' + buildToolsVersion '26.0.2' defaultConfig { minSdkVersion 17 targetSdkVersion 26 @@ -61,6 +61,7 @@ android { testOptions { unitTests.returnDefaultValues = true + unitTests.includeAndroidResources = true unitTests.all { // All the usual Gradle options. jvmArgs '-XX:MaxPermSize=256m' @@ -91,17 +92,6 @@ android { } } -ext { - supportLibrary = '25.4.0' - retrofit = '2.3.0' - okhttpVersion = '3.8.0' - androidSupportTest = '0.5' - espressoCore = '2.2.2' - powerMock = '1.6.6' - robolectric = '3.3.2' - okhttpIdelingResource = '1.0.0' -} - dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) //Job Dispatcher @@ -115,29 +105,27 @@ dependencies { compile "com.android.support:support-annotations:$supportLibrary" // Rx compile 'io.reactivex.rxjava2:rxandroid:2.0.1' - compile 'io.reactivex.rxjava2:rxjava:2.1.1' + compile 'io.reactivex.rxjava2:rxjava:2.1.7' testCompile 'io.reactivex:rxandroid:1.2.1' // Cache -// compile('com.github.lowlevel-studios:storo:1.1.0') { -// transitive = true -// } compile('com.github.Zeyad-37:Storo:2.1.0') { transitive = true } compile 'com.rollbar:rollbar-android:0.2.1' + compile 'nl.littlerobots.rxlint:rxlint:1.6' // Testing testCompile 'junit:junit:4.12' testCompile "com.android.support:support-annotations:$supportLibrary" - testCompile "org.mockito:mockito-core:1.10.19" + testCompile "org.mockito:mockito-core:$mockito" testCompile "org.robolectric:robolectric:$robolectric" - testCompile "org.robolectric:shadows-support-v4:$robolectric" +// testCompile "org.robolectric:shadows-support-v4:$robolectric" testCompile "org.powermock:powermock-module-junit4:$powerMock" testCompile "org.powermock:powermock-module-junit4-rule:$powerMock" testCompile "org.powermock:powermock-api-mockito:$powerMock" testCompile "org.powermock:powermock-classloading-xstream:$powerMock" - testCompile "com.squareup.okhttp3:mockwebserver:$okhttpVersion" +// testCompile "com.squareup.okhttp3:mockwebserver:$okhttpVersion" testCompile 'com.github.andrzejchm.RESTMock:android:0.2.2' //required to resolve robolectric test problems testCompile("com.jakewharton.espresso:okhttp3-idling-resource:$okhttpIdelingResource") { diff --git a/usecases/src/main/java/com/zeyad/usecases/api/DataService.java b/usecases/src/main/java/com/zeyad/usecases/api/DataService.java index 19a2c91..d27d32e 100644 --- a/usecases/src/main/java/com/zeyad/usecases/api/DataService.java +++ b/usecases/src/main/java/com/zeyad/usecases/api/DataService.java @@ -42,14 +42,14 @@ class DataService implements IDataService { } @Override - public Flowable> getList(@NonNull GetRequest getListRequest) { + public Flowable> getList(@NonNull final GetRequest getListRequest) { Flowable> result; try { - Class dataClass = getListRequest.getDataClass(); - String url = getListRequest.getUrl(); - String simpleName = dataClass.getSimpleName(); - boolean shouldCache = getListRequest.isShouldCache(); - Flowable> dynamicGetList = mDataStoreFactory.dynamically(url, dataClass) + final Class dataClass = getListRequest.getDataClass(); + final String url = getListRequest.getUrl(); + final String simpleName = dataClass.getSimpleName(); + final boolean shouldCache = getListRequest.isShouldCache(); + final Flowable> dynamicGetList = mDataStoreFactory.dynamically(url, dataClass) .dynamicGetList(url, getListRequest.getIdColumnName(), dataClass, getListRequest.isPersist(), shouldCache); if (Utils.getInstance().withCache(shouldCache)) { @@ -61,22 +61,22 @@ public Flowable> getList(@NonNull GetRequest getListRequest) { } else { result = dynamicGetList; } - } catch (IllegalAccessException e) { + } catch (final IllegalAccessException e) { result = Flowable.error(e); } return result.compose(applySchedulers()); } @Override - public Flowable getObject(@NonNull GetRequest getRequest) { + public Flowable getObject(@NonNull final GetRequest getRequest) { Flowable result; try { - Object itemId = getRequest.getItemId(); - Class dataClass = getRequest.getDataClass(); - boolean shouldCache = getRequest.isShouldCache(); - String url = getRequest.getUrl(); - String simpleName = dataClass.getSimpleName(); - Flowable dynamicGetObject = mDataStoreFactory.dynamically(url, dataClass) + final Object itemId = getRequest.getItemId(); + final Class dataClass = getRequest.getDataClass(); + final boolean shouldCache = getRequest.isShouldCache(); + final String url = getRequest.getUrl(); + final String simpleName = dataClass.getSimpleName(); + final Flowable dynamicGetObject = mDataStoreFactory.dynamically(url, dataClass) .dynamicGetObject(url, getRequest.getIdColumnName(), itemId, getRequest.getIdType(), dataClass, getRequest.isPersist(), shouldCache); if (Utils.getInstance().withCache(shouldCache)) { diff --git a/usecases/src/main/java/com/zeyad/usecases/db/RealmManager.java b/usecases/src/main/java/com/zeyad/usecases/db/RealmManager.java index 034bced..127d7af 100644 --- a/usecases/src/main/java/com/zeyad/usecases/db/RealmManager.java +++ b/usecases/src/main/java/com/zeyad/usecases/db/RealmManager.java @@ -31,20 +31,23 @@ public class RealmManager implements DataBaseManager { /** * Gets an {@link Flowable} which will emit an Object + * * @param idColumnName name of ID variable - * @param itemId ID value - * @param itemIdType type of the ID - * @param dataClass type of the data requested - * @param type of the data requested + * @param itemId ID value + * @param itemIdType type of the ID + * @param dataClass type of the data requested + * @param type of the data requested * @return a {@link Flowable} containing an object of type M. */ @NonNull @Override public Flowable getById(@NonNull final String idColumnName, final Object itemId, final Class itemIdType, Class dataClass) { - return Flowable.defer(() -> getRealm(Realm.getDefaultInstance()) - .flatMap(realm -> getItemById(realm, dataClass, idColumnName, itemId, itemIdType) - .map(realmModel -> (M) realm.copyFromRealm(realmModel)))); + return Flowable.defer(() -> { + Realm realm = Realm.getDefaultInstance(); + return getItemById(realm, dataClass, idColumnName, itemId, itemIdType) + .map(realmModel -> (M) realm.copyFromRealm(realmModel)); + }); } /** @@ -57,12 +60,11 @@ public Flowable getById(@NonNull final String idColumnName, final Object public Flowable> getAll(Class clazz) { return Flowable.defer(() -> { Realm realm = Realm.getDefaultInstance(); - return getRealm(realm) - .map(realm1 -> realm1.where(clazz).findAll()) - .filter(RealmResults::isLoaded) - .>map(realm::copyFromRealm) - .flatMap(ms -> ms.isEmpty() ? Flowable.error(new IllegalAccessException(String - .format("%s(s) were not found!", clazz.getSimpleName()))) : Flowable.just(ms)); + return realm.where(clazz).findAll().asFlowable() + .filter(o -> ((RealmResults) o).isLoaded()) + .map(o -> realm.copyFromRealm((RealmResults) o)) + .flatMap(o -> ((RealmResults) o).isEmpty() ? Flowable.error(new IllegalAccessException(String + .format("%s(s) were not found!", clazz.getSimpleName()))) : Flowable.just(o)); }); } @@ -78,7 +80,7 @@ public Flowable> getAll(Class clazz) { public Flowable> getQuery(@NonNull RealmQueryProvider queryFactory) { return Flowable.defer(() -> { Realm realm = Realm.getDefaultInstance(); - return getRealm(realm).map(realm1 -> queryFactory.create(realm).findAll()) + return queryFactory.create(realm).findAll().asFlowable() .filter(RealmResults::isLoaded) .map(realm::copyFromRealm); }); @@ -93,16 +95,10 @@ public Flowable> getQuery(@NonNull RealmQueryProv @NonNull @Override // TODO: 6/13/17 Remove ? remove : create flow - public Single put(@Nullable M realmModel, @NonNull Class dataClass) { + public Single put(@NonNull M realmModel, @NonNull Class dataClass) { return Single.fromCallable(() -> { - if (realmModel == null) { - throw new IllegalArgumentException("RealmObject is null"); - } else { - return getRealm(Realm.getDefaultInstance()).map(realm1 -> - RealmObject.isValid(executeWriteOperationInRealm(realm1, - () -> realm1.copyToRealmOrUpdate(realmModel)))) - .blockingFirst(); - } + return RealmObject.isValid(executeWriteOperationInRealm(Realm.getDefaultInstance(), + (ExecuteAndReturn) realm -> realm.copyToRealmOrUpdate(realmModel))); }); } @@ -121,11 +117,10 @@ public Single put(@Nullable JSONObject jsonObject, @Nullable String idC if (jsonObject == null) { throw new IllegalArgumentException("JSONObject is invalid"); } else { - updateJsonObjectWithIdValue(jsonObject, idColumnName, itemIdType, dataClass); - return getRealm(Realm.getDefaultInstance()).map(realm1 -> - RealmObject.isValid(executeWriteOperationInRealm(realm1, - () -> realm1.createOrUpdateObjectFromJson(dataClass, jsonObject)))) - .blockingFirst(); + final JSONObject updatedJSON = updateJsonObjectWithIdValue(jsonObject, idColumnName, itemIdType, dataClass); + return RealmObject.isValid(executeWriteOperationInRealm(Realm.getDefaultInstance(), + (ExecuteAndReturn) realm -> realm.createOrUpdateObjectFromJson(dataClass, + updatedJSON))); } }); } @@ -133,10 +128,8 @@ public Single put(@Nullable JSONObject jsonObject, @Nullable String idC @NonNull @Override public Single putAll(List realmObjects, Class dataClass) { - return Single.fromCallable(() -> getRealm(Realm.getDefaultInstance()) - .map(realm1 -> executeWriteOperationInRealm(realm1, - () -> realm1.copyToRealmOrUpdate(realmObjects)).size() == realmObjects.size()) - .blockingFirst()); + return Single.fromCallable(() -> executeWriteOperationInRealm(Realm.getDefaultInstance(), + (ExecuteAndReturn>) realm -> realm.copyToRealmOrUpdate(realmObjects)).size() == realmObjects.size()); } /** @@ -151,12 +144,11 @@ public Single putAll(List realmObjects, Class public Single putAll(@NonNull JSONArray jsonArray, String idColumnName, Class itemIdType, @NonNull Class dataClass) { return Single.fromCallable(() -> { - updateJsonArrayWithIdValue(jsonArray, idColumnName, itemIdType, dataClass); - return getRealm(Realm.getDefaultInstance()).map(realm1 -> { - executeWriteOperationInRealm(realm1, () -> - realm1.createOrUpdateAllFromJson(dataClass, jsonArray)); - return true; - }).blockingFirst(); + final JSONArray updatedJSONArray = updateJsonArrayWithIdValue(jsonArray, idColumnName, itemIdType, + dataClass); + executeWriteOperationInRealm(Realm.getDefaultInstance(), (Execute) realm -> + realm.createOrUpdateAllFromJson(dataClass, updatedJSONArray)); + return true; }); } @@ -168,11 +160,10 @@ public Single putAll(@NonNull JSONArray jsonArray, String idColumnName, @NonNull @Override public Single evictAll(@NonNull Class clazz) { - return Single.fromCallable(() -> getRealm(Realm.getDefaultInstance()) - .map(realm1 -> { - executeWriteOperationInRealm(realm1, () -> realm1.delete(clazz)); - return true; - }).blockingFirst()); + return Single.fromCallable(() -> { + executeWriteOperationInRealm(Realm.getDefaultInstance(), (Execute) realm -> realm.delete(clazz)); + return true; + }); } /** @@ -185,37 +176,32 @@ public Single evictAll(@NonNull Class clazz) { @NonNull @Override public Single evictCollection(@NonNull String idFieldName, @NonNull List list, - final Class itemIdType, @NonNull Class dataClass) { + final Class itemIdType, @NonNull Class dataClass) { return Single.fromCallable(() -> list.isEmpty() ? false : Observable.fromIterable(list) - .map(id -> evictById(dataClass, idFieldName, id, itemIdType)) - .reduce((aBoolean, aBoolean2) -> aBoolean && aBoolean2) - .blockingGet()); + .map(id -> evictById(dataClass, idFieldName, id, itemIdType)) + .reduce((aBoolean, aBoolean2) -> aBoolean && aBoolean2) + .blockingGet()); } /** * Evict element by id of the DB. * - * @param dataClass Class type of the items to be deleted. - * @param idColumnName The id used to look for inside the DB. - * @param itemId Name of the id field. - * @param itemIdType Class type of the item id to be deleted. + * @param dataClass Class type of the items to be deleted. + * @param idColumnName The id used to look for inside the DB. + * @param itemId Name of the id field. + * @param itemIdType Class type of the item id to be deleted. */ @Override public boolean evictById(@NonNull Class dataClass, @NonNull String idColumnName, final Object itemId, final Class itemIdType) { Realm realm = Realm.getDefaultInstance(); - return getRealm(Realm.getDefaultInstance()) - .flatMap(realm1 -> getItemById(realm1, dataClass, idColumnName, itemId, itemIdType)) + return getItemById(realm, dataClass, idColumnName, itemId, itemIdType) .map(realmModel -> { if (realmModel == null) { return false; } else { - executeWriteOperationInRealm(realm, new Execute() { - @Override - public void run() { - RealmObject.deleteFromRealm(realmModel); - } - }); + executeWriteOperationInRealm(realm, (Execute) unused -> RealmObject.deleteFromRealm + (realmModel)); return !RealmObject.isValid(realmModel); } }) @@ -224,7 +210,7 @@ public void run() { private Flowable getItemById(Realm realm, @NonNull Class dataClass, @NonNull String idColumnName, final Object itemId, final Class itemIdType) { - RealmModel result; + Object result; if (itemIdType.equals(long.class) || itemIdType.equals(Long.class)) { result = realm.where(dataClass).equalTo(idColumnName, (long) itemId).findFirst(); } else if (itemIdType.equals(int.class) || itemIdType.equals(Integer.class)) { @@ -244,7 +230,7 @@ else if (itemIdType.equals(byte.class) || itemIdType.equals(Byte.class)) { return Flowable.error(new IllegalAccessException(String .format("%s with ID: %s was not found!", dataClass.getSimpleName(), itemId))); } - return Flowable.just(result); + return Flowable.just((RealmModel) result); } private void executeWriteOperationInRealm(@NonNull Realm realm, @NonNull Execute execute) { @@ -252,7 +238,7 @@ private void executeWriteOperationInRealm(@NonNull Realm realm, @NonNull Execute realm.cancelTransaction(); } realm.beginTransaction(); - execute.run(); + execute.run(realm); realm.commitTransaction(); } @@ -262,7 +248,7 @@ private T executeWriteOperationInRealm(@NonNull Realm realm, @NonNull Execut realm.cancelTransaction(); } realm.beginTransaction(); - toReturnValue = executor.run(); + toReturnValue = executor.runAndReturn(realm); realm.commitTransaction(); return toReturnValue; } @@ -274,12 +260,14 @@ private JSONArray updateJsonArrayWithIdValue(@NonNull JSONArray jsonArray, @Null throw new IllegalArgumentException(NO_ID); } int length = jsonArray.length(); + JSONArray updatedJSONArray = new JSONArray(); for (int i = 0; i < length; i++) { if (jsonArray.opt(i) instanceof JSONObject) { - updateJsonObjectWithIdValue(jsonArray.optJSONObject(i), idColumnName, itemIdType, dataClass); + updatedJSONArray.put(updateJsonObjectWithIdValue(jsonArray.optJSONObject(i), idColumnName, itemIdType, + dataClass)); } } - return jsonArray; + return updatedJSONArray; } @NonNull @@ -306,6 +294,7 @@ private int getNextId(Class clazz, String column) { } } + @Deprecated private Flowable getRealm(Realm realm) { return Flowable.create(emitter -> { RealmConfiguration realmConfiguration = realm.getConfiguration(); @@ -322,11 +311,11 @@ private Flowable getRealm(Realm realm) { } private interface Execute { - void run(); + void run(Realm realm); } private interface ExecuteAndReturn { @NonNull - T run(); + T runAndReturn(Realm realm); } } diff --git a/usecases/src/test/java/com/zeyad/usecases/ImmediateSchedulersRule.java b/usecases/src/test/java/com/zeyad/usecases/ImmediateSchedulersRule.java new file mode 100644 index 0000000..0eb5b87 --- /dev/null +++ b/usecases/src/test/java/com/zeyad/usecases/ImmediateSchedulersRule.java @@ -0,0 +1,33 @@ +package com.zeyad.usecases; + +import org.junit.rules.TestRule; +import org.junit.runner.Description; +import org.junit.runners.model.Statement; + +import io.reactivex.plugins.RxJavaPlugins; +import io.reactivex.schedulers.Schedulers; + +/** + * Created by ZIaDo on 12/3/17. + */ +public class ImmediateSchedulersRule implements TestRule { + @Override + public Statement apply(final Statement base, Description description) { + return new Statement() { + @Override + public void evaluate() throws Throwable { + RxJavaPlugins.setIoSchedulerHandler(scheduler -> + Schedulers.trampoline()); + RxJavaPlugins.setComputationSchedulerHandler(scheduler -> + Schedulers.trampoline()); + RxJavaPlugins.setNewThreadSchedulerHandler(scheduler -> + Schedulers.trampoline()); + try { + base.evaluate(); + } finally { + RxJavaPlugins.reset(); + } + } + }; + } +} diff --git a/usecases/src/test/java/com/zeyad/usecases/db/RealmManagerTest.java b/usecases/src/test/java/com/zeyad/usecases/db/RealmManagerTest.java index 36742cb..dc0cc9e 100644 --- a/usecases/src/test/java/com/zeyad/usecases/db/RealmManagerTest.java +++ b/usecases/src/test/java/com/zeyad/usecases/db/RealmManagerTest.java @@ -21,7 +21,6 @@ import java.util.ArrayList; import io.reactivex.Flowable; -import io.reactivex.Observable; import io.reactivex.Single; import io.reactivex.observers.TestObserver; import io.reactivex.subscribers.TestSubscriber; @@ -46,7 +45,7 @@ public Realm mockRealm() { Realm mockRealm = mock(Realm.class); RealmQuery realmQuery = mock(RealmQuery.class); RealmResults realmResults = mock(RealmResults.class); - Observable observable = Observable.just(realmResults); +// Observable observable = Observable.just(realmResults); PowerMockito.when(mockRealm.where(TestRealmModel.class)).thenReturn(realmQuery); PowerMockito.when(mockRealm.where(TestRealmModel.class).equalTo("id", 1L)) .thenReturn(realmQuery); diff --git a/usecases/src/test/java/com/zeyad/usecases/integration/APIIntegrationTest.java b/usecases/src/test/java/com/zeyad/usecases/integration/APIIntegrationTest.java index c8abe8b..6d3fe75 100644 --- a/usecases/src/test/java/com/zeyad/usecases/integration/APIIntegrationTest.java +++ b/usecases/src/test/java/com/zeyad/usecases/integration/APIIntegrationTest.java @@ -2,14 +2,15 @@ import android.support.test.rule.BuildConfig; +import com.zeyad.usecases.ImmediateSchedulersRule; import com.zeyad.usecases.api.DataServiceConfig; import com.zeyad.usecases.api.DataServiceFactory; import com.zeyad.usecases.api.IDataService; import com.zeyad.usecases.requests.GetRequest; import com.zeyad.usecases.requests.PostRequest; -import org.assertj.core.util.Arrays; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RuntimeEnvironment; @@ -33,11 +34,14 @@ @RunWith(AndroidRobolectricRunner.class) @Config(constants = BuildConfig.class, sdk = 25, application = TestApplication.class) public class APIIntegrationTest { + private final static String userResponse = "{\"login\": \"Zeyad-37\", \"id\": 5938141, \"avatar_url\": " + "\"https://avatars2.githubusercontent.com/u/5938141?v=3\"}", userListResponse = "[" + userResponse + ", " + userResponse + "]", SUCCESS = "{\"success\": \"true\"}"; private final static Success success = new Success(true); + @Rule + public final ImmediateSchedulersRule testSchedulerRule = new ImmediateSchedulersRule(); private IDataService dataService; private User testUser; private List users; @@ -62,13 +66,13 @@ public void setUp() throws IOException { @Test public void testValidUser() throws Exception { - String getUserPath = "users/Zeyad-37"; + final String getUserPath = "users/Zeyad-37"; RESTMockServer.whenGET(pathContains(getUserPath)) .thenReturn(new MockResponse() .setResponseCode(HttpURLConnection.HTTP_OK) .setBody(userResponse)); - TestSubscriber testSubscriber = new TestSubscriber<>(); + final TestSubscriber testSubscriber = new TestSubscriber<>(); dataService. getObject(new GetRequest.Builder(User.class, false) .url(getUserPath) .id("Zeyad-37", User.LOGIN, String.class) @@ -284,11 +288,14 @@ public void testDeleteCollectionByIds() throws Exception { .thenReturn(new MockResponse() .setResponseCode(HttpURLConnection.HTTP_OK) .setBody(SUCCESS)); - + List payload = new ArrayList<>(2); + payload.add("Zeyad-37"); + payload.add("Zeyad-37"); TestSubscriber testSubscriber = new TestSubscriber<>(); dataService. deleteCollectionByIds(new PostRequest.Builder(User.class, false) .url(path) - .payLoad(Arrays.array("Zeyad-37", "Zeyad-37")) +// .payLoad(Arrays.array("Zeyad-37", "Zeyad-37")) + .payLoad(payload) .idColumnName(User.LOGIN, String.class) .responseType(Success.class) .build())