From 3a07300e54493ab00b8161bf7a5512ea662a54ef Mon Sep 17 00:00:00 2001 From: HantingZhang2 <42933443+HantingZhang2@users.noreply.github.com> Date: Fri, 16 Feb 2024 18:39:24 +0100 Subject: [PATCH 1/9] first refac --- tests/scenarios/fixtures.rs | 73 ++++++++++++++++++++++++++----------- 1 file changed, 51 insertions(+), 22 deletions(-) diff --git a/tests/scenarios/fixtures.rs b/tests/scenarios/fixtures.rs index f063dbb4c..a1e586abc 100644 --- a/tests/scenarios/fixtures.rs +++ b/tests/scenarios/fixtures.rs @@ -589,6 +589,46 @@ fn template(string: String, fixtures: &Value) -> String { .expect("failed to apply template") } +fn process_param( + param: &Value, + undo_operation: &mut UndoOperation, + given_key: Option, + world: &DatadogWorld, +) { + let param_name = param.get("name").unwrap().as_str().unwrap().to_string(); + + if let Some(source) = param.get("source") { + if let Some(value) = lookup( + &source.as_str().unwrap().to_string(), + &world.response.object, + ) { + undo_operation.parameters.insert(param_name.clone(), value); + } + } + + if let Some(template_value) = param.get("template") { + if let Some(rendered) = template_value.as_str() { + let json_value = match given_key.clone() { + Some(key) => template(rendered.to_string(), &world.fixtures.get(&key).unwrap_or_else(|| &world.response.object)), + None => template(rendered.to_string(), &world.response.object), + }; + undo_operation.parameters.insert( + param_name.clone(), + serde_json::from_str(json_value.as_str()).unwrap(), + ); + } + } +} + +fn process_param_from_request( + param: &Value, + undo_operation: &mut UndoOperation, + given_key: Option, + world: &DatadogWorld, +) { + // Implementation of the function goes here +} + fn build_undo( world: &mut DatadogWorld, operation_id: &String, @@ -626,29 +666,18 @@ fn build_undo( }; let params = undo.get("parameters").unwrap().as_array().unwrap(); for param in params { - let param_name = param.get("name").unwrap().as_str().unwrap().to_string(); - if let Some(source) = param.get("source") { - if let Some(value) = lookup( - &source.as_str().unwrap().to_string(), - &world.response.object, - ) { - undo_operation.parameters.insert(param_name.clone(), value); + match param.get("origin") { + Some(origin) => { + if origin == "response" { + process_param(param, &mut undo_operation, given_key.clone(), world); + } else if origin == "request" { + process_param_from_request(param, &mut undo_operation, given_key.clone(), world); + } } - }; - if let Some(template_value) = param.get("template") { - if let Some(rendered) = template_value.as_str() { - let json_value = match given_key.clone() { - Some(key) => { - template(rendered.to_string(), &world.fixtures.get(key).unwrap()) - } - None => template(rendered.to_string(), &world.response.object), - }; - undo_operation.parameters.insert( - param_name.clone(), - serde_json::from_str(json_value.as_str()).unwrap(), - ); - }; - }; + None => { + process_param(param, &mut undo_operation, given_key.clone(), world); + } + } } Ok(Some(undo_operation)) } From 498a920dac66a9615537125ae4b5d88908b2ef94 Mon Sep 17 00:00:00 2001 From: HantingZhang2 <42933443+HantingZhang2@users.noreply.github.com> Date: Fri, 16 Feb 2024 18:55:17 +0100 Subject: [PATCH 2/9] finish the extract function --- tests/scenarios/fixtures.rs | 37 +++++++++++++++++++++++++++++++++---- 1 file changed, 33 insertions(+), 4 deletions(-) diff --git a/tests/scenarios/fixtures.rs b/tests/scenarios/fixtures.rs index a1e586abc..5b5ad8c66 100644 --- a/tests/scenarios/fixtures.rs +++ b/tests/scenarios/fixtures.rs @@ -589,7 +589,7 @@ fn template(string: String, fixtures: &Value) -> String { .expect("failed to apply template") } -fn process_param( +fn process_param_from_response( param: &Value, undo_operation: &mut UndoOperation, given_key: Option, @@ -626,7 +626,36 @@ fn process_param_from_request( given_key: Option, world: &DatadogWorld, ) { - // Implementation of the function goes here + let param_name = param.get("name").unwrap().as_str().unwrap().to_string(); + + if let Some(source) = param.get("source") { + if let Some(value) = lookup( + &source.as_str().unwrap().to_string(), + &serde_json::to_value(&world.parameters).unwrap(), + ) { + undo_operation.parameters.insert(param_name.clone(), value); + } + } + + if let Some(template_value) = param.get("template") { + if let Some(rendered) = template_value.as_str() { + let request_params_value: Value; + match serde_json::to_value(&world.parameters) { + Ok(value) => { + request_params_value = value; + }, + Err(e) => panic!("failed to convert request parameters to json: {}", e), + } + let json_value = match given_key.clone() { + Some(key) => template(rendered.to_string(), &world.fixtures.get(&key).unwrap_or_else(|| &request_params_value)), + None => template(rendered.to_string(), &serde_json::to_value(&world.parameters).unwrap()), + }; + undo_operation.parameters.insert( + param_name.clone(), + serde_json::from_str(json_value.as_str()).unwrap(), + ); + } + } } fn build_undo( @@ -669,13 +698,13 @@ fn build_undo( match param.get("origin") { Some(origin) => { if origin == "response" { - process_param(param, &mut undo_operation, given_key.clone(), world); + process_param_from_response(param, &mut undo_operation, given_key.clone(), world); } else if origin == "request" { process_param_from_request(param, &mut undo_operation, given_key.clone(), world); } } None => { - process_param(param, &mut undo_operation, given_key.clone(), world); + process_param_from_response(param, &mut undo_operation, given_key.clone(), world); } } } From 963fc22a86e44511c7bf553c85c9d96cdbbe67f1 Mon Sep 17 00:00:00 2001 From: HantingZhang2 <42933443+HantingZhang2@users.noreply.github.com> Date: Wed, 21 Feb 2024 16:13:55 +0100 Subject: [PATCH 3/9] Refactor --- tests/scenarios/fixtures.rs | 25 +++++++------------------ 1 file changed, 7 insertions(+), 18 deletions(-) diff --git a/tests/scenarios/fixtures.rs b/tests/scenarios/fixtures.rs index 5b5ad8c66..d8a19822e 100644 --- a/tests/scenarios/fixtures.rs +++ b/tests/scenarios/fixtures.rs @@ -17,12 +17,7 @@ use rvcr::{VCRMiddleware, VCRMode}; use serde_json::{json, Value}; use sha256::digest; use std::{ - collections::{HashMap, HashSet}, - env, - fs::{create_dir_all, read_to_string}, - ops::Add, - path::PathBuf, - str::FromStr, + collections::{HashMap, HashSet}, env, fs::{create_dir_all, read_to_string}, ops::Add, path::PathBuf, str::FromStr }; pub type TestCall = fn(&mut DatadogWorld, &HashMap); @@ -112,7 +107,7 @@ pub async fn before_scenario( // freeze_file // .write_all( // DateTime::to_rfc3339( - // &DateTime::from_timestamp(frozen_time as i64, 0) + // &DateTime::from_timestamp(frozen_time.num_milliseconds() as i64, 0) // .expect("failed to convert timestamp to datetime"), // ) // .as_bytes(), @@ -305,7 +300,7 @@ pub fn given_resource_in_system( } else if let Value::Object(ref mut map) = world.fixtures { map.insert(given_key.clone(), world.response.object.clone()); } - + world.parameters = given_parameters.clone(); match build_undo(world, &operation_id, Some(given_key)) { Ok(Some(undo)) => world.undo_operations.push(undo), Ok(None) => {} @@ -636,20 +631,14 @@ fn process_param_from_request( undo_operation.parameters.insert(param_name.clone(), value); } } - + let request_params_value = &serde_json::to_value(&world.parameters.get(¶m_name).unwrap_or(&serde_json::Value::Null)).unwrap(); if let Some(template_value) = param.get("template") { if let Some(rendered) = template_value.as_str() { - let request_params_value: Value; - match serde_json::to_value(&world.parameters) { - Ok(value) => { - request_params_value = value; - }, - Err(e) => panic!("failed to convert request parameters to json: {}", e), - } let json_value = match given_key.clone() { - Some(key) => template(rendered.to_string(), &world.fixtures.get(&key).unwrap_or_else(|| &request_params_value)), - None => template(rendered.to_string(), &serde_json::to_value(&world.parameters).unwrap()), + Some(key) => template(rendered.to_string(), &world.fixtures.get(&key).unwrap_or_else(|| request_params_value)), + None => template(rendered.to_string(), request_params_value), }; + println!("Json Value: {}", json_value.clone()); undo_operation.parameters.insert( param_name.clone(), serde_json::from_str(json_value.as_str()).unwrap(), From 157b692f0ce77b7a4e067f7362a915371bda0553 Mon Sep 17 00:00:00 2001 From: HantingZhang2 <42933443+HantingZhang2@users.noreply.github.com> Date: Thu, 22 Feb 2024 18:19:42 +0100 Subject: [PATCH 4/9] Change fixture --- tests/scenarios/fixtures.rs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/tests/scenarios/fixtures.rs b/tests/scenarios/fixtures.rs index d8a19822e..c309d9371 100644 --- a/tests/scenarios/fixtures.rs +++ b/tests/scenarios/fixtures.rs @@ -635,10 +635,15 @@ fn process_param_from_request( if let Some(template_value) = param.get("template") { if let Some(rendered) = template_value.as_str() { let json_value = match given_key.clone() { - Some(key) => template(rendered.to_string(), &world.fixtures.get(&key).unwrap_or_else(|| request_params_value)), + Some(key) => { + let fixture_value = match world.fixtures.get(&key){ + Some(value) if !value.as_object().unwrap().is_empty()=> value, + _ => request_params_value, + }; + template(rendered.to_string(), fixture_value) + }, None => template(rendered.to_string(), request_params_value), }; - println!("Json Value: {}", json_value.clone()); undo_operation.parameters.insert( param_name.clone(), serde_json::from_str(json_value.as_str()).unwrap(), From dbff421844520e60e711ab8c2907e6c1d4f98361 Mon Sep 17 00:00:00 2001 From: HantingZhang2 <42933443+HantingZhang2@users.noreply.github.com> Date: Thu, 22 Feb 2024 19:26:19 +0100 Subject: [PATCH 5/9] Refactor --- tests/scenarios/fixtures.rs | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/tests/scenarios/fixtures.rs b/tests/scenarios/fixtures.rs index 18aa46d61..28f8141bb 100644 --- a/tests/scenarios/fixtures.rs +++ b/tests/scenarios/fixtures.rs @@ -320,8 +320,8 @@ pub fn given_resource_in_system( } else if let Value::Object(ref mut map) = world.fixtures { map.insert(given_key.clone(), world.response.object.clone()); } - world.parameters = given_parameters.clone(); - match build_undo(world, &operation_id, Some(given_key)) { + //world.parameters = given_parameters.clone(); + match build_undo(world, &operation_id, Some(given_key),given_parameters.clone()) { Ok(Some(undo)) => world.undo_operations.push(undo), Ok(None) => {} Err(err) => panic!("{err}"), @@ -406,7 +406,7 @@ fn request_sent(world: &mut DatadogWorld) { world.operation_id ))(world, &world.parameters.clone()); - match build_undo(world, &world.operation_id.clone(), None) { + match build_undo(world, &world.operation_id.clone(), None, world.parameters.clone()) { Ok(Some(undo)) => { world.undo_operations.push(undo); } @@ -650,18 +650,19 @@ fn process_param_from_request( undo_operation: &mut UndoOperation, given_key: Option, world: &DatadogWorld, + request_parameters: HashMap, ) { let param_name = param.get("name").unwrap().as_str().unwrap().to_string(); if let Some(source) = param.get("source") { if let Some(value) = lookup( &source.as_str().unwrap().to_string(), - &serde_json::to_value(&world.parameters).unwrap(), + &serde_json::to_value(&request_parameters).unwrap(), ) { undo_operation.parameters.insert(param_name.clone(), value); } } - let request_params_value = &serde_json::to_value(&world.parameters.get(¶m_name).unwrap_or(&serde_json::Value::Null)).unwrap(); + let request_params_value = &serde_json::to_value(&request_parameters.get(¶m_name).unwrap_or(&serde_json::Value::Null)).unwrap(); if let Some(template_value) = param.get("template") { if let Some(rendered) = template_value.as_str() { let json_value = match given_key.clone() { @@ -674,6 +675,8 @@ fn process_param_from_request( }, None => template(rendered.to_string(), request_params_value), }; + + println!("json_value: {:?}", json_value); undo_operation.parameters.insert( param_name.clone(), serde_json::from_str(json_value.as_str()).unwrap(), @@ -686,6 +689,7 @@ fn build_undo( world: &mut DatadogWorld, operation_id: &String, given_key: Option, + request_parameters: HashMap, ) -> Result, Value> { if world.response.code < 200 || world.response.code >= 300 { return Ok(None); @@ -736,13 +740,14 @@ fn build_undo( initialize_api_instance(world, undo_operation.tag.clone().unwrap()); let params = undo.get("parameters").unwrap().as_array().unwrap(); + println!("undo params: {:?}", params); for param in params { match param.get("origin") { Some(origin) => { if origin == "response" { process_param_from_response(param, &mut undo_operation, given_key.clone(), world); } else if origin == "request" { - process_param_from_request(param, &mut undo_operation, given_key.clone(), world); + process_param_from_request(param, &mut undo_operation, given_key.clone(), world, request_parameters.clone()); } } None => { From a56ac2fdf3cc2a01b01b2ab461065a48a86924aa Mon Sep 17 00:00:00 2001 From: HantingZhang2 <42933443+HantingZhang2@users.noreply.github.com> Date: Thu, 22 Feb 2024 19:40:07 +0100 Subject: [PATCH 6/9] Remove useless part --- tests/scenarios/fixtures.rs | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/tests/scenarios/fixtures.rs b/tests/scenarios/fixtures.rs index 28f8141bb..e0f360940 100644 --- a/tests/scenarios/fixtures.rs +++ b/tests/scenarios/fixtures.rs @@ -648,8 +648,6 @@ fn process_param_from_response( fn process_param_from_request( param: &Value, undo_operation: &mut UndoOperation, - given_key: Option, - world: &DatadogWorld, request_parameters: HashMap, ) { let param_name = param.get("name").unwrap().as_str().unwrap().to_string(); @@ -665,17 +663,7 @@ fn process_param_from_request( let request_params_value = &serde_json::to_value(&request_parameters.get(¶m_name).unwrap_or(&serde_json::Value::Null)).unwrap(); if let Some(template_value) = param.get("template") { if let Some(rendered) = template_value.as_str() { - let json_value = match given_key.clone() { - Some(key) => { - let fixture_value = match world.fixtures.get(&key){ - Some(value) if !value.as_object().unwrap().is_empty()=> value, - _ => request_params_value, - }; - template(rendered.to_string(), fixture_value) - }, - None => template(rendered.to_string(), request_params_value), - }; - + let json_value = template(rendered.to_string(), request_params_value); println!("json_value: {:?}", json_value); undo_operation.parameters.insert( param_name.clone(), @@ -747,7 +735,7 @@ fn build_undo( if origin == "response" { process_param_from_response(param, &mut undo_operation, given_key.clone(), world); } else if origin == "request" { - process_param_from_request(param, &mut undo_operation, given_key.clone(), world, request_parameters.clone()); + process_param_from_request(param, &mut undo_operation, request_parameters.clone()); } } None => { From 8969adf76600e04f2a14b0b5324a30d8a8d50e92 Mon Sep 17 00:00:00 2001 From: HantingZhang2 <42933443+HantingZhang2@users.noreply.github.com> Date: Thu, 22 Feb 2024 19:40:32 +0100 Subject: [PATCH 7/9] remove prints --- tests/scenarios/fixtures.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/scenarios/fixtures.rs b/tests/scenarios/fixtures.rs index e0f360940..a5bd74ebe 100644 --- a/tests/scenarios/fixtures.rs +++ b/tests/scenarios/fixtures.rs @@ -664,7 +664,6 @@ fn process_param_from_request( if let Some(template_value) = param.get("template") { if let Some(rendered) = template_value.as_str() { let json_value = template(rendered.to_string(), request_params_value); - println!("json_value: {:?}", json_value); undo_operation.parameters.insert( param_name.clone(), serde_json::from_str(json_value.as_str()).unwrap(), @@ -728,7 +727,6 @@ fn build_undo( initialize_api_instance(world, undo_operation.tag.clone().unwrap()); let params = undo.get("parameters").unwrap().as_array().unwrap(); - println!("undo params: {:?}", params); for param in params { match param.get("origin") { Some(origin) => { From 0baddc964fde62dac051531e33d54ad1574de6df Mon Sep 17 00:00:00 2001 From: HantingZhang2 <42933443+HantingZhang2@users.noreply.github.com> Date: Thu, 22 Feb 2024 19:47:57 +0100 Subject: [PATCH 8/9] remove useless line --- tests/scenarios/fixtures.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/scenarios/fixtures.rs b/tests/scenarios/fixtures.rs index a5bd74ebe..b335465f4 100644 --- a/tests/scenarios/fixtures.rs +++ b/tests/scenarios/fixtures.rs @@ -320,7 +320,6 @@ pub fn given_resource_in_system( } else if let Value::Object(ref mut map) = world.fixtures { map.insert(given_key.clone(), world.response.object.clone()); } - //world.parameters = given_parameters.clone(); match build_undo(world, &operation_id, Some(given_key),given_parameters.clone()) { Ok(Some(undo)) => world.undo_operations.push(undo), Ok(None) => {} From b64a5adba99d4adf9d0f36ac8e60e607a3d6aa04 Mon Sep 17 00:00:00 2001 From: Sherzod Karimov Date: Wed, 28 Feb 2024 14:20:08 -0500 Subject: [PATCH 9/9] lint --- tests/scenarios/fixtures.rs | 60 ++++++++++++++++++++++++++++++------- 1 file changed, 50 insertions(+), 10 deletions(-) diff --git a/tests/scenarios/fixtures.rs b/tests/scenarios/fixtures.rs index b335465f4..9ec87ee0f 100644 --- a/tests/scenarios/fixtures.rs +++ b/tests/scenarios/fixtures.rs @@ -18,7 +18,12 @@ use rvcr::{VCRMiddleware, VCRMode}; use serde_json::{json, Value}; use sha256::digest; use std::{ - collections::{HashMap, HashSet}, env, fs::{create_dir_all, read_to_string}, ops::Add, path::PathBuf, str::FromStr + collections::{HashMap, HashSet}, + env, + fs::{create_dir_all, read_to_string}, + ops::Add, + path::PathBuf, + str::FromStr, }; pub type TestCall = fn(&mut DatadogWorld, &HashMap); @@ -320,7 +325,12 @@ pub fn given_resource_in_system( } else if let Value::Object(ref mut map) = world.fixtures { map.insert(given_key.clone(), world.response.object.clone()); } - match build_undo(world, &operation_id, Some(given_key),given_parameters.clone()) { + match build_undo( + world, + &operation_id, + Some(given_key), + given_parameters.clone(), + ) { Ok(Some(undo)) => world.undo_operations.push(undo), Ok(None) => {} Err(err) => panic!("{err}"), @@ -405,7 +415,12 @@ fn request_sent(world: &mut DatadogWorld) { world.operation_id ))(world, &world.parameters.clone()); - match build_undo(world, &world.operation_id.clone(), None, world.parameters.clone()) { + match build_undo( + world, + &world.operation_id.clone(), + None, + world.parameters.clone(), + ) { Ok(Some(undo)) => { world.undo_operations.push(undo); } @@ -620,7 +635,7 @@ fn process_param_from_response( world: &DatadogWorld, ) { let param_name = param.get("name").unwrap().as_str().unwrap().to_string(); - + if let Some(source) = param.get("source") { if let Some(value) = lookup( &source.as_str().unwrap().to_string(), @@ -633,7 +648,13 @@ fn process_param_from_response( if let Some(template_value) = param.get("template") { if let Some(rendered) = template_value.as_str() { let json_value = match given_key.clone() { - Some(key) => template(rendered.to_string(), &world.fixtures.get(&key).unwrap_or_else(|| &world.response.object)), + Some(key) => template( + rendered.to_string(), + &world + .fixtures + .get(&key) + .unwrap_or_else(|| &world.response.object), + ), None => template(rendered.to_string(), &world.response.object), }; undo_operation.parameters.insert( @@ -650,7 +671,7 @@ fn process_param_from_request( request_parameters: HashMap, ) { let param_name = param.get("name").unwrap().as_str().unwrap().to_string(); - + if let Some(source) = param.get("source") { if let Some(value) = lookup( &source.as_str().unwrap().to_string(), @@ -659,7 +680,12 @@ fn process_param_from_request( undo_operation.parameters.insert(param_name.clone(), value); } } - let request_params_value = &serde_json::to_value(&request_parameters.get(¶m_name).unwrap_or(&serde_json::Value::Null)).unwrap(); + let request_params_value = &serde_json::to_value( + &request_parameters + .get(¶m_name) + .unwrap_or(&serde_json::Value::Null), + ) + .unwrap(); if let Some(template_value) = param.get("template") { if let Some(rendered) = template_value.as_str() { let json_value = template(rendered.to_string(), request_params_value); @@ -730,13 +756,27 @@ fn build_undo( match param.get("origin") { Some(origin) => { if origin == "response" { - process_param_from_response(param, &mut undo_operation, given_key.clone(), world); + process_param_from_response( + param, + &mut undo_operation, + given_key.clone(), + world, + ); } else if origin == "request" { - process_param_from_request(param, &mut undo_operation, request_parameters.clone()); + process_param_from_request( + param, + &mut undo_operation, + request_parameters.clone(), + ); } } None => { - process_param_from_response(param, &mut undo_operation, given_key.clone(), world); + process_param_from_response( + param, + &mut undo_operation, + given_key.clone(), + world, + ); } } }