Skip to content

Commit 58a1cd2

Browse files
Xin Chenfacebook-github-bot
authored andcommitted
Add unit test for ImageView to take null uri in source
Summary: This is a follow up action item from S295231 and T136039462 where we want to make sure null uri in image source is handled properly. This diff adds an unit test to make sure we are using transparent image when uri is null. Changelog: [Android][Internal] - Add unit test to ImageView for null uri in source Reviewed By: javache Differential Revision: D40732791 fbshipit-source-id: fd468bfe7c33a4f3f8913ead3e84a1770d7c907f
1 parent 6b8e13f commit 58a1cd2

File tree

3 files changed

+43
-0
lines changed

3 files changed

+43
-0
lines changed

ReactAndroid/src/main/java/com/facebook/react/views/image/ReactImageView.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -540,6 +540,11 @@ public void setControllerListener(ControllerListener controllerListener) {
540540
maybeUpdateView();
541541
}
542542

543+
// VisibleForTesting
544+
public @Nullable ImageSource getImageSource() {
545+
return mImageSource;
546+
}
547+
543548
@Override
544549
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
545550
super.onSizeChanged(w, h, oldw, oldh);

ReactAndroid/src/test/java/com/facebook/react/views/BUCK

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ rn_robolectric_test(
2828
react_native_dep("third-party/java/okio:okio"),
2929
react_native_target("java/com/facebook/react:react"),
3030
react_native_target("java/com/facebook/react/bridge:bridge"),
31+
react_native_target("java/com/facebook/react/util:util"),
32+
react_native_target("java/com/facebook/react/views/imagehelper:imagehelper"),
3133
react_native_target("java/com/facebook/react/common:common"),
3234
react_native_target("java/com/facebook/react/touch:touch"),
3335
react_native_target("java/com/facebook/react/uimanager:uimanager"),

ReactAndroid/src/test/java/com/facebook/react/views/image/ReactImagePropertyTest.java

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,22 +14,30 @@
1414
import android.graphics.Color;
1515
import android.util.DisplayMetrics;
1616
import com.facebook.drawee.backends.pipeline.Fresco;
17+
import com.facebook.react.bridge.Arguments;
1718
import com.facebook.react.bridge.CatalystInstance;
1819
import com.facebook.react.bridge.JSApplicationIllegalArgumentException;
1920
import com.facebook.react.bridge.JavaOnlyArray;
2021
import com.facebook.react.bridge.JavaOnlyMap;
2122
import com.facebook.react.bridge.ReactApplicationContext;
2223
import com.facebook.react.bridge.ReactTestHelper;
24+
import com.facebook.react.bridge.WritableArray;
25+
import com.facebook.react.bridge.WritableMap;
2326
import com.facebook.react.uimanager.DisplayMetricsHolder;
2427
import com.facebook.react.uimanager.ReactStylesDiffMap;
2528
import com.facebook.react.uimanager.ThemedReactContext;
29+
import com.facebook.react.util.RNLog;
30+
import com.facebook.react.views.imagehelper.ImageSource;
2631
import com.facebook.soloader.SoLoader;
2732
import org.junit.After;
2833
import org.junit.Before;
2934
import org.junit.Rule;
3035
import org.junit.Test;
3136
import org.junit.runner.RunWith;
37+
import org.mockito.invocation.InvocationOnMock;
38+
import org.powermock.api.mockito.PowerMockito;
3239
import org.powermock.core.classloader.annotations.PowerMockIgnore;
40+
import org.powermock.core.classloader.annotations.PrepareForTest;
3341
import org.powermock.modules.junit4.rule.PowerMockRule;
3442
import org.robolectric.RobolectricTestRunner;
3543
import org.robolectric.RuntimeEnvironment;
@@ -38,6 +46,7 @@
3846
* Verify that {@link ScalingUtils} properties are being applied correctly by {@link
3947
* ReactImageManager}.
4048
*/
49+
@PrepareForTest({Arguments.class, RNLog.class})
4150
@RunWith(RobolectricTestRunner.class)
4251
@PowerMockIgnore({"org.mockito.*", "org.robolectric.*", "androidx.*", "android.*"})
4352
public class ReactImagePropertyTest {
@@ -50,6 +59,17 @@ public class ReactImagePropertyTest {
5059

5160
@Before
5261
public void setup() {
62+
PowerMockito.mockStatic(Arguments.class);
63+
PowerMockito.when(Arguments.createArray())
64+
.thenAnswer((InvocationOnMock invocation) -> new JavaOnlyArray());
65+
PowerMockito.when(Arguments.createMap())
66+
.thenAnswer((InvocationOnMock invocation) -> new JavaOnlyMap());
67+
68+
// RNLog is stubbed out and the whole class need to be mocked
69+
PowerMockito.mockStatic(RNLog.class);
70+
PowerMockito.doNothing().when(RNLog.class);
71+
RNLog.w(null, "");
72+
5373
SoLoader.setInTestMode();
5474
mContext = new ReactApplicationContext(RuntimeEnvironment.application);
5575
mCatalystInstanceMock = ReactTestHelper.createMockCatalystInstance();
@@ -140,4 +160,20 @@ public void testTintColor() {
140160
viewManager.updateProperties(view, buildStyles("tintColor", null));
141161
assertNull(view.getColorFilter());
142162
}
163+
164+
@Test
165+
public void testNullSrcs() {
166+
ReactImageManager viewManager = new ReactImageManager();
167+
ReactImageView view = viewManager.createViewInstance(mThemeContext);
168+
WritableArray sources = Arguments.createArray();
169+
WritableMap srcObj = Arguments.createMap();
170+
srcObj.putNull("uri");
171+
srcObj.putNull("width");
172+
srcObj.putNull("height");
173+
sources.pushMap(srcObj);
174+
viewManager.setSource(view, sources);
175+
view.maybeUpdateView();
176+
assertEquals(
177+
ImageSource.getTransparentBitmapImageSource(view.getContext()), view.getImageSource());
178+
}
143179
}

0 commit comments

Comments
 (0)