gitbutler/crates/gitbutler-core/tests/ops/entry.rs
Sebastian Thiel b0e73e5c89
oplog review
2024-05-28 17:22:02 +02:00

166 lines
5.3 KiB
Rust

mod trailer {
use gitbutler_core::ops::entry::Trailer;
use std::str::FromStr;
#[test]
fn display() {
let trailer = Trailer {
key: "foo".to_string(),
value: "bar".to_string(),
};
assert_eq!(format!("{}", trailer), "foo: bar");
}
#[test]
fn from_str() {
let s = "foo: bar";
let trailer = Trailer::from_str(s).unwrap();
assert_eq!(trailer.key, "foo");
assert_eq!(trailer.value, "bar");
}
#[test]
fn from_str_invalid() {
let s = "foobar";
let result = Trailer::from_str(s);
assert!(result.is_err());
}
}
mod version {
use gitbutler_core::ops::entry::{Trailer, Version};
use std::str::FromStr;
#[test]
fn from_trailer() {
let s = "Version: 1";
let trailer = Trailer::from_str(s).unwrap();
let version = Version::from_str(&trailer.value).unwrap();
assert_eq!(version, Version::default());
}
#[test]
fn invalid() {
let s = "Version: -1";
let trailer = Trailer::from_str(s).unwrap();
let version = Version::from_str(&trailer.value);
assert!(version.is_err());
}
}
mod operation_kind {
use gitbutler_core::ops::entry::{OperationKind, SnapshotDetails, Trailer, Version};
use std::str::FromStr;
#[test]
fn from_trailer() {
let s = "Operation: CreateCommit";
let trailer = Trailer::from_str(s).unwrap();
let operation = OperationKind::from_str(&trailer.value).unwrap();
assert_eq!(operation, OperationKind::CreateCommit);
}
#[test]
fn unknown() {
let commit_message = "Create a new snapshot\n\nBody text 1\nBody text2\n\nBody text 3\n\nVersion: 1\nOperation: Asdf\nFoo: Bar\n";
let details = SnapshotDetails::from_str(commit_message).unwrap();
assert_eq!(details.version, Version::default());
assert_eq!(details.operation, OperationKind::Unknown);
assert_eq!(details.title, "Create a new snapshot");
assert_eq!(
details.body,
Some("Body text 1\nBody text2\n\nBody text 3".to_string())
);
assert_eq!(
details.trailers,
vec![Trailer {
key: "Foo".to_string(),
value: "Bar".to_string(),
}]
);
}
}
mod snapshot_details {
use gitbutler_core::ops::entry::{OperationKind, Snapshot, SnapshotDetails, Trailer, Version};
use std::path::PathBuf;
use std::str::FromStr;
#[test]
fn new() {
let commit_sha = git2::Oid::zero().into();
let commit_message =
"Create a new snapshot\n\nBody text 1\nBody text2\n\nBody text 3\n\nVersion: 1\nOperation: CreateCommit\nFoo: Bar\n".to_string();
let timezone_offset_does_not_matter = 1234;
let created_at = git2::Time::new(1234567890, timezone_offset_does_not_matter);
let details = SnapshotDetails::from_str(&commit_message.clone()).unwrap();
let snapshot = Snapshot {
commit_id: commit_sha,
created_at,
lines_added: 1,
lines_removed: 1,
files_changed: vec![PathBuf::from("foo.txt")],
details: Some(details),
};
assert_eq!(snapshot.commit_id, commit_sha);
assert_eq!(snapshot.created_at, created_at);
let details = snapshot.details.unwrap();
assert_eq!(details.version, Version::default());
assert_eq!(details.operation, OperationKind::CreateCommit);
assert_eq!(details.title, "Create a new snapshot");
assert_eq!(
details.body,
Some("Body text 1\nBody text2\n\nBody text 3".to_string())
);
assert_eq!(
details.trailers,
vec![Trailer {
key: "Foo".to_string(),
value: "Bar".to_string(),
}]
);
assert_eq!(details.to_string(), commit_message);
}
#[test]
fn new_with_newline_in_trailer() {
let snapshot_details = new_details(Trailer {
key: "Message".to_string(),
value: "Header\n\nBody".to_string(),
});
let serialized = snapshot_details.to_string();
let deserialized = SnapshotDetails::from_str(&serialized).unwrap();
assert_eq!(
deserialized, snapshot_details,
"this works because newlines are quoted"
)
}
#[test]
fn new_with_space_in_trailer_key() {
for value in ["trailing-space ", " leading-space"] {
let trailer = Trailer {
key: value.to_string(),
value: "anything".to_string(),
};
let mut snapshot_details = new_details(trailer);
let trailer = &mut snapshot_details.trailers[0];
trailer.key = trailer.key.trim().to_string();
let serialized = snapshot_details.to_string();
let deserialized = SnapshotDetails::from_str(&serialized).unwrap();
assert_eq!(deserialized, snapshot_details, "values are trimmed")
}
}
fn new_details(trailer: Trailer) -> SnapshotDetails {
SnapshotDetails {
version: Version::default(),
operation: OperationKind::CreateCommit,
title: "Create a new snapshot".to_string(),
body: None,
trailers: vec![trailer],
}
}
}