Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
249839a
Bridgeless-context ReactTextInputPropertyTest
christophpurrer Oct 21, 2026
811206b
Bridgeless-context ReactImagePropertyTest
christophpurrer Oct 21, 2026
dd16b27
Bridgeless-context ReactTextViewPropertyTest
christophpurrer Oct 21, 2026
a9b4a18
Bridgeless-context SimpleViewPropertyTest
christophpurrer Oct 21, 2026
0d90c06
Bridgeless-context ReactAccessibilityDelegateTest
christophpurrer Oct 21, 2026
490b175
Bridgeless-context ReactScrollViewPropertyTest
christophpurrer Oct 21, 2026
e70df93
Bridgeless-context ReactScrollViewInvertedScrollTest
christophpurrer Oct 21, 2026
4ce21e2
Bridgeless-context MountingManagerTest
christophpurrer Oct 21, 2026
89dd8a9
Bridgeless-context DeviceInfoModuleTest
christophpurrer Oct 21, 2026
d8a385b
Bridgeless-context RootViewTest
christophpurrer Oct 21, 2026
985a81d
Bridgeless-context FabricUIManagerPullModelTest
christophpurrer Oct 21, 2026
99deee3
Bridgeless-context MountingManagerAnimatedPropsTest
christophpurrer Oct 21, 2026
4318a01
Bridgeless-context SurfaceMountingManagerSynchronousMountPropsTest
christophpurrer Oct 21, 2026
4eb092e
Bridgeless-context SurfaceMountingManagerTest
christophpurrer Oct 21, 2026
3fbac30
Bridgeless-context BaseViewManagerDelegateTest
christophpurrer Oct 21, 2026
331d8b6
Bridgeless-context ImageLoaderModuleTest
christophpurrer Oct 21, 2026
236a682
Bridgeless-context ShareModuleTest
christophpurrer Oct 21, 2026
381be37
Bridgeless-context ReactScrollViewHelperFlingAnimatorTest
christophpurrer Oct 21, 2026
2e163b4
Bridgeless-context SurfaceMountingManagerEventOrderingTest
christophpurrer Oct 21, 2026
256caf3
Bridgeless-context ThemedReactContextTest
christophpurrer Oct 21, 2026
1078265
Bridgeless-context BlobModuleTest
christophpurrer Oct 21, 2026
0d12559
Bridgeless-context TouchEventDispatchTest
christophpurrer Oct 21, 2026
8d95297
Bridgeless-context ExtraWindowEventListenerTest
christophpurrer Oct 21, 2026
f4cec38
Delete legacy catalyst test helpers (#59283)
christophpurrer Oct 21, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -17,17 +17,20 @@ import android.view.ViewGroup
import android.view.WindowInsets
import android.view.WindowManager
import com.facebook.react.bridge.Arguments
import com.facebook.react.bridge.BridgeReactContext
import com.facebook.react.bridge.CatalystInstance
import com.facebook.react.bridge.ReactTestHelper
import com.facebook.react.bridge.ReactApplicationContext
import com.facebook.react.bridge.ReactTestHelper.createTestReactApplicationContext
import com.facebook.react.internal.featureflags.ReactNativeFeatureFlagsForTests
import com.facebook.react.uimanager.DisplayMetricsHolder
import com.facebook.react.uimanager.UIManagerModule
import com.facebook.testutils.shadows.ShadowArguments
import com.facebook.testutils.shadows.ShadowSoLoader
import org.assertj.core.api.Assertions.*
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.kotlin.any
import org.mockito.kotlin.doNothing
import org.mockito.kotlin.doReturn
import org.mockito.kotlin.mock
import org.mockito.kotlin.spy
import org.mockito.kotlin.times
Expand All @@ -38,25 +41,24 @@ import org.robolectric.RobolectricTestRunner
import org.robolectric.RuntimeEnvironment
import org.robolectric.annotation.Config

@Config(shadows = [ShadowArguments::class])
@Config(shadows = [ShadowArguments::class, ShadowSoLoader::class])
@RunWith(RobolectricTestRunner::class)
class RootViewTest {

private lateinit var reactContext: BridgeReactContext
private lateinit var catalystInstanceMock: CatalystInstance
private lateinit var reactContext: ReactApplicationContext

@Before
fun setUp() {
ReactNativeFeatureFlagsForTests.setUp()

catalystInstanceMock = ReactTestHelper.createMockCatalystInstance()
reactContext = spy(BridgeReactContext(RuntimeEnvironment.getApplication()))
reactContext.initializeWithInstance(catalystInstanceMock)
reactContext = spy(createTestReactApplicationContext(RuntimeEnvironment.getApplication()))
doNothing().whenever(reactContext).emitDeviceEvent(any(), any())

DisplayMetricsHolder.initDisplayMetricsIfNotInitialized(reactContext)
val uiManagerModuleMock: UIManagerModule = mock()
whenever(catalystInstanceMock.getNativeModule(UIManagerModule::class.java))
.thenReturn(uiManagerModuleMock)
doReturn(uiManagerModuleMock)
.whenever(reactContext)
.getNativeModule(UIManagerModule::class.java)
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,56 +5,19 @@
* LICENSE file in the root directory of this source tree.
*/

// TODO T207169925: Migrate CatalystInstance to Reacthost and remove the Suppress("DEPRECATION")
// annotation
@file:Suppress("DEPRECATION")

package com.facebook.react.bridge

import android.app.Application
import com.facebook.react.bridge.queue.MessageQueueThreadSpec
import com.facebook.react.bridge.queue.ReactQueueConfiguration
import com.facebook.react.bridge.queue.ReactQueueConfigurationImpl
import com.facebook.react.bridge.queue.ReactQueueConfigurationSpec
import com.facebook.react.common.annotations.UnstableReactNativeAPI
import com.facebook.react.runtime.BridgelessReactContext
import com.facebook.react.runtime.ReactHostImpl
import com.facebook.react.runtime.internal.bolts.Task
import com.facebook.react.uimanager.UIManagerModule
import org.mockito.kotlin.mock
import org.mockito.kotlin.spy
import org.mockito.kotlin.whenever
import org.robolectric.RuntimeEnvironment

/** Utility for creating pre-configured instances of core react components for tests. */
object ReactTestHelper {
/**
* @return a ReactApplicationContext that has a CatalystInstance mock returned by
* [createMockCatalystInstance]
*/
@JvmStatic
fun createCatalystContextForTest(): ReactApplicationContext =
BridgeReactContext(RuntimeEnvironment.getApplication()).apply {
initializeWithInstance(createMockCatalystInstance())
}

/** @return a CatalystInstance mock that has a default working ReactQueueConfiguration. */
@JvmStatic
fun createMockCatalystInstance(): CatalystInstance {
val spec: ReactQueueConfigurationSpec =
ReactQueueConfigurationSpec.builder()
.setJSQueueThreadSpec(MessageQueueThreadSpec.mainThreadSpec())
.setNativeModulesQueueThreadSpec(MessageQueueThreadSpec.mainThreadSpec())
.build()
val reactQueueConfiguration: ReactQueueConfiguration =
ReactQueueConfigurationImpl.create(spec) { e -> throw RuntimeException(e) }
val reactInstance: CatalystInstance = mock<CatalystInstance>()
whenever(reactInstance.reactQueueConfiguration).thenReturn(reactQueueConfiguration)
whenever(reactInstance.getNativeModule(UIManagerModule::class.java))
.thenReturn(mock<UIManagerModule>())
whenever(reactInstance.isDestroyed).thenReturn(false)
return reactInstance
}

@OptIn(UnstableReactNativeAPI::class)
fun createTestReactApplicationContext(application: Application): ReactApplicationContext {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.kotlin.mock
import org.robolectric.RobolectricTestRunner
import org.robolectric.RuntimeEnvironment
import org.robolectric.Shadows.shadowOf
import org.robolectric.annotation.Config
import org.robolectric.shadow.api.Shadow
Expand Down Expand Up @@ -76,7 +77,8 @@ class FabricUIManagerPullModelTest {
fun setup() {
ReactNativeFeatureFlagsForTests.setUp()
overrideFeatureFlags()
reactContext = ReactTestHelper.createCatalystContextForTest()
reactContext =
ReactTestHelper.createTestReactApplicationContext(RuntimeEnvironment.getApplication())
underTest =
FabricUIManager(
reactContext,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.robolectric.RobolectricTestRunner
import org.robolectric.RuntimeEnvironment
import org.robolectric.annotation.Config

@RunWith(RobolectricTestRunner::class)
Expand All @@ -54,7 +55,8 @@ class MountingManagerAnimatedPropsTest {
@Before
fun setUp() {
ReactNativeFeatureFlagsForTests.setUp()
val reactContext = ReactTestHelper.createCatalystContextForTest()
val reactContext =
ReactTestHelper.createTestReactApplicationContext(RuntimeEnvironment.getApplication())
themedReactContext = ThemedReactContext(reactContext, reactContext, null, -1)
mountingManager =
MountingManager(ViewManagerRegistry(listOf<ViewManager<*, *>>(ReactViewManager())), {})
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,29 +5,29 @@
* LICENSE file in the root directory of this source tree.
*/

@file:Suppress("DEPRECATION")

package com.facebook.react.fabric

import com.facebook.react.ReactRootView
import com.facebook.react.bridge.BridgeReactContext
import com.facebook.react.bridge.ReactTestHelper.createMockCatalystInstance
import com.facebook.react.bridge.ReactTestHelper.createTestReactApplicationContext
import com.facebook.react.fabric.mounting.MountingManager
import com.facebook.react.fabric.mounting.MountingManager.MountItemExecutor
import com.facebook.react.internal.featureflags.ReactNativeFeatureFlagsForTests
import com.facebook.react.uimanager.ThemedReactContext
import com.facebook.react.uimanager.ViewManager
import com.facebook.react.uimanager.ViewManagerRegistry
import com.facebook.react.views.view.ReactViewManager
import com.facebook.testutils.shadows.ShadowSoLoader
import org.assertj.core.api.Assertions.assertThat
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.robolectric.RobolectricTestRunner
import org.robolectric.RuntimeEnvironment
import org.robolectric.annotation.Config

/** Tests [FabricUIManager] */
@RunWith(RobolectricTestRunner::class)
@Config(shadows = [ShadowSoLoader::class])
class MountingManagerTest {
private lateinit var mountingManager: MountingManager
private lateinit var mountItemExecutor: MountItemExecutor
Expand All @@ -37,8 +37,7 @@ class MountingManagerTest {
@Before
fun setUp() {
ReactNativeFeatureFlagsForTests.setUp()
val reactContext = BridgeReactContext(RuntimeEnvironment.getApplication())
reactContext.initializeWithInstance(createMockCatalystInstance())
val reactContext = createTestReactApplicationContext(RuntimeEnvironment.getApplication())
themedReactContext = ThemedReactContext(reactContext, reactContext, null, -1)
val viewManagers = listOf<ViewManager<*, *>>(ReactViewManager())
mountItemExecutor = MountItemExecutor {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ import org.mockito.kotlin.any
import org.mockito.kotlin.mock
import org.mockito.kotlin.never
import org.robolectric.RobolectricTestRunner
import org.robolectric.RuntimeEnvironment
import org.robolectric.annotation.Config
import org.robolectric.annotation.LooperMode

Expand All @@ -59,7 +60,8 @@ class SurfaceMountingManagerEventOrderingTest {
@Before
fun setUp() {
ReactNativeFeatureFlagsForTests.setUp()
val reactContext = ReactTestHelper.createCatalystContextForTest()
val reactContext =
ReactTestHelper.createTestReactApplicationContext(RuntimeEnvironment.getApplication())
themedReactContext = ThemedReactContext(reactContext, reactContext, null, -1)
mountingManager =
MountingManager(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.robolectric.RobolectricTestRunner
import org.robolectric.RuntimeEnvironment
import org.robolectric.annotation.Config

/**
Expand Down Expand Up @@ -65,7 +66,8 @@ class SurfaceMountingManagerSynchronousMountPropsTest {
@Before
fun setUp() {
ReactNativeFeatureFlagsForTests.setUp()
val reactContext = ReactTestHelper.createCatalystContextForTest()
val reactContext =
ReactTestHelper.createTestReactApplicationContext(RuntimeEnvironment.getApplication())
themedReactContext = ThemedReactContext(reactContext, reactContext, null, -1)
mountingManager =
MountingManager(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,14 @@ import com.facebook.react.uimanager.ThemedReactContext
import com.facebook.react.uimanager.ViewManager
import com.facebook.react.uimanager.ViewManagerRegistry
import com.facebook.react.views.view.ReactViewManager
import com.facebook.testutils.shadows.ShadowSoLoader
import org.assertj.core.api.Assertions.assertThat
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.robolectric.RobolectricTestRunner
import org.robolectric.RuntimeEnvironment
import org.robolectric.annotation.Config

/**
* Tests for [SurfaceMountingManager] view lifecycle around preallocateView, deleteView, and
Expand All @@ -42,6 +45,7 @@ import org.robolectric.RobolectricTestRunner
* See T223288217.
*/
@RunWith(RobolectricTestRunner::class)
@Config(shadows = [ShadowSoLoader::class])
class SurfaceMountingManagerTest {
private lateinit var mountingManager: MountingManager
private lateinit var themedReactContext: ThemedReactContext
Expand All @@ -50,7 +54,8 @@ class SurfaceMountingManagerTest {
@Before
fun setUp() {
ReactNativeFeatureFlagsForTests.setUp()
val reactContext = ReactTestHelper.createCatalystContextForTest()
val reactContext =
ReactTestHelper.createTestReactApplicationContext(RuntimeEnvironment.getApplication())
themedReactContext = ThemedReactContext(reactContext, reactContext, null, -1)
mountingManager =
MountingManager(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ import com.facebook.react.bridge.JavaOnlyMap
import com.facebook.react.bridge.ReactTestHelper
import com.facebook.react.bridge.ReadableMap
import com.facebook.react.bridge.WritableMap
import com.facebook.react.bridge.queue.MessageQueueThread
import com.facebook.react.bridge.queue.ReactQueueConfiguration
import com.facebook.react.internal.featureflags.ReactNativeFeatureFlagsForTests
import com.facebook.react.modules.core.ReactChoreographer
import com.facebook.react.uimanager.DisplayMetricsHolder
Expand All @@ -36,7 +38,9 @@ import org.mockito.ArgumentMatchers.*
import org.mockito.kotlin.mock
import org.mockito.kotlin.times
import org.mockito.kotlin.verify
import org.mockito.kotlin.whenever
import org.robolectric.RobolectricTestRunner
import org.robolectric.RuntimeEnvironment
import org.robolectric.annotation.Config

@RunWith(RobolectricTestRunner::class)
Expand Down Expand Up @@ -516,7 +520,15 @@ class TouchEventDispatchTest {
metrics.density = 1f
DisplayMetricsHolder.setScreenDisplayMetrics(metrics)

val reactContext = ReactTestHelper.createCatalystContextForTest()
val reactContext =
ReactTestHelper.createTestReactApplicationContext(RuntimeEnvironment.getApplication())
val uiQueueThread: MessageQueueThread = mock()
whenever(uiQueueThread.isOnThread()).thenReturn(true)
val queueConfig: ReactQueueConfiguration = mock()
whenever(queueConfig.getUIQueueThread()).thenReturn(uiQueueThread)
whenever(queueConfig.getNativeModulesQueueThread()).thenReturn(uiQueueThread)
whenever(queueConfig.getJSQueueThread()).thenReturn(uiQueueThread)
reactContext.initializeMessageQueueThreads(queueConfig)

eventEmitter = mock()
eventDispatcher = FabricEventDispatcher(reactContext, eventEmitter)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ package com.facebook.react.interfaces
import android.view.Window
import com.facebook.react.bridge.ReactApplicationContext
import com.facebook.react.bridge.ReactTestHelper
import com.facebook.react.internal.featureflags.ReactNativeFeatureFlagsForTests
import com.facebook.testutils.shadows.ShadowSoLoader
import org.junit.Before
import org.junit.Test
Expand All @@ -19,6 +20,7 @@ import org.mockito.kotlin.never
import org.mockito.kotlin.times
import org.mockito.kotlin.verify
import org.robolectric.RobolectricTestRunner
import org.robolectric.RuntimeEnvironment
import org.robolectric.annotation.Config

@RunWith(RobolectricTestRunner::class)
Expand All @@ -29,7 +31,9 @@ class ExtraWindowEventListenerTest {

@Before
fun setUp() {
reactContext = ReactTestHelper.createCatalystContextForTest()
ReactNativeFeatureFlagsForTests.setUp()
reactContext =
ReactTestHelper.createTestReactApplicationContext(RuntimeEnvironment.getApplication())
window = mock()
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,10 @@ 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.internal.featureflags.ReactNativeFeatureFlagsForTests
import com.facebook.soloader.SoLoader
import com.facebook.testutils.shadows.ShadowArguments
import com.facebook.testutils.shadows.ShadowSoLoader
import java.io.ByteArrayInputStream
import java.nio.ByteBuffer
import java.util.UUID
Expand All @@ -26,11 +28,12 @@ import org.junit.runner.RunWith
import org.mockito.MockedStatic
import org.mockito.Mockito.mockStatic
import org.robolectric.RobolectricTestRunner
import org.robolectric.RuntimeEnvironment
import org.robolectric.Shadows.shadowOf
import org.robolectric.annotation.Config

@RunWith(RobolectricTestRunner::class)
@Config(manifest = Config.NONE, shadows = [ShadowArguments::class])
@Config(manifest = Config.NONE, shadows = [ShadowArguments::class, ShadowSoLoader::class])
class BlobModuleTest {
private lateinit var bytes: ByteArray
private lateinit var blobId: String
Expand All @@ -40,6 +43,7 @@ class BlobModuleTest {

@Before
fun prepareModules() {
ReactNativeFeatureFlagsForTests.setUp()
mockedStaticSoLoader = mockStatic(SoLoader::class.java)
mockedStaticSoLoader
.`when`<Boolean> { SoLoader.loadLibrary("reactnativeblob") }
Expand All @@ -48,7 +52,7 @@ class BlobModuleTest {
bytes = ByteArray(120)
Random.Default.nextBytes(bytes)

context = ReactTestHelper.createCatalystContextForTest()
context = ReactTestHelper.createTestReactApplicationContext(RuntimeEnvironment.getApplication())
blobModule = BlobModule(context)
blobId = blobModule.store(bytes)
}
Expand Down
Loading
Loading