Skip to content

Commit 50fc022

Browse files
committed
fix(pact_models): Provider state values may be passed in under a "providerState" key
1 parent 80b7bb5 commit 50fc022

File tree

1 file changed

+39
-8
lines changed
  • rust/pact_models/src/generators

1 file changed

+39
-8
lines changed

rust/pact_models/src/generators/mod.rs

Lines changed: 39 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ use rand::prelude::*;
1919
#[cfg(target_family = "wasm")] use regex::{Captures, Regex};
2020
use serde::{Deserialize, Serialize};
2121
use serde_json::{json, Value};
22+
use serde_json::Value::Object;
2223
use tracing::{debug, instrument, trace, warn};
2324
use uuid::Uuid;
2425

@@ -825,11 +826,21 @@ impl GenerateValue<u16> for Generator {
825826
) -> anyhow::Result<u16> {
826827
match self {
827828
&Generator::RandomInt(min, max) => Ok(rand::thread_rng().gen_range(min as u16..(max as u16).saturating_add(1))),
828-
&Generator::ProviderStateGenerator(ref exp, ref dt) =>
829-
match generate_value_from_context(exp, context, dt) {
829+
&Generator::ProviderStateGenerator(ref exp, ref dt) => {
830+
// Provider state values may come under a "providerState" key
831+
let provider_state_config = if let Some(Object(psc)) = context.get("providerState") {
832+
psc
833+
.iter()
834+
.map(|(k, v)| (k.as_str(), v.clone()))
835+
.collect()
836+
} else {
837+
context.clone()
838+
};
839+
match generate_value_from_context(exp, &provider_state_config, dt) {
830840
Ok(val) => u16::try_from(val),
831841
Err(err) => Err(err)
832-
},
842+
}
843+
}
833844
_ => Err(anyhow!("Could not generate a u16 value from {} using {:?}", value, self))
834845
}
835846
}
@@ -973,8 +984,18 @@ impl GenerateValue<String> for Generator {
973984
}
974985
}
975986
Generator::RandomBoolean => Ok(format!("{}", rnd.gen::<bool>())),
976-
Generator::ProviderStateGenerator(ref exp, ref dt) =>
977-
generate_value_from_context(exp, context, dt).map(|val| val.to_string()),
987+
Generator::ProviderStateGenerator(ref exp, ref dt) => {
988+
// Provider state values may come under a "providerState" key
989+
let provider_state_config = if let Some(Object(psc)) = context.get("providerState") {
990+
psc
991+
.iter()
992+
.map(|(k, v)| (k.as_str(), v.clone()))
993+
.collect()
994+
} else {
995+
context.clone()
996+
};
997+
generate_value_from_context(exp, &provider_state_config, dt).map(|val| val.to_string())
998+
}
978999
Generator::MockServerURL(example, regex) => if let Some(mock_server_details) = context.get("mockServer") {
9791000
debug!("Generating URL from Mock Server details");
9801001
match mock_server_details.as_object() {
@@ -1140,11 +1161,21 @@ impl GenerateValue<Value> for Generator {
11401161
}
11411162
},
11421163
Generator::RandomBoolean => Ok(json!(rand::thread_rng().gen::<bool>())),
1143-
Generator::ProviderStateGenerator(ref exp, ref dt) =>
1144-
match generate_value_from_context(exp, context, dt) {
1164+
Generator::ProviderStateGenerator(ref exp, ref dt) => {
1165+
// Provider state values may come under a "providerState" key
1166+
let provider_state_config = if let Some(Object(psc)) = context.get("providerState") {
1167+
psc
1168+
.iter()
1169+
.map(|(k, v)| (k.as_str(), v.clone()))
1170+
.collect()
1171+
} else {
1172+
context.clone()
1173+
};
1174+
match generate_value_from_context(exp, &provider_state_config, dt) {
11451175
Ok(val) => val.as_json(),
11461176
Err(err) => Err(err)
1147-
},
1177+
}
1178+
}
11481179
Generator::MockServerURL(example, regex) => {
11491180
debug!("context = {:?}", context);
11501181
if let Some(mock_server_details) = context.get("mockServer") {

0 commit comments

Comments
 (0)