Skip to content

Commit 17e923e

Browse files
author
maskara
committed
Tests for upload model
1 parent 28069c9 commit 17e923e

File tree

9 files changed

+413
-41
lines changed

9 files changed

+413
-41
lines changed

app/src/main/java/fr/free/nrw/commons/CommonsApplication.java

+5-1
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ public void onCreate() {
119119
ContributionUtils.emptyTemporaryDirectory();
120120

121121
initAcra();
122-
if (BuildConfig.DEBUG) {
122+
if (BuildConfig.DEBUG && !isRoboUnitTest()) {
123123
Stetho.initializeWithDefaults(this);
124124
}
125125

@@ -162,6 +162,10 @@ private void initAcra() {
162162
Thread.setDefaultUncaughtExceptionHandler(exceptionHandler);
163163
}
164164

165+
public static boolean isRoboUnitTest() {
166+
return "robolectric".equals(Build.FINGERPRINT);
167+
}
168+
165169
private ThreadPoolService getFileLoggingThreadPool() {
166170
return new ThreadPoolService.Builder("file-logging-thread")
167171
.setPriority(Process.THREAD_PRIORITY_LOWEST)

app/src/main/java/fr/free/nrw/commons/upload/FileProcessor.java

+8-11
Original file line numberDiff line numberDiff line change
@@ -2,37 +2,31 @@
22

33
import android.annotation.SuppressLint;
44
import android.content.ContentResolver;
5-
import android.content.Context;
65
import android.content.SharedPreferences;
76
import android.media.ExifInterface;
87
import android.net.Uri;
98
import android.os.Build;
10-
import android.os.Bundle;
119
import android.os.ParcelFileDescriptor;
1210
import android.support.annotation.NonNull;
13-
import android.support.annotation.Nullable;
14-
import android.support.v7.app.AppCompatActivity;
1511

1612
import java.io.File;
1713
import java.io.FileNotFoundException;
1814
import java.io.IOException;
19-
import java.util.Date;
2015
import java.util.List;
2116

2217
import javax.inject.Inject;
2318
import javax.inject.Named;
19+
import javax.inject.Singleton;
2420

2521
import fr.free.nrw.commons.caching.CacheController;
26-
import fr.free.nrw.commons.di.ApplicationlessInjection;
2722
import fr.free.nrw.commons.mwapi.CategoryApi;
2823
import io.reactivex.schedulers.Schedulers;
2924
import timber.log.Timber;
3025

31-
import static com.mapbox.mapboxsdk.Mapbox.getApplicationContext;
32-
3326
/**
3427
* Processing of the image file that is about to be uploaded via ShareActivity is done here
3528
*/
29+
@Singleton
3630
public class FileProcessor implements SimilarImageDialogFragment.onResponse {
3731

3832
@Inject
@@ -52,12 +46,15 @@ public class FileProcessor implements SimilarImageDialogFragment.onResponse {
5246
private boolean haveCheckedForOtherImages = false;
5347
private GPSExtractor tempImageObj;
5448

55-
FileProcessor(@NonNull String filePath, ContentResolver contentResolver, Context context) {
49+
@Inject
50+
FileProcessor() {
51+
}
52+
53+
public void initFileDetails(@NonNull String filePath, ContentResolver contentResolver) {
5654
this.filePath = filePath;
5755
this.contentResolver = contentResolver;
58-
ApplicationlessInjection.getInstance(context.getApplicationContext()).getCommonsApplicationComponent().inject(this);
5956
try {
60-
exifInterface=new ExifInterface(filePath);
57+
exifInterface = new ExifInterface(filePath);
6158
} catch (IOException e) {
6259
Timber.e(e);
6360
}

app/src/main/java/fr/free/nrw/commons/upload/FileUtils.java

+9-5
Original file line numberDiff line numberDiff line change
@@ -234,8 +234,8 @@ else if ("file".equalsIgnoreCase(uri.getScheme())) {
234234
* @return The value of the _data column, which is typically a file path.
235235
*/
236236
@Nullable
237-
public static String getDataColumn(Context context, Uri uri, String selection,
238-
String[] selectionArgs) {
237+
private static String getDataColumn(Context context, Uri uri, String selection,
238+
String[] selectionArgs) {
239239

240240
Cursor cursor = null;
241241
final String column = MediaStore.Images.ImageColumns.DATA;
@@ -311,7 +311,7 @@ public static void copy(@NonNull FileInputStream source, @NonNull FileOutputStre
311311
* @param destination file path copied to
312312
* @throws IOException thrown when failing to read source or opening destination file
313313
*/
314-
public static void copy(@NonNull FileDescriptor source, @NonNull String destination)
314+
private static void copy(@NonNull FileDescriptor source, @NonNull String destination)
315315
throws IOException {
316316
copy(new FileInputStream(source), new FileOutputStream(destination));
317317
}
@@ -415,7 +415,7 @@ public static String getFilename(Uri uri, ContentResolver contentResolver) {
415415
return result;
416416
}
417417

418-
public static String getFileExt(String fileName){
418+
static String getFileExt(String fileName){
419419
//Default file extension
420420
String extension=".jpg";
421421

@@ -426,7 +426,11 @@ public static String getFileExt(String fileName){
426426
return extension;
427427
}
428428

429-
public static String getFileExt(Uri uri, ContentResolver contentResolver) {
429+
private static String getFileExt(Uri uri, ContentResolver contentResolver) {
430430
return getFileExt(getFilename(uri, contentResolver));
431431
}
432+
433+
public static FileInputStream getFileInputStream(String filePath) throws FileNotFoundException {
434+
return new FileInputStream(filePath);
435+
}
432436
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package fr.free.nrw.commons.upload;
2+
3+
import android.content.ContentResolver;
4+
import android.content.Context;
5+
import android.net.Uri;
6+
7+
import java.io.FileInputStream;
8+
import java.io.FileNotFoundException;
9+
import java.io.IOException;
10+
import java.io.InputStream;
11+
12+
import javax.inject.Inject;
13+
import javax.inject.Singleton;
14+
15+
@Singleton
16+
public class FileUtilsWrapper {
17+
18+
@Inject
19+
public FileUtilsWrapper() {
20+
21+
}
22+
23+
public String createExternalCopyPathAndCopy(Uri uri, ContentResolver contentResolver) throws IOException {
24+
return FileUtils.createExternalCopyPathAndCopy(uri, contentResolver);
25+
}
26+
27+
public String createCopyPathAndCopy(Uri uri, Context context) throws IOException {
28+
return FileUtils.createCopyPathAndCopy(uri, context);
29+
}
30+
31+
public String getFileExt(String fileName) {
32+
return FileUtils.getFileExt(fileName);
33+
}
34+
35+
public String getSHA1(InputStream is) {
36+
return FileUtils.getSHA1(is);
37+
}
38+
39+
public FileInputStream getFileInputStream(String filePath) throws FileNotFoundException {
40+
return FileUtils.getFileInputStream(filePath);
41+
}
42+
}

app/src/main/java/fr/free/nrw/commons/upload/UploadModel.java

+29-19
Original file line numberDiff line numberDiff line change
@@ -53,23 +53,30 @@ public class UploadModel {
5353
private boolean useExtStorage;
5454
private Disposable badImageSubscription;
5555

56-
@Inject
57-
SessionManager sessionManager;
56+
private SessionManager sessionManager;
5857
private Uri currentMediaUri;
58+
private FileUtilsWrapper fileUtilsWrapper;
59+
private FileProcessor fileProcessor;
5960

6061
@Inject
6162
UploadModel(@Named("licenses") List<String> licenses,
6263
@Named("default_preferences") SharedPreferences prefs,
6364
@Named("licenses_by_name") Map<String, String> licensesByName,
6465
Context context,
65-
MediaWikiApi mwApi) {
66+
MediaWikiApi mwApi,
67+
SessionManager sessionManager,
68+
FileUtilsWrapper fileUtilsWrapper,
69+
FileProcessor fileProcessor) {
6670
this.licenses = licenses;
6771
this.prefs = prefs;
6872
this.license = Prefs.Licenses.CC_BY_SA_3;
6973
this.licensesByName = licensesByName;
7074
this.context = context;
7175
this.mwApi = mwApi;
7276
this.contentResolver = context.getContentResolver();
77+
this.sessionManager = sessionManager;
78+
this.fileUtilsWrapper = fileUtilsWrapper;
79+
this.fileProcessor = fileProcessor;
7380
useExtStorage = this.prefs.getBoolean("useExternalStorage", false);
7481
}
7582

@@ -84,17 +91,17 @@ void receive(List<Uri> mediaUri, String mimeType, String source, SimilarImageInt
8491
.map(filePath -> {
8592
long fileCreatedDate = getFileCreatedDate(currentMediaUri);
8693
Uri uri = Uri.fromFile(new File(filePath));
87-
FileProcessor fp = new FileProcessor(filePath, context.getContentResolver(), context);
88-
UploadItem item = new UploadItem(uri, mimeType, source, fp.processFileCoordinates(similarImageInterface),
89-
FileUtils.getFileExt(filePath), null,fileCreatedDate);
94+
fileProcessor.initFileDetails(filePath, context.getContentResolver());
95+
UploadItem item = new UploadItem(uri, mimeType, source, fileProcessor.processFileCoordinates(similarImageInterface),
96+
fileUtilsWrapper.getFileExt(filePath), null,fileCreatedDate);
9097
Single.zip(
9198
Single.fromCallable(() ->
92-
new FileInputStream(filePath))
93-
.map(FileUtils::getSHA1)
99+
fileUtilsWrapper.getFileInputStream(filePath))
100+
.map(fileUtilsWrapper::getSHA1)
94101
.map(mwApi::existingFile)
95102
.map(b -> b ? ImageUtils.IMAGE_DUPLICATE : ImageUtils.IMAGE_OK),
96103
Single.fromCallable(() ->
97-
new FileInputStream(filePath))
104+
fileUtilsWrapper.getFileInputStream(filePath))
98105
.map(file -> BitmapRegionDecoder.newInstance(file, false))
99106
.map(ImageUtils::checkIfImageIsTooDark), //Returns IMAGE_DARK or IMAGE_OK
100107
(dupe, dark) -> dupe | dark)
@@ -113,24 +120,24 @@ void receiveDirect(Uri media, String mimeType, String source, String wikidataEnt
113120
long fileCreatedDate = getFileCreatedDate(media);
114121
String filePath = this.cacheFileUpload(media);
115122
Uri uri = Uri.fromFile(new File(filePath));
116-
FileProcessor fp = new FileProcessor(filePath, context.getContentResolver(), context);
117-
UploadItem item = new UploadItem(uri, mimeType, source, fp.processFileCoordinates(similarImageInterface),
118-
FileUtils.getFileExt(filePath), wikidataEntityIdPref,fileCreatedDate);
123+
fileProcessor.initFileDetails(filePath, context.getContentResolver());
124+
UploadItem item = new UploadItem(uri, mimeType, source, fileProcessor.processFileCoordinates(similarImageInterface),
125+
fileUtilsWrapper.getFileExt(filePath), wikidataEntityIdPref,fileCreatedDate);
119126
item.title.setTitleText(title);
120127
item.descriptions.get(0).setDescriptionText(desc);
121128
//TODO figure out if default descriptions in other languages exist
122129
item.descriptions.get(0).setLanguageCode("en");
123130
Single.zip(
124131
Single.fromCallable(() ->
125-
new FileInputStream(filePath))
126-
.map(FileUtils::getSHA1)
132+
fileUtilsWrapper.getFileInputStream(filePath))
133+
.map(fileUtilsWrapper::getSHA1)
127134
.map(mwApi::existingFile)
128135
.map(b -> b ? ImageUtils.IMAGE_DUPLICATE : ImageUtils.IMAGE_OK),
129136
Single.fromCallable(() ->
130-
new FileInputStream(filePath))
137+
fileUtilsWrapper.getFileInputStream(filePath))
131138
.map(file -> BitmapRegionDecoder.newInstance(file, false))
132139
.map(ImageUtils::checkIfImageIsTooDark), //Returns IMAGE_DARK or IMAGE_OK
133-
(dupe, dark) -> dupe | dark).subscribe(item.imageQuality::onNext);
140+
(dupe, dark) -> dupe | dark).subscribe(item.imageQuality::onNext, Timber::e);
134141
items.add(item);
135142
items.get(0).selected = true;
136143
items.get(0).first = true;
@@ -239,7 +246,7 @@ public void next() {
239246
updateItemState();
240247
}
241248

242-
public void setCurrentTitleAndDescriptions(Title title, List<Description> descriptions) {
249+
void setCurrentTitleAndDescriptions(Title title, List<Description> descriptions) {
243250
setCurrentUploadTitle(title);
244251
setCurrentUploadDescriptions(descriptions);
245252
}
@@ -337,9 +344,9 @@ private String cacheFileUpload(Uri media) {
337344
try {
338345
String copyPath;
339346
if (useExtStorage)
340-
copyPath = FileUtils.createExternalCopyPathAndCopy(media, contentResolver);
347+
copyPath = fileUtilsWrapper.createExternalCopyPathAndCopy(media, contentResolver);
341348
else
342-
copyPath = FileUtils.createCopyPathAndCopy(media, context);
349+
copyPath = fileUtilsWrapper.createCopyPathAndCopy(media, context);
343350
Timber.i("File path is " + copyPath);
344351
return copyPath;
345352
} catch (IOException e) {
@@ -362,6 +369,9 @@ void subscribeBadPicture(Consumer<Integer> consumer) {
362369
badImageSubscription = getCurrentItem().imageQuality.subscribe(consumer, Timber::e);
363370
}
364371

372+
public List<UploadItem> getItems() {
373+
return items;
374+
}
365375

366376
@SuppressWarnings("WeakerAccess")
367377
static class UploadItem {

app/src/test/kotlin/fr/free/nrw/commons/TestCommonsApplication.kt

+2-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@ class TestCommonsApplication : CommonsApplication() {
2424
override fun onCreate() {
2525
if (mockApplicationComponent == null) {
2626
mockApplicationComponent = DaggerCommonsApplicationComponent.builder()
27-
.appModule(MockCommonsApplicationModule(this)).build()
27+
.appModule(MockCommonsApplicationModule(this))
28+
.build()
2829
}
2930
super.onCreate()
3031
}

0 commit comments

Comments
 (0)