Skip to content
132 changes: 107 additions & 25 deletions tests/scenarios/fixtures.rs
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,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(),
Expand Down Expand Up @@ -356,8 +356,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)) {
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}"),
Expand Down Expand Up @@ -442,7 +446,12 @@ 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);
}
Expand Down Expand Up @@ -650,10 +659,80 @@ fn template(string: String, fixtures: &Value) -> String {
.expect("failed to apply template")
}

fn process_param_from_response(
param: &Value,
undo_operation: &mut UndoOperation,
given_key: Option<String>,
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,
request_parameters: HashMap<String, Value>,
) {
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(&request_parameters).unwrap(),
) {
undo_operation.parameters.insert(param_name.clone(), value);
}
}
let request_params_value = &serde_json::to_value(
&request_parameters
.get(&param_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);
undo_operation.parameters.insert(
param_name.clone(),
serde_json::from_str(json_value.as_str()).unwrap(),
);
}
}
}

fn build_undo(
world: &mut DatadogWorld,
operation_id: &String,
given_key: Option<String>,
request_parameters: HashMap<String, Value>,
) -> Result<Option<UndoOperation>, Value> {
if world.response.code < 200 || world.response.code >= 300 {
return Ok(None);
Expand Down Expand Up @@ -705,29 +784,32 @@ 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_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(),
);
}
}
};
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_from_response(
param,
&mut undo_operation,
given_key.clone(),
world,
);
};
};
}
}
}
Ok(Some(undo_operation))
}
Expand Down