aboutsummaryrefslogtreecommitdiff
path: root/src/metadata.rs
diff options
context:
space:
mode:
authorRuben Beltran del Rio <git@r.bdr.sh>2025-01-05 20:52:26 +0100
committerRuben Beltran del Rio <git@r.bdr.sh>2025-01-05 20:52:26 +0100
commit0fca7c5476099212ed1fa9ed812aa456ba004300 (patch)
tree3acacb019691f56a510ddf21f929816e45d21d9a /src/metadata.rs
parentb17907faf8d9693cef94a6048d802bd4ced9102f (diff)
Add tests for utils and metadata
Diffstat (limited to 'src/metadata.rs')
-rw-r--r--src/metadata.rs65
1 files changed, 65 insertions, 0 deletions
diff --git a/src/metadata.rs b/src/metadata.rs
index fe657e4..d6b3d6a 100644
--- a/src/metadata.rs
+++ b/src/metadata.rs
@@ -13,6 +13,11 @@ pub struct Metadata {
}
impl Metadata {
+ /// Reads `Metadata` from a file or creates a new one.
+ ///
+ /// This method will create new metadata if it can't read the file,
+ /// whether it's because of malformed JSON, UTF-8 or because the file
+ /// is not readable.
pub fn read_or_create(file_path: &PathBuf) -> Metadata {
if let Some(metadata) = Metadata::read_metadata_file(file_path) {
metadata
@@ -28,6 +33,7 @@ impl Metadata {
}
}
+ /// Returns the metadata `created_on` as an RFC-2822 string.
pub fn created_on_utc(&self) -> Option<String> {
let date =
OffsetDateTime::from_unix_timestamp_nanos((self.created_on * 1_000_000).into()).ok()?;
@@ -41,3 +47,62 @@ impl Metadata {
serde_json::from_str(&contents).ok()
}
}
+
+#[cfg(test)]
+mod tests {
+ use std::fs::write;
+
+ use super::*;
+
+ use test_utilities::*;
+
+ #[test]
+ fn test_reads_metadata_if_file_exists() {
+ let test_dir = setup_test_dir();
+ create_test_file(
+ &test_dir.join("metadata.json"),
+ "\
+{
+ \"id\": \"cool\",
+ \"created_on\": 1736105008957
+}",
+ );
+
+ let metadata = Metadata::read_or_create(&test_dir.join("metadata.json"));
+
+ assert_eq!(metadata.id, "cool");
+ assert_eq!(metadata.created_on, 1736105008957);
+ }
+
+ #[test]
+ fn test_creates_metadata_if_file_does_not_exist() {
+ let test_dir = setup_test_dir();
+
+ assert!(!test_dir.join("metadata.json").exists());
+ let metadata = Metadata::read_or_create(&test_dir.join("metadata.json"));
+ assert_eq!(metadata.created_on.to_string(), metadata.id);
+ }
+
+ #[test]
+ fn test_creates_metadata_if_file_is_malformed() {
+ let test_dir = setup_test_dir();
+ write(&test_dir.join("metadata.json"), vec![0xFF, 0xFF]).expect("Failed to write file");
+
+ let metadata = Metadata::read_or_create(&test_dir.join("metadata.json"));
+ assert_eq!(metadata.created_on.to_string(), metadata.id);
+ }
+
+ #[test]
+ fn test_it_returns_created_on_as_rfc_2822_utc() {
+ let metadata = Metadata {
+ id: "cool".to_string(),
+ created_on: 1736035200000,
+ };
+
+ if let Some(created_on_utc) = metadata.created_on_utc() {
+ assert_eq!(created_on_utc, "Sun, 05 Jan 2025 00:00:00 +0000");
+ } else {
+ panic!("Could not generate RFC-2822 string");
+ }
+ }
+}