Skip to content

Merge pull request #152 from akunzai/dependabot/npm_and_yarn/e2e/play… #168

Merge pull request #152 from akunzai/dependabot/npm_and_yarn/e2e/play…

Merge pull request #152 from akunzai/dependabot/npm_and_yarn/e2e/play… #168

Workflow file for this run

name: E2E Tests
on:
push:
branches:
- main
paths-ignore:
- '*.md'
- 'docs/**'
pull_request:
branches:
- main
paths-ignore:
- '*.md'
- 'docs/**'
workflow_dispatch:
env:
ADMIN_USERNAME: admin
ADMIN_PASSWORD: ChangeTheP@ssw0rd
OPENMAGE_ADMIN_USERNAME: admin
OPENMAGE_ADMIN_PASSWORD: ChangeTheP@ssw0rd
BASE_URL: https://www.dev.local
OPENMAGE_URL: https://store.dev.local
permissions:
contents: read
jobs:
e2e:
name: E2E Tests (Joomla ${{ matrix.joomla.version }})
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
joomla:
- version: '6'
compose-override: ''
cache-scope: 'joomla6'
joomla-version: ''
php-version: ''
- version: '5'
compose-override: 'compose.joomla5.yml'
cache-scope: 'joomla5'
joomla-version: '5.4.1'
php-version: '8.3'
steps:
- name: Checkout
uses: actions/checkout@v6
# Prepare host environment
- name: Create required directories and certificates
working-directory: .devcontainer
run: |
mkdir -p joomla/logs openmage/logs openmage/.cache
./generate-certs.sh .secrets
echo "127.0.0.1 www.dev.local store.dev.local" | sudo tee -a /etc/hosts
# Cache OpenMage sample data (using unified cache action for reliability)
- name: Cache OpenMage sample data
uses: actions/cache@v5
with:
path: .devcontainer/openmage/.cache
key: ${{ runner.os }}-openmage-sample-data-1.9.2.4
restore-keys: |
${{ runner.os }}-openmage-sample-data-
# Docker image preparation
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Build Joomla image
uses: docker/build-push-action@v6
with:
context: .devcontainer/joomla
tags: joomla:magebridge
build-args: |
${{ matrix.joomla.joomla-version != '' && format('JOOMLA_VERSION={0}', matrix.joomla.joomla-version) || '' }}
${{ matrix.joomla.php-version != '' && format('PHP_VERSION={0}', matrix.joomla.php-version) || '' }}
cache-from: type=gha,scope=${{ matrix.joomla.cache-scope }}
cache-to: type=gha,scope=${{ matrix.joomla.cache-scope }},mode=max
load: true
- name: Build OpenMage image
uses: docker/build-push-action@v6
with:
context: .devcontainer/openmage
tags: openmage:magebridge
cache-from: type=gha,scope=openmage
cache-to: type=gha,scope=openmage,mode=max
load: true
# Start services and install applications
- name: Start Docker Compose services
working-directory: .devcontainer
run: |
if [ -n "${{ matrix.joomla.compose-override }}" ]; then
docker compose -f compose.yml -f ${{ matrix.joomla.compose-override }} up -d --no-build
else
docker compose up -d --no-build
fi
- name: Set COMPOSE_FILE environment variable
run: |
if [ -n "${{ matrix.joomla.compose-override }}" ]; then
echo "COMPOSE_FILE=compose.yml:${{ matrix.joomla.compose-override }}" >> $GITHUB_ENV
else
echo "COMPOSE_FILE=compose.yml" >> $GITHUB_ENV
fi
working-directory: .devcontainer
- name: Install Joomla
working-directory: .devcontainer
env:
ADMIN_USERNAME: ${{ env.ADMIN_USERNAME }}
ADMIN_PASSWORD: ${{ env.ADMIN_PASSWORD }}
run: ./joomla/install.sh
- name: Install OpenMage
working-directory: .devcontainer
env:
ADMIN_USERNAME: ${{ env.OPENMAGE_ADMIN_USERNAME }}
ADMIN_PASSWORD: ${{ env.OPENMAGE_ADMIN_PASSWORD }}
INSTALL_SAMPLE_DATA: 'true'
run: ./openmage/install.sh
- name: Fix directory permissions
run: sudo chown -R $USER:$USER .
- name: Seed MageBridge test data
working-directory: .devcontainer
run: ./joomla/seed-test-data.sh
- name: Verify Joomla SSL connection to OpenMage
working-directory: .devcontainer
run: |
echo "Testing SSL connection from Joomla to OpenMage..."
docker compose exec -T joomla sh -c 'curl -sf https://store.dev.local/api/soap?wsdl > /dev/null && echo "✓ SSL connection successful" || (echo "✗ SSL connection failed" && exit 1)'
echo "Verifying OpenMage SOAP API endpoint..."
docker compose exec -T joomla sh -c 'curl -sf https://store.dev.local/api/soap?wsdl | grep -q "OpenMage" && echo "✓ OpenMage SOAP API WSDL available" || (echo "✗ OpenMage SOAP API WSDL NOT available" && exit 1)'
# Setup Node.js and pnpm early to avoid permission issues
- name: Setup Node.js
uses: actions/setup-node@v6
with:
node-version: '24'
- name: Enable Corepack
run: corepack enable pnpm
- name: Get pnpm store directory
shell: bash
run: echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV
- name: Cache pnpm store
uses: actions/cache@v5
with:
path: ${{ env.STORE_PATH }}
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('e2e/pnpm-lock.yaml') }}
restore-keys: |
${{ runner.os }}-pnpm-store-
- name: Install E2E dependencies
working-directory: e2e
run: pnpm install
- name: Get Playwright version
working-directory: e2e
run: echo "PLAYWRIGHT_VERSION=$(pnpm exec playwright --version | cut -d' ' -f2)" >> $GITHUB_ENV
- name: Cache Playwright browsers
uses: actions/cache@v5
id: playwright-cache
with:
path: ~/.cache/ms-playwright
key: ${{ runner.os }}-playwright-${{ env.PLAYWRIGHT_VERSION }}
- name: Install Playwright browsers and dependencies
working-directory: e2e
run: |
if [ "${{ steps.playwright-cache.outputs.cache-hit }}" != 'true' ]; then
echo "Cache miss - Installing browsers with system dependencies..."
pnpm exec playwright install --with-deps chromium
else
echo "Cache hit - Installing system dependencies only..."
pnpm exec playwright install-deps chromium
fi
# Run E2E tests
- name: Run E2E tests
working-directory: e2e
run: pnpm exec playwright test --reporter=html,github
- name: Upload Playwright report
uses: actions/upload-artifact@v6
if: always()
with:
name: playwright-report-joomla-${{ matrix.joomla.version }}
path: e2e/playwright-report/
retention-days: 7
- name: Upload test results
uses: actions/upload-artifact@v6
if: failure()
with:
name: test-results-joomla-${{ matrix.joomla.version }}
path: e2e/test-results/
retention-days: 7
- name: Collect diagnostic information on failure
if: failure()
working-directory: .devcontainer
run: |
echo "=================================================="
echo "Diagnostic Information Collection (Joomla ${{ matrix.joomla.version }})"
echo "=================================================="
echo ""
echo "=== Container Status ==="
docker compose ps
echo ""
echo "=== Joomla Container Logs (last 100 lines) ==="
docker compose logs joomla --tail=100
echo ""
echo "=== OpenMage Container Logs (last 100 lines) ==="
docker compose logs openmage --tail=100
echo ""
echo "=== MySQL Container Logs (last 50 lines) ==="
docker compose logs mysql --tail=50
echo ""
echo "=== Joomla Error Logs ==="
docker compose exec joomla sh -c 'tail -100 /var/www/html/administrator/logs/everything.php 2>/dev/null || echo "No Joomla error logs found"'
echo ""
echo "=== OpenMage System Log ==="
docker compose exec openmage sh -c 'tail -50 /var/www/html/var/log/system.log 2>/dev/null || echo "No OpenMage system.log found"'
echo ""
echo "=== OpenMage Exception Log ==="
docker compose exec openmage sh -c 'tail -50 /var/www/html/var/log/exception.log 2>/dev/null || echo "No OpenMage exception.log found"'
echo ""
echo "=== MageBridge Configuration Dump ==="
docker compose exec mysql mysql -u root -psecret joomla -e \
"SELECT name, value FROM jos_magebridge_config WHERE name IN ('offline', 'host', 'api_user', 'protocol', 'enforce_ssl', 'debug_log') ORDER BY name;" \
2>/dev/null || echo "Could not query MageBridge config"
echo ""
echo "=== MageBridge Recent Logs (if debug enabled) ==="
docker compose exec mysql mysql -u root -psecret joomla -e \
"SELECT id, timestamp, message, type, origin FROM jos_magebridge_log ORDER BY id DESC LIMIT 20;" \
2>/dev/null || echo "Could not query MageBridge logs"
echo ""
echo "=== Network Connectivity Test ==="
echo "Testing Joomla -> OpenMage connectivity..."
docker compose exec joomla sh -c 'curl -ksf https://store.dev.local/api/soap?wsdl > /dev/null 2>&1 && echo "✓ SOAP API WSDL accessible" || echo "✗ SOAP API WSDL NOT accessible"'
echo ""
echo "Testing OpenMage -> MySQL connectivity..."
docker compose exec openmage sh -c 'php -r "require_once \"app/Mage.php\"; Mage::app(); echo \"✓ OpenMage can connect to database\n\";" 2>&1 || echo "✗ OpenMage database connection failed"'
echo ""
echo "=================================================="
echo "Diagnostic collection completed"
echo "=================================================="
- name: Upload diagnostic logs
if: failure()
uses: actions/upload-artifact@v6
with:
name: diagnostic-logs-joomla-${{ matrix.joomla.version }}
path: |
.devcontainer/joomla/logs/
.devcontainer/openmage/logs/
retention-days: 7
if-no-files-found: ignore
- name: Stop Docker Compose services
if: always()
working-directory: .devcontainer
run: docker compose down -v