From 58a1cd236731a8aabf75ae6193acdf1c5bc1e44c Mon Sep 17 00:00:00 2001 From: Xin Chen Date: Tue, 1 Nov 2022 12:11:10 -0700 Subject: [PATCH] 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 --- .../react/views/image/ReactImageView.java | 5 +++ .../test/java/com/facebook/react/views/BUCK | 2 ++ .../views/image/ReactImagePropertyTest.java | 36 +++++++++++++++++++ 3 files changed, 43 insertions(+) diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/image/ReactImageView.java b/ReactAndroid/src/main/java/com/facebook/react/views/image/ReactImageView.java index 08a2cd7fcf1..30a6ed20bdf 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/image/ReactImageView.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/image/ReactImageView.java @@ -540,6 +540,11 @@ public class ReactImageView extends GenericDraweeView { maybeUpdateView(); } + // VisibleForTesting + public @Nullable ImageSource getImageSource() { + return mImageSource; + } + @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); diff --git a/ReactAndroid/src/test/java/com/facebook/react/views/BUCK b/ReactAndroid/src/test/java/com/facebook/react/views/BUCK index d624727def6..8a3f5f82879 100644 --- a/ReactAndroid/src/test/java/com/facebook/react/views/BUCK +++ b/ReactAndroid/src/test/java/com/facebook/react/views/BUCK @@ -28,6 +28,8 @@ rn_robolectric_test( react_native_dep("third-party/java/okio:okio"), react_native_target("java/com/facebook/react:react"), react_native_target("java/com/facebook/react/bridge:bridge"), + react_native_target("java/com/facebook/react/util:util"), + react_native_target("java/com/facebook/react/views/imagehelper:imagehelper"), react_native_target("java/com/facebook/react/common:common"), react_native_target("java/com/facebook/react/touch:touch"), react_native_target("java/com/facebook/react/uimanager:uimanager"), diff --git a/ReactAndroid/src/test/java/com/facebook/react/views/image/ReactImagePropertyTest.java b/ReactAndroid/src/test/java/com/facebook/react/views/image/ReactImagePropertyTest.java index 99788ecb6d7..779b245d7a8 100644 --- a/ReactAndroid/src/test/java/com/facebook/react/views/image/ReactImagePropertyTest.java +++ b/ReactAndroid/src/test/java/com/facebook/react/views/image/ReactImagePropertyTest.java @@ -14,22 +14,30 @@ import static org.junit.Assert.assertNull; import android.graphics.Color; import android.util.DisplayMetrics; import com.facebook.drawee.backends.pipeline.Fresco; +import com.facebook.react.bridge.Arguments; import com.facebook.react.bridge.CatalystInstance; import com.facebook.react.bridge.JSApplicationIllegalArgumentException; import com.facebook.react.bridge.JavaOnlyArray; import com.facebook.react.bridge.JavaOnlyMap; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.bridge.ReactTestHelper; +import com.facebook.react.bridge.WritableArray; +import com.facebook.react.bridge.WritableMap; import com.facebook.react.uimanager.DisplayMetricsHolder; import com.facebook.react.uimanager.ReactStylesDiffMap; import com.facebook.react.uimanager.ThemedReactContext; +import com.facebook.react.util.RNLog; +import com.facebook.react.views.imagehelper.ImageSource; import com.facebook.soloader.SoLoader; import org.junit.After; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.invocation.InvocationOnMock; +import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PowerMockIgnore; +import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.rule.PowerMockRule; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; @@ -38,6 +46,7 @@ import org.robolectric.RuntimeEnvironment; * Verify that {@link ScalingUtils} properties are being applied correctly by {@link * ReactImageManager}. */ +@PrepareForTest({Arguments.class, RNLog.class}) @RunWith(RobolectricTestRunner.class) @PowerMockIgnore({"org.mockito.*", "org.robolectric.*", "androidx.*", "android.*"}) public class ReactImagePropertyTest { @@ -50,6 +59,17 @@ public class ReactImagePropertyTest { @Before public void setup() { + PowerMockito.mockStatic(Arguments.class); + PowerMockito.when(Arguments.createArray()) + .thenAnswer((InvocationOnMock invocation) -> new JavaOnlyArray()); + PowerMockito.when(Arguments.createMap()) + .thenAnswer((InvocationOnMock invocation) -> new JavaOnlyMap()); + + // RNLog is stubbed out and the whole class need to be mocked + PowerMockito.mockStatic(RNLog.class); + PowerMockito.doNothing().when(RNLog.class); + RNLog.w(null, ""); + SoLoader.setInTestMode(); mContext = new ReactApplicationContext(RuntimeEnvironment.application); mCatalystInstanceMock = ReactTestHelper.createMockCatalystInstance(); @@ -140,4 +160,20 @@ public class ReactImagePropertyTest { viewManager.updateProperties(view, buildStyles("tintColor", null)); assertNull(view.getColorFilter()); } + + @Test + public void testNullSrcs() { + ReactImageManager viewManager = new ReactImageManager(); + ReactImageView view = viewManager.createViewInstance(mThemeContext); + WritableArray sources = Arguments.createArray(); + WritableMap srcObj = Arguments.createMap(); + srcObj.putNull("uri"); + srcObj.putNull("width"); + srcObj.putNull("height"); + sources.pushMap(srcObj); + viewManager.setSource(view, sources); + view.maybeUpdateView(); + assertEquals( + ImageSource.getTransparentBitmapImageSource(view.getContext()), view.getImageSource()); + } }