refactor: major codebase improvements and test framework overhaul

This commit represents a comprehensive refactoring of the codebase focused on
improving code quality, testability, and maintainability.

Key improvements:
- Implement dependency injection and interface-based architecture
- Add comprehensive test framework with fixtures and test suites
- Fix all linting issues (errcheck, gosec, staticcheck, goconst, etc.)
- Achieve full EditorConfig compliance across all files
- Replace hardcoded test data with proper fixture files
- Add configuration loader with hierarchical config support
- Improve error handling with contextual information
- Add progress indicators for better user feedback
- Enhance Makefile with help system and improved editorconfig commands
- Consolidate constants and remove deprecated code
- Strengthen validation logic for GitHub Actions
- Add focused consumer interfaces for better separation of concerns

Testing improvements:
- Add comprehensive integration tests
- Implement test executor pattern for better test organization
- Create extensive YAML fixture library for testing
- Fix all failing tests and improve test coverage
- Add validation test fixtures to avoid embedded YAML in Go files

Build and tooling:
- Update Makefile to show help by default
- Fix editorconfig commands to use eclint properly
- Add comprehensive help documentation to all make targets
- Improve file selection patterns to avoid glob errors

This refactoring maintains backward compatibility while significantly
improving the internal architecture and developer experience.
This commit is contained in:
2025-08-05 23:20:58 +03:00
parent f9823eef3e
commit f94967713a
93 changed files with 8845 additions and 1224 deletions

View File

@@ -1,308 +0,0 @@
# Composite Example Action
<div align="center">
<img src="https://img.shields.io/badge/icon-package-blue" alt="package" />
<img src="https://img.shields.io/badge/status-stable-brightgreen" alt="Status" />
<img src="https://img.shields.io/badge/license-MIT-blue" alt="License" />
</div>
## Overview
Test Composite Action for gh-action-readme dependency analysis
This GitHub Action provides a robust solution for your CI/CD pipeline with comprehensive configuration options and detailed output information.
## Table of Contents
- [Quick Start](#quick-start)
- [Configuration](#configuration)
- [Input Parameters](#input-parameters)
- [Output Parameters](#output-parameters)
- [Examples](#examples)
- [Dependencies](#-dependencies)
- [Troubleshooting](#troubleshooting)
- [Contributing](#contributing)
- [License](#license)
## Quick Start
Add the following step to your GitHub Actions workflow:
```yaml
name: CI/CD Pipeline
on:
push:
branches: [ main, develop ]
pull_request:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v4
- name: Composite Example Action
uses: your-org/ @v1
with:
node-version: "20"
working-directory: "."
```
## Configuration
This action supports various configuration options to customize its behavior according to your needs.
### Input Parameters
| Parameter | Description | Type | Required | Default Value |
|-----------|-------------|------|----------|---------------|
| **`node-version`** | Node.js version to use | `string` | ❌ No | `20` |
| **`working-directory`** | Working directory | `string` | ❌ No | `.` |
#### Parameter Details
##### `node-version`
Node.js version to use
- **Type**: String
- **Required**: No
- **Default**: `20`
```yaml
with:
node-version: "20"
```
##### `working-directory`
Working directory
- **Type**: String
- **Required**: No
- **Default**: `.`
```yaml
with:
working-directory: "."
```
### Output Parameters
This action provides the following outputs that can be used in subsequent workflow steps:
| Parameter | Description | Usage |
|-----------|-------------|-------|
| **`build-result`** | Build result status | `\${{ steps. .outputs.build-result }}` |
#### Using Outputs
```yaml
- name: Composite Example Action
id: action-step
uses: your-org/ @v1
- name: Use Output
run: |
echo "build-result: \${{ steps.action-step.outputs.build-result }}"
```
## Examples
### Basic Usage
```yaml
- name: Basic Composite Example Action
uses: your-org/ @v1
with:
node-version: "20"
working-directory: "."
```
### Advanced Configuration
```yaml
- name: Advanced Composite Example Action
uses: your-org/ @v1
with:
node-version: "20"
working-directory: "."
env:
GITHUB_TOKEN: \${{ secrets.GITHUB_TOKEN }}
```
### Conditional Usage
```yaml
- name: Conditional Composite Example Action
if: github.event_name == 'push'
uses: your-org/ @v1
with:
node-version: "20"
working-directory: "."
```
## 📦 Dependencies
This action uses the following dependencies:
| Action | Version | Author | Description |
|--------|---------|--------|-------------|
| [Checkout repository](https://github.com/marketplace/actions/checkout) | v4 | [actions](https://github.com/actions) | |
| [Setup Node.js](https://github.com/marketplace/actions/setup-node) | v4 | [actions](https://github.com/actions) | |
| Install dependencies | 🔒 | [ivuorinen](https://github.com/ivuorinen) | Shell script execution |
| Run tests | 🔒 | [ivuorinen](https://github.com/ivuorinen) | Shell script execution |
| [Build project](https://github.com/marketplace/actions/setup-node) | v4 | [actions](https://github.com/actions) | |
<details>
<summary>📋 Dependency Details</summary>
### Checkout repository @ v4
- 📌 **Floating Version**: Using latest version (consider pinning for security)
- 👤 **Author**: [actions](https://github.com/actions)
- 🏪 **Marketplace**: [View on GitHub Marketplace](https://github.com/marketplace/actions/checkout)
- 📂 **Source**: [View Source](https://github.com/actions/checkout)
- **Configuration**:
```yaml
with:
fetch-depth: 0
token: ${{ github.token }}
```
### Setup Node.js @ v4
- 📌 **Floating Version**: Using latest version (consider pinning for security)
- 👤 **Author**: [actions](https://github.com/actions)
- 🏪 **Marketplace**: [View on GitHub Marketplace](https://github.com/marketplace/actions/setup-node)
- 📂 **Source**: [View Source](https://github.com/actions/setup-node)
- **Configuration**:
```yaml
with:
cache: npm
node-version: ${{ inputs.node-version }}
```
### Install dependencies
- 🔒 **Pinned Version**: Locked to specific version for security
- 👤 **Author**: [ivuorinen](https://github.com/ivuorinen)
- 📂 **Source**: [View Source](https://github.com/ivuorinen/gh-action-readme/blob/main/action.yml#L30)
### Run tests
- 🔒 **Pinned Version**: Locked to specific version for security
- 👤 **Author**: [ivuorinen](https://github.com/ivuorinen)
- 📂 **Source**: [View Source](https://github.com/ivuorinen/gh-action-readme/blob/main/action.yml#L40)
### Build project @ v4
- 📌 **Floating Version**: Using latest version (consider pinning for security)
- 👤 **Author**: [actions](https://github.com/actions)
- 🏪 **Marketplace**: [View on GitHub Marketplace](https://github.com/marketplace/actions/setup-node)
- 📂 **Source**: [View Source](https://github.com/actions/setup-node)
- **Configuration**:
```yaml
with:
node-version: ${{ inputs.node-version }}
```
### Same Repository Dependencies
- [Install dependencies](https://github.com/ivuorinen/gh-action-readme/blob/main/action.yml#L30) - Shell script execution
- [Run tests](https://github.com/ivuorinen/gh-action-readme/blob/main/action.yml#L40) - Shell script execution
</details>
## Troubleshooting
### Common Issues
1. **Authentication Errors**: Ensure you have set up the required secrets in your repository settings.
2. **Permission Issues**: Check that your GitHub token has the necessary permissions.
3. **Configuration Errors**: Validate your input parameters against the schema.
### Getting Help
- Check the [action.yml](./action.yml) for the complete specification
- Review the [examples](./examples/) directory for more use cases
- Open an issue if you encounter problems
## Contributing
We welcome contributions! Please see our [Contributing Guide](CONTRIBUTING.md) for details.
### Development Setup
1. Fork this repository
2. Create a feature branch
3. Make your changes
4. Add tests if applicable
5. Submit a pull request
## License
This project is licensed under the MIT License. See the [LICENSE](LICENSE) file for details.
## Support
If you find this action helpful, please consider:
- ⭐ Starring this repository
- 🐛 Reporting issues
- 💡 Suggesting improvements
- 🤝 Contributing code
---
<div align="center">
<sub>📚 Documentation generated with <a href="https://github.com/ivuorinen/gh-action-readme">gh-action-readme</a></sub>
</div>

View File

@@ -1,86 +0,0 @@
# Example Action
![check](https://img.shields.io/badge/icon-check-green) ![GitHub](https://img.shields.io/badge/GitHub%20Action- -blue) ![License](https://img.shields.io/badge/license-MIT-green)
> Test Action for gh-action-readme
## 🚀 Quick Start
```yaml
name: My Workflow
on: [push, pull_request]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Example Action
uses: ivuorinen/gh-action-readme/example-action@v1
with:
input1: "foo"
input2: "value"
```
## 📥 Inputs
| Parameter | Description | Required | Default |
|-----------|-------------|----------|---------|
| `input1` | First input | ✅ | `foo` |
| `input2` | Second input | ❌ | - |
## 📤 Outputs
| Parameter | Description |
|-----------|-------------|
| `result` | Result output |
## 💡 Examples
<details>
<summary>Basic Usage</summary>
```yaml
- name: Example Action
uses: ivuorinen/gh-action-readme/example-action@v1
with:
input1: "foo"
input2: "example-value"
```
</details>
<details>
<summary>Advanced Configuration</summary>
```yaml
- name: Example Action with custom settings
uses: ivuorinen/gh-action-readme/example-action@v1
with:
input1: "foo"
input2: "custom-value"
```
</details>
## 🔧 Development
See the [action.yml](./action.yml) for the complete action specification.
## 📄 License
This action is distributed under the MIT License. See [LICENSE](LICENSE) for more information.
## 🤝 Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
---
<div align="center">
<sub>🚀 Generated with <a href="https://github.com/ivuorinen/gh-action-readme">gh-action-readme</a></sub>
</div>

View File

@@ -0,0 +1,25 @@
name: 'Basic Composite Action'
description: 'A simple composite action with basic steps'
inputs:
working-directory:
description: 'Working directory for commands'
required: false
default: '.'
outputs:
status:
description: 'Overall status of the workflow'
value: ${{ steps.final.outputs.status }}
runs:
using: 'composite'
steps:
- name: Setup
run: echo "Setting up environment"
shell: bash
- name: Main task
run: echo "Running main task in ${{ inputs.working-directory }}"
shell: bash
working-directory: ${{ inputs.working-directory }}
- name: Final step
id: final
run: echo "status=success" >> $GITHUB_OUTPUT
shell: bash

View File

@@ -0,0 +1,93 @@
name: 'Complex Composite Workflow'
description: 'A complex composite action demonstrating advanced features'
inputs:
environment:
description: 'Target environment (dev, staging, prod)'
required: true
deploy:
description: 'Whether to deploy after build'
required: false
default: 'false'
slack-webhook:
description: 'Slack webhook URL for notifications'
required: false
outputs:
build-status:
description: 'Build status'
value: ${{ steps.build.outputs.status }}
deploy-url:
description: 'Deployment URL if deployed'
value: ${{ steps.deploy.outputs.url }}
artifact-url:
description: 'URL to build artifacts'
value: ${{ steps.upload.outputs.artifact-url }}
runs:
using: 'composite'
steps:
- name: Validate environment
run: |
if [[ ! "${{ inputs.environment }}" =~ ^(dev|staging|prod)$ ]]; then
echo "Invalid environment: ${{ inputs.environment }}"
exit 1
fi
shell: bash
- name: Setup build environment
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
- name: Install dependencies
run: npm ci
shell: bash
- name: Run linting
run: npm run lint
shell: bash
- name: Run tests
run: npm run test:coverage
shell: bash
- name: Build application
id: build
run: |
npm run build:${{ inputs.environment }}
echo "status=success" >> $GITHUB_OUTPUT
shell: bash
env:
NODE_ENV: ${{ inputs.environment }}
- name: Upload build artifacts
id: upload
uses: actions/upload-artifact@v4
with:
name: build-${{ inputs.environment }}-${{ github.sha }}
path: dist/
retention-days: 30
- name: Deploy to environment
id: deploy
if: inputs.deploy == 'true'
run: |
echo "Deploying to ${{ inputs.environment }}"
# Deployment logic would go here
echo "url=https://${{ inputs.environment }}.example.com" >> $GITHUB_OUTPUT
shell: bash
- name: Notify Slack on success
if: success() && inputs.slack-webhook != ''
run: |
curl -X POST -H 'Content-type: application/json' \
--data '{"text":"✅ Deployment to ${{ inputs.environment }} successful"}' \
${{ inputs.slack-webhook }}
shell: bash
- name: Notify Slack on failure
if: failure() && inputs.slack-webhook != ''
run: |
curl -X POST -H 'Content-type: application/json' \
--data '{"text":"❌ Deployment to ${{ inputs.environment }} failed"}' \
${{ inputs.slack-webhook }}
shell: bash

View File

@@ -0,0 +1,47 @@
name: 'Composite Action with Dependencies'
description: 'A composite action that uses external actions'
inputs:
node-version:
description: 'Node.js version to setup'
required: false
default: '18'
python-version:
description: 'Python version to setup'
required: false
default: '3.9'
outputs:
node-path:
description: 'Path to Node.js installation'
value: ${{ steps.setup-node.outputs.node-path }}
python-path:
description: 'Path to Python installation'
value: ${{ steps.setup-python.outputs.python-path }}
runs:
using: 'composite'
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup Node.js
id: setup-node
uses: actions/setup-node@v4
with:
node-version: ${{ inputs.node-version }}
cache: 'npm'
- name: Setup Python
id: setup-python
uses: actions/setup-python@v4
with:
python-version: ${{ inputs.python-version }}
cache: 'pip'
- name: Install dependencies
run: |
npm install
pip install -r requirements.txt
shell: bash
- name: Run tests
run: |
npm test
python -m pytest
shell: bash

View File

@@ -0,0 +1,22 @@
name: 'Basic Docker Action'
description: 'A simple Docker-based action'
inputs:
command:
description: 'Command to execute in the container'
required: true
args:
description: 'Arguments for the command'
required: false
default: ''
outputs:
result:
description: 'Result of the command execution'
runs:
using: 'docker'
image: 'Dockerfile'
args:
- ${{ inputs.command }}
- ${{ inputs.args }}
branding:
icon: 'package'
color: 'blue'

View File

@@ -0,0 +1,38 @@
name: 'Docker Action with Environment'
description: 'Docker action with environment variables and advanced configuration'
inputs:
dockerfile-path:
description: 'Path to the Dockerfile'
required: false
default: 'Dockerfile'
build-args:
description: 'Build arguments for Docker build'
required: false
registry-url:
description: 'Container registry URL'
required: false
username:
description: 'Registry username'
required: false
password:
description: 'Registry password'
required: false
outputs:
image-digest:
description: 'SHA digest of the built image'
image-url:
description: 'URL of the pushed image'
runs:
using: 'docker'
image: ${{ inputs.dockerfile-path }}
env:
REGISTRY_URL: ${{ inputs.registry-url }}
REGISTRY_USERNAME: ${{ inputs.username }}
REGISTRY_PASSWORD: ${{ inputs.password }}
BUILD_ARGS: ${{ inputs.build-args }}
args:
- '--build-args'
- ${{ inputs.build-args }}
branding:
icon: 'box'
color: 'orange'

View File

@@ -0,0 +1,9 @@
name: 'Action with Invalid Using'
description: 'Action with invalid runtime specification'
inputs:
test-input:
description: 'A test input'
required: true
runs:
using: 'invalid-runtime'
main: 'index.js'

View File

@@ -0,0 +1,12 @@
name: 'Malformed YAML Action'
description: 'Action with intentionally malformed YAML'
inputs:
test-input:
description: 'A test input'
# This creates invalid YAML due to incorrect indentation
invalid-structure
runs:
using: 'node20'
main: 'index.js'
# More invalid indentation
extra-field: value

View File

@@ -0,0 +1,8 @@
name: 'Action Missing Description'
inputs:
test-input:
description: 'A test input'
required: true
runs:
using: 'node20'
main: 'index.js'

View File

@@ -0,0 +1,9 @@
name: 'Action Missing Runs'
description: 'Action without required runs section'
inputs:
test-input:
description: 'A test input'
required: true
branding:
icon: 'alert-circle'
color: 'red'

View File

@@ -0,0 +1,23 @@
name: 'Node.js 16 Action'
description: 'JavaScript action running on Node.js 16'
inputs:
script-path:
description: 'Path to the script to execute'
required: true
args:
description: 'Arguments to pass to the script'
required: false
default: ''
outputs:
exit-code:
description: 'Exit code of the script'
stdout:
description: 'Standard output from the script'
runs:
using: 'node16'
main: 'dist/index.js'
pre: 'dist/setup.js'
post: 'dist/cleanup.js'
branding:
icon: 'terminal'
color: 'green'

View File

@@ -0,0 +1,19 @@
name: 'Simple JavaScript Action'
description: 'A simple JavaScript action for testing'
inputs:
message:
description: 'Message to display'
required: true
level:
description: 'Log level'
required: false
default: 'info'
outputs:
result:
description: 'The result of the action'
runs:
using: 'node20'
main: 'index.js'
branding:
icon: 'activity'
color: 'blue'

View File

@@ -0,0 +1,36 @@
name: 'Comprehensive JavaScript Action'
description: 'A JavaScript action with all possible fields for testing'
author: 'Test Author <test@example.com>'
inputs:
required-input:
description: 'A required input parameter'
required: true
optional-input:
description: 'An optional input parameter'
required: false
default: 'default-value'
boolean-input:
description: 'A boolean input parameter'
required: false
default: 'false'
number-input:
description: 'A numeric input parameter'
required: false
default: '42'
outputs:
success:
description: 'Whether the action succeeded'
message:
description: 'Output message from the action'
data:
description: 'JSON data output'
runs:
using: 'node20'
main: 'dist/index.js'
pre: 'dist/pre.js'
post: 'dist/post.js'
pre-if: 'always()'
post-if: 'always()'
branding:
icon: 'check-circle'
color: 'purple'

View File

@@ -0,0 +1,7 @@
theme: default
output_format: md
repo_overrides:
test-repo:
theme: github
output_format: html
verbose: true

View File

@@ -0,0 +1,24 @@
name: 'Composite Action'
description: 'A composite action with multiple steps'
inputs:
working-directory:
description: 'Working directory'
required: false
default: '.'
outputs:
result:
description: 'The result of all steps'
value: ${{ steps.final.outputs.result }}
runs:
using: 'composite'
steps:
- name: Setup
run: echo "Setting up..."
shell: bash
- name: Build
run: echo "Building..."
shell: bash
- name: Final step
id: final
run: echo "result=success" >> $GITHUB_OUTPUT
shell: bash

View File

@@ -0,0 +1,16 @@
name: '{{ .Name }}'
description: '{{ .Description }}'
inputs:
{{- range .Inputs }}
{{ .Name }}:
description: '{{ .Description }}'
required: {{ .Required }}
{{- end }}
runs:
using: 'composite'
steps:
{{- range .Steps }}
- name: '{{ .Name }}'
run: '{{ .Command }}'
shell: bash
{{- end }}

View File

@@ -0,0 +1,17 @@
theme: professional
output_format: html
output_dir: docs
verbose: true
quiet: false
github_token: 'ghp_test_token_1234567890'
analyze_dependencies: true
show_security_info: true
cache_duration: 3600
max_concurrent_requests: 10
repo_overrides:
'example/repo':
theme: github
output_format: md
'test/action':
theme: minimal
quiet: true

View File

@@ -0,0 +1,6 @@
theme: default
output_format: md
output_dir: .
verbose: false
quiet: false
github_token: ''

View File

@@ -0,0 +1,7 @@
theme: github
output_format: md
output_dir: docs
verbose: true
quiet: false
analyze_dependencies: true
show_security_info: true

View File

@@ -0,0 +1,15 @@
name: 'Docker Action'
description: 'A Docker-based GitHub Action'
inputs:
dockerfile:
description: 'Path to Dockerfile'
required: true
default: 'Dockerfile'
outputs:
image-id:
description: 'Built Docker image ID'
runs:
using: 'docker'
image: 'Dockerfile'
args:
- ${{ inputs.dockerfile }}

View File

@@ -0,0 +1,19 @@
name: '{{ .Name }}'
description: '{{ .Description }}'
inputs:
{{- range .Inputs }}
{{ .Name }}:
description: '{{ .Description }}'
required: {{ .Required }}
{{- if .Default }}
default: '{{ .Default }}'
{{- end }}
{{- end }}
outputs:
{{- range .Outputs }}
{{ .Name }}:
description: '{{ .Description }}'
{{- end }}
runs:
using: '{{ .Runtime }}'
main: '{{ .Main }}'

View File

@@ -0,0 +1,3 @@
theme: default
output_format: md
github_token: global-token

View File

@@ -0,0 +1,8 @@
name: 'Invalid Action'
# Missing description field makes this invalid
inputs:
test-input:
description: 'Test input'
required: true
runs:
using: 'invalid-runtime'

View File

@@ -0,0 +1,5 @@
name: 'Minimal Action'
description: 'Minimal test action'
runs:
using: 'node20'
main: 'index.js'

View File

@@ -0,0 +1,2 @@
theme: minimal
github_token: config-token

View File

@@ -0,0 +1,9 @@
name: 'My New Action'
description: 'A brand new GitHub Action'
inputs:
message:
description: 'Message to display'
required: true
runs:
using: 'node20'
main: 'index.js'

16
testdata/yaml-fixtures/package.json vendored Normal file
View File

@@ -0,0 +1,16 @@
{
"name": "test-action",
"version": "1.0.0",
"description": "Test action package",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"dependencies": {
"@actions/core": "^1.10.0",
"@actions/github": "^5.1.1"
},
"devDependencies": {
"@types/node": "^20.0.0"
}
}

View File

@@ -0,0 +1,8 @@
theme: professional
output_format: html
output_dir: docs
template: custom-template.tmpl
schema: custom-schema.json
verbose: true
quiet: false
github_token: test-token-from-config

View File

@@ -0,0 +1,7 @@
theme: github
output_format: md
output_dir: docs
verbose: true
quiet: false
analyze_dependencies: true
show_security_info: true

View File

@@ -0,0 +1,196 @@
scenarios:
# JavaScript Action Scenarios
- id: "simple-javascript"
name: "Simple JavaScript Action"
description: "Basic JavaScript action with minimal configuration"
action_type: "javascript"
fixture: "actions/javascript/simple.yml"
expect_valid: true
expect_error: false
tags: ["javascript", "basic", "valid", "node20"]
metadata:
node_version: "20"
has_branding: true
input_count: 2
output_count: 1
- id: "node16-javascript"
name: "Node.js 16 JavaScript Action"
description: "JavaScript action running on Node.js 16"
action_type: "javascript"
fixture: "actions/javascript/node16.yml"
expect_valid: true
expect_error: false
tags: ["javascript", "node16", "valid", "pre-post"]
metadata:
node_version: "16"
has_pre: true
has_post: true
- id: "comprehensive-javascript"
name: "Comprehensive JavaScript Action"
description: "JavaScript action with all possible fields"
action_type: "javascript"
fixture: "actions/javascript/with-all-fields.yml"
expect_valid: true
expect_error: false
tags: ["javascript", "comprehensive", "valid", "node20"]
metadata:
has_author: true
has_pre_post: true
input_count: 4
output_count: 3
# Composite Action Scenarios
- id: "basic-composite"
name: "Basic Composite Action"
description: "Simple composite action with basic shell steps"
action_type: "composite"
fixture: "actions/composite/basic.yml"
expect_valid: true
expect_error: false
tags: ["composite", "basic", "valid", "shell"]
metadata:
step_count: 3
has_outputs: true
- id: "composite-with-deps"
name: "Composite Action with Dependencies"
description: "Composite action using external GitHub actions"
action_type: "composite"
fixture: "actions/composite/with-dependencies.yml"
expect_valid: true
expect_error: false
tags: ["composite", "dependencies", "valid", "external-actions"]
metadata:
external_actions: ["actions/checkout@v4", "actions/setup-node@v4", "actions/setup-python@v4"]
step_count: 6
- id: "complex-composite"
name: "Complex Composite Workflow"
description: "Advanced composite action with conditional steps and notifications"
action_type: "composite"
fixture: "actions/composite/complex-workflow.yml"
expect_valid: true
expect_error: false
tags: ["composite", "complex", "valid", "conditional", "notifications"]
metadata:
step_count: 9
has_conditionals: true
has_env_vars: true
# Docker Action Scenarios
- id: "basic-docker"
name: "Basic Docker Action"
description: "Simple Docker-based action"
action_type: "docker"
fixture: "actions/docker/basic.yml"
expect_valid: true
expect_error: false
tags: ["docker", "basic", "valid", "dockerfile"]
metadata:
uses_dockerfile: true
has_args: true
- id: "docker-with-env"
name: "Docker Action with Environment"
description: "Docker action with environment variables and registry configuration"
action_type: "docker"
fixture: "actions/docker/with-environment.yml"
expect_valid: true
expect_error: false
tags: ["docker", "environment", "valid", "registry"]
metadata:
has_env_vars: true
has_registry_config: true
# Invalid Action Scenarios
- id: "missing-description"
name: "Invalid Action - Missing Description"
description: "Action missing required description field"
action_type: "invalid"
fixture: "actions/invalid/missing-description.yml"
expect_valid: false
expect_error: true
tags: ["invalid", "validation", "error", "missing-field"]
metadata:
missing_fields: ["description"]
- id: "invalid-using"
name: "Invalid Action - Invalid Runtime"
description: "Action with invalid runtime specification"
action_type: "invalid"
fixture: "actions/invalid/invalid-using.yml"
expect_valid: false
expect_error: true
tags: ["invalid", "validation", "error", "invalid-runtime"]
metadata:
invalid_runtime: "invalid-runtime"
- id: "malformed-yaml"
name: "Invalid Action - Malformed YAML"
description: "Action with malformed YAML syntax"
action_type: "invalid"
fixture: "actions/invalid/malformed-yaml.yml"
expect_valid: false
expect_error: true
tags: ["invalid", "yaml-error", "syntax-error"]
metadata:
yaml_error: true
- id: "missing-runs"
name: "Invalid Action - Missing Runs"
description: "Action missing required runs section"
action_type: "invalid"
fixture: "actions/invalid/missing-runs.yml"
expect_valid: false
expect_error: true
tags: ["invalid", "validation", "error", "missing-runs"]
metadata:
missing_fields: ["runs"]
# Legacy Fixture Mappings (for backward compatibility)
- id: "legacy-simple"
name: "Legacy Simple Action"
description: "Backward compatibility mapping for SimpleActionYML"
action_type: "javascript"
fixture: "simple-action.yml"
expect_valid: true
expect_error: false
tags: ["legacy", "javascript", "valid"]
- id: "legacy-composite"
name: "Legacy Composite Action"
description: "Backward compatibility mapping for CompositeActionYML"
action_type: "composite"
fixture: "composite-action.yml"
expect_valid: true
expect_error: false
tags: ["legacy", "composite", "valid"]
- id: "legacy-docker"
name: "Legacy Docker Action"
description: "Backward compatibility mapping for DockerActionYML"
action_type: "docker"
fixture: "docker-action.yml"
expect_valid: true
expect_error: false
tags: ["legacy", "docker", "valid"]
- id: "legacy-minimal"
name: "Legacy Minimal Action"
description: "Backward compatibility mapping for MinimalActionYML"
action_type: "minimal"
fixture: "minimal-action.yml"
expect_valid: true
expect_error: false
tags: ["legacy", "minimal", "valid"]
- id: "legacy-invalid"
name: "Legacy Invalid Action"
description: "Backward compatibility mapping for InvalidActionYML"
action_type: "invalid"
fixture: "invalid-action.yml"
expect_valid: false
expect_error: true
tags: ["legacy", "invalid", "error"]

View File

@@ -0,0 +1,13 @@
name: 'Simple Action'
description: 'A simple GitHub Action for testing'
inputs:
name:
description: 'Name to greet'
required: true
default: 'World'
outputs:
greeting:
description: 'The greeting message'
runs:
using: 'node20'
main: 'index.js'

View File

@@ -0,0 +1,11 @@
name: 'Test Composite Action'
description: 'Test action for update testing'
runs:
using: 'composite'
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Setup Node
uses: actions/setup-node@v3.8.0
with:
node-version: '18'

View File

@@ -0,0 +1,20 @@
name: 'Test Project Action'
description: 'A GitHub Action for testing project functionality'
inputs:
project-path:
description: 'Path to the project directory'
required: true
default: '.'
test-command:
description: 'Command to run tests'
required: false
default: 'npm test'
outputs:
test-results:
description: 'Test execution results'
runs:
using: 'node20'
main: 'dist/index.js'
branding:
icon: 'check-circle'
color: 'green'

View File

@@ -0,0 +1 @@
invalid: yaml: content:

View File

@@ -0,0 +1,3 @@
name: Test Action
runs:
using: node20

View File

@@ -0,0 +1,3 @@
description: A test action
runs:
using: node20

View File

@@ -0,0 +1,2 @@
name: Test Action
description: A test action

View File

@@ -0,0 +1,4 @@
name: Test Action
description: A test action
runs:
using: node20