Skip to content

Update tests.yml

Update tests.yml #35

Workflow file for this run

name: tests
on:
push:
branches: [master]
pull_request:
branches: [master]
jobs:
tests:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
php: [8.4]
stability: [prefer-stable]
name: PHP ${{ matrix.php }} - ${{ matrix.stability }}
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php }}
extensions: intl
coverage: none
tools: composer:v2
- name: Setup problem matchers
run: |
echo "::add-matcher::${{ runner.tool_cache }}/php.json"
echo "::add-matcher::${{ runner.tool_cache }}/phpunit.json"
- name: Install dependencies
run: composer update --${{ matrix.stability }} --prefer-dist --no-interaction --no-progress
- name: Execute tests
run: vendor/bin/phpunit
coverage:
runs-on: ubuntu-latest
name: Test Coverage
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: 8.4
extensions: intl, xdebug
coverage: xdebug
tools: composer:v2, phpunit
- name: Verify Xdebug installation
run: |
php -v
php -r "var_dump(extension_loaded('xdebug'));"
php -r "var_dump(function_exists('xdebug_start_code_coverage'));"
php -i | grep xdebug
- name: Install dependencies
run: composer update --prefer-stable --prefer-dist --no-interaction --no-progress
- name: Check project structure
run: |
echo "Project structure:"
find . -type f -name "*.php" | grep -v vendor | sort
- name: Create or update phpunit.xml
run: |
if [ -f "phpunit.xml.dist" ]; then
echo "Using phpunit.xml.dist as base"
cp phpunit.xml.dist phpunit.xml
else
echo "Creating phpunit.xml from scratch"
cat > phpunit.xml << 'EOL'
<?xml version="1.0" encoding="UTF-8"?>
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/11.5/phpunit.xsd"
bootstrap="vendor/autoload.php"
colors="true">
<testsuites>
<testsuite name="Bermuda Polyglot Test Suite">
<directory>tests</directory>
</testsuite>
</testsuites>
<source>
<include>
<directory>src</directory>
</include>
</source>
<coverage includeUncoveredFiles="true">
<report>
<clover outputFile="build/logs/clover.xml"/>
<html outputDirectory="build/coverage"/>
</report>
</coverage>
</phpunit>
EOL
fi
echo "phpunit.xml content:"
cat phpunit.xml
- name: Execute tests with coverage
run: |
mkdir -p build/logs
export XDEBUG_MODE=coverage
php -d xdebug.mode=coverage -d xdebug.enable=1 vendor/bin/phpunit --coverage-clover build/logs/clover.xml
- name: Check if clover.xml was generated
run: |
if [ -f "build/logs/clover.xml" ]; then
echo "clover.xml exists"
ls -la build/logs/
echo "First 30 lines of clover.xml:"
head -n 30 build/logs/clover.xml
echo "File size: $(wc -c < build/logs/clover.xml) bytes"
echo "Total lines: $(wc -l < build/logs/clover.xml) lines"
else
echo "ERROR: clover.xml does not exist"
ls -la build/logs/
fi
- name: Extract coverage info with debugging
run: |
# Install xml parsing tool
sudo apt-get install -y xmlstarlet jq
echo "===== Analyzing clover.xml structure ====="
xmlstarlet el build/logs/clover.xml | head -n 20
echo "===== Checking if file elements exist ====="
xmlstarlet sel -t -v "count(//file)" build/logs/clover.xml
echo "===== Checking if metrics elements exist ====="
xmlstarlet sel -t -v "count(//metrics)" build/logs/clover.xml
echo "===== First file path ====="
xmlstarlet sel -t -v "(//file/@name)[1]" build/logs/clover.xml
echo "===== Sample metrics ====="
xmlstarlet sel -t -v "(//file/metrics)[1]" build/logs/clover.xml
echo "===== Extracting coverage data ====="
STATEMENTS=$(xmlstarlet sel -t -v "sum(//file/metrics/@statements)" build/logs/clover.xml)
COVERED=$(xmlstarlet sel -t -v "sum(//file/metrics/@coveredstatements)" build/logs/clover.xml)
echo "Total statements: $STATEMENTS"
echo "Covered statements: $COVERED"
# Check for division by zero
if [ "$STATEMENTS" = "0" ] || [ -z "$STATEMENTS" ]; then
echo "WARNING: No statements found or count is zero"
PERCENTAGE="0.00"
else
PERCENTAGE=$(echo "scale=2; 100 * $COVERED / $STATEMENTS" | bc)
fi
echo "Coverage percentage: $PERCENTAGE%"
# Save for badge update
if [ "$STATEMENTS" = "0" ] || [ -z "$STATEMENTS" ]; then
# If no coverage data, set a minimum percentage for testing badge
echo "Using test percentage of 42.00% for badge testing"
echo "percentage=42.00" >> $GITHUB_OUTPUT
else
echo "percentage=$PERCENTAGE" >> $GITHUB_OUTPUT
fi
- name: Determine badge color
id: badge_color
run: |
PERCENTAGE=${{ steps.extract_coverage.outputs.percentage || '42.00' }}
if (( $(echo "$PERCENTAGE >= 90" | bc -l) )); then
COLOR="brightgreen"
elif (( $(echo "$PERCENTAGE >= 80" | bc -l) )); then
COLOR="green"
elif (( $(echo "$PERCENTAGE >= 70" | bc -l) )); then
COLOR="yellowgreen"
elif (( $(echo "$PERCENTAGE >= 60" | bc -l) )); then
COLOR="yellow"
elif (( $(echo "$PERCENTAGE >= 50" | bc -l) )); then
COLOR="orange"
else
COLOR="red"
fi
echo "color=$COLOR" >> $GITHUB_OUTPUT
echo "Badge color: $COLOR for $PERCENTAGE%"
- name: Create test badge JSON file
run: |
mkdir -p /tmp/badge
PERCENTAGE="${{ steps.extract_coverage.outputs.percentage || '42.00' }}"
COLOR="${{ steps.badge_color.outputs.color || 'orange' }}"
echo '{
"schemaVersion": 1,
"label": "coverage",
"message": "'$PERCENTAGE'%",
"color": "'$COLOR'"
}' > /tmp/badge/polyglot-coverage.json
echo "Badge JSON content:"
cat /tmp/badge/polyglot-coverage.json
- name: Update Gist with badge info
if: github.event_name != 'pull_request'
env:
GIST_TOKEN: ${{ secrets.GIST_SECRET }}
GIST_ID: ${{ secrets.GIST_ID }}
run: |
if [ -z "$GIST_TOKEN" ] || [ -z "$GIST_ID" ]; then
echo "WARNING: GIST_TOKEN or GIST_ID not set, skipping Gist update"
exit 0
fi
BADGE_CONTENT=$(cat /tmp/badge/polyglot-coverage.json)
# Escape JSON for inclusion in payload
ESCAPED_CONTENT=$(echo "$BADGE_CONTENT" | jq -aRs .)
# Create request payload
PAYLOAD="{\"files\":{\"polyglot-coverage.json\":{\"content\":$ESCAPED_CONTENT}}}"
echo "Sending request to update Gist..."
curl -s -X PATCH \
-H "Authorization: token $GIST_TOKEN" \
-H "Accept: application/vnd.github.v3+json" \
-d "$PAYLOAD" \
"https://api.github.com/gists/$GIST_ID"
echo "Gist updated successfully"