pub mod common;
use anyhow::{Context, Result};
use garden::string;
#[test]
fn read_includes() -> Result<()> {
let app_context =
garden::model::ApplicationContext::from_path_string("tests/data/garden.yaml")?;
let config = app_context.get_root_config();
let actual = garden::eval::value(&app_context, config, "${var_0}");
assert_eq!(actual, "zero");
let actual = garden::eval::value(&app_context, config, "${var_1}");
assert_eq!(actual, "ONE");
let actual = garden::eval::value(&app_context, config, "${var_2}");
assert_eq!(actual, "two");
assert!(config.trees.contains_key("tree-zero")); assert!(config.trees.contains_key("tree-echo-nested")); assert!(config.trees.contains_key("tree-echo-extended-tree-inner")); assert!(config.trees.contains_key("tree-echo-extended-tree")); assert!(config.trees.contains_key("example/tree")); assert!(config.trees.contains_key("example/link")); assert!(config.trees.contains_key("link")); assert!(config.trees.contains_key("current")); assert!(config.trees.contains_key("example/shallow")); assert!(config.trees.contains_key("example/single-branch")); assert!(config.trees.contains_key("tree1")); assert!(config.trees.contains_key("tree2")); assert!(config.trees.contains_key("tree-echo-extended"));
let actual = garden::eval::value(&app_context, config, "${var_included}");
assert_eq!(actual, "relative to config");
Ok(())
}
#[test]
fn template_includes() -> Result<()> {
let app_context =
garden::model::ApplicationContext::from_path_string("tests/data/garden.yaml")?;
let config_id = app_context.get_root_id();
let context = garden::query::find_tree(&app_context, config_id, "tree-echo", None)?;
let config = app_context.get_root_config();
let tree = config.trees.get(&context.tree).context("tree-echo")?;
let result = garden::eval::tree_value(
&app_context,
config,
None,
"${template-variable}",
&context.tree,
None,
);
assert_eq!(result, "template");
let constant = garden::eval::tree_value(
&app_context,
config,
None,
"${template-constant}",
&context.tree,
None,
);
assert_eq!(constant, "constant");
assert_eq!(1, tree.commands.len());
let echo_cmd_opt = tree.commands.get("echo");
assert!(echo_cmd_opt.is_some());
let echo_cmd = echo_cmd_opt.context("echo")?;
assert_eq!(1, echo_cmd.len());
assert_eq!(echo_cmd[0].get_expr(), "echo Hello, ${TREE_NAME}");
let context = garden::query::find_tree(&app_context, config_id, "tree-echo-extended", None)?;
let tree = config
.trees
.get(&context.tree)
.context("tree-echo-extended")?;
let result = garden::eval::tree_value(
&app_context,
config,
None,
"${template-variable}",
&context.tree,
None,
);
let constant = garden::eval::tree_value(
&app_context,
config,
None,
"${template-constant}",
&context.tree,
None,
);
assert_eq!(result, "extended");
assert_eq!(constant, "constant");
assert_eq!(tree.commands.len(), 1);
let echo_cmd_opt = tree.commands.get("echo");
assert!(echo_cmd_opt.is_some());
let echo_cmd = echo_cmd_opt.context("echo")?;
assert_eq!(1, echo_cmd.len());
assert_eq!(echo_cmd[0].get_expr(), "echo extended");
let context = garden::query::find_tree(&app_context, config_id, "tree-echo-nested", None)?;
let tree = &config
.trees
.get(&context.tree)
.context("tree-echo-nested")?;
let result = garden::eval::tree_value(
&app_context,
config,
None,
"${template-variable}",
&context.tree,
None,
);
let constant = garden::eval::tree_value(
&app_context,
config,
None,
"${template-constant}",
&context.tree,
None,
);
assert_eq!(constant, "constant");
assert_eq!(result, "nested");
let echo_cmd_opt = tree.commands.get("echo");
assert!(echo_cmd_opt.is_some());
let echo_cmd = echo_cmd_opt.context("echo")?;
assert_eq!(1, echo_cmd.len());
assert_eq!(echo_cmd[0].get_expr(), "echo Hello, ${TREE_NAME}");
let context = garden::query::find_tree(
&app_context,
config_id,
"tree-echo-extended-tree-inner",
None,
)?;
let result = garden::eval::tree_value(
&app_context,
config,
None,
"${template-variable}",
&context.tree,
None,
);
assert_eq!(result, "extended-tree");
let result = garden::eval::tree_value(
&app_context,
config,
None,
"${tree-variable}",
&context.tree,
None,
);
assert_eq!(result, "nested");
let result = garden::eval::tree_value(
&app_context,
config,
None,
"${tree-override}",
&context.tree,
None,
);
assert_eq!(result, "extended-tree");
let context =
garden::query::find_tree(&app_context, config_id, "tree-echo-extended-tree", None)?;
let result = garden::eval::tree_value(
&app_context,
config,
None,
"${template-variable}",
&context.tree,
None,
);
assert_eq!(result, "top-level");
let result = garden::eval::tree_value(
&app_context,
config,
None,
"${tree-override}",
&context.tree,
None,
);
assert_eq!(result, "top-level");
let result = garden::eval::tree_value(
&app_context,
config,
None,
"${tree-variable}",
&context.tree,
None,
);
assert_eq!(result, "nested");
let result = garden::eval::tree_value(
&app_context,
config,
None,
"${extended-variable}",
&context.tree,
None,
);
assert_eq!(result, "extended-tree");
let context = garden::query::find_tree(&app_context, config_id, "replacement-tree", None)?;
let result = garden::eval::tree_value(
&app_context,
config,
None,
"${tree-variable}",
&context.tree,
None,
);
assert_eq!(result, "");
let replacement_tree = config
.trees
.get(&context.tree)
.context("replacement-tree")?;
assert!(!replacement_tree.commands.contains_key("tree-command"));
assert_eq!(
"https://example.com/replacement/tree",
replacement_tree
.remotes
.get("origin")
.context("origin")?
.get_expr()
);
Ok(())
}
#[test]
fn command_overrides() -> Result<()> {
let string = string!(
r#"
garden:
includes: tests/data/includes/commands.yaml
"#
);
let app_context = common::garden_context_from_string(&string)?;
let config = app_context.get_root_config();
assert_eq!(config.commands.len(), 2);
assert!(config.commands.contains_key("echo"));
assert!(config.commands.contains_key("test"));
let echo_cmd = config.commands.get("echo").context("echo")?;
assert_eq!(1, echo_cmd.len());
assert_eq!(echo_cmd[0].get_expr(), "echo commands.yaml");
let string = string!(
r#"
garden:
includes:
- tests/data/includes/commands.yaml
- tests/data/includes/commands.yaml
"#
);
let app_context = common::garden_context_from_string(&string)?;
let config = app_context.get_root_config();
assert_eq!(config.commands.len(), 2);
let string = string!(
r#"
garden:
includes:
- tests/data/includes/commands.yaml
- tests/data/includes/commands-override.yaml
"#
);
let app_context = common::garden_context_from_string(&string)?;
let config = app_context.get_root_config();
assert_eq!(config.commands.len(), 2);
assert!(config.commands.contains_key("echo"));
assert!(config.commands.contains_key("test"));
let echo_cmd = config.commands.get("echo").context("echo")?;
assert_eq!(1, echo_cmd.len());
assert_eq!(echo_cmd[0].get_expr(), "echo commands-override.yaml");
let test_cmd = config.commands.get("test").context("test")?;
assert_eq!(1, test_cmd.len());
assert_eq!(test_cmd[0].get_expr(), "echo override test");
let string = string!(
r#"
garden:
includes:
- tests/data/includes/commands.yaml
- tests/data/includes/commands-override.yaml
commands:
echo: echo top-level override
"#
);
let app_context = common::garden_context_from_string(&string)?;
let config = app_context.get_root_config();
assert_eq!(config.commands.len(), 2);
assert!(config.commands.contains_key("echo"));
assert!(config.commands.contains_key("test"));
let echo_cmd = config.commands.get("echo").context("echo")?;
assert_eq!(1, echo_cmd.len());
assert_eq!(echo_cmd[0].get_expr(), "echo top-level override");
Ok(())
}