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()); + } }