tricorder 0.10.0

Automation, the KISS way, no YAML involved.
Documentation
use serde_json::json;
use tricorder::prelude::*;
use tricorder::tasks::exec;

use super::common::within_context;

#[test]
fn it_should_return_output() {
    within_context(|inventory| {
        let hosts = inventory
            .get_hosts_by_tags("test-success".to_string())
            .unwrap();
        let echo_task = exec::Task::new("echo '{host.id} says {host.vars.msg}'".to_string());
        let result = hosts.run_task_seq(&echo_task).unwrap();

        assert_eq!(
            result,
            json!([
              {
                "host": "localhost",
                "success": true,
                "info": {
                  "exit_code": 0 as i32,
                  "stdout": "localhost says hi\n",
                  "stderr": ""
                }
              }
            ])
        );
    });
}

#[test]
fn it_should_return_exit_code() {
    within_context(|inventory| {
        let hosts = inventory
            .get_hosts_by_tags("test-success".to_string())
            .unwrap();
        let fail_task =
            exec::Task::new("echo '{host.id} says {host.vars.msg}' >&2; exit 42".to_string());
        let result = hosts.run_task_seq(&fail_task).unwrap();

        assert_eq!(
            result,
            json!([
              {
                "host": "localhost",
                "success": true,
                "info": {
                  "exit_code": 42 as i32,
                  "stdout": "",
                  "stderr": "localhost says hi\n"
                }
              }
            ])
        );
    });
}

#[test]
fn it_should_return_an_error() {
    within_context(|inventory| {
        let hosts = inventory
            .get_hosts_by_tags("test-failure".to_string())
            .unwrap();
        let echo_task = exec::Task::new("echo '{host.id}' says {host.vars.msg}".to_string());
        let result = hosts.run_task_seq(&echo_task).unwrap();

        assert_eq!(
            result,
            json!([
              {
                "host": "localhost-fail",
                "success": false,
                "error": "failed to lookup address information: Name or service not known",
              }
            ])
        );
    });
}

#[test]
fn it_should_run_on_all_hosts_sequentially() {
    within_context(|inventory| {
        let echo_task = exec::Task::new("echo '{host.id}' says {host.vars.msg}".to_string());
        let result = inventory.hosts.run_task_seq(&echo_task).unwrap();

        assert_eq!(
            result,
            json!([
              {
                "host": "localhost",
                "success": true,
                "info": {
                  "exit_code": 0 as i32,
                  "stdout": "localhost says hi\n",
                  "stderr": ""
                }
              },
              {
                "host": "localhost-fail",
                "success": false,
                "error": "failed to lookup address information: Name or service not known",
              }
            ])
        );
    });
}

#[test]
fn it_should_run_on_all_hosts_concurrently() {
    within_context(|inventory| {
        let echo_task = exec::Task::new("echo '{host.id}' says {host.vars.msg}".to_string());
        let result = inventory.hosts.run_task_parallel(&echo_task).unwrap();

        assert_eq!(
            result,
            json!([
              {
                "host": "localhost",
                "success": true,
                "info": {
                  "exit_code": 0 as i32,
                  "stdout": "localhost says hi\n",
                  "stderr": ""
                }
              },
              {
                "host": "localhost-fail",
                "success": false,
                "error": "failed to lookup address information: Name or service not known",
              }
            ])
        );
    });
}

#[test]
fn it_should_fail_for_invalid_command_templates() {
    within_context(|inventory| {
        let echo_task = exec::Task::new("echo '{host.id' says {host.vars.msg}".to_string());
        let result = inventory.hosts.run_task_parallel(&echo_task);

        assert!(result.is_err());
    });
}