mini_exercism 8.1.0

Minimalistic Rust library to interact with the Exercism.org APIs
Documentation
#[allow(clippy::module_inception)]
mod track {
    mod deserialize {
        use mini_exercism::api::v2::track::{Links, Track};

        #[test]
        fn test_anonymous() {
            let json = r#"{
                "slug": "clojure",
                "title": "Clojure",
                "course": true,
                "num_concepts": 10,
                "num_exercises": 87,
                "web_url": "https://exercism.org/tracks/clojure",
                "icon_url": "https://dg8krxphbh767.cloudfront.net/tracks/clojure.svg",
                "tags": [
                    "Declarative",
                    "Functional",
                    "Dynamic",
                    "Compiled",
                    "Windows",
                    "Mac OSX",
                    "Linux",
                    "JVM (Java)",
                    "Artificial Intelligence",
                    "Backends",
                    "Cross-platform development",
                    "Financial systems",
                    "Frontends",
                    "Games",
                    "GUIs",
                    "Robotics",
                    "Scientific calculations",
                    "Web development"
                ],
                "last_touched_at": null,
                "is_new": false,
                "links": {
                    "self": "https://exercism.org/tracks/clojure",
                    "exercises": "https://exercism.org/tracks/clojure/exercises",
                    "concepts": "https://exercism.org/tracks/clojure/concepts"
                }
            }"#;

            let expected = Track {
                name: "clojure".into(),
                title: "Clojure".into(),
                num_concepts: 10,
                num_exercises: 87,
                web_url: "https://exercism.org/tracks/clojure".into(),
                icon_url: "https://dg8krxphbh767.cloudfront.net/tracks/clojure.svg".into(),
                tags: vec![
                    "Declarative".into(),
                    "Functional".into(),
                    "Dynamic".into(),
                    "Compiled".into(),
                    "Windows".into(),
                    "Mac OSX".into(),
                    "Linux".into(),
                    "JVM (Java)".into(),
                    "Artificial Intelligence".into(),
                    "Backends".into(),
                    "Cross-platform development".into(),
                    "Financial systems".into(),
                    "Frontends".into(),
                    "Games".into(),
                    "GUIs".into(),
                    "Robotics".into(),
                    "Scientific calculations".into(),
                    "Web development".into(),
                ],
                links: Links {
                    self_url: "https://exercism.org/tracks/clojure".into(),
                    exercises: "https://exercism.org/tracks/clojure/exercises".into(),
                    concepts: "https://exercism.org/tracks/clojure/concepts".into(),
                },
                is_joined: false,
                num_learnt_concepts: 0,
                num_completed_exercises: 0,
            };
            let actual: Track = serde_json::from_str(json).unwrap();
            assert_eq!(expected, actual);
        }

        #[test]
        fn test_authenticated() {
            let json = r#"{
                "slug": "cpp",
                "title": "C++",
                "course": true,
                "num_concepts": 14,
                "num_exercises": 73,
                "web_url": "https://exercism.org/tracks/cpp",
                "icon_url": "https://dg8krxphbh767.cloudfront.net/tracks/cpp.svg",
                "tags": [
                    "Object-oriented",
                    "Static",
                    "Strong",
                    "Compiled",
                    "Android",
                    "iOS",
                    "Linux",
                    "Mac OSX",
                    "Windows",
                    "Standalone executable",
                    "Backends",
                    "Cross-platform development",
                    "Embedded systems",
                    "Financial systems",
                    "Games",
                    "GUIs",
                    "Mobile",
                    "Robotics",
                    "Scientific calculations"
                ],
                "last_touched_at": "2023-07-15T06:12:39Z",
                "is_new": false,
                "links": {
                    "self": "https://exercism.org/tracks/cpp",
                    "exercises": "https://exercism.org/tracks/cpp/exercises",
                    "concepts": "https://exercism.org/tracks/cpp/concepts"
                },
                "is_joined": true,
                "num_learnt_concepts": 0,
                "num_completed_exercises": 1,
                "num_solutions": 2,
                "has_notifications": false
            }"#;

            let expected = Track {
                name: "cpp".into(),
                title: "C++".into(),
                num_concepts: 14,
                num_exercises: 73,
                web_url: "https://exercism.org/tracks/cpp".into(),
                icon_url: "https://dg8krxphbh767.cloudfront.net/tracks/cpp.svg".into(),
                tags: vec![
                    "Object-oriented".into(),
                    "Static".into(),
                    "Strong".into(),
                    "Compiled".into(),
                    "Android".into(),
                    "iOS".into(),
                    "Linux".into(),
                    "Mac OSX".into(),
                    "Windows".into(),
                    "Standalone executable".into(),
                    "Backends".into(),
                    "Cross-platform development".into(),
                    "Embedded systems".into(),
                    "Financial systems".into(),
                    "Games".into(),
                    "GUIs".into(),
                    "Mobile".into(),
                    "Robotics".into(),
                    "Scientific calculations".into(),
                ],
                links: Links {
                    self_url: "https://exercism.org/tracks/cpp".into(),
                    exercises: "https://exercism.org/tracks/cpp/exercises".into(),
                    concepts: "https://exercism.org/tracks/cpp/concepts".into(),
                },
                is_joined: true,
                num_learnt_concepts: 0,
                num_completed_exercises: 1,
            };
            let actual: Track = serde_json::from_str(json).unwrap();
            assert_eq!(expected, actual);
        }
    }
}

mod links {
    mod deserialize {
        use mini_exercism::api::v2::track::Links;

        #[test]
        fn test_all() {
            let json = r#"{
                "self": "https://exercism.org/tracks/cpp",
                "exercises": "https://exercism.org/tracks/cpp/exercises",
                "concepts": "https://exercism.org/tracks/cpp/concepts"
            }"#;

            let expected = Links {
                self_url: "https://exercism.org/tracks/cpp".into(),
                exercises: "https://exercism.org/tracks/cpp/exercises".into(),
                concepts: "https://exercism.org/tracks/cpp/concepts".into(),
            };
            let actual: Links = serde_json::from_str(json).unwrap();
            assert_eq!(expected, actual);
        }
    }
}