name: UI Tests on: push: branches: - main pull_request: workflow_dispatch: concurrency: group: ui-tests-event_manager-${{ github.event.number || github.ref }} cancel-in-progress: true jobs: ui-tests: runs-on: ubuntu-latest timeout-minutes: 60 name: Playwright E2E Tests services: redis-cache: image: redis:alpine ports: - 13000:6379 redis-queue: image: redis:alpine ports: - 11000:6379 mariadb: image: mariadb:10.6 env: MYSQL_ROOT_PASSWORD: root ports: - 3306:3306 options: --health-cmd="mariadb-admin ping" --health-interval=5s --health-timeout=2s --health-retries=3 steps: - name: Clone uses: actions/checkout@v4 - name: Setup Python uses: actions/setup-python@v5 with: python-version: "3.14" - name: Setup Node uses: actions/setup-node@v4 with: node-version: 24 check-latest: true - name: Add to Hosts run: echo "127.0.0.1 event_manager.test" | sudo tee -a /etc/hosts - name: Cache pip uses: actions/cache@v4 with: path: ~/.cache/pip key: ${{ runner.os }}-pip-${{ hashFiles('**/*requirements.txt', '**/pyproject.toml', '**/setup.py', '**/setup.cfg') }} restore-keys: | ${{ runner.os }}-pip- ${{ runner.os }}- - name: Get yarn cache directory path id: yarn-cache-dir-path run: 'echo "dir=$(yarn cache dir)" >> $GITHUB_OUTPUT' - name: Cache yarn uses: actions/cache@v4 with: path: ${{ steps.yarn-cache-dir-path.outputs.dir }} key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} restore-keys: | ${{ runner.os }}-yarn- - name: Cache Playwright browsers uses: actions/cache@v4 with: path: ~/.cache/ms-playwright key: ${{ runner.os }}-playwright-${{ hashFiles('**/package.json') }} restore-keys: | ${{ runner.os }}-playwright- - name: Install MariaDB Client run: | sudo apt update sudo apt-get install mariadb-client - name: Setup Bench run: | pip install frappe-bench bench init --skip-redis-config-generation --skip-assets --python "$(which python)" ~/frappe-bench mariadb --host 127.0.0.1 --port 3306 -u root -proot -e "SET GLOBAL character_set_server = 'utf8mb4'" mariadb --host 127.0.0.1 --port 3306 -u root -proot -e "SET GLOBAL collation_server = 'utf8mb4_unicode_ci'" - name: Install event_manager working-directory: /home/runner/frappe-bench run: | bench get-app payments bench get-app event_manager $GITHUB_WORKSPACE bench setup requirements --dev bench new-site --db-root-password root --admin-password admin event_manager.test bench --site event_manager.test install-app event_manager bench build env: CI: "Yes" - name: Configure Site for UI Tests working-directory: /home/runner/frappe-bench run: | bench --site event_manager.test set-config allow_tests true bench --site event_manager.test set-config host_name "http://event_manager.test:8000" - name: Create Test User working-directory: /home/runner/frappe-bench run: bench --site event_manager.test add-user testuser@event_manager.test --first-name Test --last-name User --password Test@123 --add-role "System Manager" - name: Start Frappe Server working-directory: /home/runner/frappe-bench run: | # Disable watch and schedule to reduce resource usage sed -i 's/^watch:/# watch:/g' Procfile sed -i 's/^schedule:/# schedule:/g' Procfile # Start bench in background bench start &> bench_start.log & # Wait for server to be ready echo "Waiting for Frappe server to start..." timeout 60 bash -c 'until curl -s http://event_manager.test:8000 > /dev/null; do sleep 2; done' echo "Frappe server is ready!" - name: Install Playwright run: | npm install npx playwright install --with-deps chromium - name: Run Playwright Tests run: npx playwright test env: BASE_URL: http://event_manager.test:8000 FRAPPE_USER: testuser@event_manager.test FRAPPE_PASSWORD: Test@123 - name: Upload Playwright Report uses: actions/upload-artifact@v4 if: always() with: name: playwright-report path: playwright-report/ retention-days: 7 - name: Upload Test Results uses: actions/upload-artifact@v4 if: failure() with: name: test-results path: test-results/ retention-days: 7 - name: Show Bench Logs on Failure if: failure() working-directory: /home/runner/frappe-bench run: | echo "=== Bench Start Log ===" cat bench_start.log || true echo "" echo "=== Frappe Logs ===" cat logs/*.log || true