diff --git a/.github/actions/setup-deps/action.yml b/.github/actions/setup-deps/action.yml index c12ff4d43..062508b0c 100644 --- a/.github/actions/setup-deps/action.yml +++ b/.github/actions/setup-deps/action.yml @@ -1,6 +1,14 @@ name: Setup deps description: Setup Node.js and install dependencies +inputs: + react-version: + description: React version to install (e.g., ^19.2.0) + required: false + react-native-version: + description: React Native version to install (e.g., 0.83.1) + required: false + runs: using: composite steps: @@ -25,3 +33,9 @@ runs: if: steps.yarn-cache.outputs.cache-hit != 'true' run: yarn install --immutable shell: bash + + - name: Switch to React and React Native versions + if: inputs.react-version != '' && inputs.react-native-version != '' + run: | + yarn add -D react@${{ inputs.react-version }} @types/react@${{ inputs.react-version }} react-native@${{ inputs.react-native-version }} @react-native/babel-preset@${{ inputs.react-native-version }} + shell: bash diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 293fc97a4..e9777ec96 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -43,15 +43,98 @@ jobs: - name: Typecheck run: yarn typecheck - typecheck-react-18: + typecheck-rn-0-83-1: runs-on: ubuntu-latest - name: Typecheck React 18 + name: Typecheck RN 0.83.1 steps: - name: Checkout uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Setup Node.js and deps - uses: ./.github/actions/setup-deps-react-18 + uses: ./.github/actions/setup-deps + with: + react-version: 19.2.0 + react-native-version: 0.83.1 + + - name: Typecheck + run: yarn typecheck + + typecheck-rn-0-82-1: + runs-on: ubuntu-latest + name: Typecheck RN 0.82.1 + steps: + - name: Checkout + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + + - name: Setup Node.js and deps + uses: ./.github/actions/setup-deps + with: + react-version: 19.1.1 + react-native-version: 0.82.1 + + - name: Typecheck + run: yarn typecheck + + typecheck-rn-0-81-5: + runs-on: ubuntu-latest + name: Typecheck RN 0.81.5 + steps: + - name: Checkout + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + + - name: Setup Node.js and deps + uses: ./.github/actions/setup-deps + with: + react-version: 19.1.0 + react-native-version: 0.81.5 + + - name: Typecheck + run: yarn typecheck + + typecheck-rn-0-80-2: + runs-on: ubuntu-latest + name: Typecheck RN 0.80.2 + steps: + - name: Checkout + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + + - name: Setup Node.js and deps + uses: ./.github/actions/setup-deps + with: + react-version: 19.1.0 + react-native-version: 0.80.2 + + - name: Typecheck + run: yarn typecheck + + typecheck-rn-0-79-2: + runs-on: ubuntu-latest + name: Typecheck RN 0.79.2 + steps: + - name: Checkout + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + + - name: Setup Node.js and deps + uses: ./.github/actions/setup-deps + with: + react-version: 19.0.0 + react-native-version: 0.79.2 + + - name: Typecheck + run: yarn typecheck + + typecheck-rn-0-78-3: + runs-on: ubuntu-latest + name: Typecheck RN 0.78.3 + steps: + - name: Checkout + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + + - name: Setup Node.js and deps + uses: ./.github/actions/setup-deps + with: + react-version: 19.0.0 + react-native-version: 0.78.3 - name: Typecheck run: yarn typecheck @@ -74,15 +157,98 @@ jobs: env: CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} - test-react-18: + test-rn-0-83-1: runs-on: ubuntu-latest - name: Test React 18 + name: Test RN 0.83.1 steps: - name: Checkout uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Setup Node.js and deps - uses: ./.github/actions/setup-deps-react-18 + uses: ./.github/actions/setup-deps + with: + react-version: 19.2.0 + react-native-version: 0.83.1 + + - name: Test + run: yarn test:ci + + test-rn-0-82-1: + runs-on: ubuntu-latest + name: Test RN 0.82.1 + steps: + - name: Checkout + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + + - name: Setup Node.js and deps + uses: ./.github/actions/setup-deps + with: + react-version: 19.1.1 + react-native-version: 0.82.1 + + - name: Test + run: yarn test:ci + + test-rn-0-81-5: + runs-on: ubuntu-latest + name: Test RN 0.81.5 + steps: + - name: Checkout + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + + - name: Setup Node.js and deps + uses: ./.github/actions/setup-deps + with: + react-version: 19.1.0 + react-native-version: 0.81.5 + + - name: Test + run: yarn test:ci + + test-rn-0-80-2: + runs-on: ubuntu-latest + name: Test RN 0.80.2 + steps: + - name: Checkout + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + + - name: Setup Node.js and deps + uses: ./.github/actions/setup-deps + with: + react-version: 19.1.0 + react-native-version: 0.80.2 + + - name: Test + run: yarn test:ci + + test-rn-0-79-2: + runs-on: ubuntu-latest + name: Test RN 0.79.2 + steps: + - name: Checkout + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + + - name: Setup Node.js and deps + uses: ./.github/actions/setup-deps + with: + react-version: 19.0.0 + react-native-version: 0.79.2 + + - name: Test + run: yarn test:ci + + test-rn-0-78-3: + runs-on: ubuntu-latest + name: Test RN 0.78.3 + steps: + - name: Checkout + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + + - name: Setup Node.js and deps + uses: ./.github/actions/setup-deps + with: + react-version: 19.0.0 + react-native-version: 0.78.3 - name: Test run: yarn test:ci diff --git a/src/__tests__/react-native-api.test.tsx b/src/__tests__/react-native-api.test.tsx index 3d0b1088c..b4926ccc9 100644 --- a/src/__tests__/react-native-api.test.tsx +++ b/src/__tests__/react-native-api.test.tsx @@ -3,6 +3,7 @@ import { FlatList, Image, Modal, ScrollView, Switch, Text, TextInput, View } fro import { render, screen } from '..'; import { mapJsonProps } from '../test-utils/json'; +import { getReactNativeVersion } from '../test-utils/version'; /** * Tests in this file are intended to give us an proactive warning that React Native behavior has @@ -221,7 +222,23 @@ test('React Native API assumption: renders a single host element', () => , ); - expect(screen).toMatchInlineSnapshot(` + const rnVersion = getReactNativeVersion(); + if (rnVersion.major == 0 && rnVersion.minor <= 79) { + // eslint-disable-next-line jest/no-conditional-expect + expect(screen).toMatchInlineSnapshot(` + + + Modal Content + + + `); + } else { + // eslint-disable-next-line jest/no-conditional-expect + expect(screen).toMatchInlineSnapshot(` @@ -230,6 +247,7 @@ test('React Native API assumption: renders a single host element', () => `); + } }); test('React Native API assumption: aria-* props render directly on host View', () => { diff --git a/src/matchers/__tests__/to-be-disabled.test.tsx b/src/matchers/__tests__/to-be-disabled.test.tsx index 66eca2673..9a3a6dedf 100644 --- a/src/matchers/__tests__/to-be-disabled.test.tsx +++ b/src/matchers/__tests__/to-be-disabled.test.tsx @@ -159,7 +159,8 @@ test.each([ ['TouchableNativeFeedback', TouchableNativeFeedback], ] as const)('toBeDisabled()/toBeEnabled() supports %s with "disabled" prop', (_, Component) => { render( - // @ts-expect-error - JSX element type 'Component' does not have any construct or call signatures. + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore - JSX element type 'Component' does not have any construct or call signatures. Button , @@ -191,7 +192,8 @@ test.each([ 'toBeDisabled()/toBeEnabled() supports %s with "aria-disabled" prop', (_, Component) => { render( - // @ts-expect-error - JSX element type 'Component' does not have any construct or call signatures. + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore - JSX element type 'Component' does not have any construct or call signatures. Hello , @@ -218,7 +220,8 @@ test.each([ 'toBeDisabled()/toBeEnabled() supports %s with "accessibilityState.disabled" prop', (_, Component) => { render( - // @ts-expect-error - JSX element type 'Component' does not have any construct or call signatures. + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore - JSX element type 'Component' does not have any construct or call signatures. Hello , diff --git a/src/test-utils/version.ts b/src/test-utils/version.ts new file mode 100644 index 000000000..6b02bd102 --- /dev/null +++ b/src/test-utils/version.ts @@ -0,0 +1,18 @@ +export interface Version { + version: string; + major: number; + minor: number; + patch: number; +} + +export function getReactNativeVersion(): Version { + // eslint-disable-next-line @typescript-eslint/no-require-imports + const version = require('react-native/package.json').version; + const [major, minor, patch] = version.split('.'); + return { + version, + major: Number(major), + minor: Number(minor), + patch: Number(patch), + }; +}