1
0
mirror of https://github.com/pnpm/action-setup.git synced 2026-03-04 08:01:02 +08:00
action-setup/.claude/commands/quick-test.md
Justin Linn 71944f404a
chore: add GitHub config alignment (G01, G02, G03) (#2)
* chore: add alignment standards for github config

- Add .nvmrc file with Node.js 22
- Add PR template for consistent pull requests
- Add issue templates for bug reports, feature requests, and tasks
- Add standard labels via gh CLI (type, priority, status, area labels)

* fix: resolve form-data security vulnerability

Add pnpm override to force form-data>=4.0.4 which fixes
GHSA-fjxv-7rqg-78g4 (unsafe random function for boundary).

* chore: add .claude/settings.local.json to gitignore

* feat: Add claude commands

* fix: update pnpm version to 10.27.0 (valid release)

* fix: update pnpm version from 9 to 10 in all workflows

Update all workflow files to use pnpm version 10 to match
the packageManager field in package.json (pnpm@10.27.0).

This fixes the CI failure caused by version mismatch:
- pr-check.yml: version 9 → 10, matrix 9.15.5 → 10.27.0
- build-and-test.yml: version 9 → 10
- security.yml: version 9 → 10
- test.yaml: all version references updated to 10.27.0

* fix: remove packageManager field to allow testing multiple pnpm versions

The action tests multiple pnpm versions (9.x and 10.x). Having a
packageManager field in package.json causes version mismatch errors
when the workflow specifies a different version than packageManager.

* fix: use exact pnpm version 10.27.0 in workflows

The action validates that the version specified in workflows must
match the packageManager field in package.json exactly. Update
from version: 10 to version: 10.27.0 to match pnpm@10.27.0.

* fix: use local action in ci.yml with explicit version

Since packageManager was removed from package.json to allow testing
multiple pnpm versions, ci.yml must now specify the version explicitly.

Changed from using released @v4.0.0 to using ./ (local action) to test
the current code.

* fix: rename claude commands to use Windows-compatible filenames

Windows doesn't allow colons in filenames. Changed from using colons
(agents:action.md) to hyphens (agents-action.md) for cross-platform
compatibility.
2026-01-03 20:22:20 -05:00

410 lines
6.4 KiB
Markdown

# Quick: Test
Run the test suite for the GitHub Action.
## What This Does
Executes all tests to verify the action works correctly.
## Test Execution
### Run All Tests
```bash
pnpm test
```
Runs:
- All unit tests
- All integration tests
- Reports results and coverage
### Run Specific Tests
```bash
# Single test file
pnpm test -- inputs.test.ts
# Pattern matching
pnpm test -- --testNamePattern="install"
# Watch mode
pnpm test -- --watch
```
### Coverage Report
```bash
pnpm test -- --coverage
```
Generates:
- Coverage summary
- Detailed report
- HTML coverage report (if configured)
## Usage
Just ask:
- "Run tests"
- "Test the action"
- "Check test coverage"
## Output Format
```
=== Test Results ===
PASS src/__tests__/inputs.test.ts
✓ should parse version input (5ms)
✓ should expand tilde in paths (3ms)
✓ should validate run_install YAML (12ms)
PASS src/__tests__/install-pnpm.test.ts
✓ should install specified version (45ms)
✓ should handle standalone mode (38ms)
Test Suites: 2 passed, 2 total
Tests: 5 passed, 5 total
Time: 2.5s
Coverage: 85% statements, 80% branches
```
## Test Organization
Current test structure:
```
src/
__tests__/
inputs.test.ts # Input parsing tests
outputs.test.ts # Output setting tests
install-pnpm.test.ts # Installation tests
pnpm-install.test.ts # pnpm install tests
utils.test.ts # Utility function tests
__mocks__/
@actions/
core.ts # Mock @actions/core APIs
```
## Coverage Goals
Target coverage:
- Statements: >80%
- Branches: >75%
- Functions: >80%
- Lines: >80%
## Test Types
### Unit Tests
Test individual functions in isolation:
```typescript
describe('getInputs', () => {
it('should parse version input', () => {
// Test implementation
})
})
```
### Integration Tests
Test feature workflows:
```typescript
describe('installPnpm', () => {
it('should install and configure pnpm', async () => {
// Test full installation flow
})
})
```
### Mock Tests
Test with mocked dependencies:
```typescript
jest.mock('@actions/core')
it('should call setFailed on error', async () => {
// Test error handling
})
```
## Common Test Scenarios
### Input Validation
```typescript
it('should accept valid version formats', () => {
expect(() => validateVersion('8')).not.toThrow()
expect(() => validateVersion('8.15.0')).not.toThrow()
})
it('should reject invalid versions', () => {
expect(() => validateVersion('invalid')).toThrow()
})
```
### Error Handling
```typescript
it('should fail gracefully on missing input', async () => {
const mockSetFailed = core.setFailed as jest.Mock
await expect(main()).rejects.toThrow()
expect(mockSetFailed).toHaveBeenCalled()
})
```
### Output Setting
```typescript
it('should set all outputs', () => {
const mockSetOutput = core.setOutput as jest.Mock
setOutputs(inputs)
expect(mockSetOutput).toHaveBeenCalledWith('dest', expect.any(String))
})
```
## Debugging Tests
### Run with Debug Output
```bash
# Enable debug logging
DEBUG=* pnpm test
# Node debug output
NODE_OPTIONS='--inspect' pnpm test
```
### Focus on Single Test
```typescript
// Use .only to run single test
it.only('should test specific case', () => {
// This test will run alone
})
```
### Skip Tests
```typescript
// Use .skip to skip a test
it.skip('not ready yet', () => {
// This test will be skipped
})
```
## Test Failures
### When Tests Fail
1. **Read error message**
```
Expected: "8.15.0"
Received: undefined
```
2. **Check test code**
- Is the test correct?
- Is the expectation valid?
3. **Check implementation**
- Does the code match expectation?
- Are there edge cases?
4. **Debug**
- Add console.log
- Use debugger
- Check mock setup
### Common Issues
**Mock not working:**
```typescript
// Ensure mock is before import
jest.mock('@actions/core')
import { getInputs } from '../inputs'
```
**Async issues:**
```typescript
// Ensure async tests use await
it('should work', async () => {
await asyncFunction() // Don't forget await
})
```
**State pollution:**
```typescript
// Clear mocks between tests
beforeEach(() => {
jest.clearAllMocks()
})
```
## Test Coverage
### View Coverage
```bash
# Generate coverage report
pnpm test -- --coverage
# Open HTML report (if generated)
open coverage/lcov-report/index.html
```
### Improve Coverage
1. **Identify gaps**
- Check uncovered lines in report
- Focus on critical paths
2. **Add tests**
- Test uncovered branches
- Test error cases
- Test edge cases
3. **Verify improvement**
```bash
pnpm test -- --coverage
```
## CI Integration
Tests run automatically in CI:
```yaml
# .github/workflows/test.yml
- name: Run tests
run: pnpm test
- name: Check coverage
run: pnpm test -- --coverage
```
## Test Best Practices
### Good Test
```typescript
describe('specific feature', () => {
it('should have expected behavior', () => {
// Arrange
const input = createTestData()
// Act
const result = processInput(input)
// Assert
expect(result).toBe(expected)
})
})
```
### Test Naming
- Describe the behavior, not implementation
- Use "should" for expectations
- Be specific and clear
```typescript
// Good
it('should install pnpm when version is specified')
// Less clear
it('installs pnpm')
```
## Performance
### Slow Tests
If tests are slow:
```bash
# Identify slow tests
pnpm test -- --verbose
# Run tests in parallel (default)
pnpm test -- --maxWorkers=4
```
### Optimize Tests
- Mock external calls
- Use test fixtures
- Avoid unnecessary setup
- Clean up resources
## Integration with Other Commands
### Before Testing
Build the action:
```bash
quick:build
```
Fix code issues:
```bash
quick:fix
```
### After Testing
Run quality checks:
```bash
quick:check
```
## Implementation
This command executes:
```bash
#!/bin/bash
set -e
echo "=== Running Tests ==="
echo ""
# Run tests with coverage
pnpm test -- --coverage
echo ""
echo "Test run complete!"
echo ""
echo "To run specific tests:"
echo " pnpm test -- <test-file>"
echo ""
echo "To see coverage details:"
echo " open coverage/index.html"
```
## Quick Reference
```bash
# Run all tests
pnpm test
# Run with coverage
pnpm test -- --coverage
# Run specific file
pnpm test -- inputs.test.ts
# Watch mode
pnpm test -- --watch
# Debug mode
pnpm test -- --verbose
# Update snapshots
pnpm test -- --updateSnapshot
```