Skip to content

Commit fe540eb

Browse files
ashishkumar468maskaravivek
authored andcommitted
Bugfix/getuploadcount (commons-app#3049)
* Closes commons-app#3048 * response.body().string() was called more than once and because response body can be huge so OkHttp doesnot store it in memory, it reads it as a stream from network when we need it, which cannot be done without a new request. * null check in response.body() * Fixed possible NumberFormatException, made review suggested changes * added getUploadCount test case
1 parent 60b1eb1 commit fe540eb

File tree

2 files changed

+65
-21
lines changed

2 files changed

+65
-21
lines changed

app/src/main/java/fr/free/nrw/commons/mwapi/OkHttpJsonApiClient.java

+23-20
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,10 @@
11
package fr.free.nrw.commons.mwapi;
22

33
import android.text.TextUtils;
4-
54
import androidx.annotation.NonNull;
65
import androidx.annotation.Nullable;
7-
86
import com.google.gson.Gson;
97
import com.google.gson.reflect.TypeToken;
10-
11-
import org.apache.commons.lang3.StringUtils;
12-
import org.wikipedia.dataclient.mwapi.MwQueryPage;
13-
import org.wikipedia.dataclient.mwapi.MwQueryResponse;
14-
15-
import java.io.IOException;
16-
import java.lang.reflect.Type;
17-
import java.util.ArrayList;
18-
import java.util.Date;
19-
import java.util.List;
20-
import java.util.Locale;
21-
import java.util.Map;
22-
23-
import javax.inject.Inject;
24-
import javax.inject.Singleton;
25-
268
import fr.free.nrw.commons.Media;
279
import fr.free.nrw.commons.achievements.FeaturedImages;
2810
import fr.free.nrw.commons.achievements.FeedbackResponse;
@@ -38,10 +20,23 @@
3820
import fr.free.nrw.commons.wikidata.model.GetWikidataEditCountResponse;
3921
import io.reactivex.Observable;
4022
import io.reactivex.Single;
23+
import java.io.IOException;
24+
import java.lang.reflect.Type;
25+
import java.util.ArrayList;
26+
import java.util.Date;
27+
import java.util.List;
28+
import java.util.Locale;
29+
import java.util.Map;
30+
import javax.inject.Inject;
31+
import javax.inject.Singleton;
4132
import okhttp3.HttpUrl;
4233
import okhttp3.OkHttpClient;
4334
import okhttp3.Request;
4435
import okhttp3.Response;
36+
import okhttp3.ResponseBody;
37+
import org.apache.commons.lang3.StringUtils;
38+
import org.wikipedia.dataclient.mwapi.MwQueryPage;
39+
import org.wikipedia.dataclient.mwapi.MwQueryResponse;
4540
import timber.log.Timber;
4641

4742
/**
@@ -98,8 +93,16 @@ public Single<Integer> getUploadCount(String userName) {
9893
return Single.fromCallable(() -> {
9994
Response response = okHttpClient.newCall(request).execute();
10095
if (response != null && response.isSuccessful()) {
101-
if(!TextUtils.isEmpty(response.body().string().trim())){
102-
return Integer.parseInt(response.body().string().trim());
96+
ResponseBody responseBody = response.body();
97+
if (null != responseBody) {
98+
String responseBodyString = responseBody.string().trim();
99+
if (!TextUtils.isEmpty(responseBodyString)) {
100+
try {
101+
return Integer.parseInt(responseBodyString);
102+
} catch (NumberFormatException e) {
103+
Timber.e(e);
104+
}
105+
}
103106
}
104107
}
105108
return 0;

app/src/test/kotlin/fr/free/nrw/commons/mwapi/OkHttpJsonApiClientTest.kt

+42-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package fr.free.nrw.commons.mwapi
22

33
import com.google.gson.Gson
4-
import fr.free.nrw.commons.BuildConfig
54
import fr.free.nrw.commons.Media
65
import fr.free.nrw.commons.TestCommonsApplication
76
import fr.free.nrw.commons.kvstore.JsonKvStore
@@ -344,6 +343,15 @@ class OkHttpJsonApiClientTest {
344343
return it
345344
}
346345

346+
/**
347+
* Check request params with encoded path
348+
*/
349+
private fun assertBasicRequestParameters(server: MockWebServer, method: String,encodedPath: String): RecordedRequest = server.takeRequest().let {
350+
Assert.assertEquals(encodedPath, it.requestUrl.encodedPath())
351+
Assert.assertEquals(method, it.method)
352+
return it
353+
}
354+
347355

348356
/**
349357
* Parse query params
@@ -354,4 +362,37 @@ class OkHttpJsonApiClientTest {
354362
}
355363
}
356364

365+
366+
/**
367+
* Test getUploadCount posititive and negative cases
368+
*/
369+
@Test
370+
fun testGetUploadCount(){
371+
//Positive
372+
assertEquals(testBaseCasesAndGetUploadCount(true), 20)
373+
//Negative
374+
assertEquals(testBaseCasesAndGetUploadCount(false), 0)
375+
}
376+
377+
/**
378+
* Test getUploadCount base cases
379+
*/
380+
private fun testBaseCasesAndGetUploadCount(shouldAddResponse: Boolean): Int? {
381+
val mockResponse = MockResponse()
382+
mockResponse.setResponseCode(200)
383+
if(shouldAddResponse) {
384+
val responseBody = "20"
385+
mockResponse.setBody(responseBody)
386+
}
387+
toolsForgeServer.enqueue(mockResponse)
388+
389+
val uploadCount=testObject.getUploadCount("ashishkumar294").blockingGet()
390+
assertBasicRequestParameters(toolsForgeServer, "GET","/uploadsbyuser.py").let { request ->
391+
parseQueryParams(request).let { body ->
392+
Assert.assertEquals("ashishkumar294", body["user"])
393+
}
394+
}
395+
return uploadCount
396+
}
397+
357398
}

0 commit comments

Comments
 (0)