1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
use crate::{
    json::ConcreteJsonLoader,
    loader::{error::LoaderError, trait_::LoaderTrait},
};
use serde_json::Value;

#[allow(clippy::module_name_repetitions)]
pub type SerdeJsonLoader = ConcreteJsonLoader<Value>;

impl LoaderTrait<Value> for SerdeJsonLoader {
    fn load_from_bytes(&self, content: &[u8]) -> Result<Value, LoaderError>
    where
        Self: Sized,
    {
        serde_json::from_slice(content).or_else(|ref serde_error| Err(LoaderError::from(serde_error)))
    }
}

#[cfg(test)]
mod tests {
    use super::SerdeJsonLoader;
    use crate::{loader::error::LoaderError, testing_helpers::MockLoaderRequestBuilder, traits::check_loader};
    use serde_json::Value;
    use test_case::test_case;

    #[test]
    fn test_is_loader() {
        check_loader::<_, SerdeJsonLoader>()
    }

    #[test_case("Boolean.json", "", &json![false])]
    #[test_case("Integer.json", "", &json![1])]
    #[test_case("Null.json", "", &json![null])]
    #[test_case("String.json", "", &json!["Some Text"])]
    #[test_case("Object.json", "", &json![{"key": "Some Text"}])]
    #[test_case("Object.json", "/key", &json!["Some Text"])]
    fn test_load_from_file_valid_content(file_name: &'static str, fragment: &str, expected_loaded_object: &Value) {
        assert_eq!(
            &*MockLoaderRequestBuilder::default()
                .http_path(format!("/#{}", fragment))
                .resp_body_file_path(vec![file_name])
                .build()
                .unwrap()
                .send_request(&SerdeJsonLoader::default())
                .unwrap(),
            expected_loaded_object,
        );
    }

    #[test]
    fn test_load_invalid_content() {
        assert!(matches!(
            MockLoaderRequestBuilder::default()
                .resp_body_file_path(vec!["Invalid.json"])
                .build()
                .unwrap()
                .send_request(&SerdeJsonLoader::default())
                .unwrap_err(),
            LoaderError::FormatError(value) if "EOF while parsing an object at line 2 column 0" == &value
        ));
    }
}