name: UI Tests

on:
  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