mirror of
https://github.com/ivuorinen/tree-sitter-shellspec.git
synced 2026-02-19 06:53:45 +00:00
fix(ci): use inline steps instead of actions
This commit is contained in:
120
.github/actions/README.md
vendored
120
.github/actions/README.md
vendored
@@ -1,120 +0,0 @@
|
|||||||
# Composite Actions
|
|
||||||
|
|
||||||
This directory contains reusable composite actions to reduce duplication across workflows.
|
|
||||||
|
|
||||||
## Available Actions
|
|
||||||
|
|
||||||
### setup-node
|
|
||||||
|
|
||||||
Sets up Node.js with caching and installs dependencies.
|
|
||||||
|
|
||||||
**Inputs:**
|
|
||||||
|
|
||||||
- `node-version` (optional): Node.js version, defaults to '24'
|
|
||||||
- `registry-url` (optional): NPM registry URL
|
|
||||||
|
|
||||||
**Usage:**
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
- uses: ./.github/actions/setup-node
|
|
||||||
with:
|
|
||||||
node-version: 22
|
|
||||||
```
|
|
||||||
|
|
||||||
### setup-treesitter
|
|
||||||
|
|
||||||
Installs Tree-sitter CLI and generates the grammar.
|
|
||||||
|
|
||||||
**Usage:**
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
- uses: ./.github/actions/setup-treesitter
|
|
||||||
```
|
|
||||||
|
|
||||||
### setup-dev
|
|
||||||
|
|
||||||
Complete development environment setup (combines setup-node + setup-treesitter).
|
|
||||||
|
|
||||||
**Inputs:**
|
|
||||||
|
|
||||||
- `node-version` (optional): Node.js version, defaults to '24'
|
|
||||||
- `registry-url` (optional): NPM registry URL
|
|
||||||
- `skip-checkout` (optional): Skip repository checkout, defaults to 'false'
|
|
||||||
|
|
||||||
**Usage:**
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
- uses: ./.github/actions/setup-dev
|
|
||||||
with:
|
|
||||||
node-version: 24
|
|
||||||
skip-checkout: 'true'
|
|
||||||
```
|
|
||||||
|
|
||||||
### test-grammar
|
|
||||||
|
|
||||||
Runs comprehensive grammar tests including parser validation.
|
|
||||||
|
|
||||||
**Inputs:**
|
|
||||||
|
|
||||||
- `skip-sample-test` (optional): Skip complex sample test, defaults to 'false'
|
|
||||||
|
|
||||||
**Usage:**
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
- uses: ./.github/actions/test-grammar
|
|
||||||
with:
|
|
||||||
skip-sample-test: 'true'
|
|
||||||
```
|
|
||||||
|
|
||||||
### test-coverage
|
|
||||||
|
|
||||||
Analyzes test coverage and validates minimum requirements.
|
|
||||||
|
|
||||||
**Inputs:**
|
|
||||||
|
|
||||||
- `minimum-tests` (optional): Minimum tests required, defaults to '55'
|
|
||||||
|
|
||||||
**Outputs:**
|
|
||||||
|
|
||||||
- `total-tests`: Total number of tests found
|
|
||||||
- `passing-tests`: Number of passing tests
|
|
||||||
- `coverage-percent`: Test coverage percentage
|
|
||||||
|
|
||||||
**Usage:**
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
- uses: ./.github/actions/test-coverage
|
|
||||||
with:
|
|
||||||
minimum-tests: 60
|
|
||||||
```
|
|
||||||
|
|
||||||
## Workflow Usage Examples
|
|
||||||
|
|
||||||
### Test Workflow (Simplified)
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
jobs:
|
|
||||||
test:
|
|
||||||
steps:
|
|
||||||
- uses: ./.github/actions/setup-dev
|
|
||||||
with:
|
|
||||||
node-version: ${{ matrix.node-version }}
|
|
||||||
- uses: ./.github/actions/test-grammar
|
|
||||||
```
|
|
||||||
|
|
||||||
### Release Workflow (Simplified)
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
jobs:
|
|
||||||
test:
|
|
||||||
steps:
|
|
||||||
- uses: ./.github/actions/setup-dev
|
|
||||||
- uses: ./.github/actions/test-grammar
|
|
||||||
with:
|
|
||||||
skip-sample-test: 'true'
|
|
||||||
|
|
||||||
lint:
|
|
||||||
steps:
|
|
||||||
- uses: ./.github/actions/setup-node
|
|
||||||
- uses: ivuorinen/actions/pr-lint@latest
|
|
||||||
```
|
|
||||||
43
.github/actions/setup-dev/action.yml
vendored
43
.github/actions/setup-dev/action.yml
vendored
@@ -1,43 +0,0 @@
|
|||||||
---
|
|
||||||
name: "Setup Development Environment"
|
|
||||||
description: "Complete setup for tree-sitter-shellspec development including Node.js and Tree-sitter"
|
|
||||||
|
|
||||||
inputs:
|
|
||||||
node-version:
|
|
||||||
description: "Node.js version to setup"
|
|
||||||
required: false
|
|
||||||
default: "24"
|
|
||||||
registry-url:
|
|
||||||
description: "NPM registry URL"
|
|
||||||
required: false
|
|
||||||
default: ""
|
|
||||||
skip-checkout:
|
|
||||||
description: "Skip repository checkout (if already done)"
|
|
||||||
required: false
|
|
||||||
default: "false"
|
|
||||||
|
|
||||||
runs:
|
|
||||||
using: "composite"
|
|
||||||
steps:
|
|
||||||
- name: Checkout Repository
|
|
||||||
if: inputs.skip-checkout != 'true'
|
|
||||||
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
|
|
||||||
|
|
||||||
- name: Setup Node.js ${{ inputs.node-version }}
|
|
||||||
uses: actions/setup-node@7c12f8017d5436eb855f1ed4399f037a36fbd9e8 # v5.2.1
|
|
||||||
with:
|
|
||||||
node-version: ${{ inputs.node-version }}
|
|
||||||
cache: npm
|
|
||||||
registry-url: ${{ inputs.registry-url }}
|
|
||||||
|
|
||||||
- name: Install Dependencies
|
|
||||||
run: npm ci || { echo "❌ npm install failed" && npm install }
|
|
||||||
shell: bash
|
|
||||||
|
|
||||||
- name: Install Tree-sitter CLI
|
|
||||||
run: npm install -g tree-sitter-cli
|
|
||||||
shell: bash
|
|
||||||
|
|
||||||
- name: Generate Grammar
|
|
||||||
run: npm run generate
|
|
||||||
shell: bash
|
|
||||||
30
.github/actions/setup-node/action.yml
vendored
30
.github/actions/setup-node/action.yml
vendored
@@ -1,30 +0,0 @@
|
|||||||
---
|
|
||||||
name: "Setup Node.js Environment"
|
|
||||||
description: "Sets up Node.js with caching and installs dependencies"
|
|
||||||
|
|
||||||
inputs:
|
|
||||||
node-version:
|
|
||||||
description: "Node.js version to setup"
|
|
||||||
required: false
|
|
||||||
default: "24"
|
|
||||||
registry-url:
|
|
||||||
description: "NPM registry URL"
|
|
||||||
required: false
|
|
||||||
default: ""
|
|
||||||
|
|
||||||
runs:
|
|
||||||
using: "composite"
|
|
||||||
steps:
|
|
||||||
- name: Checkout Repository
|
|
||||||
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
|
|
||||||
|
|
||||||
- name: Setup Node.js ${{ inputs.node-version }}
|
|
||||||
uses: actions/setup-node@7c12f8017d5436eb855f1ed4399f037a36fbd9e8 # v5.2.1
|
|
||||||
with:
|
|
||||||
node-version: ${{ inputs.node-version }}
|
|
||||||
cache: npm
|
|
||||||
registry-url: ${{ inputs.registry-url }}
|
|
||||||
|
|
||||||
- name: Install Dependencies
|
|
||||||
run: npm ci || { echo "❌ npm install failed" && npm install }
|
|
||||||
shell: bash
|
|
||||||
71
.github/actions/test-coverage/action.yml
vendored
71
.github/actions/test-coverage/action.yml
vendored
@@ -1,71 +0,0 @@
|
|||||||
---
|
|
||||||
name: "Test Coverage Analysis"
|
|
||||||
description: "Analyzes test coverage and generates coverage report"
|
|
||||||
|
|
||||||
inputs:
|
|
||||||
minimum-tests:
|
|
||||||
description: "Minimum number of tests required"
|
|
||||||
required: false
|
|
||||||
default: "55"
|
|
||||||
|
|
||||||
outputs:
|
|
||||||
total-tests:
|
|
||||||
description: "Total number of tests found"
|
|
||||||
value: ${{ steps.coverage.outputs.total-tests }}
|
|
||||||
passing-tests:
|
|
||||||
description: "Number of passing tests"
|
|
||||||
value: ${{ steps.coverage.outputs.passing-tests }}
|
|
||||||
coverage-percent:
|
|
||||||
description: "Test coverage percentage"
|
|
||||||
value: ${{ steps.coverage.outputs.coverage-percent }}
|
|
||||||
|
|
||||||
runs:
|
|
||||||
using: "composite"
|
|
||||||
steps:
|
|
||||||
- name: Test Coverage Analysis
|
|
||||||
id: coverage
|
|
||||||
run: |
|
|
||||||
echo "## Test Coverage Report" > coverage_report.md
|
|
||||||
echo "" >> coverage_report.md
|
|
||||||
|
|
||||||
# Run tests and capture output
|
|
||||||
TEST_OUTPUT=$(npm test 2>&1)
|
|
||||||
TOTAL_TESTS=$(echo "$TEST_OUTPUT" | grep -E "^\s+[0-9]+\." | wc -l)
|
|
||||||
PASSING_TESTS=$(echo "$TEST_OUTPUT" | grep -E "^\s+[0-9]+\. ✓" | wc -l)
|
|
||||||
FAILING_TESTS=$(echo "$TEST_OUTPUT" | grep -E "^\s+[0-9]+\. ✗" | wc -l)
|
|
||||||
|
|
||||||
echo "- **Total Tests:** $TOTAL_TESTS" >> coverage_report.md
|
|
||||||
echo "- **Passing:** $PASSING_TESTS ✅" >> coverage_report.md
|
|
||||||
echo "- **Failing:** $FAILING_TESTS ❌" >> coverage_report.md
|
|
||||||
|
|
||||||
if [ $TOTAL_TESTS -gt 0 ]; then
|
|
||||||
COVERAGE_PERCENT=$(( (PASSING_TESTS * 100) / TOTAL_TESTS ))
|
|
||||||
echo "- **Coverage:** $COVERAGE_PERCENT%" >> coverage_report.md
|
|
||||||
else
|
|
||||||
COVERAGE_PERCENT=0
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "" >> coverage_report.md
|
|
||||||
echo "### Test Files" >> coverage_report.md
|
|
||||||
echo "$TEST_OUTPUT" | grep -E "^\s+[a-z_]+:" | sed 's/^/- /' >> coverage_report.md
|
|
||||||
|
|
||||||
cat coverage_report.md
|
|
||||||
|
|
||||||
# Set outputs
|
|
||||||
echo "total-tests=$TOTAL_TESTS" >> $GITHUB_OUTPUT
|
|
||||||
echo "passing-tests=$PASSING_TESTS" >> $GITHUB_OUTPUT
|
|
||||||
echo "coverage-percent=$COVERAGE_PERCENT" >> $GITHUB_OUTPUT
|
|
||||||
|
|
||||||
# Validate test coverage requirements
|
|
||||||
if [ $TOTAL_TESTS -lt ${{ inputs.minimum-tests }} ]; then
|
|
||||||
echo "❌ Expected at least ${{ inputs.minimum-tests }} tests, found $TOTAL_TESTS"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ $FAILING_TESTS -gt 0 ]; then
|
|
||||||
echo "❌ Found $FAILING_TESTS failing tests"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "✅ Test coverage is acceptable: $PASSING_TESTS/$TOTAL_TESTS tests passing ($COVERAGE_PERCENT%)"
|
|
||||||
shell: bash
|
|
||||||
77
.github/actions/test-grammar/action.yml
vendored
77
.github/actions/test-grammar/action.yml
vendored
@@ -1,77 +0,0 @@
|
|||||||
---
|
|
||||||
name: "Test Tree-sitter Grammar"
|
|
||||||
description: "Runs comprehensive grammar tests including parser validation"
|
|
||||||
|
|
||||||
inputs:
|
|
||||||
skip-sample-test:
|
|
||||||
description: "Skip the sample ShellSpec code test"
|
|
||||||
required: false
|
|
||||||
default: "false"
|
|
||||||
|
|
||||||
runs:
|
|
||||||
using: "composite"
|
|
||||||
steps:
|
|
||||||
- name: Run Tests
|
|
||||||
run: npm test
|
|
||||||
shell: bash
|
|
||||||
|
|
||||||
- name: Build Parser
|
|
||||||
run: npm run build
|
|
||||||
shell: bash
|
|
||||||
|
|
||||||
- name: Test Parser with Sample Code
|
|
||||||
if: inputs.skip-sample-test != 'true'
|
|
||||||
run: |
|
|
||||||
cat << 'EOF' > test_sample.shellspec
|
|
||||||
#!/usr/bin/env shellspec
|
|
||||||
|
|
||||||
Describe 'Calculator'
|
|
||||||
Include ./lib/calculator.sh
|
|
||||||
|
|
||||||
Before 'setup_calculator'
|
|
||||||
After 'cleanup_calculator'
|
|
||||||
|
|
||||||
Context 'when adding numbers'
|
|
||||||
It 'adds two positive numbers'
|
|
||||||
When call add 2 3
|
|
||||||
The output should eq 5
|
|
||||||
End
|
|
||||||
|
|
||||||
It 'handles zero'
|
|
||||||
When call add 0 5
|
|
||||||
The output should eq 5
|
|
||||||
End
|
|
||||||
End
|
|
||||||
|
|
||||||
Context 'when input is invalid'
|
|
||||||
Skip if "validation not implemented" ! command -v validate
|
|
||||||
|
|
||||||
It 'handles empty input'
|
|
||||||
When call add "" ""
|
|
||||||
The status should be failure
|
|
||||||
End
|
|
||||||
End
|
|
||||||
End
|
|
||||||
|
|
||||||
It 'works without describe block'
|
|
||||||
When call echo "test"
|
|
||||||
The output should eq "test"
|
|
||||||
End
|
|
||||||
EOF
|
|
||||||
|
|
||||||
tree-sitter parse test_sample.shellspec --quiet || {
|
|
||||||
echo "❌ Parser failed on sample ShellSpec code"
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
echo "✅ Parser successfully handled sample code"
|
|
||||||
shell: bash
|
|
||||||
|
|
||||||
- name: Validate Parser (Simple)
|
|
||||||
if: inputs.skip-sample-test == 'true'
|
|
||||||
run: |
|
|
||||||
echo "Describe 'test' It 'works' End End" | tree-sitter parse --language=shellspec || {
|
|
||||||
echo "❌ Parser validation failed"
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
echo "✅ Parser validation successful"
|
|
||||||
shell: bash
|
|
||||||
29
.github/workflows/release.yml
vendored
29
.github/workflows/release.yml
vendored
@@ -100,8 +100,17 @@ jobs:
|
|||||||
needs: validate
|
needs: validate
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: 🏗️ Setup Node.js Environment
|
- name: Checkout Repository
|
||||||
uses: ./.github/actions/setup-node
|
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
|
||||||
|
|
||||||
|
- name: Setup Node.js 24
|
||||||
|
uses: actions/setup-node@7c12f8017d5436eb855f1ed4399f037a36fbd9e8 # v5.2.1
|
||||||
|
with:
|
||||||
|
node-version: 24
|
||||||
|
cache: npm
|
||||||
|
|
||||||
|
- name: Install Dependencies
|
||||||
|
run: npm ci || { echo "❌ npm install failed"; npm install; }
|
||||||
|
|
||||||
- name: 🔍 Run Security Audit
|
- name: 🔍 Run Security Audit
|
||||||
run: npm audit --audit-level=high
|
run: npm audit --audit-level=high
|
||||||
@@ -124,11 +133,21 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
|
||||||
- name: 🏗️ Setup Development Environment
|
- name: Setup Node.js 24
|
||||||
uses: ./.github/actions/setup-dev
|
uses: actions/setup-node@7c12f8017d5436eb855f1ed4399f037a36fbd9e8 # v5.2.1
|
||||||
with:
|
with:
|
||||||
|
node-version: 24
|
||||||
|
cache: npm
|
||||||
registry-url: "https://registry.npmjs.org"
|
registry-url: "https://registry.npmjs.org"
|
||||||
skip-checkout: "true"
|
|
||||||
|
- name: Install Dependencies
|
||||||
|
run: npm ci || { echo "❌ npm install failed"; npm install; }
|
||||||
|
|
||||||
|
- name: Install Tree-sitter CLI
|
||||||
|
run: npm install -g tree-sitter-cli
|
||||||
|
|
||||||
|
- name: Generate Grammar
|
||||||
|
run: npm run generate
|
||||||
|
|
||||||
- name: 🏗️ Build Parser
|
- name: 🏗️ Build Parser
|
||||||
run: npm run build
|
run: npm run build
|
||||||
|
|||||||
147
.github/workflows/test.yml
vendored
147
.github/workflows/test.yml
vendored
@@ -38,13 +38,73 @@ jobs:
|
|||||||
fail-fast: false
|
fail-fast: false
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: 🏗️ Setup Development Environment
|
- name: Setup Node.js ${{ matrix.node-version }}
|
||||||
uses: ./.github/actions/setup-dev
|
uses: actions/setup-node@7c12f8017d5436eb855f1ed4399f037a36fbd9e8 # v5.2.1
|
||||||
with:
|
with:
|
||||||
node-version: ${{ matrix.node-version }}
|
node-version: ${{ matrix.node-version }}
|
||||||
|
cache: npm
|
||||||
|
|
||||||
- name: 🧪 Test Grammar
|
- name: Install Dependencies
|
||||||
uses: ./.github/actions/test-grammar
|
run: npm ci || { echo "❌ npm install failed"; npm install; }
|
||||||
|
shell: bash
|
||||||
|
|
||||||
|
- name: Install Tree-sitter CLI
|
||||||
|
run: npm install -g tree-sitter-cli
|
||||||
|
shell: bash
|
||||||
|
|
||||||
|
- name: Generate Grammar
|
||||||
|
run: npm run generate
|
||||||
|
shell: bash
|
||||||
|
|
||||||
|
- name: Build Parser
|
||||||
|
run: npm run build
|
||||||
|
shell: bash
|
||||||
|
|
||||||
|
- name: Test Parser with Sample Code
|
||||||
|
run: |
|
||||||
|
cat << 'EOF' > test_sample.shellspec
|
||||||
|
#!/usr/bin/env shellspec
|
||||||
|
|
||||||
|
Describe 'Calculator'
|
||||||
|
Include ./lib/calculator.sh
|
||||||
|
|
||||||
|
Before 'setup_calculator'
|
||||||
|
After 'cleanup_calculator'
|
||||||
|
|
||||||
|
Context 'when adding numbers'
|
||||||
|
It 'adds two positive numbers'
|
||||||
|
When call add 2 3
|
||||||
|
The output should eq 5
|
||||||
|
End
|
||||||
|
|
||||||
|
It 'handles zero'
|
||||||
|
When call add 0 5
|
||||||
|
The output should eq 5
|
||||||
|
End
|
||||||
|
End
|
||||||
|
|
||||||
|
Context 'when input is invalid'
|
||||||
|
Skip if "validation not implemented" ! command -v validate
|
||||||
|
|
||||||
|
It 'handles empty input'
|
||||||
|
When call add "" ""
|
||||||
|
The status should be failure
|
||||||
|
End
|
||||||
|
End
|
||||||
|
End
|
||||||
|
|
||||||
|
It 'works without describe block'
|
||||||
|
When call echo "test"
|
||||||
|
The output should eq "test"
|
||||||
|
End
|
||||||
|
EOF
|
||||||
|
|
||||||
|
tree-sitter parse test_sample.shellspec --quiet || {
|
||||||
|
echo "❌ Parser failed on sample ShellSpec code"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
echo "✅ Parser successfully handled sample code"
|
||||||
|
shell: bash
|
||||||
|
|
||||||
lint:
|
lint:
|
||||||
name: 🧹 Code Quality
|
name: 🧹 Code Quality
|
||||||
@@ -52,8 +112,18 @@ jobs:
|
|||||||
timeout-minutes: 15
|
timeout-minutes: 15
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: 🏗️ Setup Node.js Environment
|
- name: Checkout Repository
|
||||||
uses: ./.github/actions/setup-node
|
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
|
||||||
|
|
||||||
|
- name: Setup Node.js 24
|
||||||
|
uses: actions/setup-node@7c12f8017d5436eb855f1ed4399f037a36fbd9e8 # v5.2.1
|
||||||
|
with:
|
||||||
|
node-version: 24
|
||||||
|
cache: npm
|
||||||
|
|
||||||
|
- name: Install Dependencies
|
||||||
|
run: npm ci || { echo "❌ npm install failed"; npm install; }
|
||||||
|
shell: bash
|
||||||
|
|
||||||
- name: 🧹 Run Linter
|
- name: 🧹 Run Linter
|
||||||
uses: ivuorinen/actions/pr-lint@22e6add79fabcca4bf5761452a51e4fa0207e155 # 25.9.8
|
uses: ivuorinen/actions/pr-lint@22e6add79fabcca4bf5761452a51e4fa0207e155 # 25.9.8
|
||||||
@@ -65,12 +135,65 @@ jobs:
|
|||||||
needs: test
|
needs: test
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: 🏗️ Setup Development Environment
|
- name: Checkout Repository
|
||||||
uses: ./.github/actions/setup-dev
|
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
|
||||||
|
|
||||||
|
- name: Setup Node.js 24
|
||||||
|
uses: actions/setup-node@7c12f8017d5436eb855f1ed4399f037a36fbd9e8 # v5.2.1
|
||||||
with:
|
with:
|
||||||
node-version: 24
|
node-version: 24
|
||||||
|
cache: npm
|
||||||
|
|
||||||
- name: 📊 Test Coverage Analysis
|
- name: Test Coverage Analysis
|
||||||
uses: ./.github/actions/test-coverage
|
id: coverage
|
||||||
with:
|
run: |
|
||||||
minimum-tests: 55
|
echo "## Test Coverage Report" > coverage_report.md
|
||||||
|
echo "" >> coverage_report.md
|
||||||
|
|
||||||
|
# Run tests and capture output
|
||||||
|
TEST_OUTPUT=$(npm test 2>&1)
|
||||||
|
TOTAL_TESTS=$(echo "$TEST_OUTPUT" | grep -cE "^\s+[0-9]+\.")
|
||||||
|
PASSING_TESTS=$(echo "$TEST_OUTPUT" | grep -cE "^\s+[0-9]+\. ✓")
|
||||||
|
FAILING_TESTS=$(echo "$TEST_OUTPUT" | grep -cE "^\s+[0-9]+\. ✗")
|
||||||
|
|
||||||
|
{
|
||||||
|
echo "- **Total Tests:** $TOTAL_TESTS"
|
||||||
|
echo "- **Passing:** $PASSING_TESTS ✅"
|
||||||
|
echo "- **Failing:** $FAILING_TESTS ❌"
|
||||||
|
} >> coverage_report.md
|
||||||
|
|
||||||
|
if [ "$TOTAL_TESTS" -gt 0 ]; then
|
||||||
|
COVERAGE_PERCENT=$(( (PASSING_TESTS * 100) / TOTAL_TESTS ))
|
||||||
|
echo "- **Coverage:** $COVERAGE_PERCENT%" >> coverage_report.md
|
||||||
|
else
|
||||||
|
COVERAGE_PERCENT=0
|
||||||
|
fi
|
||||||
|
|
||||||
|
{
|
||||||
|
echo ""
|
||||||
|
echo "### Test Files"
|
||||||
|
} >> coverage_report.md
|
||||||
|
echo "$TEST_OUTPUT" | grep -E "^\s+[a-z_]+:" | sed 's/^/- /' >> coverage_report.md
|
||||||
|
|
||||||
|
cat coverage_report.md
|
||||||
|
|
||||||
|
# Set outputs
|
||||||
|
{
|
||||||
|
echo "total-tests=$TOTAL_TESTS"
|
||||||
|
echo "passing-tests=$PASSING_TESTS"
|
||||||
|
echo "coverage-percent=$COVERAGE_PERCENT"
|
||||||
|
} >> "$GITHUB_OUTPUT"
|
||||||
|
|
||||||
|
# Validate test coverage requirements
|
||||||
|
if [ "$TOTAL_TESTS" -lt 55 ]; then
|
||||||
|
echo "❌ Expected at least 55 tests, found $TOTAL_TESTS"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$FAILING_TESTS" -gt 0 ]; then
|
||||||
|
echo "❌ Found $FAILING_TESTS failing tests"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "✅ Test coverage is acceptable: $PASSING_TESTS/$TOTAL_TESTS tests passing ($COVERAGE_PERCENT%)"
|
||||||
|
shell: bash
|
||||||
|
|||||||
Reference in New Issue
Block a user