-
Notifications
You must be signed in to change notification settings - Fork 446
test(expo): comprehensive test coverage for native components #8334
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
53dc694
fe9e3fe
532dcdf
034c3f3
6250faf
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,6 @@ | ||
| --- | ||
| '@clerk/expo': patch | ||
| --- | ||
|
|
||
| - Export `NativeSessionSync` and `app.plugin.js` sub-plugins to enable unit testing (internal, no public API change). | ||
| - Add JUnit/Robolectric/MockK test dependencies to the Android module for native unit tests. |
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| @@ -0,0 +1,155 @@ | ||||||||||||||||||||||||||||||||||||||||||||||
| # Manual mobile e2e for @clerk/expo native components. | ||||||||||||||||||||||||||||||||||||||||||||||
| # Clones clerk-expo-quickstart, builds the NativeComponentQuickstart app, | ||||||||||||||||||||||||||||||||||||||||||||||
| # and runs Maestro flows on iOS simulator and Android emulator. | ||||||||||||||||||||||||||||||||||||||||||||||
| name: "Mobile e2e (@clerk/expo)" | ||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||
| on: | ||||||||||||||||||||||||||||||||||||||||||||||
| workflow_dispatch: | ||||||||||||||||||||||||||||||||||||||||||||||
| inputs: | ||||||||||||||||||||||||||||||||||||||||||||||
| quickstart_ref: | ||||||||||||||||||||||||||||||||||||||||||||||
| description: "clerk-expo-quickstart git ref (branch, tag, or SHA)" | ||||||||||||||||||||||||||||||||||||||||||||||
| required: false | ||||||||||||||||||||||||||||||||||||||||||||||
| default: "main" | ||||||||||||||||||||||||||||||||||||||||||||||
| exclude_tags: | ||||||||||||||||||||||||||||||||||||||||||||||
| description: "Maestro tags to exclude (comma-separated)" | ||||||||||||||||||||||||||||||||||||||||||||||
| required: false | ||||||||||||||||||||||||||||||||||||||||||||||
| default: "manual,skip" | ||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||
| concurrency: | ||||||||||||||||||||||||||||||||||||||||||||||
| group: mobile-e2e-${{ github.ref }} | ||||||||||||||||||||||||||||||||||||||||||||||
| cancel-in-progress: true | ||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||
| jobs: | ||||||||||||||||||||||||||||||||||||||||||||||
| android: | ||||||||||||||||||||||||||||||||||||||||||||||
| name: Android | ||||||||||||||||||||||||||||||||||||||||||||||
| runs-on: ubuntu-latest | ||||||||||||||||||||||||||||||||||||||||||||||
| timeout-minutes: 45 | ||||||||||||||||||||||||||||||||||||||||||||||
| defaults: | ||||||||||||||||||||||||||||||||||||||||||||||
| run: | ||||||||||||||||||||||||||||||||||||||||||||||
| working-directory: . | ||||||||||||||||||||||||||||||||||||||||||||||
| steps: | ||||||||||||||||||||||||||||||||||||||||||||||
| - name: Checkout @clerk/javascript | ||||||||||||||||||||||||||||||||||||||||||||||
| uses: actions/checkout@v4 | ||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||
| - name: Checkout clerk-expo-quickstart | ||||||||||||||||||||||||||||||||||||||||||||||
| uses: actions/checkout@v4 | ||||||||||||||||||||||||||||||||||||||||||||||
| with: | ||||||||||||||||||||||||||||||||||||||||||||||
| repository: clerk/clerk-expo-quickstart | ||||||||||||||||||||||||||||||||||||||||||||||
| ref: ${{ inputs.quickstart_ref }} | ||||||||||||||||||||||||||||||||||||||||||||||
| path: clerk-expo-quickstart | ||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||
| - uses: pnpm/action-setup@v4 | ||||||||||||||||||||||||||||||||||||||||||||||
| - uses: actions/setup-node@v4 | ||||||||||||||||||||||||||||||||||||||||||||||
| with: | ||||||||||||||||||||||||||||||||||||||||||||||
| node-version: 20 | ||||||||||||||||||||||||||||||||||||||||||||||
| cache: pnpm | ||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||
| - name: Install monorepo deps | ||||||||||||||||||||||||||||||||||||||||||||||
| run: pnpm install --frozen-lockfile | ||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||
| - name: Build @clerk/expo | ||||||||||||||||||||||||||||||||||||||||||||||
| run: pnpm turbo build --filter=@clerk/expo... | ||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||
| - name: Install quickstart deps | ||||||||||||||||||||||||||||||||||||||||||||||
| working-directory: clerk-expo-quickstart/NativeComponentQuickstart | ||||||||||||||||||||||||||||||||||||||||||||||
| run: pnpm install | ||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||
| - name: Set up JDK 17 | ||||||||||||||||||||||||||||||||||||||||||||||
| uses: actions/setup-java@v4 | ||||||||||||||||||||||||||||||||||||||||||||||
| with: | ||||||||||||||||||||||||||||||||||||||||||||||
| distribution: temurin | ||||||||||||||||||||||||||||||||||||||||||||||
| java-version: 17 | ||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||
| - name: Install Maestro | ||||||||||||||||||||||||||||||||||||||||||||||
| run: | | ||||||||||||||||||||||||||||||||||||||||||||||
| curl -Ls "https://get.maestro.mobile.dev" | bash | ||||||||||||||||||||||||||||||||||||||||||||||
| echo "$HOME/.maestro/bin" >> "$GITHUB_PATH" | ||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||
| - name: Run Android e2e | ||||||||||||||||||||||||||||||||||||||||||||||
| uses: reactivecircus/android-emulator-runner@v2 | ||||||||||||||||||||||||||||||||||||||||||||||
| env: | ||||||||||||||||||||||||||||||||||||||||||||||
| CLERK_TEST_EMAIL: ${{ secrets.CLERK_TEST_EMAIL }} | ||||||||||||||||||||||||||||||||||||||||||||||
| CLERK_TEST_PASSWORD: ${{ secrets.CLERK_TEST_PASSWORD }} | ||||||||||||||||||||||||||||||||||||||||||||||
| with: | ||||||||||||||||||||||||||||||||||||||||||||||
| api-level: 34 | ||||||||||||||||||||||||||||||||||||||||||||||
| target: google_apis | ||||||||||||||||||||||||||||||||||||||||||||||
| arch: x86_64 | ||||||||||||||||||||||||||||||||||||||||||||||
| script: | | ||||||||||||||||||||||||||||||||||||||||||||||
| cd clerk-expo-quickstart/NativeComponentQuickstart | ||||||||||||||||||||||||||||||||||||||||||||||
| npx expo prebuild --clean | ||||||||||||||||||||||||||||||||||||||||||||||
| npx expo run:android --variant release --no-bundler | ||||||||||||||||||||||||||||||||||||||||||||||
| cd ../../integration-mobile | ||||||||||||||||||||||||||||||||||||||||||||||
| source config/.env 2>/dev/null || true | ||||||||||||||||||||||||||||||||||||||||||||||
| # Maestro doesn't auto-recurse into subdirectories; pass each flow explicitly. | ||||||||||||||||||||||||||||||||||||||||||||||
| find flows -type f -name "*.yaml" ! -path "*/common/*" -print0 | \ | ||||||||||||||||||||||||||||||||||||||||||||||
| xargs -0 maestro test --exclude-tags "${{ inputs.exclude_tags }}" | ||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||
| - name: Upload Maestro artifacts on failure | ||||||||||||||||||||||||||||||||||||||||||||||
| if: failure() | ||||||||||||||||||||||||||||||||||||||||||||||
| uses: actions/upload-artifact@v4 | ||||||||||||||||||||||||||||||||||||||||||||||
| with: | ||||||||||||||||||||||||||||||||||||||||||||||
| name: maestro-android | ||||||||||||||||||||||||||||||||||||||||||||||
| path: ~/.maestro/tests | ||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||
| ios: | ||||||||||||||||||||||||||||||||||||||||||||||
Check warningCode scanning / CodeQL Workflow does not contain permissions Medium
Actions job or workflow does not limit the permissions of the GITHUB_TOKEN. Consider setting an explicit permissions block, using the following as a minimal starting point: {contents: read}
|
||||||||||||||||||||||||||||||||||||||||||||||
| name: iOS | ||||||||||||||||||||||||||||||||||||||||||||||
| runs-on: macos-15 | ||||||||||||||||||||||||||||||||||||||||||||||
| timeout-minutes: 60 | ||||||||||||||||||||||||||||||||||||||||||||||
| steps: | ||||||||||||||||||||||||||||||||||||||||||||||
| - name: Checkout @clerk/javascript | ||||||||||||||||||||||||||||||||||||||||||||||
| uses: actions/checkout@v4 | ||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||
| - name: Checkout clerk-expo-quickstart | ||||||||||||||||||||||||||||||||||||||||||||||
| uses: actions/checkout@v4 | ||||||||||||||||||||||||||||||||||||||||||||||
| with: | ||||||||||||||||||||||||||||||||||||||||||||||
| repository: clerk/clerk-expo-quickstart | ||||||||||||||||||||||||||||||||||||||||||||||
| ref: ${{ inputs.quickstart_ref }} | ||||||||||||||||||||||||||||||||||||||||||||||
| path: clerk-expo-quickstart | ||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||
| - uses: pnpm/action-setup@v4 | ||||||||||||||||||||||||||||||||||||||||||||||
| - uses: actions/setup-node@v4 | ||||||||||||||||||||||||||||||||||||||||||||||
| with: | ||||||||||||||||||||||||||||||||||||||||||||||
| node-version: 20 | ||||||||||||||||||||||||||||||||||||||||||||||
| cache: pnpm | ||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||
| - name: Install monorepo deps | ||||||||||||||||||||||||||||||||||||||||||||||
| run: pnpm install --frozen-lockfile | ||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||
| - name: Build @clerk/expo | ||||||||||||||||||||||||||||||||||||||||||||||
| run: pnpm turbo build --filter=@clerk/expo... | ||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||
| - name: Install quickstart deps | ||||||||||||||||||||||||||||||||||||||||||||||
| working-directory: clerk-expo-quickstart/NativeComponentQuickstart | ||||||||||||||||||||||||||||||||||||||||||||||
| run: pnpm install | ||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||
| - name: Cache SPM | ||||||||||||||||||||||||||||||||||||||||||||||
| uses: actions/cache@v4 | ||||||||||||||||||||||||||||||||||||||||||||||
| with: | ||||||||||||||||||||||||||||||||||||||||||||||
| path: ~/Library/Developer/Xcode/DerivedData | ||||||||||||||||||||||||||||||||||||||||||||||
| key: spm-${{ hashFiles('packages/expo/package.json') }} | ||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||
| - name: Install Maestro | ||||||||||||||||||||||||||||||||||||||||||||||
| run: | | ||||||||||||||||||||||||||||||||||||||||||||||
| curl -Ls "https://get.maestro.mobile.dev" | bash | ||||||||||||||||||||||||||||||||||||||||||||||
| echo "$HOME/.maestro/bin" >> "$GITHUB_PATH" | ||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||
| - name: Build and run iOS e2e | ||||||||||||||||||||||||||||||||||||||||||||||
| env: | ||||||||||||||||||||||||||||||||||||||||||||||
| CLERK_TEST_EMAIL: ${{ secrets.CLERK_TEST_EMAIL }} | ||||||||||||||||||||||||||||||||||||||||||||||
| CLERK_TEST_PASSWORD: ${{ secrets.CLERK_TEST_PASSWORD }} | ||||||||||||||||||||||||||||||||||||||||||||||
| run: | | ||||||||||||||||||||||||||||||||||||||||||||||
| cd clerk-expo-quickstart/NativeComponentQuickstart | ||||||||||||||||||||||||||||||||||||||||||||||
| npx expo prebuild --clean | ||||||||||||||||||||||||||||||||||||||||||||||
| npx expo run:ios --configuration Release --no-bundler | ||||||||||||||||||||||||||||||||||||||||||||||
| cd ../../integration-mobile | ||||||||||||||||||||||||||||||||||||||||||||||
| source config/.env 2>/dev/null || true | ||||||||||||||||||||||||||||||||||||||||||||||
| # Maestro doesn't auto-recurse into subdirectories; pass each flow explicitly. | ||||||||||||||||||||||||||||||||||||||||||||||
| find flows -type f -name "*.yaml" ! -path "*/common/*" -print0 | \ | ||||||||||||||||||||||||||||||||||||||||||||||
| xargs -0 maestro test --exclude-tags "${{ inputs.exclude_tags }},androidOnly" | ||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||
|
Comment on lines
+140
to
+149
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Semgrep identified an issue in your code: Workflow input More details about thisThe Here's how an attacker could exploit this:
The vulnerability exists because untrusted user input from workflow inputs is directly embedded into a shell command without any sanitization or quoting protection. To resolve this comment: ✨ Commit Assistant fix suggestion
Suggested change
View step-by-step instructions
The updated lines in your step will look like: By using an environment variable this way, you ensure untrusted user input isn't directly interpolated into your shell script, reducing the risk of command injection. 💬 Ignore this findingReply with Semgrep commands to ignore this finding.
Alternatively, triage in Semgrep AppSec Platform to ignore the finding created by run-shell-injection. You can view more details about this finding in the Semgrep AppSec Platform. |
||||||||||||||||||||||||||||||||||||||||||||||
| - name: Upload Maestro artifacts on failure | ||||||||||||||||||||||||||||||||||||||||||||||
| if: failure() | ||||||||||||||||||||||||||||||||||||||||||||||
| uses: actions/upload-artifact@v4 | ||||||||||||||||||||||||||||||||||||||||||||||
| with: | ||||||||||||||||||||||||||||||||||||||||||||||
| name: maestro-ios | ||||||||||||||||||||||||||||||||||||||||||||||
| path: ~/.maestro/tests | ||||||||||||||||||||||||||||||||||||||||||||||
Check warningCode scanning / CodeQL Workflow does not contain permissions Medium
Actions job or workflow does not limit the permissions of the GITHUB_TOKEN. Consider setting an explicit permissions block, using the following as a minimal starting point: {contents: read}
|
||||||||||||||||||||||||||||||||||||||||||||||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,7 @@ | ||
| # Local env file — never commit. Use config/.env.example as the template. | ||
| config/.env | ||
|
|
||
| # Maestro artifacts | ||
| *.png | ||
| *.mp4 | ||
| maestro-output/ |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,18 @@ | ||
| # Copy to .env and fill in values from your Clerk dev instance. | ||
| # .env is gitignored. | ||
|
|
||
| # Clerk publishable key for the test app (development instance) | ||
| EXPO_PUBLIC_CLERK_PUBLISHABLE_KEY=pk_test_your_key_here | ||
|
|
||
| # Google Sign-In (iOS): the reversed-client-id URL scheme from GoogleService-Info.plist | ||
| EXPO_PUBLIC_CLERK_GOOGLE_IOS_URL_SCHEME=com.googleusercontent.apps.your-ios-client-id | ||
|
|
||
| # Google Sign-In (Android + iOS): the web client ID | ||
| EXPO_PUBLIC_CLERK_GOOGLE_WEB_CLIENT_ID=your-web-client-id.apps.googleusercontent.com | ||
|
|
||
| # Test user (must use Clerk's testmode +clerk_test pattern for high-rate-limit access) | ||
| CLERK_TEST_EMAIL=tester+clerk_test@example.com | ||
| CLERK_TEST_PASSWORD=ClerkTest!2024 | ||
|
|
||
| # Optional: which simulator/emulator to target by default (Maestro will auto-pick if unset) | ||
| # MAESTRO_DEVICE=iPhone 16 Pro |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,27 @@ | ||
| { | ||
| "$schema": "Test user metadata for the Maestro flows. Real credentials live in config/.env, never in this file.", | ||
| "users": [ | ||
| { | ||
| "id": "primary", | ||
| "description": "Primary test user. Pre-existing in the Clerk dev instance.", | ||
| "emailEnv": "CLERK_TEST_EMAIL", | ||
| "passwordEnv": "CLERK_TEST_PASSWORD" | ||
| }, | ||
| { | ||
| "id": "secondary", | ||
| "description": "Used by sign-out-then-sign-in-different-user flow. Provision separately.", | ||
| "emailEnv": "CLERK_TEST_EMAIL_SECONDARY", | ||
| "passwordEnv": "CLERK_TEST_PASSWORD_SECONDARY" | ||
| }, | ||
| { | ||
| "id": "signup", | ||
| "description": "Generated per run with the +clerk_test pattern so verification codes auto-resolve.", | ||
| "emailTemplate": "tester+clerk_test_{timestamp}@example.com", | ||
| "passwordEnv": "CLERK_TEST_PASSWORD" | ||
| } | ||
| ], | ||
| "notes": [ | ||
| "Use +clerk_test addresses to bypass captcha and get higher rate limits.", | ||
| "Document any new test users you add here so future devs know what they're for." | ||
| ] | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,9 @@ | ||
| # Subflow: assert the user is on the signed-in home screen. | ||
| appId: com.clerk.clerkexpoquickstart | ||
| --- | ||
| - assertVisible: | ||
| text: "Welcome" | ||
| - assertVisible: | ||
| text: "Manage Profile" | ||
| - assertVisible: | ||
| text: "Sign Out" |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,5 @@ | ||
| # Subflow: assert the user is on the signed-out screen with the AuthView visible. | ||
| appId: com.clerk.clerkexpoquickstart | ||
| --- | ||
| - assertVisible: | ||
| text: 'Welcome! Sign in to continue\.?' |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,66 @@ | ||
| # Subflow: launch the NativeComponentQuickstart app from a clean state. | ||
| # This is a dev build, so we must handle the Expo dev launcher (iOS uses | ||
| # http://localhost:8081; Android uses http://10.0.2.2:8081) and the | ||
| # Expo developer menu overlay that appears on first launch. | ||
| appId: com.clerk.clerkexpoquickstart | ||
| --- | ||
| - launchApp: | ||
| clearState: true | ||
| - waitForAnimationToEnd: | ||
| timeout: 5000 | ||
| # Android Google Password Manager may linger from a previous run. | ||
| # Dismiss it before anything else. | ||
| - runFlow: | ||
| when: | ||
| visible: ".*Google Password Manager.*" | ||
| commands: | ||
| - tapOn: | ||
| text: "Not now|Never" | ||
| - waitForAnimationToEnd: | ||
| timeout: 2000 | ||
| # Dev launcher: tap whichever dev-server URL is shown (port 8081). | ||
| # Maestro's text field is regex-matched, so ".*:8081" matches both | ||
| # "http://10.0.2.2:8081" (Android) and "http://localhost:8081" (iOS). | ||
| - runFlow: | ||
| when: | ||
| visible: "Development Build" | ||
| commands: | ||
| - tapOn: | ||
| text: ".*:8081" | ||
| - waitForAnimationToEnd: | ||
| timeout: 10000 | ||
| # Dismiss the Expo developer menu if it pops up. Tap the "Close" (X) | ||
| # accessibility element at the top-right of the sheet. On iOS the | ||
| # accessibility text is "Close" (not the resource-id "xmark"); on Android | ||
| # it's "Close" on the view's accessibilityText. | ||
| - runFlow: | ||
| when: | ||
| visible: ".*developer menu.*" | ||
| commands: | ||
| - tapOn: | ||
| text: "Close" | ||
| optional: true | ||
| - runFlow: | ||
| when: | ||
| visible: ".*developer menu.*" | ||
| commands: | ||
| - tapOn: | ||
| point: "50%,20%" | ||
| - waitForAnimationToEnd: | ||
| timeout: 2000 | ||
| - waitForAnimationToEnd: | ||
| timeout: 3000 | ||
| # If a previous flow left the user signed in (session persists in | ||
| # Keychain/SecureStore across clearState), sign out so subsequent flows | ||
| # start from the AuthView. | ||
| - runFlow: | ||
| when: | ||
| visible: "Sign Out" | ||
| commands: | ||
| - tapOn: | ||
| text: "Sign Out" | ||
| - waitForAnimationToEnd: | ||
| timeout: 3000 | ||
| # Assert the AuthView is visible (signed-out state) | ||
| - assertVisible: | ||
| text: 'Welcome! Sign in to continue\.?' |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,34 @@ | ||
| # Subflow: enter email + password into the native AuthView and submit. | ||
| # Requires CLERK_TEST_EMAIL and CLERK_TEST_PASSWORD env vars. | ||
| appId: com.clerk.clerkexpoquickstart | ||
| --- | ||
| - assertVisible: | ||
| text: 'Welcome! Sign in to continue\.?' | ||
| - tapOn: | ||
| text: "Enter your email or username" | ||
| - eraseText: 50 | ||
| - inputText: ${CLERK_TEST_EMAIL} | ||
| - tapOn: | ||
| text: "Continue" | ||
| index: 0 | ||
| - waitForAnimationToEnd: | ||
| timeout: 3000 | ||
| - tapOn: | ||
| text: "Enter your password" | ||
| - eraseText: 50 | ||
| - inputText: ${CLERK_TEST_PASSWORD} | ||
| - tapOn: | ||
| text: "Continue" | ||
| index: 0 | ||
| - waitForAnimationToEnd: | ||
| timeout: 5000 | ||
| # Android Google Password Manager may prompt to save the password after | ||
| # sign-in. Dismiss it so assertions on the home screen work. | ||
| - runFlow: | ||
| when: | ||
| visible: ".*Google Password Manager.*" | ||
| commands: | ||
| - tapOn: | ||
| text: "Not now|Never" | ||
| - waitForAnimationToEnd: | ||
| timeout: 2000 |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,9 @@ | ||
| # Subflow: tap the Sign Out button on the home screen and wait for AuthView. | ||
| appId: com.clerk.clerkexpoquickstart | ||
| --- | ||
| - tapOn: | ||
| text: "Sign Out" | ||
| - waitForAnimationToEnd: | ||
| timeout: 3000 | ||
| - assertVisible: | ||
| text: 'Welcome! Sign in to continue\.?' |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,16 @@ | ||
| # Subflow: open the UserProfile via Manage Profile, tap Log out, assert signed out. | ||
| appId: com.clerk.clerkexpoquickstart | ||
| --- | ||
| - tapOn: | ||
| text: "Manage Profile" | ||
| - waitForAnimationToEnd: | ||
| timeout: 3000 | ||
| - assertVisible: | ||
| text: "Account" | ||
| # iOS renders "Sign out", Android renders "Log out" | ||
| - tapOn: | ||
| text: "Log out|Sign out" | ||
| - waitForAnimationToEnd: | ||
| timeout: 3000 | ||
| - assertVisible: | ||
| text: 'Welcome! Sign in to continue\.?' |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,16 @@ | ||
| # REGRESSION: After sign-in -> sign-out -> sign-in, the second sign-in | ||
| # completed natively but the JS SDK never picked it up. This flow signs in | ||
| # twice in a row to verify the cycle works correctly. | ||
| appId: com.clerk.clerkexpoquickstart | ||
| tags: | ||
| - regression | ||
| --- | ||
| - runFlow: ../common/open-app.yaml | ||
| # First sign-in | ||
| - runFlow: ../common/sign-in-email-password.yaml | ||
| - runFlow: ../common/assert-signed-in.yaml | ||
| # Sign out via the Sign Out button | ||
| - runFlow: ../common/sign-out-via-button.yaml | ||
| # Second sign-in -- must work without the bug | ||
| - runFlow: ../common/sign-in-email-password.yaml | ||
| - runFlow: ../common/assert-signed-in.yaml |
Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Using variable interpolation${{...}}withgithubcontext data in arun:step could allow an attacker to inject their own code into the runner. This would allow them to steal secrets and code.githubcontext data can have arbitrary user input and should be treated as untrusted. Instead, use an intermediate environment variable withenv:to store the data and use the environment variable in therun:script. Be sure to use double-quotes the environment variable, like this: "$ENVVAR".⭐ Fixed in commit fe9e3fe ⭐