rialo-api-types 0.1.0

API types for Rialo RPC endpoints
Documentation
// Copyright (c) Subzero Labs, Inc.
// SPDX-License-Identifier: Apache-2.0

//! Integration tests for validation

#[cfg(test)]
mod tests {
    use crate::{
        messages::send_transaction::{SendTransactionConfig, TransactionEncoding},
        requests::SendTransactionRequest,
        validation::{validate_request, ValidationError},
    };

    #[test]
    fn test_send_transaction_validation_success() {
        let config = SendTransactionConfig {
            encoding: TransactionEncoding::Base64,
            max_retries: Some(5),
            min_context_slot: Some(0),
            skip_preflight: false,
            wait_for_execution: false,
        };

        let request = SendTransactionRequest {
            transaction: "AW4rODvnn8DmsAqUH84LX98BbODbnNcpf2VgXVuKNeUrAeSmxy/ZcujKbs1ybT3H7O7EXkPWk8ns9lO1k32/0Q0BAAED0EI5X7LNqp2bNrJ0Kw4zFlF1x/uT3Xj5M7HSfM8tCQhnSIr3kH0nrk89sCfRlFiofsu5HYNjqdLft/Msuu4lowAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgnYIx2+CjMxFW/ibtlA66A38hQS2cou1eq1HS9cKbdQBAgIAAQwCAAAAAAAAAAAAAAA=".to_string(),
            config,
        };

        let result = validate_request(request);
        assert!(result.is_ok());
    }

    #[test]
    fn test_send_transaction_validation_empty_transaction() {
        let config = SendTransactionConfig {
            encoding: TransactionEncoding::Base64,
            max_retries: Some(5),
            min_context_slot: Some(0),
            skip_preflight: false,
            wait_for_execution: false,
        };

        let request = SendTransactionRequest {
            transaction: "".to_string(), // Empty transaction should fail
            config,
        };

        let result = validate_request(request);
        assert!(result.is_err());

        match result {
            Err(ValidationError::InvalidFormat(msg)) => {
                assert!(msg.contains("Transaction cannot be empty"));
            }
            Err(other_error) => {
                panic!(
                    "Expected ValidationError::InvalidFormat, but got: {:?}",
                    other_error
                );
            }
            Ok(_) => {
                panic!("Expected error but got Ok");
            }
        }
    }

    #[test]
    fn test_send_transaction_validation_invalid_transaction_structure() {
        let config = SendTransactionConfig {
            encoding: TransactionEncoding::Base64,
            max_retries: Some(5),
            min_context_slot: Some(0),
            skip_preflight: false,
            wait_for_execution: false,
        };

        // Valid base64 but not a valid transaction structure ("Hello World" in base64)
        let request = SendTransactionRequest {
            transaction: "SGVsbG8gV29ybGQ=".to_string(),
            config,
        };

        let result = validate_request(request);
        assert!(result.is_err());

        if let Err(ValidationError::InvalidFormat(msg)) = result {
            // Should contain error about invalid transaction structure
            assert!(
                msg.contains("validation failed") || msg.contains("invalid_transaction_structure")
            );
        } else {
            panic!("Expected ValidationError::InvalidFormat for invalid transaction structure");
        }
    }

    #[test]
    fn test_send_transaction_validation_invalid_encoding() {
        let config = SendTransactionConfig {
            encoding: TransactionEncoding::Base64,
            max_retries: Some(5),
            min_context_slot: Some(0),
            skip_preflight: false,
            wait_for_execution: false,
        };

        // Invalid encoding (not base64 or base58)
        let request = SendTransactionRequest {
            transaction: "This is not base64 or base58!@#$".to_string(),
            config,
        };

        let result = validate_request(request);
        assert!(result.is_err());

        if let Err(ValidationError::InvalidFormat(msg)) = result {
            // Should contain error about invalid encoding
            assert!(
                msg.contains("validation failed") || msg.contains("invalid_transaction_encoding")
            );
        } else {
            panic!("Expected ValidationError::InvalidFormat for invalid encoding");
        }
    }

    #[test]
    fn test_send_transaction_validation_max_retries_out_of_range() {
        let config = SendTransactionConfig {
            encoding: TransactionEncoding::Base64,
            max_retries: Some(150), // Out of range (0-100)
            min_context_slot: Some(0),
            skip_preflight: false,
            wait_for_execution: false,
        };

        let request = SendTransactionRequest {
            transaction: "AW4rODvnn8DmsAqUH84LX98BbODbnNcpf2VgXVuKNeUrAeSmxy/ZcujKbs1ybT3H7O7EXkPWk8ns9lO1k32/0Q0BAAED0EI5X7LNqp2bNrJ0Kw4zFlF1x/uT3Xj5M7HSfM8tCQhnSIr3kH0nrk89sCfRlFiofsu5HYNjqdLft/Msuu4lowAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgnYIx2+CjMxFW/ibtlA66A38hQS2cou1eq1HS9cKbdQBAgIAAQwCAAAAAAAAAAAAAAA=".to_string(),
            config,
        };

        let result = validate_request(request);
        assert!(result.is_err());
    }
}