Skip to content

Run passwordless and password reset integration tests with private client app generator #1049

Run passwordless and password reset integration tests with private client app generator

Run passwordless and password reset integration tests with private client app generator #1049

Workflow file for this run

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 }}