#[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(), 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,
};
let request = SendTransactionRequest {
transaction: "SGVsbG8gV29ybGQ=".to_string(),
config,
};
let result = validate_request(request);
assert!(result.is_err());
if let Err(ValidationError::InvalidFormat(msg)) = result {
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,
};
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 {
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), 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());
if let Err(e) = result {
let err_msg = e.to_string();
assert!(
err_msg.contains("config.max_retries") && err_msg.contains("Max retries must be between 0 and 100"),
"Expected error to contain 'config.max_retries' and 'Max retries must be between 0 and 100', but got: {}",
err_msg
);
}
}
}