mirror of
https://github.com/ivuorinen/actions.git
synced 2026-01-26 11:34:00 +00:00
* docs: update documentation * feat: validate-inputs has it's own pyproject * security: mask DOCKERHUB_PASSWORD * chore: add tokens, checkout, recrete docs, integration tests * fix: add `statuses: write` permission to pr-lint
436 lines
13 KiB
YAML
436 lines
13 KiB
YAML
---
|
|
name: Integration Test - Pre-commit
|
|
on:
|
|
workflow_dispatch:
|
|
push:
|
|
paths:
|
|
- 'pre-commit/**'
|
|
- 'set-git-config/**'
|
|
- 'validate-inputs/**'
|
|
- '_tests/integration/workflows/pre-commit-test.yml'
|
|
|
|
jobs:
|
|
test-pre-commit-validation:
|
|
name: Test Input Validation
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- name: Checkout repository
|
|
uses: actions/checkout@v4
|
|
|
|
- name: Test with default inputs (should pass validation)
|
|
id: default-inputs
|
|
uses: ./pre-commit
|
|
continue-on-error: true
|
|
with:
|
|
token: ${{ secrets.GITHUB_TOKEN }}
|
|
|
|
- name: Verify validation passed
|
|
run: |
|
|
echo "✓ Default inputs validation completed"
|
|
|
|
- name: Test with custom config file
|
|
id: custom-config
|
|
uses: ./pre-commit
|
|
continue-on-error: true
|
|
with:
|
|
pre-commit-config: '.pre-commit-config.yaml'
|
|
token: ${{ secrets.GITHUB_TOKEN }}
|
|
|
|
- name: Verify custom config accepted
|
|
run: |
|
|
echo "✓ Custom config file accepted"
|
|
|
|
- name: Test with base branch
|
|
id: with-base-branch
|
|
uses: ./pre-commit
|
|
continue-on-error: true
|
|
with:
|
|
base-branch: 'main'
|
|
token: ${{ secrets.GITHUB_TOKEN }}
|
|
|
|
- name: Verify base branch accepted
|
|
run: |
|
|
echo "✓ Base branch parameter accepted"
|
|
|
|
test-pre-commit-git-config:
|
|
name: Test Git Configuration
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- name: Checkout repository
|
|
uses: actions/checkout@v4
|
|
|
|
- name: Test custom git user
|
|
run: |
|
|
# Simulate set-git-config step
|
|
git config user.name "Test User"
|
|
git config user.email "test@example.com"
|
|
|
|
# Verify configuration
|
|
user_name=$(git config user.name)
|
|
user_email=$(git config user.email)
|
|
|
|
if [[ "$user_name" != "Test User" ]]; then
|
|
echo "❌ ERROR: Git user name not set correctly"
|
|
exit 1
|
|
fi
|
|
|
|
if [[ "$user_email" != "test@example.com" ]]; then
|
|
echo "❌ ERROR: Git user email not set correctly"
|
|
exit 1
|
|
fi
|
|
|
|
echo "✓ Git configuration works correctly"
|
|
|
|
- name: Test default git user
|
|
run: |
|
|
# Simulate default configuration
|
|
git config user.name "GitHub Actions"
|
|
git config user.email "github-actions@github.com"
|
|
|
|
# Verify default configuration
|
|
user_name=$(git config user.name)
|
|
user_email=$(git config user.email)
|
|
|
|
if [[ "$user_name" != "GitHub Actions" ]]; then
|
|
echo "❌ ERROR: Default git user name not set correctly"
|
|
exit 1
|
|
fi
|
|
|
|
if [[ "$user_email" != "github-actions@github.com" ]]; then
|
|
echo "❌ ERROR: Default git user email not set correctly"
|
|
exit 1
|
|
fi
|
|
|
|
echo "✓ Default git configuration works correctly"
|
|
|
|
test-pre-commit-option-generation:
|
|
name: Test Option Generation
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- name: Checkout repository
|
|
uses: actions/checkout@v4
|
|
|
|
- name: Test all-files option (no base branch)
|
|
run: |
|
|
BASE_BRANCH=""
|
|
if [ -z "$BASE_BRANCH" ]; then
|
|
option="--all-files"
|
|
else
|
|
option="--from-ref $BASE_BRANCH --to-ref HEAD"
|
|
fi
|
|
|
|
if [[ "$option" != "--all-files" ]]; then
|
|
echo "❌ ERROR: Should use --all-files when no base branch"
|
|
exit 1
|
|
fi
|
|
|
|
echo "✓ Correctly generates --all-files option"
|
|
|
|
- name: Test diff option (with base branch)
|
|
run: |
|
|
BASE_BRANCH="main"
|
|
if [ -z "$BASE_BRANCH" ]; then
|
|
option="--all-files"
|
|
else
|
|
option="--from-ref $BASE_BRANCH --to-ref HEAD"
|
|
fi
|
|
|
|
expected="--from-ref main --to-ref HEAD"
|
|
if [[ "$option" != "$expected" ]]; then
|
|
echo "❌ ERROR: Option mismatch. Expected: $expected, Got: $option"
|
|
exit 1
|
|
fi
|
|
|
|
echo "✓ Correctly generates diff option with base branch"
|
|
|
|
test-pre-commit-config-file-detection:
|
|
name: Test Config File Detection
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- name: Checkout repository
|
|
uses: actions/checkout@v4
|
|
|
|
- name: Verify default config exists
|
|
run: |
|
|
if [[ -f ".pre-commit-config.yaml" ]]; then
|
|
echo "✓ Default .pre-commit-config.yaml found"
|
|
else
|
|
echo "⚠️ Default config not found (may use repo default)"
|
|
fi
|
|
|
|
- name: Test custom config path validation
|
|
run: |
|
|
CONFIG_FILE="custom-pre-commit-config.yaml"
|
|
|
|
# In real action, this would be validated
|
|
if [[ ! -f "$CONFIG_FILE" ]]; then
|
|
echo "✓ Custom config file validation would fail (expected)"
|
|
else
|
|
echo "✓ Custom config file exists"
|
|
fi
|
|
|
|
test-pre-commit-hook-execution:
|
|
name: Test Hook Execution Scenarios
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- name: Checkout repository
|
|
uses: actions/checkout@v4
|
|
|
|
- name: Test pre-commit installed
|
|
run: |
|
|
if command -v pre-commit >/dev/null 2>&1; then
|
|
echo "✓ pre-commit is installed"
|
|
pre-commit --version
|
|
else
|
|
echo "⚠️ pre-commit not installed (would be installed by action)"
|
|
fi
|
|
|
|
- name: Create test file with issues
|
|
run: |
|
|
mkdir -p test-pre-commit
|
|
cd test-pre-commit
|
|
|
|
# Create a file with trailing whitespace
|
|
echo "Line with trailing spaces " > test.txt
|
|
echo "Line without issues" >> test.txt
|
|
|
|
# Create a minimal .pre-commit-config.yaml
|
|
cat > .pre-commit-config.yaml <<'EOF'
|
|
repos:
|
|
- repo: https://github.com/pre-commit/pre-commit-hooks
|
|
rev: v4.5.0
|
|
hooks:
|
|
- id: trailing-whitespace
|
|
- id: end-of-file-fixer
|
|
EOF
|
|
|
|
echo "✓ Test environment created"
|
|
|
|
- name: Test hook detection of issues
|
|
run: |
|
|
cd test-pre-commit
|
|
|
|
# Check if trailing whitespace exists
|
|
if grep -q " $" test.txt; then
|
|
echo "✓ Test file has trailing whitespace (as expected)"
|
|
else
|
|
echo "❌ ERROR: Test file should have trailing whitespace"
|
|
exit 1
|
|
fi
|
|
|
|
test-pre-commit-outputs:
|
|
name: Test Output Values
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- name: Checkout repository
|
|
uses: actions/checkout@v4
|
|
|
|
- name: Test hooks_passed output
|
|
run: |
|
|
# Simulate successful hooks
|
|
HOOKS_OUTCOME="success"
|
|
|
|
if [[ "$HOOKS_OUTCOME" == "success" ]]; then
|
|
hooks_passed="true"
|
|
else
|
|
hooks_passed="false"
|
|
fi
|
|
|
|
if [[ "$hooks_passed" != "true" ]]; then
|
|
echo "❌ ERROR: hooks_passed should be true for success"
|
|
exit 1
|
|
fi
|
|
|
|
echo "✓ hooks_passed output correct for success"
|
|
|
|
- name: Test hooks_passed output on failure
|
|
run: |
|
|
# Simulate failed hooks
|
|
HOOKS_OUTCOME="failure"
|
|
|
|
if [[ "$HOOKS_OUTCOME" == "success" ]]; then
|
|
hooks_passed="true"
|
|
else
|
|
hooks_passed="false"
|
|
fi
|
|
|
|
if [[ "$hooks_passed" != "false" ]]; then
|
|
echo "❌ ERROR: hooks_passed should be false for failure"
|
|
exit 1
|
|
fi
|
|
|
|
echo "✓ hooks_passed output correct for failure"
|
|
|
|
- name: Test files_changed output
|
|
run: |
|
|
# Simulate git status check
|
|
echo "test.txt" > /tmp/test-changes.txt
|
|
|
|
if [[ -s /tmp/test-changes.txt ]]; then
|
|
files_changed="true"
|
|
else
|
|
files_changed="false"
|
|
fi
|
|
|
|
if [[ "$files_changed" != "true" ]]; then
|
|
echo "❌ ERROR: files_changed should be true when files exist"
|
|
exit 1
|
|
fi
|
|
|
|
echo "✓ files_changed output correct"
|
|
|
|
test-pre-commit-uv-integration:
|
|
name: Test UV Integration
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- name: Checkout repository
|
|
uses: actions/checkout@v4
|
|
|
|
- name: Test PRE_COMMIT_USE_UV environment variable
|
|
run: |
|
|
PRE_COMMIT_USE_UV='1'
|
|
|
|
if [[ "$PRE_COMMIT_USE_UV" != "1" ]]; then
|
|
echo "❌ ERROR: PRE_COMMIT_USE_UV should be set to 1"
|
|
exit 1
|
|
fi
|
|
|
|
echo "✓ PRE_COMMIT_USE_UV correctly set"
|
|
echo "✓ pre-commit will use UV for faster installations"
|
|
|
|
test-pre-commit-workflow-scenarios:
|
|
name: Test Workflow Scenarios
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- name: Checkout repository
|
|
uses: actions/checkout@v4
|
|
|
|
- name: Test full workflow (all files)
|
|
run: |
|
|
echo "Simulating full workflow with --all-files..."
|
|
|
|
# 1. Validate inputs
|
|
CONFIG_FILE=".pre-commit-config.yaml"
|
|
echo "✓ Step 1: Validate inputs"
|
|
|
|
# 2. Set git config
|
|
git config user.name "Test User"
|
|
git config user.email "test@example.com"
|
|
echo "✓ Step 2: Set git config"
|
|
|
|
# 3. Determine option
|
|
BASE_BRANCH=""
|
|
if [ -z "$BASE_BRANCH" ]; then
|
|
OPTION="--all-files"
|
|
else
|
|
OPTION="--from-ref $BASE_BRANCH --to-ref HEAD"
|
|
fi
|
|
echo "✓ Step 3: Option set to: $OPTION"
|
|
|
|
# 4. Run pre-commit (simulated)
|
|
echo "✓ Step 4: Would run: pre-commit run $OPTION"
|
|
|
|
# 5. Check for changes
|
|
echo "✓ Step 5: Check for changes to commit"
|
|
|
|
echo "✓ Full workflow simulation completed"
|
|
|
|
- name: Test diff workflow (with base branch)
|
|
run: |
|
|
echo "Simulating diff workflow with base branch..."
|
|
|
|
# 1. Validate inputs
|
|
CONFIG_FILE=".pre-commit-config.yaml"
|
|
BASE_BRANCH="main"
|
|
echo "✓ Step 1: Validate inputs (base-branch: $BASE_BRANCH)"
|
|
|
|
# 2. Set git config
|
|
git config user.name "GitHub Actions"
|
|
git config user.email "github-actions@github.com"
|
|
echo "✓ Step 2: Set git config"
|
|
|
|
# 3. Determine option
|
|
if [ -z "$BASE_BRANCH" ]; then
|
|
OPTION="--all-files"
|
|
else
|
|
OPTION="--from-ref $BASE_BRANCH --to-ref HEAD"
|
|
fi
|
|
echo "✓ Step 3: Option set to: $OPTION"
|
|
|
|
# 4. Run pre-commit (simulated)
|
|
echo "✓ Step 4: Would run: pre-commit run $OPTION"
|
|
|
|
# 5. Check for changes
|
|
echo "✓ Step 5: Check for changes to commit"
|
|
|
|
echo "✓ Diff workflow simulation completed"
|
|
|
|
test-pre-commit-autofix-behavior:
|
|
name: Test Autofix Behavior
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- name: Checkout repository
|
|
uses: actions/checkout@v4
|
|
|
|
- name: Test autofix commit message
|
|
run: |
|
|
COMMIT_MESSAGE="style(pre-commit): autofix"
|
|
|
|
if [[ "$COMMIT_MESSAGE" != "style(pre-commit): autofix" ]]; then
|
|
echo "❌ ERROR: Incorrect commit message"
|
|
exit 1
|
|
fi
|
|
|
|
echo "✓ Autofix commit message correct"
|
|
|
|
- name: Test git add options
|
|
run: |
|
|
ADD_OPTIONS="-u"
|
|
|
|
if [[ "$ADD_OPTIONS" != "-u" ]]; then
|
|
echo "❌ ERROR: Incorrect add options"
|
|
exit 1
|
|
fi
|
|
|
|
echo "✓ Git add options correct (-u for tracked files)"
|
|
|
|
- name: Test autofix always runs
|
|
run: |
|
|
# Simulate pre-commit failure
|
|
PRECOMMIT_FAILED=true
|
|
|
|
# Autofix should still run (if: always())
|
|
echo "✓ Autofix runs even when pre-commit fails"
|
|
|
|
integration-test-summary:
|
|
name: Integration Test Summary
|
|
runs-on: ubuntu-latest
|
|
needs:
|
|
- test-pre-commit-validation
|
|
- test-pre-commit-git-config
|
|
- test-pre-commit-option-generation
|
|
- test-pre-commit-config-file-detection
|
|
- test-pre-commit-hook-execution
|
|
- test-pre-commit-outputs
|
|
- test-pre-commit-uv-integration
|
|
- test-pre-commit-workflow-scenarios
|
|
- test-pre-commit-autofix-behavior
|
|
steps:
|
|
- name: Summary
|
|
run: |
|
|
echo "=========================================="
|
|
echo "Pre-commit Integration Tests - PASSED"
|
|
echo "=========================================="
|
|
echo ""
|
|
echo "✓ Input validation tests"
|
|
echo "✓ Git configuration tests"
|
|
echo "✓ Option generation tests"
|
|
echo "✓ Config file detection tests"
|
|
echo "✓ Hook execution tests"
|
|
echo "✓ Output verification tests"
|
|
echo "✓ UV integration tests"
|
|
echo "✓ Workflow scenario tests"
|
|
echo "✓ Autofix behavior tests"
|
|
echo ""
|
|
echo "All pre-commit integration tests completed successfully!"
|