use std::convert::TryFrom;
use rstest::rstest;
use rstest_reuse::apply;
use crate::entry::{decode_entry, sign_and_encode, Entry, LogId, SeqNum};
use crate::identity::KeyPair;
use crate::operation::{AsOperation, Operation, OperationEncoded};
use crate::test_utils::fixtures::{key_pair, Fixture};
use crate::test_utils::templates::{many_valid_entries, version_fixtures};
#[apply(many_valid_entries)]
fn entry_encoding_decoding(#[case] entry: Entry, key_pair: KeyPair) {
let encoded_operation = OperationEncoded::try_from(entry.operation().unwrap()).unwrap();
let signed_encoded_entry = sign_and_encode(&entry, &key_pair).unwrap();
let decoded_entry = decode_entry(&signed_encoded_entry, Some(&encoded_operation)).unwrap();
assert_eq!(entry.log_id(), decoded_entry.log_id());
assert_eq!(
entry.operation().unwrap(),
decoded_entry.operation().unwrap()
);
assert_eq!(entry.seq_num(), decoded_entry.seq_num());
assert_eq!(entry.backlink_hash(), decoded_entry.backlink_hash());
assert_eq!(entry.skiplink_hash(), decoded_entry.skiplink_hash());
}
#[apply(many_valid_entries)]
fn sign_and_encode_roundtrip(#[case] entry: Entry, key_pair: KeyPair) {
let entry_first_encoded = sign_and_encode(&entry, &key_pair).unwrap();
let operation_encoded = OperationEncoded::try_from(entry.operation().unwrap()).unwrap();
let entry_decoded: Entry =
decode_entry(&entry_first_encoded, Some(&operation_encoded)).unwrap();
let test_entry_signed_encoded = sign_and_encode(&entry_decoded, &key_pair).unwrap();
assert_eq!(entry_first_encoded, test_entry_signed_encoded);
let entry_second = Entry::new(
&LogId::default(),
entry.operation(),
None,
Some(&entry_first_encoded.hash()),
&SeqNum::new(2).unwrap(),
)
.unwrap();
assert!(sign_and_encode(&entry_second, &key_pair).is_ok());
}
#[apply(version_fixtures)]
fn fixture_sign_encode(#[case] fixture: Fixture) {
let entry_signed_encoded = sign_and_encode(&fixture.entry, &fixture.key_pair).unwrap();
assert_eq!(
fixture.entry_signed_encoded.hash().as_str(),
entry_signed_encoded.hash().as_str()
);
}
#[apply(version_fixtures)]
fn fixture_decode_operation(#[case] fixture: Fixture) {
let operation = Operation::try_from(&fixture.operation_encoded).unwrap();
let operation_fields = operation.fields().unwrap();
let fixture_operation_fields = fixture.entry.operation().unwrap().fields().unwrap();
assert_eq!(
operation_fields.get("description").unwrap(),
fixture_operation_fields.get("description").unwrap()
);
assert_eq!(
operation_fields.get("name").unwrap(),
fixture_operation_fields.get("name").unwrap()
);
}
#[apply(version_fixtures)]
fn fixture_decode_entry(#[case] fixture: Fixture) {
let entry = decode_entry(
&fixture.entry_signed_encoded,
Some(&fixture.operation_encoded),
)
.unwrap();
assert_eq!(
entry.operation().unwrap(),
fixture.entry.operation().unwrap()
);
assert_eq!(entry.seq_num(), fixture.entry.seq_num());
assert_eq!(entry.backlink_hash(), fixture.entry.backlink_hash());
assert_eq!(entry.skiplink_hash(), fixture.entry.skiplink_hash());
assert_eq!(entry.log_id(), fixture.entry.log_id());
}