Skip to main content

modo/storage/
bridge.rs

1use super::facade::PutInput;
2use crate::extractor::UploadedFile;
3
4impl PutInput {
5    /// Build from an [`UploadedFile`] and a storage prefix.
6    pub fn from_upload(file: &UploadedFile, prefix: &str) -> Self {
7        let filename = if file.name.is_empty() {
8            None
9        } else {
10            Some(file.name.clone())
11        };
12        Self {
13            data: file.data.clone(),
14            prefix: prefix.to_string(),
15            filename,
16            content_type: file.content_type.clone(),
17        }
18    }
19}
20
21#[cfg(test)]
22mod tests {
23    use super::*;
24    use bytes::Bytes;
25
26    fn test_file(name: &str, ct: &str) -> UploadedFile {
27        UploadedFile {
28            name: name.to_string(),
29            content_type: ct.to_string(),
30            size: 5,
31            data: Bytes::from_static(b"hello"),
32        }
33    }
34
35    #[test]
36    fn from_upload_copies_fields() {
37        let file = test_file("photo.jpg", "image/jpeg");
38        let input = PutInput::from_upload(&file, "avatars/");
39        assert_eq!(input.prefix, "avatars/");
40        assert_eq!(input.filename, Some("photo.jpg".to_string()));
41        assert_eq!(input.content_type, "image/jpeg");
42        assert_eq!(input.data.len(), 5);
43    }
44
45    #[test]
46    fn from_upload_empty_name_becomes_none() {
47        let file = test_file("", "application/octet-stream");
48        let input = PutInput::from_upload(&file, "uploads/");
49        assert_eq!(input.filename, None);
50    }
51
52    #[test]
53    fn from_upload_unnamed_preserved() {
54        let file = test_file("unnamed", "application/octet-stream");
55        let input = PutInput::from_upload(&file, "uploads/");
56        assert_eq!(input.filename, Some("unnamed".to_string()));
57    }
58}