Run passwordless and password reset integration tests with private client app generator #1049
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: SalesforceCommerceCloud/pwa-kit/e2e | |
| on: | |
| workflow_dispatch: | |
| schedule: | |
| # Run every day at 12am (PST) - cron uses UTC times | |
| - cron: "0 8 * * *" | |
| pull_request: | |
| jobs: | |
| run-generator-demo: | |
| # Only run on scheduled events and manual dispatch (not on PRs) | |
| if: ${{ github.event_name == 'schedule' || github.event_name == 'workflow_dispatch' }} | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| # Run all matrix env at once because we will not deploy demo app to MRT. | |
| node: [18, 20, 22] | |
| npm: [8, 9, 10, 11] | |
| exclude: # node 18 with npm 11 is not compatible | |
| - node: 18 | |
| npm: 11 | |
| runs-on: ubuntu-latest | |
| env: | |
| # The "default" npm is the one that ships with a given version of node. | |
| # For more: https://nodejs.org/en/download/releases/ | |
| # (We also use this env var for making sure a step runs once for the current node version) | |
| # Note: For node 18, the default was npm 9 until v18.19.0, when it became npm 10 | |
| IS_DEFAULT_NPM: ${{ (matrix.node == 18 && matrix.npm == 10) || (matrix.node == 20 && matrix.npm == 10) || (matrix.node == 22 && matrix.npm == 10) }} | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@v4 | |
| - name: Setup Node | |
| uses: actions/setup-node@v4 | |
| with: | |
| node-version: ${{ matrix.node }} | |
| cache: npm | |
| - name: Update NPM version | |
| if: env.IS_DEFAULT_NPM == 'false' | |
| run: |- | |
| npm install -g npm@${{ matrix.npm }} | |
| - name: Install Monorepo Dependencies | |
| run: |- | |
| # Install node dependencies | |
| node ./scripts/gtime.js monorepo_install npm ci | |
| - name: Check Playwright Versions | |
| run: |- | |
| # Check the installed version of playwright | |
| echo "Playwright version: $(npm list playwright --depth=0)" | |
| # Check the installed version of @playwright/test | |
| echo "@playwright/test version: $(npm list @playwright/test --depth=0)" | |
| - name: Generate Retail App Demo | |
| uses: ./.github/actions/e2e_generate_app | |
| with: | |
| PROJECT_KEY: "retail-app-demo" | |
| - name: Validate Generated Retail App Demo | |
| uses: ./.github/actions/e2e_validate_generated_app | |
| with: | |
| PROJECT_KEY: "retail-app-demo" | |
| run-generator-retail-app-no-ext: | |
| # Only run on scheduled events and manual dispatch (not on PRs) | |
| if: ${{ github.event_name == 'schedule' || github.event_name == 'workflow_dispatch' }} | |
| strategy: | |
| fail-fast: false | |
| # Run one matrix env at a time because we need to deploy each app to MRT and run e2e tests there | |
| max-parallel: 1 | |
| matrix: | |
| # Run all matrix env at once because we will not deploy demo app to MRT. | |
| node: [18, 20, 22] | |
| npm: [8, 9, 10, 11] | |
| exclude: # node 18 with npm 11 is not compatible | |
| - node: 18 | |
| npm: 11 | |
| runs-on: ubuntu-latest | |
| env: | |
| # The "default" npm is the one that ships with a given version of node. | |
| # For more: https://nodejs.org/en/download/releases/ | |
| # (We also use this env var for making sure a step runs once for the current node version) | |
| # Note: For node 18, the default was npm 9 until v18.19.0, when it became npm 10 | |
| IS_DEFAULT_NPM: ${{ (matrix.node == 18 && matrix.npm == 10) || (matrix.node == 20 && matrix.npm == 10) || (matrix.node == 22 && matrix.npm == 10) }} | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@v4 | |
| - name: Setup Node | |
| uses: actions/setup-node@v4 | |
| with: | |
| node-version: ${{ matrix.node }} | |
| cache: npm | |
| - name: Update NPM version | |
| if: env.IS_DEFAULT_NPM == 'false' | |
| run: |- | |
| npm install -g npm@${{ matrix.npm }} | |
| - name: Install Monorepo Dependencies | |
| run: |- | |
| # Install node dependencies | |
| node ./scripts/gtime.js monorepo_install npm ci | |
| - name: Check Playwright Versions | |
| run: |- | |
| # Check the installed version of playwright | |
| echo "Playwright version: $(npm list playwright --depth=0)" | |
| # Check the installed version of @playwright/test | |
| echo "@playwright/test version: $(npm list @playwright/test --depth=0)" | |
| - name: Get Template Version | |
| run: |- | |
| version=`jq -r ".version" packages/template-retail-react-app/package.json` | |
| echo "retail_app_template_version=$version" >> "$GITHUB_ENV" | |
| - name: Generate Retail App Without Extensibility | |
| id: generate_app_no_ext | |
| uses: ./.github/actions/e2e_generate_app | |
| with: | |
| PROJECT_KEY: "retail-app-no-ext" | |
| TEMPLATE_VERSION: ${{ env.retail_app_template_version }} | |
| - name: Validate Retail App Without Extensibility | |
| uses: ./.github/actions/e2e_validate_generated_app | |
| with: | |
| PROJECT_KEY: "retail-app-no-ext" | |
| TEMPLATE_VERSION: ${{ env.retail_app_template_version }} | |
| - name: Create MRT credentials file | |
| uses: "./.github/actions/create_mrt" | |
| with: | |
| mobify_user: ${{ secrets.MOBIFY_CLIENT_USER }} | |
| mobify_api_key: ${{ secrets.MOBIFY_CLIENT_API_KEY }} | |
| - name: Push Bundle to MRT (E2E Test PWA Kit) | |
| uses: "./.github/actions/push_to_mrt" | |
| with: | |
| CWD: ${{ steps.generate_app_no_ext.outputs.project_path }} | |
| TARGET: e2e-tests-pwa-kit | |
| FLAGS: --wait | |
| - name: Install Playwright Browsers | |
| run: npx playwright install --with-deps | |
| # this will not include a11y tests | |
| - name: Run Playwright tests | |
| run: npm run test:e2e | |
| notify-slack-pwa-no-ext: | |
| needs: [run-generator-retail-app-no-ext] | |
| if: ${{ always() }} | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Send GitHub Action data to Slack workflow (Generated) | |
| id: slack-success | |
| if: ${{ github.event_name == 'schedule' && needs.run-generator-retail-app-no-ext.result == 'success' }} | |
| uses: slackapi/slack-github-action@v1.23.0 | |
| with: | |
| payload: | | |
| { | |
| "message": "✅ All PWA Kit no-ext E2E tests passed!" | |
| } | |
| env: | |
| SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} | |
| - name: Send GitHub Action data to Slack workflow (Generated) | |
| id: slack-failure | |
| if: ${{ github.event_name == 'schedule' && needs.run-generator-retail-app-no-ext.result != 'success' }} | |
| uses: slackapi/slack-github-action@v1.23.0 | |
| with: | |
| payload: | | |
| { | |
| "message": "❌ One or more PWA Kit no-ext E2E tests failed! (${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }})" | |
| } | |
| env: | |
| SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} | |
| run-generator-retail-app-ext: | |
| # Run after the previous job completes irrespective of its result | |
| # Only run on scheduled events and manual dispatch (not on PRs) | |
| if: ${{ always() && (github.event_name == 'schedule' || github.event_name == 'workflow_dispatch') }} | |
| needs: [run-generator-retail-app-no-ext] | |
| strategy: | |
| fail-fast: false | |
| # Run one matrix env at a time because we need to deploy each app to MRT and run e2e tests there | |
| max-parallel: 1 | |
| matrix: | |
| # Run all matrix env at once because we will not deploy demo app to MRT. | |
| node: [18, 20, 22] | |
| npm: [8, 9, 10, 11] | |
| exclude: # node 18 with npm 11 is not compatible | |
| - node: 18 | |
| npm: 11 | |
| runs-on: ubuntu-latest | |
| env: | |
| # The "default" npm is the one that ships with a given version of node. | |
| # For more: https://nodejs.org/en/download/releases/ | |
| # (We also use this env var for making sure a step runs once for the current node version) | |
| # Note: For node 18, the default was npm 9 until v18.19.0, when it became npm 10 | |
| IS_DEFAULT_NPM: ${{ (matrix.node == 18 && matrix.npm == 10) || (matrix.node == 20 && matrix.npm == 10) || (matrix.node == 22 && matrix.npm == 10) }} | |
| # The current recommended version for Managed Runtime: | |
| # https://developer.salesforce.com/docs/commerce/pwa-kit-managed-runtime/guide/upgrade-node-version.html | |
| IS_MRT_NODE: ${{ matrix.node == 22 && matrix.npm == 11 }} | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@v4 | |
| - name: Setup Node | |
| uses: actions/setup-node@v4 | |
| with: | |
| node-version: ${{ matrix.node }} | |
| cache: npm | |
| - name: Update NPM version | |
| if: env.IS_DEFAULT_NPM == 'false' | |
| run: |- | |
| npm install -g npm@${{ matrix.npm }} | |
| - name: Install Monorepo Dependencies | |
| run: |- | |
| # Install node dependencies | |
| node ./scripts/gtime.js monorepo_install npm ci | |
| - name: Check Playwright Versions | |
| run: |- | |
| # Check the installed version of playwright | |
| echo "Playwright version: $(npm list playwright --depth=0)" | |
| # Check the installed version of @playwright/test | |
| echo "@playwright/test version: $(npm list @playwright/test --depth=0)" | |
| - name: Get Template Version | |
| run: |- | |
| version=`jq -r ".version" packages/template-retail-react-app/package.json` | |
| echo "retail_app_template_version=$version" >> "$GITHUB_ENV" | |
| - name: Generate Retail App With Extensibility | |
| id: generate_app_ext | |
| uses: ./.github/actions/e2e_generate_app | |
| with: | |
| PROJECT_KEY: "retail-app-ext" | |
| TEMPLATE_VERSION: ${{ env.retail_app_template_version }} | |
| - name: Validated Generated Retail App Demo | |
| uses: ./.github/actions/e2e_validate_generated_app | |
| with: | |
| PROJECT_KEY: "retail-app-ext" | |
| TEMPLATE_VERSION: ${{ env.retail_app_template_version }} | |
| - name: Create MRT credentials file | |
| uses: "./.github/actions/create_mrt" | |
| with: | |
| mobify_user: ${{ secrets.MOBIFY_CLIENT_USER }} | |
| mobify_api_key: ${{ secrets.MOBIFY_CLIENT_API_KEY }} | |
| - name: Push Bundle to MRT (E2E Test PWA Kit) | |
| uses: "./.github/actions/push_to_mrt" | |
| with: | |
| CWD: ${{ steps.generate_app_ext.outputs.project_path }} | |
| TARGET: e2e-tests-pwa-kit | |
| FLAGS: --wait | |
| - name: Install Playwright Browsers | |
| run: npx playwright install --with-deps | |
| # this will not include a11y tests | |
| - name: Run Playwright tests | |
| run: npm run test:e2e | |
| - name: Run a11y test for Node 22 with npm 11 | |
| if: env.IS_MRT_NODE == 'true' | |
| run: npm run test:e2e:a11y | |
| notify-slack-pwa-ext: | |
| needs: [run-generator-retail-app-ext] | |
| if: ${{ always() }} | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Send GitHub Action data to Slack workflow (Generated) | |
| id: slack-success | |
| if: ${{ github.event_name == 'schedule' && needs.run-generator-retail-app-ext.result == 'success' }} | |
| uses: slackapi/slack-github-action@v1.23.0 | |
| with: | |
| payload: | | |
| { | |
| "message": "✅ All PWA Kit ext E2E tests passed!" | |
| } | |
| env: | |
| SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} | |
| - name: Send GitHub Action data to Slack workflow (Generated) | |
| id: slack-failure | |
| if: ${{ github.event_name == 'schedule' && needs.run-generator-retail-app-ext.result != 'success' }} | |
| uses: slackapi/slack-github-action@v1.23.0 | |
| with: | |
| payload: | | |
| { | |
| "message": "❌ One or more PWA Kit ext E2E tests failed! (${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }})" | |
| } | |
| env: | |
| SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} | |
| run-generator-private-client: | |
| # Run on PRs and scheduled runs | |
| if: ${{ github.event_name == 'pull_request' || github.event_name == 'schedule' || github.event_name == 'workflow_dispatch' }} | |
| strategy: | |
| fail-fast: false | |
| # Run one matrix env at a time because we need to deploy each app to MRT and run e2e tests there | |
| max-parallel: 1 | |
| matrix: | |
| # Run all matrix env at once because we will not deploy demo app to MRT. | |
| node: [18, 20, 22] | |
| npm: [8, 9, 10, 11] | |
| exclude: # node 18 with npm 11 is not compatible | |
| - node: 18 | |
| npm: 11 | |
| runs-on: ubuntu-latest | |
| env: | |
| # The "default" npm is the one that ships with a given version of node. | |
| # For more: https://nodejs.org/en/download/releases/ | |
| # (We also use this env var for making sure a step runs once for the current node version) | |
| # Note: For node 18, the default was npm 9 until v18.19.0, when it became npm 10 | |
| IS_DEFAULT_NPM: ${{ (matrix.node == 18 && matrix.npm == 10) || (matrix.node == 20 && matrix.npm == 10) || (matrix.node == 22 && matrix.npm == 10) }} | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@v4 | |
| - name: Setup Node | |
| uses: actions/setup-node@v4 | |
| with: | |
| node-version: ${{ matrix.node }} | |
| - name: Update NPM version | |
| if: env.IS_DEFAULT_NPM == 'false' | |
| run: |- | |
| npm install -g npm@${{ matrix.npm }} | |
| - name: Install Monorepo Dependencies | |
| run: |- | |
| # Install node dependencies | |
| node ./scripts/gtime.js monorepo_install npm ci | |
| - name: Check Playwright Versions | |
| run: |- | |
| # Check the installed version of playwright | |
| echo "Playwright version: $(npm list playwright --depth=0)" | |
| # Check the installed version of @playwright/test | |
| echo "@playwright/test version: $(npm list @playwright/test --depth=0)" | |
| - name: Get Template Version | |
| run: |- | |
| version=`jq -r ".version" packages/template-retail-react-app/package.json` | |
| echo "retail_app_template_version=$version" >> "$GITHUB_ENV" | |
| - name: Debug preset before generation | |
| run: | | |
| echo "=== Preset Configuration Debug ===" | |
| node -e "const config = require('./e2e/config.js'); console.log('Preset for retail-app-private-client:', config.PRESET['retail-app-private-client'])" | |
| echo "" | |
| echo "=== Program.json preset content ===" | |
| jq '.data.presets[] | select(.id == "retail-react-app-private-slas-client")' packages/pwa-kit-create-app/program.json | |
| echo "" | |
| - name: Generate Retail App Private Client | |
| id: generate_app_private_client | |
| uses: ./.github/actions/e2e_generate_app | |
| with: | |
| PROJECT_KEY: "retail-app-private-client" | |
| TEMPLATE_VERSION: ${{ env.retail_app_template_version }} | |
| - name: Debug template variables (add to template temporarily) | |
| run: | | |
| echo "=== Adding debug to template to see actual variables ===" | |
| TEMPLATE_FILE="packages/pwa-kit-create-app/assets/templates/@salesforce/retail-react-app/config/default.js.hbs" | |
| # Add debug output at the top of the template | |
| sed -i '11i\\n// DEBUG: answers.project.login.passwordless.enabled = {{answers.project.login.passwordless.enabled}}\n// DEBUG: answers.project.login.social.enabled = {{answers.project.login.social.enabled}}\n// DEBUG: answers.project.demo.enableDemoSettings = {{answers.project.demo.enableDemoSettings}}\n' "$TEMPLATE_FILE" | |
| echo "Debug lines added to template" | |
| # Temporarily commit the debug changes to allow lerna publish | |
| git config --global user.email "ci@example.com" | |
| git config --global user.name "CI Debug" | |
| git add "$TEMPLATE_FILE" | |
| git commit -m "Temporary debug changes to template" || echo "Already committed" | |
| - name: Regenerate with debug template | |
| run: | | |
| # Clean up previous generation | |
| rm -rf ../generated-projects/retail-app-private-client || true | |
| # Run generation again | |
| COMMAND="node e2e/scripts/generate-project.js --project-key retail-app-private-client" | |
| if [[ -n "${{ env.retail_app_template_version }}" ]]; then | |
| COMMAND="$COMMAND --templateVersion ${{ env.retail_app_template_version }}" | |
| fi | |
| $COMMAND | |
| id: regenerate_debug | |
| - name: Restore template file after debug | |
| if: always() | |
| run: | | |
| # Revert the debug changes | |
| git reset --hard HEAD~1 || echo "Failed to reset, template might remain modified" | |
| - name: Validate Generated Retail App Private Client | |
| uses: ./.github/actions/e2e_validate_generated_app | |
| with: | |
| PROJECT_KEY: "retail-app-private-client" | |
| TEMPLATE_VERSION: ${{ env.retail_app_template_version }} | |
| - name: Debug - Show generated app config and preset usage | |
| run: | | |
| echo "=== Generation Command Debug ===" | |
| echo "PROJECT_KEY: retail-app-private-client" | |
| echo "PRESET: retail-react-app-private-slas-client" | |
| echo "TEMPLATE_VERSION: ${{ env.retail_app_template_version }}" | |
| echo "" | |
| echo "=== Generated App Structure ===" | |
| ls -la ${{ steps.generate_app_private_client.outputs.project_path }} | |
| echo "" | |
| echo "=== Config Directory ===" | |
| ls -la ${{ steps.generate_app_private_client.outputs.project_path }}/config/ || echo "No config directory found" | |
| echo "" | |
| echo "=== App Directory ===" | |
| ls -la ${{ steps.generate_app_private_client.outputs.project_path }}/app/ || echo "No app directory found" | |
| echo "" | |
| echo "=== Overrides Directory (if extensibility enabled) ===" | |
| ls -la ${{ steps.generate_app_private_client.outputs.project_path }}/overrides/ || echo "No overrides directory found" | |
| echo "" | |
| echo "=== Generated config/default.js Content ===" | |
| cat ${{ steps.generate_app_private_client.outputs.project_path }}/config/default.js || echo "config/default.js not found" | |
| echo "" | |
| echo "=== Generated app/config/default.js Content (if exists) ===" | |
| cat ${{ steps.generate_app_private_client.outputs.project_path }}/app/config/default.js || echo "app/config/default.js not found" | |
| echo "" | |
| echo "=== Generated overrides/config/default.js Content (if exists) ===" | |
| cat ${{ steps.generate_app_private_client.outputs.project_path }}/overrides/config/default.js || echo "overrides/config/default.js not found" | |
| echo "" | |
| echo "=== Check if template was processed correctly ===" | |
| grep -n "project.login" ${{ steps.generate_app_private_client.outputs.project_path }}/config/default.js || echo "No project.login references found in generated config" | |
| - name: Create MRT credentials file | |
| uses: "./.github/actions/create_mrt" | |
| with: | |
| mobify_user: ${{ secrets.MOBIFY_CLIENT_USER }} | |
| mobify_api_key: ${{ secrets.MOBIFY_CLIENT_API_KEY }} | |
| - name: Push Bundle to MRT | |
| uses: "./.github/actions/push_to_mrt" | |
| with: | |
| CWD: ${{ steps.generate_app_private_client.outputs.project_path }} | |
| TARGET: e2e-pwa-kit-private | |
| FLAGS: --wait | |
| - name: Set Retail App Private Client Home | |
| run: export RETAIL_APP_HOME=https://scaffold-pwa-e2e-pwa-kit-private.mobify-storefront.com/ | |
| - name: Set PWA Kit E2E Test User | |
| run: export PWA_E2E_USER_EMAIL=e2e.pwa.kit@gmail.com PWA_E2E_USER_PASSWORD=hpv_pek-JZK_xkz0wzf | |
| - name: Install Playwright Browsers | |
| run: npx playwright install --with-deps | |
| # this will not include a11y tests | |
| - name: Run Playwright tests | |
| run: npm run test:e2e | |
| env: | |
| RUN_PRIVATE_CLIENT_TESTS: true | |
| notify-slack-pwa-private-client: | |
| needs: [run-generator-private-client] | |
| if: ${{ always() }} | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Send GitHub Action data to Slack workflow (Generated) | |
| id: slack-success | |
| if: ${{ github.event_name == 'schedule' && needs.run-generator-private-client.result == 'success' }} | |
| uses: slackapi/slack-github-action@v1.23.0 | |
| with: | |
| payload: | | |
| { | |
| "message": "✅ All PWA Kit Private Client E2E tests passed!" | |
| } | |
| env: | |
| SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} | |
| - name: Send GitHub Action data to Slack workflow (Generated) | |
| id: slack-failure | |
| if: ${{ github.event_name == 'schedule' && needs.run-generator-private-client.result != 'success' }} | |
| uses: slackapi/slack-github-action@v1.23.0 | |
| with: | |
| payload: | | |
| { | |
| "message": "❌ One or more PWA Kit Private Client E2E tests failed! (${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }})" | |
| } | |
| env: | |
| SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} |