use std::convert::TryFrom;
use rstest::fixture;
use crate::document::DocumentViewId;
use crate::entry::EntrySigned;
use crate::identity::Author;
use crate::operation::{
AsVerifiedOperation, Operation, OperationEncoded, OperationFields, OperationId, OperationValue,
VerifiedOperation,
};
use crate::schema::SchemaId;
use crate::test_utils::constants::{self, TEST_SCHEMA_ID};
use crate::test_utils::fixtures::{entry_signed_encoded, public_key, random_hash};
#[fixture]
pub fn operation_id(#[default(constants::DEFAULT_HASH)] hash_str: &str) -> OperationId {
hash_str.parse().unwrap()
}
#[fixture]
pub fn random_operation_id() -> OperationId {
random_hash().into()
}
#[fixture]
pub fn operation_value() -> OperationValue {
OperationValue::Text("Hello!".to_string())
}
#[fixture]
pub fn random_previous_operations(#[default(1)] num: u32) -> DocumentViewId {
let mut previous_operations: Vec<OperationId> = Vec::new();
for _ in 0..num {
previous_operations.push(random_hash().into())
}
DocumentViewId::new(&previous_operations).unwrap()
}
#[fixture]
pub fn operation_fields(
#[default(constants::default_fields())] fields_vec: Vec<(&str, OperationValue)>,
) -> OperationFields {
let mut operation_fields = OperationFields::new();
for (key, value) in fields_vec.iter() {
operation_fields.add(key, value.to_owned()).unwrap();
}
operation_fields
}
#[fixture]
pub fn some_fields(
#[default(constants::default_fields())] fields_vec: Vec<(&str, OperationValue)>,
) -> Option<OperationFields> {
Some(operation_fields(fields_vec))
}
#[fixture]
pub fn operation(
#[from(some_fields)] fields: Option<OperationFields>,
#[default(None)] previous_operations: Option<DocumentViewId>,
#[default(Some(TEST_SCHEMA_ID.parse().unwrap()))] schema: Option<SchemaId>,
) -> Operation {
let schema = schema.unwrap_or_else(|| TEST_SCHEMA_ID.parse().unwrap());
match fields {
Some(fields) if previous_operations.is_none() => {
Operation::new_create(schema, fields).unwrap()
}
Some(fields) => {
Operation::new_update(schema, previous_operations.unwrap(), fields).unwrap()
}
None => Operation::new_delete(schema, previous_operations.unwrap()).unwrap(),
}
}
#[fixture]
pub fn verified_operation(
#[from(some_fields)] fields: Option<OperationFields>,
#[default(None)] previous_operations: Option<DocumentViewId>,
#[default(Some(TEST_SCHEMA_ID.parse().unwrap()))] schema: Option<SchemaId>,
#[default(Some(public_key()))] author: Option<Author>,
#[default(Some(random_operation_id()))] operation_id: Option<OperationId>,
) -> VerifiedOperation {
VerifiedOperation::new_test_operation(
&operation_id.unwrap_or_else(random_operation_id),
&author.unwrap_or_else(public_key),
&operation(fields, previous_operations, schema),
)
}
#[fixture]
pub fn encoded_create_string(operation: Operation) -> String {
OperationEncoded::try_from(&operation)
.unwrap()
.as_str()
.to_owned()
}
#[fixture]
pub fn meta_operation(
entry_signed_encoded: EntrySigned,
operation_encoded: OperationEncoded,
) -> VerifiedOperation {
VerifiedOperation::new_from_entry(&entry_signed_encoded, &operation_encoded).unwrap()
}
#[fixture]
pub fn operation_encoded(
#[from(some_fields)] fields: Option<OperationFields>,
#[default(None)] previous_operations: Option<DocumentViewId>,
#[default(Some(TEST_SCHEMA_ID.parse().unwrap()))] schema: Option<SchemaId>,
) -> OperationEncoded {
OperationEncoded::try_from(&operation(fields, previous_operations, schema)).unwrap()
}
#[fixture]
pub fn operation_encoded_invalid_relation_fields() -> OperationEncoded {
OperationEncoded::new("A466616374696F6E6663726561746566736368656D61784A76656E75655F30303230633635353637616533376566656132393365333461396337643133663866326266323364626463336235633762396162343632393331313163343866633738626776657273696F6E01666669656C6473A1696C6F636174696F6E73A264747970656872656C6174696F6E6576616C756578443833653230343337333866326235636463643362366362306662623832666531323539303564306637356531363438386133386433393566663566396435656138326235").unwrap()
}
pub fn create_operation(fields: &[(&str, OperationValue)]) -> Operation {
operation(Some(operation_fields(fields.to_vec())), None, None)
}
pub fn update_operation(
fields: &[(&str, OperationValue)],
previous_operations: &DocumentViewId,
) -> Operation {
operation(
Some(operation_fields(fields.to_vec())),
Some(previous_operations.clone()),
None,
)
}
pub fn delete_operation(previous_operations: &DocumentViewId) -> Operation {
operation(None, Some(previous_operations.to_owned()), None)
}