use crate::commands::{CommandOptions, ToggleShellCommand};
use async_trait::async_trait;
#[derive(Debug, Default)]
pub struct Command;
#[async_trait]
impl ToggleShellCommand for Command {
fn get_name(&self) -> &'static str {
"changes_command"
}
fn get_description(&self) -> &'static str {
"changes_description"
}
fn get_setting_str(&self) -> &'static str {
"changes_setting"
}
fn get_value(&self, options: &CommandOptions<'_>) -> bool {
options.configuration.results_changes
}
fn set_value(&self, options: &mut CommandOptions<'_>, value: bool) {
options.configuration.results_changes = value;
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::commands::LoopCondition;
use crate::commands::{CommandManager, CommandOptions, ShellCommand};
use crate::writers::Output;
use rsql_core::Configuration;
use rsql_drivers::MockConnection;
use rsql_formatters::FormatterManager;
use rustyline::history::DefaultHistory;
#[test]
fn test_name() {
let name = Command.name("en");
assert_eq!(name, "changes");
}
#[test]
fn test_args() {
let args = Command.args("en");
assert_eq!(args, "on|off");
}
#[test]
fn test_description() {
let description = Command.description("en");
assert_eq!(description, "Show number of rows changed");
}
async fn test_execute_no_args(changes: bool) -> anyhow::Result<()> {
let mut output = Output::default();
let configuration = &mut Configuration {
results_changes: changes,
..Default::default()
};
let options = CommandOptions {
configuration,
command_manager: &CommandManager::default(),
formatter_manager: &FormatterManager::default(),
connection: &mut MockConnection::new(),
history: &DefaultHistory::new(),
input: vec![".changes".to_string()],
output: &mut output,
};
let result = Command.execute(options).await?;
assert_eq!(result, LoopCondition::Continue);
let changes_output = output.to_string();
if changes {
assert_eq!(changes_output, "Changes: on\n");
} else {
assert_eq!(changes_output, "Changes: off\n");
}
Ok(())
}
#[tokio::test]
async fn test_execute_no_args_on() -> anyhow::Result<()> {
test_execute_no_args(true).await
}
#[tokio::test]
async fn test_execute_no_args_off() -> anyhow::Result<()> {
test_execute_no_args(false).await
}
#[tokio::test]
async fn test_execute_set_on() -> anyhow::Result<()> {
let configuration = &mut Configuration {
results_changes: false,
..Default::default()
};
let options = CommandOptions {
configuration,
command_manager: &CommandManager::default(),
formatter_manager: &FormatterManager::default(),
connection: &mut MockConnection::new(),
history: &DefaultHistory::new(),
input: vec![".changes".to_string(), "on".to_string()],
output: &mut Output::default(),
};
let result = Command.execute(options).await?;
assert_eq!(result, LoopCondition::Continue);
assert!(configuration.results_changes);
Ok(())
}
#[tokio::test]
async fn test_execute_set_off() -> anyhow::Result<()> {
let configuration = &mut Configuration {
results_changes: true,
..Default::default()
};
let options = CommandOptions {
configuration,
command_manager: &CommandManager::default(),
formatter_manager: &FormatterManager::default(),
connection: &mut MockConnection::new(),
history: &DefaultHistory::new(),
input: vec![".changes".to_string(), "off".to_string()],
output: &mut Output::default(),
};
let result = Command.execute(options).await?;
assert_eq!(result, LoopCondition::Continue);
assert!(!configuration.results_changes);
Ok(())
}
#[tokio::test]
async fn test_execute_invalid_option() {
let options = CommandOptions {
configuration: &mut Configuration::default(),
command_manager: &CommandManager::default(),
formatter_manager: &FormatterManager::default(),
connection: &mut MockConnection::new(),
history: &DefaultHistory::new(),
input: vec![".changes".to_string(), "foo".to_string()],
output: &mut Output::default(),
};
assert!(Command.execute(options).await.is_err());
}
}