Skip to content

chore(deps): update dependency oxlint to ^1.72.0 #55

chore(deps): update dependency oxlint to ^1.72.0

chore(deps): update dependency oxlint to ^1.72.0 #55

Workflow file for this run

name: UI E2E
on:
pull_request:
paths:
- .github/workflows/ci-ui.yml
- "frontend/**"
- "tests/ui/**"
- "src/qwen3_tts/**"
- requirements-dev.txt
workflow_dispatch:
permissions:
contents: read
concurrency:
group: ci-ui-${{ github.ref }}
cancel-in-progress: true
jobs:
e2e:
if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository
runs-on: arc-general
timeout-minutes: 20
env:
PYTHONPATH: src:src/export
steps:
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7
- uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6
with:
python-version: "3.13"
cache: pip
cache-dependency-path: requirements-dev.txt
- uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
with:
node-version: "24"
- name: Install Python test dependencies
run: python -m pip install -r requirements-dev.txt
- name: Environment and import smoke test
run: |
echo "=== Environment ==="
python --version
pip list --format=columns | head -30
echo "PYTHONPATH=$PYTHONPATH"
echo "PWD=$(pwd)"
echo "=== Import smoke test ==="
python -c "
import sys
sys.path.insert(0, 'src')
sys.path.insert(0, 'src/export')
# Install fake model before importing app (no torch on runner)
from tests.fixtures.fake_runtime import FakeModelRuntime
rt = FakeModelRuntime()
rt.install()
errors = []
def try_import(name):
try:
__import__(name)
except Exception as e:
errors.append(f'{name}: {e}')
try_import('flask')
try_import('soundfile')
try_import('numpy')
try_import('qwen3_tts')
try_import('qwen3_tts.app')
if errors:
print('IMPORT ERRORS:')
for e in errors:
print(' ', e)
sys.exit(1)
else:
print('All critical imports OK')
"
- name: Install frontend dependencies
working-directory: frontend
run: npm ci
- name: Build frontend
working-directory: frontend
run: npm run build
- name: Install Playwright test dependencies
working-directory: tests/ui
run: npm ci
- name: Cache Playwright browsers
uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0
with:
path: ~/.cache/ms-playwright
key: playwright-${{ runner.os }}-${{ hashFiles('tests/ui/package-lock.json') }}
- name: Install Playwright browsers
working-directory: tests/ui
run: npx playwright install --with-deps chromium
- name: Start fake_model_server
run: |
# Start in background; use a wrapper to ensure we get the PID and logs
python tests/ui/fixtures/fake_model_server.py > fake_model_server.log 2>&1 &
SERVER_PID=$!
echo "fake_model_server PID=$SERVER_PID"
# Give it time to start (up to 10s, polling every 1s)
echo "=== Waiting for fake_model_server to become healthy ==="
deadline=$((SECONDS + 10))
while [ $SECONDS -lt $deadline ]; do
sleep 1
set +e
response=$(curl -s -w "\n%{http_code}" http://127.0.0.1:8319/health 2>&1 || true)
code=$(echo "$response" | tail -1)
set -e
if [ "$code" = "200" ]; then
echo "fake_model_server is healthy after $((SECONDS))s"
echo "health response:"
echo "$response"
exit 0
fi
done
# If we get here, it did not become healthy; dump diagnostics
echo "=== fake_model_server did not become healthy ==="
echo "Server PID alive?"
kill -0 "$SERVER_PID" 2>/dev/null && echo "YES" || echo "NO"
echo "--- fake_model_server logs (full) ---"
cat fake_model_server.log || echo "(empty or unreadable)"
echo "--- end logs ---"
# Try running it directly for 5s to capture any crash output
echo "=== Direct run attempt (5s timeout) ==="
timeout 5 python tests/ui/fixtures/fake_model_server.py || true
echo "=== end direct run ==="
exit 1
- name: Run Playwright E2E tests
working-directory: tests/ui
env:
PYTHONPATH: src:src/export
QWEN3_TTS_UI_URL: http://127.0.0.1:8319
run: npm run test:ci
- name: Upload Playwright report
if: failure()
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: playwright-report
path: tests/ui/playwright-report
retention-days: 1
- name: Upload fake_model_server log
if: failure()
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: fake_model_server-log
path: fake_model_server.log
retention-days: 1