Skip to content

Latest commit

 

History

History
149 lines (112 loc) · 4.63 KB

File metadata and controls

149 lines (112 loc) · 4.63 KB

Issue #113 Implementation: create_commitment Validation Tests

Summary

Added comprehensive validation tests for create_commitment function to ensure all invalid rule combinations are properly rejected.

Tests Added

Location

contracts/commitment_core/src/tests.rs (lines 153-330)

Test Cases (6 new tests)

1. test_create_commitment_duration_zero

  • Purpose: Verify create_commitment rejects duration_days = 0
  • Expected: Panic with "Invalid duration"
  • Test Value: 0 days
  • Status: ✅ PASSING

2. test_create_commitment_max_loss_over_100

  • Purpose: Verify create_commitment rejects max_loss_percent > 100
  • Expected: Panic with "Invalid percent"
  • Test Value: 101%
  • Status: ✅ PASSING

3. test_create_commitment_amount_zero

  • Purpose: Verify create_commitment rejects amount = 0
  • Expected: Panic with "Invalid amount"
  • Test Value: 0
  • Status: ✅ PASSING

4. test_create_commitment_amount_negative

  • Purpose: Verify create_commitment rejects negative amounts
  • Expected: Panic with "Invalid amount"
  • Test Value: -100
  • Status: ✅ PASSING

5. test_create_commitment_invalid_type

  • Purpose: Verify create_commitment rejects invalid commitment_type
  • Expected: Panic with "Invalid commitment type"
  • Test Value: "invalid"
  • Valid Types: "safe", "balanced", "aggressive"
  • Status: ✅ PASSING

6. test_create_commitment_valid_rules

  • 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

Validation Logic (Already Implemented)

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);

Error Codes

  • InvalidDuration: Duration must be greater than zero
  • InvalidMaxLossPercent: Max loss must be 0-100
  • InvalidCommitmentType: Invalid commitment type
  • InvalidAmount: Amount must be greater than zero

Acceptance Criteria Status

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.

Test Results

$ 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

Full Test Suite

$ cargo test --package commitment_core

test result: ok. 48 passed; 0 failed

Files Modified

  1. contracts/commitment_core/src/tests.rs (+177 lines)
    • Added 6 comprehensive validation tests

Implementation Notes

  • 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

Related Issues

  • Issue #103: NFT mint validation tests (similar validation patterns)
  • Issue #85: Overflow handling for u32::MAX duration

Running Tests

# 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