Added comprehensive validation tests for create_commitment function to ensure all invalid rule combinations are properly rejected.
contracts/commitment_core/src/tests.rs (lines 153-330)
- Purpose: Verify create_commitment rejects duration_days = 0
- Expected: Panic with "Invalid duration"
- Test Value: 0 days
- Status: ✅ PASSING
- Purpose: Verify create_commitment rejects max_loss_percent > 100
- Expected: Panic with "Invalid percent"
- Test Value: 101%
- Status: ✅ PASSING
- Purpose: Verify create_commitment rejects amount = 0
- Expected: Panic with "Invalid amount"
- Test Value: 0
- Status: ✅ PASSING
- Purpose: Verify create_commitment rejects negative amounts
- Expected: Panic with "Invalid amount"
- Test Value: -100
- Status: ✅ PASSING
- Purpose: Verify create_commitment rejects invalid commitment_type
- Expected: Panic with "Invalid commitment type"
- Test Value: "invalid"
- Valid Types: "safe", "balanced", "aggressive"
- Status: ✅ PASSING
- Purpose: Verify create_commitment accepts all valid rules
- Expected: Success - validation passes
- Test Values:
- duration_days: 30
- max_loss_percent: 10
- commitment_type: "safe"
- amount: 1000
- Status: ✅ PASSING
The validation is performed in create_commitment() which calls validate_rules():
fn validate_rules(e: &Env, rules: &CommitmentRules) {
// Duration must be > 0
Validation::require_valid_duration(rules.duration_days);
// Max loss percent must be between 0 and 100
Validation::require_valid_percent(rules.max_loss_percent);
// Commitment type must be valid
let valid_types = ["safe", "balanced", "aggressive"];
Validation::require_valid_commitment_type(e, &rules.commitment_type, &valid_types);
}Amount validation:
// Validate amount > 0 using shared utilities
Validation::require_positive(amount);InvalidDuration: Duration must be greater than zeroInvalidMaxLossPercent: Max loss must be 0-100InvalidCommitmentType: Invalid commitment typeInvalidAmount: Amount must be greater than zero
✅ All criteria met:
- duration_days = 0 → error
- max_loss_percent > 100 → error
- amount <= 0 → error
- invalid commitment_type → error
- All valid rules + sufficient balance → success (validation passes)
Note: early_exit_penalty validation is not enforced in the current implementation. The field exists in CommitmentRules but there's no validation that it must be <= 100. This could be added if needed.
$ cargo test --package commitment_core -- test_create_commitment
running 8 tests
test tests::test_create_commitment_invalid_type - should panic ... ok
test tests::test_create_commitment_event ... ok
test tests::test_create_commitment_valid ... ok
test tests::test_create_commitment_amount_zero - should panic ... ok
test tests::test_create_commitment_max_loss_over_100 - should panic ... ok
test tests::test_create_commitment_duration_zero - should panic ... ok
test tests::test_create_commitment_valid_rules ... ok
test tests::test_create_commitment_amount_negative - should panic ... ok
test result: ok. 8 passed; 0 failed$ cargo test --package commitment_core
test result: ok. 48 passed; 0 failedcontracts/commitment_core/src/tests.rs(+177 lines)- Added 6 comprehensive validation tests
- Tests use
e.mock_all_auths()to bypass authentication checks - Tests verify validation happens before external calls (NFT minting, token transfers)
- All tests follow existing patterns and conventions
- Minimal implementation - only essential test code
- Issue #103: NFT mint validation tests (similar validation patterns)
- Issue #85: Overflow handling for u32::MAX duration
# Run all new validation tests
cargo test --package commitment_core -- test_create_commitment
# Run specific test
cargo test --package commitment_core test_create_commitment_duration_zero
# Run all commitment_core tests
cargo test --package commitment_core