diff --git a/tests/harness/src/output/parameter.rs b/tests/harness/src/output/parameter.rs index 87c143218..d01e2b634 100644 --- a/tests/harness/src/output/parameter.rs +++ b/tests/harness/src/output/parameter.rs @@ -29,16 +29,28 @@ impl ParamList { } } -#[derive(Clone, Debug, Deserialize)] +#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Ord, PartialOrd)] #[serde(rename_all = "PascalCase")] pub struct Param { pub name: String, pub value: String, - pub raw: String, + pub raw: Option, + #[serde(rename = "Modified At")] + pub modified_at: Option, + #[serde(rename = "Created At")] + pub created_at: Option, } pub trait ParseParamListExt { fn parse_param_list(&self) -> ParamList; + fn get_param(&self, name: &str) -> Option { + let mut params = self.parse_param_list(); + let (index, _) = params + .iter() + .enumerate() + .find(|(_, param)| param.name == name)?; + Some(params.swap_remove(index)) + } } impl ParseParamListExt for assert_cmd::assert::Assert { diff --git a/tests/test_parameters.rs b/tests/test_parameters.rs index 4767cdac1..de50eac1c 100644 --- a/tests/test_parameters.rs +++ b/tests/test_parameters.rs @@ -1,5 +1,5 @@ use cloudtruth_config::{CT_ENVIRONMENT, CT_PROJECT}; -use cloudtruth_test_harness::prelude::*; +use cloudtruth_test_harness::{output::parameter::ParseParamListExt, prelude::*}; use indoc::{formatdoc, indoc}; use maplit::hashmap; @@ -1090,3 +1090,157 @@ fn test_parameters_pagination() { .success() .paginated(PAGE_SIZE); } + +#[test] +#[use_harness] +fn test_parameters_as_of_tag() { + let proj = Project::with_prefix("param-tags").create(); + let env = Environment::with_prefix("param-tags").create(); + let mut envs = hashmap! { + CT_PROJECT => proj.name().as_str(), + CT_ENVIRONMENT => env.name().as_str() + }; + cloudtruth!("param set param1 --value original") + .envs(&envs) + .assert() + .success(); + let param1 = cloudtruth!("param list --show-times -f json") + .envs(&envs) + .assert() + .success() + .get_param("param1") + .unwrap(); + cloudtruth!("param set param1 --value updated") + .envs(&envs) + .assert() + .success(); + let param2 = cloudtruth!("param list --show-times -f json") + .envs(&envs) + .assert() + .success() + .get_param("param1") + .unwrap(); + cloudtruth!("env tag set {env} my-tag --desc 'quick tag'") + .envs(&envs) + .assert() + .success(); + cloudtruth!("param set param1 --value final") + .envs(&envs) + .assert() + .success(); + let result = cloudtruth!("param list --show-times -f json --as-of my-tag") + .envs(&envs) + .assert() + .success() + .get_param("param1") + .unwrap(); + assert_eq!(result, param2); + let modified_at = param1.modified_at.as_deref().unwrap(); + let result = cloudtruth!("param list --show-times -f json --as-of '{modified_at}'") + .envs(&envs) + .assert() + .success() + .get_param("param1") + .unwrap(); + assert_eq!(result, param1); + cloudtruth!("env tag set {env} my-tag --time '2021-01-20'") + .envs(&envs) + .assert() + .success(); + cloudtruth!("param ls -v --as-of my-tag") + .envs(&envs) + .assert() + .failure() + .stderr(contains("No ProjectLedger matches the given query")); + cloudtruth!("param diff --as-of my-tag") + .envs(&envs) + .assert() + .failure() + .stderr(contains("No ProjectLedger matches the given query")); + cloudtruth!("param env param1 --as-of my-tag") + .envs(&envs) + .assert() + .failure() + .stderr(contains("No ProjectLedger matches the given query")); + cloudtruth!("param export docker --as-of my-tag") + .envs(&envs) + .assert() + .failure() + .stderr(contains("No ProjectLedger matches the given query")); + cloudtruth!("param get param1 --as-of my-tag") + .envs(&envs) + .assert() + .failure() + .stderr(contains("No ProjectLedger matches the given query")); + cloudtruth!("param ls -v --as-of no-such-tag") + .envs(&envs) + .assert() + .failure() + .stderr(contains!( + "Tag `no-such-tag` could not be found in environment `{env}`" + )); + cloudtruth!("param diff --as-of no-such-tag") + .envs(&envs) + .assert() + .failure() + .stderr(contains!( + "Tag `no-such-tag` could not be found in environment `{env}`" + )); + cloudtruth!("param env param1 --as-of no-such-tag") + .envs(&envs) + .assert() + .failure() + .stderr(contains!( + "Tag `no-such-tag` could not be found in environment `{env}`" + )); + cloudtruth!("param export docker --as-of no-such-tag") + .envs(&envs) + .assert() + .failure() + .stderr(contains!( + "Tag `no-such-tag` could not be found in environment `{env}`" + )); + cloudtruth!("param get param1 --as-of no-such-tag") + .envs(&envs) + .assert() + .failure() + .stderr(contains!( + "Tag `no-such-tag` could not be found in environment `{env}`" + )); + envs.insert(CT_ENVIRONMENT, "default"); + cloudtruth!("param ls -v --as-of my-tag") + .envs(&envs) + .assert() + .failure() + .stderr(contains( + "Tag `my-tag` could not be found in environment `default`", + )); + cloudtruth!("param diff --as-of my-tag") + .envs(&envs) + .assert() + .failure() + .stderr(contains( + "Tag `my-tag` could not be found in environment `default`", + )); + cloudtruth!("param env param1 --as-of my-tag") + .envs(&envs) + .assert() + .failure() + .stderr(contains( + "Tag `my-tag` could not be found in environment `default`", + )); + cloudtruth!("param export docker --as-of my-tag") + .envs(&envs) + .assert() + .failure() + .stderr(contains( + "Tag `my-tag` could not be found in environment `default`", + )); + cloudtruth!("param get param1 --as-of my-tag") + .envs(&envs) + .assert() + .failure() + .stderr(contains( + "Tag `my-tag` could not be found in environment `default`", + )); +} diff --git a/tests/test_templates.rs b/tests/test_templates.rs index f67442890..2e566bc7c 100644 --- a/tests/test_templates.rs +++ b/tests/test_templates.rs @@ -1037,7 +1037,10 @@ fn test_templates_ref_by_param() { .expect("Could not find parameter 'my_parameter'"); assert_eq!(¶m.name, "my_parameter"); assert_eq!(¶m.value, "nothing to evaluate here"); - assert_eq!(param.raw, format!("{{{{ cloudtruth.templates.{temp} }}}}")); + assert_eq!( + param.raw, + Some(format!("{{{{ cloudtruth.templates.{temp} }}}}")) + ); cloudtruth!("template del -y {temp}") .envs(&vars) @@ -1083,7 +1086,10 @@ fn test_templates_ref_by_param() { .find_by_name("param1") .expect("Could not find parameter 'param1'"); assert_eq!("new-param-name = sample value", param.value); - assert_eq!(format!("{{{{ cloudtruth.templates.{temp} }}}}"), param.raw); + assert_eq!( + Some(format!("{{{{ cloudtruth.templates.{temp} }}}}")), + param.raw + ); } #[test]