Boucle test → diagnostic → correction
/test-and-fixCette commande suit une boucle **test → diagnostic → correction → retest** jusqu'à ce que tous les tests soient réussis ou qu'une intervention manuell
description: "Run tests and automatically fix common issues"
You are running tests and fixing any issues found. This command iteratively tests, diagnoses problems, fixes them, and retests.
Related Skills
- testing.md - Testing strategy details
- security.md - Security fix patterns
Overview
This command follows a test → diagnose → fix → retest loop until all tests pass or manual intervention is needed.
Step 1: Initial Test Run
echo "🧪 Running initial tests..."
# Determine project type and run appropriate tests
if [ -f "Anchor.toml" ]; then
# Anchor project
anchor build && anchor test --skip-deploy
TEST_STATUS=$?
elif grep -q "solana-program" Cargo.toml 2>/dev/null; then
# Native Solana program
cargo build-sbf && cargo test
TEST_STATUS=$?
else
# Standard Rust or backend
cargo test
TEST_STATUS=$?
fi
if [ $TEST_STATUS -eq 0 ]; then
echo "✅ All tests passed!"
exit 0
fi
echo "❌ Tests failed. Starting diagnosis..."Step 2: Diagnose Issues
Analyze the test output to categorize failures:
Common Issue Categories
- Format Issues
- Code not formatted
- Inconsistent style
- Clippy Warnings
- Lints not satisfied
- Potential bugs
- Compilation Errors
- Syntax errors
- Type mismatches
- Missing imports
- Test Failures
- Failed assertions
- Logic errors
- Account validation failures (Solana)
- Runtime Errors
- Panics
- Arithmetic overflow
- Account errors (Solana)
Step 3: Automatic Fixes
Fix Format Issues
# Always start with formatting
echo "📝 Fixing format issues..."
cargo fmt
# For TypeScript tests
if [ -d "tests" ] && ls tests/*.ts >/dev/null 2>&1; then
npx prettier --write "tests/**/*.ts"
fi
echo "✅ Format fixed"Fix Clippy Warnings (Auto-fixable)
echo "🔧 Fixing clippy warnings..."
# Apply automatic clippy fixes
cargo clippy --fix --allow-dirty --allow-staged
# Note: Not all clippy warnings are auto-fixable
# Manual fixes may be needed for:
# - Logic issues
# - Unsafe code
# - Complex refactorings
echo "✅ Clippy auto-fixes applied"Fix Common Solana Issues
#### Missing Account in Anchor Test
# If test fails with "Missing account: system_program"
# Add to test accounts:
# systemProgram: anchor.web3.SystemProgram.programId,#### Account Not Mutable
# If error: "Account not mutable"
# Update account definition to include 'mut':
# #[account(mut)]#### Insufficient Compute Units
# If error: "Exceeded CU limit"
# Add compute budget instruction in test:
# .preInstructions([
# ComputeBudgetProgram.setComputeUnitLimit({ units: 400000 })
# ])Step 4: Rerun Tests
echo "🔄 Retesting after fixes..."
# Run tests again
if [ -f "Anchor.toml" ]; then
anchor test --skip-deploy
TEST_STATUS=$?
elif grep -q "solana-program" Cargo.toml 2>/dev/null; then
cargo test
TEST_STATUS=$?
else
cargo test
TEST_STATUS=$?
fi
if [ $TEST_STATUS -eq 0 ]; then
echo "✅ All tests now pass!"
exit 0
fiStep 5: Manual Fix Guidance
If automatic fixes didn't resolve all issues, provide guidance:
echo "⚠️ Manual fixes needed. Analyzing failures..."
# Parse test output for specific errors
# This is where AI assistance helps diagnose complex issuesSolana-Specific Manual Fixes
#### Account Validation Failures
// Error: "A has_one constraint was violated"
// Fix: Ensure account relationships match constraints
#[account(
mut,
has_one = authority @ ErrorCode::Unauthorized, // authority must match
)]
pub vault: Account<'info, Vault>,#### PDA Derivation Mismatch
// Error: "Invalid PDA seed"
// Fix: Verify seeds match between program and test
// Program:
seeds = [b"vault", authority.key().as_ref()]
// Test:
const [vaultPda] = PublicKey.findProgramAddressSync(
[Buffer.from("vault"), authority.publicKey.toBuffer()],
programId
);#### Arithmetic Overflow
// Error: "Arithmetic overflow"
// Fix: Use checked arithmetic
// Bad:
vault.balance = vault.balance + amount;
// Good:
vault.balance = vault
.balance
.checked_add(amount)
.ok_or(ErrorCode::Overflow)?;#### Missing Signer
// Error: "Missing required signature"
// Fix: Ensure account is marked as Signer
#[account(mut)]
pub authority: Signer<'info>, // Must be Signer, not SystemAccountBackend Service Manual Fixes
#### Async/Await Issues
// Error: "Cannot call blocking function in async context"
// Fix: Use async version or spawn_blocking
// Bad:
async fn handler() -> Result<String> {
std::fs::read_to_string("file.txt")? // Blocking!
}
// Good:
async fn handler() -> Result<String> {
tokio::fs::read_to_string("file.txt").await?
}#### Database Connection Issues
// Error: "Connection pool exhausted"
// Fix: Increase pool size or