use shopify_function::prelude::*;
use shopify_function::wasm_api::Deserialize;
#[derive(Deserialize, PartialEq, Debug, Default)]
#[shopify_function(rename_all = "camelCase")]
struct TestStructWithDefault {
#[shopify_function(default)]
field_a: String,
#[shopify_function(default)]
field_b: i32,
field_c: bool,
}
#[derive(Deserialize, PartialEq, Debug, Default)]
struct TestComplexDefaults {
#[shopify_function(default)]
integer: i32,
#[shopify_function(default)]
float: f64,
#[shopify_function(default)]
string: String,
#[shopify_function(default)]
boolean: bool,
#[shopify_function(default)]
vector: Vec<i32>,
#[shopify_function(default)]
option: Option<String>,
}
#[test]
fn test_derive_deserialize_with_default() {
let context = shopify_function::wasm_api::Context::new_with_input(serde_json::json!({
"fieldA": "test",
"fieldB": 1,
"fieldC": true
}));
let root_value = context.input_get().unwrap();
let input = TestStructWithDefault::deserialize(&root_value).unwrap();
assert_eq!(
input,
TestStructWithDefault {
field_a: "test".to_string(),
field_b: 1,
field_c: true
}
);
let context = shopify_function::wasm_api::Context::new_with_input(serde_json::json!({
"fieldA": null,
"fieldB": null,
"fieldC": true
}));
let root_value = context.input_get().unwrap();
let input = TestStructWithDefault::deserialize(&root_value).unwrap();
assert_eq!(
input,
TestStructWithDefault {
field_a: String::default(), field_b: i32::default(), field_c: true
}
);
let context = shopify_function::wasm_api::Context::new_with_input(serde_json::json!({
"fieldC": true
}));
let root_value = context.input_get().unwrap();
let input = TestStructWithDefault::deserialize(&root_value).unwrap();
assert_eq!(
input,
TestStructWithDefault {
field_a: String::default(), field_b: i32::default(), field_c: true
}
);
}
#[test]
fn test_derive_deserialize_complex_defaults() {
let context = shopify_function::wasm_api::Context::new_with_input(serde_json::json!({
"integer": null,
"float": null,
"string": null,
"boolean": null,
"vector": null,
"option": null
}));
let root_value = context.input_get().unwrap();
let input = TestComplexDefaults::deserialize(&root_value).unwrap();
assert_eq!(
input,
TestComplexDefaults {
integer: 0,
float: 0.0,
string: String::new(),
boolean: false,
vector: Vec::new(),
option: None,
}
);
let context = shopify_function::wasm_api::Context::new_with_input(serde_json::json!({
"integer": 42,
"float": 3.19,
"string": "hello",
"boolean": true,
"vector": [1, 2, 3],
"option": "some value"
}));
let root_value = context.input_get().unwrap();
let input = TestComplexDefaults::deserialize(&root_value).unwrap();
assert_eq!(
input,
TestComplexDefaults {
integer: 42,
float: 3.19,
string: "hello".to_string(),
boolean: true,
vector: vec![1, 2, 3],
option: Some("some value".to_string()),
}
);
}
#[test]
fn test_missing_non_default_field() {
let context = shopify_function::wasm_api::Context::new_with_input(serde_json::json!({
"fieldA": "test",
"fieldB": 1
}));
let root_value = context.input_get().unwrap();
TestStructWithDefault::deserialize(&root_value).unwrap_err();
}