use pretty_assertions::assert_eq;
use queryweave_derive::{MergePatch, MergePatchNullableFields, RawValue};
#[derive(Debug, Clone, Copy, PartialEq)]
struct Deadline<T = i64>(T);
impl From<Deadline<Self>> for i64 {
fn from(value: Deadline<Self>) -> Self {
value.0
}
}
#[derive(Debug, Clone, PartialEq, RawValue)]
struct Label<T = String>(T);
#[allow(dead_code)]
#[derive(Default, MergePatchNullableFields)]
struct MergePatchOrderModel {
client: queryweave::Patch<String>,
label: Option<Label<String>>,
capacity: Option<i32>,
#[allow(dead_code)]
deadline: Option<Deadline<i64>>,
#[merge_patch(skip)]
created_by_user_with_id: i32,
}
#[derive(Debug, Clone, PartialEq, MergePatch)]
#[merge_patch(patch = MergePatchOrderModel)]
struct OrderModel {
client: Option<String>,
label: Label<String>,
capacity: i32,
deadline: i64,
#[merge_patch(skip)]
created_by_user_with_id: i32,
}
fn order_model() -> OrderModel {
OrderModel {
client: Some(String::from("Client")),
label: Label(String::from("Label")),
capacity: 10,
deadline: 100,
created_by_user_with_id: 1,
}
}
fn merged(merge_patch: MergePatchOrderModel) -> OrderModel {
let mut model = order_model();
model.merge(merge_patch);
model
}
#[test]
fn test_an_empty_patch_changes_nothing() {
assert_eq!(merged(MergePatchOrderModel::default()), order_model());
}
#[test]
fn test_a_nullable_field_can_be_set_and_cleared() {
let set = merged(MergePatchOrderModel {
client: queryweave::Patch::Value(String::from("Other")),
..Default::default()
});
assert_eq!(set.client, Some(String::from("Other")));
let cleared = merged(MergePatchOrderModel {
client: queryweave::Patch::Null,
..Default::default()
});
assert_eq!(cleared.client, None);
}
#[test]
fn test_present_fields_replace_the_model_fields() {
let model = merged(MergePatchOrderModel {
label: Some(Label(String::from("Other"))),
capacity: Some(20),
deadline: Some(Deadline(200)),
..Default::default()
});
assert_eq!(
model,
OrderModel {
label: Label(String::from("Other")),
capacity: 20,
deadline: 200,
..order_model()
}
);
}
#[test]
fn test_a_skipped_field_is_not_patched() {
let model = merged(MergePatchOrderModel {
created_by_user_with_id: 2,
..Default::default()
});
assert_eq!(model.created_by_user_with_id, 1);
}
#[test]
fn test_patchable_field_names_list_the_fields_not_skipped() {
assert_eq!(
<OrderModel as queryweave::PersistedFields>::FIELD_NAMES,
&["client", "label", "capacity", "deadline"]
);
}