diff --git a/CHANGELOG.md b/CHANGELOG.md index eac3663a..d538069d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,15 @@ Change Log ========== +Version 1.0.2 *(2018-07-10)* +---------------------------- + + * New: Add support for multiple file upload with same key + * New: Add support for multi contentType in multipart + * Bump OkHttp Version to 3.10.0 + * Bump other dependencies + + Version 1.0.1 *(2017-12-20)* ---------------------------- diff --git a/README.md b/README.md index 8b147681..a10476d7 100644 --- a/README.md +++ b/README.md @@ -57,7 +57,7 @@ Fast Android Networking Library supports Android 2.3 (Gingerbread) and later. Add this in your build.gradle ```groovy -compile 'com.amitshekhar.android:android-networking:1.0.1' +compile 'com.amitshekhar.android:android-networking:1.0.2' ``` Do not forget to add internet permission in manifest if already not present ```xml @@ -77,7 +77,7 @@ AndroidNetworking.initialize(getApplicationContext(),okHttpClient); ``` Using the Fast Android Networking with Jackson Parser ```groovy -compile 'com.amitshekhar.android:jackson-android-networking:1.0.1' +compile 'com.amitshekhar.android:jackson-android-networking:1.0.2' ``` ```java // Then set the JacksonParserFactory like below diff --git a/android-networking/src/main/java/com/androidnetworking/common/ANRequest.java b/android-networking/src/main/java/com/androidnetworking/common/ANRequest.java index ab756177..d85b1db8 100644 --- a/android-networking/src/main/java/com/androidnetworking/common/ANRequest.java +++ b/android-networking/src/main/java/com/androidnetworking/common/ANRequest.java @@ -40,6 +40,8 @@ import com.androidnetworking.interfaces.UploadProgressListener; import com.androidnetworking.internal.ANRequestQueue; import com.androidnetworking.internal.SynchronousCall; +import com.androidnetworking.model.MultipartFileBody; +import com.androidnetworking.model.MultipartStringBody; import com.androidnetworking.utils.ParseUtil; import com.androidnetworking.utils.Utils; import com.google.gson.internal.$Gson$Types; @@ -89,10 +91,10 @@ public class ANRequest { private HashMap> mHeadersMap = new HashMap<>(); private HashMap mBodyParameterMap = new HashMap<>(); private HashMap mUrlEncodedFormBodyParameterMap = new HashMap<>(); - private HashMap mMultiPartParameterMap = new HashMap<>(); + private HashMap mMultiPartParameterMap = new HashMap<>(); private HashMap> mQueryParameterMap = new HashMap<>(); private HashMap mPathParameterMap = new HashMap<>(); - private HashMap mMultiPartFileMap = new HashMap<>(); + private HashMap> mMultiPartFileMap = new HashMap<>(); private String mDirPath; private String mFileName; private String mApplicationJsonString = null; @@ -849,22 +851,34 @@ public RequestBody getRequestBody() { } public RequestBody getMultiPartRequestBody() { - MultipartBody.Builder builder = new MultipartBody - .Builder() + MultipartBody.Builder builder = new MultipartBody.Builder() .setType((customMediaType == null) ? MultipartBody.FORM : customMediaType); try { - for (HashMap.Entry entry : mMultiPartParameterMap.entrySet()) { + for (HashMap.Entry entry : mMultiPartParameterMap.entrySet()) { + MultipartStringBody stringBody = entry.getValue(); + MediaType mediaType = null; + if (stringBody.contentType != null) { + mediaType = MediaType.parse(stringBody.contentType); + } builder.addPart(Headers.of("Content-Disposition", "form-data; name=\"" + entry.getKey() + "\""), - RequestBody.create(null, entry.getValue())); - } - for (HashMap.Entry entry : mMultiPartFileMap.entrySet()) { - String fileName = entry.getValue().getName(); - RequestBody fileBody = RequestBody.create(MediaType.parse(Utils.getMimeType(fileName)), - entry.getValue()); - builder.addPart(Headers.of("Content-Disposition", - "form-data; name=\"" + entry.getKey() + "\"; filename=\"" + fileName + "\""), - fileBody); + RequestBody.create(mediaType, stringBody.value)); + } + for (HashMap.Entry> entry : mMultiPartFileMap.entrySet()) { + List fileBodies = entry.getValue(); + for (MultipartFileBody fileBody : fileBodies) { + String fileName = fileBody.file.getName(); + MediaType mediaType; + if (fileBody.contentType != null) { + mediaType = MediaType.parse(fileBody.contentType); + } else { + mediaType = MediaType.parse(Utils.getMimeType(fileName)); + } + RequestBody requestBody = RequestBody.create(mediaType, fileBody.file); + builder.addPart(Headers.of("Content-Disposition", + "form-data; name=\"" + entry.getKey() + "\"; filename=\"" + fileName + "\""), + requestBody); + } } } catch (Exception e) { e.printStackTrace(); @@ -1602,10 +1616,10 @@ public static class MultiPartBuilder implements Requ private String mUrl; private Object mTag; private HashMap> mHeadersMap = new HashMap<>(); - private HashMap mMultiPartParameterMap = new HashMap<>(); private HashMap> mQueryParameterMap = new HashMap<>(); private HashMap mPathParameterMap = new HashMap<>(); - private HashMap mMultiPartFileMap = new HashMap<>(); + private HashMap mMultiPartParameterMap = new HashMap<>(); + private HashMap> mMultiPartFileMap = new HashMap<>(); private CacheControl mCacheControl; private int mPercentageThresholdForCancelling = 0; private Executor mExecutor; @@ -1768,34 +1782,100 @@ public T setUserAgent(String userAgent) { } public T addMultipartParameter(String key, String value) { - mMultiPartParameterMap.put(key, value); + return addMultipartParameter(key, value, null); + } + + public T addMultipartParameter(String key, String value, String contentType) { + MultipartStringBody stringBody = new MultipartStringBody(value, contentType); + mMultiPartParameterMap.put(key, stringBody); return (T) this; } public T addMultipartParameter(Map multiPartParameterMap) { + return addMultipartParameter(multiPartParameterMap, null); + } + + public T addMultipartParameter(Map multiPartParameterMap, String contentType) { if (multiPartParameterMap != null) { - mMultiPartParameterMap.putAll(multiPartParameterMap); + Map parameterMap = new HashMap<>(); + for (HashMap.Entry entry : multiPartParameterMap.entrySet()) { + MultipartStringBody stringBody = new MultipartStringBody(entry.getValue(), contentType); + parameterMap.put(entry.getKey(), stringBody); + } + mMultiPartParameterMap.putAll(parameterMap); } return (T) this; } public T addMultipartParameter(Object object) { + return addMultipartParameter(object, null); + } + + public T addMultipartParameter(Object object, String contentType) { if (object != null) { - mMultiPartParameterMap.putAll(ParseUtil + Map parameterMap = ParseUtil .getParserFactory() - .getStringMap(object)); + .getStringMap(object); + addMultipartParameter(parameterMap, contentType); } return (T) this; } public T addMultipartFile(String key, File file) { - mMultiPartFileMap.put(key, file); + return addMultipartFile(key, file, null); + } + + public T addMultipartFile(String key, File file, String contentType) { + MultipartFileBody fileBody = new MultipartFileBody(file, contentType); + addMultipartFileWithKey(key, fileBody); return (T) this; } public T addMultipartFile(Map multiPartFileMap) { + return addMultipartFile(multiPartFileMap, null); + } + + public T addMultipartFile(Map multiPartFileMap, String contentType) { if (multiPartFileMap != null) { - mMultiPartFileMap.putAll(multiPartFileMap); + for (HashMap.Entry entry : multiPartFileMap.entrySet()) { + MultipartFileBody fileBody = new MultipartFileBody(entry.getValue(), contentType); + addMultipartFileWithKey(entry.getKey(), fileBody); + } + } + return (T) this; + } + + public T addMultipartFileList(String key, List files) { + return addMultipartFileList(key, files, null); + } + + public T addMultipartFileList(String key, List files, String contentType) { + if (files != null) { + for (File file : files) { + MultipartFileBody fileBody = new MultipartFileBody(file, contentType); + addMultipartFileWithKey(key, fileBody); + } + } + return (T) this; + } + + public T addMultipartFileList(Map> multiPartFileMap) { + return addMultipartFileList(multiPartFileMap, null); + } + + public T addMultipartFileList(Map> multiPartFileMap, String contentType) { + if (multiPartFileMap != null) { + Map> parameterMap = new HashMap<>(); + for (HashMap.Entry> entry : multiPartFileMap.entrySet()) { + List files = entry.getValue(); + List fileBodies = new ArrayList<>(); + for (File file : files) { + MultipartFileBody fileBody = new MultipartFileBody(file, contentType); + fileBodies.add(fileBody); + } + parameterMap.put(entry.getKey(), fileBodies); + } + mMultiPartFileMap.putAll(parameterMap); } return (T) this; } @@ -1810,6 +1890,15 @@ public T setContentType(String contentType) { return (T) this; } + private void addMultipartFileWithKey(String key, MultipartFileBody fileBody) { + List fileBodies = mMultiPartFileMap.get(key); + if (fileBodies == null) { + fileBodies = new ArrayList<>(); + } + fileBodies.add(fileBody); + mMultiPartFileMap.put(key, fileBodies); + } + public ANRequest build() { return new ANRequest(this); } diff --git a/android-networking/src/main/java/com/androidnetworking/model/MultipartFileBody.java b/android-networking/src/main/java/com/androidnetworking/model/MultipartFileBody.java new file mode 100644 index 00000000..7da6c943 --- /dev/null +++ b/android-networking/src/main/java/com/androidnetworking/model/MultipartFileBody.java @@ -0,0 +1,15 @@ +package com.androidnetworking.model; + +import java.io.File; + +public class MultipartFileBody { + + public final File file; + public final String contentType; + + public MultipartFileBody(File file, String contentType) { + this.file = file; + this.contentType = contentType; + } + +} diff --git a/android-networking/src/main/java/com/androidnetworking/model/MultipartStringBody.java b/android-networking/src/main/java/com/androidnetworking/model/MultipartStringBody.java new file mode 100644 index 00000000..005b69fc --- /dev/null +++ b/android-networking/src/main/java/com/androidnetworking/model/MultipartStringBody.java @@ -0,0 +1,13 @@ +package com.androidnetworking.model; + +public class MultipartStringBody { + + public final String value; + public final String contentType; + + public MultipartStringBody(String value, String contentType) { + this.value = value; + this.contentType = contentType; + } + +} diff --git a/android-networking/upload.gradle b/android-networking/upload.gradle index 9ac0a831..0dbf33fe 100755 --- a/android-networking/upload.gradle +++ b/android-networking/upload.gradle @@ -22,7 +22,7 @@ def siteUrl = 'https://github.com/amitshekhariitbhu/Fast-Android-Networking' def gitUrl = 'https://github.com/amitshekhariitbhu/Fast-Android-Networking.git' group = "com.amitshekhar.android" -version = '1.0.1' +version = '1.0.2' install { repositories.mavenInstaller { diff --git a/app/src/main/java/com/networking/ApiTestActivity.java b/app/src/main/java/com/networking/ApiTestActivity.java index d48f282d..16c5e3b7 100644 --- a/app/src/main/java/com/networking/ApiTestActivity.java +++ b/app/src/main/java/com/networking/ApiTestActivity.java @@ -433,9 +433,11 @@ public void onError(ANError error) { } public void uploadImage(final View view) { + final String key = "image"; + final File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath(), "test.png"); AndroidNetworking.upload(ApiEndPoint.BASE_URL + ApiEndPoint.UPLOAD_IMAGE) .setPriority(Priority.MEDIUM) - .addMultipartFile("image", new File(Environment.getExternalStorageDirectory().getAbsolutePath(), "test.png")) + .addMultipartFile(key, file) .setTag(this) .build() .setAnalyticsListener(new AnalyticsListener() { diff --git a/app/src/main/java/com/networking/OkHttpResponseTestActivity.java b/app/src/main/java/com/networking/OkHttpResponseTestActivity.java index b7b8b311..fc82c946 100644 --- a/app/src/main/java/com/networking/OkHttpResponseTestActivity.java +++ b/app/src/main/java/com/networking/OkHttpResponseTestActivity.java @@ -1059,6 +1059,22 @@ public void onReceived(long timeTakenInMillis, long bytesSent, long bytesReceive }).start(); } + public void checkOptionsRequest(View view) { + AndroidNetworking.options("https://api.github.com/square/okhttp/issues") + .build() + .getAsOkHttpResponse(new OkHttpResponseListener() { + @Override + public void onResponse(Response response) { + Log.d(TAG, "response : " + response.headers().toString()); + } + + @Override + public void onError(ANError anError) { + Utils.logError(TAG, anError); + } + }); + } + public void getCurrentConnectionQuality(View view) { Log.d(TAG, "getCurrentConnectionQuality : " + AndroidNetworking.getCurrentConnectionQuality() + " currentBandwidth : " + AndroidNetworking.getCurrentBandwidth()); } diff --git a/build.gradle b/build.gradle index 07f85749..b5ef45fe 100644 --- a/build.gradle +++ b/build.gradle @@ -23,7 +23,7 @@ buildscript { google() } dependencies { - classpath 'com.android.tools.build:gradle:2.3.2' + classpath 'com.android.tools.build:gradle:3.1.0' classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.4' classpath 'com.github.dcendents:android-maven-gradle-plugin:1.4.1' // NOTE: Do not place your application dependencies here; they belong @@ -47,17 +47,17 @@ ext { compileSdkVersion = 27 minSdkVersion = 14 targetSdkVersion = 27 - buildToolsVersion = "26.0.2" + buildToolsVersion = "27.0.3" // App dependencies versions - okHttp3Version = "3.9.1" + okHttp3Version = "3.10.0" gsonVersion = "2.8.2" jacksonVersion = "2.8.2" - rxJavaVersion = "1.3.4" + rxJavaVersion = "1.3.8" rxJavaAndroidVersion = "1.2.1" - rxJava2Version = "2.1.7" - rxJava2AndroidVersion = "2.0.1" + rxJava2Version = "2.1.12" + rxJava2AndroidVersion = "2.0.2" jUnitVersion = "4.12" - mockWebServerVersion = "3.9.1" - supportAppCompatVersion = "27.0.2" + mockWebServerVersion = "3.10.0" + supportAppCompatVersion = "27.1.1" } \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 8e696307..b3113037 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Wed Dec 06 17:39:39 MST 2017 +#Thu Apr 12 21:48:48 IST 2018 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip diff --git a/jackson-android-networking/jackson-upload.gradle b/jackson-android-networking/jackson-upload.gradle index cf6bc412..34df92f3 100755 --- a/jackson-android-networking/jackson-upload.gradle +++ b/jackson-android-networking/jackson-upload.gradle @@ -24,7 +24,7 @@ def siteUrl = 'https://github.com/amitshekhariitbhu/Fast-Android-Networking' def gitUrl = 'https://github.com/amitshekhariitbhu/Fast-Android-Networking.git' group = "com.amitshekhar.android" -version = '1.0.1' +version = '1.0.2' install { repositories.mavenInstaller { diff --git a/rx-android-networking/rx-upload.gradle b/rx-android-networking/rx-upload.gradle index 50ba7616..c4fd5c45 100755 --- a/rx-android-networking/rx-upload.gradle +++ b/rx-android-networking/rx-upload.gradle @@ -22,7 +22,7 @@ def siteUrl = 'https://github.com/amitshekhariitbhu/Fast-Android-Networking' def gitUrl = 'https://github.com/amitshekhariitbhu/Fast-Android-Networking.git' group = "com.amitshekhar.android" -version = '1.0.1' +version = '1.0.2' install { repositories.mavenInstaller { diff --git a/rx2-android-networking/rx2-upload.gradle b/rx2-android-networking/rx2-upload.gradle index 50f6b80d..bd5fb3f7 100755 --- a/rx2-android-networking/rx2-upload.gradle +++ b/rx2-android-networking/rx2-upload.gradle @@ -24,7 +24,7 @@ def siteUrl = 'https://github.com/amitshekhariitbhu/Fast-Android-Networking' def gitUrl = 'https://github.com/amitshekhariitbhu/Fast-Android-Networking.git' group = "com.amitshekhar.android" -version = '1.0.1' +version = '1.0.2' install { repositories.mavenInstaller { diff --git a/rx2-android-networking/src/androidTest/java/com/rx2androidnetworking/Rx2MultipartObjectApiTest.java b/rx2-android-networking/src/androidTest/java/com/rx2androidnetworking/Rx2MultipartObjectApiTest.java index ae74aa5c..407a1bf7 100644 --- a/rx2-android-networking/src/androidTest/java/com/rx2androidnetworking/Rx2MultipartObjectApiTest.java +++ b/rx2-android-networking/src/androidTest/java/com/rx2androidnetworking/Rx2MultipartObjectApiTest.java @@ -33,7 +33,9 @@ import java.util.concurrent.atomic.AtomicReference; import io.reactivex.Observer; +import io.reactivex.SingleObserver; import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.annotations.NonNull; import io.reactivex.disposables.Disposable; import io.reactivex.schedulers.Schedulers; import okhttp3.mockwebserver.MockResponse; @@ -111,6 +113,49 @@ public void onComplete() { assertEquals("Shekhar", lastNameRef.get()); } + public void testObjectSingleMultipartRequest() throws InterruptedException { + + server.enqueue(new MockResponse().setBody("{\"firstName\":\"Amit\", \"lastName\":\"Shekhar\"}")); + + final AtomicReference firstNameRef = new AtomicReference<>(); + final AtomicReference lastNameRef = new AtomicReference<>(); + final AtomicReference isSubscribedRef = new AtomicReference<>(); + final CountDownLatch latch = new CountDownLatch(1); + + Rx2AndroidNetworking.upload(server.url("/").toString()) + .addMultipartParameter("key", "value") + .build() + .getObjectSingle(User.class) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new SingleObserver() { + @Override + public void onSubscribe(@NonNull Disposable disposable) { + isSubscribedRef.set(true); + } + + @Override + public void onSuccess(@NonNull User user) { + firstNameRef.set(user.firstName); + lastNameRef.set(user.lastName); + latch.countDown(); + } + + @Override + public void onError(@NonNull Throwable throwable) { + assertTrue(false); + } + }); + + + assertTrue(latch.await(2, SECONDS)); + + assertTrue(isSubscribedRef.get()); + + assertEquals("Amit", firstNameRef.get()); + assertEquals("Shekhar", lastNameRef.get()); + } + public void testObjectMultipartRequest404() throws InterruptedException { server.enqueue(new MockResponse().setResponseCode(404).setBody("data")); @@ -165,6 +210,55 @@ public void onComplete() { } + public void testObjectSingleMultipartRequest404() throws InterruptedException { + + server.enqueue(new MockResponse().setResponseCode(404).setBody("data")); + + final AtomicReference errorDetailRef = new AtomicReference<>(); + final AtomicReference errorBodyRef = new AtomicReference<>(); + final AtomicReference errorCodeRef = new AtomicReference<>(); + final AtomicReference isSubscribedRef = new AtomicReference<>(); + final CountDownLatch latch = new CountDownLatch(1); + + Rx2AndroidNetworking.upload(server.url("/").toString()) + .addMultipartParameter("key", "value") + .build() + .getObjectSingle(User.class) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new SingleObserver() { + @Override + public void onSubscribe(@NonNull Disposable disposable) { + isSubscribedRef.set(true); + } + + @Override + public void onSuccess(@NonNull User user) { + assertTrue(false); + } + + @Override + public void onError(@NonNull Throwable e) { + ANError anError = (ANError) e; + errorBodyRef.set(anError.getErrorBody()); + errorDetailRef.set(anError.getErrorDetail()); + errorCodeRef.set(anError.getErrorCode()); + latch.countDown(); + } + }); + + assertTrue(latch.await(2, SECONDS)); + + assertTrue(isSubscribedRef.get()); + + assertEquals(ANConstants.RESPONSE_FROM_SERVER_ERROR, errorDetailRef.get()); + + assertEquals("data", errorBodyRef.get()); + + assertEquals(404, errorCodeRef.get().intValue()); + + } + public void testObjectListMultipartRequest() throws InterruptedException { server.enqueue(new MockResponse().setBody("[{\"firstName\":\"Amit\", \"lastName\":\"Shekhar\"}]")); @@ -216,6 +310,48 @@ public void onComplete() { assertEquals("Shekhar", lastNameRef.get()); } + public void testObjectListSingleMultipartRequest() throws InterruptedException { + + server.enqueue(new MockResponse().setBody("[{\"firstName\":\"Amit\", \"lastName\":\"Shekhar\"}]")); + + final AtomicReference firstNameRef = new AtomicReference<>(); + final AtomicReference lastNameRef = new AtomicReference<>(); + final AtomicReference isSubscribedRef = new AtomicReference<>(); + final CountDownLatch latch = new CountDownLatch(1); + + Rx2AndroidNetworking.upload(server.url("/").toString()) + .addMultipartParameter("key", "value") + .build() + .getObjectListSingle(User.class) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new SingleObserver>() { + @Override + public void onSubscribe(@NonNull Disposable disposable) { + isSubscribedRef.set(true); + } + + @Override + public void onSuccess(@NonNull List userList) { + firstNameRef.set(userList.get(0).firstName); + lastNameRef.set(userList.get(0).lastName); + latch.countDown(); + } + + @Override + public void onError(@NonNull Throwable throwable) { + assertTrue(false); + } + }); + + assertTrue(latch.await(2, SECONDS)); + + assertTrue(isSubscribedRef.get()); + + assertEquals("Amit", firstNameRef.get()); + assertEquals("Shekhar", lastNameRef.get()); + } + public void testObjectListMultipartRequest404() throws InterruptedException { server.enqueue(new MockResponse().setResponseCode(404).setBody("data")); @@ -269,4 +405,53 @@ public void onComplete() { assertEquals(404, errorCodeRef.get().intValue()); } + + public void testObjectListSingleMultipartRequest404() throws InterruptedException { + + server.enqueue(new MockResponse().setResponseCode(404).setBody("data")); + + final AtomicReference errorDetailRef = new AtomicReference<>(); + final AtomicReference errorBodyRef = new AtomicReference<>(); + final AtomicReference errorCodeRef = new AtomicReference<>(); + final AtomicReference isSubscribedRef = new AtomicReference<>(); + final CountDownLatch latch = new CountDownLatch(1); + + Rx2AndroidNetworking.upload(server.url("/").toString()) + .addMultipartParameter("key", "value") + .build() + .getObjectListSingle(User.class) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new SingleObserver>() { + @Override + public void onSubscribe(@NonNull Disposable disposable) { + isSubscribedRef.set(true); + } + + @Override + public void onSuccess(@NonNull List users) { + assertTrue(false); + } + + @Override + public void onError(@NonNull Throwable e) { + ANError anError = (ANError) e; + errorBodyRef.set(anError.getErrorBody()); + errorDetailRef.set(anError.getErrorDetail()); + errorCodeRef.set(anError.getErrorCode()); + latch.countDown(); + } + }); + + assertTrue(latch.await(2, SECONDS)); + + assertTrue(isSubscribedRef.get()); + + assertEquals(ANConstants.RESPONSE_FROM_SERVER_ERROR, errorDetailRef.get()); + + assertEquals("data", errorBodyRef.get()); + + assertEquals(404, errorCodeRef.get().intValue()); + + } } diff --git a/rx2-android-networking/src/androidTest/java/com/rx2androidnetworking/Rx2MultipartStringApiTest.java b/rx2-android-networking/src/androidTest/java/com/rx2androidnetworking/Rx2MultipartStringApiTest.java index dc9fb6eb..8a82fbef 100644 --- a/rx2-android-networking/src/androidTest/java/com/rx2androidnetworking/Rx2MultipartStringApiTest.java +++ b/rx2-android-networking/src/androidTest/java/com/rx2androidnetworking/Rx2MultipartStringApiTest.java @@ -31,7 +31,9 @@ import java.util.concurrent.atomic.AtomicReference; import io.reactivex.Observer; +import io.reactivex.SingleObserver; import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.annotations.NonNull; import io.reactivex.disposables.Disposable; import io.reactivex.schedulers.Schedulers; import okhttp3.mockwebserver.MockResponse; @@ -105,7 +107,46 @@ public void onComplete() { assertEquals("data", responseRef.get()); } - public void testStringPostRequest404() throws InterruptedException { + public void testStringSingleMultipartRequest() throws InterruptedException { + + server.enqueue(new MockResponse().setBody("data")); + + final AtomicReference responseRef = new AtomicReference<>(); + final AtomicReference isSubscribedRef = new AtomicReference<>(); + final CountDownLatch latch = new CountDownLatch(1); + + Rx2AndroidNetworking.upload(server.url("/").toString()) + .addMultipartParameter("key", "value") + .build() + .getStringSingle() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new SingleObserver() { + @Override + public void onSubscribe(@NonNull Disposable disposable) { + isSubscribedRef.set(true); + } + + @Override + public void onSuccess(@NonNull String response) { + responseRef.set(response); + latch.countDown(); + } + + @Override + public void onError(@NonNull Throwable throwable) { + assertTrue(false); + } + }); + + assertTrue(latch.await(2, SECONDS)); + + assertTrue(isSubscribedRef.get()); + + assertEquals("data", responseRef.get()); + } + + public void testStringMultipartRequest404() throws InterruptedException { server.enqueue(new MockResponse().setResponseCode(404).setBody("data")); @@ -159,4 +200,53 @@ public void onComplete() { } + public void testStringSingleMultipartRequest404() throws InterruptedException { + + server.enqueue(new MockResponse().setResponseCode(404).setBody("data")); + + final AtomicReference errorDetailRef = new AtomicReference<>(); + final AtomicReference errorBodyRef = new AtomicReference<>(); + final AtomicReference errorCodeRef = new AtomicReference<>(); + final AtomicReference isSubscribedRef = new AtomicReference<>(); + final CountDownLatch latch = new CountDownLatch(1); + + Rx2AndroidNetworking.upload(server.url("/").toString()) + .addMultipartParameter("key", "value") + .build() + .getStringSingle() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new SingleObserver() { + @Override + public void onSubscribe(@NonNull Disposable disposable) { + isSubscribedRef.set(true); + } + + @Override + public void onSuccess(@NonNull String s) { + assertTrue(false); + } + + @Override + public void onError(@NonNull Throwable e) { + ANError anError = (ANError) e; + errorBodyRef.set(anError.getErrorBody()); + errorDetailRef.set(anError.getErrorDetail()); + errorCodeRef.set(anError.getErrorCode()); + latch.countDown(); + } + }); + + assertTrue(latch.await(2, SECONDS)); + + assertTrue(isSubscribedRef.get()); + + assertEquals(ANConstants.RESPONSE_FROM_SERVER_ERROR, errorDetailRef.get()); + + assertEquals("data", errorBodyRef.get()); + + assertEquals(404, errorCodeRef.get().intValue()); + + } + } \ No newline at end of file diff --git a/rx2-android-networking/src/androidTest/java/com/rx2androidnetworking/Rx2PostJSONApiTest.java b/rx2-android-networking/src/androidTest/java/com/rx2androidnetworking/Rx2PostJSONApiTest.java index b3caebc1..2638533c 100644 --- a/rx2-android-networking/src/androidTest/java/com/rx2androidnetworking/Rx2PostJSONApiTest.java +++ b/rx2-android-networking/src/androidTest/java/com/rx2androidnetworking/Rx2PostJSONApiTest.java @@ -34,7 +34,9 @@ import java.util.concurrent.atomic.AtomicReference; import io.reactivex.Observer; +import io.reactivex.SingleObserver; import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.annotations.NonNull; import io.reactivex.disposables.Disposable; import io.reactivex.schedulers.Schedulers; import okhttp3.mockwebserver.MockResponse; @@ -116,6 +118,53 @@ public void onComplete() { assertEquals("Shekhar", lastNameRef.get()); } + public void testJSONObjectSinglePostRequest() throws InterruptedException { + + server.enqueue(new MockResponse().setBody("{\"firstName\":\"Amit\", \"lastName\":\"Shekhar\"}")); + + final AtomicReference firstNameRef = new AtomicReference<>(); + final AtomicReference lastNameRef = new AtomicReference<>(); + final AtomicReference isSubscribedRef = new AtomicReference<>(); + final CountDownLatch latch = new CountDownLatch(1); + + Rx2AndroidNetworking.post(server.url("/").toString()) + .addBodyParameter("fistName", "Amit") + .addBodyParameter("lastName", "Shekhar") + .build() + .getJSONObjectSingle() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new SingleObserver() { + @Override + public void onSubscribe(@NonNull Disposable disposable) { + isSubscribedRef.set(true); + } + + @Override + public void onSuccess(@NonNull JSONObject response) { + try { + firstNameRef.set(response.getString("firstName")); + lastNameRef.set(response.getString("lastName")); + latch.countDown(); + } catch (JSONException e) { + assertTrue(false); + } + } + + @Override + public void onError(@NonNull Throwable throwable) { + assertTrue(false); + } + }); + + assertTrue(latch.await(2, SECONDS)); + + assertTrue(isSubscribedRef.get()); + + assertEquals("Amit", firstNameRef.get()); + assertEquals("Shekhar", lastNameRef.get()); + } + public void testJSONObjectPostRequest404() throws InterruptedException { server.enqueue(new MockResponse().setResponseCode(404).setBody("data")); @@ -171,6 +220,56 @@ public void onComplete() { } + public void testJSONObjectSinglePostRequest404() throws InterruptedException { + + server.enqueue(new MockResponse().setResponseCode(404).setBody("data")); + + final AtomicReference errorDetailRef = new AtomicReference<>(); + final AtomicReference errorBodyRef = new AtomicReference<>(); + final AtomicReference errorCodeRef = new AtomicReference<>(); + final AtomicReference isSubscribedRef = new AtomicReference<>(); + final CountDownLatch latch = new CountDownLatch(1); + + Rx2AndroidNetworking.post(server.url("/").toString()) + .addBodyParameter("fistName", "Amit") + .addBodyParameter("lastName", "Shekhar") + .build() + .getJSONObjectSingle() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new SingleObserver() { + @Override + public void onSubscribe(@NonNull Disposable disposable) { + isSubscribedRef.set(true); + } + + @Override + public void onSuccess(@NonNull JSONObject jsonObject) { + assertTrue(false); + } + + @Override + public void onError(@NonNull Throwable e) { + ANError anError = (ANError) e; + errorBodyRef.set(anError.getErrorBody()); + errorDetailRef.set(anError.getErrorDetail()); + errorCodeRef.set(anError.getErrorCode()); + latch.countDown(); + } + }); + + assertTrue(latch.await(2, SECONDS)); + + assertTrue(isSubscribedRef.get()); + + assertEquals(ANConstants.RESPONSE_FROM_SERVER_ERROR, errorDetailRef.get()); + + assertEquals("data", errorBodyRef.get()); + + assertEquals(404, errorCodeRef.get().intValue()); + + } + public void testJSONArrayPostRequest() throws InterruptedException { server.enqueue(new MockResponse().setBody("[{\"firstName\":\"Amit\", \"lastName\":\"Shekhar\"}]")); @@ -227,6 +326,54 @@ public void onComplete() { assertEquals("Shekhar", lastNameRef.get()); } + public void testJSONArraySinglePostRequest() throws InterruptedException { + + server.enqueue(new MockResponse().setBody("[{\"firstName\":\"Amit\", \"lastName\":\"Shekhar\"}]")); + + final AtomicReference firstNameRef = new AtomicReference<>(); + final AtomicReference lastNameRef = new AtomicReference<>(); + final AtomicReference isSubscribedRef = new AtomicReference<>(); + final CountDownLatch latch = new CountDownLatch(1); + + Rx2AndroidNetworking.post(server.url("/").toString()) + .addBodyParameter("fistName", "Amit") + .addBodyParameter("lastName", "Shekhar") + .build() + .getJSONArraySingle() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new SingleObserver() { + @Override + public void onSubscribe(@NonNull Disposable disposable) { + isSubscribedRef.set(true); + } + + @Override + public void onSuccess(@NonNull JSONArray response) { + try { + JSONObject jsonObject = response.getJSONObject(0); + firstNameRef.set(jsonObject.getString("firstName")); + lastNameRef.set(jsonObject.getString("lastName")); + latch.countDown(); + } catch (JSONException e) { + assertTrue(false); + } + } + + @Override + public void onError(@NonNull Throwable throwable) { + assertTrue(false); + } + }); + + assertTrue(latch.await(2, SECONDS)); + + assertTrue(isSubscribedRef.get()); + + assertEquals("Amit", firstNameRef.get()); + assertEquals("Shekhar", lastNameRef.get()); + } + public void testJSONArrayPostRequest404() throws InterruptedException { server.enqueue(new MockResponse().setResponseCode(404).setBody("data")); @@ -282,4 +429,54 @@ public void onComplete() { } + public void testJSONArraySinglePostRequest404() throws InterruptedException { + + server.enqueue(new MockResponse().setResponseCode(404).setBody("data")); + + final AtomicReference errorDetailRef = new AtomicReference<>(); + final AtomicReference errorBodyRef = new AtomicReference<>(); + final AtomicReference errorCodeRef = new AtomicReference<>(); + final AtomicReference isSubscribedRef = new AtomicReference<>(); + final CountDownLatch latch = new CountDownLatch(1); + + Rx2AndroidNetworking.post(server.url("/").toString()) + .addBodyParameter("fistName", "Amit") + .addBodyParameter("lastName", "Shekhar") + .build() + .getJSONArraySingle() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new SingleObserver() { + @Override + public void onSubscribe(@NonNull Disposable disposable) { + isSubscribedRef.set(true); + } + + @Override + public void onSuccess(@NonNull JSONArray jsonArray) { + assertTrue(false); + } + + @Override + public void onError(@NonNull Throwable e) { + ANError anError = (ANError) e; + errorBodyRef.set(anError.getErrorBody()); + errorDetailRef.set(anError.getErrorDetail()); + errorCodeRef.set(anError.getErrorCode()); + latch.countDown(); + } + }); + + assertTrue(latch.await(2, SECONDS)); + + assertTrue(isSubscribedRef.get()); + + assertEquals(ANConstants.RESPONSE_FROM_SERVER_ERROR, errorDetailRef.get()); + + assertEquals("data", errorBodyRef.get()); + + assertEquals(404, errorCodeRef.get().intValue()); + + } + } diff --git a/rx2-android-networking/src/androidTest/java/com/rx2androidnetworking/Rx2PostObjectApiTest.java b/rx2-android-networking/src/androidTest/java/com/rx2androidnetworking/Rx2PostObjectApiTest.java index 544f4947..9582c7aa 100644 --- a/rx2-android-networking/src/androidTest/java/com/rx2androidnetworking/Rx2PostObjectApiTest.java +++ b/rx2-android-networking/src/androidTest/java/com/rx2androidnetworking/Rx2PostObjectApiTest.java @@ -33,7 +33,9 @@ import java.util.concurrent.atomic.AtomicReference; import io.reactivex.Observer; +import io.reactivex.SingleObserver; import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.annotations.NonNull; import io.reactivex.disposables.Disposable; import io.reactivex.schedulers.Schedulers; import okhttp3.mockwebserver.MockResponse; @@ -112,6 +114,50 @@ public void onComplete() { assertEquals("Shekhar", lastNameRef.get()); } + public void testObjectSinglePostRequest() throws InterruptedException { + + server.enqueue(new MockResponse().setBody("{\"firstName\":\"Amit\", \"lastName\":\"Shekhar\"}")); + + final AtomicReference firstNameRef = new AtomicReference<>(); + final AtomicReference lastNameRef = new AtomicReference<>(); + final AtomicReference isSubscribedRef = new AtomicReference<>(); + final CountDownLatch latch = new CountDownLatch(1); + + Rx2AndroidNetworking.post(server.url("/").toString()) + .addBodyParameter("fistName", "Amit") + .addBodyParameter("lastName", "Shekhar") + .build() + .getObjectSingle(User.class) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new SingleObserver() { + @Override + public void onSubscribe(@NonNull Disposable disposable) { + isSubscribedRef.set(true); + } + + @Override + public void onSuccess(@NonNull User user) { + firstNameRef.set(user.firstName); + lastNameRef.set(user.lastName); + latch.countDown(); + } + + @Override + public void onError(@NonNull Throwable throwable) { + assertTrue(false); + } + }); + + + assertTrue(latch.await(2, SECONDS)); + + assertTrue(isSubscribedRef.get()); + + assertEquals("Amit", firstNameRef.get()); + assertEquals("Shekhar", lastNameRef.get()); + } + public void testObjectPostRequest404() throws InterruptedException { server.enqueue(new MockResponse().setResponseCode(404).setBody("data")); @@ -167,6 +213,56 @@ public void onComplete() { } + public void testObjectSinglePostRequest404() throws InterruptedException { + + server.enqueue(new MockResponse().setResponseCode(404).setBody("data")); + + final AtomicReference errorDetailRef = new AtomicReference<>(); + final AtomicReference errorBodyRef = new AtomicReference<>(); + final AtomicReference errorCodeRef = new AtomicReference<>(); + final AtomicReference isSubscribedRef = new AtomicReference<>(); + final CountDownLatch latch = new CountDownLatch(1); + + Rx2AndroidNetworking.post(server.url("/").toString()) + .addBodyParameter("fistName", "Amit") + .addBodyParameter("lastName", "Shekhar") + .build() + .getObjectSingle(User.class) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new SingleObserver() { + @Override + public void onSubscribe(@NonNull Disposable disposable) { + isSubscribedRef.set(true); + } + + @Override + public void onSuccess(@NonNull User user) { + assertTrue(false); + } + + @Override + public void onError(@NonNull Throwable e) { + ANError anError = (ANError) e; + errorBodyRef.set(anError.getErrorBody()); + errorDetailRef.set(anError.getErrorDetail()); + errorCodeRef.set(anError.getErrorCode()); + latch.countDown(); + } + }); + + assertTrue(latch.await(2, SECONDS)); + + assertTrue(isSubscribedRef.get()); + + assertEquals(ANConstants.RESPONSE_FROM_SERVER_ERROR, errorDetailRef.get()); + + assertEquals("data", errorBodyRef.get()); + + assertEquals(404, errorCodeRef.get().intValue()); + + } + public void testObjectListPostRequest() throws InterruptedException { server.enqueue(new MockResponse().setBody("[{\"firstName\":\"Amit\", \"lastName\":\"Shekhar\"}]")); @@ -219,6 +315,50 @@ public void onComplete() { assertEquals("Shekhar", lastNameRef.get()); } + public void testObjectListSinglePostRequest() throws InterruptedException { + + server.enqueue(new MockResponse().setBody("[{\"firstName\":\"Amit\", \"lastName\":\"Shekhar\"}]")); + + final AtomicReference firstNameRef = new AtomicReference<>(); + final AtomicReference lastNameRef = new AtomicReference<>(); + final AtomicReference isSubscribedRef = new AtomicReference<>(); + final CountDownLatch latch = new CountDownLatch(1); + + Rx2AndroidNetworking.post(server.url("/").toString()) + .addBodyParameter("fistName", "Amit") + .addBodyParameter("lastName", "Shekhar") + .build() + .getObjectListSingle(User.class) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new SingleObserver>() { + @Override + public void onSubscribe(@NonNull Disposable disposable) { + isSubscribedRef.set(true); + } + + @Override + public void onSuccess(@NonNull List userList) { + firstNameRef.set(userList.get(0).firstName); + lastNameRef.set(userList.get(0).lastName); + latch.countDown(); + } + + @Override + public void onError(@NonNull Throwable throwable) { + assertTrue(false); + } + }); + + + assertTrue(latch.await(2, SECONDS)); + + assertTrue(isSubscribedRef.get()); + + assertEquals("Amit", firstNameRef.get()); + assertEquals("Shekhar", lastNameRef.get()); + } + public void testObjectListPostRequest404() throws InterruptedException { server.enqueue(new MockResponse().setResponseCode(404).setBody("data")); @@ -273,4 +413,54 @@ public void onComplete() { assertEquals(404, errorCodeRef.get().intValue()); } + + public void testObjectListSinglePostRequest404() throws InterruptedException { + + server.enqueue(new MockResponse().setResponseCode(404).setBody("data")); + + final AtomicReference errorDetailRef = new AtomicReference<>(); + final AtomicReference errorBodyRef = new AtomicReference<>(); + final AtomicReference errorCodeRef = new AtomicReference<>(); + final AtomicReference isSubscribedRef = new AtomicReference<>(); + final CountDownLatch latch = new CountDownLatch(1); + + Rx2AndroidNetworking.post(server.url("/").toString()) + .addBodyParameter("fistName", "Amit") + .addBodyParameter("lastName", "Shekhar") + .build() + .getObjectListSingle(User.class) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new SingleObserver>() { + @Override + public void onSubscribe(@NonNull Disposable disposable) { + isSubscribedRef.set(true); + } + + @Override + public void onSuccess(@NonNull List users) { + assertTrue(false); + } + + @Override + public void onError(@NonNull Throwable e) { + ANError anError = (ANError) e; + errorBodyRef.set(anError.getErrorBody()); + errorDetailRef.set(anError.getErrorDetail()); + errorCodeRef.set(anError.getErrorCode()); + latch.countDown(); + } + }); + + assertTrue(latch.await(2, SECONDS)); + + assertTrue(isSubscribedRef.get()); + + assertEquals(ANConstants.RESPONSE_FROM_SERVER_ERROR, errorDetailRef.get()); + + assertEquals("data", errorBodyRef.get()); + + assertEquals(404, errorCodeRef.get().intValue()); + + } } diff --git a/rx2-android-networking/src/androidTest/java/com/rx2androidnetworking/Rx2PostStringApiTest.java b/rx2-android-networking/src/androidTest/java/com/rx2androidnetworking/Rx2PostStringApiTest.java index 3ba9f0df..da3d8830 100644 --- a/rx2-android-networking/src/androidTest/java/com/rx2androidnetworking/Rx2PostStringApiTest.java +++ b/rx2-android-networking/src/androidTest/java/com/rx2androidnetworking/Rx2PostStringApiTest.java @@ -31,7 +31,9 @@ import java.util.concurrent.atomic.AtomicReference; import io.reactivex.Observer; +import io.reactivex.SingleObserver; import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.annotations.NonNull; import io.reactivex.disposables.Disposable; import io.reactivex.schedulers.Schedulers; import okhttp3.mockwebserver.MockResponse; @@ -106,6 +108,46 @@ public void onComplete() { assertEquals("data", responseRef.get()); } + public void testStringSinglePostRequest() throws InterruptedException { + + server.enqueue(new MockResponse().setBody("data")); + + final AtomicReference responseRef = new AtomicReference<>(); + final AtomicReference isSubscribedRef = new AtomicReference<>(); + final CountDownLatch latch = new CountDownLatch(1); + + Rx2AndroidNetworking.post(server.url("/").toString()) + .addBodyParameter("fistName", "Amit") + .addBodyParameter("lastName", "Shekhar") + .build() + .getStringSingle() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new SingleObserver() { + @Override + public void onSubscribe(@NonNull Disposable disposable) { + isSubscribedRef.set(true); + } + + @Override + public void onSuccess(@NonNull String response) { + responseRef.set(response); + latch.countDown(); + } + + @Override + public void onError(@NonNull Throwable throwable) { + assertTrue(false); + } + }); + + assertTrue(latch.await(2, SECONDS)); + + assertTrue(isSubscribedRef.get()); + + assertEquals("data", responseRef.get()); + } + public void testStringPostRequest404() throws InterruptedException { server.enqueue(new MockResponse().setResponseCode(404).setBody("data")); @@ -161,4 +203,54 @@ public void onComplete() { } + public void testStringSinglePostRequest404() throws InterruptedException { + + server.enqueue(new MockResponse().setResponseCode(404).setBody("data")); + + final AtomicReference errorDetailRef = new AtomicReference<>(); + final AtomicReference errorBodyRef = new AtomicReference<>(); + final AtomicReference errorCodeRef = new AtomicReference<>(); + final AtomicReference isSubscribedRef = new AtomicReference<>(); + final CountDownLatch latch = new CountDownLatch(1); + + Rx2AndroidNetworking.post(server.url("/").toString()) + .addBodyParameter("fistName", "Amit") + .addBodyParameter("lastName", "Shekhar") + .build() + .getStringSingle() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new SingleObserver() { + @Override + public void onSubscribe(@NonNull Disposable disposable) { + isSubscribedRef.set(true); + } + + @Override + public void onSuccess(@NonNull String s) { + assertTrue(false); + } + + @Override + public void onError(@NonNull Throwable e) { + ANError anError = (ANError) e; + errorBodyRef.set(anError.getErrorBody()); + errorDetailRef.set(anError.getErrorDetail()); + errorCodeRef.set(anError.getErrorCode()); + latch.countDown(); + } + }); + + assertTrue(latch.await(2, SECONDS)); + + assertTrue(isSubscribedRef.get()); + + assertEquals(ANConstants.RESPONSE_FROM_SERVER_ERROR, errorDetailRef.get()); + + assertEquals("data", errorBodyRef.get()); + + assertEquals(404, errorCodeRef.get().intValue()); + + } + } \ No newline at end of file